From bcb952893316bc21fa170d48f71a9da927c18afa Mon Sep 17 00:00:00 2001 From: Dominic Neuburg Date: Thu, 25 Jun 2026 19:07:16 +0200 Subject: [PATCH] Modernize UI with Material Design styling --- .../Assistants/I18N/allTexts.lua | 27 +++ .../Components/AssistantBlock.razor | 8 +- .../Components/AssistantBlock.razor.cs | 8 +- .../Components/ChatComponent.razor | 3 +- .../Components/ExpansionPanel.razor | 2 +- .../Components/InnerScrolling.razor | 2 +- .../Layout/MainLayout.razor | 2 +- app/MindWork AI Studio/Pages/Assistants.razor | 6 +- app/MindWork AI Studio/Pages/Chat.razor | 19 +- app/MindWork AI Studio/Pages/Home.razor | 18 +- app/MindWork AI Studio/Pages/Home.razor.cs | 54 +++++- .../Pages/Information.razor | 6 +- app/MindWork AI Studio/Pages/Plugins.razor | 6 +- app/MindWork AI Studio/Pages/Settings.razor | 4 +- app/MindWork AI Studio/Pages/Supporters.razor | 18 +- app/MindWork AI Studio/Pages/Writer.razor | 6 +- .../plugin.lua | 27 +++ .../plugin.lua | 27 +++ app/MindWork AI Studio/Program.cs | 18 +- app/MindWork AI Studio/wwwroot/app.css | 171 ++++++++++++++++++ .../wwwroot/svg/banner-analyze.svg | 158 ++++++++++++++++ .../wwwroot/svg/banner-chat.svg | 103 +++++++++++ .../wwwroot/svg/banner-develop.svg | 85 +++++++++ .../wwwroot/svg/banner-innovate.svg | 110 +++++++++++ .../wwwroot/svg/banner-learn.svg | 80 ++++++++ .../wwwroot/svg/banner-plan.svg | 143 +++++++++++++++ .../wwwroot/svg/banner-research.svg | 154 ++++++++++++++++ .../wwwroot/svg/banner-think.svg | 99 ++++++++++ .../wwwroot/svg/banner-write.svg | 160 ++++++++++++++++ runtime/ui/index.html | 25 ++- 30 files changed, 1495 insertions(+), 54 deletions(-) create mode 100644 app/MindWork AI Studio/wwwroot/svg/banner-analyze.svg create mode 100644 app/MindWork AI Studio/wwwroot/svg/banner-chat.svg create mode 100644 app/MindWork AI Studio/wwwroot/svg/banner-develop.svg create mode 100644 app/MindWork AI Studio/wwwroot/svg/banner-innovate.svg create mode 100644 app/MindWork AI Studio/wwwroot/svg/banner-learn.svg create mode 100644 app/MindWork AI Studio/wwwroot/svg/banner-plan.svg create mode 100644 app/MindWork AI Studio/wwwroot/svg/banner-research.svg create mode 100644 app/MindWork AI Studio/wwwroot/svg/banner-think.svg create mode 100644 app/MindWork AI Studio/wwwroot/svg/banner-write.svg diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua index bd5d8535..c9d8fb52 100644 --- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua +++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua @@ -6091,6 +6091,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T144565305"] = "The app requires minimal -- You only pay for what you use, which can be cheaper than monthly subscription services like ChatGPT Plus, especially if used infrequently. But beware, here be dragons: For extremely intensive usage, the API costs can be significantly higher. Unfortunately, providers currently do not offer a way to display current costs in the app. Therefore, check your account with the respective provider to see how your costs are developing. When available, use prepaid and set a cost limit. UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T149711988"] = "You only pay for what you use, which can be cheaper than monthly subscription services like ChatGPT Plus, especially if used infrequently. But beware, here be dragons: For extremely intensive usage, the API costs can be significantly higher. Unfortunately, providers currently do not offer a way to display current costs in the app. Therefore, check your account with the respective provider to see how your costs are developing. When available, use prepaid and set a cost limit." +-- Research +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1554954732"] = "Research" + -- Version UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1573770551"] = "Version" @@ -6100,12 +6103,18 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1614176092"] = "Assistants" -- We want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 EUR such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs or use affordable cloud models. UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1628689293"] = "We want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 EUR such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs or use affordable cloud models." +-- Analyze +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1684119411"] = "Analyze" + -- Unrestricted usage UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1686815996"] = "Unrestricted usage" -- Introduction UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1702902297"] = "Introduction" +-- Write +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1717336572"] = "Write" + -- Vision UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1892426825"] = "Vision" @@ -6139,18 +6148,36 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3723223888"] = "Flexibility" -- You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT5, o1, etc.), Perplexity, Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), OpenRouter, Hugging Face, and self-hosted models using vLLM, llama.cpp, ollama, LM Studio, Groq, or Fireworks. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities. UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3892227145"] = "You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT5, o1, etc.), Perplexity, Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), OpenRouter, Hugging Face, and self-hosted models using vLLM, llama.cpp, ollama, LM Studio, Groq, or Fireworks. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities." +-- Innovate +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3957848315"] = "Innovate" + -- Privacy UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3959064551"] = "Privacy" -- You can control which providers receive your data using the provider confidence settings. For example, you can set different protection levels for writing emails compared to general chats, etc. Additionally, most providers guarantee that they won't use your data to train new AI systems. UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T457410099"] = "You can control which providers receive your data using the provider confidence settings. For example, you can set different protection levels for writing emails compared to general chats, etc. Additionally, most providers guarantee that they won't use your data to train new AI systems." +-- Plan +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T514547250"] = "Plan" + +-- Chat +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T578410699"] = "Chat" + -- Free of charge UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T617579208"] = "Free of charge" +-- Think +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T620705787"] = "Think" + +-- Learn +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T623175861"] = "Learn" + -- Independence UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T649448159"] = "Independence" +-- Develop +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T803454394"] = "Develop" + -- No bloatware UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T858047957"] = "No bloatware" diff --git a/app/MindWork AI Studio/Components/AssistantBlock.razor b/app/MindWork AI Studio/Components/AssistantBlock.razor index 973af871..7bfc391f 100644 --- a/app/MindWork AI Studio/Components/AssistantBlock.razor +++ b/app/MindWork AI Studio/Components/AssistantBlock.razor @@ -3,7 +3,7 @@ @if (this.IsVisible) { - + @@ -23,13 +23,13 @@ - - + + @this.ButtonText @if (this.HasSettingsPanel) { - + } @if (this.SecurityBadge is not null) diff --git a/app/MindWork AI Studio/Components/AssistantBlock.razor.cs b/app/MindWork AI Studio/Components/AssistantBlock.razor.cs index dde37267..869bde8f 100644 --- a/app/MindWork AI Studio/Components/AssistantBlock.razor.cs +++ b/app/MindWork AI Studio/Components/AssistantBlock.razor.cs @@ -50,13 +50,7 @@ public partial class AssistantBlock : MSGComponentBase where TSetting await this.DialogService.ShowAsync(T("Open Settings"), dialogParameters, DialogOptions.FULLSCREEN); } - private string BorderColor => this.SettingsManager.IsDarkMode switch - { - true => this.ColorTheme.GetCurrentPalette(this.SettingsManager).GrayLight, - false => this.ColorTheme.GetCurrentPalette(this.SettingsManager).Primary.Value, - }; - - private string BlockStyle => $"border-width: 2px; border-color: {this.BorderColor}; border-radius: 12px; border-style: solid; max-width: 20em;"; + private string BlockStyle => "border-radius: 12px; max-width: 20em;"; private bool IsVisible => this.SettingsManager.IsAssistantVisible(this.Component, assistantName: this.Name, requiredPreviewFeature: this.RequiredPreviewFeature); diff --git a/app/MindWork AI Studio/Components/ChatComponent.razor b/app/MindWork AI Studio/Components/ChatComponent.razor index 45c0584c..90f2aa99 100644 --- a/app/MindWork AI Studio/Components/ChatComponent.razor +++ b/app/MindWork AI Studio/Components/ChatComponent.razor @@ -46,6 +46,7 @@ Placeholder="@this.ProviderPlaceholder" Adornment="Adornment.End" AdornmentIcon="@Icons.Material.Filled.Send" + AdornmentColor="Color.Primary" OnAdornmentClick="() => this.SendMessage()" Disabled="@this.IsInputForbidden()" Immediate="@true" @@ -54,7 +55,7 @@ Class="@this.UserInputClass" Style="@this.UserInputStyle"/> - + @if ( this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is not WorkspaceStorageBehavior.DISABLE_WORKSPACES diff --git a/app/MindWork AI Studio/Components/ExpansionPanel.razor b/app/MindWork AI Studio/Components/ExpansionPanel.razor index 329bfd08..90bc519b 100644 --- a/app/MindWork AI Studio/Components/ExpansionPanel.razor +++ b/app/MindWork AI Studio/Components/ExpansionPanel.razor @@ -1,4 +1,4 @@ - +
diff --git a/app/MindWork AI Studio/Components/InnerScrolling.razor b/app/MindWork AI Studio/Components/InnerScrolling.razor index 6905bf2d..938cd618 100644 --- a/app/MindWork AI Studio/Components/InnerScrolling.razor +++ b/app/MindWork AI Studio/Components/InnerScrolling.razor @@ -17,7 +17,7 @@ @if (this.FooterContent is not null) { - + @this.FooterContent } diff --git a/app/MindWork AI Studio/Layout/MainLayout.razor b/app/MindWork AI Studio/Layout/MainLayout.razor index 75807868..1fac1fa1 100644 --- a/app/MindWork AI Studio/Layout/MainLayout.razor +++ b/app/MindWork AI Studio/Layout/MainLayout.razor @@ -6,7 +6,7 @@ @inherits LayoutComponentBase - + @if (!this.performingUpdate) { diff --git a/app/MindWork AI Studio/Pages/Assistants.razor b/app/MindWork AI Studio/Pages/Assistants.razor index cec6c561..c2531875 100644 --- a/app/MindWork AI Studio/Pages/Assistants.razor +++ b/app/MindWork AI Studio/Pages/Assistants.razor @@ -5,9 +5,9 @@ @inherits MSGComponentBase
- - @T("Assistants") - +
+ @T("Assistants") +
diff --git a/app/MindWork AI Studio/Pages/Chat.razor b/app/MindWork AI Studio/Pages/Chat.razor index a7b85d53..b69e13f1 100644 --- a/app/MindWork AI Studio/Pages/Chat.razor +++ b/app/MindWork AI Studio/Pages/Chat.razor @@ -4,8 +4,8 @@
- - +
+ @if (this.chatThread is not null && this.chatThread.WorkspaceId != Guid.Empty) { @(T("Chat in Workspace") + $" \"{this.currentWorkspaceName}\"") @@ -15,8 +15,7 @@ @T("Disappearing Chat") } - - + @if (this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is WorkspaceStorageBehavior.DISABLE_WORKSPACES) { @@ -24,22 +23,22 @@ } - + - +
@if (this.AreWorkspacesVisible) { - + @if (this.SettingsManager.ConfigurationData.Workspace.DisplayBehavior is WorkspaceDisplayBehavior.TOGGLE_SIDEBAR && this.SettingsManager.ConfigurationData.Workspace.IsSidebarVisible) { // Case: Sidebar can be toggled and is currently visible - + @@ -67,7 +66,7 @@ else { // Case: Sidebar is always visible - + @@ -105,7 +104,7 @@ { // Case: Sidebar can be toggled and is currently hidden - + diff --git a/app/MindWork AI Studio/Pages/Home.razor b/app/MindWork AI Studio/Pages/Home.razor index d6c4158a..16c24f69 100644 --- a/app/MindWork AI Studio/Pages/Home.razor +++ b/app/MindWork AI Studio/Pages/Home.razor @@ -2,10 +2,20 @@ @inherits MSGComponentBase
- - - @T("Let's get started") - + +
+ @T("Let's get started") +
diff --git a/app/MindWork AI Studio/Pages/Home.razor.cs b/app/MindWork AI Studio/Pages/Home.razor.cs index 5fb95872..6a1ec13c 100644 --- a/app/MindWork AI Studio/Pages/Home.razor.cs +++ b/app/MindWork AI Studio/Pages/Home.razor.cs @@ -16,8 +16,36 @@ public partial class Home : MSGComponentBase [Inject] private NavigationManager NavigationManager { get; init; } = null!; + private static readonly string[] BANNER_IMAGES = [ + "svg/banner-analyze.svg", + "svg/banner-research.svg", + "svg/banner-learn.svg", + "svg/banner-think.svg", + "svg/banner-innovate.svg", + "svg/banner-develop.svg", + "svg/banner-plan.svg", + "svg/banner-write.svg", + "svg/banner-chat.svg", + ]; + + private string[] BannerTabLabels => + [ + T("Analyze"), T("Research"), T("Learn"), T("Think"), T("Innovate"), + T("Develop"), T("Plan"), T("Write"), T("Chat"), + ]; + + private string BannerLabel => this.BannerTabLabels[this.ActiveTabIndex]; + + private int bannerIndex = BANNER_IMAGES.Length - 1; + private PeriodicTimer? bannerTimer; + private CancellationTokenSource? bannerCts; + + private string BannerBottomSrc => BANNER_IMAGES[this.bannerIndex % BANNER_IMAGES.Length]; + private string BannerTopSrc => BANNER_IMAGES[(this.bannerIndex + 1) % BANNER_IMAGES.Length]; + private int ActiveTabIndex => (this.bannerIndex + 1) % BANNER_IMAGES.Length; + private string LastChangeContent { get; set; } = string.Empty; - + private TextItem[] itemsAdvantages = []; private List introductions = []; @@ -42,6 +70,7 @@ public partial class Home : MSGComponentBase // Read the last change content asynchronously // without blocking the UI thread: _ = this.ReadLastChangeAsync(); + _ = this.StartBannerCycleAsync(); } protected override Task OnAfterRenderAsync(bool firstRender) @@ -131,8 +160,31 @@ public partial class Home : MSGComponentBase return Task.CompletedTask; } + protected override void DisposeResources() + { + this.bannerCts?.Cancel(); + this.bannerTimer?.Dispose(); + } + private static string IntroductionPanelId(DataIntroduction introduction) => $"introduction:{introduction.Id}"; + private async Task StartBannerCycleAsync() + { + this.bannerCts?.Cancel(); + this.bannerCts = new CancellationTokenSource(); + this.bannerTimer?.Dispose(); + this.bannerTimer = new PeriodicTimer(TimeSpan.FromSeconds(10)); + try + { + while (await this.bannerTimer.WaitForNextTickAsync(this.bannerCts.Token)) + { + this.bannerIndex++; + await this.InvokeAsync(this.StateHasChanged); + } + } + catch (OperationCanceledException) { } + } + private async Task ReadLastChangeAsync() { var latest = Changelog.LOGS.MaxBy(n => n.Build); diff --git a/app/MindWork AI Studio/Pages/Information.razor b/app/MindWork AI Studio/Pages/Information.razor index ac3df15e..9ef3bb0d 100644 --- a/app/MindWork AI Studio/Pages/Information.razor +++ b/app/MindWork AI Studio/Pages/Information.razor @@ -3,9 +3,9 @@ @inherits MSGComponentBase
- - @T("Information about MindWork AI Studio") - +
+ @T("Information about MindWork AI Studio") +
diff --git a/app/MindWork AI Studio/Pages/Plugins.razor b/app/MindWork AI Studio/Pages/Plugins.razor index 26167b11..26036c96 100644 --- a/app/MindWork AI Studio/Pages/Plugins.razor +++ b/app/MindWork AI Studio/Pages/Plugins.razor @@ -4,9 +4,9 @@ @attribute [Route(Routes.PLUGINS)]
- - @T("Plugins") - +
+ @T("Plugins") +
diff --git a/app/MindWork AI Studio/Pages/Settings.razor b/app/MindWork AI Studio/Pages/Settings.razor index fa711ee1..d5187d0f 100644 --- a/app/MindWork AI Studio/Pages/Settings.razor +++ b/app/MindWork AI Studio/Pages/Settings.razor @@ -4,7 +4,9 @@ @inherits MSGComponentBase
- @T("Settings") +
+ @T("Settings") +
diff --git a/app/MindWork AI Studio/Pages/Supporters.razor b/app/MindWork AI Studio/Pages/Supporters.razor index 5eb7963e..fd28c0f1 100644 --- a/app/MindWork AI Studio/Pages/Supporters.razor +++ b/app/MindWork AI Studio/Pages/Supporters.razor @@ -2,15 +2,15 @@ @inherits MSGComponentBase
- - @T("Supporters") - +
+ @T("Supporters") +
-
+ @T("Our Titans") @@ -28,11 +28,11 @@ @T("Become one of our titans") -
+ - + @T("Individual Contributors") @@ -61,7 +61,7 @@ - + @T("Business Contributors") @@ -79,7 +79,7 @@ - + @T("Code Contributions") @@ -95,7 +95,7 @@ - + @T("Moderation, Design, Wiki, and Documentation") diff --git a/app/MindWork AI Studio/Pages/Writer.razor b/app/MindWork AI Studio/Pages/Writer.razor index 503a284f..3a5b13c7 100644 --- a/app/MindWork AI Studio/Pages/Writer.razor +++ b/app/MindWork AI Studio/Pages/Writer.razor @@ -2,9 +2,9 @@ @inherits MSGComponentBase
- - @T("Writer") - +
+ @T("Writer") +
diff --git a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua index eecc3ce3..2863232d 100644 --- a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua +++ b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua @@ -6162,6 +6162,33 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T873851215"] = "Das zeichnet MindWork AI -- The app is free to use, both for personal and commercial purposes. UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T91074375"] = "Die App ist sowohl für private als auch für kommerzielle Zwecke kostenlos nutzbar." +-- Analyze +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1684119411"] = "Analysieren" + +-- Research +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1554954732"] = "Recherchieren" + +-- Learn +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T623175861"] = "Lernen" + +-- Think +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T620705787"] = "Denken" + +-- Innovate +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3957848315"] = "Innovieren" + +-- Develop +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T803454394"] = "Entwickeln" + +-- Plan +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T514547250"] = "Planen" + +-- Write +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1717336572"] = "Schreiben" + +-- Chat +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T578410699"] = "Chat" + -- Startup log file UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1019424746"] = "Startprotokolldatei" diff --git a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua index c60b245a..e954a5b6 100644 --- a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua +++ b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua @@ -6162,6 +6162,33 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T873851215"] = "Here's what makes MindWo -- The app is free to use, both for personal and commercial purposes. UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T91074375"] = "The app is free to use, both for personal and commercial purposes." +-- Analyze +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1684119411"] = "Analyze" + +-- Research +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1554954732"] = "Research" + +-- Learn +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T623175861"] = "Learn" + +-- Think +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T620705787"] = "Think" + +-- Innovate +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3957848315"] = "Innovate" + +-- Develop +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T803454394"] = "Develop" + +-- Plan +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T514547250"] = "Plan" + +-- Write +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1717336572"] = "Write" + +-- Chat +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T578410699"] = "Chat" + -- Startup log file UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1019424746"] = "Startup log file" diff --git a/app/MindWork AI Studio/Program.cs b/app/MindWork AI Studio/Program.cs index 95ba5490..b854cf2c 100644 --- a/app/MindWork AI Studio/Program.cs +++ b/app/MindWork AI Studio/Program.cs @@ -123,7 +123,23 @@ internal sealed class Program builder.Services.AddMemoryCache(); // Needed for the Markdown library builder.Services.AddMudMarkdownServices(); - builder.Services.AddSingleton(new MudTheme()); + builder.Services.AddSingleton(new MudTheme + { + PaletteLight = new PaletteLight + { + Background = "#F0F4F8", + Primary = "#4d9970", + PrimaryDarken = "#3d8960", + PrimaryLighten = "#6db990", + }, + PaletteDark = new PaletteDark + { + Background = "#0c0c14", + Primary = "#4d9970", + PrimaryDarken = "#3d8960", + PrimaryLighten = "#6db990", + }, + }); builder.Services.AddSingleton(MessageBus.INSTANCE); builder.Services.AddSingleton(rust); builder.Services.AddMudMarkdownClipboardService(); diff --git a/app/MindWork AI Studio/wwwroot/app.css b/app/MindWork AI Studio/wwwroot/app.css index a6631ea6..f2cb0881 100644 --- a/app/MindWork AI Studio/wwwroot/app.css +++ b/app/MindWork AI Studio/wwwroot/app.css @@ -38,6 +38,52 @@ margin-top: 4px; } +/* Navbar modernization — rounded pill, centered icon, green active state */ +.mud-nav-link { + border-radius: 8px !important; + margin: 2px 4px 2px -2px !important; +} + +.mud-navmenu.mud-navmenu-default .mud-nav-link.active:not(.mud-nav-link-disabled) { + border-inline-end: none !important; + background-color: var(--mud-palette-primary) !important; + color: white !important; +} + +.mud-navmenu.mud-navmenu-default .mud-nav-link.active:not(.mud-nav-link-disabled):hover:not(.mud-nav-link-disabled) { + background-color: var(--mud-palette-primary-darken) !important; +} + +.mud-nav-link.active:not(.mud-nav-link-disabled) .mud-icon-root { + color: white !important; +} + +/* MUI-style elevation for expansion panels — replace border separators with shadows */ +.mud-expand-panel, +.mud-expand-panel.mud-expand-panel-border, +.mud-expand-panel:first-child, +.mud-expand-panel:last-child { + border-bottom: none; + border-top: none; + border-radius: 8px; + margin-bottom: 8px; + box-shadow: var(--mud-elevation-1); + transition: box-shadow 0.25s ease, margin 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); +} + +.mud-expand-panel.mud-panel-expanded { + box-shadow: var(--mud-elevation-4); + margin: 12px 0; +} + +.mud-expand-panel.mud-panel-expanded:first-child { + margin-top: 0; +} + +.mud-expand-panel.mud-panel-expanded:last-child { + margin-bottom: 0; +} + .plugin-icon-container { width: var(--mud-icon-size-large); height: var(--mud-icon-size-large); @@ -54,6 +100,7 @@ :root { --confidence-color: #000000; + --mud-default-borderradius: 10px; } .confidence-icon { @@ -192,3 +239,127 @@ margin-left: 0 !important; margin-right: 0 !important; } + +.banner-wrapper { + display: grid; + width: calc(100% + 1em + 48px); + margin-left: calc(-1em - 24px); + margin-right: -24px; + position: relative; + background-color: #1a4d38; +} + +.banner-img { + grid-area: 1 / 1; + width: 100%; + object-fit: cover; +} + +.banner-img-top { + animation: banner-fadein 1.2s ease-in-out forwards; +} + +.banner-indicators { + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); + display: flex; + gap: 0.25rem; + padding: 0.35rem 1rem; + background: rgba(0, 0, 0, 0.68); + border-radius: 0 0 6px 6px; + pointer-events: none; + white-space: nowrap; +} + +@media (max-width: 820px) { + .banner-indicators { + display: none; + } +} + +.banner-indicator { + font-size: 0.78rem; + color: rgba(255, 255, 255, 0.45); + letter-spacing: 0.03em; + transition: color 0.4s ease; + padding: 0 0.4rem; +} + +.banner-indicator-active { + color: rgba(255, 255, 255, 0.95); + font-weight: 700; +} + +.banner-label { + position: absolute; + left: 65%; + bottom: 2.4vw; + transform: translateX(-50%); + font-family: Helvetica, 'Helvetica Neue', Arial, sans-serif; + font-size: clamp(16px, 3.23vw, 62px); + font-weight: 600; + color: #f5e060; + text-shadow: 3px 4px 0 rgba(7, 26, 13, 0.40); + letter-spacing: -0.03em; + pointer-events: none; + white-space: nowrap; + user-select: none; + animation: banner-fadein 1.2s ease-in-out forwards; +} + +/* Page header bar — primary-colored full-width banner replacing plain h3 titles */ +.page-header-bar { + display: flex; + flex-direction: row; + align-items: center; + background-color: var(--mud-palette-primary); + padding: 10px 24px 10px calc(1em + 24px); + margin-left: calc(-1em - 24px); + margin-right: -24px; + margin-bottom: 16px; + color: white; +} + +.page-header-bar .mud-typography { + color: white !important; +} + +.page-header-bar .mud-icon-button, +.page-header-bar .mud-icon-button .mud-icon-root { + color: white !important; +} + +/* Splitter: thin bar, muted at rest → primary on hover. + Use .inner-scrolling-context path (3 class selectors) to beat MudBlazor's own thumb specificity. */ +.inner-scrolling-context > .mud-splitter > .mud-slider ::-webkit-slider-thumb { + width: 4px !important; + height: 100% !important; + border-radius: 0 !important; + background-color: rgba(192, 192, 192, 0.35) !important; + box-shadow: none !important; + transition: background-color 0.2s ease !important; +} + +.inner-scrolling-context > .mud-splitter > .mud-slider:hover ::-webkit-slider-thumb { + background-color: var(--mud-palette-primary) !important; +} + +.inner-scrolling-context > .mud-splitter > .mud-slider ::-moz-range-thumb { + width: 4px !important; + height: 100% !important; + border-radius: 0 !important; + background-color: rgba(192, 192, 192, 0.35) !important; + box-shadow: none !important; + transition: background-color 0.2s ease !important; +} + +.inner-scrolling-context > .mud-splitter > .mud-slider:hover ::-moz-range-thumb { + background-color: var(--mud-palette-primary) !important; +} + +@keyframes banner-fadein { + from { opacity: 0; } + to { opacity: 1; } +} diff --git a/app/MindWork AI Studio/wwwroot/svg/banner-analyze.svg b/app/MindWork AI Studio/wwwroot/svg/banner-analyze.svg new file mode 100644 index 00000000..c6b7909d --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/svg/banner-analyze.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AI Studio + + AI Studio + \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/svg/banner-chat.svg b/app/MindWork AI Studio/wwwroot/svg/banner-chat.svg new file mode 100644 index 00000000..c9f8b425 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/svg/banner-chat.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AI Studio + AI Studio + \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/svg/banner-develop.svg b/app/MindWork AI Studio/wwwroot/svg/banner-develop.svg new file mode 100644 index 00000000..1fad6e9e --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/svg/banner-develop.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + console.log('Hello AI Studio'); + + + + + AI Studio + AI Studio + \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/svg/banner-innovate.svg b/app/MindWork AI Studio/wwwroot/svg/banner-innovate.svg new file mode 100644 index 00000000..485675ed --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/svg/banner-innovate.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AI Studio + AI Studio + \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/svg/banner-learn.svg b/app/MindWork AI Studio/wwwroot/svg/banner-learn.svg new file mode 100644 index 00000000..886e6d71 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/svg/banner-learn.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AI Studio + AI Studio + \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/svg/banner-plan.svg b/app/MindWork AI Studio/wwwroot/svg/banner-plan.svg new file mode 100644 index 00000000..8d5c54d6 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/svg/banner-plan.svg @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MoTuWe + ThFrSaSu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 123 + 45 + 89 + 10 + 1112 + 15 + 16 + 171819 + 222324 + 25 + + + + + + + + + + + AI Studio + AI Studio + \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/svg/banner-research.svg b/app/MindWork AI Studio/wwwroot/svg/banner-research.svg new file mode 100644 index 00000000..dbaa809b --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/svg/banner-research.svg @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AI Studio + AI Studio + \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/svg/banner-think.svg b/app/MindWork AI Studio/wwwroot/svg/banner-think.svg new file mode 100644 index 00000000..3aaf7027 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/svg/banner-think.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AI Studio + AI Studio + \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/svg/banner-write.svg b/app/MindWork AI Studio/wwwroot/svg/banner-write.svg new file mode 100644 index 00000000..d2dcdf84 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/svg/banner-write.svg @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AI Studio + AI Studio + \ No newline at end of file diff --git a/runtime/ui/index.html b/runtime/ui/index.html index c7882d7b..f64de4bf 100644 --- a/runtime/ui/index.html +++ b/runtime/ui/index.html @@ -17,14 +17,37 @@ display: block; } + .container { + display: flex; + flex-direction: column; + align-items: center; + gap: 0; + } + + p { + margin: 0; + font-family: Helvetica, "Helvetica Neue", Arial, sans-serif; + font-size: 80px; + font-weight: 700; + letter-spacing: 0; + color: #333333; + } + @media (prefers-color-scheme: dark) { html, body { background-color: #1a1a1a; } + + p { + color: #cccccc; + } } - The app logo +
+ The app logo +

MindWork AI Studio

+
\ No newline at end of file