diff --git a/app/MindWork AI Studio/Agents/AssistantAudit/AssistantAuditAgent.cs b/app/MindWork AI Studio/Agents/AssistantAudit/AssistantAuditAgent.cs index f6ed9b421..22a822127 100644 --- a/app/MindWork AI Studio/Agents/AssistantAudit/AssistantAuditAgent.cs +++ b/app/MindWork AI Studio/Agents/AssistantAudit/AssistantAuditAgent.cs @@ -170,7 +170,7 @@ public sealed class AssistantAuditAgent(ILogger logger, ILo ? TB("The selected provider is not trusted enough for security checks. Pick one which meets the confidence required here, or choose a dedicated provider for security checks in the app settings.") : TB("No provider is configured for the Security Audit Agent."); - await MessageBus.INSTANCE.SendError(new (Icons.Material.Filled.SettingsSuggest, message)); + await MessageBus.INSTANCE.SendError(new (AppIcons.AGENT, message)); return new AssistantAuditResult { @@ -270,7 +270,7 @@ public sealed class AssistantAuditAgent(ILogger logger, ILo if (response.Content is not ContentText content || string.IsNullOrWhiteSpace(content.Text)) { logger.LogWarning($"The assistant plugin audit agent did not return text: {response}"); - await MessageBus.INSTANCE.SendWarning(new (Icons.Material.Filled.PendingActions, string.Format(TB("The security check could not be completed because the LLM's response was unusable. The audit level remains Unknown, so please try again later.")))); + await MessageBus.INSTANCE.SendWarning(new (AppIcons.AUDIT_INCOMPLETE, string.Format(TB("The security check could not be completed because the LLM's response was unusable. The audit level remains Unknown, so please try again later.")))); return new AssistantAuditResult { diff --git a/app/MindWork AI Studio/Agents/AssistantAudit/AssistantAuditLevelExtensions.cs b/app/MindWork AI Studio/Agents/AssistantAudit/AssistantAuditLevelExtensions.cs index ddcb3185c..74cf7593f 100644 --- a/app/MindWork AI Studio/Agents/AssistantAudit/AssistantAuditLevelExtensions.cs +++ b/app/MindWork AI Studio/Agents/AssistantAudit/AssistantAuditLevelExtensions.cs @@ -34,10 +34,10 @@ public static class AssistantAuditLevelExtensions public string Icon => level switch { - AssistantAuditLevel.DANGEROUS => Icons.Material.Filled.Dangerous, - AssistantAuditLevel.CAUTION => Icons.Material.Filled.Warning, - AssistantAuditLevel.SAFE => Icons.Material.Filled.Verified, - _ => Icons.Material.Filled.HelpOutline, + AssistantAuditLevel.DANGEROUS => AppIcons.SECURITY_DANGEROUS, + AssistantAuditLevel.CAUTION => AppIcons.WARNING, + AssistantAuditLevel.SAFE => AppIcons.AUDIT_SAFE, + _ => AppIcons.UNKNOWN, }; /// diff --git a/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor b/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor index d5bc2393c..b847a5019 100644 --- a/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor +++ b/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor @@ -1,11 +1,11 @@ @attribute [Route(Routes.ASSISTANT_AGENDA)] @inherits AssistantBaseCore - - + + - - + + @foreach (var contentLine in this.contentLines) { @if(!this.justBriefly.Contains(contentLine)) @@ -17,7 +17,7 @@ } - + @foreach (var contentLine in this.contentLines) { @if(!this.selectedFoci.Contains(contentLine)) @@ -29,19 +29,19 @@ } - - - - + + + + - + @if (!this.isMeetingVirtual) { - + @@ -52,5 +52,5 @@ } - + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/AssistantBase.razor b/app/MindWork AI Studio/Assistants/AssistantBase.razor index dfae2592d..548681cc6 100644 --- a/app/MindWork AI Studio/Assistants/AssistantBase.razor +++ b/app/MindWork AI Studio/Assistants/AssistantBase.razor @@ -20,7 +20,7 @@ @if (this.HasSettingsPanel) { - + } @@ -48,7 +48,7 @@ @if (this.IsProcessing) { - + } @@ -127,7 +127,7 @@ { @if (this.ShowSendTo && this.VisibleSendToAssistants.Count > 0) { - + @foreach (var assistant in this.VisibleSendToAssistants) { @@ -159,7 +159,7 @@ case SendToButton sendToButton: @if (this.VisibleSendToAssistants.Count > 0) { - + @foreach (var assistant in this.VisibleSendToAssistants) { @@ -174,14 +174,14 @@ @if (this.ShowCopyResult) { - + @TB("Copy result") } @if (this.ShowReset) { - + @TB("Reset") } diff --git a/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs b/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs index 78f5b1ea6..69b00b88e 100644 --- a/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs +++ b/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs @@ -425,14 +425,14 @@ public abstract partial class AssistantBase : AssistantLowerBase wher sessionStatus = AssistantSessionStatus.FAILED; errorMessage = e.UserMessage; this.Logger.LogError(e, "The provider request failed for assistant '{AssistantTitle}'. Status={StatusCode}, Reason='{ReasonPhrase}', Body='{ResponseBody}'", this.Title, e.StatusCode, e.ReasonPhrase, e.ResponseBody); - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.CloudOff, e.UserMessage)); + await MessageBus.INSTANCE.SendError(new(AppIcons.PROVIDER_ERROR, e.UserMessage)); } catch (Exception e) { sessionStatus = AssistantSessionStatus.FAILED; errorMessage = e.Message; this.Logger.LogError(e, "The assistant session '{AssistantTitle}' failed.", this.Title); - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.Stream, string.Format(this.TB("The assistant failed. The message is: '{0}'"), e.Message))); + await MessageBus.INSTANCE.SendError(new(AppIcons.ANSWER_STREAM, string.Format(this.TB("The assistant failed. The message is: '{0}'"), e.Message))); } finally { @@ -769,7 +769,7 @@ public abstract partial class AssistantBase : AssistantLowerBase wher catch (ProviderRequestException e) { this.Logger.LogError(e, "The provider request failed for assistant '{AssistantTitle}'. Status={StatusCode}, Reason='{ReasonPhrase}', Body='{ResponseBody}'", this.Title, e.StatusCode, e.ReasonPhrase, e.ResponseBody); - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.CloudOff, e.UserMessage)); + await MessageBus.INSTANCE.SendError(new(AppIcons.PROVIDER_ERROR, e.UserMessage)); if (this.ResultingContentBlock is not null && string.IsNullOrWhiteSpace(aiText.Text)) { @@ -1091,22 +1091,22 @@ public abstract partial class AssistantBase : AssistantLowerBase wher if (outcome.Failures.Count > 0) { var message = string.Join(Environment.NewLine, outcome.Failures.Select(failure => $"{failure.FileName}: {failure.UserMessage}")); - await this.MessageBus.SendError(new(Icons.Material.Filled.VoiceChat, message)); + await this.MessageBus.SendError(new(AppIcons.VOICE_TRANSCRIPTION, message)); } else if (outcome.Status is MediaImportStatus.FAILED) { - await this.MessageBus.SendError(new(Icons.Material.Filled.VoiceChat, this.TB("The media file could not be transcribed."))); + await this.MessageBus.SendError(new(AppIcons.VOICE_TRANSCRIPTION, this.TB("The media file could not be transcribed."))); } if (outcome.Warnings.Count > 0) { var message = string.Join(Environment.NewLine, outcome.Warnings.Select(warning => $"{warning.FileName}: {warning.UserMessage}")); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.VoiceChat, message)); + await this.MessageBus.SendWarning(new(AppIcons.VOICE_TRANSCRIPTION, message)); } if (outcome.Status is MediaImportStatus.CANCELLED) { - await this.MessageBus.SendWarning(new(Icons.Material.Filled.VoiceChat, this.TB("The media transcription was canceled."))); + await this.MessageBus.SendWarning(new(AppIcons.VOICE_TRANSCRIPTION, this.TB("The media transcription was canceled."))); } } diff --git a/app/MindWork AI Studio/Assistants/BatchProcessing/AssistantBatchProcessing.razor b/app/MindWork AI Studio/Assistants/BatchProcessing/AssistantBatchProcessing.razor index d97e7ef3e..60a65ca5a 100644 --- a/app/MindWork AI Studio/Assistants/BatchProcessing/AssistantBatchProcessing.razor +++ b/app/MindWork AI Studio/Assistants/BatchProcessing/AssistantBatchProcessing.razor @@ -21,7 +21,7 @@
- +
@@ -35,7 +35,7 @@ - + @(this.showExpertSettings ? T("Hide Expert Settings") : T("Show Expert Settings")) @@ -59,7 +59,7 @@ @T("Instructions") - + @foreach (var source in Enum.GetValues()) { @@ -117,7 +117,7 @@ else } else { - + @foreach (var policy in this.SettingsManager.ConfigurationData.DocumentAnalysis.Policies) { @@ -145,7 +145,7 @@ else @T("Output") - + @foreach (var mode in Enum.GetValues()) { @@ -156,7 +156,7 @@ else @if (this.outputMode is BatchProcessingOutputMode.INDIVIDUAL_FILES) { - + @foreach (var format in FileExportFormat.AnswerFormats) { @@ -171,11 +171,11 @@ else } else { - + - + - + @foreach (var separator in Enum.GetValues()) { @@ -186,7 +186,7 @@ else @if (this.csvSeparator is BatchProcessingCsvSeparator.CUSTOM) { - + } } @@ -219,7 +219,7 @@ else @if (this.pauseBeforeNextFileSeconds > 0) { - + @(string.Format(T("Waiting {0} seconds before starting the next file."), this.pauseBeforeNextFileSeconds)) } @@ -248,7 +248,7 @@ else @if (this.isProcessingBatch) { - + @T("Cancel the batch run") } @@ -269,7 +269,7 @@ else @switch (fileResult.Status) { case BatchProcessingFileStatus.QUEUED: - + break; case BatchProcessingFileStatus.PROCESSING: @@ -277,15 +277,15 @@ else break; case BatchProcessingFileStatus.DONE: - + break; case BatchProcessingFileStatus.FAILED: - + break; case BatchProcessingFileStatus.CANCELED: - + break; } diff --git a/app/MindWork AI Studio/Assistants/BatchProcessing/AssistantBatchProcessing.razor.Content.cs b/app/MindWork AI Studio/Assistants/BatchProcessing/AssistantBatchProcessing.razor.Content.cs index 3dd7c7b05..4ca9ee167 100644 --- a/app/MindWork AI Studio/Assistants/BatchProcessing/AssistantBatchProcessing.razor.Content.cs +++ b/app/MindWork AI Studio/Assistants/BatchProcessing/AssistantBatchProcessing.razor.Content.cs @@ -128,13 +128,13 @@ public partial class AssistantBatchProcessing if (extraction.Outcome is FileExtractionOutcome.PARTIAL) { this.Logger.LogWarning("Parts of the batch file '{FilePath}' could not be read: pages={FailedPages}.", fileResult.FilePath, string.Join(", ", extraction.FailedPages)); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.Description, extraction.ToPartialUserMessage(fileResult.FileName))); + await this.MessageBus.SendWarning(new(AppIcons.DOCUMENT, extraction.ToPartialUserMessage(fileResult.FileName))); } if (extraction.HasExtensionMismatch) { this.Logger.LogWarning("The batch file '{FilePath}' is actually a '{DetectedFormat}'.", fileResult.FilePath, extraction.DetectedFormat); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.RuleFolder, extraction.ToExtensionMismatchUserMessage(fileResult.FileName))); + await this.MessageBus.SendWarning(new(AppIcons.FILE_TYPE_MISMATCH, extraction.ToExtensionMismatchUserMessage(fileResult.FileName))); } if (!string.IsNullOrWhiteSpace(extraction.Content)) diff --git a/app/MindWork AI Studio/Assistants/BatchProcessing/AssistantBatchProcessing.razor.Persistence.cs b/app/MindWork AI Studio/Assistants/BatchProcessing/AssistantBatchProcessing.razor.Persistence.cs index df39ca27d..745ac4463 100644 --- a/app/MindWork AI Studio/Assistants/BatchProcessing/AssistantBatchProcessing.razor.Persistence.cs +++ b/app/MindWork AI Studio/Assistants/BatchProcessing/AssistantBatchProcessing.razor.Persistence.cs @@ -162,7 +162,7 @@ public partial class AssistantBatchProcessing return; this.hasReportedWriteFailure = true; - await this.MessageBus.SendError(new(Icons.Material.Filled.SaveAs, string.Format(T("Was not able to write '{0}'. Please make sure that the file is not opened in another application. The results of this run are incomplete on disk. The message is: '{1}'"), Path.GetFileName(targetFilePath), e.Message))); + await this.MessageBus.SendError(new(AppIcons.SAVE_FAILED, string.Format(T("Was not able to write '{0}'. Please make sure that the file is not opened in another application. The results of this run are incomplete on disk. The message is: '{1}'"), Path.GetFileName(targetFilePath), e.Message))); } } @@ -195,7 +195,7 @@ public partial class AssistantBatchProcessing // Without this message, continuing the run would silently process // every document again, because we recognize nothing as completed: - await this.MessageBus.SendWarning(new(Icons.Material.Filled.Warning, T("Was not able to read the log of the previous run. Continuing the run would process all documents again."))); + await this.MessageBus.SendWarning(new(AppIcons.WARNING, T("Was not able to read the log of the previous run. Continuing the run would process all documents again."))); } return entries; @@ -227,7 +227,7 @@ public partial class AssistantBatchProcessing catch (Exception e) { this.Logger.LogWarning(e, "Was not able to read the results table of the previous batch run at '{ResultsFilePath}'.", resultsFilePath); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.Warning, T("Was not able to read the results table of the previous run. Its completed documents cannot be restored and will be processed again."))); + await this.MessageBus.SendWarning(new(AppIcons.WARNING, T("Was not able to read the results table of the previous run. Its completed documents cannot be restored and will be processed again."))); } return results; diff --git a/app/MindWork AI Studio/Assistants/BatchProcessing/AssistantBatchProcessing.razor.Run.cs b/app/MindWork AI Studio/Assistants/BatchProcessing/AssistantBatchProcessing.razor.Run.cs index 57b5032d5..c713a51be 100644 --- a/app/MindWork AI Studio/Assistants/BatchProcessing/AssistantBatchProcessing.razor.Run.cs +++ b/app/MindWork AI Studio/Assistants/BatchProcessing/AssistantBatchProcessing.razor.Run.cs @@ -109,7 +109,7 @@ public partial class AssistantBatchProcessing ? T("The selected model cannot read images, so the image among the selected files will fail. All other files are processed as usual.") : string.Format(T("The selected model cannot read images, so the {0} images among the selected files will fail. All other files are processed as usual."), numImages); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.ImageNotSupported, warning)); + await this.MessageBus.SendWarning(new(AppIcons.IMAGE_NOT_SUPPORTED, warning)); } /// @@ -198,7 +198,7 @@ public partial class AssistantBatchProcessing var failureMessage = failedFiles == 1 ? T("The batch run finished, but one file could not be processed. See the progress table and log for details.") : string.Format(T("The batch run finished, but {0} files could not be processed. See the progress table and log for details."), failedFiles); - await this.MessageBus.SendError(new(Icons.Material.Filled.Error, failureMessage)); + await this.MessageBus.SendError(new(AppIcons.ERROR, failureMessage)); } } } diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor index 80a3ad157..581639630 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor @@ -10,16 +10,16 @@ @T("BeyondFacts Lab") - + @* How to work with the lab opens by itself while there is no preparation yet. *@ - + - + @@ -56,7 +56,7 @@ } - + @T("New preparation") @@ -76,7 +76,7 @@ - @T("Delete") + @T("Delete") @@ -102,8 +102,8 @@ @T("The event has taken place") - @T("Rename") - @T("Delete") + @T("Rename") + @T("Delete") diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.Projects.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.Projects.cs index 40c027bbd..875618cbe 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.Projects.cs +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.Projects.cs @@ -207,7 +207,7 @@ public partial class BeyondFactsLabAssistant catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or InvalidDataException or ArgumentException) { this.Logger.LogError(exception, "A change of the preparations of the BeyondFacts Lab failed."); - await this.MessageBus.SendError(new(Icons.Material.Filled.RecordVoiceOver, TA("AI Studio could not save the change of your preparations. Please try again."))); + await this.MessageBus.SendError(new(AppIcons.ASSISTANT_BEYOND_FACTS_LAB, TA("AI Studio could not save the change of your preparations. Please try again."))); await this.ReloadAfterFailureAsync(); } finally @@ -237,9 +237,9 @@ public partial class BeyondFactsLabAssistant /// The preparation. private static string ProjectIcon(BflProjectEntry project) => project switch { - { IsAvailable: false } => Icons.Material.Filled.WarningAmber, - { Project.HappenedAtUtc: not null } => Icons.Material.Filled.EventAvailable, - _ => Icons.Material.Filled.Event, + { IsAvailable: false } => AppIcons.WARNING, + { Project.HappenedAtUtc: not null } => AppIcons.EVENT_TOOK_PLACE, + _ => AppIcons.EVENT, }; /// diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.Steps.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.Steps.cs index 57295e6f9..70e393f08 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.Steps.cs +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.Steps.cs @@ -72,19 +72,19 @@ public partial class BeyondFactsLabAssistant if (BflEventVisibility.IsNotPublic(this.forms)) { - await this.MessageBus.SendInfo(new(Icons.Material.Filled.PublicOff, BflEventVisibility.NotPublicMessage)); + await this.MessageBus.SendInfo(new(AppIcons.NOT_PUBLIC, BflEventVisibility.NotPublicMessage)); return; } if (BflEventVisibility.IsSuggestionPending(this.workStates, this.forms)) { - await this.MessageBus.SendInfo(new(Icons.Material.Filled.TravelExplore, string.Format(TA("The lab has not started the research on the web yet. First, decide on the suggestion below the work state whether the event is public. Afterward, you can start the research in the step '{0}'."), BflStep.STRATEGY.Title))); + await this.MessageBus.SendInfo(new(AppIcons.WEB_RESEARCH, string.Format(TA("The lab has not started the research on the web yet. First, decide on the suggestion below the work state whether the event is public. Afterward, you can start the research in the step '{0}'."), BflStep.STRATEGY.Title))); return; } var started = await this.ResearchRunner.StartWhenDueAsync(project.ProjectId, this.providerSettings, this.forms); if (started.Count > 0) - await this.MessageBus.SendInfo(new(Icons.Material.Filled.TravelExplore, string.Format(TA("The lab now researches the event on the web, with the public details about it only. You find the result in the step '{0}'."), BflStep.STRATEGY.Title))); + await this.MessageBus.SendInfo(new(AppIcons.WEB_RESEARCH, string.Format(TA("The lab now researches the event on the web, with the public details about it only. You find the result in the step '{0}'."), BflStep.STRATEGY.Title))); } /// @@ -156,7 +156,7 @@ public partial class BeyondFactsLabAssistant catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or InvalidDataException) { this.Logger.LogError(exception, "Could not save the details of a step in the BeyondFacts Lab."); - await this.MessageBus.SendError(new(Icons.Material.Filled.RecordVoiceOver, TA("AI Studio could not save your details. Please try again."))); + await this.MessageBus.SendError(new(AppIcons.ASSISTANT_BEYOND_FACTS_LAB, TA("AI Studio could not save your details. Please try again."))); } } diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflChat.razor b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflChat.razor index 51f98add2..0938a48ff 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflChat.razor +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflChat.razor @@ -14,7 +14,7 @@ else if (this.conversation.Thread is not { } thread) @TA("AI Studio cannot open this conversation. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it.") - @T("Start over") + @T("Start over") } else { @@ -22,7 +22,7 @@ else { @this.Introduction
- + @T("Start the conversation")
@@ -53,7 +53,7 @@ else Variant="Variant.Outlined" Label="@TA("Your message")" Adornment="Adornment.End" - AdornmentIcon="@Icons.Material.Filled.Send" + AdornmentIcon="@AppIcons.SEND" AdornmentColor="@(this.CanSendMessage ? Color.Primary : Color.Default)" AdornmentAriaLabel="@T("Send")" OnAdornmentClick="@this.SendAsync" @@ -68,11 +68,11 @@ else @if (this.IsRunning) { - @T("Stop") + @T("Stop") } @if (this.conversation.HasVisibleMessages) { - @T("Start over") + @T("Start over") } } diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflChat.razor.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflChat.razor.cs index 176afc66d..d2f4c95bf 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflChat.razor.cs +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflChat.razor.cs @@ -341,7 +341,7 @@ public partial class BflChat : MSGComponentBase catch (Exception exception) when (exception is IOException or UnauthorizedAccessException) { this.Logger.LogError(exception, "Could not delete the chat '{Location}' of the BeyondFacts Lab.", this.Location.Key); - await this.MessageBus.SendError(new(Icons.Material.Filled.DeleteForever, TA("AI Studio could not delete this conversation. Please try again."))); + await this.MessageBus.SendError(new(AppIcons.DELETE, TA("AI Studio could not delete this conversation. Please try again."))); } } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflConfirmedWorkStates.razor b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflConfirmedWorkStates.razor index 2ed2b9fee..261571ce0 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflConfirmedWorkStates.razor +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflConfirmedWorkStates.razor @@ -15,7 +15,7 @@ var confirmed = this.WorkStates[step].Confirmed!; var isOutdated = BflStaleness.Of(step, this.WorkStates, this.Forms) is BflWorkStateStatus.OUTDATED; @foreach (var section in BflWorkStateSections.ForStep(step).Where(section => !string.IsNullOrWhiteSpace(confirmed.Sections.GetValueOrDefault(section.Key)))) diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflConversationService.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflConversationService.cs index e10939094..b69edc355 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflConversationService.cs +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflConversationService.cs @@ -155,13 +155,13 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa catch (BflPromptOverrideException exception) { logger.LogWarning(exception, "A prompt override of the BeyondFacts Lab has a placeholder which the lab does not fill."); - await messageBus.SendError(new(Icons.Material.Filled.ErrorOutline, string.Format(TA("The file '{0}' in the test folder of the BeyondFacts Lab contains the placeholder '{1}', which the lab does not fill in this file. Please correct the file and try again."),exception.FileName, exception.Placeholder))); + await messageBus.SendError(new(AppIcons.ERROR, string.Format(TA("The file '{0}' in the test folder of the BeyondFacts Lab contains the placeholder '{1}', which the lab does not fill in this file. Please correct the file and try again."),exception.FileName, exception.Placeholder))); return; } catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or FormatException) { logger.LogError(exception, "The BeyondFacts Lab could not put together the system prompt of the chat '{Location}'.", location.Key); - await messageBus.SendError(new(Icons.Material.Filled.ErrorOutline, TA("The BeyondFacts Lab could not put together its instructions for the model. Please report this as a bug."))); + await messageBus.SendError(new(AppIcons.ERROR, TA("The BeyondFacts Lab could not put together its instructions for the model. Please report this as a bug."))); return; } @@ -231,12 +231,12 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa catch (ProviderRequestException exception) { logger.LogError(exception, "The provider request of the BeyondFacts Lab failed. Status={StatusCode}, Reason='{ReasonPhrase}'.", exception.StatusCode, exception.ReasonPhrase); - await messageBus.SendError(new(Icons.Material.Filled.CloudOff, exception.UserMessage)); + await messageBus.SendError(new(AppIcons.PROVIDER_ERROR, exception.UserMessage)); } catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or InvalidDataException) { logger.LogError(exception, "The BeyondFacts Lab could not store the chat '{Location}'.", location.Key); - await messageBus.SendError(new(Icons.Material.Filled.SaveAs, TA("AI Studio could not save this conversation. Please try again."))); + await messageBus.SendError(new(AppIcons.SAVE_FAILED, TA("AI Studio could not save this conversation. Please try again."))); } finally { @@ -532,7 +532,7 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa if (reason is null) return true; - await messageBus.SendError(new(Icons.Material.Filled.CloudOff, reason)); + await messageBus.SendError(new(AppIcons.PROVIDER_ERROR, reason)); return false; } @@ -563,7 +563,7 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or InvalidDataException) { logger.LogError(exception, "The BeyondFacts Lab could not store the chat '{Location}'.", conversation.Location.Key); - await messageBus.SendError(new(Icons.Material.Filled.SaveAs, TA("AI Studio could not save this conversation. Please try again."))); + await messageBus.SendError(new(AppIcons.SAVE_FAILED, TA("AI Studio could not save this conversation. Please try again."))); } } diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflIntroduction.razor b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflIntroduction.razor index 0aa35d172..07688b85b 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflIntroduction.razor +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflIntroduction.razor @@ -8,7 +8,7 @@ @T("The knowledge base of the lab is a guide on science in public debates by Lara Wüster from the Technical University of Munich (TUM).") - + @TA("Plan about 30 to 60 minutes for a preparation. You can pause at any time: AI Studio saves your details and conversations, and you continue where you left off.") @@ -22,25 +22,25 @@ @* Laid out like MudTextList, whose items have a header of their own: justified and hyphenated, with the icon at the first line. *@ @T("How to proceed") - + @TA("Create a preparation for your event with 'New preparation'.") - + @TA("Work through the seven steps, in any order you like. Each step has the form 'Your details' and a conversation of its own.") - + @TA("Fill in what you know. Fields may stay empty: the lab shows which key details are missing and asks for them in the conversation.") - + @TA("Add material beside the steps, e.g., notes, a talk draft, a paper, the invitation, the recording of an interview, or a poster. It applies to all steps, and the lab asks you about it. Add only what you may process with the selected provider; recordings also go to the transcription provider of AI Studio.") - + @TA("Let the lab start the conversation of a step, or write first and say what support you want, e.g., with your role, your strategy, or a round of critical questions. You can always say that you do not know.") - + @TA("Once a step is largely clear, let the lab create its work state below the conversation. You check and edit it, and once you confirm it, the later steps build on it. The lab also suggests values for empty fields of 'Your details', which you take over one by one.") - + @TA("In the last step, let the lab create your materials from your confirmed work states: a reflection folder, a position paper, a conversation guide, questions and answers, and your open points. You check, edit, and confirm each of them, and then export it as a document.") @@ -50,7 +50,7 @@ @string.Format(Culture, TA("In the step '{0}', research agents of the lab look into the event, its participants, and the public debate on its topic, one agent for each. They start on their own once you confirm the event details, provided the web search is set up in AI Studio, and you can start them again at any time."), BflStep.STRATEGY.Title) @TA("If you state in the event details that the event is not public, the lab never researches it on the web.") - + @TA("The research agents receive only the public details about the event, which the form marks with a symbol. Your other details, your material, your work states, and your conversations stay in your preparation and never reach a search. The conversations of the steps never search the web themselves: they only read web pages whose addresses stand in them, e.g., the link to the event.") @@ -58,22 +58,22 @@ @T("How to recognize good results") - + @TA("The answers refer to your event and your details.") - + @TA("You can tell evidence, interpretation, assumptions about values, and recommendations apart.") - + @TA("Uncertainties and the limits of your expertise stay visible.") - + @T("Counterarguments are presented fairly.") - + @TA("The strategy fits your real speaking time and focuses on a few key messages.") - + @TA("You keep the decision about which position you take.") diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflMaterialService.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflMaterialService.cs index 8e49a2ce1..a54260a62 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflMaterialService.cs +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflMaterialService.cs @@ -128,7 +128,7 @@ public sealed class BflMaterialService(BeyondFactsLabStore store, RustService ru catch (Exception exception) when (exception is IOException or UnauthorizedAccessException) { logger.LogError(exception, "Could not list the material of the preparation '{ProjectId}' of the BeyondFacts Lab.", projectId); - await messageBus.SendError(new(Icons.Material.Filled.Description, TA("AI Studio could not read the material of this preparation. Please try again."))); + await messageBus.SendError(new(AppIcons.DOCUMENT, TA("AI Studio could not read the material of this preparation. Please try again."))); return; } @@ -182,7 +182,7 @@ public sealed class BflMaterialService(BeyondFactsLabStore store, RustService ru catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or InvalidDataException) { logger.LogError(exception, "Could not delete the material '{MaterialId}' of the preparation '{ProjectId}' of the BeyondFacts Lab.", materialId, projectId); - await messageBus.SendError(new(Icons.Material.Filled.DeleteForever, TA("AI Studio could not delete the material. Please try again."))); + await messageBus.SendError(new(AppIcons.DELETE, TA("AI Studio could not delete the material. Please try again."))); return false; } @@ -233,14 +233,14 @@ public sealed class BflMaterialService(BeyondFactsLabStore store, RustService ru catch (Exception exception) when (exception is IOException or UnauthorizedAccessException) { logger.LogWarning(exception, "The BeyondFacts Lab could not open the file '{Path}'.", path); - await messageBus.SendError(new(Icons.Material.Filled.Description, string.Format(TB("AI Studio could not open the file '{0}'."), name))); + await messageBus.SendError(new(AppIcons.DOCUMENT, string.Format(TB("AI Studio could not open the file '{0}'."), name))); return; } // Before anything is read, and above all before a recording is paid for: if (!knownHashes.Add(hash)) { - await messageBus.SendInfo(new(Icons.Material.Filled.Description, string.Format(TB("The material of this preparation contains '{0}' already."), name))); + await messageBus.SendInfo(new(AppIcons.DOCUMENT, string.Format(TB("The material of this preparation contains '{0}' already."), name))); return; } @@ -279,9 +279,9 @@ public sealed class BflMaterialService(BeyondFactsLabStore store, RustService ru { var addition = await store.AddMaterialAsync(projectId, material, extraction.Content); if (addition.IsDuplicate) - await messageBus.SendInfo(new(Icons.Material.Filled.Description, string.Format(TB("The material of this preparation contains '{0}' already."), addition.Material.Name))); + await messageBus.SendInfo(new(AppIcons.DOCUMENT, string.Format(TB("The material of this preparation contains '{0}' already."), addition.Material.Name))); else if (addition.Material.IsShortened) - await messageBus.SendInfo(new(Icons.Material.Filled.ContentCut, string.Format(TB("The lab keeps only the beginning of '{0}': a conversation never takes more of one material."), addition.Material.Name))); + await messageBus.SendInfo(new(AppIcons.CONTENT_SHORTENED, string.Format(TB("The lab keeps only the beginning of '{0}': a conversation never takes more of one material."), addition.Material.Name))); } catch (FileNotFoundException) { @@ -292,7 +292,7 @@ public sealed class BflMaterialService(BeyondFactsLabStore store, RustService ru { knownHashes.Remove(hash); logger.LogError(exception, "The BeyondFacts Lab could not store the material '{Name}' of the preparation '{ProjectId}'.", name, projectId); - await messageBus.SendError(new(Icons.Material.Filled.SaveAs, string.Format(TA("AI Studio could not save the material '{0}'. Please try again."), name))); + await messageBus.SendError(new(AppIcons.SAVE_FAILED, string.Format(TA("AI Studio could not save the material '{0}'. Please try again."), name))); } } @@ -317,7 +317,7 @@ public sealed class BflMaterialService(BeyondFactsLabStore store, RustService ru if (!prepared.IsPrepared) { logger.LogWarning("The BeyondFacts Lab could not prepare the image '{Path}': {ErrorCode}.", path, prepared.ErrorCode); - await messageBus.SendError(new(Icons.Material.Filled.Image, prepared.ErrorCode.ToUserMessage(name))); + await messageBus.SendError(new(AppIcons.IMAGE, prepared.ErrorCode.ToUserMessage(name))); return false; } @@ -339,7 +339,7 @@ public sealed class BflMaterialService(BeyondFactsLabStore store, RustService ru { var addition = await store.AddImageMaterialAsync(projectId, material, Convert.FromBase64String(prepared.Base64)); if (addition.IsDuplicate) - await messageBus.SendInfo(new(Icons.Material.Filled.Image, string.Format(TB("The material of this preparation contains '{0}' already."), addition.Material.Name))); + await messageBus.SendInfo(new(AppIcons.IMAGE, string.Format(TB("The material of this preparation contains '{0}' already."), addition.Material.Name))); return true; } @@ -351,7 +351,7 @@ public sealed class BflMaterialService(BeyondFactsLabStore store, RustService ru catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or InvalidDataException or FormatException or ArgumentException) { logger.LogError(exception, "The BeyondFacts Lab could not store the image '{Name}' of the preparation '{ProjectId}'.", name, projectId); - await messageBus.SendError(new(Icons.Material.Filled.SaveAs, string.Format(TA("AI Studio could not save the material '{0}'. Please try again."), name))); + await messageBus.SendError(new(AppIcons.SAVE_FAILED, string.Format(TA("AI Studio could not save the material '{0}'. Please try again."), name))); return false; } } @@ -372,7 +372,7 @@ public sealed class BflMaterialService(BeyondFactsLabStore store, RustService ru { if (this.UsableTranscriptionProvider() is not { } provider) { - await messageBus.SendWarning(new(Icons.Material.Filled.VoiceChat, this.NoTranscriptionProviderMessage)); + await messageBus.SendWarning(new(AppIcons.VOICE_TRANSCRIPTION, this.NoTranscriptionProviderMessage)); return FileExtractionResult.Failed(FileExtractionErrorCode.INVALID_REQUEST, "No transcription provider may hear the recordings of the BeyondFacts Lab."); } @@ -386,7 +386,7 @@ public sealed class BflMaterialService(BeyondFactsLabStore store, RustService ru if (transcript.Status is not PersistentMediaTranscriptStatus.READY) { logger.LogWarning("The BeyondFacts Lab could not transcribe the recording '{Path}': {Status}.", path, transcript.Status); - await messageBus.SendError(new(Icons.Material.Filled.VoiceChat, string.Format(TB("AI Studio could not transcribe the recording '{0}': {1}"), name, transcript.UserMessage))); + await messageBus.SendError(new(AppIcons.VOICE_TRANSCRIPTION, string.Format(TB("AI Studio could not transcribe the recording '{0}': {1}"), name, transcript.UserMessage))); return FileExtractionResult.Failed(FileExtractionErrorCode.INTERNAL, transcript.UserMessage); } @@ -394,7 +394,7 @@ public sealed class BflMaterialService(BeyondFactsLabStore store, RustService ru if (!extraction.HasUsableContent) { logger.LogError("The BeyondFacts Lab could not read the transcript of the recording '{Path}': code={ErrorCode}, message='{ErrorMessage}'.", path, extraction.ErrorCode, extraction.ErrorMessage); - await messageBus.SendError(new(Icons.Material.Filled.VoiceChat, extraction.ToUserMessage(name))); + await messageBus.SendError(new(AppIcons.VOICE_TRANSCRIPTION, extraction.ToUserMessage(name))); } return extraction; diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflMaterials.razor b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflMaterials.razor index d295d5a47..e9426e7ea 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflMaterials.razor +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflMaterials.razor @@ -68,7 +68,7 @@ } - + } diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflMaterials.razor.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflMaterials.razor.cs index 58be1e981..b36084efa 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflMaterials.razor.cs +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflMaterials.razor.cs @@ -258,7 +258,7 @@ public partial class BflMaterials : MSGComponentBase { if (this.MaterialService.UsableTranscriptionProvider() is not { } provider) { - await this.MessageBus.SendWarning(new(Icons.Material.Filled.VoiceChat, this.MaterialService.NoTranscriptionProviderMessage)); + await this.MessageBus.SendWarning(new(AppIcons.VOICE_TRANSCRIPTION, this.MaterialService.NoTranscriptionProviderMessage)); return; } @@ -291,10 +291,10 @@ public partial class BflMaterials : MSGComponentBase /// The material. private static string Icon(BflMaterialEntry entry) => entry.Material?.Kind switch { - null => Icons.Material.Filled.ErrorOutline, - BflMaterialKind.RECORDING => Icons.Material.Filled.Mic, - BflMaterialKind.IMAGE => Icons.Material.Filled.Image, - _ => Icons.Material.Filled.Description, + null => AppIcons.FILE_NOT_FOUND, + BflMaterialKind.RECORDING => AppIcons.MICROPHONE, + BflMaterialKind.IMAGE => AppIcons.IMAGE, + _ => AppIcons.DOCUMENT, }; /// diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResearchPanel.razor b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResearchPanel.razor index b8c2c8015..9142bb3cb 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResearchPanel.razor +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResearchPanel.razor @@ -6,14 +6,14 @@ @if (this.IsNotPublic) { @* An event which is not public is never researched, and earlier research no longer counts: *@ - + @string.Format(Culture, TA("The event is not public. Therefore, the lab does not research it on the web, and none of your details reach a search. If the event is public after all, change this in the step '{0}'."), BflStep.FRAMEWORK.Title) } else { @* What the research receives, and what it never receives: *@ - + @TA("The research agents receive only the public details about the event. Your other details, your material, your work states, and your conversations stay in your preparation and never reach a search.") @if (this.PublicDetails.Count > 0) { @@ -42,7 +42,7 @@ else @@ -68,7 +68,7 @@ else } @topic.Title - + @this.StatusText(found, isRunning) @@ -80,7 +80,7 @@ else @T("The agent researches this topic") - @T("Stop") + @T("Stop") } @@ -135,7 +135,7 @@ else @(found is null ? T("Research this topic") : T("Research this topic again")) diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResearchPanel.razor.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResearchPanel.razor.cs index 77c38b347..1c6786524 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResearchPanel.razor.cs +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResearchPanel.razor.cs @@ -151,9 +151,9 @@ public partial class BflResearchPanel : MSGComponentBase private string StatusIcon(BflResearch? found) => found switch { - null => Icons.Material.Outlined.Circle, - _ when found.IsOutdated(this.PublicDetails) => Icons.Material.Filled.Update, - _ => Icons.Material.Filled.CheckCircle, + null => AppIcons.NOT_STARTED, + _ when found.IsOutdated(this.PublicDetails) => AppIcons.OUTDATED, + _ => AppIcons.SUCCESS, }; private Color StatusColor(BflResearch? found) => found switch diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResearchRunner.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResearchRunner.cs index 742279702..f2aeabd72 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResearchRunner.cs +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResearchRunner.cs @@ -138,7 +138,7 @@ public sealed class BflResearchRunner(BeyondFactsLabStore store, BflConversation var availability = await this.CheckAvailabilityAsync(provider); if (!availability.CanResearch) { - await messageBus.SendError(new(Icons.Material.Filled.TravelExplore, availability.Message)); + await messageBus.SendError(new(AppIcons.WEB_RESEARCH, availability.Message)); return; } @@ -157,14 +157,14 @@ public sealed class BflResearchRunner(BeyondFactsLabStore store, BflConversation var forms = await store.LoadFormsAsync(location.ProjectId); if (BflEventVisibility.IsNotPublic(forms)) { - await messageBus.SendError(new(Icons.Material.Filled.PublicOff, BflEventVisibility.NotPublicMessage)); + await messageBus.SendError(new(AppIcons.NOT_PUBLIC, BflEventVisibility.NotPublicMessage)); return; } var details = BflPromptComposer.PublicDetailsOf(forms); if (details.Count is 0) { - await messageBus.SendError(new(Icons.Material.Filled.TravelExplore, string.Format(TA("Please enter public details about the event first, in the step '{0}', such as its topic or its link. The research receives these details only."), BflStep.FRAMEWORK.Title))); + await messageBus.SendError(new(AppIcons.WEB_RESEARCH, string.Format(TA("Please enter public details about the event first, in the step '{0}', such as its topic or its link. The research receives these details only."), BflStep.FRAMEWORK.Title))); return; } @@ -187,7 +187,7 @@ public sealed class BflResearchRunner(BeyondFactsLabStore store, BflConversation if (research.Text.Length is 0) { logger.LogWarning("The agent wrote no text for the research '{Location}' of the BeyondFacts Lab.", location.Key); - await messageBus.SendError(new(Icons.Material.Filled.ErrorOutline, TA("The research ended without a result. Please try again, or try another provider."))); + await messageBus.SendError(new(AppIcons.ERROR, TA("The research ended without a result. Please try again, or try another provider."))); return; } @@ -201,12 +201,12 @@ public sealed class BflResearchRunner(BeyondFactsLabStore store, BflConversation catch (BflPromptOverrideException exception) { logger.LogWarning(exception, "A prompt override of the BeyondFacts Lab has a placeholder which the lab does not fill."); - await messageBus.SendError(new(Icons.Material.Filled.ErrorOutline, string.Format(TA("The file '{0}' in the test folder of the BeyondFacts Lab contains the placeholder '{1}', which the lab does not fill in this file. Please correct the file and try again."), exception.FileName, exception.Placeholder))); + await messageBus.SendError(new(AppIcons.ERROR, string.Format(TA("The file '{0}' in the test folder of the BeyondFacts Lab contains the placeholder '{1}', which the lab does not fill in this file. Please correct the file and try again."), exception.FileName, exception.Placeholder))); } catch (ProviderRequestException exception) { logger.LogError(exception, "The provider request for a research of the BeyondFacts Lab failed. Status={StatusCode}, Reason='{ReasonPhrase}'.", exception.StatusCode, exception.ReasonPhrase); - await messageBus.SendError(new(Icons.Material.Filled.CloudOff, exception.UserMessage)); + await messageBus.SendError(new(AppIcons.PROVIDER_ERROR, exception.UserMessage)); } catch (FileNotFoundException) { @@ -215,7 +215,7 @@ public sealed class BflResearchRunner(BeyondFactsLabStore store, BflConversation catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or InvalidDataException or FormatException) { logger.LogError(exception, "The BeyondFacts Lab could not do the research '{Location}'.", location.Key); - await messageBus.SendError(new(Icons.Material.Filled.SaveAs, TA("AI Studio could not finish this research. Please try again."))); + await messageBus.SendError(new(AppIcons.SAVE_FAILED, TA("AI Studio could not finish this research. Please try again."))); } finally { diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResultGenerator.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResultGenerator.cs index 5c74491a5..80834472b 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResultGenerator.cs +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResultGenerator.cs @@ -104,7 +104,7 @@ public sealed class BflResultGenerator(BeyondFactsLabStore store, BflConversatio if (text.Length is 0) { logger.LogWarning("The model wrote no text for the result '{Location}' of the BeyondFacts Lab.", location.Key); - await messageBus.SendError(new(Icons.Material.Filled.ErrorOutline, TA("The model did not write this material. Please try again, or try another provider."))); + await messageBus.SendError(new(AppIcons.ERROR, TA("The model did not write this material. Please try again, or try another provider."))); return; } @@ -118,12 +118,12 @@ public sealed class BflResultGenerator(BeyondFactsLabStore store, BflConversatio catch (BflPromptOverrideException exception) { logger.LogWarning(exception, "A prompt override of the BeyondFacts Lab has a placeholder which the lab does not fill."); - await messageBus.SendError(new(Icons.Material.Filled.ErrorOutline, string.Format(TA("The file '{0}' in the test folder of the BeyondFacts Lab contains the placeholder '{1}', which the lab does not fill in this file. Please correct the file and try again."), exception.FileName, exception.Placeholder))); + await messageBus.SendError(new(AppIcons.ERROR, string.Format(TA("The file '{0}' in the test folder of the BeyondFacts Lab contains the placeholder '{1}', which the lab does not fill in this file. Please correct the file and try again."), exception.FileName, exception.Placeholder))); } catch (ProviderRequestException exception) { logger.LogError(exception, "The provider request for a result of the BeyondFacts Lab failed. Status={StatusCode}, Reason='{ReasonPhrase}'.", exception.StatusCode, exception.ReasonPhrase); - await messageBus.SendError(new(Icons.Material.Filled.CloudOff, exception.UserMessage)); + await messageBus.SendError(new(AppIcons.PROVIDER_ERROR, exception.UserMessage)); } catch (FileNotFoundException) { @@ -132,7 +132,7 @@ public sealed class BflResultGenerator(BeyondFactsLabStore store, BflConversatio catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or InvalidDataException or FormatException) { logger.LogError(exception, "The BeyondFacts Lab could not write the result '{Location}'.", location.Key); - await messageBus.SendError(new(Icons.Material.Filled.SaveAs, TA("AI Studio could not create this material. Please try again."))); + await messageBus.SendError(new(AppIcons.SAVE_FAILED, TA("AI Studio could not create this material. Please try again."))); } finally { @@ -187,7 +187,7 @@ public sealed class BflResultGenerator(BeyondFactsLabStore store, BflConversatio catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or InvalidDataException) { logger.LogError(exception, "The BeyondFacts Lab could not put the reflection folder of '{ProjectId}' together.", projectId); - await messageBus.SendError(new(Icons.Material.Filled.SaveAs, TA("AI Studio could not create this material. Please try again."))); + await messageBus.SendError(new(AppIcons.SAVE_FAILED, TA("AI Studio could not create this material. Please try again."))); } finally { diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResults.razor b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResults.razor index 987875910..204134cda 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResults.razor +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResults.razor @@ -12,7 +12,7 @@ @@ -30,7 +30,7 @@ @kind.Title - + @this.StatusText(status) @@ -50,7 +50,7 @@ @T("The lab writes this material") - @T("Stop") + @T("Stop") } @@ -85,16 +85,16 @@ } - @T("Confirm") + @T("Confirm") @if (this.editing.Contains(kind)) { - @T("Show preview") + @T("Show preview") } else { - @T("Edit") + @T("Edit") } - @T("Discard draft") + @T("Discard draft") } @@ -117,8 +117,8 @@ } - @T("Edit") + @T("Edit") } @@ -147,7 +147,7 @@ @(result.Draft is null && result.Confirmed is null ? T("Create") : T("Create anew")) diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResults.razor.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResults.razor.cs index 7febb33c9..b9908cf73 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResults.razor.cs +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflResults.razor.cs @@ -188,12 +188,12 @@ public partial class BflResults : MSGComponentBase private static string StatusIcon(BflResultStatus status) => status switch { - BflResultStatus.UNREADABLE => Icons.Material.Filled.Error, - BflResultStatus.WRITING => Icons.Material.Filled.HourglassTop, - BflResultStatus.DRAFT => Icons.Material.Filled.EditNote, - BflResultStatus.CONFIRMED => Icons.Material.Filled.CheckCircle, - BflResultStatus.OUTDATED => Icons.Material.Filled.Update, - _ => Icons.Material.Filled.RadioButtonUnchecked + BflResultStatus.UNREADABLE => AppIcons.ERROR, + BflResultStatus.WRITING => AppIcons.PENDING, + BflResultStatus.DRAFT => AppIcons.DRAFT, + BflResultStatus.CONFIRMED => AppIcons.SUCCESS, + BflResultStatus.OUTDATED => AppIcons.OUTDATED, + _ => AppIcons.NOT_CREATED }; private static Color StatusColor(BflResultStatus status) => status switch @@ -384,7 +384,7 @@ public partial class BflResults : MSGComponentBase catch (ArgumentOutOfRangeException exception) { this.Logger.LogError(exception, "Could not export a result of the BeyondFacts Lab, because no exporter writes the format {ExportFormat}.", format); - await this.MessageBus.SendError(new(Icons.Material.Filled.Error, TA("AI Studio could not export this material. Please try another format."))); + await this.MessageBus.SendError(new(AppIcons.ERROR, TA("AI Studio could not export this material. Please try another format."))); } finally { @@ -403,7 +403,7 @@ public partial class BflResults : MSGComponentBase catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or InvalidDataException) { this.Logger.LogError(exception, "Could not save the result '{Kind}' of a preparation in the BeyondFacts Lab.", kind); - await this.MessageBus.SendError(new(Icons.Material.Filled.SaveAs, TA("AI Studio could not save this material. Please try again."))); + await this.MessageBus.SendError(new(AppIcons.SAVE_FAILED, TA("AI Studio could not save this material. Please try again."))); } finally { diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepForm.razor b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepForm.razor index 579c8b021..d569a1646 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepForm.razor +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepForm.razor @@ -16,7 +16,7 @@ @if (this.HasPublicDetails && this.IsEventNotPublic) { - + @TA("The event is not public. Therefore, the lab does not research it on the web, and none of your details reach a search, not even those marked with a symbol.") } diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepForm.razor.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepForm.razor.cs index 8ce9db51f..241839118 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepForm.razor.cs +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepForm.razor.cs @@ -46,7 +46,7 @@ public partial class BflStepForm : MSGComponentBase /// /// The symbol which marks a field whose value the research of the lab receives. /// - private const string PUBLIC_DETAIL_ICON = Icons.Material.Filled.TravelExplore; + private const string PUBLIC_DETAIL_ICON = AppIcons.WEB_RESEARCH; /// /// Gets whether the step has fields whose values the research receives, so that the form explains their symbol. diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflWorkStateGenerator.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflWorkStateGenerator.cs index 84dac0084..8ae4f48d2 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflWorkStateGenerator.cs +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflWorkStateGenerator.cs @@ -109,7 +109,7 @@ public sealed class BflWorkStateGenerator(BeyondFactsLabStore store, BflConversa if (answer.Sections.Count is 0) { logger.LogWarning("The model wrote no readable work state of the BeyondFacts Lab: {Problems}", string.Join(" ", answer.Problems)); - await messageBus.SendError(new(Icons.Material.Filled.ErrorOutline, TA("The model did not write a work state the lab can read. Please try again, or try another provider."))); + await messageBus.SendError(new(AppIcons.ERROR, TA("The model did not write a work state the lab can read. Please try again, or try another provider."))); return; } @@ -126,12 +126,12 @@ public sealed class BflWorkStateGenerator(BeyondFactsLabStore store, BflConversa catch (BflPromptOverrideException exception) { logger.LogWarning(exception, "A prompt override of the BeyondFacts Lab has a placeholder which the lab does not fill."); - await messageBus.SendError(new(Icons.Material.Filled.ErrorOutline, string.Format(TA("The file '{0}' in the test folder of the BeyondFacts Lab contains the placeholder '{1}', which the lab does not fill in this file. Please correct the file and try again."), exception.FileName, exception.Placeholder))); + await messageBus.SendError(new(AppIcons.ERROR, string.Format(TA("The file '{0}' in the test folder of the BeyondFacts Lab contains the placeholder '{1}', which the lab does not fill in this file. Please correct the file and try again."), exception.FileName, exception.Placeholder))); } catch (ProviderRequestException exception) { logger.LogError(exception, "The provider request for a work state of the BeyondFacts Lab failed. Status={StatusCode}, Reason='{ReasonPhrase}'.", exception.StatusCode, exception.ReasonPhrase); - await messageBus.SendError(new(Icons.Material.Filled.CloudOff, exception.UserMessage)); + await messageBus.SendError(new(AppIcons.PROVIDER_ERROR, exception.UserMessage)); } catch (FileNotFoundException) { @@ -140,7 +140,7 @@ public sealed class BflWorkStateGenerator(BeyondFactsLabStore store, BflConversa catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or InvalidDataException or FormatException) { logger.LogError(exception, "The BeyondFacts Lab could not write the work state of '{Location}'.", location.Key); - await messageBus.SendError(new(Icons.Material.Filled.SaveAs, TA("AI Studio could not create the work state. Please try again."))); + await messageBus.SendError(new(AppIcons.SAVE_FAILED, TA("AI Studio could not create the work state. Please try again."))); } finally { diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflWorkStatePanel.razor b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflWorkStatePanel.razor index 0a267f7dd..f7aad89a6 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflWorkStatePanel.razor +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflWorkStatePanel.razor @@ -37,7 +37,7 @@ else @T("The lab writes the work state from the conversation") - @T("Stop") + @T("Stop") } @@ -61,8 +61,8 @@ else } - @T("Confirm") - @T("Discard draft") + @T("Confirm") + @T("Discard draft") } @@ -78,17 +78,17 @@ else @if (this.Status is BflWorkStateStatus.OUTDATED or BflWorkStateStatus.DETAILS_CHANGED) { - @T("Confirm again") + @T("Confirm again") } - @T("Edit") - @T("Withdraw") + @T("Edit") + @T("Withdraw") } @(workState.Draft is null && workState.Confirmed is null ? T("Create work state") : T("Create anew")) @@ -105,8 +105,8 @@ else @field.Label @TextOf(field, value) - @T("Take over") - @T("Dismiss") + @T("Take over") + @T("Dismiss") } diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflWorkStatePanel.razor.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflWorkStatePanel.razor.cs index 4cbb44def..5f35310a7 100644 --- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflWorkStatePanel.razor.cs +++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflWorkStatePanel.razor.cs @@ -241,7 +241,7 @@ public partial class BflWorkStatePanel : MSGComponentBase catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or InvalidDataException) { this.Logger.LogError(exception, "Could not save the work state of a step in the BeyondFacts Lab."); - await this.MessageBus.SendError(new(Icons.Material.Filled.SaveAs, TA("AI Studio could not save the work state. Please try again."))); + await this.MessageBus.SendError(new(AppIcons.SAVE_FAILED, TA("AI Studio could not save the work state. Please try again."))); return false; } finally diff --git a/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor b/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor index 810f654e7..d0f6c562f 100644 --- a/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor +++ b/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor @@ -5,10 +5,10 @@ Links: - @T("Wikipedia list of cognitive biases") - @T("Extended bias poster") - @T("Blog post of Buster Benson:") "Cognitive bias cheat sheet" + @T("Wikipedia list of cognitive biases") + @T("Extended bias poster") + @T("Blog post of Buster Benson:") "Cognitive bias cheat sheet" - + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/Builder/AssistantBuilder.razor b/app/MindWork AI Studio/Assistants/Builder/AssistantBuilder.razor index ab298ce07..a545b69a2 100644 --- a/app/MindWork AI Studio/Assistants/Builder/AssistantBuilder.razor +++ b/app/MindWork AI Studio/Assistants/Builder/AssistantBuilder.razor @@ -8,7 +8,7 @@ @if (this.step is BuilderStep.DESCRIBE) { - + @* This switch chooses between the two kinds of assistant the Builder can create, so it stays outside the advanced options. Its fields are required, and a collapsed panel would hide @@ -32,7 +32,7 @@ launcher tile opens. The title lives here rather than in the advanced options, because a launcher has no other visible content: its tile is the whole assistant. *@ - + } - + @* A launcher shows this field inside its own frame above, next to the chat settings it belongs with. *@ @if (!this.createChatLauncher) { - + } - + @if (!this.createChatLauncher) { - - - + + + @foreach (var component in ASSISTANT_COMPONENT_OPTIONS) { @@ -63,10 +63,10 @@ } - + - - + + } @@ -80,23 +80,23 @@ else @T("Assistant draft") - + @T("View accepted draft") - + - + @T("Change description") @if (this.step is BuilderStep.DONE) { - + @T("Edit draft") @@ -110,7 +110,7 @@ else @code { private protected override RenderFragment? BelowSubmitContent => this.step is BuilderStep.DONE && !string.IsNullOrWhiteSpace(this.generatedLuaAssistant) ? @ - + @@ -135,13 +135,13 @@ else } else if (this.PluginCheckCompleted) { - + @string.Format(T("The generated assistant '{0}' is valid and runnable."), this.pluginCheckResult?.PluginName ?? T("Unknown assistant")) } else { - + @T("Validate generated assistant") } @@ -167,7 +167,7 @@ else } else if (this.PluginInstallCompleted) { - + @(this.pluginInstallResult?.ReplacedExisting is true ? string.Format(T("The assistant '{0}' was updated."), this.pluginInstallResult?.PluginName ?? T("Unknown assistant")) : string.Format(T("The assistant '{0}' was installed."), this.pluginInstallResult?.PluginName ?? T("Unknown assistant"))) @@ -175,7 +175,7 @@ else } else { - + @T("Install assistant") } @@ -207,7 +207,7 @@ else } else { - + @T("Start security audit") } @@ -233,7 +233,7 @@ else } else if (this.EnableCompleted) { - + @T("The assistant is enabled.") } @@ -241,11 +241,11 @@ else { @if (this.RequiresActivationConfirmation) { - + @T("The security check is below your required level. Your settings allow activation after confirmation.") } - + @T("Enable assistant") } @@ -256,7 +256,7 @@ else @if (this.CanOpenAssistant) { - + @T("Open assistant") } diff --git a/app/MindWork AI Studio/Assistants/Builder/AssistantBuilder.razor.cs b/app/MindWork AI Studio/Assistants/Builder/AssistantBuilder.razor.cs index 096da6fce..9682f54d1 100644 --- a/app/MindWork AI Studio/Assistants/Builder/AssistantBuilder.razor.cs +++ b/app/MindWork AI Studio/Assistants/Builder/AssistantBuilder.razor.cs @@ -640,7 +640,7 @@ public partial class AssistantBuilder : AssistantBaseCore(this, Event.CONFIGURATION_CHANGED); - await this.MessageBus.SendSuccess(new(Icons.Material.Filled.ToggleOn, T("Assistant enabled."))); + await this.MessageBus.SendSuccess(new(AppIcons.ENABLE, T("Assistant enabled."))); this.stepperIndex = (int)BuilderInstallStep.OPEN_ASSISTANT; } finally @@ -813,7 +813,7 @@ public partial class AssistantBuilder : AssistantBaseCore @if (this.provideCompilerMessages) { - + } - + diff --git a/app/MindWork AI Studio/Assistants/DocumentAnalysis/DocumentAnalysisAssistant.razor b/app/MindWork AI Studio/Assistants/DocumentAnalysis/DocumentAnalysisAssistant.razor index a20bfd71a..b014f04bd 100644 --- a/app/MindWork AI Studio/Assistants/DocumentAnalysis/DocumentAnalysisAssistant.razor +++ b/app/MindWork AI Studio/Assistants/DocumentAnalysis/DocumentAnalysisAssistant.razor @@ -27,16 +27,16 @@ else { @if (policy.IsEnterpriseConfiguration) { - + @policy.PolicyName - + } else { - + @policy.PolicyName } @@ -48,7 +48,7 @@ else @T("Add policy") - + @T("Delete this policy") @@ -83,7 +83,7 @@ else { @* Standard view with expansion panels *@ - + @if (!this.policyDefinitionExpanded) { @@ -148,7 +148,7 @@ else @T("Preparation for enterprise distribution") - + @T("Export policy as configuration section") } @@ -157,7 +157,7 @@ else - + @T("Policy Description") diff --git a/app/MindWork AI Studio/Assistants/DocumentAnalysis/DocumentAnalysisAssistant.razor.cs b/app/MindWork AI Studio/Assistants/DocumentAnalysis/DocumentAnalysisAssistant.razor.cs index 59224ba65..b8ef9d9bf 100644 --- a/app/MindWork AI Studio/Assistants/DocumentAnalysis/DocumentAnalysisAssistant.razor.cs +++ b/app/MindWork AI Studio/Assistants/DocumentAnalysis/DocumentAnalysisAssistant.razor.cs @@ -923,21 +923,21 @@ public partial class DocumentAnalysisAssistant : AssistantBaseCore this.CanReviseCurrentAssistant ? @ - + : null; @@ -67,7 +67,7 @@ else LabelPlacement="@assistantSwitch.GetLabelPlacement()" Color="@AssistantSwitch.GetColor(assistantSwitch.CheckedColor)" UncheckedColor="@AssistantSwitch.GetColor(assistantSwitch.UncheckedColor)" - ThumbIcon="@assistantSwitch.GetIconSvg()" + ThumbIcon="@assistantSwitch.GetIcon()" ThumbIconColor="@AssistantSwitch.GetColor(assistantSwitch.IconColor)" Disabled="@(assistantSwitch.Disabled || this.IsSwitchActionRunning(assistantSwitch.Name))" Class="@assistantSwitch.Class" @@ -104,7 +104,7 @@ else MaxLength="@textArea.MaxLength" Immediate="@textArea.IsImmediate" Adornment="@textArea.GetAdornmentPos()" - AdornmentIcon="@AssistantComponentPropHelper.GetIconSvg(textArea.AdornmentIcon)" + AdornmentIcon="@AssistantComponentPropHelper.GetIcon(textArea.AdornmentIcon)" AdornmentText="@textArea.AdornmentText" AdornmentColor="@textArea.GetAdornmentColor()" Variant="Variant.Outlined" @@ -190,8 +190,8 @@ else Default="@assistantDropdown.Default" Label="@assistantDropdown.Label" HelperText="@assistantDropdown.HelperText" - OpenIcon="@AssistantComponentPropHelper.GetIconSvg(assistantDropdown.OpenIcon)" - CloseIcon="@AssistantComponentPropHelper.GetIconSvg(assistantDropdown.CloseIcon)" + OpenIcon="@AssistantComponentPropHelper.GetIcon(assistantDropdown.OpenIcon)" + CloseIcon="@AssistantComponentPropHelper.GetIcon(assistantDropdown.CloseIcon)" IconColor="@AssistantComponentPropHelper.GetColor(assistantDropdown.IconColor, Color.Default)" IconPosition="@AssistantComponentPropHelper.GetAdornment(assistantDropdown.IconPositon, Adornment.End)" Variant="@AssistantComponentPropHelper.GetVariant(assistantDropdown.Variant, Variant.Outlined)" @@ -209,8 +209,8 @@ else Default="@assistantDropdown.Default" Label="@assistantDropdown.Label" HelperText="@assistantDropdown.HelperText" - OpenIcon="@AssistantComponentPropHelper.GetIconSvg(assistantDropdown.OpenIcon)" - CloseIcon="@AssistantComponentPropHelper.GetIconSvg(assistantDropdown.CloseIcon)" + OpenIcon="@AssistantComponentPropHelper.GetIcon(assistantDropdown.OpenIcon)" + CloseIcon="@AssistantComponentPropHelper.GetIcon(assistantDropdown.CloseIcon)" IconColor="@AssistantComponentPropHelper.GetColor(assistantDropdown.IconColor, Color.Default)" IconPosition="@AssistantComponentPropHelper.GetAdornment(assistantDropdown.IconPositon, Adornment.End)" Variant="@AssistantComponentPropHelper.GetVariant(assistantDropdown.Variant, Variant.Outlined)" @@ -226,7 +226,7 @@ else if (component is AssistantButton assistantButton) { var button = assistantButton; - var icon = AssistantComponentPropHelper.GetIconSvg(button.StartIcon); + var icon = AssistantComponentPropHelper.GetIcon(button.StartIcon); var iconColor = AssistantComponentPropHelper.GetColor(button.IconColor, Color.Inherit); var color = AssistantComponentPropHelper.GetColor(button.Color, Color.Default); var size = AssistantComponentPropHelper.GetComponentSize(button.Size, Size.Medium); @@ -244,7 +244,7 @@ else Size="@size" FullWidth="@button.IsFullWidth" StartIcon="@icon" - EndIcon="@AssistantComponentPropHelper.GetIconSvg(button.EndIcon)" + EndIcon="@AssistantComponentPropHelper.GetIcon(button.EndIcon)" IconColor="@iconColor" IconSize="@iconSize" Disabled="@disabled" @@ -365,13 +365,13 @@ else Dense="@accordionSection.IsDense" Gutters="@accordionSection.HasInnerPadding" HideIcon="@accordionSection.HideIcon" - Icon="@AssistantComponentPropHelper.GetIconSvg(accordionSection.ExpandIcon)" + Icon="@AssistantComponentPropHelper.GetIcon(accordionSection.ExpandIcon)" MaxHeight="@accordionSection.MaxHeight" Class="@accordionSection.Class" Style="@GetOptionalStyle(accordionSection.Style)">
- + @@ -458,11 +458,11 @@ else @if (item.Type == "LINK") { - @item.Text + @item.Text } else { - var icon = !string.IsNullOrEmpty(item.Icon) ? AssistantComponentPropHelper.GetIconSvg(item.Icon) : string.Empty; + var icon = !string.IsNullOrEmpty(item.Icon) ? AssistantComponentPropHelper.GetIcon(item.Icon) : string.Empty; @item.Text } } diff --git a/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs b/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs index cc8c68eb4..24f0e7f4d 100644 --- a/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs +++ b/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs @@ -309,7 +309,7 @@ public partial class AssistantDynamic : AssistantBaseCore if (updatedPlugin is not null && !updatedPlugin.StartsChatDirectly) this.ApplyUpdatedAssistantPlugin(updatedPlugin); - await this.MessageBus.SendSuccess(new(Icons.Material.Filled.AutoFixHigh, string.Format(this.T("The assistant '{0}' has been updated."), revisionResult.PluginName))); + await this.MessageBus.SendSuccess(new(AppIcons.REVISE_ASSISTANT, string.Format(this.T("The assistant '{0}' has been updated."), revisionResult.PluginName))); await this.MessageBus.SendMessage(this, Event.PLUGINS_RELOADED); await this.MessageBus.SendMessage(this, Event.CONFIGURATION_CHANGED); @@ -327,7 +327,7 @@ public partial class AssistantDynamic : AssistantBaseCore var result = await this.DirectChatService.TryCreateAssistantChatAsync(launcherPlugin); if (result.Request is null) { - await this.MessageBus.SendError(new(Icons.Material.Filled.ReportProblem, result.ErrorMessage)); + await this.MessageBus.SendError(new(AppIcons.ERROR, result.ErrorMessage)); this.NavigationManager.NavigateTo(Routes.ASSISTANTS); return; } diff --git a/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor b/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor index 6ea4d7c2a..a874a7d5e 100644 --- a/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor +++ b/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor @@ -5,13 +5,13 @@ @if (this.provideHistory) { - + } - - - + + + @foreach (var contentLine in this.bulletPointsLines) { @@ -19,7 +19,7 @@ } - - - + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor b/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor index 91062fa99..f17b39328 100644 --- a/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor +++ b/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor @@ -14,10 +14,10 @@ - + @T("ERI repository with example implementation in .NET and C#") - + @T("Interactive documentation aka Swagger UI") @@ -44,7 +44,7 @@ else @foreach (var server in this.SettingsManager.ConfigurationData.ERI.ERIServers) { - + @server.ServerName } @@ -93,7 +93,7 @@ else - + @foreach (var language in Enum.GetValues()) { @@ -117,7 +117,7 @@ else } - @T("Save specification") + @T("Save specification") @@ -126,7 +126,7 @@ else - + @foreach (var dataSource in Enum.GetValues()) { @@ -243,10 +243,10 @@ else @context.EmbeddingType - + @T("Edit") - + @T("Delete") @@ -262,7 +262,7 @@ else } } - + @T("Add Embedding Method") @@ -289,10 +289,10 @@ else @context.Name - + @T("Edit") - + @T("Delete") @@ -308,7 +308,7 @@ else } } - + @T("Add Retrieval Process") diff --git a/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor.cs b/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor.cs index 2cacce504..6b3fcc721 100644 --- a/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor.cs +++ b/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor.cs @@ -53,7 +53,7 @@ public partial class AssistantERI : AssistantBaseCore new ButtonData { Text = T("Open in chat"), - Icon = Icons.Material.Filled.Chat, + Icon = AppIcons.CHAT, Color = Color.Default, AsyncAction = this.OpenInChat, DisabledActionParam = () => !this.CanOpenInChat, @@ -398,7 +398,7 @@ public partial class AssistantERI : AssistantBaseCore { if (await this.WebRootFiles.CopyToAsync(specificationPath, response.SaveFilePath)) { - await feedback.SucceededAsync(Icons.Material.Filled.CheckCircle, T("The ERI specification was saved."), response.SaveFilePath, true); + await feedback.SucceededAsync(AppIcons.SUCCESS, T("The ERI specification was saved."), response.SaveFilePath, true); return; } @@ -409,7 +409,7 @@ public partial class AssistantERI : AssistantBaseCore this.Logger.LogError(exception, "Failed to save the ERI specification {ERIVersion}.", this.selectedERIVersion); } - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.Cancel, T("The ERI specification could not be saved."))); + await MessageBus.INSTANCE.SendError(new(AppIcons.ERROR, T("The ERI specification could not be saved."))); } /// @@ -917,7 +917,7 @@ public partial class AssistantERI : AssistantBaseCore if (!ERIServerFileList.TryParse(fileListAnswer, out var filesToGenerate)) { this.Logger.LogWarning("The list of files could not be read from the answer of the model: '{Answer}'", fileListAnswer); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.SaveAs, T("The list of files in the answer of the model could not be read, so no files were created. Please try again."))); + await this.MessageBus.SendWarning(new(AppIcons.SAVE_FAILED, T("The list of files in the answer of the model could not be read, so no files were created. Please try again."))); return; } @@ -986,7 +986,7 @@ public partial class AssistantERI : AssistantBaseCore if (outcome is ERIServerFileOutcome.WRITTEN) generatedFiles.Add(ERIServerFiles.PathOf(baseDirectorySnapshot, file)); else - await this.MessageBus.SendWarning(new(Icons.Material.Filled.SaveAs, outcome.ToUserMessage(file))); + await this.MessageBus.SendWarning(new(AppIcons.SAVE_FAILED, outcome.ToUserMessage(file))); } } diff --git a/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor b/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor index ac3c25516..955fe09fb 100644 --- a/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor +++ b/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor @@ -2,6 +2,6 @@ @inherits AssistantBaseCore - - + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/I18N/AssistantI18N.razor b/app/MindWork AI Studio/Assistants/I18N/AssistantI18N.razor index ef759a5ef..ef61feaa6 100644 --- a/app/MindWork AI Studio/Assistants/I18N/AssistantI18N.razor +++ b/app/MindWork AI Studio/Assistants/I18N/AssistantI18N.razor @@ -2,7 +2,7 @@ @using AIStudio.Settings @inherits AssistantBaseCore - + @if (this.isLoading) { @@ -22,7 +22,7 @@ else if (!this.isLoading && string.IsNullOrWhiteSpace(this.loadingIssue)) - + @@ -50,7 +50,7 @@ else if (!this.isLoading && string.IsNullOrWhiteSpace(this.loadingIssue)) - + @@ -92,7 +92,7 @@ else if (!this.isLoading && string.IsNullOrWhiteSpace(this.loadingIssue)) - + diff --git a/app/MindWork AI Studio/Assistants/I18N/AssistantI18N.razor.cs b/app/MindWork AI Studio/Assistants/I18N/AssistantI18N.razor.cs index 84c997996..0930ad163 100644 --- a/app/MindWork AI Studio/Assistants/I18N/AssistantI18N.razor.cs +++ b/app/MindWork AI Studio/Assistants/I18N/AssistantI18N.razor.cs @@ -64,7 +64,7 @@ public partial class AssistantI18N : AssistantBaseCore #else Text = T("Copy Lua code to clipboard"), #endif - Icon = Icons.Material.Filled.Extension, + Icon = AppIcons.PLUGIN, Color = Color.Default, #if DEBUG AsyncAction = async () => await this.WriteToPluginFile(), @@ -488,13 +488,13 @@ public partial class AssistantI18N : AssistantBaseCore { if (this.selectedLanguagePlugin is null) { - await this.MessageBus.SendError(new(Icons.Material.Filled.Translate, T("No language plugin selected."))); + await this.MessageBus.SendError(new(AppIcons.ASSISTANT_LOCALIZATION, T("No language plugin selected."))); return; } if (this.finalLuaCode.Length == 0) { - await this.MessageBus.SendError(new(Icons.Material.Filled.Code, T("No Lua code generated yet."))); + await this.MessageBus.SendError(new(AppIcons.CODE, T("No Lua code generated yet."))); return; } @@ -510,7 +510,7 @@ public partial class AssistantI18N : AssistantBaseCore if (!File.Exists(pluginFilePath)) { this.Logger.LogError("Plugin file not found: {PluginFilePath}.", pluginFilePath); - await this.MessageBus.SendError(new(Icons.Material.Filled.FindInPage, T("Plugin file not found."))); + await this.MessageBus.SendError(new(AppIcons.FILE_NOT_FOUND, T("Plugin file not found."))); return; } @@ -524,7 +524,7 @@ public partial class AssistantI18N : AssistantBaseCore if (markerIndex == -1) { this.Logger.LogError("Could not find 'UI_TEXT_CONTENT = {{}}' marker in plugin file: {PluginFilePath}", pluginFilePath); - await this.MessageBus.SendError(new(Icons.Material.Filled.FindInPage, T("Could not find 'UI_TEXT_CONTENT = {}' marker in plugin file."))); + await this.MessageBus.SendError(new(AppIcons.FILE_NOT_FOUND, T("Could not find 'UI_TEXT_CONTENT = {}' marker in plugin file."))); return; } @@ -534,12 +534,12 @@ public partial class AssistantI18N : AssistantBaseCore // Write the updated content back to the file: await File.WriteAllTextAsync(pluginFilePath, newContent); - await this.MessageBus.SendSuccess(new(Icons.Material.Filled.Translate, T("Successfully updated plugin file."))); + await this.MessageBus.SendSuccess(new(AppIcons.ASSISTANT_LOCALIZATION, T("Successfully updated plugin file."))); } catch (Exception ex) { this.Logger.LogError(ex, "Error writing to plugin file."); - await this.MessageBus.SendError(new(Icons.Material.Filled.Translate, T("Error writing to plugin file."))); + await this.MessageBus.SendError(new(AppIcons.ASSISTANT_LOCALIZATION, T("Error writing to plugin file."))); } } #endif diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua index 3523c0102..798103867 100644 --- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua +++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua @@ -13252,6 +13252,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1378412877"] = "Once the encodin -- This library is used to read PDF files. This is necessary, e.g., for using PDFs as a data source for a chat. UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1388816916"] = "This library is used to read PDF files. This is necessary, e.g., for using PDFs as a data source for a chat." +-- The icons of AI Studio come from Lucide, an open-source icon set. AI Studio ships them as a font, so showing them never sends a request to the internet. Lucide is licensed under ISC; the icons it took over from Feather remain under MIT. +UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1390097716"] = "The icons of AI Studio come from Lucide, an open-source icon set. AI Studio ships them as a font, so showing them never sends a request to the internet. Lucide is licensed under ISC; the icons it took over from Feather remain under MIT." + -- Updates are managed by your organization. Contact your IT department if you have questions about updating AI Studio. UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1402243995"] = "Updates are managed by your organization. Contact your IT department if you have questions about updating AI Studio." diff --git a/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor b/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor index 9cc3680bd..fa06d46b9 100644 --- a/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor +++ b/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor @@ -1,10 +1,10 @@ @attribute [Route(Routes.ASSISTANT_ICON_FINDER)] @inherits AssistantBaseCore - + - + @foreach (var source in Enum.GetValues()) { diff --git a/app/MindWork AI Studio/Assistants/JobPosting/AssistantJobPostings.razor b/app/MindWork AI Studio/Assistants/JobPosting/AssistantJobPostings.razor index 885368e52..52bf8b80b 100644 --- a/app/MindWork AI Studio/Assistants/JobPosting/AssistantJobPostings.razor +++ b/app/MindWork AI Studio/Assistants/JobPosting/AssistantJobPostings.razor @@ -1,20 +1,20 @@ @attribute [Route(Routes.ASSISTANT_JOB_POSTING)] @inherits AssistantBaseCore - - + + @* Four zones, so no default target: every drop has to be aimed at the field it belongs to. *@ - + - + - + - - - - + + + + - + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor b/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor index 91bcae865..0c17c2fd8 100644 --- a/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor +++ b/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor @@ -8,8 +8,8 @@ @* Two zones, so no default target: the user has to aim at the one they mean. *@ - + - + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/LogViewer/AssistantLogViewer.razor b/app/MindWork AI Studio/Assistants/LogViewer/AssistantLogViewer.razor index 6d9399001..2c7bde5cb 100644 --- a/app/MindWork AI Studio/Assistants/LogViewer/AssistantLogViewer.razor +++ b/app/MindWork AI Studio/Assistants/LogViewer/AssistantLogViewer.razor @@ -16,18 +16,18 @@ @if (!this.autoRefresh) { - + @T("Refresh") } - + @T("Open in folder") - + @foreach (var option in this.logLevelOptions) { @@ -35,7 +35,7 @@ } - + @foreach (var option in this.loggerOptions) { @@ -43,7 +43,7 @@ } - + @foreach (var option in this.sourceDetailOptions) { @@ -55,8 +55,8 @@ - - + + @T("Clear") @@ -89,7 +89,7 @@ else if (this.displayLines.Count == 0) {
- + @T("No matching log lines.")
} diff --git a/app/MindWork AI Studio/Assistants/LogViewer/AssistantLogViewer.razor.cs b/app/MindWork AI Studio/Assistants/LogViewer/AssistantLogViewer.razor.cs index 8c5bf6597..864fd54ac 100644 --- a/app/MindWork AI Studio/Assistants/LogViewer/AssistantLogViewer.razor.cs +++ b/app/MindWork AI Studio/Assistants/LogViewer/AssistantLogViewer.razor.cs @@ -212,7 +212,7 @@ public partial class AssistantLogViewer : MSGComponentBase var path = this.CurrentLogPath; if (string.IsNullOrWhiteSpace(path)) { - await this.MessageBus.SendWarning(new(Icons.Material.Filled.Folder, T("The log file path is not available yet."))); + await this.MessageBus.SendWarning(new(AppIcons.FOLDER_OPEN, T("The log file path is not available yet."))); return; } @@ -224,18 +224,18 @@ public partial class AssistantLogViewer : MSGComponentBase catch (Exception e) { this.Logger.LogWarning(e, "Could not open the log file location in the file manager."); - await this.MessageBus.SendError(new(Icons.Material.Filled.Folder, T("Could not open the log file location."))); + await this.MessageBus.SendError(new(AppIcons.FOLDER_OPEN, T("Could not open the log file location."))); return; } if (response.Success) { - await this.MessageBus.SendSuccess(new(Icons.Material.Filled.FolderOpen, T("Opened the log file location."))); + await this.MessageBus.SendSuccess(new(AppIcons.FOLDER_OPEN, T("Opened the log file location."))); return; } var issue = string.IsNullOrWhiteSpace(response.Issue) ? T("Unknown error") : response.Issue; - await this.MessageBus.SendError(new(Icons.Material.Filled.Folder, string.Format(T("Could not open the log file location: {0}"), issue))); + await this.MessageBus.SendError(new(AppIcons.FOLDER_OPEN, string.Format(T("Could not open the log file location: {0}"), issue))); } private void ClearFilters() diff --git a/app/MindWork AI Studio/Assistants/MyTasks/AssistantMyTasks.razor b/app/MindWork AI Studio/Assistants/MyTasks/AssistantMyTasks.razor index d06294e09..e12aa42a5 100644 --- a/app/MindWork AI Studio/Assistants/MyTasks/AssistantMyTasks.razor +++ b/app/MindWork AI Studio/Assistants/MyTasks/AssistantMyTasks.razor @@ -2,7 +2,7 @@ @inherits AssistantBaseCore - + @T("Attach documents") @T("You can enter text, attach one or more documents, or use both. At least one input is required.") @@ -10,5 +10,5 @@
- + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor b/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor index ec48f74fe..68c0e8d93 100644 --- a/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor +++ b/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor @@ -7,7 +7,7 @@ @@ -90,7 +90,7 @@ else if (this.useCustomPromptGuide) @T("View default prompt guide") @@ -109,7 +109,7 @@ else if (this.useCustomPromptGuide) Style="min-width: 18rem;"/> @T("View") diff --git a/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor.cs b/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor.cs index 00cc373bd..c53331fe5 100644 --- a/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor.cs +++ b/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor.cs @@ -105,7 +105,7 @@ public partial class AssistantPromptOptimizer : AssistantBaseCore !this.CanImproveFurther, @@ -626,7 +626,7 @@ public partial class AssistantPromptOptimizer : AssistantBaseCore - - - - + + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/SWOTAnalysis/AssistantSWOTAnalysis.Analysis.cs b/app/MindWork AI Studio/Assistants/SWOTAnalysis/AssistantSWOTAnalysis.Analysis.cs index 103c7c39f..ff1894438 100644 --- a/app/MindWork AI Studio/Assistants/SWOTAnalysis/AssistantSWOTAnalysis.Analysis.cs +++ b/app/MindWork AI Studio/Assistants/SWOTAnalysis/AssistantSWOTAnalysis.Analysis.cs @@ -259,7 +259,7 @@ public partial class AssistantSWOTAnalysis } await this.MessageBus.SendWarning(new( - Icons.Material.Filled.CloudOff, + AppIcons.PROVIDER_ERROR, T("The research with the selected tools failed. The SWOT analysis continues without it."))); return string.Empty; } @@ -310,7 +310,7 @@ public partial class AssistantSWOTAnalysis var imageCandidates = this.contextMaterials.OfType().ToList(); if (imageCandidates.Count > 0 && !this.ProviderSettings.SupportsImageInput()) { - await this.MessageBus.SendWarning(new(Icons.Material.Filled.HideImage, T("The selected model cannot read images. The SWOT analysis continues without the attached images."))); + await this.MessageBus.SendWarning(new(AppIcons.IMAGE_NOT_SUPPORTED, T("The selected model cannot read images. The SWOT analysis continues without the attached images."))); return new(documentText, images); } @@ -325,7 +325,7 @@ public partial class AssistantSWOTAnalysis continue; } - await this.MessageBus.SendError(new(Icons.Material.Filled.BrokenImage, prepared.ErrorCode.ToUserMessage(image.FileName))); + await this.MessageBus.SendError(new(AppIcons.IMAGE_BROKEN, prepared.ErrorCode.ToUserMessage(image.FileName))); } catch (OperationCanceledException) when (token.IsCancellationRequested) { @@ -334,7 +334,7 @@ public partial class AssistantSWOTAnalysis catch (Exception exception) { this.Logger.LogError(exception, "The image '{FilePath}' could not be prepared for the SWOT analysis.", image.FilePath); - await this.MessageBus.SendError(new(Icons.Material.Filled.BrokenImage, string.Format(T("The image '{0}' could not be read and is left out of the SWOT analysis."), image.FileName))); + await this.MessageBus.SendError(new(AppIcons.IMAGE_BROKEN, string.Format(T("The image '{0}' could not be read and is left out of the SWOT analysis."), image.FileName))); } } diff --git a/app/MindWork AI Studio/Assistants/SWOTAnalysis/AssistantSWOTAnalysis.razor b/app/MindWork AI Studio/Assistants/SWOTAnalysis/AssistantSWOTAnalysis.razor index 1091cbbb7..681b054b9 100644 --- a/app/MindWork AI Studio/Assistants/SWOTAnalysis/AssistantSWOTAnalysis.razor +++ b/app/MindWork AI Studio/Assistants/SWOTAnalysis/AssistantSWOTAnalysis.razor @@ -14,15 +14,15 @@ @T("Input") - + @T("Analysis Options") - + - + @@ -34,6 +34,6 @@
- +
\ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/SlideBuilder/SlideAssistant.razor b/app/MindWork AI Studio/Assistants/SlideBuilder/SlideAssistant.razor index c0260ec55..b4859faf5 100644 --- a/app/MindWork AI Studio/Assistants/SlideBuilder/SlideAssistant.razor +++ b/app/MindWork AI Studio/Assistants/SlideBuilder/SlideAssistant.razor @@ -43,7 +43,7 @@ } @if (!string.IsNullOrWhiteSpace(this.pictureLibraryPath) && !this.IsPictureLibraryLocked) { - + @T("Use no picture library") } @@ -60,7 +60,7 @@ @T("You might want to specify important aspects that the LLM should consider when creating the slides. For example, the use of emojis or specific topics that should be highlighted.") - + @T("Extent of the planned presentation") @@ -95,22 +95,22 @@ @T("Language") - + @T("Occasion") @T("The occasion helps the LLM to structure the presentation. A lecture, for example, may close its chapters with an interim summary or with room for questions, and a report to management leads with the key messages.") - + @T("Audience") @T("Please specify the audience for the planned presentation. This will help the LLM to create a presentation that fits your needs. You can specify the audience profile, the age group, organizational level, and the expertise. You don't have to specify all of these parameters, for example you might only want to specify the audience profile and leave the other parameters at their default values.") - - - - + + + + @T("PowerPoint template") @@ -126,7 +126,7 @@ } @if (!string.IsNullOrWhiteSpace(this.templatePath) && !this.IsTemplateLocked) { - + @T("Use no template") } @@ -134,10 +134,10 @@ @* The select renders its items again on its own, e.g., while the form validates, when the template may be gone already: *@ @if (this.template is { } loadedTemplate) { - + @if (loadedTemplate.VariantLabels.Count > 0) { - + @foreach (var label in loadedTemplate.VariantLabels) { @label @@ -145,7 +145,7 @@ } - + @T("Keep empty picture placeholders") @@ -160,7 +160,7 @@ - + @LayoutPurposeExtensions.NoPreference @foreach (var layoutName in loadedTemplate.FamilyNames) { @@ -178,7 +178,7 @@ @foreach (var templateSlide in loadedTemplate.Slides) { - + } } diff --git a/app/MindWork AI Studio/Assistants/SlideBuilder/SlideAssistant.razor.Presentation.cs b/app/MindWork AI Studio/Assistants/SlideBuilder/SlideAssistant.razor.Presentation.cs index 8a1b07724..d8fdab288 100644 --- a/app/MindWork AI Studio/Assistants/SlideBuilder/SlideAssistant.razor.Presentation.cs +++ b/app/MindWork AI Studio/Assistants/SlideBuilder/SlideAssistant.razor.Presentation.cs @@ -574,7 +574,7 @@ public partial class SlideAssistant if (!result.IsWritten) { this.Logger.LogWarning("The PowerPoint template '{TemplatePath}' changed since the slides were planned, and they no longer fit it.", this.slideDeckTemplatePath); - await this.MessageBus.SendError(new(Icons.Material.Filled.Slideshow, T("The template has changed since the slides were planned. Please create the slides again."))); + await this.MessageBus.SendError(new(AppIcons.SLIDES, T("The template has changed since the slides were planned. Please create the slides again."))); return; } @@ -583,15 +583,15 @@ public partial class SlideAssistant if (result.SkippedPictures.Count > 0) { var names = result.SkippedPictures.Select(number => this.slideDeckPicturePaths.TryGetValue(number, out var picturePath) ? Path.GetFileName(picturePath) : number.ToString(CultureInfo.InvariantCulture)); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.HideImage, string.Format(T("These pictures could not be placed, because PowerPoint cannot show their format or they cannot be read: {0}"), string.Join(", ", names)))); + await this.MessageBus.SendWarning(new(AppIcons.IMAGE_NOT_SUPPORTED, string.Format(T("These pictures could not be placed, because PowerPoint cannot show their format or they cannot be read: {0}"), string.Join(", ", names)))); } - await feedback.SucceededAsync(Icons.Material.Filled.Slideshow, T("The PowerPoint file was created."), targetPath, true); + await feedback.SucceededAsync(AppIcons.SLIDES, T("The PowerPoint file was created."), targetPath, true); } catch (Exception e) { this.Logger.LogError(e, "Creating the PowerPoint file '{FilePath}' failed.", targetPath); - await this.MessageBus.SendError(new(Icons.Material.Filled.Slideshow, T("The PowerPoint file could not be created. Please check that the template can be read and that the target file is not open in another program."))); + await this.MessageBus.SendError(new(AppIcons.SLIDES, T("The PowerPoint file could not be created. Please check that the template can be read and that the target file is not open in another program."))); } finally { diff --git a/app/MindWork AI Studio/Assistants/SlideBuilder/SlideAssistant.razor.cs b/app/MindWork AI Studio/Assistants/SlideBuilder/SlideAssistant.razor.cs index 0d7af1f10..0aeb76481 100644 --- a/app/MindWork AI Studio/Assistants/SlideBuilder/SlideAssistant.razor.cs +++ b/app/MindWork AI Studio/Assistants/SlideBuilder/SlideAssistant.razor.cs @@ -148,7 +148,7 @@ public partial class SlideAssistant : AssistantBaseCore FooterButtons => [ - new ButtonData(T("Create PowerPoint file"), Icons.Material.Filled.Slideshow, Color.Default, this.CreatePresentationTooltip, this.CreatePresentationFileAsync, () => !this.CanCreatePresentation), + new ButtonData(T("Create PowerPoint file"), AppIcons.SLIDES, Color.Default, this.CreatePresentationTooltip, this.CreatePresentationFileAsync, () => !this.CanCreatePresentation), ]; // @@ -491,7 +491,7 @@ public partial class SlideAssistant : AssistantBaseCore document.FileName))))); + await this.MessageBus.SendWarning(new(AppIcons.WARNING, string.Format(T("These files are already attached as pictures for the slides and were removed from the documents: {0}"), string.Join(", ", displaced.Select(document => document.FileName))))); } private string? ValidateCustomLanguage(string language) @@ -596,21 +596,21 @@ public partial class SlideAssistant : AssistantBaseCore !SlideDeckSpecValidator.CanWrite(slide, catalog, chosenTemplateSlideUses))) { this.Logger.LogWarning("The slides the model planned cannot be used: {Issues}", string.Join(" | ", issues)); - await this.MessageBus.SendError(new(Icons.Material.Filled.Slideshow, T("The LLM did not describe the slides in a usable form, even after a second request. Please try again, or choose another model."))); + await this.MessageBus.SendError(new(AppIcons.SLIDES, T("The LLM did not describe the slides in a usable form, even after a second request. Please try again, or choose another model."))); return; } if (issues.Count > 0) { this.Logger.LogInformation("The slides the model planned still have issues after the repair round: {Issues}", string.Join(" | ", issues)); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.Slideshow, T("Not every slide fits its layout as planned; for example, a text may run long. Please check the slides before presenting."))); + await this.MessageBus.SendWarning(new(AppIcons.SLIDES, T("Not every slide fits its layout as planned; for example, a text may run long. Please check the slides before presenting."))); } this.slideDeck = deck; diff --git a/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor b/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor index 7f9cebceb..a87cd8ca2 100644 --- a/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor +++ b/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor @@ -1,8 +1,8 @@ @attribute [Route(Routes.ASSISTANT_SYNONYMS)] @inherits AssistantBaseCore - - + + - + diff --git a/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor b/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor index 12d2534bd..5d46594c3 100644 --- a/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor +++ b/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor @@ -7,8 +7,8 @@ } - - - - + + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor b/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor index c864ac47d..46a8bf6a3 100644 --- a/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor +++ b/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor @@ -11,12 +11,12 @@ @if (this.liveTranslation) { - + } else { - + } - + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor index bd8a3cd80..4e1dfeffe 100644 --- a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor +++ b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor @@ -14,7 +14,7 @@ @T("Visual Briefings") - + @@ -25,7 +25,7 @@ SelectedValueChanged="@this.SelectBriefingAsync"> @foreach (var project in this.projects) { - + @this.ProjectDisplayName(project) @project.ModifiedAtUtc.ToLocalTime().ToString("g") @@ -47,8 +47,8 @@ - @T("New briefing") - @T("Import") + @T("New briefing") + @T("Import") @@ -72,8 +72,8 @@ @T("Report a problem?")
- @T("Open project folder") - @T("Delete") + @T("Open project folder") + @T("Delete")
@@ -90,8 +90,8 @@ @this.editor.Name - @T("Rename") - @T("Delete") + @T("Rename") + @T("Delete") @@ -109,7 +109,7 @@ @T("Linked sources") - @T("Refresh status") + @T("Refresh status") @@ -173,16 +173,16 @@ - + @if (context.IsMedia && context.Status is VisualBriefingSourceStatus.TRANSCRIPT_OUTDATED) { - + } - + @@ -215,7 +215,7 @@
- + @@ -227,30 +227,30 @@ @if (this.selectedBriefing.Versions.Count == 0) { - @T("Create briefing") + @T("Create briefing") } else { - @T("Change design") + @T("Change design") - @T("Update content") + @T("Update content") - @T("Rebuild briefing") + @T("Rebuild briefing") - @T("Recompile briefing") + @T("Recompile briefing") } @@ -258,7 +258,7 @@ { @(this.IsCurrentBuildCanceling ? T("Stopping build...") : T("Stop build")) @@ -281,7 +281,7 @@ @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") @@ -293,7 +293,7 @@ @if (this.lastBuildDiagnostics is not null) { @T("Copy technical details") @@ -305,23 +305,23 @@ - + @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") + @T("Export")
diff --git a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Build.cs b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Build.cs index a861de89c..be45daf7a 100644 --- a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Build.cs +++ b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Build.cs @@ -105,7 +105,7 @@ public partial class VisualBriefingAssistant // derived from the stable enums in the current language instead: terminalIssue = VisualBriefingFailureExtensions.ToUserMessage(result.FailureCode, result.Diagnostics.ValidationRule); if (terminalStatus is not AssistantSessionStatus.CANCELED) - await this.MessageBus.SendError(new(Icons.Material.Filled.AutoAwesome, terminalIssue)); + await this.MessageBus.SendError(new(AppIcons.GENERATE, terminalIssue)); return; } @@ -123,7 +123,7 @@ public partial class VisualBriefingAssistant this.UpdateProject(latest); } - await this.MessageBus.SendSuccess(new(Icons.Material.Filled.AutoAwesome, successMessage)); + await this.MessageBus.SendSuccess(new(AppIcons.GENERATE, successMessage)); terminalStatus = AssistantSessionStatus.COMPLETED; } catch (OperationCanceledException) @@ -135,7 +135,7 @@ public partial class VisualBriefingAssistant { terminalIssue = unexpectedFailureMessage; this.Logger.LogError("Unexpected visual briefing UI failure. BriefingId={BriefingId} Mode={Mode} ExceptionType={ExceptionType}", briefingId, mode, exception.GetType().Name); - await this.MessageBus.SendError(new(Icons.Material.Filled.AutoAwesome, terminalIssue)); + await this.MessageBus.SendError(new(AppIcons.GENERATE, terminalIssue)); } finally { diff --git a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Projects.cs b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Projects.cs index c2b89f135..62b351457 100644 --- a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Projects.cs +++ b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Projects.cs @@ -166,7 +166,7 @@ public partial class VisualBriefingAssistant var path = await this.Store.GetProjectDirectoryPathAsync(this.selectedProject.BriefingId); if (string.IsNullOrWhiteSpace(path)) { - await this.MessageBus.SendWarning(new(Icons.Material.Filled.Folder, T("The visual briefing project folder is not available."))); + await this.MessageBus.SendWarning(new(AppIcons.FOLDER_OPEN, T("The visual briefing project folder is not available."))); return; } @@ -178,18 +178,18 @@ public partial class VisualBriefingAssistant catch (Exception exception) { this.Logger.LogWarning(exception, "Could not open the visual briefing project folder. BriefingId={BriefingId}", this.selectedProject.BriefingId); - await this.MessageBus.SendError(new(Icons.Material.Filled.Folder, T("Could not open the visual briefing project folder."))); + await this.MessageBus.SendError(new(AppIcons.FOLDER_OPEN, T("Could not open the visual briefing project folder."))); return; } if (response.Success) { - await this.MessageBus.SendSuccess(new(Icons.Material.Filled.Folder, T("Opened the visual briefing project folder."))); + await this.MessageBus.SendSuccess(new(AppIcons.FOLDER_OPEN, T("Opened the visual briefing project folder."))); return; } var issue = string.IsNullOrWhiteSpace(response.Issue) ? T("Unknown error") : response.Issue; - await this.MessageBus.SendError(new(Icons.Material.Filled.Folder, string.Format(T("Could not open the visual briefing project folder: {0}"), issue))); + await this.MessageBus.SendError(new(AppIcons.FOLDER_OPEN, string.Format(T("Could not open the visual briefing project folder: {0}"), issue))); } /// diff --git a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Sources.cs b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Sources.cs index 4849d0480..0c6fa2fd0 100644 --- a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Sources.cs +++ b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Sources.cs @@ -36,7 +36,7 @@ public partial class VisualBriefingAssistant { this.editor.SourceMaterial.ExceptWith(displaced); await this.MessageBus.SendWarning(new( - Icons.Material.Filled.Warning, + AppIcons.WARNING, string.Format( T("These files are already attached as visual assets and were removed from the source material: {0}"), string.Join(", ", displaced.Select(attachment => Path.GetFileName(attachment.FilePath)))))); @@ -188,16 +188,16 @@ public partial class VisualBriefingAssistant return; if (outcome.Failures.Count > 0) - await this.MessageBus.SendError(new(Icons.Material.Filled.VoiceChat, string.Join(Environment.NewLine, outcome.Failures.Select(failure => $"{failure.FileName}: {failure.UserMessage}")))); + await this.MessageBus.SendError(new(AppIcons.VOICE_TRANSCRIPTION, string.Join(Environment.NewLine, outcome.Failures.Select(failure => $"{failure.FileName}: {failure.UserMessage}")))); else if (outcome.Status is MediaImportStatus.FAILED) - await this.MessageBus.SendError(new(Icons.Material.Filled.VoiceChat, T("The media file could not be transcribed."))); + await this.MessageBus.SendError(new(AppIcons.VOICE_TRANSCRIPTION, T("The media file could not be transcribed."))); if (outcome.Warnings.Count > 0) - await this.MessageBus.SendWarning(new(Icons.Material.Filled.VoiceChat, string.Join(Environment.NewLine, outcome.Warnings.Select(warning => $"{warning.FileName}: {warning.UserMessage}")))); + await this.MessageBus.SendWarning(new(AppIcons.VOICE_TRANSCRIPTION, string.Join(Environment.NewLine, outcome.Warnings.Select(warning => $"{warning.FileName}: {warning.UserMessage}")))); if (outcome.Status is MediaImportStatus.CANCELLED) - await this.MessageBus.SendWarning(new(Icons.Material.Filled.VoiceChat, T("The media transcription was canceled."))); + await this.MessageBus.SendWarning(new(AppIcons.VOICE_TRANSCRIPTION, T("The media transcription was canceled."))); } /// diff --git a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Versions.cs b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Versions.cs index 589f3d385..9fe9da5f3 100644 --- a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Versions.cs +++ b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Versions.cs @@ -118,14 +118,14 @@ public partial class VisualBriefingAssistant if (PathComparer().Equals(Path.GetFullPath(sourcePath), Path.GetFullPath(response.SaveFilePath))) { - await this.MessageBus.SendError(new(Icons.Material.Filled.SaveAs, T("Choose a different export location so the immutable briefing version is not overwritten."))); + await this.MessageBus.SendError(new(AppIcons.SAVE_FAILED, T("Choose a different export location so the immutable briefing version is not overwritten."))); return; } var verified = await this.Store.OpenIntegrityCheckedVersionAsync(this.selectedBriefing.BriefingId, this.selectedRevisionId); if (verified is null) { - await this.MessageBus.SendError(new(Icons.Material.Filled.GppBad, T("The selected briefing version failed its integrity check and cannot be exported."))); + await this.MessageBus.SendError(new(AppIcons.SECURITY_BLOCKED, T("The selected briefing version failed its integrity check and cannot be exported."))); return; } @@ -152,7 +152,7 @@ public partial class VisualBriefingAssistant exportedVersion.DocumentHash, source.Length); - await feedback.SucceededAsync(Icons.Material.Filled.FileDownload, T("The visual briefing was exported."), response.SaveFilePath, true); + await feedback.SucceededAsync(AppIcons.EXPORT, T("The visual briefing was exported."), response.SaveFilePath, true); } /// @@ -176,7 +176,7 @@ public partial class VisualBriefingAssistant catch (Exception e) { this.Logger.LogError(e, "The visual briefing could not be exported, because the file '{FilePath}' cannot be opened for writing.", targetPath); - await this.MessageBus.SendError(new(Icons.Material.Filled.FileDownload, T("The visual briefing could not be exported. Please check that the target file is not open in another program."))); + await this.MessageBus.SendError(new(AppIcons.EXPORT, T("The visual briefing could not be exported. Please check that the target file is not open in another program."))); return false; } @@ -199,7 +199,7 @@ public partial class VisualBriefingAssistant this.Logger.LogWarning(deleteFailure, "The incomplete export '{FilePath}' cannot be deleted.", targetPath); } - await this.MessageBus.SendError(new(Icons.Material.Filled.FileDownload, T("The visual briefing could not be written completely."))); + await this.MessageBus.SendError(new(AppIcons.EXPORT, T("The visual briefing could not be written completely."))); return false; } } @@ -231,7 +231,7 @@ public partial class VisualBriefingAssistant if (!imported.Success) { - await this.MessageBus.SendError(new(Icons.Material.Filled.FileUpload, imported.Issue)); + await this.MessageBus.SendError(new(AppIcons.IMPORT, imported.Issue)); return; } @@ -245,7 +245,7 @@ public partial class VisualBriefingAssistant imported.RevisionId, imported.WasDeduplicated); - await this.MessageBus.SendSuccess(new(Icons.Material.Filled.FileUpload, imported.WasDeduplicated ? T("This briefing revision was already imported.") : T("The visual briefing was imported."))); + await this.MessageBus.SendSuccess(new(AppIcons.IMPORT, imported.WasDeduplicated ? T("This briefing revision was already imported.") : T("The visual briefing was imported."))); } /// diff --git a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.cs b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.cs index 42d9b5cad..baf1c6495 100644 --- a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.cs +++ b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.cs @@ -225,7 +225,7 @@ public partial class VisualBriefingAssistant : MSGComponentBase "Could not auto-save visual briefing. BriefingId={BriefingId} ExceptionType={ExceptionType}", this.selectedBriefing.BriefingId, exception.GetType().Name); - await this.MessageBus.SendError(new(Icons.Material.Filled.SaveAs, T("The visual briefing settings could not be saved."))); + await this.MessageBus.SendError(new(AppIcons.SAVE_FAILED, T("The visual briefing settings could not be saved."))); } } diff --git a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingBuildProgress.razor b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingBuildProgress.razor index c88437432..feea2160b 100644 --- a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingBuildProgress.razor +++ b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingBuildProgress.razor @@ -26,7 +26,7 @@ { @T("Resume build") diff --git a/app/MindWork AI Studio/Chat/ChatRoleExtensions.cs b/app/MindWork AI Studio/Chat/ChatRoleExtensions.cs index 0fb0683cb..ebe760b12 100644 --- a/app/MindWork AI Studio/Chat/ChatRoleExtensions.cs +++ b/app/MindWork AI Studio/Chat/ChatRoleExtensions.cs @@ -41,11 +41,11 @@ public static class ChatRoleExtensions /// The icon of the role. public string Icon => role switch { - ChatRole.SYSTEM => Icons.Material.Filled.Settings, - ChatRole.USER => Icons.Material.Filled.Person, - ChatRole.AI => Icons.Material.Filled.AutoAwesome, + ChatRole.SYSTEM => AppIcons.SYSTEM_ROLE, + ChatRole.USER => AppIcons.USER, + ChatRole.AI => AppIcons.AI, - _ => Icons.Material.Filled.Help, + _ => AppIcons.UNKNOWN, }; /// diff --git a/app/MindWork AI Studio/Chat/ContentBlockComponent.razor b/app/MindWork AI Studio/Chat/ContentBlockComponent.razor index a182e195b..9f4c91bd3 100644 --- a/app/MindWork AI Studio/Chat/ContentBlockComponent.razor +++ b/app/MindWork AI Studio/Chat/ContentBlockComponent.razor @@ -25,8 +25,8 @@ Style="min-width:auto; border-width:1px; text-transform:none;" OnClick="@this.ToggleToolTrace"> - - + + @@ -39,7 +39,7 @@ { - @@ -48,45 +48,45 @@ { - + } @if (this.IsSecondToLastBlock && this.Role is ChatRole.USER && this.EditLastUserBlockFunc is not null) { - + } @if (this.IsLastContentBlock && this.Role is ChatRole.USER && this.EditLastBlockFunc is not null) { - + } @if (this.IsLastContentBlock && this.Role is ChatRole.AI && this.RegenerateFunc is not null) { - + } @if (!this.IsLastContentBlock && this.Role is ChatRole.AI && this.RollbackFunc is not null) { - + } @if (this.RemoveBlockFunc is not null) { - + } @if (this.CanExportAnswer) { - + @foreach (var documentFormat in FileExportFormat.DocumentFormats) { @@ -123,7 +123,7 @@ @if (this.CanSendTo) { - + @foreach (var destination in this.SendToDestinations) { @@ -178,7 +178,7 @@ @this.GetTraceStatusText(invocation) - + @@ -243,7 +243,7 @@ var renderPlan = this.GetMarkdownRenderPlan(textContent.Text); RenderFragment saveButton = file => @ - + ; } @foreach (var segment in renderPlan.Segments) diff --git a/app/MindWork AI Studio/Chat/ContentBlockComponent.razor.cs b/app/MindWork AI Studio/Chat/ContentBlockComponent.razor.cs index b430cd022..978bbb79e 100644 --- a/app/MindWork AI Studio/Chat/ContentBlockComponent.razor.cs +++ b/app/MindWork AI Studio/Chat/ContentBlockComponent.razor.cs @@ -689,7 +689,7 @@ public partial class ContentBlockComponent : MSGComponentBase private async Task ReportUnknownExportFormat(ArgumentOutOfRangeException exception, FileExportFormat format) { - await this.MessageBus.SendError(new(Icons.Material.Filled.Error, string.Format(this.T("Failed to export this message, because the file format '{0}' is unknown."), format))); + await this.MessageBus.SendError(new(AppIcons.ERROR, string.Format(this.T("Failed to export this message, because the file format '{0}' is unknown."), format))); this.Logger.LogError(exception, "Failed to export the content, because no exporter writes the format {ExportFormat}.", format); } diff --git a/app/MindWork AI Studio/Chat/ContentText.cs b/app/MindWork AI Studio/Chat/ContentText.cs index fe3181023..e224f0e3e 100644 --- a/app/MindWork AI Studio/Chat/ContentText.cs +++ b/app/MindWork AI Studio/Chat/ContentText.cs @@ -139,7 +139,7 @@ public sealed class ContentText : IContent } if (Interlocked.Exchange(ref UNSTORED_CONTENT_REPORTED, 1) is 0) - await MessageBus.INSTANCE.SendWarning(new(Icons.Material.Filled.Storage, TB("AI Studio could not store what the AI received separately from your chat. It remains in the chat itself, so you can still read it."))); + await MessageBus.INSTANCE.SendWarning(new(AppIcons.PROVENANCE_STORE, TB("AI Studio could not store what the AI received separately from your chat. It remains in the chat itself, so you can still read it."))); } /// @@ -347,7 +347,7 @@ public sealed class ContentText : IContent // The answer is about to be created without the data the user expected it to use. // Without this message, that answer is indistinguishable from one that did use it: // - await MessageBus.INSTANCE.SendWarning(new(Icons.Material.Filled.Source, TB("Your data sources could not be used. This answer was created without them."))); + await MessageBus.INSTANCE.SendWarning(new(AppIcons.DATA_SOURCE, TB("Your data sources could not be used. This answer was created without them."))); } } @@ -491,7 +491,7 @@ public sealed class ContentText : IContent { var userMessage = modelLoadResult.FailureReason.ToUserMessage(provider.InstanceName); if (!string.IsNullOrWhiteSpace(userMessage)) - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.CloudOff, userMessage)); + await MessageBus.INSTANCE.SendError(new(AppIcons.PROVIDER_ERROR, userMessage)); LOGGER.LogWarning("Skipping selected model availability check for '{ProviderInstanceName}' (provider={ProviderType}) because loading the model list failed with reason {FailureReason}.", provider.InstanceName, provider.Provider, modelLoadResult.FailureReason); return false; @@ -516,7 +516,7 @@ public sealed class ContentText : IContent TB("We could load models from '{0}', but the provider did not return any usable text models."), provider.InstanceName); - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.CloudOff, emptyModelsMessage)); + await MessageBus.INSTANCE.SendError(new(AppIcons.PROVIDER_ERROR, emptyModelsMessage)); LOGGER.LogWarning("Skipping AI request because there are no models available from '{ProviderInstanceName}' (provider={ProviderType}).", provider.InstanceName, provider.Provider); return false; } @@ -530,7 +530,7 @@ public sealed class ContentText : IContent provider.InstanceName, provider.Provider); - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.CloudOff, message)); + await MessageBus.INSTANCE.SendError(new(AppIcons.PROVIDER_ERROR, message)); LOGGER.LogWarning("Skipping AI request because model '{ModelId}' is not available from '{ProviderInstanceName}' (provider={ProviderType}).", chatModel.Id, provider.InstanceName, provider.Provider); return false; } @@ -684,14 +684,14 @@ public sealed class ContentText : IContent if (extraction.Outcome is FileExtractionOutcome.PARTIAL) { LOGGER.LogWarning("Parts of the file attachment '{FilePath}' could not be read: pages={FailedPages}.", document.FilePath, string.Join(", ", extraction.FailedPages)); - await MessageBus.INSTANCE.SendWarning(new(Icons.Material.Filled.Description, extraction.ToPartialUserMessage(document.FileName))); + await MessageBus.INSTANCE.SendWarning(new(AppIcons.DOCUMENT, extraction.ToPartialUserMessage(document.FileName))); } // The file was read correctly, but its extension lies about what it contains: if (extraction.HasExtensionMismatch) { LOGGER.LogWarning("The file attachment '{FilePath}' is actually a '{DetectedFormat}'.", document.FilePath, extraction.DetectedFormat); - await MessageBus.INSTANCE.SendWarning(new(Icons.Material.Filled.RuleFolder, extraction.ToExtensionMismatchUserMessage(document.FileName))); + await MessageBus.INSTANCE.SendWarning(new(AppIcons.FILE_TYPE_MISMATCH, extraction.ToExtensionMismatchUserMessage(document.FileName))); } } @@ -797,7 +797,7 @@ public sealed class ContentText : IContent foreach (var missingDocument in missingDocuments) { LOGGER.LogWarning("File attachment no longer exists and will be skipped: '{MissingDocument}'.", missingDocument.FilePath); - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.FindInPage, string.Format(TB("The file '{0}' is currently not available and was not sent."), missingDocument.FileName))); + await MessageBus.INSTANCE.SendError(new(AppIcons.FILE_NOT_FOUND, string.Format(TB("The file '{0}' is currently not available and was not sent."), missingDocument.FileName))); } // Only proceed if there are existing, allowed documents: @@ -840,7 +840,7 @@ public sealed class ContentText : IContent if (!pandocIsUsable && FileTypes.RequiresPandoc(document.FilePath)) { LOGGER.LogWarning("The file attachment '{FilePath}' needs Pandoc and will be skipped.", document.FilePath); - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.Description, FileExtractionErrorCode.PANDOC_UNAVAILABLE.ToUserMessage(document.FileName))); + await MessageBus.INSTANCE.SendError(new(AppIcons.DOCUMENT, FileExtractionErrorCode.PANDOC_UNAVAILABLE.ToUserMessage(document.FileName))); continue; } @@ -848,7 +848,7 @@ public sealed class ContentText : IContent if (!extraction.HasUsableContent) { LOGGER.LogError("Reading the file attachment '{FilePath}' failed and it will not be sent: code={ErrorCode}, message='{ErrorMessage}'.", document.FilePath, extraction.ErrorCode, extraction.ErrorMessage); - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.Description, extraction.ToUserMessage(document.FileName))); + await MessageBus.INSTANCE.SendError(new(AppIcons.DOCUMENT, extraction.ToUserMessage(document.FileName))); continue; } diff --git a/app/MindWork AI Studio/Chat/IImageSourceExtensions.cs b/app/MindWork AI Studio/Chat/IImageSourceExtensions.cs index 6d656f0f4..9c1a560a4 100644 --- a/app/MindWork AI Studio/Chat/IImageSourceExtensions.cs +++ b/app/MindWork AI Studio/Chat/IImageSourceExtensions.cs @@ -70,7 +70,7 @@ public static class IImageSourceExtensions var lengthBytes = response.Content.Headers.ContentLength; if(lengthBytes > MAX_IMAGE_SIZE_BYTES) { - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.ImageNotSupported, TB("The image at the URL is too large (>10 MB). Skipping the image."))); + await MessageBus.INSTANCE.SendError(new(AppIcons.IMAGE_NOT_SUPPORTED, TB("The image at the URL is too large (>10 MB). Skipping the image."))); return (success: false, string.Empty); } @@ -78,7 +78,7 @@ public static class IImageSourceExtensions return (success: true, Convert.ToBase64String(bytes)); } - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.ImageNotSupported, TB("Failed to download the image from the URL. Skipping the image."))); + await MessageBus.INSTANCE.SendError(new(AppIcons.IMAGE_NOT_SUPPORTED, TB("Failed to download the image from the URL. Skipping the image."))); return (success: false, string.Empty); } @@ -89,7 +89,7 @@ public static class IImageSourceExtensions var length = new FileInfo(image.Source).Length; if(length > MAX_IMAGE_SIZE_BYTES) { - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.ImageNotSupported, TB("The local image file is too large (>10 MB). Skipping the image."))); + await MessageBus.INSTANCE.SendError(new(AppIcons.IMAGE_NOT_SUPPORTED, TB("The local image file is too large (>10 MB). Skipping the image."))); return (success: false, string.Empty); } @@ -97,7 +97,7 @@ public static class IImageSourceExtensions return (success: true, Convert.ToBase64String(bytes)); } - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.ImageNotSupported, TB("The local image file does not exist. Skipping the image."))); + await MessageBus.INSTANCE.SendError(new(AppIcons.IMAGE_NOT_SUPPORTED, TB("The local image file does not exist. Skipping the image."))); return (success: false, string.Empty); default: diff --git a/app/MindWork AI Studio/Chat/ListContentBlockExtensions.cs b/app/MindWork AI Studio/Chat/ListContentBlockExtensions.cs index 55e184208..7211faa1f 100644 --- a/app/MindWork AI Studio/Chat/ListContentBlockExtensions.cs +++ b/app/MindWork AI Studio/Chat/ListContentBlockExtensions.cs @@ -118,7 +118,7 @@ public static class ListContentBlockExtensions if (prepared.IsPrepared) return imageSubContentFactory(prepared); - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.ImageNotSupported, prepared.ErrorCode.ToUserMessage(image.FileName))); + await MessageBus.INSTANCE.SendError(new(AppIcons.IMAGE_NOT_SUPPORTED, prepared.ErrorCode.ToUserMessage(image.FileName))); return null; } } diff --git a/app/MindWork AI Studio/Components/AdminExportButton.razor b/app/MindWork AI Studio/Components/AdminExportButton.razor index 6087b5e0a..9686168b9 100644 --- a/app/MindWork AI Studio/Components/AdminExportButton.razor +++ b/app/MindWork AI Studio/Components/AdminExportButton.razor @@ -3,6 +3,6 @@ @if (this.SettingsManager.ConfigurationData.App.ShowAdminSettings) { - + } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/AssistantBlock.razor b/app/MindWork AI Studio/Components/AssistantBlock.razor index f669ea248..a7cdb22fc 100644 --- a/app/MindWork AI Studio/Components/AssistantBlock.razor +++ b/app/MindWork AI Studio/Components/AssistantBlock.razor @@ -48,7 +48,7 @@ } @if (this.HasSettingsPanel) { - + } @if (this.SecurityBadge is not null || this.AdditionalActions is not null) diff --git a/app/MindWork AI Studio/Components/AssistantBlock.razor.cs b/app/MindWork AI Studio/Components/AssistantBlock.razor.cs index 2fbf5d7ca..cadf93c9c 100644 --- a/app/MindWork AI Studio/Components/AssistantBlock.razor.cs +++ b/app/MindWork AI Studio/Components/AssistantBlock.razor.cs @@ -26,7 +26,7 @@ public partial class AssistantBlock : MSGComponentBase, IAssistantCat public string Description { get; set; } = string.Empty; [Parameter] - public string Icon { get; set; } = Icons.Material.Filled.DisabledByDefault; + public string Icon { get; set; } = AppIcons.ASSISTANT_FALLBACK; [Parameter] public string ButtonText { get; set; } = "Start"; @@ -139,21 +139,21 @@ public partial class AssistantBlock : MSGComponentBase, IAssistantCat /// private AssistantSessionIndicatorData? AssistantSessionIndicator => this.MediaImportSnapshot?.Status switch { - MediaImportStatus.QUEUED or MediaImportStatus.RUNNING or MediaImportStatus.CANCELING => new(Icons.Material.Filled.ChangeCircle, Color.Info, this.T("Media is still being prepared.")), - MediaImportStatus.SUCCEEDED => new(Icons.Material.Filled.TaskAlt, Color.Success, this.T("The media transcript is ready.")), - MediaImportStatus.WARNING => new(Icons.Material.Filled.WarningAmber, Color.Warning, this.T("Media transcription completed with a warning. Open the assistant to review it.")), - MediaImportStatus.FAILED => new(Icons.Material.Filled.Error, Color.Error, this.T("Media transcription failed. Open the assistant to review it.")), - MediaImportStatus.CANCELLED => new(Icons.Material.Filled.Cancel, Color.Warning, this.T("Media transcription was canceled. Open the assistant to review it.")), + MediaImportStatus.QUEUED or MediaImportStatus.RUNNING or MediaImportStatus.CANCELING => new(AppIcons.RUNNING, Color.Info, this.T("Media is still being prepared.")), + MediaImportStatus.SUCCEEDED => new(AppIcons.SUCCESS, Color.Success, this.T("The media transcript is ready.")), + MediaImportStatus.WARNING => new(AppIcons.WARNING, Color.Warning, this.T("Media transcription completed with a warning. Open the assistant to review it.")), + MediaImportStatus.FAILED => new(AppIcons.ERROR, Color.Error, this.T("Media transcription failed. Open the assistant to review it.")), + MediaImportStatus.CANCELLED => new(AppIcons.CANCELED, Color.Warning, this.T("Media transcription was canceled. Open the assistant to review it.")), _ => this.AssistantSessionIndicatorWithoutMedia, }; private AssistantSessionIndicatorData? AssistantSessionIndicatorWithoutMedia => this.AssistantSessionSnapshot?.Status switch { - AssistantSessionStatus.RUNNING or AssistantSessionStatus.CANCELING => new(Icons.Material.Filled.ChangeCircle, Color.Info, this.T("Assistant is still running.")), - AssistantSessionStatus.COMPLETED => new(Icons.Material.Filled.TaskAlt, Color.Success, this.T("The result is ready.")), - AssistantSessionStatus.FAILED => new(Icons.Material.Filled.Error, Color.Error, this.T("Assistant failed. Open it to review the result.")), - AssistantSessionStatus.CANCELED => new(Icons.Material.Filled.Cancel, Color.Warning, this.T("Assistant was canceled. Open it to review the result.")), + AssistantSessionStatus.RUNNING or AssistantSessionStatus.CANCELING => new(AppIcons.RUNNING, Color.Info, this.T("Assistant is still running.")), + AssistantSessionStatus.COMPLETED => new(AppIcons.SUCCESS, Color.Success, this.T("The result is ready.")), + AssistantSessionStatus.FAILED => new(AppIcons.ERROR, Color.Error, this.T("Assistant failed. Open it to review the result.")), + AssistantSessionStatus.CANCELED => new(AppIcons.CANCELED, Color.Warning, this.T("Assistant was canceled. Open it to review the result.")), _ => null, }; diff --git a/app/MindWork AI Studio/Components/AssistantPluginSecurityCard.razor b/app/MindWork AI Studio/Components/AssistantPluginSecurityCard.razor index 59a9d71b9..cfcf8cd45 100644 --- a/app/MindWork AI Studio/Components/AssistantPluginSecurityCard.razor +++ b/app/MindWork AI Studio/Components/AssistantPluginSecurityCard.razor @@ -50,7 +50,7 @@ @if (this.PluginToolIds.Count > 0) { - + @this.GetToolCountLabel() } @@ -61,7 +61,7 @@ - + @@ -71,7 +71,7 @@ @if (state.IsEnterpriseApproved) { - + @T("Enterprise approval is active") @@ -79,7 +79,7 @@ { - + @T("Your organization requires this assistant to stay enabled") } @@ -87,7 +87,7 @@ else { - + @T("Confidence"): - + @this.GetFindingSummary() - + @this.GetAuditTimestampLabel() @@ -125,7 +125,7 @@
@T("Technical Details") -
diff --git a/app/MindWork AI Studio/Components/AttachDocuments.razor b/app/MindWork AI Studio/Components/AttachDocuments.razor index 0261368b6..bd3c075a1 100644 --- a/app/MindWork AI Studio/Components/AttachDocuments.razor +++ b/app/MindWork AI Studio/Components/AttachDocuments.razor @@ -21,7 +21,7 @@ @@ -51,7 +51,7 @@ { @@ -74,7 +74,7 @@ else + } else { - + } } @if (!this.IsUnavailable) { - + @T("Clear file list") } diff --git a/app/MindWork AI Studio/Components/AttachDocuments.razor.cs b/app/MindWork AI Studio/Components/AttachDocuments.razor.cs index ea3ea2f84..75f05f2cc 100644 --- a/app/MindWork AI Studio/Components/AttachDocuments.razor.cs +++ b/app/MindWork AI Studio/Components/AttachDocuments.razor.cs @@ -172,22 +172,22 @@ public partial class AttachDocuments : MSGComponentBase if (outcome.Failures.Count > 0) { var message = string.Join(Environment.NewLine, outcome.Failures.Select(failure => $"{failure.FileName}: {failure.UserMessage}")); - await this.MessageBus.SendError(new(Icons.Material.Filled.VoiceChat, message)); + await this.MessageBus.SendError(new(AppIcons.VOICE_TRANSCRIPTION, message)); } else if (outcome.Status is MediaImportStatus.FAILED) { - await this.MessageBus.SendError(new(Icons.Material.Filled.VoiceChat, this.T("The media file could not be transcribed."))); + await this.MessageBus.SendError(new(AppIcons.VOICE_TRANSCRIPTION, this.T("The media file could not be transcribed."))); } if (outcome.Warnings.Count > 0) { var message = string.Join(Environment.NewLine, outcome.Warnings.Select(warning => $"{warning.FileName}: {warning.UserMessage}")); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.VoiceChat, message)); + await this.MessageBus.SendWarning(new(AppIcons.VOICE_TRANSCRIPTION, message)); } if (outcome.Status is MediaImportStatus.CANCELLED) { - await this.MessageBus.SendWarning(new(Icons.Material.Filled.VoiceChat, this.T("The media transcription was canceled."))); + await this.MessageBus.SendWarning(new(AppIcons.VOICE_TRANSCRIPTION, this.T("The media transcription was canceled."))); } } @@ -358,7 +358,7 @@ public partial class AttachDocuments : MSGComponentBase var rejectedPaths = pathList.Where(path => !FileTypes.IsAllowedPath(path, this.AllowedFileTypes)).ToArray(); pathList.RemoveAll(path => rejectedPaths.Contains(path, StringComparer.Ordinal)); if (rejectedPaths.Length > 0) - await this.MessageBus.SendWarning(new(Icons.Material.Filled.Warning, this.T("Some files do not use an allowed format and were not attached."))); + await this.MessageBus.SendWarning(new(AppIcons.WARNING, this.T("Some files do not use an allowed format and were not attached."))); } var inaccessiblePaths = pathList.Where(path => !File.Exists(path)).ToList(); @@ -366,7 +366,7 @@ public partial class AttachDocuments : MSGComponentBase { this.Logger.LogWarning("Could not access {Count} dropped or selected file(s): {Paths}", inaccessiblePaths.Count, string.Join(", ", inaccessiblePaths)); await this.MessageBus.SendWarning(new( - Icons.Material.Filled.Warning, + AppIcons.WARNING, this.T("Some files could not be accessed. Please select them with the file chooser instead."))); } @@ -421,7 +421,7 @@ public partial class AttachDocuments : MSGComponentBase if (string.IsNullOrWhiteSpace(this.SettingsManager.ConfigurationData.App.UseTranscriptionProvider)) { await this.MessageBus.SendWarning(new( - Icons.Material.Filled.VoiceChat, + AppIcons.VOICE_TRANSCRIPTION, this.T("Media files require a configured transcription provider. Configure one in the transcription settings."))); return attached; } diff --git a/app/MindWork AI Studio/Components/Changelog.razor b/app/MindWork AI Studio/Components/Changelog.razor index 7ee430217..ecf14c751 100644 --- a/app/MindWork AI Studio/Components/Changelog.razor +++ b/app/MindWork AI Studio/Components/Changelog.razor @@ -1,5 +1,5 @@ @inherits MSGComponentBase - + @foreach (var log in LOGS) { diff --git a/app/MindWork AI Studio/Components/ChatComponent.razor b/app/MindWork AI Studio/Components/ChatComponent.razor index 6600355a4..a6a8f5bd4 100644 --- a/app/MindWork AI Studio/Components/ChatComponent.razor +++ b/app/MindWork AI Studio/Components/ChatComponent.razor @@ -52,7 +52,7 @@ Label="@this.InputLabel" Placeholder="@this.ProviderPlaceholder" Adornment="Adornment.End" - AdornmentIcon="@(this.MediaTranscriptionService.IsBusy(this.CurrentMediaImportOwner) ? Icons.Material.Filled.HourglassTop : Icons.Material.Filled.Send)" + AdornmentIcon="@(this.MediaTranscriptionService.IsBusy(this.CurrentMediaImportOwner) ? AppIcons.PENDING : AppIcons.SEND)" OnAdornmentClick="() => this.SendMessage()" Disabled="@this.IsInputForbidden()" Immediate="@true" @@ -69,25 +69,25 @@ && this.SettingsManager.ConfigurationData.Workspace.DisplayBehavior is WorkspaceDisplayBehavior.TOGGLE_OVERLAY) { - + } @if (this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is WorkspaceStorageBehavior.STORE_CHATS_MANUALLY) { - + } - + @if (!string.IsNullOrWhiteSpace(this.currentWorkspaceName)) { - + } @@ -97,49 +97,49 @@ @if (this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is WorkspaceStorageBehavior.STORE_CHATS_AUTOMATICALLY) { - + } @if (this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is not WorkspaceStorageBehavior.DISABLE_WORKSPACES) { - + - + } - + - + - + - + - + - + - + @@ -162,14 +162,14 @@ @if (this.IsCurrentChatStreaming) { - + } @if (!this.ChatThread.IsLLMProviderAllowed(this.Provider)) { - + } diff --git a/app/MindWork AI Studio/Components/ChatComponent.razor.cs b/app/MindWork AI Studio/Components/ChatComponent.razor.cs index 0c4098c24..779f1a7fd 100644 --- a/app/MindWork AI Studio/Components/ChatComponent.razor.cs +++ b/app/MindWork AI Studio/Components/ChatComponent.razor.cs @@ -533,22 +533,22 @@ public partial class ChatComponent : MSGComponentBase if (outcome.Failures.Count > 0) { var message = string.Join(Environment.NewLine, outcome.Failures.Select(failure => $"{failure.FileName}: {failure.UserMessage}")); - await this.MessageBus.SendError(new(Icons.Material.Filled.VoiceChat, message)); + await this.MessageBus.SendError(new(AppIcons.VOICE_TRANSCRIPTION, message)); } else if (outcome.Status is MediaImportStatus.FAILED) { - await this.MessageBus.SendError(new(Icons.Material.Filled.VoiceChat, this.T("The media file could not be transcribed."))); + await this.MessageBus.SendError(new(AppIcons.VOICE_TRANSCRIPTION, this.T("The media file could not be transcribed."))); } if (outcome.Warnings.Count > 0) { var message = string.Join(Environment.NewLine, outcome.Warnings.Select(warning => $"{warning.FileName}: {warning.UserMessage}")); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.VoiceChat, message)); + await this.MessageBus.SendWarning(new(AppIcons.VOICE_TRANSCRIPTION, message)); } if (outcome.Status is MediaImportStatus.CANCELLED) { - await this.MessageBus.SendWarning(new(Icons.Material.Filled.VoiceChat, this.T("The media transcription was canceled."))); + await this.MessageBus.SendWarning(new(AppIcons.VOICE_TRANSCRIPTION, this.T("The media transcription was canceled."))); } } diff --git a/app/MindWork AI Studio/Components/ChatTemplateSelection.razor b/app/MindWork AI Studio/Components/ChatTemplateSelection.razor index f07d0ee0b..122f23d30 100644 --- a/app/MindWork AI Studio/Components/ChatTemplateSelection.razor +++ b/app/MindWork AI Studio/Components/ChatTemplateSelection.razor @@ -12,13 +12,13 @@ } else { - + } - + - + @foreach (var chatTemplate in this.SettingsManager.ConfigurationData.ChatTemplates.GetAllChatTemplates()) { diff --git a/app/MindWork AI Studio/Components/ChatTemplateSelection.razor.cs b/app/MindWork AI Studio/Components/ChatTemplateSelection.razor.cs index 4e18c010b..2af09fced 100644 --- a/app/MindWork AI Studio/Components/ChatTemplateSelection.razor.cs +++ b/app/MindWork AI Studio/Components/ChatTemplateSelection.razor.cs @@ -45,9 +45,9 @@ public partial class ChatTemplateSelection : MSGComponentBase private string ChatTemplateIcon(ChatTemplate chatTemplate) { if (chatTemplate.IsEnterpriseConfiguration) - return Icons.Material.Filled.Business; + return AppIcons.ORGANIZATION; - return Icons.Material.Filled.RateReview; + return AppIcons.CHAT_TEMPLATE; } private async Task SelectionChanged(ChatTemplate chatTemplate) diff --git a/app/MindWork AI Studio/Components/CodeBlockCopyButton.cs b/app/MindWork AI Studio/Components/CodeBlockCopyButton.cs index b51d7b143..0b1ad38c4 100644 --- a/app/MindWork AI Studio/Components/CodeBlockCopyButton.cs +++ b/app/MindWork AI Studio/Components/CodeBlockCopyButton.cs @@ -48,7 +48,7 @@ public sealed class CodeBlockCopyButton : ComponentBase builder.OpenComponent(0); builder.AddComponentParameter(1, nameof(MudIconButton.OnClick), EventCallback.Factory.Create(this, this.CopyAsync)); builder.AddComponentParameter(2, nameof(MudIconButton.Class), CSS_CLASS); - builder.AddComponentParameter(3, nameof(MudIconButton.Icon), Icons.Material.Rounded.ContentCopy); + builder.AddComponentParameter(3, nameof(MudIconButton.Icon), AppIcons.COPY); builder.AddComponentParameter(4, nameof(MudIconButton.Color), Color.Primary); builder.AddComponentParameter(5, nameof(MudIconButton.Variant), Variant.Filled); builder.AddComponentParameter(6, nameof(MudIconButton.Size), Size.Medium); @@ -68,7 +68,7 @@ public sealed class CodeBlockCopyButton : ComponentBase builder.AddComponentParameter(19, nameof(MudTooltip.ChildContent), (RenderFragment)(content => { content.OpenComponent(0); - content.AddComponentParameter(1, nameof(MudIconButton.Icon), Icons.Material.Rounded.DoneAll); + content.AddComponentParameter(1, nameof(MudIconButton.Icon), AppIcons.COPIED); content.AddComponentParameter(2, nameof(MudIconButton.Color), Color.Success); content.AddComponentParameter(3, nameof(MudIconButton.Variant), Variant.Filled); content.AddComponentParameter(4, nameof(MudIconButton.Size), Size.Medium); diff --git a/app/MindWork AI Studio/Components/CompactExpansionPanel.razor.cs b/app/MindWork AI Studio/Components/CompactExpansionPanel.razor.cs index 3f4c970a4..fc548e3d9 100644 --- a/app/MindWork AI Studio/Components/CompactExpansionPanel.razor.cs +++ b/app/MindWork AI Studio/Components/CompactExpansionPanel.razor.cs @@ -17,7 +17,7 @@ public partial class CompactExpansionPanel : ComponentBase public string HeaderText { get; set; } = string.Empty; [Parameter] - public string HeaderIcon { get; set; } = Icons.Material.Filled.Tune; + public string HeaderIcon { get; set; } = AppIcons.ADVANCED_SETTINGS; [Parameter] public Color IconColor { get; set; } = Color.Inherit; diff --git a/app/MindWork AI Studio/Components/ConfidenceInfo.razor b/app/MindWork AI Studio/Components/ConfidenceInfo.razor index 381dafe28..c9e523e20 100644 --- a/app/MindWork AI Studio/Components/ConfidenceInfo.razor +++ b/app/MindWork AI Studio/Components/ConfidenceInfo.razor @@ -3,7 +3,7 @@
- + @@ -29,7 +29,7 @@ @foreach (var sourceTuple in this.GetConfidenceSources()) { - + } } diff --git a/app/MindWork AI Studio/Components/ConfigInfoRow.razor.cs b/app/MindWork AI Studio/Components/ConfigInfoRow.razor.cs index 0a2de099c..20a302f65 100644 --- a/app/MindWork AI Studio/Components/ConfigInfoRow.razor.cs +++ b/app/MindWork AI Studio/Components/ConfigInfoRow.razor.cs @@ -5,5 +5,5 @@ namespace AIStudio.Components; public partial class ConfigInfoRow : ComponentBase { [Parameter] - public ConfigInfoRowItem Item { get; set; } = new(Icons.Material.Filled.ArrowRightAlt, string.Empty, string.Empty, string.Empty, string.Empty); + public ConfigInfoRowItem Item { get; set; } = new(AppIcons.INFO_ROW, string.Empty, string.Empty, string.Empty, string.Empty); } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ConfigPluginInfoCard.razor b/app/MindWork AI Studio/Components/ConfigPluginInfoCard.razor index 4a3c8106b..0edb595cd 100644 --- a/app/MindWork AI Studio/Components/ConfigPluginInfoCard.razor +++ b/app/MindWork AI Studio/Components/ConfigPluginInfoCard.razor @@ -14,7 +14,7 @@ @if (this.ShowWarning) {
- + @this.WarningText
} diff --git a/app/MindWork AI Studio/Components/ConfigPluginInfoCard.razor.cs b/app/MindWork AI Studio/Components/ConfigPluginInfoCard.razor.cs index 2fc224be1..b1af9b67c 100644 --- a/app/MindWork AI Studio/Components/ConfigPluginInfoCard.razor.cs +++ b/app/MindWork AI Studio/Components/ConfigPluginInfoCard.razor.cs @@ -5,7 +5,7 @@ namespace AIStudio.Components; public partial class ConfigPluginInfoCard : ComponentBase { [Parameter] - public string HeaderIcon { get; set; } = Icons.Material.Filled.Extension; + public string HeaderIcon { get; set; } = AppIcons.PLUGIN; [Parameter] public string HeaderText { get; set; } = string.Empty; diff --git a/app/MindWork AI Studio/Components/ConfigurationBase.razor b/app/MindWork AI Studio/Components/ConfigurationBase.razor index 875a08c7c..d83206af3 100644 --- a/app/MindWork AI Studio/Components/ConfigurationBase.razor +++ b/app/MindWork AI Studio/Components/ConfigurationBase.razor @@ -8,7 +8,7 @@ @* MudTooltip.RootStyle is set as a workaround for issue -> https://github.com/MudBlazor/MudBlazor/issues/10882 *@ - + @this.Body diff --git a/app/MindWork AI Studio/Components/ConfigurationDirectory.razor b/app/MindWork AI Studio/Components/ConfigurationDirectory.razor index 976ab4d0b..29e2d9820 100644 --- a/app/MindWork AI Studio/Components/ConfigurationDirectory.razor +++ b/app/MindWork AI Studio/Components/ConfigurationDirectory.razor @@ -17,7 +17,7 @@ Class="flex-grow-1" /> - [Parameter] - public string Icon { get; set; } = Icons.Material.Filled.Folder; + public string Icon { get; set; } = AppIcons.FOLDER; /// /// The color of the icon to use. @@ -118,7 +118,7 @@ public partial class ConfigurationDirectory : ConfigurationBaseCore if (path is null) { this.Logger.LogWarning("None of the {Count} dropped path(s) could be used as a directory.", paths.Count); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.Warning, DroppedFolder.WarningFor(paths))); + await this.MessageBus.SendWarning(new(AppIcons.WARNING, DroppedFolder.WarningFor(paths))); return; } diff --git a/app/MindWork AI Studio/Components/ConfigurationFile.razor b/app/MindWork AI Studio/Components/ConfigurationFile.razor index 6b1578f02..d8ccc5075 100644 --- a/app/MindWork AI Studio/Components/ConfigurationFile.razor +++ b/app/MindWork AI Studio/Components/ConfigurationFile.razor @@ -19,7 +19,7 @@ Class="flex-grow-1" /> - [Parameter] - public string Icon { get; set; } = Icons.Material.Filled.AttachFile; + public string Icon { get; set; } = AppIcons.FILE; /// /// The color of the icon to use. @@ -135,7 +135,7 @@ public partial class ConfigurationFile : ConfigurationBaseCore if (path is null) { this.Logger.LogWarning("None of the {Count} dropped path(s) could be used as a file.", paths.Count); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.Warning, DroppedFile.WarningFor(paths))); + await this.MessageBus.SendWarning(new(AppIcons.WARNING, DroppedFile.WarningFor(paths))); return; } diff --git a/app/MindWork AI Studio/Components/ConfigurationMultiSelect.razor b/app/MindWork AI Studio/Components/ConfigurationMultiSelect.razor index 5ad7eb256..3cfaf02c8 100644 --- a/app/MindWork AI Studio/Components/ConfigurationMultiSelect.razor +++ b/app/MindWork AI Studio/Components/ConfigurationMultiSelect.razor @@ -21,7 +21,7 @@ @* MudTooltip.RootStyle is set as a workaround for issue -> https://github.com/MudBlazor/MudBlazor/issues/10882 *@ - + @data.Name diff --git a/app/MindWork AI Studio/Components/ConfigurationShortcut.razor b/app/MindWork AI Studio/Components/ConfigurationShortcut.razor index 67929235a..3371077b4 100644 --- a/app/MindWork AI Studio/Components/ConfigurationShortcut.razor +++ b/app/MindWork AI Studio/Components/ConfigurationShortcut.razor @@ -17,7 +17,7 @@ diff --git a/app/MindWork AI Studio/Components/ConfigurationShortcut.razor.cs b/app/MindWork AI Studio/Components/ConfigurationShortcut.razor.cs index 3cb641a2f..7f2eda242 100644 --- a/app/MindWork AI Studio/Components/ConfigurationShortcut.razor.cs +++ b/app/MindWork AI Studio/Components/ConfigurationShortcut.razor.cs @@ -27,7 +27,7 @@ public partial class ConfigurationShortcut : ConfigurationBaseCore /// The icon to display. /// [Parameter] - public string Icon { get; set; } = Icons.Material.Filled.Keyboard; + public string Icon { get; set; } = AppIcons.KEYBOARD_SHORTCUT; /// /// The color of the icon. diff --git a/app/MindWork AI Studio/Components/ConfigurationText.razor b/app/MindWork AI Studio/Components/ConfigurationText.razor index 374ad2577..5db838729 100644 --- a/app/MindWork AI Studio/Components/ConfigurationText.razor +++ b/app/MindWork AI Studio/Components/ConfigurationText.razor @@ -30,7 +30,7 @@ else TextChanged="@this.InternalUpdate" Disabled="@this.IsDisabled" Adornment="@(this.ResetButtonIconOnly ? Adornment.End : this.IconAdornment)" - AdornmentIcon="@(this.ResetButtonIconOnly ? Icons.Material.Filled.Restore : this.Icon)" + AdornmentIcon="@(this.ResetButtonIconOnly ? AppIcons.RESTORE_DEFAULT : this.Icon)" OnAdornmentClick="@this.ResetAdornmentClick" AdornmentAriaLabel="@(this.ResetButtonIconOnly ? this.ResetButtonText : null)" AdornmentColor="@this.IconColor" diff --git a/app/MindWork AI Studio/Components/ConfigurationText.razor.cs b/app/MindWork AI Studio/Components/ConfigurationText.razor.cs index fccfa9485..951f48a1f 100644 --- a/app/MindWork AI Studio/Components/ConfigurationText.razor.cs +++ b/app/MindWork AI Studio/Components/ConfigurationText.razor.cs @@ -23,7 +23,7 @@ public partial class ConfigurationText : ConfigurationBaseCore /// The icon to display next to the textfield, when it has a single line. /// [Parameter] - public string Icon { get; set; } = Icons.Material.Filled.Info; + public string Icon { get; set; } = AppIcons.INFO; /// /// Removes the default bottom margin when the field is part of a compact group. diff --git a/app/MindWork AI Studio/Components/DataBackupPanel.razor b/app/MindWork AI Studio/Components/DataBackupPanel.razor index 937a65ee8..10442f35f 100644 --- a/app/MindWork AI Studio/Components/DataBackupPanel.razor +++ b/app/MindWork AI Studio/Components/DataBackupPanel.razor @@ -2,7 +2,7 @@ @inherits MSGComponentBase - + @T("Back up all your data into one file: your settings, chats, plugins, and the indexes of your data sources. Your API keys and passwords stay out of it. AI Studio keeps them in the secure storage of your OS.") @@ -15,7 +15,7 @@ @this.BackupProgressText - + @T("Cancel") @@ -25,7 +25,7 @@ } else { - + @if (this.DataBackupService.LastResult is { } backupResult) { @@ -63,7 +63,7 @@ } - + @T("Restore a backup: replace all your data with those of the backup, e.g., on a new computer, or add only its chats to the chats you have.") @@ -77,7 +77,7 @@ } - + @if (!string.IsNullOrWhiteSpace(this.selectedArchivePath)) { @@ -130,14 +130,14 @@ @this.RestoreProgressText - + @T("Cancel") } else { - + @T("Replace all data") } @@ -172,7 +172,7 @@ @string.Format(T("Chat {0} of {1}"), this.importProgress.ProcessedChats + 1, this.importProgress.TotalChats) - + @T("Cancel") @@ -182,7 +182,7 @@ } else { - + @this.AddChatsText(backupPreview.Manifest.TotalChatCount) } diff --git a/app/MindWork AI Studio/Components/DataFolders.razor b/app/MindWork AI Studio/Components/DataFolders.razor index bfdd04b96..3a61c1c46 100644 --- a/app/MindWork AI Studio/Components/DataFolders.razor +++ b/app/MindWork AI Studio/Components/DataFolders.razor @@ -21,13 +21,13 @@ @this.FolderName(location) - + @folder - diff --git a/app/MindWork AI Studio/Components/DataFolders.razor.cs b/app/MindWork AI Studio/Components/DataFolders.razor.cs index 42da2d75e..d4600e392 100644 --- a/app/MindWork AI Studio/Components/DataFolders.razor.cs +++ b/app/MindWork AI Studio/Components/DataFolders.razor.cs @@ -104,7 +104,7 @@ public partial class DataFolders : MSGComponentBase { if (string.IsNullOrWhiteSpace(path)) { - await this.MessageBus.SendWarning(new(Icons.Material.Filled.Folder, T("The folder is not known yet."))); + await this.MessageBus.SendWarning(new(AppIcons.FOLDER_OPEN, T("The folder is not known yet."))); return; } @@ -116,7 +116,7 @@ public partial class DataFolders : MSGComponentBase catch (Exception e) { this.Logger.LogWarning(e, "Could not open the folder '{Path}' in the file manager.", path); - await this.MessageBus.SendError(new(Icons.Material.Filled.Folder, T("Could not open the folder."))); + await this.MessageBus.SendError(new(AppIcons.FOLDER_OPEN, T("Could not open the folder."))); return; } @@ -124,6 +124,6 @@ public partial class DataFolders : MSGComponentBase return; var issue = string.IsNullOrWhiteSpace(response.Issue) ? T("Unknown error") : response.Issue; - await this.MessageBus.SendError(new(Icons.Material.Filled.Folder, string.Format(T("Could not open the folder: {0}"), issue))); + await this.MessageBus.SendError(new(AppIcons.FOLDER_OPEN, string.Format(T("Could not open the folder: {0}"), issue))); } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/DataSourceAddButtons.razor b/app/MindWork AI Studio/Components/DataSourceAddButtons.razor index 9ac120ee0..25e365e4f 100644 --- a/app/MindWork AI Studio/Components/DataSourceAddButtons.razor +++ b/app/MindWork AI Studio/Components/DataSourceAddButtons.razor @@ -3,7 +3,7 @@ @inherits MSGComponentBase - + @T("External Data (ERI-Server v1)") @@ -20,10 +20,10 @@ @if (PreviewFeatures.PRE_MAILBOXES_2026.IsEnabled(this.SettingsManager)) { @* Shown with a lock rather than left out, like the locked buttons for adding providers: *@ - + @this.MailboxMenuText } - + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/DataSourceManagement.razor b/app/MindWork AI Studio/Components/DataSourceManagement.razor index 2d7fea481..f74256719 100644 --- a/app/MindWork AI Studio/Components/DataSourceManagement.razor +++ b/app/MindWork AI Studio/Components/DataSourceManagement.razor @@ -18,7 +18,7 @@ - + @@ -65,7 +65,7 @@ { - + @(embeddingStatus is null ? T("Not available") : string.Format(T("{0} of {1}"), embeddingStatus.IndexedDocuments.CompactCount(), embeddingStatus.TotalDocuments.CompactCount())) @@ -82,7 +82,7 @@ @if (context is IDataSource dataSource) { - + } @* @@ -94,29 +94,29 @@ @if (this.CanRepairDataSource(context)) { - + } @if (context.IsEnterpriseConfiguration) { - + } else { - + - + @if (context is DataSourceERI_V1) { } - + } diff --git a/app/MindWork AI Studio/Components/DataSourceMissingEmbeddingWarning.razor b/app/MindWork AI Studio/Components/DataSourceMissingEmbeddingWarning.razor index a9ce11378..c4feb9b9a 100644 --- a/app/MindWork AI Studio/Components/DataSourceMissingEmbeddingWarning.razor +++ b/app/MindWork AI Studio/Components/DataSourceMissingEmbeddingWarning.razor @@ -13,12 +13,12 @@ @if (this.MayAdd) { - + @T("Add Embedding") @if (this.MayImport) { - + @T("Import Embedding") } diff --git a/app/MindWork AI Studio/Components/DataSourceSelection.razor b/app/MindWork AI Studio/Components/DataSourceSelection.razor index 9d851122b..8a23c59f3 100644 --- a/app/MindWork AI Studio/Components/DataSourceSelection.razor +++ b/app/MindWork AI Studio/Components/DataSourceSelection.razor @@ -5,7 +5,7 @@ {
- + @@ -19,7 +19,7 @@ - + @@ -38,10 +38,10 @@ - + @T("Manage Data Sources") - + @T("Read more about ERI") @@ -118,7 +118,7 @@ } - + @foreach (var source in this.GetListedDataSources()) { @@ -133,7 +133,7 @@ *@ @if (!this.IsSemanticSearchEffective && this.DataSourcesAISelected.Count > 0) { - + @foreach (var source in this.DataSourcesAISelected) { @@ -147,7 +147,7 @@ { - + } diff --git a/app/MindWork AI Studio/Components/DataSourceSelectionRow.razor b/app/MindWork AI Studio/Components/DataSourceSelectionRow.razor index 03f81ee57..b35456efc 100644 --- a/app/MindWork AI Studio/Components/DataSourceSelectionRow.razor +++ b/app/MindWork AI Studio/Components/DataSourceSelectionRow.razor @@ -16,7 +16,7 @@ } - + } diff --git a/app/MindWork AI Studio/Components/DataSourceSelectionRow.razor.cs b/app/MindWork AI Studio/Components/DataSourceSelectionRow.razor.cs index 8560c2897..0272d66e6 100644 --- a/app/MindWork AI Studio/Components/DataSourceSelectionRow.razor.cs +++ b/app/MindWork AI Studio/Components/DataSourceSelectionRow.razor.cs @@ -46,8 +46,8 @@ public partial class DataSourceSelectionRow : MSGComponentBase private string GetBlockedIcon() => this.BlockReason switch { - DataSourceBlockReason.NEEDS_REPAIR => Icons.Material.Filled.ReportProblem, - _ => Icons.Material.Filled.HourglassTop, + DataSourceBlockReason.NEEDS_REPAIR => AppIcons.WARNING, + _ => AppIcons.PENDING, }; private Color GetBlockedIconColor() => this.BlockReason switch diff --git a/app/MindWork AI Studio/Components/DirectChatLauncherForm.razor b/app/MindWork AI Studio/Components/DirectChatLauncherForm.razor index 5f9dd321b..5ec3782ff 100644 --- a/app/MindWork AI Studio/Components/DirectChatLauncherForm.razor +++ b/app/MindWork AI Studio/Components/DirectChatLauncherForm.razor @@ -1,7 +1,7 @@ @using AIStudio.Settings.DataModel @inherits MSGComponentBase - + @* The tile behaves differently with and without a workspace, so the form says which of the two is chosen right now instead of only explaining that both are possible. *@ @@ -16,7 +16,7 @@ @string.Format(T("The chosen chat template keeps its chats in the workspace '{0}', so the tile opens its chat there instead. A workspace entered here wins over the one of the template."), templateWorkspaceName) } - + @T("Use chat default") @foreach (var provider in this.SettingsManager.GetConfidentProviders(Components.CHAT)) { @@ -31,7 +31,7 @@ @T("The chosen chat template preselects a provider of its own, and it wins over a selection made here as long as that provider can be used for chats.") } - + @T("Use chat default") @T("Use no profile") @foreach (var profile in this.SettingsManager.ConfigurationData.Profiles) @@ -45,7 +45,7 @@ @T("The chosen chat template preselects a profile of its own, and it wins over a selection made here as long as that profile exists.") } - + @T("Use chat default") @T("Use no chat template") @foreach (var chatTemplate in this.SettingsManager.ConfigurationData.ChatTemplates) @@ -57,7 +57,7 @@ selection made before stays with the launcher and counts once RAG is switched on again: *@ @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager)) { - + @foreach (var dataSource in this.SettingsManager.ConfigurationData.DataSources) { @dataSource.Name diff --git a/app/MindWork AI Studio/Components/DirectChatLauncherSettingsAction.razor b/app/MindWork AI Studio/Components/DirectChatLauncherSettingsAction.razor index f7de15aad..776219edd 100644 --- a/app/MindWork AI Studio/Components/DirectChatLauncherSettingsAction.razor +++ b/app/MindWork AI Studio/Components/DirectChatLauncherSettingsAction.razor @@ -3,7 +3,7 @@ @if (this.CanEditSettings) { - ValidateSelection { get; set; } = _ => null; [Parameter] - public string OpenIcon { get; set; } = Icons.Material.Filled.ArrowDropDown; + public string OpenIcon { get; set; } = AppIcons.EXPAND_MORE; [Parameter] - public string CloseIcon { get; set; } = Icons.Material.Filled.ArrowDropUp; + public string CloseIcon { get; set; } = AppIcons.EXPAND_LESS; [Parameter] public Color IconColor { get; set; } = Color.Default; diff --git a/app/MindWork AI Studio/Components/ElapsedTime.razor b/app/MindWork AI Studio/Components/ElapsedTime.razor index 86240a3e5..818adaead 100644 --- a/app/MindWork AI Studio/Components/ElapsedTime.razor +++ b/app/MindWork AI Studio/Components/ElapsedTime.razor @@ -1,7 +1,7 @@ @inherits MSGComponentBase - + @Format(DateTimeOffset.Now - this.Start) diff --git a/app/MindWork AI Studio/Components/EncryptionSecretInfo.razor b/app/MindWork AI Studio/Components/EncryptionSecretInfo.razor index e05f9539e..466eb753d 100644 --- a/app/MindWork AI Studio/Components/EncryptionSecretInfo.razor +++ b/app/MindWork AI Studio/Components/EncryptionSecretInfo.razor @@ -1,14 +1,14 @@
- + @if (this.IsConfigured) { - + @this.ConfiguredText } else { - + @this.NotConfiguredText }
diff --git a/app/MindWork AI Studio/Components/EnumSelection.razor.cs b/app/MindWork AI Studio/Components/EnumSelection.razor.cs index 4335f6326..7f1139eb2 100644 --- a/app/MindWork AI Studio/Components/EnumSelection.razor.cs +++ b/app/MindWork AI Studio/Components/EnumSelection.razor.cs @@ -37,7 +37,7 @@ public partial class EnumSelection : EnumSelectionBase where T : struct, Enum public Func ValidateOther { get; set; } = _ => null; [Parameter] - public string Icon { get; set; } = Icons.Material.Filled.ArrowDropDown; + public string Icon { get; set; } = AppIcons.EXPAND_MORE; /// /// Gets or sets whether the selection controls are disabled. diff --git a/app/MindWork AI Studio/Components/ExpansionPanel.razor.cs b/app/MindWork AI Studio/Components/ExpansionPanel.razor.cs index e57487e85..43722b9fd 100644 --- a/app/MindWork AI Studio/Components/ExpansionPanel.razor.cs +++ b/app/MindWork AI Studio/Components/ExpansionPanel.razor.cs @@ -5,7 +5,7 @@ namespace AIStudio.Components; public partial class ExpansionPanel : ComponentBase { [Parameter] - public string HeaderIcon { get; set; } = Icons.Material.Filled.BugReport; + public string HeaderIcon { get; set; } = AppIcons.BUG; [Parameter] public Size IconSize { get; set; } = Size.Medium; @@ -55,7 +55,7 @@ public partial class ExpansionPanel : ComponentBase public Func EndButtonClickAsync { get; set; } = () => ValueTask.CompletedTask; [Parameter] - public string EndButtonIcon { get; set; } = Icons.Material.Filled.Delete; + public string EndButtonIcon { get; set; } = AppIcons.DELETE; [Parameter] public Color EndButtonColor { get; set; } = Color.Error; diff --git a/app/MindWork AI Studio/Components/FileActions.razor b/app/MindWork AI Studio/Components/FileActions.razor index 8abc6094e..03d6058c9 100644 --- a/app/MindWork AI Studio/Components/FileActions.razor +++ b/app/MindWork AI Studio/Components/FileActions.razor @@ -11,14 +11,14 @@ @if (this.ShowCopy) { - + } @if (this.ShowOpen) { - + } break; @@ -27,7 +27,7 @@ @if (this.ShowCopy) { - + } @@ -38,7 +38,7 @@ { @* Not necessarily gone: the server of an ERI data source may name a file of its own, which was never on this computer. *@ - + } } @@ -47,14 +47,14 @@ @if (this.ShowFileManager) { - + } @if (this.ShowOpen) { - + } } diff --git a/app/MindWork AI Studio/Components/FileExclusionEditor.razor b/app/MindWork AI Studio/Components/FileExclusionEditor.razor index 617e5e258..b8945d47d 100644 --- a/app/MindWork AI Studio/Components/FileExclusionEditor.razor +++ b/app/MindWork AI Studio/Components/FileExclusionEditor.razor @@ -6,14 +6,14 @@ @if (this.ShowHelp) { - + } - - + + @T("These files and folders are left out, even when a file pattern selects them. Separate entries with a semicolon or a line break. End an entry with a slash to exclude every folder of that name, e.g., node_modules/.") diff --git a/app/MindWork AI Studio/Components/FilePatternSelection.razor b/app/MindWork AI Studio/Components/FilePatternSelection.razor index 688d8eb12..4175a5c16 100644 --- a/app/MindWork AI Studio/Components/FilePatternSelection.razor +++ b/app/MindWork AI Studio/Components/FilePatternSelection.razor @@ -6,7 +6,7 @@ @this.AllowedContent
- +
@if (this.HasExclusions) diff --git a/app/MindWork AI Studio/Components/InfoTableRow.razor.cs b/app/MindWork AI Studio/Components/InfoTableRow.razor.cs index a235ef9bf..5dbd71ad0 100644 --- a/app/MindWork AI Studio/Components/InfoTableRow.razor.cs +++ b/app/MindWork AI Studio/Components/InfoTableRow.razor.cs @@ -16,7 +16,7 @@ public partial class InfoTableRow : ComponentBase /// The icon in front of the label. ///
[Parameter] - public string Icon { get; set; } = Icons.Material.Filled.Info; + public string Icon { get; set; } = AppIcons.INFO; /// /// The label, which names what the row shows. diff --git a/app/MindWork AI Studio/Components/Issues.razor b/app/MindWork AI Studio/Components/Issues.razor index 39eda7304..dda1ed2bf 100644 --- a/app/MindWork AI Studio/Components/Issues.razor +++ b/app/MindWork AI Studio/Components/Issues.razor @@ -8,7 +8,7 @@ @foreach (var issue in this.IssuesData) { - + @issue } diff --git a/app/MindWork AI Studio/Components/JsonTreeView.razor.cs b/app/MindWork AI Studio/Components/JsonTreeView.razor.cs index d5cf78f6e..834afe72b 100644 --- a/app/MindWork AI Studio/Components/JsonTreeView.razor.cs +++ b/app/MindWork AI Studio/Components/JsonTreeView.razor.cs @@ -68,9 +68,9 @@ public partial class JsonTreeView : ComponentBase private static string GetIcon(JsonNode? value) => value switch { - JsonObject => Icons.Material.Filled.DataObject, - JsonArray => Icons.Material.Filled.DataArray, - _ => Icons.Material.Filled.Code, + JsonObject => AppIcons.DATA_OBJECT, + JsonArray => AppIcons.DATA_ARRAY, + _ => AppIcons.DATA_VALUE, }; private sealed class JsonTreeNode diff --git a/app/MindWork AI Studio/Components/LayoutChoicePanels.razor.cs b/app/MindWork AI Studio/Components/LayoutChoicePanels.razor.cs index 244da170f..7ea311849 100644 --- a/app/MindWork AI Studio/Components/LayoutChoicePanels.razor.cs +++ b/app/MindWork AI Studio/Components/LayoutChoicePanels.razor.cs @@ -49,14 +49,14 @@ public partial class LayoutChoicePanels : ComponentBase private static string IconOf(LayoutPurposeArea area) => area switch { - LayoutPurposeArea.FRAMING => Icons.Material.Filled.FormatListNumbered, - LayoutPurposeArea.GENERAL => Icons.Material.Filled.ViewQuilt, - LayoutPurposeArea.TEACHING => Icons.Material.Filled.School, - LayoutPurposeArea.BUSINESS => Icons.Material.Filled.BusinessCenter, - LayoutPurposeArea.SCIENCE => Icons.Material.Filled.Science, - LayoutPurposeArea.MEDICINE => Icons.Material.Filled.MedicalServices, - LayoutPurposeArea.LAW => Icons.Material.Filled.Gavel, + LayoutPurposeArea.FRAMING => AppIcons.SLIDE_LAYOUT_STRUCTURE, + LayoutPurposeArea.GENERAL => AppIcons.LAYOUT_PURPOSE_GENERAL, + LayoutPurposeArea.TEACHING => AppIcons.LAYOUT_PURPOSE_TEACHING, + LayoutPurposeArea.BUSINESS => AppIcons.LAYOUT_PURPOSE_BUSINESS, + LayoutPurposeArea.SCIENCE => AppIcons.LAYOUT_PURPOSE_SCIENCE, + LayoutPurposeArea.MEDICINE => AppIcons.MEDICINE, + LayoutPurposeArea.LAW => AppIcons.LEGAL, - _ => Icons.Material.Filled.ViewQuilt, + _ => AppIcons.LAYOUT_PURPOSE_GENERAL, }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/LockableButton.razor.cs b/app/MindWork AI Studio/Components/LockableButton.razor.cs index ddec0bc16..d6dec5915 100644 --- a/app/MindWork AI Studio/Components/LockableButton.razor.cs +++ b/app/MindWork AI Studio/Components/LockableButton.razor.cs @@ -5,7 +5,7 @@ namespace AIStudio.Components; public partial class LockableButton : ConfigurationBaseCore { [Parameter] - public string Icon { get; set; } = Icons.Material.Filled.Info; + public string Icon { get; set; } = AppIcons.INFO; [Parameter] public Func OnClickAsync { get; set; } = () => Task.CompletedTask; diff --git a/app/MindWork AI Studio/Components/MailFolderPicker.razor b/app/MindWork AI Studio/Components/MailFolderPicker.razor index a54c4290d..29b9b5f0b 100644 --- a/app/MindWork AI Studio/Components/MailFolderPicker.razor +++ b/app/MindWork AI Studio/Components/MailFolderPicker.razor @@ -18,10 +18,10 @@ MaxLength="@ImapMailboxConnector.MAX_FOLDER_NAME_LENGTH" HelperText="@this.NewFolderHelperText" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.CreateNewFolder" + AdornmentIcon="@AppIcons.NEW_FOLDER" AdornmentColor="Color.Info" Variant="Variant.Outlined"/> - + @T("Create") diff --git a/app/MindWork AI Studio/Components/MailFolderPicker.razor.cs b/app/MindWork AI Studio/Components/MailFolderPicker.razor.cs index b8ebb4fae..77830c198 100644 --- a/app/MindWork AI Studio/Components/MailFolderPicker.razor.cs +++ b/app/MindWork AI Studio/Components/MailFolderPicker.razor.cs @@ -169,7 +169,7 @@ public partial class MailFolderPicker : MSGComponentBase { Value = string.Empty, Text = wholeMailboxText, - Icon = Icons.Material.Filled.Mail, + Icon = AppIcons.MAILBOX, Expanded = true, Expandable = topLevelFolders.Count > 0, Children = topLevelFolders, @@ -215,20 +215,20 @@ public partial class MailFolderPicker : MSGComponentBase private static string GetIcon(MailServerFolder folder) { if (folder.IsInbox) - return Icons.Material.Filled.Inbox; + return AppIcons.MAIL_FOLDER_INBOX; return folder.SpecialUse switch { - MailFolderSpecialUse.ALL => Icons.Material.Filled.AllInbox, - MailFolderSpecialUse.ARCHIVE => Icons.Material.Filled.Archive, - MailFolderSpecialUse.DRAFTS => Icons.Material.Filled.Drafts, - MailFolderSpecialUse.FLAGGED => Icons.Material.Filled.Flag, - MailFolderSpecialUse.IMPORTANT => Icons.Material.Filled.LabelImportant, - MailFolderSpecialUse.JUNK => Icons.Material.Filled.Report, - MailFolderSpecialUse.SENT => Icons.Material.Filled.Send, - MailFolderSpecialUse.TRASH => Icons.Material.Filled.Delete, + MailFolderSpecialUse.ALL => AppIcons.MAIL_FOLDER_ALL, + MailFolderSpecialUse.ARCHIVE => AppIcons.MAIL_FOLDER_ARCHIVE, + MailFolderSpecialUse.DRAFTS => AppIcons.DRAFT, + MailFolderSpecialUse.FLAGGED => AppIcons.FLAGGED, + MailFolderSpecialUse.IMPORTANT => AppIcons.MAIL_FOLDER_IMPORTANT, + MailFolderSpecialUse.JUNK => AppIcons.MAIL_FOLDER_JUNK, + MailFolderSpecialUse.SENT => AppIcons.MAIL_FOLDER_SENT, + MailFolderSpecialUse.TRASH => AppIcons.MAIL_FOLDER_TRASH, - _ => Icons.Material.Filled.Folder, + _ => AppIcons.FOLDER, }; } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/MediaTranscriptionStatus.razor b/app/MindWork AI Studio/Components/MediaTranscriptionStatus.razor index e2acc3136..9f552faa9 100644 --- a/app/MindWork AI Studio/Components/MediaTranscriptionStatus.razor +++ b/app/MindWork AI Studio/Components/MediaTranscriptionStatus.razor @@ -12,7 +12,7 @@ @this.StatusText - + } @@ -26,7 +26,7 @@ - + diff --git a/app/MindWork AI Studio/Components/MudCopyClipboardButton.razor b/app/MindWork AI Studio/Components/MudCopyClipboardButton.razor index ed7c34ea3..f201dc6b1 100644 --- a/app/MindWork AI Studio/Components/MudCopyClipboardButton.razor +++ b/app/MindWork AI Studio/Components/MudCopyClipboardButton.razor @@ -1,3 +1,3 @@  - + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/MudCopyClipboardButton.razor.cs b/app/MindWork AI Studio/Components/MudCopyClipboardButton.razor.cs index ea574b3ce..55a72ce71 100644 --- a/app/MindWork AI Studio/Components/MudCopyClipboardButton.razor.cs +++ b/app/MindWork AI Studio/Components/MudCopyClipboardButton.razor.cs @@ -90,7 +90,7 @@ public partial class MudCopyClipboardButton : ComponentBase default: // This component is no MSGComponentBase, so it uses the shared bus instance the same // way FileExtensionValidation does: - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.ContentCopy, TB("Cannot copy this content type to clipboard."))); + await MessageBus.INSTANCE.SendError(new(AppIcons.COPY, TB("Cannot copy this content type to clipboard."))); break; } } diff --git a/app/MindWork AI Studio/Components/MudTextList.razor.cs b/app/MindWork AI Studio/Components/MudTextList.razor.cs index 9ce297aa2..df345fc58 100644 --- a/app/MindWork AI Studio/Components/MudTextList.razor.cs +++ b/app/MindWork AI Studio/Components/MudTextList.razor.cs @@ -11,7 +11,7 @@ public partial class MudTextList : ComponentBase public IList Items { get; set; } = []; [Parameter] - public string Icon { get; set; } = Icons.Material.Filled.CheckCircle; + public string Icon { get; set; } = AppIcons.CHECKLIST_ITEM; [Parameter] public string Class { get; set; } = string.Empty; diff --git a/app/MindWork AI Studio/Components/OutboundDataRestrictionSelection.razor b/app/MindWork AI Studio/Components/OutboundDataRestrictionSelection.razor index dafab3a42..723b42d3e 100644 --- a/app/MindWork AI Studio/Components/OutboundDataRestrictionSelection.razor +++ b/app/MindWork AI Studio/Components/OutboundDataRestrictionSelection.razor @@ -2,7 +2,7 @@ @using AIStudio.Settings.DataModel @inherits MSGComponentBase - + @foreach (var restriction in ConfigurationSelectDataFactory.GetOutboundDataRestrictionData(this.Minimum)) { diff --git a/app/MindWork AI Studio/Components/PluginDeleteAction.razor b/app/MindWork AI Studio/Components/PluginDeleteAction.razor index 8001dcefb..90092c7d0 100644 --- a/app/MindWork AI Studio/Components/PluginDeleteAction.razor +++ b/app/MindWork AI Studio/Components/PluginDeleteAction.razor @@ -3,7 +3,7 @@ @if (this.CanDelete) { - - + } else { - + } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/PreviewAlpha.razor b/app/MindWork AI Studio/Components/PreviewAlpha.razor index 46a1a9b33..e9672d2ad 100644 --- a/app/MindWork AI Studio/Components/PreviewAlpha.razor +++ b/app/MindWork AI Studio/Components/PreviewAlpha.razor @@ -1,7 +1,7 @@ @inherits MSGComponentBase - + @T("Alpha") diff --git a/app/MindWork AI Studio/Components/PreviewBeta.razor b/app/MindWork AI Studio/Components/PreviewBeta.razor index 9cd66969c..e56bb1acc 100644 --- a/app/MindWork AI Studio/Components/PreviewBeta.razor +++ b/app/MindWork AI Studio/Components/PreviewBeta.razor @@ -1,7 +1,7 @@ @inherits MSGComponentBase - + @T("Beta") diff --git a/app/MindWork AI Studio/Components/PreviewExperimental.razor b/app/MindWork AI Studio/Components/PreviewExperimental.razor index a63f44a5b..a72c0316f 100644 --- a/app/MindWork AI Studio/Components/PreviewExperimental.razor +++ b/app/MindWork AI Studio/Components/PreviewExperimental.razor @@ -1,7 +1,7 @@ @inherits MSGComponentBase - + @T("Experimental") diff --git a/app/MindWork AI Studio/Components/PreviewPrototype.razor b/app/MindWork AI Studio/Components/PreviewPrototype.razor index e3cfc917d..ced5d8113 100644 --- a/app/MindWork AI Studio/Components/PreviewPrototype.razor +++ b/app/MindWork AI Studio/Components/PreviewPrototype.razor @@ -1,7 +1,7 @@ @inherits MSGComponentBase - + @T("Prototype") diff --git a/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor b/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor index 4ee266b06..325c8042e 100644 --- a/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor +++ b/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor @@ -1,7 +1,7 @@ @inherits MSGComponentBase - + @T("Release Candidate") diff --git a/app/MindWork AI Studio/Components/ProfileFormSelection.razor b/app/MindWork AI Studio/Components/ProfileFormSelection.razor index adeac59be..f1d7ffb6e 100644 --- a/app/MindWork AI Studio/Components/ProfileFormSelection.razor +++ b/app/MindWork AI Studio/Components/ProfileFormSelection.razor @@ -2,7 +2,7 @@ @inherits MSGComponentBase - + @foreach (var profile in this.SettingsManager.ConfigurationData.Profiles.GetAllProfiles()) { @@ -11,5 +11,5 @@ } - + diff --git a/app/MindWork AI Studio/Components/ProfileSelection.razor b/app/MindWork AI Studio/Components/ProfileSelection.razor index aafdd95bc..d8ab488e9 100644 --- a/app/MindWork AI Studio/Components/ProfileSelection.razor +++ b/app/MindWork AI Studio/Components/ProfileSelection.razor @@ -1,21 +1,21 @@ @using AIStudio.Settings @inherits MSGComponentBase - + @if (this.CurrentProfile != Profile.NO_PROFILE) { - + @this.CurrentProfile.GetSafeName() } else { - + } - + @foreach (var profile in this.SettingsManager.ConfigurationData.Profiles.GetAllProfiles()) { diff --git a/app/MindWork AI Studio/Components/ProfileSelection.razor.cs b/app/MindWork AI Studio/Components/ProfileSelection.razor.cs index 6c92aecc5..c03c00640 100644 --- a/app/MindWork AI Studio/Components/ProfileSelection.razor.cs +++ b/app/MindWork AI Studio/Components/ProfileSelection.razor.cs @@ -51,9 +51,9 @@ public partial class ProfileSelection : MSGComponentBase private string ProfileIcon(Profile profile) { if (profile.IsEnterpriseConfiguration) - return Icons.Material.Filled.Business; + return AppIcons.ORGANIZATION; - return Icons.Material.Filled.Person4; + return AppIcons.PROFILE; } private async Task SelectionChanged(Profile profile) diff --git a/app/MindWork AI Studio/Components/ProviderSelection.razor.cs b/app/MindWork AI Studio/Components/ProviderSelection.razor.cs index 3985a960b..2548dd00b 100644 --- a/app/MindWork AI Studio/Components/ProviderSelection.razor.cs +++ b/app/MindWork AI Studio/Components/ProviderSelection.razor.cs @@ -104,21 +104,21 @@ public partial class ProviderSelection : MSGComponentBase List capabilityIcons = []; if (profile.Has(Capability.AUDIO_INPUT)) - capabilityIcons.Add(new(Icons.Material.Filled.GraphicEq, this.T("Audio input possible"))); + capabilityIcons.Add(new(AppIcons.AUDIO_INPUT, this.T("Audio input possible"))); if (profile.HasAny(Capability.SINGLE_IMAGE_INPUT | Capability.MULTIPLE_IMAGE_INPUT)) - capabilityIcons.Add(new(Icons.Material.Filled.Image, this.T("Image input possible"))); + capabilityIcons.Add(new(AppIcons.IMAGE, this.T("Image input possible"))); if (profile.Has(Capability.SPEECH_INPUT)) - capabilityIcons.Add(new(Icons.Material.Filled.Mic, this.T("Speech input possible"))); + capabilityIcons.Add(new(AppIcons.MICROPHONE, this.T("Speech input possible"))); // The same check which decides whether a request offers tools, Semantic Search among them: if (provider.GetToolCallingAvailability().IsAvailable) - capabilityIcons.Add(new(Icons.Material.Filled.Build, this.T("Tool calling possible"))); + capabilityIcons.Add(new(AppIcons.TOOL, this.T("Tool calling possible"))); var reasoningIndicatorState = provider.GetReasoningIndicatorState(); if (reasoningIndicatorState is not ReasoningIndicatorState.NONE) - capabilityIcons.Add(new(Icons.Material.Filled.Psychology, this.GetReasoningTooltip(reasoningIndicatorState))); + capabilityIcons.Add(new(AppIcons.REASONING, this.GetReasoningTooltip(reasoningIndicatorState))); return capabilityIcons; } diff --git a/app/MindWork AI Studio/Components/ReadFileContent.razor b/app/MindWork AI Studio/Components/ReadFileContent.razor index bd1ba11a7..7d50b284c 100644 --- a/app/MindWork AI Studio/Components/ReadFileContent.razor +++ b/app/MindWork AI Studio/Components/ReadFileContent.razor @@ -10,8 +10,8 @@ @if (this.ShowAttachedDocumentState && this.hasLoadedFileContent) { - - + + @this.ButtonText @@ -19,7 +19,7 @@ } else { - + @this.ButtonText } @@ -43,8 +43,8 @@ else @if (this.ShowAttachedDocumentState && this.hasLoadedFileContent) { - - + + @this.ButtonText @@ -52,7 +52,7 @@ else } else { - + @this.ButtonText } diff --git a/app/MindWork AI Studio/Components/ReadFileContent.razor.cs b/app/MindWork AI Studio/Components/ReadFileContent.razor.cs index 0c5b055e8..55ff7882a 100644 --- a/app/MindWork AI Studio/Components/ReadFileContent.razor.cs +++ b/app/MindWork AI Studio/Components/ReadFileContent.razor.cs @@ -144,22 +144,22 @@ public partial class ReadFileContent : MSGComponentBase if (outcome.Failures.Count > 0) { var message = string.Join(Environment.NewLine, outcome.Failures.Select(failure => $"{failure.FileName}: {failure.UserMessage}")); - await this.MessageBus.SendError(new(Icons.Material.Filled.VoiceChat, message)); + await this.MessageBus.SendError(new(AppIcons.VOICE_TRANSCRIPTION, message)); } else if (outcome.Status is MediaImportStatus.FAILED) { - await this.MessageBus.SendError(new(Icons.Material.Filled.VoiceChat, this.T("The media file could not be transcribed."))); + await this.MessageBus.SendError(new(AppIcons.VOICE_TRANSCRIPTION, this.T("The media file could not be transcribed."))); } if (outcome.Warnings.Count > 0) { var message = string.Join(Environment.NewLine, outcome.Warnings.Select(warning => $"{warning.FileName}: {warning.UserMessage}")); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.VoiceChat, message)); + await this.MessageBus.SendWarning(new(AppIcons.VOICE_TRANSCRIPTION, message)); } if (outcome.Status is MediaImportStatus.CANCELLED) { - await this.MessageBus.SendWarning(new(Icons.Material.Filled.VoiceChat, this.T("The media transcription was canceled."))); + await this.MessageBus.SendWarning(new(AppIcons.VOICE_TRANSCRIPTION, this.T("The media transcription was canceled."))); } } @@ -218,7 +218,7 @@ public partial class ReadFileContent : MSGComponentBase { this.Logger.LogWarning("Could not access {Count} dropped file(s): {Paths}", inaccessiblePaths.Count, string.Join(", ", inaccessiblePaths)); await this.MessageBus.SendWarning(new( - Icons.Material.Filled.Warning, + AppIcons.WARNING, this.T("Some dropped files could not be accessed. Please select them with the file chooser instead."))); } @@ -240,7 +240,7 @@ public partial class ReadFileContent : MSGComponentBase if (this.Filter is { Length: > 0 } && !FileTypes.IsAllowedPath(filePath, this.Filter)) { this.Logger.LogWarning("Selected file does not match the configured file type filter: '{FilePath}'", filePath); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.Warning, this.T("Please select a file with a supported file type."))); + await this.MessageBus.SendWarning(new(AppIcons.WARNING, this.T("Please select a file with a supported file type."))); return false; } @@ -273,7 +273,7 @@ public partial class ReadFileContent : MSGComponentBase catch (Exception ex) { this.Logger.LogError(ex, "Failed to load file content: {FilePath}", filePath); - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.Error, T("Failed to load file content"))); + await MessageBus.INSTANCE.SendError(new(AppIcons.ERROR, T("Failed to load file content"))); return false; } } @@ -291,7 +291,7 @@ public partial class ReadFileContent : MSGComponentBase if (string.IsNullOrWhiteSpace(this.SettingsManager.ConfigurationData.App.UseTranscriptionProvider)) { await this.MessageBus.SendWarning(new( - Icons.Material.Filled.VoiceChat, + AppIcons.VOICE_TRANSCRIPTION, this.T("Media files require a configured transcription provider. Configure one in the transcription settings."))); return false; } diff --git a/app/MindWork AI Studio/Components/ReadWebContent.razor b/app/MindWork AI Studio/Components/ReadWebContent.razor index 0a5bb3d01..8bb8c66b4 100644 --- a/app/MindWork AI Studio/Components/ReadWebContent.razor +++ b/app/MindWork AI Studio/Components/ReadWebContent.razor @@ -11,8 +11,8 @@ } - diff --git a/app/MindWork AI Studio/Components/ReadWebContent.razor.cs b/app/MindWork AI Studio/Components/ReadWebContent.razor.cs index 1f307eb20..4e4a5465b 100644 --- a/app/MindWork AI Studio/Components/ReadWebContent.razor.cs +++ b/app/MindWork AI Studio/Components/ReadWebContent.razor.cs @@ -168,7 +168,7 @@ public partial class ReadWebContent : MSGComponentBase // and without a word they would take the raw markdown -- navigation, cookie banner // and advertising included -- for the cleaned result. // - await this.MessageBus.SendError(new(Icons.Material.Filled.SettingsSuggest, T("The content was loaded, but not cleaned: no model is available for the content cleaner."))); + await this.MessageBus.SendError(new(AppIcons.AGENT, T("The content was loaded, but not cleaned: no model is available for the content cleaner."))); } if (this.PreselectContentCleanerAgent && this.providerSettings != AIStudio.Settings.Provider.NONE) @@ -219,7 +219,7 @@ public partial class ReadWebContent : MSGComponentBase // PDF rather than a page, a host that does not answer, a server refusing the request. // this.Logger.LogWarning(exception, "Could not load the web content from '{ProvidedUrl}'.", this.URL); - await this.MessageBus.SendError(new(Icons.Material.Filled.CloudOff, string.Format(this.T("The content of '{0}' could not be loaded: {1}"), this.URL, exception.Message))); + await this.MessageBus.SendError(new(AppIcons.PROVIDER_ERROR, string.Format(this.T("The content of '{0}' could not be loaded: {1}"), this.URL, exception.Message))); } this.Content = markdown; diff --git a/app/MindWork AI Studio/Components/RestoreDefaultButton.razor b/app/MindWork AI Studio/Components/RestoreDefaultButton.razor index 5c64c4dab..324e3c1a8 100644 --- a/app/MindWork AI Studio/Components/RestoreDefaultButton.razor +++ b/app/MindWork AI Studio/Components/RestoreDefaultButton.razor @@ -1,5 +1,5 @@ - + @this.Text \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/SecretInputField.razor b/app/MindWork AI Studio/Components/SecretInputField.razor index 36945cabd..164f3503a 100644 --- a/app/MindWork AI Studio/Components/SecretInputField.razor +++ b/app/MindWork AI Studio/Components/SecretInputField.razor @@ -7,7 +7,7 @@ Label="@this.Label" Placeholder="@this.Placeholder" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.VpnKey" + AdornmentIcon="@AppIcons.KEY" AdornmentColor="Color.Info" InputType="@this.InputType" Immediate="true" diff --git a/app/MindWork AI Studio/Components/SecretInputField.razor.cs b/app/MindWork AI Studio/Components/SecretInputField.razor.cs index 4bc919920..c841c8f3e 100644 --- a/app/MindWork AI Studio/Components/SecretInputField.razor.cs +++ b/app/MindWork AI Studio/Components/SecretInputField.razor.cs @@ -40,7 +40,7 @@ public partial class SecretInputField : MSGComponentBase private InputType InputType => this.isSecretVisible ? InputType.Text : InputType.Password; - private string InputTypeIcon => this.isSecretVisible ? Icons.Material.Filled.Visibility : Icons.Material.Filled.VisibilityOff; + private string InputTypeIcon => this.isSecretVisible ? AppIcons.VISIBLE : AppIcons.HIDDEN; private string ToggleVisibilityTooltip => this.isSecretVisible ? T("Hide content") : T("Show content"); diff --git a/app/MindWork AI Studio/Components/SelectDirectory.razor b/app/MindWork AI Studio/Components/SelectDirectory.razor index 5025861db..e63fd5d6b 100644 --- a/app/MindWork AI Studio/Components/SelectDirectory.razor +++ b/app/MindWork AI Studio/Components/SelectDirectory.razor @@ -25,12 +25,12 @@ else ReadOnly="@true" Validation="@this.Validation" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Folder" + AdornmentIcon="@AppIcons.FOLDER" UserAttributes="@SPELLCHECK_ATTRIBUTES" Variant="Variant.Outlined" /> - + @T("Choose Directory") ; diff --git a/app/MindWork AI Studio/Components/SelectDirectory.razor.cs b/app/MindWork AI Studio/Components/SelectDirectory.razor.cs index c50e6fa9e..a7ae35f6a 100644 --- a/app/MindWork AI Studio/Components/SelectDirectory.razor.cs +++ b/app/MindWork AI Studio/Components/SelectDirectory.razor.cs @@ -94,7 +94,7 @@ public partial class SelectDirectory : MSGComponentBase if (path is null) { this.Logger.LogWarning("None of the {Count} dropped path(s) could be used as a directory.", paths.Count); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.Warning, DroppedFolder.WarningFor(paths))); + await this.MessageBus.SendWarning(new(AppIcons.WARNING, DroppedFolder.WarningFor(paths))); return; } diff --git a/app/MindWork AI Studio/Components/SelectFile.razor b/app/MindWork AI Studio/Components/SelectFile.razor index b6b0eb6c3..0e86f8674 100644 --- a/app/MindWork AI Studio/Components/SelectFile.razor +++ b/app/MindWork AI Studio/Components/SelectFile.razor @@ -25,12 +25,12 @@ else ReadOnly="@true" Validation="@this.Validation" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.AttachFile" + AdornmentIcon="@AppIcons.FILE" UserAttributes="@SPELLCHECK_ATTRIBUTES" Variant="Variant.Outlined" /> - + @T("Choose File") ; diff --git a/app/MindWork AI Studio/Components/SelectFile.razor.cs b/app/MindWork AI Studio/Components/SelectFile.razor.cs index a32cdc0cb..2f29c3aae 100644 --- a/app/MindWork AI Studio/Components/SelectFile.razor.cs +++ b/app/MindWork AI Studio/Components/SelectFile.razor.cs @@ -98,7 +98,7 @@ public partial class SelectFile : MSGComponentBase if (path is null) { this.Logger.LogWarning("None of the {Count} dropped path(s) could be used as a file.", paths.Count); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.Warning, DroppedFile.WarningFor(paths))); + await this.MessageBus.SendWarning(new(AppIcons.WARNING, DroppedFile.WarningFor(paths))); return; } diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentAssistantAudit.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentAssistantAudit.razor index b91dcd6f9..716c05a49 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentAssistantAudit.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentAssistantAudit.razor @@ -1,7 +1,7 @@ @using AIStudio.Settings @inherits SettingsPanelBase - + @T("This Agent audits newly installed or updated external Plugin-Assistant for security risks before they are activated and stores the latest audit card until the plugin manifest changes.") diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentContentCleaner.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentContentCleaner.razor index c6f2b4bd3..bcb7c1dd2 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentContentCleaner.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentContentCleaner.razor @@ -1,6 +1,6 @@ @inherits SettingsPanelBase - + @T("Use Case: this agent is used to clean up text content. It extracts the main content, removes advertisements and other irrelevant things, and attempts to convert relative links into absolute links so that they can be used.") diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentDataSourceSelection.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentDataSourceSelection.razor index 6e951c245..6e14d2988 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentDataSourceSelection.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentDataSourceSelection.razor @@ -1,7 +1,7 @@ @using AIStudio.Settings @inherits SettingsPanelBase - + @T("Use Case: this agent is used to select the appropriate data sources for the current prompt.") diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentRetrievalContextValidation.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentRetrievalContextValidation.razor index e6bcb8806..a77a72ca3 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentRetrievalContextValidation.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentRetrievalContextValidation.razor @@ -1,7 +1,7 @@ @using AIStudio.Settings @inherits SettingsPanelBase - + @T("Use Case: this agent is used to validate any retrieval context of any retrieval process. Perhaps there are many of these retrieval contexts and you want to validate them all. Therefore, you might want to use a cheap and fast LLM for this job. When using a local or self-hosted LLM, look for a small (e.g. 3B) and fast model.") diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelApp.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelApp.razor index 59aa3aad5..0e5a80bd4 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelApp.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelApp.razor @@ -3,7 +3,7 @@ @using AIStudio.Tools.Rust @inherits SettingsPanelBase - + @if (this.SettingsManager.ConfigurationData.App.LanguageBehavior is LangBehavior.MANUAL) @@ -70,7 +70,7 @@ - - - + + } diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelConfidence.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelConfidence.razor index b1311e156..d7fad4c14 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelConfidence.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelConfidence.razor @@ -2,7 +2,7 @@ @using AIStudio.Settings @inherits SettingsPanelBase - + @T("Provider Confidence") @@ -47,7 +47,7 @@ } - + @foreach (var confidenceLevel in Enum.GetValues().OrderBy(n => n)) { if(confidenceLevel is ConfidenceLevel.NONE or ConfidenceLevel.UNKNOWN) diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelConfidence.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelConfidence.razor.cs index b416ec6ce..1474e4220 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelConfidence.razor.cs +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelConfidence.razor.cs @@ -16,9 +16,9 @@ public partial class SettingsPanelConfidence : SettingsPanelBase private string SetCurrentConfidenceLevelColorStyle(LLMProviders llmProvider) { if (this.TryGetShownConfidenceLevel(llmProvider, out var level)) - return $"background-color: {level.GetColor(this.SettingsManager)};"; + return $"background-color: {level.GetBackgroundColor(this.SettingsManager)};"; - return $"background-color: {ConfidenceLevel.UNKNOWN.GetColor(this.SettingsManager)};"; + return $"background-color: {ConfidenceLevel.UNKNOWN.GetBackgroundColor(this.SettingsManager)};"; } /// diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelDataSources.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelDataSources.razor index fd68f1f32..b82a2718b 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelDataSources.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelDataSources.razor @@ -3,7 +3,7 @@ @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager)) { - +
diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor index 792462a98..eaff557ee 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor @@ -5,7 +5,7 @@ @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager)) { - + @T("Configured Embedding Providers") @@ -47,44 +47,44 @@ @if (this.SettingsManager.IsProviderProhibited(context.UsedLLMProvider)) { - + } @if (context.IsTrustedForDataSourceSecurityChecks(this.SettingsManager)) { - + } @if (context.IsEnterpriseConfiguration && !context.AllowUserProvidedAPIKey) { - + } else if (context.IsEnterpriseConfiguration && context.AllowUserProvidedAPIKey) { - + - + } else { - + - + - + - + } @@ -100,8 +100,8 @@ } - - + + } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelProviderBase.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelProviderBase.cs index 89b2aa0c2..183d1f2f5 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelProviderBase.cs +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelProviderBase.cs @@ -47,7 +47,7 @@ public abstract class SettingsPanelProviderBase : SettingsPanelBase else { // No encryption secret available - inform the user: - await this.MessageBus.SendWarning(new(Icons.Material.Filled.Key, TB("Cannot export the encrypted API key: No enterprise encryption secret is configured."))); + await this.MessageBus.SendWarning(new(AppIcons.KEY, TB("Cannot export the encrypted API key: No enterprise encryption secret is configured."))); } } } diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor index 313baa4d9..80a492e01 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor @@ -3,7 +3,7 @@ @using AIStudio.Tools.PluginSystem @inherits SettingsPanelProviderBase - + @T("Configured LLM Providers") @@ -39,38 +39,38 @@ @if (this.SettingsManager.IsProviderProhibited(context.UsedLLMProvider)) { - + } @if (context.IsTrustedForDataSourceSecurityChecks(this.SettingsManager)) { - + } @if (context.IsEnterpriseConfiguration && !context.AllowUserProvidedAPIKey) { - + } else if (context.IsEnterpriseConfiguration && context.AllowUserProvidedAPIKey) { - + } else { - + - + - + } @@ -86,7 +86,7 @@ } - - + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelTools.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelTools.razor index efc31153b..91bec502f 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelTools.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelTools.razor @@ -1,6 +1,6 @@ @inherits SettingsPanelBase - + @T("Configure global settings for each tool.") @T("Switch off the tools you never need: they then appear in no tool selection, and the AI cannot use them.") @@ -31,7 +31,7 @@ @context.Description - + @foreach (var confidenceLevel in this.GetSelectableConfidenceLevels()) { @@ -45,30 +45,30 @@ { @* Whether its settings are complete does not matter while nobody can use the tool: *@ - + } else if (!context.IsActive) { - + } else if (context.ConfigurationState.IsConfigured) { - + } else { - + } - + diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelTools.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelTools.razor.cs index 06235b98b..60d73cf24 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelTools.razor.cs +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelTools.razor.cs @@ -110,7 +110,7 @@ public partial class SettingsPanelTools : SettingsPanelBase : confidenceLevel.Name; private string SetCurrentConfidenceLevelColorStyle(ToolCatalogItem item) => - $"background-color: {GetMinimumProviderConfidence(item).GetColor(this.SettingsManager)};"; + $"background-color: {GetMinimumProviderConfidence(item).GetBackgroundColor(this.SettingsManager)};"; private bool IsToolConfidenceManaged() => ManagedConfiguration.TryGet(x => x.Tools, x => x.MinimumProviderConfidenceByToolId, out var meta) && meta.IsLocked; diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelTranscription.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelTranscription.razor index b1f841e08..2e0ecc7d1 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelTranscription.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelTranscription.razor @@ -6,7 +6,7 @@ @if (PreviewFeatures.PRE_SPEECH_TO_TEXT_2026.IsEnabled(this.SettingsManager)) { - + @T("Configured Transcription Providers") @@ -44,38 +44,38 @@ @if (this.SettingsManager.IsProviderProhibited(context.UsedLLMProvider)) { - + } @if (context.IsTrustedForDataSourceSecurityChecks(this.SettingsManager)) { - + } @if (context.IsEnterpriseConfiguration && !context.AllowUserProvidedAPIKey) { - + } else if (context.IsEnterpriseConfiguration && context.AllowUserProvidedAPIKey) { - + } else { - + - + - + } @@ -91,8 +91,8 @@ } - - + + } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/SourcePassageView.razor b/app/MindWork AI Studio/Components/SourcePassageView.razor index 6345d2e64..d33e343df 100644 --- a/app/MindWork AI Studio/Components/SourcePassageView.razor +++ b/app/MindWork AI Studio/Components/SourcePassageView.razor @@ -14,7 +14,7 @@ else @T("At the moment, AI Studio cannot read the text of this passage that the AI received, e.g., while AI Studio is still starting.") - + @T("Try again") diff --git a/app/MindWork AI Studio/Components/SourcesList.razor b/app/MindWork AI Studio/Components/SourcesList.razor index 59a90dcc3..809a016bf 100644 --- a/app/MindWork AI Studio/Components/SourcesList.razor +++ b/app/MindWork AI Studio/Components/SourcesList.razor @@ -89,7 +89,7 @@ @if (entry.Passages.Count > 0) { - + }
diff --git a/app/MindWork AI Studio/Components/SplitButton.razor b/app/MindWork AI Studio/Components/SplitButton.razor index 2177a1a83..c33bd1ec6 100644 --- a/app/MindWork AI Studio/Components/SplitButton.razor +++ b/app/MindWork AI Studio/Components/SplitButton.razor @@ -13,7 +13,7 @@ @this.SelectedValueName() } - + @foreach(var item in this.Items) { diff --git a/app/MindWork AI Studio/Components/Supporter.razor.cs b/app/MindWork AI Studio/Components/Supporter.razor.cs index c4b9414df..f0b74d1c8 100644 --- a/app/MindWork AI Studio/Components/Supporter.razor.cs +++ b/app/MindWork AI Studio/Components/Supporter.razor.cs @@ -18,9 +18,9 @@ public partial class Supporter : ComponentBase private string Icon => this.Type switch { - SupporterType.INDIVIDUAL => Icons.Material.Filled.Person, - SupporterType.ORGANIZATION => Icons.Material.Filled.Business, + SupporterType.INDIVIDUAL => AppIcons.USER, + SupporterType.ORGANIZATION => AppIcons.BUSINESS_SUPPORTER, - _ => Icons.Material.Filled.Person4, + _ => AppIcons.USER, }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/TextInfoLine.razor b/app/MindWork AI Studio/Components/TextInfoLine.razor index 342c495d2..aea1e9efb 100644 --- a/app/MindWork AI Studio/Components/TextInfoLine.razor +++ b/app/MindWork AI Studio/Components/TextInfoLine.razor @@ -14,7 +14,7 @@ @if (this.ShowingCopyButton) { - + } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/TextInfoLine.razor.cs b/app/MindWork AI Studio/Components/TextInfoLine.razor.cs index 3abe197b2..b864e4a8e 100644 --- a/app/MindWork AI Studio/Components/TextInfoLine.razor.cs +++ b/app/MindWork AI Studio/Components/TextInfoLine.razor.cs @@ -10,7 +10,7 @@ public partial class TextInfoLine : MSGComponentBase public string Label { get; set; } = string.Empty; [Parameter] - public string Icon { get; set; } = Icons.Material.Filled.Info; + public string Icon { get; set; } = AppIcons.INFO; [Parameter] public string Value { get; set; } = string.Empty; diff --git a/app/MindWork AI Studio/Components/TextInfoLines.razor b/app/MindWork AI Studio/Components/TextInfoLines.razor index 0b493e204..6169a72be 100644 --- a/app/MindWork AI Studio/Components/TextInfoLines.razor +++ b/app/MindWork AI Studio/Components/TextInfoLines.razor @@ -18,7 +18,7 @@ @if (this.ShowingCopyButton) { - + } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ThirdPartyComponent.razor b/app/MindWork AI Studio/Components/ThirdPartyComponent.razor index 06e1c5c57..eb0548fbc 100644 --- a/app/MindWork AI Studio/Components/ThirdPartyComponent.razor +++ b/app/MindWork AI Studio/Components/ThirdPartyComponent.razor @@ -9,7 +9,7 @@ - + diff --git a/app/MindWork AI Studio/Components/ToolSelection.razor b/app/MindWork AI Studio/Components/ToolSelection.razor index c80795e53..96962ec1b 100644 --- a/app/MindWork AI Studio/Components/ToolSelection.razor +++ b/app/MindWork AI Studio/Components/ToolSelection.razor @@ -3,7 +3,7 @@
- + @@ -61,7 +61,7 @@ @if (unavailableItems.Count > 0) { - - + } @@ -131,7 +131,7 @@ - + @if (this.GetWarningText(item) is var warningText && !string.IsNullOrWhiteSpace(warningText)) { diff --git a/app/MindWork AI Studio/Components/UserAPIKeyPrompt.razor b/app/MindWork AI Studio/Components/UserAPIKeyPrompt.razor index a52573e00..f7fc6a199 100644 --- a/app/MindWork AI Studio/Components/UserAPIKeyPrompt.razor +++ b/app/MindWork AI Studio/Components/UserAPIKeyPrompt.razor @@ -1,6 +1,6 @@ @inherits MSGComponentBase - + @if (this.Group.Prompt is not null) { @@ -22,7 +22,7 @@ } - + @T("Check and save API key") @if (this.isBusy) diff --git a/app/MindWork AI Studio/Components/UserAPIKeyPrompt.razor.cs b/app/MindWork AI Studio/Components/UserAPIKeyPrompt.razor.cs index 6a3392453..82e675f6f 100644 --- a/app/MindWork AI Studio/Components/UserAPIKeyPrompt.razor.cs +++ b/app/MindWork AI Studio/Components/UserAPIKeyPrompt.razor.cs @@ -64,16 +64,16 @@ public partial class UserAPIKeyPrompt : MSGComponentBase // Hence, a failure to store the key goes into a message of its own instead of into this panel: // if (result.FailedProviderNames.Count > 0) - await this.MessageBus.SendError(new DataErrorMessage(Icons.Material.Filled.Key, string.Format(T("AI Studio could not store the API key for these providers: {0}"), string.Join(", ", result.FailedProviderNames)))); + await this.MessageBus.SendError(new DataErrorMessage(AppIcons.KEY, string.Format(T("AI Studio could not store the API key for these providers: {0}"), string.Join(", ", result.FailedProviderNames)))); if (result.FailedProviderNames.Count == this.Group.Targets.Count) return; this.apiKey = string.Empty; if (result.Check is UserAPIKeyCheckOutcome.ACCEPTED) - await this.MessageBus.SendSuccess(new DataSuccessMessage(Icons.Material.Filled.Key, T("AI Studio checked your API key and stored it. You can now use the AI providers of your organization."))); + await this.MessageBus.SendSuccess(new DataSuccessMessage(AppIcons.KEY, T("AI Studio checked your API key and stored it. You can now use the AI providers of your organization."))); else - await this.MessageBus.SendWarning(new DataWarningMessage(Icons.Material.Filled.Key, T("AI Studio stored your API key but could not check it. If the AI providers of your organization do not work, please correct the key in the settings."))); + await this.MessageBus.SendWarning(new DataWarningMessage(AppIcons.KEY, T("AI Studio stored your API key but could not check it. If the AI providers of your organization do not work, please correct the key in the settings."))); // Tell everyone that the providers are usable now. The home page removes this panel once no provider waits any longer: await this.SendMessage(Event.CONFIGURATION_CHANGED); diff --git a/app/MindWork AI Studio/Components/Vision.razor b/app/MindWork AI Studio/Components/Vision.razor index 463812bc2..f9bd501a9 100644 --- a/app/MindWork AI Studio/Components/Vision.razor +++ b/app/MindWork AI Studio/Components/Vision.razor @@ -5,7 +5,7 @@ @T("So, where are we headed, and how could the app evolve in the coming months and years? The following list outlines our ideas, though not in order of priority:") - + @T("We hope this vision excites you as much as it excites us. Together, let's build a powerful and flexible AI toolkit to support all your creative, professional, and everyday needs with MindWork AI Studio.") \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/VoiceRecorder.razor b/app/MindWork AI Studio/Components/VoiceRecorder.razor index 30b75e744..dd1d4ff0f 100644 --- a/app/MindWork AI Studio/Components/VoiceRecorder.razor +++ b/app/MindWork AI Studio/Components/VoiceRecorder.razor @@ -20,8 +20,8 @@ { diff --git a/app/MindWork AI Studio/Components/VoiceRecorder.razor.cs b/app/MindWork AI Studio/Components/VoiceRecorder.razor.cs index 8c5e6407b..cb5389011 100644 --- a/app/MindWork AI Studio/Components/VoiceRecorder.razor.cs +++ b/app/MindWork AI Studio/Components/VoiceRecorder.razor.cs @@ -210,7 +210,7 @@ public partial class VoiceRecorder : MSGComponentBase catch (Exception e) { this.Logger.LogError(e, "Failed to start audio recording."); - await this.MessageBus.SendError(new(Icons.Material.Filled.MicOff, this.T("Failed to start audio recording."))); + await this.MessageBus.SendError(new(AppIcons.MICROPHONE_OFF, this.T("Failed to start audio recording."))); // Clean up the recording stream if starting failed: await this.FinalizeRecordingStream(); @@ -232,7 +232,7 @@ public partial class VoiceRecorder : MSGComponentBase catch (Exception e) { this.Logger.LogError(e, "Failed to stop audio recording."); - await this.MessageBus.SendError(new(Icons.Material.Filled.MicOff, this.T("Failed to stop audio recording."))); + await this.MessageBus.SendError(new(AppIcons.MICROPHONE_OFF, this.T("Failed to stop audio recording."))); } // Close and finalize the recording stream: @@ -246,7 +246,7 @@ public partial class VoiceRecorder : MSGComponentBase if (recordingStoppedSuccessfully) { this.Logger.LogWarning("The audio recorder did not produce any data."); - await this.MessageBus.SendError(new(Icons.Material.Filled.MicOff, this.T("Failed to stop audio recording."))); + await this.MessageBus.SendError(new(AppIcons.MICROPHONE_OFF, this.T("Failed to stop audio recording."))); } this.DeleteFinalRecording(); @@ -377,7 +377,7 @@ public partial class VoiceRecorder : MSGComponentBase if (transcriptionResult.Status is MediaTranscriptionResultStatus.NO_AUDIBLE_SIGNAL) { - await this.MessageBus.SendWarning(new(Icons.Material.Filled.VoiceChat, transcriptionResult.UserMessage)); + await this.MessageBus.SendWarning(new(AppIcons.VOICE_TRANSCRIPTION, transcriptionResult.UserMessage)); return; } @@ -385,7 +385,7 @@ public partial class VoiceRecorder : MSGComponentBase var userMessage = string.IsNullOrWhiteSpace(transcriptionResult.UserMessage) ? this.T("Unfortunately, there was an error communicating with the AI system.") : transcriptionResult.UserMessage; - await this.MessageBus.SendError(new(Icons.Material.Filled.VoiceChat, userMessage)); + await this.MessageBus.SendError(new(AppIcons.VOICE_TRANSCRIPTION, userMessage)); return; } @@ -394,7 +394,7 @@ public partial class VoiceRecorder : MSGComponentBase if (string.IsNullOrWhiteSpace(transcribedText)) { this.Logger.LogWarning("The transcription result is empty."); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.VoiceChat, this.T("The transcription result is empty."))); + await this.MessageBus.SendWarning(new(AppIcons.VOICE_TRANSCRIPTION, this.T("The transcription result is empty."))); return; } @@ -426,7 +426,7 @@ public partial class VoiceRecorder : MSGComponentBase catch (Exception ex) { this.Logger.LogError(ex, "An error occurred during transcription."); - await this.MessageBus.SendError(new(Icons.Material.Filled.VoiceChat, this.T("An error occurred during transcription."))); + await this.MessageBus.SendError(new(AppIcons.VOICE_TRANSCRIPTION, this.T("An error occurred during transcription."))); } finally { @@ -515,7 +515,7 @@ public partial class VoiceRecorder : MSGComponentBase return; this.Logger.LogWarning("Voice recording was disabled for the current session. Reason: {Reason}", reason); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.MicOff, this.T("Voice recording has been disabled for this session because audio playback could not be initialized on the client."))); + await this.MessageBus.SendWarning(new(AppIcons.MICROPHONE_OFF, this.T("Voice recording has been disabled for this session because audio playback could not be initialized on the client."))); await this.SendMessage(Event.VOICE_RECORDING_AVAILABILITY_CHANGED, reason); this.StateHasChanged(); } diff --git a/app/MindWork AI Studio/Components/WorkspaceNameField.razor b/app/MindWork AI Studio/Components/WorkspaceNameField.razor index 69542641c..1a3b5d593 100644 --- a/app/MindWork AI Studio/Components/WorkspaceNameField.razor +++ b/app/MindWork AI Studio/Components/WorkspaceNameField.razor @@ -2,7 +2,7 @@ @if (this.availableWorkspaces.Count > 0 && !this.ReadOnly) { - + @foreach (var workspace in this.availableWorkspaces) { @workspace.Name diff --git a/app/MindWork AI Studio/Components/WorkspaceNameField.razor.cs b/app/MindWork AI Studio/Components/WorkspaceNameField.razor.cs index 7c5aaf9d5..671ed4e89 100644 --- a/app/MindWork AI Studio/Components/WorkspaceNameField.razor.cs +++ b/app/MindWork AI Studio/Components/WorkspaceNameField.razor.cs @@ -40,7 +40,7 @@ public partial class WorkspaceNameField : MSGComponentBase public string HelperText { get; set; } = string.Empty; [Parameter] - public string AdornmentIcon { get; set; } = Icons.Material.Filled.CreateNewFolder; + public string AdornmentIcon { get; set; } = AppIcons.NEW_FOLDER; [Parameter] public Size AdornmentIconSize { get; set; } = Size.Medium; diff --git a/app/MindWork AI Studio/Components/Workspaces.razor b/app/MindWork AI Studio/Components/Workspaces.razor index f72910f67..62530f875 100644 --- a/app/MindWork AI Studio/Components/Workspaces.razor +++ b/app/MindWork AI Studio/Components/Workspaces.razor @@ -23,9 +23,9 @@ else Margin="Margin.Dense" Immediate="@true" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Search"/> + AdornmentIcon="@AppIcons.SEARCH"/> - + @@ -62,7 +62,7 @@ else } else if (treeItem.Type is TreeItemType.CHAT) { - +
@@ -78,19 +78,19 @@ else
- + - + - + - +
@@ -109,15 +109,15 @@ else {
- + - + - +
} diff --git a/app/MindWork AI Studio/Components/Workspaces.razor.cs b/app/MindWork AI Studio/Components/Workspaces.razor.cs index 1aca9d327..5cefd08e5 100644 --- a/app/MindWork AI Studio/Components/Workspaces.razor.cs +++ b/app/MindWork AI Studio/Components/Workspaces.razor.cs @@ -152,7 +152,7 @@ public partial class Workspaces : MSGComponentBase workspaceChildren.Add(new TreeItemData { Expandable = false, - Value = new TreeButton(WorkspaceBranch.WORKSPACES, 1, T("Add workspace"), Icons.Material.Filled.LibraryAdd, this.AddWorkspaceAsync), + Value = new TreeButton(WorkspaceBranch.WORKSPACES, 1, T("Add workspace"), AppIcons.ADD_WORKSPACE, this.AddWorkspaceAsync), }); this.treeItems.Add(new TreeItemData @@ -164,7 +164,7 @@ public partial class Workspaces : MSGComponentBase Depth = 0, Branch = WorkspaceBranch.WORKSPACES, Text = T("Workspaces"), - Icon = Icons.Material.Filled.Folder, + Icon = AppIcons.FOLDER, Expandable = true, Path = "root", Children = workspaceChildren, @@ -179,7 +179,7 @@ public partial class Workspaces : MSGComponentBase var temporaryChatsChildren = new List>(); foreach (var temporaryChat in snapshot.TemporaryChats.OrderByDescending(x => x.LastEditTime)) - temporaryChatsChildren.Add(this.CreateChatTreeItem(temporaryChat, WorkspaceBranch.TEMPORARY_CHATS, depth: 1, icon: Icons.Material.Filled.Timer)); + temporaryChatsChildren.Add(this.CreateChatTreeItem(temporaryChat, WorkspaceBranch.TEMPORARY_CHATS, depth: 1, icon: AppIcons.TEMPORARY_CHAT)); this.treeItems.Add(new TreeItemData { @@ -190,7 +190,7 @@ public partial class Workspaces : MSGComponentBase Depth = 0, Branch = WorkspaceBranch.TEMPORARY_CHATS, Text = T("Disappearing Chats"), - Icon = Icons.Material.Filled.Timer, + Icon = AppIcons.TEMPORARY_CHAT, Expandable = true, Path = "temp", Children = temporaryChatsChildren, @@ -204,7 +204,7 @@ public partial class Workspaces : MSGComponentBase if (workspace.ChatsLoaded) { foreach (var workspaceChat in workspace.Chats.OrderByDescending(x => x.LastEditTime)) - children.Add(this.CreateChatTreeItem(workspaceChat, WorkspaceBranch.WORKSPACES, depth: 2, icon: Icons.Material.Filled.Chat)); + children.Add(this.CreateChatTreeItem(workspaceChat, WorkspaceBranch.WORKSPACES, depth: 2, icon: AppIcons.CHAT)); } else if (this.loadingWorkspaceChatLists.Contains(workspace.WorkspaceId)) children.AddRange(this.CreateLoadingRows(workspace.WorkspacePath)); @@ -212,7 +212,7 @@ public partial class Workspaces : MSGComponentBase children.Add(new TreeItemData { Expandable = false, - Value = new TreeButton(WorkspaceBranch.WORKSPACES, 2, T("Add chat"), Icons.Material.Filled.AddComment, () => this.AddChatAsync(workspace.WorkspacePath)), + Value = new TreeButton(WorkspaceBranch.WORKSPACES, 2, T("Add chat"), AppIcons.NEW_CHAT, () => this.AddChatAsync(workspace.WorkspacePath)), }); return new TreeItemData @@ -224,7 +224,7 @@ public partial class Workspaces : MSGComponentBase Depth = 1, Branch = WorkspaceBranch.WORKSPACES, Text = workspace.Name, - Icon = Icons.Material.Filled.Description, + Icon = AppIcons.WORKSPACE, Expandable = true, Path = workspace.WorkspacePath, Children = children, @@ -253,7 +253,7 @@ public partial class Workspaces : MSGComponentBase Depth = 2, Branch = WorkspaceBranch.WORKSPACES, Text = T("Loading chats..."), - Icon = Icons.Material.Filled.HourglassTop, + Icon = AppIcons.PENDING, Expandable = false, Path = Path.Join(workspacePath, suffix), }, @@ -296,7 +296,7 @@ public partial class Workspaces : MSGComponentBase Depth = 0, Branch = WorkspaceBranch.NONE, Text = T("No chats found"), - Icon = Icons.Material.Filled.Search, + Icon = AppIcons.SEARCH_NO_RESULTS, Expandable = false, Path = "search_empty", }, @@ -320,7 +320,7 @@ public partial class Workspaces : MSGComponentBase Depth = 0, Branch = WorkspaceBranch.WORKSPACES, Text = T("Workspaces"), - Icon = Icons.Material.Filled.Folder, + Icon = AppIcons.FOLDER, Expandable = true, Path = "search_workspaces", Children = workspaceChildren, @@ -341,7 +341,7 @@ public partial class Workspaces : MSGComponentBase { var temporaryChatsChildren = new List>(); foreach (var temporaryChat in snapshot.TemporaryChats) - temporaryChatsChildren.Add(this.CreateChatTreeItem(temporaryChat.Chat, WorkspaceBranch.TEMPORARY_CHATS, depth: 1, icon: Icons.Material.Filled.Timer)); + temporaryChatsChildren.Add(this.CreateChatTreeItem(temporaryChat.Chat, WorkspaceBranch.TEMPORARY_CHATS, depth: 1, icon: AppIcons.TEMPORARY_CHAT)); this.treeItems.Add(new TreeItemData { @@ -352,7 +352,7 @@ public partial class Workspaces : MSGComponentBase Depth = 0, Branch = WorkspaceBranch.TEMPORARY_CHATS, Text = T("Disappearing Chats"), - Icon = Icons.Material.Filled.Timer, + Icon = AppIcons.TEMPORARY_CHAT, Expandable = true, Path = "search_temp", Children = temporaryChatsChildren, @@ -365,7 +365,7 @@ public partial class Workspaces : MSGComponentBase { var children = new List>(); foreach (var chat in workspace.Chats) - children.Add(this.CreateChatTreeItem(chat.Chat, WorkspaceBranch.WORKSPACES, depth: 2, icon: Icons.Material.Filled.Chat)); + children.Add(this.CreateChatTreeItem(chat.Chat, WorkspaceBranch.WORKSPACES, depth: 2, icon: AppIcons.CHAT)); return new TreeItemData { @@ -377,7 +377,7 @@ public partial class Workspaces : MSGComponentBase Depth = 1, Branch = WorkspaceBranch.WORKSPACES, Text = workspace.Name, - Icon = Icons.Material.Filled.Description, + Icon = AppIcons.WORKSPACE, Expandable = true, Path = workspace.WorkspacePath, Children = children, @@ -437,12 +437,12 @@ public partial class Workspaces : MSGComponentBase { return mediaStatus switch { - MediaImportStatus.QUEUED => Icons.Material.Filled.HourglassTop, - MediaImportStatus.RUNNING or MediaImportStatus.CANCELING => Icons.Material.Filled.ChangeCircle, - MediaImportStatus.SUCCEEDED => Icons.Material.Filled.TaskAlt, - MediaImportStatus.WARNING => Icons.Material.Filled.WarningAmber, - MediaImportStatus.FAILED => Icons.Material.Filled.Error, - MediaImportStatus.CANCELLED => Icons.Material.Filled.Cancel, + MediaImportStatus.QUEUED => AppIcons.PENDING, + MediaImportStatus.RUNNING or MediaImportStatus.CANCELING => AppIcons.RUNNING, + MediaImportStatus.SUCCEEDED => AppIcons.SUCCESS, + MediaImportStatus.WARNING => AppIcons.WARNING, + MediaImportStatus.FAILED => AppIcons.ERROR, + MediaImportStatus.CANCELLED => AppIcons.CANCELED, _ => defaultIcon, }; @@ -454,12 +454,20 @@ public partial class Workspaces : MSGComponentBase return snapshot.Status switch { - AIJobStatus.WAITING_FOR_REMOTE => Icons.Material.Filled.HourglassTop, - AIJobStatus.RUNNING => Icons.Material.Filled.ChangeCircle, + AIJobStatus.WAITING_FOR_REMOTE => AppIcons.PENDING, + AIJobStatus.RUNNING => AppIcons.RUNNING, _ => defaultIcon, }; } + /// + /// Colors the icon of a chat red when its media transcription failed, like every other error icon. + /// + /// The chat in the tree. + private Color GetChatTreeIconColor(TreeItemData treeItem) => this.MediaTranscriptionService.GetSnapshot(MediaImportOwner.ForChat(treeItem.ChatId))?.Status is MediaImportStatus.FAILED + ? Color.Error + : Color.Default; + private void OnMediaImportStateChanged(MediaImportOwner owner) { if (owner.Kind is MediaImportOwnerKind.CHAT) @@ -999,7 +1007,7 @@ public partial class Workspaces : MSGComponentBase return chatIds; } - private Task WarnAboutBusyWorkspaceAsync(string workspaceName) => MessageBus.INSTANCE.SendWarning(new(Icons.Material.Filled.FolderDelete, string.Format(T("The workspace '{0}' cannot be deleted while one of its chats is being answered or transcribed. Please try again once that is finished."), workspaceName))); + private Task WarnAboutBusyWorkspaceAsync(string workspaceName) => MessageBus.INSTANCE.SendWarning(new(AppIcons.DELETE, string.Format(T("The workspace '{0}' cannot be deleted while one of its chats is being answered or transcribed. Please try again once that is finished."), workspaceName))); /// /// Moves the given chat into another workspace and shows it there in the tree. diff --git a/app/MindWork AI Studio/Dialogs/AssistantDraftDialog.razor b/app/MindWork AI Studio/Dialogs/AssistantDraftDialog.razor index 200b20924..61e4f4572 100644 --- a/app/MindWork AI Studio/Dialogs/AssistantDraftDialog.razor +++ b/app/MindWork AI Studio/Dialogs/AssistantDraftDialog.razor @@ -7,15 +7,15 @@ - - + +
- - + +
diff --git a/app/MindWork AI Studio/Dialogs/AssistantPluginAuditDialog.razor b/app/MindWork AI Studio/Dialogs/AssistantPluginAuditDialog.razor index c08f5b260..af3fe9bc2 100644 --- a/app/MindWork AI Studio/Dialogs/AssistantPluginAuditDialog.razor +++ b/app/MindWork AI Studio/Dialogs/AssistantPluginAuditDialog.razor @@ -52,7 +52,7 @@
- + @T("System Prompt")
@@ -63,7 +63,7 @@
- + @T("User Prompt Preview")
@@ -77,10 +77,10 @@ var fallbackText = promptBuilder ? T("Fallback Prompt") : T("User Prompt"); - + - + @@ -90,7 +90,7 @@
- + @T("Components")
@@ -131,7 +131,7 @@
- + @T("Plugin Structure")
@@ -163,7 +163,7 @@
- + @T("Lua Manifest")
@@ -172,12 +172,12 @@ @foreach (var file in this.luaFiles) { var fileInfo = new FileInfo(Path.Combine(this.plugin.PluginPath, file.Key)); - +
- + @@ -212,7 +212,7 @@ @if (this.audit.Findings.Count == 0 && this.audit.Level is not AssistantAuditLevel.UNKNOWN) { - + @T("Safe"): @T("No security issues were found during this check.") } @@ -224,13 +224,13 @@ @if (this.IsActivationBlockedBySettings) { - + @T("This plugin cannot be activated because its audit result is below the required safety level and your settings block activation in this case.") } else if (this.RequiresActivationConfirmation) { - + @T("This plugin is below the required safety level. Your settings still allow activation, but enabling it requires an extra confirmation because it may be unsafe.") } @@ -243,27 +243,27 @@ { AssistantAuditLevel.UNKNOWN => ( AlertStyling: "color: rgb(12,128,223); background-color: rgba(33,150,243,0.06);", - AlertIcon: Icons.Material.Filled.QuestionMark, + AlertIcon: AppIcons.UNKNOWN, ChipColor: Color.Info ), AssistantAuditLevel.DANGEROUS => ( AlertStyling: "color: rgb(242,28,13); background-color: rgba(244,67,54,0.06);", - AlertIcon: Icons.Material.Filled.Dangerous, + AlertIcon: AppIcons.SECURITY_DANGEROUS, ChipColor: Color.Error ), AssistantAuditLevel.CAUTION => ( AlertStyling: "color: rgb(214,129,0); background-color: rgba(255,152,0,0.06);", - AlertIcon: Icons.Material.Filled.Warning, + AlertIcon: AppIcons.WARNING, ChipColor: Color.Warning ), AssistantAuditLevel.SAFE => ( AlertStyling: "color: rgb(0,163,68); background-color: rgba(0,200,83,0.06);", - AlertIcon: Icons.Material.Filled.Verified, + AlertIcon: AppIcons.AUDIT_SAFE, ChipColor: Color.Success ), _ => ( AlertStyling: "color: rgb(12,128,223); background-color: rgba(33,150,243,0.06);", - AlertIcon: Icons.Material.Filled.QuestionMark, + AlertIcon: AppIcons.UNKNOWN, ChipColor: Color.Info ) }; diff --git a/app/MindWork AI Studio/Dialogs/AssistantPluginAuditDialog.razor.cs b/app/MindWork AI Studio/Dialogs/AssistantPluginAuditDialog.razor.cs index d8f45086e..53c7ba883 100644 --- a/app/MindWork AI Studio/Dialogs/AssistantPluginAuditDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/AssistantPluginAuditDialog.razor.cs @@ -279,7 +279,7 @@ public partial class AssistantPluginAuditDialog : MSGComponentBase { Text = TB("Properties"), Caption = string.Format(TB("Count: {0}"), props.Count), - Icon = Icons.Material.Filled.Code, + Icon = AppIcons.COMPONENT_PROPERTIES, Expandable = children.Count > 0, IsComponent = false, }, @@ -380,7 +380,7 @@ public partial class AssistantPluginAuditDialog : MSGComponentBase { Text = string.IsNullOrWhiteSpace(displayName) ? directoryPath : displayName, Caption = depth == 0 ? TB("Plugin root") : string.Format(TB("Items: {0}"), children.Count), - Icon = children.Count > 0 ? Icons.Material.Filled.FolderCopy : Icons.Material.Filled.Folder, + Icon = children.Count > 0 ? AppIcons.FOLDERS : AppIcons.FOLDER, Expandable = children.Count > 0, IsComponent = false, }, @@ -407,11 +407,11 @@ public partial class AssistantPluginAuditDialog : MSGComponentBase var extension = Path.GetExtension(filePath); return extension.ToLowerInvariant() switch { - ".lua" => Icons.Material.Filled.Code, - ".md" => Icons.Material.Filled.Article, - ".json" => Icons.Material.Filled.DataObject, - ".png" or ".jpg" or ".jpeg" or ".svg" or ".webp" => Icons.Material.Filled.Image, - _ => Icons.Material.Filled.InsertDriveFile, + ".lua" => AppIcons.CODE, + ".md" => AppIcons.DOCUMENT, + ".json" => AppIcons.DATA_OBJECT, + ".png" or ".jpg" or ".jpeg" or ".svg" or ".webp" => AppIcons.IMAGE, + _ => AppIcons.FILE, }; } @@ -508,14 +508,14 @@ public partial class AssistantPluginAuditDialog : MSGComponentBase private string GetValueIcon(object? value) => value switch { - null => Icons.Material.Filled.Block, - bool => Icons.Material.Outlined.ToggleOn, - string => Icons.Material.Outlined.Abc, - int => Icons.Material.Filled.Numbers, - Enum => Icons.Material.Filled.Label, - IDictionary => Icons.Material.Filled.DataObject, - IEnumerable when value is not string => Icons.Material.Filled.FormatListBulleted, - _ => Icons.Material.Filled.DataArray, + null => AppIcons.VALUE_NULL, + bool => AppIcons.SWITCH, + string => AppIcons.VALUE_TEXT, + int => AppIcons.NUMBER, + Enum => AppIcons.ENUM_VALUE, + IDictionary => AppIcons.DATA_OBJECT, + IEnumerable when value is not string => AppIcons.VALUE_LIST, + _ => AppIcons.DATA_VALUE, }; private string FormatFileTimestamp(DateTime timestamp) => CommonTools.FormatTimestampToGeneral(timestamp, this.currentCultureInfo); diff --git a/app/MindWork AI Studio/Dialogs/AssistantPluginEditorDialog.razor b/app/MindWork AI Studio/Dialogs/AssistantPluginEditorDialog.razor index bb39b568a..2bf791f0d 100644 --- a/app/MindWork AI Studio/Dialogs/AssistantPluginEditorDialog.razor +++ b/app/MindWork AI Studio/Dialogs/AssistantPluginEditorDialog.razor @@ -41,7 +41,7 @@ Disabled="@(!this.CanSave)" Color="Color.Primary" Variant="Variant.Filled" - StartIcon="@Icons.Material.Filled.Save" + StartIcon="@AppIcons.SAVE" Size="Size.Small"> @if (this.isSaving) { diff --git a/app/MindWork AI Studio/Dialogs/AssistantPluginEditorDialog.razor.cs b/app/MindWork AI Studio/Dialogs/AssistantPluginEditorDialog.razor.cs index 3210d2943..c5ed89063 100644 --- a/app/MindWork AI Studio/Dialogs/AssistantPluginEditorDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/AssistantPluginEditorDialog.razor.cs @@ -45,7 +45,7 @@ public partial class AssistantPluginEditorDialog : MSGComponentBase private bool isFullscreen; private bool CanSave => this.plugin is not null && !this.isLoading && !this.isSaving; - private string FullscreenIcon => this.isFullscreen ? Icons.Material.Filled.FullscreenExit : Icons.Material.Filled.Fullscreen; + private string FullscreenIcon => this.isFullscreen ? AppIcons.EXIT_FULLSCREEN : AppIcons.FULLSCREEN; private string FullscreenLabel => this.isFullscreen ? T("Exit fullscreen") : T("Fullscreen"); private Func Result2Copy => () => string.IsNullOrEmpty(this.pluginFile) ? string.Empty : this.pluginFile; diff --git a/app/MindWork AI Studio/Dialogs/AssistantPluginRevisionDialog.razor b/app/MindWork AI Studio/Dialogs/AssistantPluginRevisionDialog.razor index 41290ebfe..97d0f35e6 100644 --- a/app/MindWork AI Studio/Dialogs/AssistantPluginRevisionDialog.razor +++ b/app/MindWork AI Studio/Dialogs/AssistantPluginRevisionDialog.razor @@ -36,7 +36,7 @@ @if (this.isGenerating) @@ -56,14 +56,14 @@ @if (this.revisionCheckResult?.Success is true) { - + @string.Format(T("The revised assistant '{0}' is valid and ready to update."), string.IsNullOrWhiteSpace(this.revisedPluginName) ? this.revisionCheckResult.PluginName : this.revisedPluginName) } @if (!string.IsNullOrWhiteSpace(this.revisedLua)) { - + } @@ -86,7 +86,7 @@ Disabled="@(!this.CanApply)" Color="Color.Primary" Variant="Variant.Filled" - StartIcon="@Icons.Material.Filled.Save" + StartIcon="@AppIcons.SAVE" Size="Size.Small"> @T("Update assistant") diff --git a/app/MindWork AI Studio/Dialogs/ChatTemplateDialog.razor b/app/MindWork AI Studio/Dialogs/ChatTemplateDialog.razor index 8c14ae94e..75e65e54a 100644 --- a/app/MindWork AI Studio/Dialogs/ChatTemplateDialog.razor +++ b/app/MindWork AI Studio/Dialogs/ChatTemplateDialog.razor @@ -28,7 +28,7 @@ MaxLength="40" Counter="40" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Badge" + AdornmentIcon="@AppIcons.NAME" AdornmentColor="Color.Info" Validation="@this.ValidateName" Variant="Variant.Outlined" @@ -43,7 +43,7 @@ @T("Are you unsure which system prompt to use? You might start with the default system prompt that AI Studio uses for all chats.") - + @T("Use the default system prompt") @@ -74,7 +74,7 @@ + @T("Some attachments of this chat template are not on this computer. Please relink or remove them before you add the template.") } @@ -117,7 +117,7 @@ Label="@string.Format(T("Relink attachment: {0}"), attachment.OriginalPath)" HelperText="@T("Enter the full path of a file on this computer, or remove the attachment.")" Variant="Variant.Outlined" Immediate="@true" /> - + } @@ -145,7 +145,7 @@ @if (this.preselectProfile) { - + @T("Use no profile") @foreach (var profile in this.SettingsManager.ConfigurationData.Profiles) { @@ -170,7 +170,7 @@ @if (this.preselectProvider) { - + @foreach (var provider in this.SettingsManager.GetConfidentProviders(Components.CHAT)) { @@ -276,9 +276,9 @@ { - + - + } @@ -324,7 +324,7 @@ @if (!this.isInlineEditOnGoing && !this.IsReadOnly) { - + @T("Add a message") } diff --git a/app/MindWork AI Studio/Dialogs/ConfigurationPluginDeleteDialog.razor b/app/MindWork AI Studio/Dialogs/ConfigurationPluginDeleteDialog.razor index abe314995..4b9ddea36 100644 --- a/app/MindWork AI Studio/Dialogs/ConfigurationPluginDeleteDialog.razor +++ b/app/MindWork AI Studio/Dialogs/ConfigurationPluginDeleteDialog.razor @@ -14,7 +14,7 @@ @foreach (var consequence in this.Consequences) { - + @consequence } diff --git a/app/MindWork AI Studio/Dialogs/DataRestorePendingDialog.razor b/app/MindWork AI Studio/Dialogs/DataRestorePendingDialog.razor index 0a7588990..ad39c2e51 100644 --- a/app/MindWork AI Studio/Dialogs/DataRestorePendingDialog.razor +++ b/app/MindWork AI Studio/Dialogs/DataRestorePendingDialog.razor @@ -2,7 +2,7 @@ - + @T("Your backup is ready. AI Studio restarts to put it in place. Whatever you changed until then would be lost, so please restart now.") diff --git a/app/MindWork AI Studio/Dialogs/DataRestoreReportDialog.razor b/app/MindWork AI Studio/Dialogs/DataRestoreReportDialog.razor index 0ce16942c..ff59588e1 100644 --- a/app/MindWork AI Studio/Dialogs/DataRestoreReportDialog.razor +++ b/app/MindWork AI Studio/Dialogs/DataRestoreReportDialog.razor @@ -36,7 +36,7 @@ @foreach (var openPoint in this.OpenPoints) { - @this.Describe(openPoint) + @this.Describe(openPoint) } } diff --git a/app/MindWork AI Studio/Dialogs/DataRestoreReportDialog.razor.cs b/app/MindWork AI Studio/Dialogs/DataRestoreReportDialog.razor.cs index a318ef62d..814124ddb 100644 --- a/app/MindWork AI Studio/Dialogs/DataRestoreReportDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/DataRestoreReportDialog.razor.cs @@ -44,9 +44,9 @@ public partial class DataRestoreReportDialog : MSGComponentBase private string Icon => this.Report.Outcome switch { - DataRestoreOutcome.APPLIED => Icons.Material.Filled.CheckCircle, - DataRestoreOutcome.ROLLBACK_FAILED => Icons.Material.Filled.Error, - _ => Icons.Material.Filled.WarningAmber, + DataRestoreOutcome.APPLIED => AppIcons.SUCCESS, + DataRestoreOutcome.ROLLBACK_FAILED => AppIcons.ERROR, + _ => AppIcons.WARNING, }; private Color IconColor => this.Report.Outcome switch diff --git a/app/MindWork AI Studio/Dialogs/DataSourceERIV1UsernamePasswordExportDialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceERIV1UsernamePasswordExportDialog.razor index 088be8ead..cb0f56ab9 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceERIV1UsernamePasswordExportDialog.razor +++ b/app/MindWork AI Studio/Dialogs/DataSourceERIV1UsernamePasswordExportDialog.razor @@ -6,7 +6,7 @@ @string.Format(T("How should AI Studio export the username and password configuration for the ERI v1 data source '{0}'?"), this.DataSource.Name) - + @foreach (var mode in this.availableUsernamePasswordModes) { diff --git a/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor index 5be0ed1c4..912b0cfdf 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor +++ b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor @@ -21,7 +21,7 @@ Immediate="@true" Validation="@this.dataSourceValidation.ValidatingName" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Lightbulb" + AdornmentIcon="@AppIcons.NAME" AdornmentColor="Color.Info" UserAttributes="@SPELLCHECK_ATTRIBUTES" /> @@ -36,7 +36,7 @@ Immediate="@true" Validation="@this.dataSourceValidation.ValidatingHostname" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.NetworkCheck" + AdornmentIcon="@AppIcons.HOSTNAME" AdornmentColor="Color.Info" Variant="Variant.Text" UserAttributes="@SPELLCHECK_ATTRIBUTES"/> @@ -72,7 +72,7 @@ @if(this.availableAuthMethods.Count > 0 || this.dataAuthMethod != default) { - + @foreach (var authMethod in this.availableAuthMethods) { @@ -95,7 +95,7 @@ Immediate="@true" Validation="@this.dataSourceValidation.ValidateUsername" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Person2" + AdornmentIcon="@AppIcons.USERNAME" AdornmentColor="Color.Info" Variant="Variant.Text" UserAttributes="@SPELLCHECK_ATTRIBUTES"/> @@ -106,7 +106,7 @@ @if (this.availableRetrievalProcesses.Count > 0) { - + @foreach (var retrievalProcess in this.availableRetrievalProcesses) { @@ -116,7 +116,7 @@ } - + @foreach (var policy in Enum.GetValues()) { diff --git a/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor.cs b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor.cs index 6be4fee13..0039c0e0d 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor.cs @@ -354,9 +354,9 @@ public partial class DataSourceERI_V1Dialog : MSGComponentBase, ISecretId private string GetTestResultIcon() { if (!this.connectionTested) - return Icons.Material.Outlined.HourglassEmpty; + return AppIcons.PENDING; - return this.connectionSuccessfulTested ? Icons.Material.Outlined.CheckCircle : Icons.Material.Outlined.Error; + return this.connectionSuccessfulTested ? AppIcons.SUCCESS : AppIcons.ERROR; } private bool NeedsSecret() => this.dataAuthMethod is AuthMethod.TOKEN or AuthMethod.USERNAME_PASSWORD; diff --git a/app/MindWork AI Studio/Dialogs/DataSourceERI_V1InfoDialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1InfoDialog.razor index 846353231..e366c849b 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceERI_V1InfoDialog.razor +++ b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1InfoDialog.razor @@ -8,9 +8,9 @@ @T("Common data source information") - - - + + + @if (!this.IsConnectionEncrypted()) { @@ -21,13 +21,13 @@ @if (this.DataSource.AuthMethod is AuthMethod.USERNAME_PASSWORD) { - + } - + @@ -42,13 +42,13 @@ else { - + @if (!string.IsNullOrWhiteSpace(this.selectedRetrievalInfo.Link)) { - + @T("Open web link, show more information") } @@ -69,14 +69,14 @@ @for (var embeddingIndex = 0; embeddingIndex < this.selectedRetrievalInfo.Embeddings.Count; embeddingIndex++) { var embedding = this.selectedRetrievalInfo.Embeddings[embeddingIndex]; - - + + @if (!string.IsNullOrWhiteSpace(embedding.Link)) { - + @T("Open web link, show more information") } diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor index 05be158ff..48865ed86 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor @@ -24,7 +24,7 @@ Immediate="@true" Validation="@this.dataSourceValidation.ValidatingName" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Lightbulb" + AdornmentIcon="@AppIcons.NAME" AdornmentColor="Color.Info" UserAttributes="@SPELLCHECK_ATTRIBUTES" Variant="Variant.Outlined" @@ -39,7 +39,7 @@ Counter="200" Immediate="@true" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Description" + AdornmentIcon="@AppIcons.DESCRIPTION" AdornmentColor="Color.Info" HelperText="@T("Describe what data this directory contains to help the AI select it.")" UserAttributes="@SPELLCHECK_ATTRIBUTES" @@ -79,7 +79,7 @@ Immediate="@true" Validation="@this.dataSourceValidation.ValidateFilePatterns" Adornment="Adornment.End" - AdornmentIcon="@Icons.Material.Filled.Restore" + AdornmentIcon="@AppIcons.RESTORE_DEFAULT" OnAdornmentClick="@this.RestoreDefaultFilePatterns" AdornmentAriaLabel="@T("Restore default patterns")" UserAttributes="@SPELLCHECK_ATTRIBUTES" @@ -99,7 +99,7 @@ @T("Choose an embedding provider to make this data source searchable.") - + @foreach (var provider in this.SettingsManager.GetAllEmbeddingProviders()) { @@ -124,7 +124,7 @@ @T("Data sharing") - + @foreach (var level in this.ConfidenceLevels) { @@ -143,7 +143,7 @@ } - + @(this.showExpertSettings ? T("Hide Expert Settings") : T("Show Expert Settings")) @@ -188,7 +188,7 @@ ReadOnly="@true" Variant="Variant.Outlined" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.TextFields" + AdornmentIcon="@AppIcons.TOKENIZER" AdornmentColor="Color.Info"/> } @T("Search results") diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor index 536df567e..95d5bb0ca 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor @@ -3,19 +3,19 @@ - + @if (!string.IsNullOrWhiteSpace(this.DataSource.Description)) { } - - - @if (this.IsOperationInProgress) diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor index 39e638f80..648298224 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor @@ -24,7 +24,7 @@ Immediate="@true" Validation="@this.dataSourceValidation.ValidatingName" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Lightbulb" + AdornmentIcon="@AppIcons.NAME" AdornmentColor="Color.Info" UserAttributes="@SPELLCHECK_ATTRIBUTES" Variant="Variant.Outlined" @@ -39,7 +39,7 @@ Counter="200" Immediate="@true" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Description" + AdornmentIcon="@AppIcons.DESCRIPTION" AdornmentColor="Color.Info" HelperText="@T("Describe what data this file contains to help the AI select it.")" UserAttributes="@SPELLCHECK_ATTRIBUTES" @@ -61,7 +61,7 @@ @T("Choose an embedding provider to make this data source searchable.") - + @foreach (var provider in this.SettingsManager.GetAllEmbeddingProviders()) { @@ -86,7 +86,7 @@ @T("Data sharing") - + @foreach (var level in this.ConfidenceLevels) { @@ -105,7 +105,7 @@ } - + @(this.showExpertSettings ? T("Hide Expert Settings") : T("Show Expert Settings")) @@ -124,7 +124,7 @@ ReadOnly="@true" Variant="Variant.Outlined" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.TextFields" + AdornmentIcon="@AppIcons.TOKENIZER" AdornmentColor="Color.Info"/> } @T("Search results") diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor index b8cda3fbe..485a47c9a 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor @@ -3,13 +3,13 @@ - + @if (!string.IsNullOrWhiteSpace(this.DataSource.Description)) { } - + @if (!this.IsFileAvailable) { @@ -23,7 +23,7 @@ } - + @if (this.IsCloudEmbedding) { @@ -38,9 +38,9 @@ } - + - + diff --git a/app/MindWork AI Studio/Dialogs/DataSourceMailboxDialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceMailboxDialog.razor index 705962457..843f54aac 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceMailboxDialog.razor +++ b/app/MindWork AI Studio/Dialogs/DataSourceMailboxDialog.razor @@ -64,7 +64,7 @@ Immediate="@true" Validation="@this.dataSourceValidation.ValidatingName" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Lightbulb" + AdornmentIcon="@AppIcons.NAME" AdornmentColor="Color.Info" UserAttributes="@SPELLCHECK_ATTRIBUTES" Variant="Variant.Outlined" @@ -93,12 +93,12 @@ } @* No adornment: the field shows the chosen entry together with its icon, see the entries below. They use the size and spacing of ProviderLabel, so a logo and a Material icon line up. *@ - + @if (!this.AllowsOnlyOrganizationMailServers) { - + @T("Another provider") @@ -107,7 +107,7 @@ { - + @organizationProvider.Name @@ -120,7 +120,7 @@ @if (string.IsNullOrEmpty(template.IconUrl)) { - + } else { @@ -175,7 +175,7 @@ @* Settings AI Studio fills in wait behind a button, so the sign-in follows the choice of the provider directly: *@ @if (this.AreServerSettingsFilledIn) { - + @(this.showServerDetails ? T("Hide Server Details") : T("Show Server Details")) } @@ -197,7 +197,7 @@ ReadOnly="@(!this.CanChangeSource || this.AllowsOnlyOrganizationMailServers)" Validation="@this.ValidateHost" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Dns" + AdornmentIcon="@AppIcons.SERVER" AdornmentColor="Color.Info" Variant="Variant.Outlined" UserAttributes="@SPELLCHECK_ATTRIBUTES"/> @@ -214,7 +214,7 @@ Variant="Variant.Outlined"/> - + @foreach (var transportSecurity in ConfigurationSelectDataFactory.GetMailboxTransportSecurityData()) { @@ -239,7 +239,7 @@ ReadOnly="@(!this.CanChangeSource)" Validation="@DataSourceValidation.ValidateMailboxUsername" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Person2" + AdornmentIcon="@AppIcons.USERNAME" AdornmentColor="Color.Info" Variant="Variant.Outlined" UserAttributes="@SPELLCHECK_ATTRIBUTES"/> @@ -286,7 +286,7 @@ ReadOnly="@true" HelperText="@(this.CanChangeSource ? T("Test the connection to select another folder.") : string.Empty)" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Folder" + AdornmentIcon="@AppIcons.FOLDER" Variant="Variant.Outlined"/> } @if (!string.IsNullOrWhiteSpace(this.folderIssue)) @@ -301,7 +301,7 @@ } - + @foreach (var maxAge in ConfigurationSelectDataFactory.GetMailboxMaxAgeData()) { @@ -328,7 +328,7 @@ Validation="@DataSourceValidation.ValidateMailboxMaxAttachmentSize" HelperText="@T("Of a larger attachment, only the name is indexed.")" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.AttachFile" + AdornmentIcon="@AppIcons.ATTACH_FILE" AdornmentColor="Color.Info" Variant="Variant.Outlined"/> } @@ -336,7 +336,7 @@ @T("In order for the AI to be able to determine the appropriate data at any time, you must choose an embedding provider.") - + @foreach (var provider in this.SettingsManager.GetAllEmbeddingProviders()) { @@ -359,7 +359,7 @@ } } - + @foreach (var level in ConfigurationSelectDataFactory.GetMailboxConfidenceLevelsData()) { @@ -374,7 +374,7 @@ - + @(this.showExpertSettings ? T("Hide Expert Settings") : T("Show Expert Settings")) @@ -394,7 +394,7 @@ HelperText="@this.MaxChunkTokenLengthHelperText" Variant="Variant.Outlined" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.FormatListNumbered" + AdornmentIcon="@AppIcons.NUMERIC_LIMIT" AdornmentColor="Color.Info"/> diff --git a/app/MindWork AI Studio/Dialogs/DataSourceMailboxDialog.razor.cs b/app/MindWork AI Studio/Dialogs/DataSourceMailboxDialog.razor.cs index ee31dc21c..c003df6aa 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceMailboxDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/DataSourceMailboxDialog.razor.cs @@ -362,8 +362,8 @@ public partial class DataSourceMailboxDialog : MSGComponentBase : this.testFailure is null ? Color.Success : Color.Error; private string TestResultIcon => this.testedSettings != this.CurrentSettings - ? Icons.Material.Outlined.HourglassEmpty - : this.testFailure is null ? Icons.Material.Outlined.CheckCircle : Icons.Material.Outlined.Error; + ? AppIcons.PENDING + : this.testFailure is null ? AppIcons.SUCCESS : AppIcons.ERROR; private EmbeddingProvider? SelectedEmbedding => this.SettingsManager.ConfigurationData.EmbeddingProviders .FirstOrDefault(x => x.Id == this.dataEmbeddingId); diff --git a/app/MindWork AI Studio/Dialogs/DirectChatLauncherSettingsDialog.razor b/app/MindWork AI Studio/Dialogs/DirectChatLauncherSettingsDialog.razor index c6991b766..f4d511a06 100644 --- a/app/MindWork AI Studio/Dialogs/DirectChatLauncherSettingsDialog.razor +++ b/app/MindWork AI Studio/Dialogs/DirectChatLauncherSettingsDialog.razor @@ -24,9 +24,9 @@ @* The dashed frame shows that these fields belong together: they describe one chat the launcher tile opens. *@ - - - + + + + @@ -60,7 +60,7 @@ Disabled="@(!this.CanSave)" Color="Color.Primary" Variant="Variant.Filled" - StartIcon="@Icons.Material.Filled.Save" + StartIcon="@AppIcons.SAVE" Size="Size.Small"> @T("Save tile") diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingMethodDialog.razor b/app/MindWork AI Studio/Dialogs/EmbeddingMethodDialog.razor index 60118e391..fdb36e522 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingMethodDialog.razor +++ b/app/MindWork AI Studio/Dialogs/EmbeddingMethodDialog.razor @@ -11,7 +11,7 @@ HelperText="@T("The name of the embedding method.")" Class="mb-3" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Label" + AdornmentIcon="@AppIcons.NAME" AdornmentColor="Color.Info" Validation="@this.ValidateName" Counter="26" @@ -27,7 +27,7 @@ Label="@T("Embedding Type")" HelperText="@T("What kind of embedding is used. For example, Transformer Embedding, Contextual Word Embedding, Graph Embedding, etc.")" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Extension" + AdornmentIcon="@AppIcons.TYPE" AdornmentColor="Color.Info" Counter="56" MaxLength="56" @@ -37,8 +37,8 @@ /> - - + + @* ReSharper disable once CSharpWarnings::CS8974 *@ @@ -54,7 +54,7 @@ Variant="Variant.Outlined" Class="mb-3" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Extension" + AdornmentIcon="@AppIcons.DESCRIPTION" AdornmentColor="Color.Info" Validation="@this.ValidateDescription" UserAttributes="@SPELLCHECK_ATTRIBUTES" @@ -73,7 +73,7 @@ Variant="Variant.Outlined" Class="mb-3" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Assessment" + AdornmentIcon="@AppIcons.USAGE_CONDITION" AdornmentColor="Color.Info" Validation="@this.ValidateUsedWhen" UserAttributes="@SPELLCHECK_ATTRIBUTES" @@ -87,7 +87,7 @@ HelperText="@T("A link to the embedding, e.g., to the model, the source code, the paper, it's Wikipedia page, etc.")" Class="mb-3" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Link" + AdornmentIcon="@AppIcons.LINK" AdornmentColor="Color.Info" UserAttributes="@SPELLCHECK_ATTRIBUTES" /> diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor index 35a7faf06..94e1b7aac 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor +++ b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor @@ -14,7 +14,7 @@ @* ReSharper disable once CSharpWarnings::CS8974 *@ - + @foreach (LLMProviders provider in Enum.GetValues(typeof(LLMProviders))) { if (provider.ProvideEmbeddingAPI || provider is LLMProviders.NONE) @@ -25,7 +25,7 @@ } } - + @T("Create account") @@ -51,7 +51,7 @@ Label="@T("Hostname")" Class="mb-3" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Dns" + AdornmentIcon="@AppIcons.SERVER" AdornmentColor="Color.Info" Disabled="@this.IsEnterpriseConfiguration" Validation="@this.providerValidation.ValidatingHostname" @@ -60,7 +60,7 @@ @if (this.DataLLMProvider.IsHostNeeded) { - + @foreach (Host host in Enum.GetValues(typeof(Host))) { if (host.IsEmbeddingSupported) @@ -75,7 +75,7 @@ @if (this.DataLLMProvider.IsHFInstanceProviderNeeded) { - + @foreach (HFInferenceProvider inferenceProvider in Enum.GetValues(typeof(HFInferenceProvider))) { @if (inferenceProvider.SupportsEmbeddings) @@ -93,7 +93,7 @@ - + @T("Load") @if (this.availableModels.Count is 0) @@ -105,7 +105,7 @@ else { @foreach (var model in this.availableModels) @@ -147,7 +147,7 @@ Counter="40" Immediate="@true" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Lightbulb" + AdornmentIcon="@AppIcons.NAME" AdornmentColor="Color.Info" Disabled="@this.IsEnterpriseConfiguration" Validation="@this.providerValidation.ValidatingInstanceName" @@ -171,7 +171,7 @@ Min="1" Immediate="@true" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Numbers" + AdornmentIcon="@AppIcons.NUMBER" AdornmentColor="Color.Info" Disabled="@this.IsEnterpriseConfiguration" Validation="@this.ValidateTokenLimit" @@ -184,7 +184,7 @@ Min="1" Immediate="@true" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.FormatListNumbered" + AdornmentIcon="@AppIcons.NUMERIC_LIMIT" AdornmentColor="Color.Info" Disabled="@this.IsEnterpriseConfiguration" Validation="@this.ValidateEmbeddingBatchSize" @@ -200,7 +200,7 @@ Disabled="@this.IsEnterpriseConfiguration" Validation="@this.providerValidation.ValidatingCustomTokenizer" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.AttachFile" + AdornmentIcon="@AppIcons.FILE" UserAttributes="@SPELLCHECK_ATTRIBUTES" Variant="Variant.Outlined" Clearable="@true" @@ -208,7 +208,7 @@ ErrorText="@this.dataCustomTokenizerValidationIssue" OnClearButtonClick="@this.ClearPathTokenizer" /> - + @T("Choose File") diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs index 1cb0eae3c..29ced0ad1 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs @@ -454,7 +454,7 @@ public partial class EmbeddingProviderDialog : MSGComponentBase, ISecretId } this.Logger.LogWarning("None of the {Count} dropped path(s) could be used as a tokenizer.", paths.Count); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.Warning, T("Please drop a tokenizer file in the JSON format."))); + await this.MessageBus.SendWarning(new(AppIcons.WARNING, T("Please drop a tokenizer file in the JSON format."))); } private async Task OnDataFilePathChanged(string? changedFilePath) diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingResultDialog.razor b/app/MindWork AI Studio/Dialogs/EmbeddingResultDialog.razor index 5094a72fb..9dc7ad1f1 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingResultDialog.razor +++ b/app/MindWork AI Studio/Dialogs/EmbeddingResultDialog.razor @@ -11,7 +11,7 @@ MaxLines="25" ReadOnly="true" Label="@this.ResultLabelText" - AdornmentIcon="@Icons.Material.Filled.DataObject" + AdornmentIcon="@AppIcons.EMBEDDING_VECTOR" Adornment="Adornment.Start"/> diff --git a/app/MindWork AI Studio/Dialogs/InformationDialog.razor.cs b/app/MindWork AI Studio/Dialogs/InformationDialog.razor.cs index 3d58e6765..c79de9cc6 100644 --- a/app/MindWork AI Studio/Dialogs/InformationDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/InformationDialog.razor.cs @@ -23,7 +23,7 @@ public partial class InformationDialog : MSGComponentBase /// The icon shown next to the message. ///
[Parameter] - public string Icon { get; set; } = Icons.Material.Filled.Info; + public string Icon { get; set; } = AppIcons.INFO; /// /// The color of the icon. diff --git a/app/MindWork AI Studio/Dialogs/PandocDialog.razor b/app/MindWork AI Studio/Dialogs/PandocDialog.razor index c4f2ac3e2..9b6f928ef 100644 --- a/app/MindWork AI Studio/Dialogs/PandocDialog.razor +++ b/app/MindWork AI Studio/Dialogs/PandocDialog.razor @@ -21,7 +21,7 @@
- + @if (this.isLoadingLicence) { @@ -34,22 +34,22 @@ } - + @T("""Pandoc is distributed under the GNU General Public License v2 (GPL). By clicking "Accept GPL and Install," you agree to the terms of the GPL license, and Pandoc will be installed automatically for you. Software under GPL is free of charge and free to use.""") - + @T("Accept the GPL and start the installation") - + @T("If you want to install Pandoc yourself, follow one of these two guides. The first guide uses an installer and is available for Windows and macOS. Alternatively, you might use a package manager of your operating system to install Pandoc.") - + @@ -72,12 +72,12 @@ @T("""Pandoc is distributed under the GNU General Public License v2 (GPL). By clicking "Accept GPL and download installer," you agree to the terms of the GPL license. Software under GPL is free of charge and free to use.""") - + @T("Accept the GPL and download the installer") - + @@ -125,7 +125,7 @@ - + @T("Accept the GPL and download the archive") @@ -154,7 +154,7 @@ { case { CheckWasSuccessful: true, IsAvailable: true }: - + @T("Pandoc is installed and the version meets the requirements of MindWork AI Studio.") @@ -163,7 +163,7 @@ case { CheckWasSuccessful: true, IsAvailable: false }: - + @T("Pandoc is installed, but the version is too old and does not meet the requirements of MindWork AI Studio. AI Studio can help you install a newer version.") @@ -172,7 +172,7 @@ case { CheckWasSuccessful: false }: - + @T("Pandoc doesn't seem to be installed on this system. AI Studio can help you install the correct version.") diff --git a/app/MindWork AI Studio/Dialogs/PluginImportDialog.razor b/app/MindWork AI Studio/Dialogs/PluginImportDialog.razor index 3bb882cc0..e28079896 100644 --- a/app/MindWork AI Studio/Dialogs/PluginImportDialog.razor +++ b/app/MindWork AI Studio/Dialogs/PluginImportDialog.razor @@ -72,7 +72,7 @@ @foreach (var content in this.ConfigurationContents) { - + @content } diff --git a/app/MindWork AI Studio/Dialogs/PluginInfoDialog.razor b/app/MindWork AI Studio/Dialogs/PluginInfoDialog.razor index 1df4e5186..774c18135 100644 --- a/app/MindWork AI Studio/Dialogs/PluginInfoDialog.razor +++ b/app/MindWork AI Studio/Dialogs/PluginInfoDialog.razor @@ -7,24 +7,24 @@ - + @this.Plugin.Description - + @this.TypeText - + @this.Plugin.Version - + @this.LastChangedText - + @this.AuthorsText @if (!string.IsNullOrWhiteSpace(this.Plugin.SupportContact)) { - + @this.SupportContactText @@ -40,13 +40,13 @@ } - + @this.CategoriesText - + @this.TargetGroupsText - + @this.Plugin.Id @@ -54,7 +54,7 @@ @if (this.Plugin.IsManagedByConfigServer) { - + @T("Managed by your organization") } diff --git a/app/MindWork AI Studio/Dialogs/PluginInfoDialog.razor.cs b/app/MindWork AI Studio/Dialogs/PluginInfoDialog.razor.cs index 2e792b7f2..c56ad92e2 100644 --- a/app/MindWork AI Studio/Dialogs/PluginInfoDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/PluginInfoDialog.razor.cs @@ -52,7 +52,7 @@ public partial class PluginInfoDialog : MSGComponentBase private string SourceLabel => this.IsSourceAMail ? this.T("Email contact") : this.T("Related link"); - private string SourceIcon => this.IsSourceAMail ? Icons.Material.Filled.ContactMail : Icons.Material.Filled.Link; + private string SourceIcon => this.IsSourceAMail ? AppIcons.EMAIL : AppIcons.LINK; /// /// Shows a link the way the user recognizes it: a mail address without its scheme, and a placeholder diff --git a/app/MindWork AI Studio/Dialogs/ProfileDialog.razor b/app/MindWork AI Studio/Dialogs/ProfileDialog.razor index 6b9144466..95e81abfc 100644 --- a/app/MindWork AI Studio/Dialogs/ProfileDialog.razor +++ b/app/MindWork AI Studio/Dialogs/ProfileDialog.razor @@ -23,7 +23,7 @@ MaxLength="40" Counter="40" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Badge" + AdornmentIcon="@AppIcons.NAME" AdornmentColor="Color.Info" Validation="@this.ValidateName" Variant="Variant.Outlined" @@ -35,7 +35,7 @@ T="string" @bind-Text="@this.DataNeedToKnow" Validation="@this.ValidateNeedToKnow" - AdornmentIcon="@Icons.Material.Filled.ListAlt" + AdornmentIcon="@AppIcons.PROMPT" Adornment="Adornment.Start" Immediate="@true" Label="@T("What should the AI know about you?")" @@ -53,7 +53,7 @@ T="string" @bind-Text="@this.DataActions" Validation="@this.ValidateActions" - AdornmentIcon="@Icons.Material.Filled.ListAlt" + AdornmentIcon="@AppIcons.PROMPT" Adornment="Adornment.Start" Immediate="@true" Label="@T("What should the AI do for you?")" diff --git a/app/MindWork AI Studio/Dialogs/PromptInjectionAlertDialog.razor b/app/MindWork AI Studio/Dialogs/PromptInjectionAlertDialog.razor index 0edf16c2c..69cdbe56b 100644 --- a/app/MindWork AI Studio/Dialogs/PromptInjectionAlertDialog.razor +++ b/app/MindWork AI Studio/Dialogs/PromptInjectionAlertDialog.razor @@ -6,7 +6,7 @@ - + @@ -30,7 +30,7 @@ @(this.showPromptInjectionInformation ? T("Hide more information") : T("More information")) @@ -45,7 +45,7 @@ - + @T("Source type") @@ -58,7 +58,7 @@ - + @T("Content source") @@ -71,7 +71,7 @@ - + @T("Removed content") diff --git a/app/MindWork AI Studio/Dialogs/PromptingGuidelineDialog.razor b/app/MindWork AI Studio/Dialogs/PromptingGuidelineDialog.razor index a3f77de2d..6f68e4ead 100644 --- a/app/MindWork AI Studio/Dialogs/PromptingGuidelineDialog.razor +++ b/app/MindWork AI Studio/Dialogs/PromptingGuidelineDialog.razor @@ -8,7 +8,7 @@ } - + @T("Create account") @@ -53,7 +53,7 @@ Label="@T("Hostname")" Class="mb-3" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Dns" + AdornmentIcon="@AppIcons.SERVER" AdornmentColor="Color.Info" Disabled="@this.IsEnterpriseConfiguration" Validation="@this.providerValidation.ValidatingHostname" @@ -62,7 +62,7 @@ @if (this.DataLLMProvider.IsHostNeeded) { - + @foreach (Host host in Enum.GetValues(typeof(Host))) { @if (host.IsChatSupported) @@ -77,7 +77,7 @@ @if (this.DataLLMProvider.IsHFInstanceProviderNeeded) { - + @foreach (HFInferenceProvider inferenceProvider in Enum.GetValues(typeof(HFInferenceProvider))) { @if (inferenceProvider.SupportsChat) @@ -99,7 +99,7 @@ @if (this.DataLLMProvider.IsLLMModelProvidedManually) { - + @T("Show available models") + @T("Show available models") } - + @T("Load models") @if(this.availableModels.Count is 0) @@ -137,7 +137,7 @@ @foreach (var model in this.availableModels) { @@ -176,7 +176,7 @@ Counter="40" Immediate="@true" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Lightbulb" + AdornmentIcon="@AppIcons.NAME" AdornmentColor="Color.Info" Disabled="@this.IsEnterpriseConfiguration" Validation="@this.providerValidation.ValidatingInstanceName" @@ -220,7 +220,7 @@ @T("Reset") @@ -237,7 +237,7 @@ HelperText="@this.GetReasoningOverrideModeDescription(this.GetReasoningOverrideMode())" Variant="Variant.Outlined" Margin="Margin.Dense" - OpenIcon="@Icons.Material.Filled.Psychology" + OpenIcon="@AppIcons.REASONING" AdornmentColor="Color.Info" Adornment="Adornment.Start" Disabled="@this.IsEnterpriseConfiguration"> @@ -271,7 +271,7 @@ Clearable="@true" Disabled="@this.IsEnterpriseConfiguration" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Straighten" + AdornmentIcon="@AppIcons.CONTEXT_WINDOW" AdornmentColor="Color.Info" /> @@ -328,7 +328,7 @@ Disabled="@this.IsEnterpriseConfiguration" Validation="@this.providerValidation.ValidatingCustomTokenizer" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.AttachFile" + AdornmentIcon="@AppIcons.FILE" UserAttributes="@SPELLCHECK_ATTRIBUTES" Variant="Variant.Outlined" Clearable="@true" @@ -336,7 +336,7 @@ ErrorText="@this.dataCustomTokenizerValidationIssue" OnClearButtonClick="@this.ClearPathTokenizer" /> - + @T("Choose File") diff --git a/app/MindWork AI Studio/Dialogs/ProviderDialog.razor.cs b/app/MindWork AI Studio/Dialogs/ProviderDialog.razor.cs index 8d25044ca..7cb6c6598 100644 --- a/app/MindWork AI Studio/Dialogs/ProviderDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/ProviderDialog.razor.cs @@ -483,7 +483,7 @@ public partial class ProviderDialog : MSGComponentBase, ISecretId } this.Logger.LogWarning("None of the {Count} dropped path(s) could be used as a tokenizer.", paths.Count); - await this.MessageBus.SendWarning(new(Icons.Material.Filled.Warning, T("Please drop a tokenizer file in the JSON format."))); + await this.MessageBus.SendWarning(new(AppIcons.WARNING, T("Please drop a tokenizer file in the JSON format."))); } private async Task OnDataFilePathChanged(string? changedFilePath) diff --git a/app/MindWork AI Studio/Dialogs/RetrievalProcessDialog.razor b/app/MindWork AI Studio/Dialogs/RetrievalProcessDialog.razor index 154b888d0..90768c2ae 100644 --- a/app/MindWork AI Studio/Dialogs/RetrievalProcessDialog.razor +++ b/app/MindWork AI Studio/Dialogs/RetrievalProcessDialog.razor @@ -22,7 +22,7 @@ HelperText="@T("The name of your retrieval process.")" Class="mb-3" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Label" + AdornmentIcon="@AppIcons.NAME" AdornmentColor="Color.Info" Validation="@this.ValidateName" Counter="26" @@ -44,7 +44,7 @@ Variant="Variant.Outlined" Class="mb-3" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Extension" + AdornmentIcon="@AppIcons.DESCRIPTION" AdornmentColor="Color.Info" Validation="@this.ValidateDescription" UserAttributes="@SPELLCHECK_ATTRIBUTES" @@ -58,7 +58,7 @@ HelperText="@T("A link to the retrieval process, e.g., the source code, the paper, it's Wikipedia page, etc. Make sense for common retrieval processes. Leave empty if not applicable.")" Class="mb-6" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Link" + AdornmentIcon="@AppIcons.LINK" AdornmentColor="Color.Info" UserAttributes="@SPELLCHECK_ATTRIBUTES" /> @@ -79,7 +79,7 @@ @foreach (var parameter in this.retrievalParameters) { - + @parameter.Name } @@ -117,7 +117,7 @@ HelperText="@T("The parameter name. It must be unique within the retrieval process.")" Class="mb-3" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Label" + AdornmentIcon="@AppIcons.NAME" AdornmentColor="Color.Info" Counter="26" MaxLength="26" @@ -138,7 +138,7 @@ Variant="Variant.Outlined" Class="mb-3" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Extension" + AdornmentIcon="@AppIcons.DESCRIPTION" AdornmentColor="Color.Info" Validation="@this.ValidateParameterDescription" UserAttributes="@SPELLCHECK_ATTRIBUTES"/> diff --git a/app/MindWork AI Studio/Dialogs/ReviewAttachmentsDialog.razor b/app/MindWork AI Studio/Dialogs/ReviewAttachmentsDialog.razor index c25992ec9..bea6f6cbe 100644 --- a/app/MindWork AI Studio/Dialogs/ReviewAttachmentsDialog.razor +++ b/app/MindWork AI Studio/Dialogs/ReviewAttachmentsDialog.razor @@ -47,7 +47,7 @@ { currentFolder = folderPath; - + @folderPath: @@ -60,7 +60,7 @@
- + @fileAttachment.FileName @@ -76,7 +76,7 @@ - @@ -84,7 +84,7 @@ @if (this.CanRemove) { - @@ -98,7 +98,7 @@
- + @fileAttachment.FileName @@ -117,14 +117,14 @@ @if (fileAttachment.ProvenanceId is not null) { - } else { - } @@ -132,7 +132,7 @@ @if (this.CanRemove) { - diff --git a/app/MindWork AI Studio/Dialogs/ReviewAttachmentsDialog.razor.cs b/app/MindWork AI Studio/Dialogs/ReviewAttachmentsDialog.razor.cs index f1acaa8b6..b5c15170a 100644 --- a/app/MindWork AI Studio/Dialogs/ReviewAttachmentsDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/ReviewAttachmentsDialog.razor.cs @@ -160,7 +160,7 @@ public partial class ReviewAttachmentsDialog : MSGComponentBase // so it never gets in the way of the next drop. // if (attached.Count > 0) - await this.MessageBus.SendSuccess(new(Icons.Material.Filled.AttachFile, attached.Count is 1 + await this.MessageBus.SendSuccess(new(AppIcons.ATTACH_FILE, attached.Count is 1 ? string.Format(T("Attached {0}."), attached[0].FileName) : string.Format(T("Attached {0} files."), attached.Count))); diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAgenda.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAgenda.razor index 82bf18225..93f2bc54a 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAgenda.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAgenda.razor @@ -4,24 +4,24 @@ - + @T("Assistant: Agenda Planner Options") - - - - - - + + + + + + - + @@ -30,7 +30,7 @@ @if (this.SettingsManager.ConfigurationData.Agenda.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor index afe89ab2e..80518c605 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor @@ -3,7 +3,7 @@ - + @T("Assistant: Bias of the Day Options") @@ -15,7 +15,7 @@ @this.StatText - + @T("Reset") @@ -25,7 +25,7 @@ @if (this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBuilder.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBuilder.razor index 0f19cee24..33c9442b4 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBuilder.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBuilder.razor @@ -4,7 +4,7 @@ - + @T("Assistant: Assistant Builder defaults") @@ -14,7 +14,7 @@ @if (this.SettingsManager.ConfigurationData.AssistantBuilder.PreselectedOutputLanguage is CommonLanguages.OTHER) { - + } diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBatchProcessing.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBatchProcessing.razor index cad0e98dc..8ce3b82f8 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBatchProcessing.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBatchProcessing.razor @@ -7,7 +7,7 @@ - + @T("Assistant: Batch Processing defaults") @@ -25,7 +25,7 @@ @T("Files to include") - + @@ -39,12 +39,12 @@ @if (this.SettingsManager.ConfigurationData.BatchProcessing.PromptSource is BatchProcessingPromptSource.FREE_PROMPT) { - + } else if (this.SettingsManager.ConfigurationData.BatchProcessing.PromptSource is BatchProcessingPromptSource.FILE_IMPORT) { - + } else { @@ -75,12 +75,12 @@ } else { - - + + @if (this.SettingsManager.ConfigurationData.BatchProcessing.CsvSeparator is BatchProcessingCsvSeparator.CUSTOM) { - + } } diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBeyondFactsLab.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBeyondFactsLab.razor index a865661d3..2c6bd54e7 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBeyondFactsLab.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBeyondFactsLab.razor @@ -4,7 +4,7 @@ - + @T("Assistant: BeyondFacts Lab Options") @@ -19,7 +19,7 @@ @* Only whoever develops the prompts further needs these settings, so they stay folded away. *@ - + @(this.showExpertSettings ? T("Hide Expert Settings") : T("Show Expert Settings")) @@ -29,10 +29,10 @@ - + @T("Open test folder") - + @T("Copy the built-in prompts into the test folder") diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBeyondFactsLab.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBeyondFactsLab.razor.cs index 3826af93c..f2bd8da54 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBeyondFactsLab.razor.cs +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBeyondFactsLab.razor.cs @@ -79,7 +79,7 @@ public partial class SettingsDialogBeyondFactsLab : SettingsDialogBase catch (Exception exception) { this.Logger.LogWarning(exception, "Could not open the test folder of the BeyondFacts Lab."); - await this.MessageBus.SendError(new(Icons.Material.Filled.FolderOpen, T("Could not open the test folder."))); + await this.MessageBus.SendError(new(AppIcons.FOLDER_OPEN, T("Could not open the test folder."))); return; } @@ -87,7 +87,7 @@ public partial class SettingsDialogBeyondFactsLab : SettingsDialogBase return; var issue = string.IsNullOrWhiteSpace(response.Issue) ? T("Unknown error") : response.Issue; - await this.MessageBus.SendError(new(Icons.Material.Filled.FolderOpen, string.Format(T("Could not open the test folder: {0}"), issue))); + await this.MessageBus.SendError(new(AppIcons.FOLDER_OPEN, string.Format(T("Could not open the test folder: {0}"), issue))); } /// @@ -100,14 +100,14 @@ public partial class SettingsDialogBeyondFactsLab : SettingsDialogBase try { var copied = await BflPromptOverrides.CopyBuiltInAsync(this.Store.PromptOverridesDirectory); - await this.MessageBus.SendSuccess(new(Icons.Material.Filled.ContentCopy, copied is 0 + await this.MessageBus.SendSuccess(new(AppIcons.COPY, copied is 0 ? T("The test folder holds every prompt already. AI Studio changed no file.") : string.Format(T("Files copied into the test folder: {0}. Files which were there already stay as they are."), copied))); } catch (Exception exception) when (exception is IOException or UnauthorizedAccessException) { this.Logger.LogWarning(exception, "Could not copy the prompts of the BeyondFacts Lab into the test folder."); - await this.MessageBus.SendError(new(Icons.Material.Filled.ContentCopy, T("Could not copy the prompts into the test folder."))); + await this.MessageBus.SendError(new(AppIcons.COPY, T("Could not copy the prompts into the test folder."))); } finally { diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChat.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChat.razor index 901323763..38154532c 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChat.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChat.razor @@ -5,7 +5,7 @@ - + @T("Chat Options") diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChatTemplate.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChatTemplate.razor index f08096118..26b61020b 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChatTemplate.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChatTemplate.razor @@ -4,7 +4,7 @@ - + @T("Your Chat Templates") @@ -36,10 +36,10 @@ { - + - + } @@ -47,7 +47,7 @@ { - + @if (context.FileAttachments.Count == 0) { @@ -56,18 +56,18 @@ else if (this.SettingsManager.ConfigurationData.App.ShowAdminSettings) { - - + + @T("Use shared attachment paths") - + @T("Copy attachments into plugin") } - + } @@ -85,10 +85,10 @@ @* In the footer, adding and importing stay in reach however long the table grows: *@ - + @T("Add Chat Template") - + diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor index 45fc7a6f8..7df0027ae 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor @@ -4,7 +4,7 @@ - + @T("Assistant: Coding Options") diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor index 78432a189..1a1414e53 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor @@ -4,7 +4,7 @@ - + @T("Configured Data Sources") diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogERIServer.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogERIServer.razor index e036b5d56..e441a4ead 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogERIServer.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogERIServer.razor @@ -5,7 +5,7 @@ - + @T("Assistant: ERI Server Options") diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogGrammarSpelling.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogGrammarSpelling.razor index 2c9999348..a7ab40a68 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogGrammarSpelling.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogGrammarSpelling.razor @@ -4,7 +4,7 @@ - + @T("Assistant: Grammar & Spelling Checker Options") @@ -14,7 +14,7 @@ @if (this.SettingsManager.ConfigurationData.GrammarSpelling.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogI18N.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogI18N.razor index f03d2fda8..795250cd0 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogI18N.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogI18N.razor @@ -4,7 +4,7 @@ - + @T("Assistant: Localization") @@ -14,7 +14,7 @@ @if (this.SettingsManager.ConfigurationData.I18N.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogIconFinder.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogIconFinder.razor index 207766a43..dc1040c27 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogIconFinder.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogIconFinder.razor @@ -4,7 +4,7 @@ - + @T("Assistant: Icon Finder Options") diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogJobPostings.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogJobPostings.razor index 125ffdfdd..2131a8140 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogJobPostings.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogJobPostings.razor @@ -4,24 +4,24 @@ - + @T("Assistant: Job Posting Options") - - - - - - - + + + + + + + @if (this.SettingsManager.ConfigurationData.JobPostings.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogLegalCheck.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogLegalCheck.razor index ba2e8f384..dbcbbdce0 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogLegalCheck.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogLegalCheck.razor @@ -3,7 +3,7 @@ - + @T("Assistant: Legal Check Options") diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogMyTasks.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogMyTasks.razor index 4b4adf0a9..d7c378338 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogMyTasks.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogMyTasks.razor @@ -4,7 +4,7 @@ - + @T("Assistant: My Tasks Options") @@ -14,7 +14,7 @@ @if (this.SettingsManager.ConfigurationData.MyTasks.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogProfiles.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogProfiles.razor index d453b802c..a5fc5f792 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogProfiles.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogProfiles.razor @@ -4,7 +4,7 @@ - + @T("Your Profiles") @@ -35,10 +35,10 @@ { - + - + } @@ -46,11 +46,11 @@ { - + - + } @@ -68,10 +68,10 @@ @* In the footer, adding and importing stay in reach however long the table grows: *@ - + @T("Add Profile") - + diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPromptOptimizer.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPromptOptimizer.razor index 35a0b9842..35df04d79 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPromptOptimizer.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPromptOptimizer.razor @@ -5,7 +5,7 @@ - + @T("Assistant: Prompt Optimizer Options") @@ -15,10 +15,10 @@ @if (this.SettingsManager.ConfigurationData.PromptOptimizer.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } - - + + diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogRewrite.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogRewrite.razor index dd498de19..5c4e444f2 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogRewrite.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogRewrite.razor @@ -4,7 +4,7 @@ - + @T("Assistant: Rewrite & Improve Text Options") @@ -14,7 +14,7 @@ @if (this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSWOTAnalysis.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSWOTAnalysis.razor index 2a528d03d..c82a6d2d6 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSWOTAnalysis.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSWOTAnalysis.razor @@ -4,7 +4,7 @@ - + @T("Assistant: SWOT Analysis Options") @@ -17,9 +17,9 @@ @if (this.SettingsManager.ConfigurationData.SWOTAnalysis.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } - + diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSlideBuilder.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSlideBuilder.razor index 475e0f8a0..16969b5f3 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSlideBuilder.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSlideBuilder.razor @@ -7,7 +7,7 @@ - + @T("Assistant: Slide Assistant Options") @@ -19,11 +19,11 @@ @T("Preselect what the assistant starts with for each presentation: the aspects to emphasize, the language, the audience, and the occasion. You can still change them in the assistant.") - + @if (this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } @@ -32,15 +32,15 @@ @if (this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedOccasion is PresentationOccasion.OTHER) { - + } @T("PowerPoint template") @SlideAssistantTexts.WhatTheLLMKnowsOfLayouts - - + + @@ -91,7 +91,7 @@ @SlideAssistantTexts.WhatAPictureLibraryOffers - + @T("AI selection") diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSynonyms.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSynonyms.razor index c00cfa98f..3e7b361e8 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSynonyms.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSynonyms.razor @@ -4,7 +4,7 @@ - + @T("Assistant: Synonyms Options") @@ -14,7 +14,7 @@ @if (this.SettingsManager.ConfigurationData.Synonyms.PreselectedLanguage is CommonLanguages.OTHER) { - + } diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTextSummarizer.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTextSummarizer.razor index f0d742819..7bddfd1a7 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTextSummarizer.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTextSummarizer.razor @@ -5,7 +5,7 @@ - + @T("Assistant: Text Summarizer Options") @@ -18,14 +18,14 @@ @if (this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } @if(this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedComplexity is Complexity.SCIENTIFIC_LANGUAGE_OTHER_EXPERTS) { - + } - + diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTranslation.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTranslation.razor index 11d36adaa..7b99d5709 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTranslation.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTranslation.razor @@ -3,7 +3,7 @@ - + @T("Assistant: Translator Options") @@ -18,7 +18,7 @@ @if (this.SettingsManager.ConfigurationData.Translation.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogVisualBriefing.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogVisualBriefing.razor index 539c5a23e..dda3701ee 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogVisualBriefing.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogVisualBriefing.razor @@ -4,7 +4,7 @@ - + @T("Assistant: Visual Briefing defaults") @@ -13,7 +13,7 @@ @if (this.SettingsManager.ConfigurationData.VisualBriefing.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWorkspaces.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWorkspaces.razor index 0095398c9..d8bca145c 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWorkspaces.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWorkspaces.razor @@ -5,7 +5,7 @@ - + @T("Your Workspaces Configuration") diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWritingEMails.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWritingEMails.razor index a7cf6d908..067d85543 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWritingEMails.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWritingEMails.razor @@ -4,19 +4,19 @@ - + @T("Assistant: Writing E-Mails Options") - - + + @if (this.SettingsManager.ConfigurationData.EMail.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } diff --git a/app/MindWork AI Studio/Dialogs/Settings/ToolSettingsExportDialog.razor b/app/MindWork AI Studio/Dialogs/Settings/ToolSettingsExportDialog.razor index bc36b33ce..1c77055e4 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/ToolSettingsExportDialog.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/ToolSettingsExportDialog.razor @@ -5,7 +5,7 @@ - + @T("Export tool configuration") @@ -90,7 +90,7 @@ @T("Cancel") - + @T("Export to clipboard") diff --git a/app/MindWork AI Studio/Dialogs/ShortcutDialog.razor b/app/MindWork AI Studio/Dialogs/ShortcutDialog.razor index 50f714fbb..c9a3f3b33 100644 --- a/app/MindWork AI Studio/Dialogs/ShortcutDialog.razor +++ b/app/MindWork AI Studio/Dialogs/ShortcutDialog.razor @@ -15,7 +15,7 @@ Label="@T("Define a shortcut")" Placeholder="@T("Press a key combination...")" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Keyboard" + AdornmentIcon="@AppIcons.KEYBOARD_SHORTCUT" Immediate="@true" OnKeyDown="@this.HandleKeyDown" OnBlur="@this.HandleBlur" @@ -35,7 +35,7 @@ } - + @T("Clear Shortcut") diff --git a/app/MindWork AI Studio/Dialogs/SystemPromptDialog.razor b/app/MindWork AI Studio/Dialogs/SystemPromptDialog.razor index 1a8e9c52d..ff3792da6 100644 --- a/app/MindWork AI Studio/Dialogs/SystemPromptDialog.razor +++ b/app/MindWork AI Studio/Dialogs/SystemPromptDialog.razor @@ -22,7 +22,7 @@ } - + @T("Copy the complete prompt") diff --git a/app/MindWork AI Studio/Dialogs/TranscriptionProviderDialog.razor b/app/MindWork AI Studio/Dialogs/TranscriptionProviderDialog.razor index e27041025..f1bcc60e6 100644 --- a/app/MindWork AI Studio/Dialogs/TranscriptionProviderDialog.razor +++ b/app/MindWork AI Studio/Dialogs/TranscriptionProviderDialog.razor @@ -25,7 +25,7 @@ } } - + @T("Create account") @@ -51,7 +51,7 @@ Label="@T("Hostname")" Class="mb-3" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Dns" + AdornmentIcon="@AppIcons.SERVER" AdornmentColor="Color.Info" Disabled="@this.IsEnterpriseConfiguration" Validation="@this.providerValidation.ValidatingHostname" @@ -60,7 +60,7 @@ @if (this.DataLLMProvider.IsHostNeeded) { - + @foreach (Host host in Enum.GetValues(typeof(Host))) { if (host.IsTranscriptionSupported) @@ -75,7 +75,7 @@ @if (this.DataLLMProvider.IsHFInstanceProviderNeeded) { - + @foreach (HFInferenceProvider inferenceProvider in Enum.GetValues(typeof(HFInferenceProvider))) { @if (inferenceProvider.SupportsTranscription) @@ -95,7 +95,7 @@ { - + @T("Load") @if(this.availableModels.Count is 0) @@ -107,7 +107,7 @@ else { @foreach (var model in this.availableModels) @@ -146,7 +146,7 @@ Counter="40" Immediate="@true" Adornment="Adornment.Start" - AdornmentIcon="@Icons.Material.Filled.Lightbulb" + AdornmentIcon="@AppIcons.NAME" AdornmentColor="Color.Info" Disabled="@this.IsEnterpriseConfiguration" Validation="@this.providerValidation.ValidatingInstanceName" diff --git a/app/MindWork AI Studio/Dialogs/UpdateDialog.razor b/app/MindWork AI Studio/Dialogs/UpdateDialog.razor index f53455235..3ba6dc567 100644 --- a/app/MindWork AI Studio/Dialogs/UpdateDialog.razor +++ b/app/MindWork AI Studio/Dialogs/UpdateDialog.razor @@ -2,7 +2,7 @@ - + @this.HeaderText diff --git a/app/MindWork AI Studio/Dialogs/UpdateInstructionsDialog.razor b/app/MindWork AI Studio/Dialogs/UpdateInstructionsDialog.razor index 1be3eddd6..5242572b6 100644 --- a/app/MindWork AI Studio/Dialogs/UpdateInstructionsDialog.razor +++ b/app/MindWork AI Studio/Dialogs/UpdateInstructionsDialog.razor @@ -8,7 +8,7 @@ @if (!string.IsNullOrWhiteSpace(this.ReleaseUrl)) { - + @T("Show me the latest release page") } diff --git a/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor b/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor index 74a3c1d18..261ba2510 100644 --- a/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor +++ b/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor @@ -7,7 +7,7 @@ @foreach (var workspace in this.workspaces) { - + } @@ -34,7 +34,7 @@ } else { - + @T("Create new workspace") } diff --git a/app/MindWork AI Studio/Layout/MainLayout.razor b/app/MindWork AI Studio/Layout/MainLayout.razor index a6be88bec..ad8dd80da 100644 --- a/app/MindWork AI Studio/Layout/MainLayout.razor +++ b/app/MindWork AI Studio/Layout/MainLayout.razor @@ -102,4 +102,16 @@ - \ No newline at end of file + + +@if (this.useDarkMode) +{ + @* + Lucide draws its icons with thin strokes, and on a dark background they almost vanish in the red of errors, + such as the trash icons. In dark mode, these icons take the lighter red of the palette, as the heart of the + supporters does: + *@ + +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Layout/MainLayout.razor.cs b/app/MindWork AI Studio/Layout/MainLayout.razor.cs index 7771b8e01..9b8cc20fe 100644 --- a/app/MindWork AI Studio/Layout/MainLayout.razor.cs +++ b/app/MindWork AI Studio/Layout/MainLayout.razor.cs @@ -210,7 +210,7 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, ILan this.Snackbar.Add(message, Severity.Warning, config => { - config.Icon = Icons.Material.Filled.WarningAmber; + config.Icon = AppIcons.WARNING; config.IconSize = Size.Large; config.VisibleStateDuration = 32_000; config.HideTransitionDuration = 600; @@ -260,7 +260,7 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, ILan var message = string.Format(T("An update to version {0} is available."), updateResponse.NewVersion); this.Snackbar.Add(message, Severity.Info, config => { - config.Icon = Icons.Material.Filled.Update; + config.Icon = AppIcons.APP_UPDATE; config.IconSize = Size.Large; config.HideTransitionDuration = 600; config.VisibleStateDuration = 32_000; @@ -500,17 +500,17 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, ILan var assistantsLightColor = hasActiveAssistantWork ? activityIndicatorLightColor : defaultLightColor; var assistantsDarkColor = hasActiveAssistantWork ? activityIndicatorDarkColor : defaultDarkColor; - yield return new(T("Home"), Icons.Material.Filled.Home, defaultLightColor, defaultDarkColor, Routes.HOME, true); - yield return new(T("Chat"), Icons.Material.Filled.Chat, chatLightColor, chatDarkColor, Routes.CHAT, false); - yield return new(T("Assistants"), Icons.Material.Filled.Apps, assistantsLightColor, assistantsDarkColor, Routes.ASSISTANTS, false); + yield return new(T("Home"), AppIcons.HOME, defaultLightColor, defaultDarkColor, Routes.HOME, true); + yield return new(T("Chat"), AppIcons.CHAT, chatLightColor, chatDarkColor, Routes.CHAT, false); + yield return new(T("Assistants"), AppIcons.ASSISTANTS, assistantsLightColor, assistantsDarkColor, Routes.ASSISTANTS, false); if (PreviewFeatures.PRE_WRITER_MODE_2024.IsEnabled(this.SettingsManager)) - yield return new(T("Writer"), Icons.Material.Filled.Create, defaultLightColor, defaultDarkColor, Routes.WRITER, false); + yield return new(T("Writer"), AppIcons.WRITER, defaultLightColor, defaultDarkColor, Routes.WRITER, false); - yield return new(T("Plugins"), Icons.Material.TwoTone.Extension, defaultLightColor, defaultDarkColor, Routes.PLUGINS, false); - yield return new(T("Supporters"), Icons.Material.Filled.Favorite, palette.Error.Value, "#801a00", Routes.SUPPORTERS, false); - yield return new(T("Information"), Icons.Material.Filled.Info, defaultLightColor, defaultDarkColor, Routes.ABOUT, false); - yield return new(T("Settings"), Icons.Material.Filled.Settings, defaultLightColor, defaultDarkColor, Routes.SETTINGS, false); + yield return new(T("Plugins"), AppIcons.PLUGIN, defaultLightColor, defaultDarkColor, Routes.PLUGINS, false); + yield return new(T("Supporters"), AppIcons.SUPPORTERS, this.ColorTheme.PaletteLight.Error.Value, this.ColorTheme.PaletteDark.ErrorLighten, Routes.SUPPORTERS, false); + yield return new(T("Information"), AppIcons.INFO, defaultLightColor, defaultDarkColor, Routes.ABOUT, false); + yield return new(T("Settings"), AppIcons.SETTINGS, defaultLightColor, defaultDarkColor, Routes.SETTINGS, false); } private void LoadEmbeddingItem() @@ -532,14 +532,14 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, ILan var palette = this.ColorTheme.GetCurrentPalette(this.SettingsManager); (string icon, string lightcolor, string darkcolor) embeddingIcon = this.embeddingOverview.State switch { - DataSourceEmbeddingState.QUEUED => (Icons.Material.Filled.Sync, palette.Info.Value, "#1976d2"), - DataSourceEmbeddingState.RUNNING => (Icons.Material.Filled.Sync, palette.Warning.Value, "#d29f00"), - _ when this.embeddingOverview.Health is DataSourceEmbeddingHealth.ERROR => (Icons.Material.Filled.Error, palette.Error.Value, "#d32f2f"), - _ when this.embeddingOverview.Health is DataSourceEmbeddingHealth.WARNING => (Icons.Material.Filled.Warning, palette.Warning.Value, "#d29f00"), + DataSourceEmbeddingState.QUEUED => (AppIcons.EMBEDDING_IN_PROGRESS, palette.Info.Value, "#1976d2"), + DataSourceEmbeddingState.RUNNING => (AppIcons.EMBEDDING_IN_PROGRESS, palette.Warning.Value, "#d29f00"), + _ when this.embeddingOverview.Health is DataSourceEmbeddingHealth.ERROR => (AppIcons.ERROR, palette.Error.Value, "#d32f2f"), + _ when this.embeddingOverview.Health is DataSourceEmbeddingHealth.WARNING => (AppIcons.WARNING, palette.Warning.Value, "#d29f00"), // Nothing to do: the entry keeps the colors of its neighbors, so a permanently visible // icon does not draw attention while there is nothing to attend to: - _ => (Icons.Material.Filled.LibraryAddCheck, palette.DarkLighten, palette.GrayLight), + _ => (AppIcons.DATA_SOURCES_UP_TO_DATE, palette.DarkLighten, palette.GrayLight), }; this.embeddingItem = new NavBarItem(T("Data sources"), embeddingIcon.icon, embeddingIcon.lightcolor, embeddingIcon.darkcolor, Routes.EMBEDDINGS, false); } diff --git a/app/MindWork AI Studio/MindWork AI Studio.csproj b/app/MindWork AI Studio/MindWork AI Studio.csproj index 69e319b3b..0119232f3 100644 --- a/app/MindWork AI Studio/MindWork AI Studio.csproj +++ b/app/MindWork AI Studio/MindWork AI Studio.csproj @@ -102,6 +102,11 @@ + + + + + diff --git a/app/MindWork AI Studio/Pages/Assistants.razor b/app/MindWork AI Studio/Pages/Assistants.razor index b497f8d79..fa32c4346 100644 --- a/app/MindWork AI Studio/Pages/Assistants.razor +++ b/app/MindWork AI Studio/Pages/Assistants.razor @@ -13,13 +13,13 @@ - - - - - - - + + + + + + + @if (this.AssistantPlugins.Count > 0) @@ -34,7 +34,7 @@ Component="Components.DYNAMIC_ASSISTANT" Name="@T(assistantPlugin.AssistantTitle)" Description="@T(assistantPlugin.Description)" - Icon="@Icons.Material.Filled.FindInPage" + Icon="@AppIcons.ASSISTANT_PLUGIN" Disabled="@(!securityState.CanStartAssistant)" AssistantSessionInstanceId="@assistantPlugin.Id.ToString()" Link="@launchLink" @@ -55,32 +55,32 @@ } - - - - - - - - - - - + + + + + + + + + + + - - + + - - + + - - + + diff --git a/app/MindWork AI Studio/Pages/Assistants.razor.cs b/app/MindWork AI Studio/Pages/Assistants.razor.cs index a13adca98..99ac2b420 100644 --- a/app/MindWork AI Studio/Pages/Assistants.razor.cs +++ b/app/MindWork AI Studio/Pages/Assistants.razor.cs @@ -57,7 +57,7 @@ public partial class Assistants : MSGComponentBase var audit = await this.AssistantPluginAuditService.RunAuditAsync(assistantPlugin); if (audit.Level is AssistantAuditLevel.UNKNOWN) { - await MessageBus.INSTANCE.SendError(new (Icons.Material.Filled.SettingsSuggest, string.Format(this.T("The automatic security audit for the assistant plugin '{0}' failed. Please run it manually from the plugins page."), assistantPlugin.Name))); + await MessageBus.INSTANCE.SendError(new (AppIcons.AGENT, string.Format(this.T("The automatic security audit for the assistant plugin '{0}' failed. Please run it manually from the plugins page."), assistantPlugin.Name))); continue; } @@ -103,7 +103,7 @@ public partial class Assistants : MSGComponentBase var result = await this.DirectChatService.TryCreateAssistantChatAsync(assistantPlugin); if (result.Request is null) { - await this.MessageBus.SendError(new(Icons.Material.Filled.ReportProblem, result.ErrorMessage)); + await this.MessageBus.SendError(new(AppIcons.ERROR, result.ErrorMessage)); return; } diff --git a/app/MindWork AI Studio/Pages/Chat.razor b/app/MindWork AI Studio/Pages/Chat.razor index e6f675084..f4485c8d1 100644 --- a/app/MindWork AI Studio/Pages/Chat.razor +++ b/app/MindWork AI Studio/Pages/Chat.razor @@ -22,11 +22,11 @@ @if (this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is WorkspaceStorageBehavior.DISABLE_WORKSPACES) { - + } - + @@ -48,10 +48,10 @@ @T("Your workspaces") - + - + @@ -77,10 +77,10 @@ - + - + @@ -118,7 +118,7 @@ @T("Your workspaces") - + @@ -158,15 +158,15 @@ - + - + - + diff --git a/app/MindWork AI Studio/Pages/Chat.razor.cs b/app/MindWork AI Studio/Pages/Chat.razor.cs index 91875eb9c..199abc986 100644 --- a/app/MindWork AI Studio/Pages/Chat.razor.cs +++ b/app/MindWork AI Studio/Pages/Chat.razor.cs @@ -97,9 +97,9 @@ public partial class Chat : MSGComponentBase #endregion - private string WorkspaceSidebarToggleIcon => this.SettingsManager.ConfigurationData.Workspace.IsSidebarVisible ? Icons.Material.Filled.ArrowCircleLeft : Icons.Material.Filled.ArrowCircleRight; + private string WorkspaceSidebarToggleIcon => this.SettingsManager.ConfigurationData.Workspace.IsSidebarVisible ? AppIcons.HIDE_SIDEBAR : AppIcons.SHOW_SIDEBAR; - private string WorkspaceSearchIcon => this.workspaceSearchVisible ? Icons.Material.Filled.SearchOff : Icons.Material.Filled.Search; + private string WorkspaceSearchIcon => this.workspaceSearchVisible ? AppIcons.HIDE_SEARCH : AppIcons.SEARCH; private string WorkspaceSearchTooltip => this.workspaceSearchVisible ? T("Hide search") : T("Search your workspaces"); diff --git a/app/MindWork AI Studio/Pages/Embeddings.razor b/app/MindWork AI Studio/Pages/Embeddings.razor index 9bdcf34b6..5bad53f59 100644 --- a/app/MindWork AI Studio/Pages/Embeddings.razor +++ b/app/MindWork AI Studio/Pages/Embeddings.razor @@ -8,7 +8,7 @@ @T("Background embeddings") - + @@ -69,13 +69,13 @@ ExpansionPanel component, which behaves the same way. *@ - + } @if (this.CanRepair(status)) { - + }
@@ -138,7 +138,7 @@ } @if (group.Cause.NeedsProviderSettings) { - + @T("Open the settings") } @@ -178,7 +178,7 @@ @if (CanShowInFileManager(status, context)) { - + } @@ -205,13 +205,13 @@ } @if (group.Cause.NeedsTranscriptionSettings) { - + @T("Open the transcription settings") } @if (group.Cause.NeedsDataSourceSettings) { - + @T("Manage the data sources") } @@ -234,7 +234,7 @@ @if (CanShowInFileManager(status, context.FilePath)) { - + } @@ -254,10 +254,10 @@ - + @T("Outside the selection") - + @T("Manage the data sources") @@ -267,7 +267,7 @@ @foreach (var group in status.ExcludedFolders) { - + @this.GetExcludedFolderGroupText(group) } @@ -302,10 +302,10 @@ @if (status.Attention is DataSourceAttention.AUTH_FAILED) { - + @T("Change the password") - + @T("Try to sign in again") @@ -313,10 +313,10 @@ else if (status is { Attention: DataSourceAttention.MASS_REMOVAL_PENDING, PendingRemovalCount: not null }) { - + @T("Remove them from the index") - + @T("Change the settings of the mailbox") @@ -324,7 +324,7 @@ else if (status.Attention is DataSourceAttention.LOCATION_UNREACHABLE && this.CanEditDataSource(status)) { - + @T("Edit this data source") diff --git a/app/MindWork AI Studio/Pages/Embeddings.razor.cs b/app/MindWork AI Studio/Pages/Embeddings.razor.cs index e0c798191..787316c2d 100644 --- a/app/MindWork AI Studio/Pages/Embeddings.razor.cs +++ b/app/MindWork AI Studio/Pages/Embeddings.razor.cs @@ -322,7 +322,7 @@ public partial class Embeddings : MSGComponentBase if (failure.FailureReason is not ProviderRequestFailureReason.NONE) { var isFixedInSettings = failure.FailureReason.IsFixedInProviderSettings; - return new FailureCause(isFixedInSettings ? 0 : 1, failure.FailureReason.Name, isFixedInSettings ? Icons.Material.Filled.Key : Icons.Material.Filled.CloudOff, Color.Error, false, isFixedInSettings, true); + return new FailureCause(isFixedInSettings ? 0 : 1, failure.FailureReason.Name, isFixedInSettings ? AppIcons.KEY : AppIcons.PROVIDER_ERROR, Color.Error, false, isFixedInSettings, true); } // @@ -335,8 +335,8 @@ public partial class Embeddings : MSGComponentBase var showsMessagePerFile = !hasCauseName || failure.ExtractionCode is FileExtractionErrorCode.MEDIA_PROCESSING_FAILED; return failure.IsPermanent - ? new FailureCause(3, title, Icons.Material.Filled.SkipNext, Color.Default, true, false, showsMessagePerFile) - : new FailureCause(2, title, Icons.Material.Filled.ReportProblem, Color.Warning, false, false, !hasCauseName); + ? new FailureCause(3, title, AppIcons.SKIPPED, Color.Default, true, false, showsMessagePerFile) + : new FailureCause(2, title, AppIcons.WARNING, Color.Warning, false, false, !hasCauseName); } private static string GetEmbeddingProviderName(IEnumerable failures) => failures @@ -359,7 +359,7 @@ public partial class Embeddings : MSGComponentBase 0, T("Too large"), string.Format(T("These files match the data source patterns, but they are larger than its limit of {0}. You can raise the limit in the expert settings of the data source."), this.GetMaxFileSizeText(status)), - Icons.Material.Filled.Straighten, + AppIcons.FILE_SIZE, Color.Warning, true, false), @@ -367,7 +367,7 @@ public partial class Embeddings : MSGComponentBase 0, T("No transcription provider"), T("These audio or video files match the data source patterns, but no transcription provider is configured that AI Studio may use. Once you choose one in the settings, AI Studio transcribes the files and adds their text to the index."), - Icons.Material.Filled.MicOff, + AppIcons.MICROPHONE_OFF, Color.Warning, false, true), @@ -375,7 +375,7 @@ public partial class Embeddings : MSGComponentBase 0, T("Transcription provider not allowed"), T("These audio or video files match the data source patterns, but your transcription provider does not meet the confidence level this data source requires. Choose another transcription provider, or change the confidence level of the data source."), - Icons.Material.Filled.GppBad, + AppIcons.SECURITY_BLOCKED, Color.Warning, true, true), @@ -383,7 +383,7 @@ public partial class Embeddings : MSGComponentBase 1, FileTypes.IMAGE.FilterName, T("These image files match the data source patterns, but images cannot currently be added to the index."), - Icons.Material.Filled.ImageNotSupported, + AppIcons.IMAGE_NOT_SUPPORTED, Color.Default, false, false), @@ -463,7 +463,7 @@ public partial class Embeddings : MSGComponentBase catch (Exception e) { this.Logger.LogWarning(e, "Could not show a file of the embedding failure list in the file manager."); - await this.MessageBus.SendError(new(Icons.Material.Filled.Folder, T("Could not open the file location."))); + await this.MessageBus.SendError(new(AppIcons.FOLDER_OPEN, T("Could not open the file location."))); return; } @@ -471,7 +471,7 @@ public partial class Embeddings : MSGComponentBase return; var issue = string.IsNullOrWhiteSpace(response.Issue) ? T("Unknown error") : response.Issue; - await this.MessageBus.SendError(new(Icons.Material.Filled.Folder, string.Format(T("Could not open the file location: {0}"), issue))); + await this.MessageBus.SendError(new(AppIcons.FOLDER_OPEN, string.Format(T("Could not open the file location: {0}"), issue))); } /// @@ -555,7 +555,7 @@ public partial class Embeddings : MSGComponentBase return; if (!await this.DataSourceEmbeddingService.ApprovePendingMailRemovalAsync(status.DataSourceId, removalCount)) - await this.MessageBus.SendWarning(new(Icons.Material.Filled.PlaylistRemove, T("Your agreement could not be recorded: either the number of mails to remove changed in the meantime, or the index cannot be reached. AI Studio asks you again after the next sync."))); + await this.MessageBus.SendWarning(new(AppIcons.REMOVE_FROM_INDEX, T("Your agreement could not be recorded: either the number of mails to remove changed in the meantime, or the index cannot be reached. AI Studio asks you again after the next sync."))); this.ReloadStatuses(); await this.InvokeAsync(this.StateHasChanged); diff --git a/app/MindWork AI Studio/Pages/Home.razor b/app/MindWork AI Studio/Pages/Home.razor index 30892ad95..b2c7f8762 100644 --- a/app/MindWork AI Studio/Pages/Home.razor +++ b/app/MindWork AI Studio/Pages/Home.razor @@ -19,7 +19,7 @@ @if (this.SettingsManager.ConfigurationData.App.ShowIntroduction) { - + @T("Welcome to MindWork AI Studio!") @@ -29,7 +29,7 @@ @T("Here's what makes MindWork AI Studio stand out:") - + @T("We hope you enjoy using MindWork AI Studio to bring your AI projects to life!") @@ -38,7 +38,7 @@ @foreach (var introduction in this.introductions) { - + @T("Version"): @introduction.VersionText @@ -48,21 +48,21 @@ @if (this.SettingsManager.ConfigurationData.App.ShowLastChangelog) { - + } @if (this.SettingsManager.ConfigurationData.App.ShowVision) { - + } @if (this.SettingsManager.ConfigurationData.App.ShowQuickStartGuide) { - + } diff --git a/app/MindWork AI Studio/Pages/Information.razor b/app/MindWork AI Studio/Pages/Information.razor index 69964f5db..4b86eed22 100644 --- a/app/MindWork AI Studio/Pages/Information.razor +++ b/app/MindWork AI Studio/Pages/Information.razor @@ -10,16 +10,16 @@ - + @T("The following list shows the versions of the MindWork AI Studio, the used compilers, build time, etc.:") - - - - - + + + + + @foreach (var database in this.databaseSections) { @@ -34,7 +34,7 @@ } - @@ -42,13 +42,13 @@ } - - - - - - - + + + + + + +
@this.WorkingDirectory @@ -56,7 +56,7 @@
- +
@this.ExecutablePath @@ -66,10 +66,10 @@ @if (OperatingSystem.IsLinux()) { - + } - - + + @switch (HasAnyActiveEnvironment) { case false when this.configPlugins.Count == 0: @@ -85,10 +85,10 @@ @foreach (var plug in this.configPlugins) { - @foreach (var env in this.enterpriseEnvironments.Where(e => e.IsActive)) { - } @@ -138,13 +138,13 @@ var matchingPlugin = this.FindManagedConfigurationPlugin(env.ConfigurationId); if (matchingPlugin is null) { - continue; } - @foreach (var testConfigPlugin in this.testConfigPlugins) { - @@ -195,20 +195,20 @@ @if (ExternalHttpClientTimeout.CustomRootCertificateState.IsEnabled) { - + @(ExternalHttpClientTimeout.CustomRootCertificateState.IsUsable ? T("External HTTPS custom root certificates are active.") : T("External HTTPS custom root certificates are configured but not active.")) - - @@ -218,45 +218,45 @@ } - + @(this.updatePolicyMode is UpdatePolicyMode.SELF_UPDATE ? T("Check for updates") : T("How to update")) - + @this.PandocButtonText - + - + @T("Discover MindWork AI's mission and vision on our official homepage.") - + @T("Browse AI Studio's source code on GitHub — we welcome your contributions.") - + @T("Connect AI Studio to your organization's data with our External Retrieval Interface (ERI).") - + @T("View our project roadmap and help shape AI Studio's future development.") - + @T("Did you find a bug or are you experiencing issues? Report your concern here.") - + @T("Have feature ideas? Submit suggestions for future AI Studio enhancements.") - + @foreach (var mandatoryInfoPanel in this.mandatoryInfoPanels) { - + @string.Format(T("Provided by configuration plugin: {0}"), mandatoryInfoPanel.PluginName) @@ -266,7 +266,7 @@ } - + @T("Explanation") @@ -279,7 +279,7 @@ @T("Open Log Viewer") @@ -289,13 +289,13 @@ @T("Startup log file") - + @this.logPaths.LogStartupPath - @@ -308,13 +308,13 @@ @T("Usage log file") - + @this.logPaths.LogAppPath - @@ -324,23 +324,23 @@ - + - + - + - + - + @@ -410,10 +410,11 @@ - + + - + Confluence @T("The Confluence logo by Atlassian identifies the Search Confluence tool.") @@ -428,7 +429,7 @@ @T("Organizations can replace these logos with their own icons through a configuration plugin. When your organization does so, it is responsible for holding the rights to the icons it provides.") - + diff --git a/app/MindWork AI Studio/Pages/Information.razor.cs b/app/MindWork AI Studio/Pages/Information.razor.cs index d3b74940d..cfd652ed3 100644 --- a/app/MindWork AI Studio/Pages/Information.razor.cs +++ b/app/MindWork AI Studio/Pages/Information.razor.cs @@ -190,9 +190,9 @@ public partial class Information : MSGComponentBase ///
private readonly IReadOnlyList databaseSections = [ - new(DatabaseRole.VECTOR_STORE, Icons.Material.Outlined.Storage), - new(DatabaseRole.INDEX_STORE, Icons.Material.Outlined.ManageSearch), - new(DatabaseRole.PROVENANCE_STORE, Icons.Material.Outlined.Source), + new(DatabaseRole.VECTOR_STORE, AppIcons.VECTOR_STORE), + new(DatabaseRole.INDEX_STORE, AppIcons.SEARCH_INDEX), + new(DatabaseRole.PROVENANCE_STORE, AppIcons.PROVENANCE_STORE), ]; private bool HasAnyActiveEnvironment => this.enterpriseEnvironments.Any(e => e.IsActive); @@ -349,7 +349,7 @@ public partial class Information : MSGComponentBase private IReadOnlyList BuildDatabaseInfoItems(DatabaseSection section) => section.DisplayInfo .Select((item, index) => new ConfigInfoRowItem( - Icons.Material.Filled.ArrowRightAlt, + AppIcons.INFO_ROW, $"{item.Label}: {item.Value}", item.Value, $"{T("Copies the following to the clipboard")}: {item.Value}", @@ -441,18 +441,18 @@ public partial class Information : MSGComponentBase { var items = new List { - new(Icons.Material.Filled.ArrowRightAlt, + new(AppIcons.INFO_ROW, $"{T("Enterprise configuration ID:")} {environment.ConfigurationId}", environment.ConfigurationId.ToString(), T("Copies the config ID to the clipboard")), - new(Icons.Material.Filled.ArrowRightAlt, + new(AppIcons.INFO_ROW, $"{T("Configuration server:")} {environment.ConfigurationServerUrl}", environment.ConfigurationServerUrl, T("Copies the server URL to the clipboard"), "margin-top: 4px;"), - new(Icons.Material.Filled.ArrowRightAlt, + new(AppIcons.INFO_ROW, $"{T("Configuration source:")} {environment.Source}", environment.Source, T("Copies the configuration source to the clipboard"), @@ -461,14 +461,14 @@ public partial class Information : MSGComponentBase if (!string.IsNullOrWhiteSpace(environment.SourceDetail)) { - items.Add(new ConfigInfoRowItem(Icons.Material.Filled.ArrowRightAlt, + items.Add(new ConfigInfoRowItem(AppIcons.INFO_ROW, $"{T("Configuration origin:")} {environment.SourceDetail}", environment.SourceDetail, T("Copies the configuration origin to the clipboard"), "margin-top: 4px;")); } - items.Add(new ConfigInfoRowItem(Icons.Material.Filled.ArrowRightAlt, + items.Add(new ConfigInfoRowItem(AppIcons.INFO_ROW, $"{T("Configuration slot:")} {environment.Slot}", environment.Slot, T("Copies the configuration slot to the clipboard"), @@ -476,7 +476,7 @@ public partial class Information : MSGComponentBase if (plugin is not null) { - items.Add(new ConfigInfoRowItem(Icons.Material.Filled.ArrowRightAlt, + items.Add(new ConfigInfoRowItem(AppIcons.INFO_ROW, $"{T("Configuration plugin ID:")} {plugin.Id}", plugin.Id.ToString(), T("Copies the configuration plugin ID to the clipboard"), @@ -500,12 +500,12 @@ public partial class Information : MSGComponentBase /// private IReadOnlyList BuildTestConfigurationItems(IAvailablePlugin plugin) => [ - new(Icons.Material.Filled.ArrowRightAlt, + new(AppIcons.INFO_ROW, $"{T("Configuration plugin ID:")} {plugin.Id}", plugin.Id.ToString(), T("Copies the configuration plugin ID to the clipboard")), - new(Icons.Material.Filled.ArrowRightAlt, + new(AppIcons.INFO_ROW, $"{T("Plugin directory:")} {plugin.LocalPath}", plugin.LocalPath, T("Copies the plugin directory to the clipboard"), @@ -528,24 +528,24 @@ public partial class Information : MSGComponentBase var state = ExternalHttpClientTimeout.CustomRootCertificateState; var items = new List { - new(Icons.Material.Filled.ArrowRightAlt, + new(AppIcons.INFO_ROW, $"{T("Status:")} {(state.IsUsable ? T("active") : T("not active"))}", state.IsUsable ? T("active") : T("not active"), T("Copies the status to the clipboard")), - new(Icons.Material.Filled.ArrowRightAlt, + new(AppIcons.INFO_ROW, $"{T("Configuration source:")} {state.Source}", state.Source, T("Copies the configuration source to the clipboard"), "margin-top: 4px;"), - new(Icons.Material.Filled.ArrowRightAlt, + new(AppIcons.INFO_ROW, $"{T("Certificate bundle:")} {state.BundlePath}", state.BundlePath, T("Copies the certificate bundle path to the clipboard"), "margin-top: 4px;"), - new(Icons.Material.Filled.ArrowRightAlt, + new(AppIcons.INFO_ROW, $"{T("Loaded root certificates:")} {state.CertificateCount}", state.CertificateCount.ToString(), T("Copies the number of loaded root certificates to the clipboard"), @@ -554,7 +554,7 @@ public partial class Information : MSGComponentBase if (state.AllowedHostPatterns.Count == 0) { - items.Add(new ConfigInfoRowItem(Icons.Material.Filled.ArrowRightAlt, + items.Add(new ConfigInfoRowItem(AppIcons.INFO_ROW, T("Allowed hosts: none configured"), string.Empty, T("Copies the allowed host configuration to the clipboard"), @@ -564,7 +564,7 @@ public partial class Information : MSGComponentBase { foreach (var allowedHostPattern in state.AllowedHostPatterns) { - items.Add(new ConfigInfoRowItem(Icons.Material.Filled.Dns, + items.Add(new ConfigInfoRowItem(AppIcons.SERVER, $"{T("Allowed host:")} {allowedHostPattern}", allowedHostPattern, T("Copies the allowed host pattern to the clipboard"), @@ -574,7 +574,7 @@ public partial class Information : MSGComponentBase foreach (var fingerprint in state.CertificateFingerprints) { - items.Add(new ConfigInfoRowItem(Icons.Material.Filled.Fingerprint, + items.Add(new ConfigInfoRowItem(AppIcons.IDENTIFIER, $"{T("Root certificate fingerprint:")} {fingerprint}", fingerprint, T("Copies the root certificate fingerprint to the clipboard"), @@ -605,7 +605,7 @@ public partial class Information : MSGComponentBase { if (string.IsNullOrWhiteSpace(path)) { - await this.MessageBus.SendWarning(new(Icons.Material.Filled.Folder, T("The log file path is not available yet."))); + await this.MessageBus.SendWarning(new(AppIcons.FOLDER_OPEN, T("The log file path is not available yet."))); return; } @@ -617,18 +617,18 @@ public partial class Information : MSGComponentBase catch (Exception e) { this.Logger.LogWarning(e, "Could not open the log file location in the file manager."); - await this.MessageBus.SendError(new(Icons.Material.Filled.Folder, T("Could not open the log file location."))); + await this.MessageBus.SendError(new(AppIcons.FOLDER_OPEN, T("Could not open the log file location."))); return; } if (response.Success) { - await this.MessageBus.SendSuccess(new(Icons.Material.Filled.FolderOpen, T("Opened the log file location."))); + await this.MessageBus.SendSuccess(new(AppIcons.FOLDER_OPEN, T("Opened the log file location."))); return; } var issue = string.IsNullOrWhiteSpace(response.Issue) ? T("Unknown error") : response.Issue; - await this.MessageBus.SendError(new(Icons.Material.Filled.Folder, string.Format(T("Could not open the log file location: {0}"), issue))); + await this.MessageBus.SendError(new(AppIcons.FOLDER_OPEN, string.Format(T("Could not open the log file location: {0}"), issue))); } private const string LICENSE = """ diff --git a/app/MindWork AI Studio/Pages/Plugins.razor b/app/MindWork AI Studio/Pages/Plugins.razor index 6f92e9309..dd27f3a1f 100644 --- a/app/MindWork AI Studio/Pages/Plugins.razor +++ b/app/MindWork AI Studio/Pages/Plugins.razor @@ -18,7 +18,7 @@ - + }
@@ -124,7 +124,7 @@ @if (context is IAvailablePlugin editablePlugin && CanEditAssistantPlugin(editablePlugin)) { - + } @@ -142,7 +142,7 @@ { var isLauncher = IsDirectChatLauncher(revisionPlugin); - + } diff --git a/app/MindWork AI Studio/Pages/Plugins.razor.cs b/app/MindWork AI Studio/Pages/Plugins.razor.cs index 8ee276018..2686bbd41 100644 --- a/app/MindWork AI Studio/Pages/Plugins.razor.cs +++ b/app/MindWork AI Studio/Pages/Plugins.razor.cs @@ -42,13 +42,6 @@ public partial class Plugins : MSGComponentBase private bool isSharingPlugin; - private const string IMPORT_ICON = - @" - - - - "; - #region Overrides of ComponentBase protected override async Task OnInitializedAsync() @@ -278,7 +271,7 @@ public partial class Plugins : MSGComponentBase /// user's choice instead: on Linux, which has none, and once the share sheet failed or did not /// respond, until AI Studio restarts. The action must be labeled accordingly. ///
- private string SharePluginIcon => this.PluginShareService.UsesExport ? Icons.Material.Filled.FileDownload : Icons.Material.Filled.IosShare; + private string SharePluginIcon => this.PluginShareService.UsesExport ? AppIcons.EXPORT : AppIcons.SHARE; private string SharePluginTooltip => this.PluginShareService.UsesExport ? this.T("Export plugin archive") : this.T("Share plugin archive"); @@ -297,7 +290,7 @@ public partial class Plugins : MSGComponentBase if (dialogResult is null || dialogResult.Canceled || dialogResult.Data is not AssistantPluginEditorDialogResult result) return; - await this.MessageBus.SendSuccess(new(Icons.Material.Filled.Save, string.Format(this.T("The assistant plugin '{0}' has been successfully saved."), result.PluginName))); + await this.MessageBus.SendSuccess(new(AppIcons.SAVE, string.Format(this.T("The assistant plugin '{0}' has been successfully saved."), result.PluginName))); LOG.LogInformation($"The assistant plugin '{result.PluginName}' ({result.PluginId}) has been successfully updated."); // Saving the plugin ran LoadAll, which already sent PLUGINS_RELOADED. Editing the plugin @@ -329,7 +322,7 @@ public partial class Plugins : MSGComponentBase if (dialogResult is null || dialogResult.Canceled || dialogResult.Data is not AssistantPluginRevisionDialogResult result) return; - await this.MessageBus.SendSuccess(new(Icons.Material.Filled.AutoFixHigh, string.Format(this.T("The assistant plugin '{0}' has been successfully revised."), result.PluginName))); + await this.MessageBus.SendSuccess(new(AppIcons.REVISE_ASSISTANT, string.Format(this.T("The assistant plugin '{0}' has been successfully revised."), result.PluginName))); LOG.LogInformation($"The assistant plugin '{result.PluginName}' ({result.PluginId}) has been successfully revised."); // Saving the revision ran LoadAll, which already sent PLUGINS_RELOADED. We still announce the @@ -351,7 +344,7 @@ public partial class Plugins : MSGComponentBase if (dialogResult is null || dialogResult.Canceled || dialogResult.Data is not DirectChatLauncherSettingsDialogResult result) return; - await this.MessageBus.SendSuccess(new(Icons.Material.Filled.Save, string.Format(this.T("The tile '{0}' has been updated."), result.PluginName))); + await this.MessageBus.SendSuccess(new(AppIcons.SAVE, string.Format(this.T("The tile '{0}' has been updated."), result.PluginName))); LOG.LogInformation($"The chat launcher '{result.PluginName}' ({result.PluginId}) has been successfully updated."); // Saving ran LoadAll, which already sent PLUGINS_RELOADED. We still announce the @@ -395,12 +388,12 @@ public partial class Plugins : MSGComponentBase // that would only unpack the archive, at least on macOS. // case PluginShareOutcome.EXPORTED: - await exportFeedback.SucceededAsync(Icons.Material.Filled.FileDownload, string.Format(T("The plugin archive was exported to '{0}'."), shareResult.ArchivePath), shareResult.ArchivePath, false); + await exportFeedback.SucceededAsync(AppIcons.EXPORT, string.Format(T("The plugin archive was exported to '{0}'."), shareResult.ArchivePath), shareResult.ArchivePath, false); break; case PluginShareOutcome.FAILED: LOG.LogError($"Sharing the plugin '{shareResult.PluginName}' from archive '{shareResult.ArchivePath}' failed with Issue: '{shareResult.Issue}'."); - await this.MessageBus.SendError(new(Icons.Material.Filled.ReportProblem, isExport ? T("An error occurred while exporting the plugin.") : T("An error occurred while sharing the plugin."))); + await this.MessageBus.SendError(new(AppIcons.ERROR, isExport ? T("An error occurred while exporting the plugin.") : T("An error occurred while sharing the plugin."))); break; // The share sheet takes it from here, and a canceled export needs no message. The @@ -490,7 +483,7 @@ public partial class Plugins : MSGComponentBase // We do not announce the reload ourselves: a successful installation ran LoadAll, which // already sent PLUGINS_RELOADED. The import changes no settings either, so there is // nothing to report as a configuration change: - await this.MessageBus.SendSuccess(new(Icons.Material.Filled.Extension, message)); + await this.MessageBus.SendSuccess(new(AppIcons.PLUGIN, message)); } finally { @@ -521,7 +514,7 @@ public partial class Plugins : MSGComponentBase var dialogParameters = new DialogParameters { { x => x.Message, string.Format(this.T("The plugin could not be imported: {0}"), issue) }, - { x => x.Icon, Icons.Material.Filled.ReportProblem }, + { x => x.Icon, AppIcons.ERROR }, { x => x.IconColor, Color.Error }, }; @@ -562,7 +555,7 @@ public partial class Plugins : MSGComponentBase var audit = await this.AssistantPluginAuditService.RunAuditAsync(assistantPlugin); if (audit.Level is AssistantAuditLevel.UNKNOWN) { - await MessageBus.INSTANCE.SendError(new (Icons.Material.Filled.SettingsSuggest, string.Format(this.T("The automatic security audit for the assistant plugin '{0}' failed. Please run it manually."), assistantPlugin.Name))); + await MessageBus.INSTANCE.SendError(new (AppIcons.AGENT, string.Format(this.T("The automatic security audit for the assistant plugin '{0}' failed. Please run it manually."), assistantPlugin.Name))); continue; } @@ -629,11 +622,11 @@ public partial class Plugins : MSGComponentBase switch (archivePaths.Count) { case 0: - await this.MessageBus.SendWarning(new(Icons.Material.Filled.ReportProblem, string.Format(this.T("Please drop a plugin archive with the extension {0} or .zip."), PluginArchive.PLUGIN_FILE_EXTENSION))); + await this.MessageBus.SendWarning(new(AppIcons.WARNING, string.Format(this.T("Please drop a plugin archive with the extension {0} or .zip."), PluginArchive.PLUGIN_FILE_EXTENSION))); return; case > 1: - await this.MessageBus.SendWarning(new(Icons.Material.Filled.ReportProblem, this.T("Please drop only one plugin archive at a time."))); + await this.MessageBus.SendWarning(new(AppIcons.WARNING, this.T("Please drop only one plugin archive at a time."))); return; } diff --git a/app/MindWork AI Studio/Pages/Settings.razor b/app/MindWork AI Studio/Pages/Settings.razor index c41344e46..1071937ed 100644 --- a/app/MindWork AI Studio/Pages/Settings.razor +++ b/app/MindWork AI Studio/Pages/Settings.razor @@ -38,7 +38,7 @@ - + diff --git a/app/MindWork AI Studio/Pages/Supporters.razor b/app/MindWork AI Studio/Pages/Supporters.razor index b19b91686..b4eb1f4e1 100644 --- a/app/MindWork AI Studio/Pages/Supporters.razor +++ b/app/MindWork AI Studio/Pages/Supporters.razor @@ -9,7 +9,7 @@ - +
@T("Our Titans") @@ -25,7 +25,7 @@ - + @T("Become one of our titans")
@@ -35,11 +35,11 @@ - + @T("Individual Contributors") - + @T("Become a contributor") @@ -64,11 +64,11 @@ - + @T("Business Contributors") - + @T("Become a contributor") @@ -76,14 +76,14 @@
- + @* Two columns from the breakpoint md on; in a narrower window, the boxes follow each other. *@ - + @T("Code Contributions") @@ -108,7 +108,7 @@ - + @T("Moderation, Design, Wiki, and Documentation") @@ -119,7 +119,7 @@ - + @T("Ideas, Expertise, and Concepts") diff --git a/app/MindWork AI Studio/Pages/Writer.razor.cs b/app/MindWork AI Studio/Pages/Writer.razor.cs index 8df22c267..ab48fd1ed 100644 --- a/app/MindWork AI Studio/Pages/Writer.razor.cs +++ b/app/MindWork AI Studio/Pages/Writer.razor.cs @@ -129,7 +129,7 @@ public partial class Writer : MSGComponentBase catch (ProviderRequestException e) { LOGGER.LogError(e, "The provider request failed for writer suggestions. Status={StatusCode}, Reason='{ReasonPhrase}', Body='{ResponseBody}'", e.StatusCode, e.ReasonPhrase, e.ResponseBody); - await this.MessageBus.SendError(new(Icons.Material.Filled.CloudOff, e.UserMessage)); + await this.MessageBus.SendError(new(AppIcons.PROVIDER_ERROR, e.UserMessage)); this.suggestion = string.Empty; if (string.IsNullOrWhiteSpace(aiText.Text)) diff --git a/app/MindWork AI Studio/Plugins/assistants/README.md b/app/MindWork AI Studio/Plugins/assistants/README.md index 5526f5c94..d61a9e440 100644 --- a/app/MindWork AI Studio/Plugins/assistants/README.md +++ b/app/MindWork AI Studio/Plugins/assistants/README.md @@ -11,6 +11,7 @@ This folder keeps the Lua manifest (`plugin.lua`) that defines a custom assistan - [Continuing in a Chat](#continuing-in-a-chat) - [Supported types (matching the Blazor UI components):](#supported-types-matching-the-blazor-ui-components) - [Component References](#component-references) + - [Icons](#icons) - [`TEXT_AREA` reference](#text_area-reference) - [`DROPDOWN` reference](#dropdown-reference) - [`BUTTON` reference](#button-reference) @@ -259,6 +260,14 @@ More information on rendered components can be found [here](https://www.mudblazo ## Component References +### Icons +Every prop which takes an icon, such as `AdornmentIcon`, `StartIcon`, or the `Icon` of a `SWITCH`, accepts two kinds of names: + +- A Lucide icon as `"lucide:"` followed by its name on [lucide.dev](https://lucide.dev/icons/), such as `"lucide:house"` or `"lucide:wand-sparkles"`. AI Studio itself uses Lucide icons, so prefer them: they look like the rest of the app. Names are lowercase and exact; older names which Lucide still knows, such as `"lucide:home"`, keep working. +- An icon of MudBlazor by its C# name, such as `"Icons.Material.Filled.Home"`. These names keep working as well; see the [MudBlazor icons](https://www.mudblazor.com/features/icons#icons). + +An unknown name shows no icon. + ### `TEXT_AREA` reference - Use `Type = "TEXT_AREA"` to render a MudBlazor text input or textarea. - Required props: @@ -268,7 +277,7 @@ More information on rendered components can be found [here](https://www.mudblazo - `HelperText`: helper text rendered below the input. - `HelperTextOnFocus`: defaults to `false`; show helper text only while the field is focused. - `Adornment`: one of `Start`, `End`, `None`; invalid or omitted values fall back to `Start`. - - `AdornmentIcon`: MudBlazor icon identifier string for the adornment. + - `AdornmentIcon`: icon for the adornment, see [Icons](#icons). - `AdornmentText`: plain adornment text. Do not set this together with `AdornmentIcon`. - `AdornmentColor`: one of the MudBlazor `Color` enum names such as `Primary`, `Secondary`, `Warning`; invalid or omitted values fall back to `Default`. - `Counter`: nullable integer. Omit it to hide the counter entirely. Set `0` to show only the current character count. Set `1` or higher to show `current/max`. @@ -289,7 +298,7 @@ More information on rendered components can be found [here](https://www.mudblazo ["Label"] = "Budget", ["HelperText"] = "Enter the expected amount.", ["Adornment"] = "Start", - ["AdornmentIcon"] = "Icons.Material.Filled.AttachMoney", + ["AdornmentIcon"] = "lucide:circle-dollar-sign", ["AdornmentColor"] = "Success", ["Counter"] = 0, ["MaxLength"] = 100, @@ -316,8 +325,8 @@ More information on rendered components can be found [here](https://www.mudblazo - `HasSelectAll`: defaults to `false`; enables MudBlazor's select-all behavior for multiselect dropdowns. - `SelectAllText`: custom label for the select-all action in multiselect mode. - `HelperText`: helper text rendered below the dropdown. - - `OpenIcon`: MudBlazor icon identifier used while the dropdown is closed. - - `CloseIcon`: MudBlazor icon identifier used while the dropdown is open. + - `OpenIcon`: icon used while the dropdown is closed, see [Icons](#icons). + - `CloseIcon`: icon used while the dropdown is open, see [Icons](#icons). - `IconColor`: one of the MudBlazor `Color` enum names such as `Primary`, `Secondary`, `Warning`; invalid or omitted values fall back to `Default`. - `IconPositon`: one of `Start` or `End`; controls where the icon adornment is rendered. - `Variant`: one of the MudBlazor `Variant` enum names such as `Text`, `Filled`, `Outlined`; invalid or omitted values fall back to `Outlined`. @@ -345,8 +354,8 @@ More information on rendered components can be found [here](https://www.mudblazo ["HasSelectAll"] = true, ["SelectAllText"] = "Select all countries", ["HelperText"] = "Pick one or more countries.", - ["OpenIcon"] = "Icons.Material.Filled.ArrowDropDown", - ["CloseIcon"] = "Icons.Material.Filled.ArrowDropUp", + ["OpenIcon"] = "lucide:chevron-down", + ["CloseIcon"] = "lucide:chevron-up", ["IconColor"] = "Secondary", ["IconPositon"] = "End", ["Variant"] = "Filled", @@ -379,8 +388,8 @@ More information on rendered components can be found [here](https://www.mudblazo - `Color`: one of the MudBlazor `Color` enum names such as `Default`, `Primary`, `Secondary`, `Info`; omitted values fall back to `Default`. - `IsFullWidth`: defaults to `false`; when `true`, the button expands to the available width. - `Size`: one of the MudBlazor `Size` enum names such as `Small`, `Medium`, `Large`; omitted values fall back to `Medium`. - - `StartIcon`: MudBlazor icon identifier string rendered before the button text, or used as the icon itself when `IsIconButton = true`. - - `EndIcon`: MudBlazor icon identifier string rendered after the button text. + - `StartIcon`: icon rendered before the button text, or used as the icon itself when `IsIconButton = true`, see [Icons](#icons). + - `EndIcon`: icon rendered after the button text, see [Icons](#icons). - `IconColor`: one of the MudBlazor `Color` enum names for text-button icons; omitted values fall back to `Inherit`. - `IconSize`: one of the MudBlazor `Size` enum names; omitted values fall back to `Medium`. - `Class`, `Style`: forwarded to the rendered component for layout/styling. @@ -415,8 +424,8 @@ More information on rendered components can be found [here](https://www.mudblazo ["Color"] = "Primary", ["IsFullWidth"] = false, ["Size"] = "Medium", - ["StartIcon"] = "Icons.Material.Filled.AutoFixHigh", - ["EndIcon"] = "Icons.Material.Filled.ArrowForward", + ["StartIcon"] = "lucide:wand-sparkles", + ["EndIcon"] = "lucide:arrow-right", ["IconColor"] = "Inherit", ["IconSize"] = "Medium", ["Action"] = function(input) @@ -453,7 +462,7 @@ More information on rendered components can be found [here](https://www.mudblazo ["Variant"] = "Outlined", ["Color"] = "Primary", ["Size"] = "Medium", - ["StartIcon"] = "Icons.Material.Filled.Refresh", + ["StartIcon"] = "lucide:refresh-cw", ["Action"] = function(input) return { state = { @@ -510,7 +519,7 @@ More information on rendered components can be found [here](https://www.mudblazo } } end, - ["StartIcon"] = "Icons.Material.Filled.Build" + ["StartIcon"] = "lucide:wrench" } }, { @@ -523,7 +532,7 @@ More information on rendered components can be found [here](https://www.mudblazo LogError("ColorPicker value: " .. colorValue) return nil end, - ["EndIcon"] = "Icons.Material.Filled.BugReport" + ["EndIcon"] = "lucide:bug" } } } @@ -544,7 +553,7 @@ More information on rendered components can be found [here](https://www.mudblazo - `LabelOn`: text shown when the switch value is `true`. - `LabelOff`: text shown when the switch value is `false`. - `LabelPlacement`: one of `Bottom`, `End`, `Left`, `Right`, `Start`, `Top`; omitted values follow the renderer default. - - `Icon`: MudBlazor icon identifier string displayed inside the switch thumb. + - `Icon`: icon displayed inside the switch thumb, see [Icons](#icons). - `IconColor`: one of the MudBlazor `Color` enum names such as `Primary`, `Secondary`, `Warning`; omitted values default to `Inherit`. - `CheckedColor`: color used when the switch state is `true`; omitted values default to `Inherit`. - `UncheckedColor`: color used when the switch state is `false`; omitted values default to `Inherit`. @@ -573,7 +582,7 @@ More information on rendered components can be found [here](https://www.mudblazo ["LabelOn"] = "Summary enabled", ["LabelOff"] = "Summary disabled", ["LabelPlacement"] = "End", - ["Icon"] = "Icons.Material.Filled.Summarize", + ["Icon"] = "lucide:file-text", ["IconColor"] = "Primary", ["CheckedColor"] = "Success", ["UncheckedColor"] = "Default", @@ -1113,12 +1122,12 @@ Use `LAYOUT_ACCORDION` as the outer wrapper and put the actual content into one - `IsDense`: defaults to `false`; reduces section density. - `HasInnerPadding`: defaults to `true`; controls the inner content gutter/padding. - `HideIcon`: defaults to `false`; hides the expand/collapse icon. - - `HeaderIcon`: MudBlazor icon identifier rendered before the header text. + - `HeaderIcon`: icon rendered before the header text, see [Icons](#icons). - `HeaderColor`: one of the MudBlazor `Color` enum names such as `Primary`, `Secondary`, `Warning`; omitted values fall back to `Inherit`. - `HeaderTypo`: one of the MudBlazor `Typo` enum names such as `body1`, `subtitle1`, `h6`; omitted values follow the renderer default. - `HeaderAlign`: one of the MudBlazor `Align` enum names such as `Start`, `Center`, `End`; omitted values follow the renderer default. - `MaxHeight`: nullable integer max height in pixels for the expanded content area. - - `ExpandIcon`: MudBlazor icon identifier used for the expand/collapse control. + - `ExpandIcon`: icon used for the expand/collapse control, see [Icons](#icons). - `Class`, `Style`: forwarded to the rendered `MudExpansionPanel` for layout/styling. - `Children` may contain any other assistant components you want to reveal inside the section. @@ -1134,12 +1143,12 @@ Use `LAYOUT_ACCORDION` as the outer wrapper and put the actual content into one ["IsDense"] = false, ["HasInnerPadding"] = true, ["HideIcon"] = false, - ["HeaderIcon"] = "Icons.Material.Filled.Tune", + ["HeaderIcon"] = "lucide:sliders-horizontal", ["HeaderColor"] = "Primary", ["HeaderTypo"] = "subtitle1", ["HeaderAlign"] = "Start", ["MaxHeight"] = 320, - ["ExpandIcon"] = "Icons.Material.Filled.ExpandMore" + ["ExpandIcon"] = "lucide:chevron-down" }, ["Children"] = { { @@ -1208,7 +1217,8 @@ LogInfo(dt.day .. "." .. dt.month .. "." .. dt.year) ## Useful Resources - [translation example](./examples/translation/plugin.lua) - [plugin.lua - Lua Manifest](https://github.com/MindWorkAI/AI-Studio/tree/main/app/MindWork%20AI%20Studio/Plugins/assistants/plugin.lua) -- [Supported Icons](https://www.mudblazor.com/features/icons#icons) +- [Lucide Icons](https://lucide.dev/icons/), named as `"lucide:"` +- [MudBlazor Icons](https://www.mudblazor.com/features/icons#icons), the older way to name an icon - [AI Studio Repository](https://github.com/MindWorkAI/AI-Studio/) - [Lua 5.2 Reference Manual](https://www.lua.org/manual/5.2/manual.html) - [MudBlazor Documentation](https://www.mudblazor.com/docs/overview) diff --git a/app/MindWork AI Studio/Plugins/assistants/icon.lua b/app/MindWork AI Studio/Plugins/assistants/icon.lua index 045bd983f..24bb91360 100644 --- a/app/MindWork AI Studio/Plugins/assistants/icon.lua +++ b/app/MindWork AI Studio/Plugins/assistants/icon.lua @@ -1 +1 @@ -SVG = [[]] \ No newline at end of file +SVG = [[]] \ No newline at end of file diff --git a/app/MindWork AI Studio/Plugins/assistants/plugin.lua b/app/MindWork AI Studio/Plugins/assistants/plugin.lua index 585270c3c..1bbd8a516 100644 --- a/app/MindWork AI Studio/Plugins/assistants/plugin.lua +++ b/app/MindWork AI Studio/Plugins/assistants/plugin.lua @@ -107,7 +107,7 @@ ASSISTANT = { ["Name"] = "", -- required ["Label"] = "", -- required ["Adornment"] = "", -- location of the `AdornmentIcon` OR `AdornmentText`; CASE SENSITIVE - ["AdornmentIcon"] = "Icons.Material.Filled.AppSettingsAlt", -- The Mudblazor icon displayed for the adornment + ["AdornmentIcon"] = "lucide:settings", -- The icon displayed for the adornment: a Lucide icon as "lucide:" with its name on lucide.dev, or a MudBlazor icon such as "Icons.Material.Filled.Home" ["AdornmentText"] = "", -- The text displayed for the adornment ["AdornmentColor"] = "", -- the color of AdornmentText or AdornmentIcon; CASE SENSITIVE ["Counter"] = 0, -- shows a character counter. When 0, the current character count is displayed. When 1 or greater, the character count and this count are displayed. Defaults to `null` @@ -133,8 +133,8 @@ ASSISTANT = { ["HasSelectAll"] = false, ["SelectAllText"] = "