From 33d95a6c3fbf3c9059835f61ed0a7356bfd080ac Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 23 Aug 2026 12:16:05 +0200 Subject: [PATCH] UI-Entwurf umgesetzt, Rocket.Chat-Tool, Deploymentcenter 2.4 Sicherungspunkt vor dem Aufraeumen. Buendelt die Arbeit, die seit dem Abschluss der Avalonia-Portierung im Arbeitsverzeichnis lag. Oberflaeche - Entwurf aus Mockup/ umgesetzt: Theme.axaml (Farben je Thema, Barlow als mitgelieferte Schrift), Icons.axaml (Symbolgeometrien), Shell.axaml (eigene ControlThemes statt Fluent umzufaerben). - Neue Steuerelemente StrokeIcon und BlueprintFrame, Seiten fuer Token-Verbrauch und Agenten-Chats, Werkzeug-Einstellungen als Seite statt eigenem Fenster, Texteditor-Fenster. - ThemeManager mit hellem und dunklem Thema; die beiden Pinsel-Konverter entfallen, weil ein fester Farbwert den Themenwechsel nicht ueberlebt. Rocket.Chat - Neues Tool-Projekt (Client, Konfiguration, Workspace-Dateien) nach der Bauform des Telegram-Tools: rocketchat_poll als Tool-Job, geweckt wird nur, wenn wirklich etwas anliegt. - send_file ist freigabepflichtig, send_message bewusst nicht: Der Raum ist Arbeitsraum, der Schutz sitzt an der Raum-Allowlist. - Konzept-Doc um die Messung gegen die echte Instanz 8.7 ergaenzt; drei Annahmen waren falsch und sind korrigiert. Deploymentcenter - DC6 (Update anwenden) und DC7 (Erstinstallation ueber setup.json) erledigt, DC3 fuer win-x64/dev; deploy/publish.py als Release-Strecke. - AppHost.DisposeAsync gegen doppeltes Herunterfahren gesperrt - sonst ueberschreibt eine zweite Abmeldung den Wartungszustand am Watchdog. Co-Authored-By: Claude Opus 5 --- .gitignore | 3 + ClawdDotNet.slnx | 1 + Directory.Build.props | 17 +- ...valonia UI Migration und Überarbeitung.zip | Bin 0 -> 73776 bytes Mockup/extracted/.thumbnail | Bin 0 -> 9826 bytes .../extracted/ClawdDotNet UI Redesign.dc.html | 1009 +++++++++ .../_adherence.oxlintrc.json | 152 ++ .../_ds_bundle.js | 11 + .../_ds_manifest.json | 1 + .../readme.md | 82 + .../styles.css | 286 +++ .../mockup/ClawdDotNet-UI-Mockup.dc.html | 1009 +++++++++ .../mockup/Implementierungsleitfaden.md | 96 + Mockup/extracted/support.js | 1911 +++++++++++++++++ deploy/packager.config.example.json | 32 + deploy/publish.py | 154 ++ docs/Avalonia-Portierungsleitfaden.md | 21 +- docs/Deploymentcenter-2.4-Integrationsplan.md | 299 +++ docs/Roadmap.md | 9 +- docs/RocketChat-Nextcloud-Konzept.md | 224 +- src/ClawdDotNet.App/AppHost.cs | 11 + src/ClawdDotNet.App/ClawdDotNet.App.csproj | 1 + .../Services/DeploymentcenterService.cs | 95 +- .../Services/OpenRouterStatusService.cs | 7 +- src/ClawdDotNet.App/Settings/AppSettings.cs | 40 + .../Watchdog/WatchdogHeartbeatService.cs | 25 +- src/ClawdDotNet.Core/Staging/StagingPolicy.cs | 8 +- src/ClawdDotNet.Desktop/App.axaml | 3 +- src/ClawdDotNet.Desktop/App.axaml.cs | 260 ++- .../Assets/Fonts/Barlow-Bold.ttf | Bin 0 -> 108220 bytes .../Assets/Fonts/Barlow-Medium.ttf | Bin 0 -> 103536 bytes .../Assets/Fonts/Barlow-Regular.ttf | Bin 0 -> 104068 bytes .../Assets/Fonts/Barlow-SemiBold.ttf | Bin 0 -> 108348 bytes .../Assets/Fonts/BarlowCondensed-Medium.ttf | Bin 0 -> 103360 bytes .../Assets/Fonts/BarlowCondensed-Regular.ttf | Bin 0 -> 102480 bytes .../Assets/Fonts/BarlowCondensed-SemiBold.ttf | Bin 0 -> 109428 bytes src/ClawdDotNet.Desktop/Assets/Fonts/OFL.txt | 93 + .../ClawdDotNet.Desktop.csproj | 34 +- .../Controls/BlueprintFrame.cs | 24 + .../Controls/StrokeIcon.cs | 113 + .../Converters/ChatBubbleBrushConverter.cs | 65 - .../Converters/IconConverter.cs | 54 + .../Converters/LayoutConverters.cs | 40 + .../Converters/LogLevelBrushConverter.cs | 33 - .../Converters/StringEqualsConverter.cs | 27 + src/ClawdDotNet.Desktop/Program.cs | 9 +- .../Services/ThemeManager.cs | 35 + src/ClawdDotNet.Desktop/Styles/Icons.axaml | 51 + src/ClawdDotNet.Desktop/Styles/Shell.axaml | 862 +++++++- src/ClawdDotNet.Desktop/Styles/Theme.axaml | 157 ++ .../ViewModels/AgentChatsPageViewModel.cs | 95 + .../ViewModels/AgentsPageViewModel.cs | 252 ++- .../ViewModels/InfoPageViewModel.cs | 13 + .../ViewModels/InstancePickerViewModel.cs | 88 +- .../ViewModels/MainWindowViewModel.cs | 327 ++- .../ViewModels/TasksPageViewModel.cs | 103 + .../ViewModels/TokenUsagePageViewModel.cs | 201 ++ .../Views/AgentChatsPageView.axaml | 61 + .../Views/AgentChatsPageView.axaml.cs | 8 + .../Views/AgentsPageView.axaml | 366 +++- .../Views/AgentsPageView.axaml.cs | 99 +- .../Views/BackupPageView.axaml | 198 +- .../Views/ChatPageView.axaml | 92 +- .../Views/InfoPageView.axaml | 150 +- .../Views/InstancePickerWindow.axaml | 156 +- .../Views/InstancePickerWindow.axaml.cs | 20 +- .../Views/LicenseWindow.axaml | 2 +- .../Views/LogPageView.axaml | 99 +- .../Views/MainWindow.axaml | 250 ++- .../Views/MainWindow.axaml.cs | 16 +- .../Views/SettingsPageView.axaml | 174 +- .../Views/TasksPageView.axaml | 303 ++- .../Views/TextEditorWindow.axaml | 35 + .../Views/TextEditorWindow.axaml.cs | 48 + .../Views/TokenUsagePageView.axaml | 114 + .../Views/TokenUsagePageView.axaml.cs | 8 + .../Views/ToolSettingsView.axaml | 239 +++ .../Views/ToolSettingsView.axaml.cs | 8 + .../Views/ToolSettingsWindow.axaml | 180 -- .../Views/ToolSettingsWindow.axaml.cs | 21 - src/ClawdDotNet.Desktop/setup.json | 62 + .../ClawdDotNet.Tools.RocketChat.csproj | 14 + .../RocketChatClient.cs | 490 +++++ .../RocketChatConfig.cs | 150 ++ .../RocketChatTool.cs | 687 ++++++ .../WorkspaceFile.cs | 105 + .../WatchdogHeartbeatServiceTests.cs | 87 + .../Security/SecretProtectorTests.cs | 9 +- 88 files changed, 11665 insertions(+), 1029 deletions(-) create mode 100644 Mockup/Avalonia UI Migration und Überarbeitung.zip create mode 100644 Mockup/extracted/.thumbnail create mode 100644 Mockup/extracted/ClawdDotNet UI Redesign.dc.html create mode 100644 Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/_adherence.oxlintrc.json create mode 100644 Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/_ds_bundle.js create mode 100644 Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/_ds_manifest.json create mode 100644 Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/readme.md create mode 100644 Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/styles.css create mode 100644 Mockup/extracted/mockup/ClawdDotNet-UI-Mockup.dc.html create mode 100644 Mockup/extracted/mockup/Implementierungsleitfaden.md create mode 100644 Mockup/extracted/support.js create mode 100644 deploy/packager.config.example.json create mode 100644 deploy/publish.py create mode 100644 docs/Deploymentcenter-2.4-Integrationsplan.md create mode 100644 src/ClawdDotNet.Desktop/Assets/Fonts/Barlow-Bold.ttf create mode 100644 src/ClawdDotNet.Desktop/Assets/Fonts/Barlow-Medium.ttf create mode 100644 src/ClawdDotNet.Desktop/Assets/Fonts/Barlow-Regular.ttf create mode 100644 src/ClawdDotNet.Desktop/Assets/Fonts/Barlow-SemiBold.ttf create mode 100644 src/ClawdDotNet.Desktop/Assets/Fonts/BarlowCondensed-Medium.ttf create mode 100644 src/ClawdDotNet.Desktop/Assets/Fonts/BarlowCondensed-Regular.ttf create mode 100644 src/ClawdDotNet.Desktop/Assets/Fonts/BarlowCondensed-SemiBold.ttf create mode 100644 src/ClawdDotNet.Desktop/Assets/Fonts/OFL.txt create mode 100644 src/ClawdDotNet.Desktop/Controls/BlueprintFrame.cs create mode 100644 src/ClawdDotNet.Desktop/Controls/StrokeIcon.cs delete mode 100644 src/ClawdDotNet.Desktop/Converters/ChatBubbleBrushConverter.cs create mode 100644 src/ClawdDotNet.Desktop/Converters/IconConverter.cs create mode 100644 src/ClawdDotNet.Desktop/Converters/LayoutConverters.cs delete mode 100644 src/ClawdDotNet.Desktop/Converters/LogLevelBrushConverter.cs create mode 100644 src/ClawdDotNet.Desktop/Converters/StringEqualsConverter.cs create mode 100644 src/ClawdDotNet.Desktop/Services/ThemeManager.cs create mode 100644 src/ClawdDotNet.Desktop/Styles/Icons.axaml create mode 100644 src/ClawdDotNet.Desktop/Styles/Theme.axaml create mode 100644 src/ClawdDotNet.Desktop/ViewModels/AgentChatsPageViewModel.cs create mode 100644 src/ClawdDotNet.Desktop/ViewModels/TokenUsagePageViewModel.cs create mode 100644 src/ClawdDotNet.Desktop/Views/AgentChatsPageView.axaml create mode 100644 src/ClawdDotNet.Desktop/Views/AgentChatsPageView.axaml.cs create mode 100644 src/ClawdDotNet.Desktop/Views/TextEditorWindow.axaml create mode 100644 src/ClawdDotNet.Desktop/Views/TextEditorWindow.axaml.cs create mode 100644 src/ClawdDotNet.Desktop/Views/TokenUsagePageView.axaml create mode 100644 src/ClawdDotNet.Desktop/Views/TokenUsagePageView.axaml.cs create mode 100644 src/ClawdDotNet.Desktop/Views/ToolSettingsView.axaml create mode 100644 src/ClawdDotNet.Desktop/Views/ToolSettingsView.axaml.cs delete mode 100644 src/ClawdDotNet.Desktop/Views/ToolSettingsWindow.axaml delete mode 100644 src/ClawdDotNet.Desktop/Views/ToolSettingsWindow.axaml.cs create mode 100644 src/ClawdDotNet.Desktop/setup.json create mode 100644 src/ClawdDotNet.Tools.RocketChat/ClawdDotNet.Tools.RocketChat.csproj create mode 100644 src/ClawdDotNet.Tools.RocketChat/RocketChatClient.cs create mode 100644 src/ClawdDotNet.Tools.RocketChat/RocketChatConfig.cs create mode 100644 src/ClawdDotNet.Tools.RocketChat/RocketChatTool.cs create mode 100644 src/ClawdDotNet.Tools.RocketChat/WorkspaceFile.cs create mode 100644 tests/ClawdDotNet.Core.Tests/Deploymentcenter/WatchdogHeartbeatServiceTests.cs diff --git a/.gitignore b/.gitignore index 1f4382b..770ce62 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,6 @@ appsettings.*.local.json # (siehe J:\Softwareprojekte\GITEA-EINWEISUNG.md) — dieser Eintrag ist die # Ruecksicherung, falls doch einmal eine Token-Datei im Repo landet. .gitea-token +# FTP-Zugangsdaten und Publish-Token fuer pack-and-deploy. Versioniert wird +# ausschliesslich packager.config.example.json ohne Werte. +deploy/packager.config.json diff --git a/ClawdDotNet.slnx b/ClawdDotNet.slnx index 24ceb0a..5c5c204 100644 --- a/ClawdDotNet.slnx +++ b/ClawdDotNet.slnx @@ -18,6 +18,7 @@ + diff --git a/Directory.Build.props b/Directory.Build.props index fbc3730..7c4f59e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -18,7 +18,22 @@ ClawdDotNet.Core.BuildInfo bleibt daneben bestehen: das ist ein von Hand gefuehrter Zaehler mit Aenderungstext, keine Versionsangabe. --> - 0.1.0 + 0.1.2 + + + embedded diff --git a/Mockup/Avalonia UI Migration und Überarbeitung.zip b/Mockup/Avalonia UI Migration und Überarbeitung.zip new file mode 100644 index 0000000000000000000000000000000000000000..1b204a23984c8562e184a9556d03e588b16600f1 GIT binary patch literal 73776 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%0Amf|!^pqu^?Uw<46!UQ) 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 A6#xJL literal 0 HcmV?d00001 diff --git a/Mockup/extracted/ClawdDotNet UI Redesign.dc.html b/Mockup/extracted/ClawdDotNet UI Redesign.dc.html new file mode 100644 index 0000000..80d5ca3 --- /dev/null +++ b/Mockup/extracted/ClawdDotNet UI Redesign.dc.html @@ -0,0 +1,1009 @@ + + + + + + + + + + + + + + + + +
+ +
+ Update: (1) Zielauflösung jetzt 1920×1080. (2) Sidebar per Pfeil zuklappbar (nur Icons). (3) Agenten-Seite folgt wieder der WinForms-Aufteilung: oben Agentenliste + Einstellungen, unten Werkzeugliste + Werkzeug-Konfiguration, in zwei horizontal geteilten Bereichen — aber mit klaren flachen Feldern statt PropertyGrid. (4) Werkzeugleisten bei Aufgaben (inkl. Job Aktivieren/Deaktivieren), Diensten und Logs ergänzt; Sicherung um Automatik und Zugangsdaten-Optionen erweitert. +
+ +
+ + +
+ +
+ + +
ClawdDotNet
+
+ +
+ + + +
+ +
+ +
Arbeiten
+
+ + + + + + +
+ +
+ +
Analyse
+
+ + + + +
+ +
+ +
System
+
+ + + + + + + + +
+
+ + +
+ ClawdDotNet 2.4 · Avalonia +
+
+
+ + +
+ + +
+
{{ pageTitle }}
+
+ {{ themeLabel }} + +
+
+ + + +
+ +
+ +
{{ note.instance }}: {{ note.text }}
+ +
+
+
+
+ + +
+ + + +
+ + +
+ +
+
+ + +
+ +
+ + +
+ +
+
+ + + + + + + + + + + +
AnzeigenameModellKurzinfo
{{ agent.displayName }}{{ agent.model }}{{ agent.description }}
+
+
+ +
+ +
+
+
+
Allgemein & Modell
+

{{ selectedAgent.displayName }}

+
+
+
+
+
+
+
+
+
+
+
Grenzen
+

Schutzgrenzen (LoopGuard & Budget)

+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+ + +
+ +
+
Zugelassene Werkzeuge für {{ selectedAgent.displayName }}
+
+ + + + + + + + + + + +
WerkzeugBeschreibung
{{ tool.name }}{{ tool.description }}
+
+
+ +
+ +
+
Werkzeug-Einstellungen
+

{{ selectedToolName }}

+ + +
+
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+ +
Dieses Werkzeug benötigt keine weiteren Einstellungen.
+
+
+
+
+
+ + + +
+
+ Agent: + +
+
+
+
Dev Assistant
+
Deploy-Pipeline für crypto-team ist grün. Soll ich die Release-Notes zusammenfassen?
+
+
+
Du
+
Ja, bitte kurz.
+
+
+
+ + +
+
+
+ + + +
+
+ + + +
+ + +
+
+ + + + +
+ + +
+
+ + + + + + + +
TypAgentTool / NachrichtCronNächster LaufLetzter LaufStatus
{{ job.jobType }}{{ job.agentName }}{{ job.taskMessage }}{{ job.cronExpression }}{{ job.nextRun }}{{ job.lastRun }}{{ job.status }}
+
+
+
+ + +
+
+ + +
+ + +
+ +
+
+ + + + + + + +
DienstnameTypPortStatusBeschreibung
{{ svc.name }}{{ svc.type }}{{ svc.port }}{{ svc.status }}{{ svc.description }}
+
+
+
+ + +
+
+ +
+
+ + + + + + + +
ZeitpunktJobAgentBeschreibungStatusDetails
{{ h.time }}{{ h.jobName }}{{ h.agent }}{{ h.description }}{{ h.status }}{{ h.info }}
+
+
+
+
+
+ + + +
+
+ +
+
Manuell
+

Sicherung erstellen

+
+
+
+ +
+
+ +
+ + +
+
+
+ +
+ + +
+
+ +
+
+ +
+ +
+
Automatik
+

Automatische Sicherung

+
+ +
+
+
+
+
Die Automatik sichert ohne Zugangsdaten — eine gespeicherte Passphrase wäre wirkungslos.
+
+
+ +
+ +
+
Bestand
+
+

Vorhandene Sicherungen

+
+ + + + +
+
+ + + + + + +
DateinameErstellt amInstanzGrößeZugangsdaten
backup_2026-08-16_0300.zip16.08.2026 03:00crypto-team214 MBausgeschlossen
backup_2026-08-15_0300.zip15.08.2026 03:00crypto-team211 MBausgeschlossen
+
+
+
+
+ + + +
+
+ Modul: + + Stufe: + +
+ + + + +
+
+
09:12:03 INFO AgentEngine: Run gestartet (Dev Assistant)
+
09:12:05 INFO Tools.FileRW: Lesevorgang abgeschlossen
+
09:12:08 WARN BackupScheduler: Sicherung verzögert (Ziel belegt)
+
09:12:11 INFO Tools.Database: Query ausgeführt (42ms)
+
+
+
+ + + +
+
+
Tokens (7 Tage)
{{ totalTokens7d }}
+
Kosten (7 Tage)
{{ totalCost7d }} €
+
Runs (7 Tage)
{{ totalRuns7d }}
+
+ +

Tokens pro Tag

+
+ +
+
{{ d.tokensLabel }}
+
+
{{ d.day }}
+
+
+
+ +

Aufschlüsselung nach Agent & Modell

+ + + + + + + +
AgentModellTokensKostenRuns
{{ row.agent }}{{ row.model }}{{ row.tokens }}{{ row.cost }} €{{ row.runs }}
+
+
+ + + +
+
+ Agent A: + + Agent B: + +
+
+ +
+
+ {{ msg.senderName }} + {{ msg.time }} +
+
{{ msg.text }}
+
+
+
+
+
+ + + +
+
+
+
Instanz
+
+
+
+
+
+
+
+
Allgemein
+
+
+
+
+
+
+
+
+ + + +
+ +
ClawdDotNet
+
Version 2.4.1 · Avalonia UI · net10.0
+
+
+ +
+ + +
+ Instanz: {{ currentInstance.name }} + · + API {{ apiStatusText }} + · + 1h: {{ tokensLastHour }} Tok · 24h: {{ tokensLast24h }} Tok (~{{ costLast24h }} €) + · + Credits: {{ creditsRemaining }} von {{ creditsTotal }} + {{ themeLabel }} +
+
+ + + +
+
+ +
+
Instanz wechseln
+ +
+
Jede Instanz läuft unabhängig mit eigenen Agenten und Daten. Wechseln startet die App mit der gewählten Instanz neu.
+
+ +
+
+ {{ inst.logoInitials }} + +
+
+
{{ inst.name }}
+
{{ inst.agentCount }} Agenten · API-Key {{ inst.apiKeyStatus }}
+
+ Aktiv + +
+
+
+
+
+ + +
+
+
+
+ + + +
+
+ +
{{ fieldEditorTitle }}
+ +
+ + +
+
+
+
+ +
+
+ +
+ + + diff --git a/Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/_adherence.oxlintrc.json b/Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/_adherence.oxlintrc.json new file mode 100644 index 0000000..3b11af9 --- /dev/null +++ b/Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/_adherence.oxlintrc.json @@ -0,0 +1,152 @@ +{ + "plugins": [ + "react", + "import" + ], + "rules": { + "react/forbid-elements": [ + "warn", + { + "forbid": [] + } + ], + "no-restricted-imports": [ + "warn", + { + "patterns": [] + } + ], + "no-restricted-syntax": [ + "warn", + { + "selector": "Literal[value=/#[0-9a-fA-F]{3,8}\\b/]", + "message": "Raw hex color — use a design-system color token via var()." + }, + { + "selector": "Literal[value=/\\b\\d+px\\b/]", + "message": "Raw px value — use a design-system spacing token via var()." + }, + { + "selector": "Literal[value=/font-family\\s*:\\s*(?!['\\\"]?(?:Barlow|Barlow Condensed))/i]", + "message": "Font not provided by the design system. Available: Barlow, Barlow Condensed." + } + ] + }, + "overrides": [ + { + "files": [ + "**/index.js" + ], + "rules": { + "no-restricted-imports": "off" + } + } + ], + "x-omelette": { + "components": {}, + "tokens": [ + "--color-accent", + "--color-accent-100", + "--color-accent-2", + "--color-accent-2-100", + "--color-accent-2-200", + "--color-accent-2-300", + "--color-accent-2-400", + "--color-accent-2-500", + "--color-accent-2-600", + "--color-accent-2-700", + "--color-accent-2-800", + "--color-accent-2-900", + "--color-accent-200", + "--color-accent-300", + "--color-accent-400", + "--color-accent-500", + "--color-accent-600", + "--color-accent-700", + "--color-accent-800", + "--color-accent-900", + "--color-bg", + "--color-divider", + "--color-neutral-100", + "--color-neutral-200", + "--color-neutral-300", + "--color-neutral-400", + "--color-neutral-500", + "--color-neutral-600", + "--color-neutral-700", + "--color-neutral-800", + "--color-neutral-900", + "--color-surface", + "--color-text", + "--font-body", + "--font-heading", + "--font-heading-weight", + "--radius-lg", + "--radius-md", + "--radius-sm", + "--shadow-lg", + "--shadow-md", + "--shadow-sm", + "--space-1", + "--space-2", + "--space-3", + "--space-4", + "--space-6", + "--space-8" + ], + "tokenKinds": { + "--color-bg": "color", + "--color-surface": "color", + "--color-text": "font", + "--color-accent": "color", + "--color-accent-2": "color", + "--color-divider": "color", + "--color-neutral-100": "color", + "--color-neutral-200": "color", + "--color-neutral-300": "color", + "--color-neutral-400": "color", + "--color-neutral-500": "color", + "--color-neutral-600": "color", + "--color-neutral-700": "color", + "--color-neutral-800": "color", + "--color-neutral-900": "color", + "--color-accent-100": "color", + "--color-accent-200": "color", + "--color-accent-300": "color", + "--color-accent-400": "color", + "--color-accent-500": "color", + "--color-accent-600": "color", + "--color-accent-700": "color", + "--color-accent-800": "color", + "--color-accent-900": "color", + "--color-accent-2-100": "color", + "--color-accent-2-200": "color", + "--color-accent-2-300": "color", + "--color-accent-2-400": "color", + "--color-accent-2-500": "color", + "--color-accent-2-600": "color", + "--color-accent-2-700": "color", + "--color-accent-2-800": "color", + "--color-accent-2-900": "color", + "--font-heading": "font", + "--font-heading-weight": "font", + "--font-body": "font", + "--space-1": "spacing", + "--space-2": "spacing", + "--space-3": "spacing", + "--space-4": "spacing", + "--space-6": "spacing", + "--space-8": "spacing", + "--radius-sm": "radius", + "--radius-md": "radius", + "--radius-lg": "radius", + "--shadow-sm": "shadow", + "--shadow-md": "shadow", + "--shadow-lg": "shadow" + }, + "fontFamilies": [ + "Barlow", + "Barlow Condensed" + ] + } +} \ No newline at end of file diff --git a/Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/_ds_bundle.js b/Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/_ds_bundle.js new file mode 100644 index 0000000..af8ca74 --- /dev/null +++ b/Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/_ds_bundle.js @@ -0,0 +1,11 @@ +/* @ds-bundle: {"format":4,"namespace":"Industry_indust","components":[],"sourceHashes":{},"inlinedExternals":[],"unexposedExports":[]} */ + +(() => { + +const __ds_ns = (window.Industry_indust = window.Industry_indust || {}); + +const __ds_scope = {}; + +(__ds_ns.__errors = __ds_ns.__errors || []); + +})(); diff --git a/Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/_ds_manifest.json b/Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/_ds_manifest.json new file mode 100644 index 0000000..645b78a --- /dev/null +++ b/Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/_ds_manifest.json @@ -0,0 +1 @@ +{"namespace":"Industry_indust","components":[],"startingPoints":[],"cards":[{"path":"components/buttons.html","group":"Components","viewport":"640x460","subtitle":"Solid primary actions; tags tint from the ramps","name":"Buttons & tags"},{"path":"components/cards.html","group":"Components","viewport":"640x420","subtitle":"Transparent, corner-marked line drawings with a kicker, title, body and meta row","name":"Cards"},{"path":"components/dialog.html","group":"Components","viewport":"640x460","subtitle":"A modal surface at the top elevation, shown here inside a static frame","name":"Dialog"},{"path":"components/forms.html","group":"Components","viewport":"640x520","subtitle":"Text inputs, a segmented control and radios — native elements, themed states","name":"Forms"},{"path":"components/navigation.html","group":"Components","viewport":"640x420","subtitle":"A header bar over a grid page opening","name":"Navigation"},{"path":"components/table.html","group":"Components","viewport":"640x420","subtitle":"Rows separated by a whisper of the text color; status cells reuse the tags","name":"Table"},{"path":"foundations/color.html","group":"Foundations","viewport":"640x560","subtitle":"Role colors and the tonal ramps (mono scheme — one accent voice)","name":"Color"},{"path":"foundations/icons.html","group":"Foundations","viewport":"640x420","subtitle":"Lucide — inline SVG on currentColor","name":"Icons"},{"path":"foundations/image.html","group":"Foundations","viewport":"640x480","subtitle":"Duotone — photographs are washed in the accent, like a screen print.","name":"Imagery"},{"path":"foundations/layout.html","group":"Foundations","viewport":"640x560","subtitle":"A 0.85× spacing scale, 4px radius, and three shadow levels tuned to the light ground","name":"Spacing & elevation"},{"path":"foundations/type.html","group":"Foundations","viewport":"640x640","subtitle":"Barlow Condensed over Barlow — a fixed scale; density moves spacing, not sizes","name":"Typography"},{"path":"theme.html","group":"Theme","viewport":"640x520","subtitle":"The parameters this system was derived from","name":"Parameters"}],"templates":[{"name":"Deck","description":"A twenty-one-slide presentation starter: cover, contents, dividers, columns, quadrants, a data table, SVG charts and timeline, bleed imagery, a quote and a close, on the theme's tokens","folder":"templates/deck","entryPath":"templates/deck/Deck.dc.html"},{"name":"Landing","description":"A one-page product landing in the system's own voice — an invented product (Holdfast: a fastener catalog), a condensed hero, a numbered spec-sheet plate, wireframe cells and a duotone photograph","folder":"templates/landing","entryPath":"templates/landing/index.html"}],"hasThumbnailHtml":true,"globalCssPaths":["styles.css"],"tokens":[{"name":"--color-bg","value":"#f2f2f3","kind":"color","definedIn":"styles.css"},{"name":"--color-surface","value":"#e9e9ea","kind":"color","definedIn":"styles.css"},{"name":"--color-text","value":"#1d1f20","kind":"font","definedIn":"styles.css"},{"name":"--color-accent","value":"#5980a6","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-2","value":"#728fab","kind":"color","definedIn":"styles.css"},{"name":"--color-divider","value":"color-mix(in srgb, #1d1f20 16%, transparent)","kind":"color","definedIn":"styles.css"},{"name":"--color-neutral-100","value":"#f5f5f8","kind":"color","definedIn":"styles.css"},{"name":"--color-neutral-200","value":"#e7e7ea","kind":"color","definedIn":"styles.css"},{"name":"--color-neutral-300","value":"#d4d4d7","kind":"color","definedIn":"styles.css"},{"name":"--color-neutral-400","value":"#b7b7ba","kind":"color","definedIn":"styles.css"},{"name":"--color-neutral-500","value":"#98989b","kind":"color","definedIn":"styles.css"},{"name":"--color-neutral-600","value":"#7a7a7d","kind":"color","definedIn":"styles.css"},{"name":"--color-neutral-700","value":"#5d5d60","kind":"color","definedIn":"styles.css"},{"name":"--color-neutral-800","value":"#424244","kind":"color","definedIn":"styles.css"},{"name":"--color-neutral-900","value":"#2b2b2d","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-100","value":"#eef6ff","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-200","value":"#d6ebff","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-300","value":"#b5d9fd","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-400","value":"#94bce3","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-500","value":"#749dc4","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-600","value":"#597ea3","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-700","value":"#416180","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-800","value":"#2c455d","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-900","value":"#1d2d3d","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-2-100","value":"#eef6ff","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-2-200","value":"#d6ebff","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-2-300","value":"#bdd8f2","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-2-400","value":"#9ebbd8","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-2-500","value":"#7e9cb8","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-2-600","value":"#627d98","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-2-700","value":"#486077","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-2-800","value":"#314457","kind":"color","definedIn":"styles.css"},{"name":"--color-accent-2-900","value":"#1f2d3a","kind":"color","definedIn":"styles.css"},{"name":"--font-heading","value":"\"Barlow Condensed\", system-ui, sans-serif","kind":"font","definedIn":"styles.css"},{"name":"--font-heading-weight","value":"600","kind":"font","definedIn":"styles.css"},{"name":"--font-body","value":"\"Barlow\", system-ui, sans-serif","kind":"font","definedIn":"styles.css"},{"name":"--space-1","value":"3.4px","kind":"spacing","definedIn":"styles.css"},{"name":"--space-2","value":"6.8px","kind":"spacing","definedIn":"styles.css"},{"name":"--space-3","value":"10.2px","kind":"spacing","definedIn":"styles.css"},{"name":"--space-4","value":"13.6px","kind":"spacing","definedIn":"styles.css"},{"name":"--space-6","value":"20.4px","kind":"spacing","definedIn":"styles.css"},{"name":"--space-8","value":"27.2px","kind":"spacing","definedIn":"styles.css"},{"name":"--radius-sm","value":"2px","kind":"radius","definedIn":"styles.css"},{"name":"--radius-md","value":"4px","kind":"radius","definedIn":"styles.css"},{"name":"--radius-lg","value":"7px","kind":"radius","definedIn":"styles.css"},{"name":"--shadow-sm","value":"0 1px 2px color-mix(in srgb, #2b2b2d 14%, transparent)","kind":"shadow","definedIn":"styles.css"},{"name":"--shadow-md","value":"0 3px 10px color-mix(in srgb, #2b2b2d 16%, transparent)","kind":"shadow","definedIn":"styles.css"},{"name":"--shadow-lg","value":"0 12px 32px color-mix(in srgb, #2b2b2d 22%, transparent)","kind":"shadow","definedIn":"styles.css"}],"themes":[],"fonts":[],"brandFonts":[{"family":"Barlow Condensed","status":"ok","tokens":["--font-heading"],"path":"styles.css"},{"family":"Barlow","status":"ok","tokens":["--font-body"],"path":"styles.css"}],"source":"spa"} \ No newline at end of file diff --git a/Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/readme.md b/Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/readme.md new file mode 100644 index 0000000..7d8749e --- /dev/null +++ b/Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/readme.md @@ -0,0 +1,82 @@ +# Industry design system + +Industry is a wireframe: steel-blue on a light technical ground, Barlow Condensed headings over Barlow, a modular grid, and cards, figures and buttons framed as blueprint objects — square-cornered, hairline-bordered, with "+" registration marks at the corners. Cards and figures stay transparent line drawings; the primary button is the one solid object on the board, an accent fill that keeps the square corners and the marks. Photography is duotoned into the steel accent and icons are thin-stroke. + +## How to use this + +- Link the one stylesheet from every page — `` (adjust the relative path) — and take every color, font, spacing, radius and shadow from its variables (`var(--color-*)`, `var(--font-*)`, `var(--space-*)`, `var(--radius-*)`, `var(--shadow-*)`). Never hard-code a hex, a font name or a px value the tokens already carry. +- Build with the classes below rather than inventing parallel ones; the component pages are plain HTML, so view source and copy the markup. +- `templates/` holds starting points a consuming project can copy whole. +- The whole system was derived from `theme.json`. To change the look, edit the tokens at the top of `styles.css` — every page, the thumbnail and this guide read from them — and keep `theme.json` and the written guidance in step so they don't drift from what the CSS actually does. + +## Direction + +Modular grid layouts — content in equal-width cells, strong horizontal and vertical rhythm, visible structure. Cards, buttons and major sections are wireframe objects: square-cornered, thin-bordered, with `+` crosshair corner marks (the `.blueprint` class + four `` children) — never soft filled rounded blocks. Images and figures get the same treatment: square, hairline-framed and marked, never rounded or clipped. Wrap hero and inline images in the `.duotone` class — they are desaturated and washed in the accent, like a screen print that re-colors with the theme. + +## Color + +A light ground (`--color-bg` #f2f2f3) with `--color-text` #1d1f20 and a single accent #5980a6 (this is a mono scheme: no second accent was chosen — the `--color-accent-2-*` variables carry a machine-derived stand-in kept only so both sets resolve; treat them as one role). Each role carries a 100–900 tonal ramp (`--color-neutral-100` … `--color-accent-2-900`) generated in OKLCH on a shared perceptual lightness scale, so the same step of any ramp has the same visual weight. Use the light steps (100–300) for tinted fills, hovers and subtle borders, 500 as the role's base, and the dark steps (700–900) for text on tinted fills and for pressed states; prefer ramp steps over ad-hoc `color-mix()`. For elevation use `--shadow-sm/md/lg` (already tuned to the ground) rather than ad-hoc box-shadows. + +## Type + +Barlow Condensed for headings over Barlow for body text, loaded as `--font-heading` / `--font-body`. Density 0.85× and radius 4px are already baked into the `--space-*` / `--radius-*` scales — use the variables, not raw numbers. + +## Icons + +Use Lucide icons (https://lucide.dev), at stroke-width 1.5 for a lighter, more technical look throughout. + +## Interaction states + +Interactive states are themed, never browser defaults: give every interactive element a `:hover` tint and a pressed state from the accent ramp (one step past the base — `--color-accent-600` on a light ground, `--color-accent-400` on a dark one, or a `color-mix()` tint for outlined/ghost variants), and style keyboard focus with `:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; }` — never leave the default blue focus ring. + +## Components + +| Class | What it is | Shown in | +| --- | --- | --- | +| `.btn` with `.btn-primary`, `.btn-secondary`, `.btn-ghost`, `.btn-icon`, `.btn-block` | Actions — the primary is a solid accent fill | components/buttons.html | +| `.tag` with `.tag-accent`, `.tag-accent-2`, `.tag-neutral`, `.tag-outline` | Small labels tinted from the ramps (mono palette: accent-2 reads the same as accent) | components/buttons.html | +| `.field` + `label`, `.input`, `.radio` + `.dot`, `.seg` + `.seg-opt` | Form fields and choices on native elements — no script | components/forms.html | +| `.card` with `.card-kicker`, `.card-title`, `.card-body`, `.card-meta`; `.elev-sm/md/lg` | Transparent, hairline-bordered cards with corner registration marks | components/cards.html | +| `.nav` + `.nav-brand` | The header bar | components/navigation.html | +| `.table` | Data tables with themed header and row rules | components/table.html | +| `.dialog-backdrop` + `.dialog` (+ `.dialog-title/-body/-actions`) | A modal at the top elevation | components/dialog.html | +| `.hr` | A horizontal rule — present, but this system prefers whitespace; avoid it | — | +| `.blueprint` + four `` children | The wireframe frame every card, figure and primary button wears | components/cards.html | +| `.duotone` | The image wrapper — every content photograph goes through it | foundations/image.html | + +States are built in: hovers and pressed states come from the accent ramp, keyboard focus is the 2px accent `:focus-visible` ring, `::selection` is an accent tint, and disabled controls drop to 45% opacity. Don't restyle them per page. The accent-to-ground pair is tuned to at least 3:1 — enough for icons, large text and interface chrome, not for body copy — so for paragraph-size text in the accent use a deep ramp step (`--color-accent-700` on this ground) rather than the accent itself. + +## Do + +- Frame cards, figures and primary buttons as blueprint objects: the `.blueprint` class plus four `` marks. +- Keep the grid visible — equal cells, strong horizontal and vertical rhythm. +- Condense headings (Barlow Condensed) and keep body copy in Barlow. +- Duotone photographs with the `.duotone` wrapper so they take the accent. + +## Don't + +- Do not round cards, figures or buttons, and do not give cards or figures a surface fill — they are line drawings (the solid accent primary button is the one deliberate exception). +- Do not drop the registration marks from a framed element. +- Do not use thick icon strokes; the set is Lucide at 1.5. +- Do not add decorative color beyond the steel accent. The accent's own deep step (`--color-accent-900`) may carry a full field where the deck's section dividers use it — steel as ground, type reversed to paper. (The landing's numbers sit on a drawn spec-sheet plate on the paper ground instead — its own grammar, not a field.) + +## Files + +- `styles.css` — the only stylesheet: the token sheet (`:root` variables, ramps, base type) plus the component layer. Link it from every page. +- `readme.md` — this guide. +- `theme.json` — the parameters these files were derived from (a machine-readable record of the theme). +- `thumbnail.html` — the project cover (brand mark + swatches). +- `foundations/type.html` — the type scale and the heading/body pairing at real sizes. +- `foundations/color.html` — color roles and the 100-900 tonal ramps, with usage notes. +- `foundations/layout.html` — the spacing scale, the grid and how edges are drawn. +- `foundations/icons.html` — the icon set at interface sizes, inline and in buttons. +- `foundations/image.html` — how photographs and figures are treated. +- `components/buttons.html` — buttons, icon buttons and tags in every variant and state. +- `components/forms.html` — text fields, radios and the segmented control on native elements. +- `components/cards.html` — content cards and the elevation steps. +- `components/navigation.html` — the header bar pattern. +- `components/table.html` — a data table with the themed header and row rules. +- `components/dialog.html` — a modal over its backdrop at the top elevation. +- `theme.html` — the theme's parameters rendered as a reference sheet. +- `templates/landing/` — a starter page consuming the system the intended way (`index.html`, its `ds-base.js` loader, and the vendored `image-slot.js` its photograph mounts). +- `assets/photo.jpg` — the reference photograph the imagery page treats. diff --git a/Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/styles.css b/Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/styles.css new file mode 100644 index 0000000..1864c0a --- /dev/null +++ b/Mockup/extracted/_ds/industry-a0ac2064-12b6-4f32-aeb8-51c9f8ab1636/styles.css @@ -0,0 +1,286 @@ +/* Industry — design-system tokens and component classes. This file is the source of truth for the system's look; retune it here and see readme.md. */ +@import url('https://fonts.googleapis.com/css2?family=Barlow:wght@400;500;700&family=Barlow+Condensed:wght@400;600&display=swap'); + +:root { + --color-bg: #f2f2f3; + --color-surface: #e9e9ea; + --color-text: #1d1f20; + --color-accent: #5980a6; + --color-accent-2: #728fab; + --color-divider: color-mix(in srgb, #1d1f20 16%, transparent); + + /* Tonal ramps — generated in OKLCH on one shared lightness scale, so the + same step of any role matches the others in visual value. */ + --color-neutral-100: #f5f5f8; + --color-neutral-200: #e7e7ea; + --color-neutral-300: #d4d4d7; + --color-neutral-400: #b7b7ba; + --color-neutral-500: #98989b; + --color-neutral-600: #7a7a7d; + --color-neutral-700: #5d5d60; + --color-neutral-800: #424244; + --color-neutral-900: #2b2b2d; + + --color-accent-100: #eef6ff; + --color-accent-200: #d6ebff; + --color-accent-300: #b5d9fd; + --color-accent-400: #94bce3; + --color-accent-500: #749dc4; + --color-accent-600: #597ea3; + --color-accent-700: #416180; + --color-accent-800: #2c455d; + --color-accent-900: #1d2d3d; + + --color-accent-2-100: #eef6ff; + --color-accent-2-200: #d6ebff; + --color-accent-2-300: #bdd8f2; + --color-accent-2-400: #9ebbd8; + --color-accent-2-500: #7e9cb8; + --color-accent-2-600: #627d98; + --color-accent-2-700: #486077; + --color-accent-2-800: #314457; + --color-accent-2-900: #1f2d3a; + + --font-heading: "Barlow Condensed", system-ui, sans-serif; + --font-heading-weight: 600; + --font-body: "Barlow", system-ui, sans-serif; + + --space-1: 3.4px; + --space-2: 6.8px; + --space-3: 10.2px; + --space-4: 13.6px; + --space-6: 20.4px; + --space-8: 27.2px; + + --radius-sm: 2px; + --radius-md: 4px; + --radius-lg: 7px; + + /* Elevation — derived from the ground: soft ink-tinted shadows on a + light theme, a hairline edge + ambient darkness on a dark one. */ + --shadow-sm: 0 1px 2px color-mix(in srgb, #2b2b2d 14%, transparent); + --shadow-md: 0 3px 10px color-mix(in srgb, #2b2b2d 16%, transparent); + --shadow-lg: 0 12px 32px color-mix(in srgb, #2b2b2d 22%, transparent); +} + +body { + background: var(--color-bg); + color: var(--color-text); + font-family: var(--font-body); +} +h1, h2, h3, h4 { font-family: var(--font-heading); font-weight: var(--font-heading-weight); } + +.blueprint { + position: relative; + border: 1px solid var(--color-divider); + border-radius: 0; +} +/* The overlay image treatments (halftone, duotone) clip their overlay + (overflow:hidden); a blueprint wrapper draws its registration marks + outside the box, so when both classes share a wrapper the frame must + win. */ +.blueprint.halftone, .blueprint.plate, .blueprint.duotone { overflow: visible; } +.blueprint > .corner { + position: absolute; width: 11px; height: 11px; + color: color-mix(in srgb, var(--color-text) 55%, transparent); +} +.blueprint > .corner::before, .blueprint > .corner::after { + content: ""; position: absolute; background: currentColor; +} +.blueprint > .corner::before { left: 5px; top: 0; width: 1px; height: 100%; } +.blueprint > .corner::after { top: 5px; left: 0; width: 100%; height: 1px; } +.blueprint > .corner.tl { top: -6px; left: -6px; } +.blueprint > .corner.tr { top: -6px; right: -6px; } +.blueprint > .corner.bl { bottom: -6px; left: -6px; } +.blueprint > .corner.br { bottom: -6px; right: -6px; } + +.duotone{position:relative;overflow:hidden} +.duotone::after{content:"";position:absolute;inset:0;pointer-events:none; + background:var(--color-accent);mix-blend-mode:color} + +/* ══════════════════════════════════════════════════════════════════════════ + Components — built with the tokens above. Plain CSS + on plain HTML: no JavaScript, no build step. Each class is documented in + readme.md and demonstrated in foundations/ and components/. + ══════════════════════════════════════════════════════════════════════ */ + +*, *::before, *::after { box-sizing: border-box; } +body { margin: 0; font-size: 15px; line-height: 1.55; font-weight: 400; } +h1, h2, h3, h4, h5, h6 { + font-family: var(--font-heading); font-weight: var(--font-heading-weight); + line-height: 1.12; letter-spacing: -0.015em; margin: 0 0 var(--space-2); +} +h1 { font-size: 42px; } +h2 { font-size: 32px; } +h3 { font-size: 25px; } +h4 { font-size: 20px; } +h5 { font-size: 16px; } +h6 { font-size: 13px; } +h6 { letter-spacing: 0.08em; text-transform: uppercase; } +p { margin: 0 0 var(--space-3); } +a { color: var(--color-accent); text-underline-offset: 3px; } +img { display: block; max-width: 100%; } +figure { margin: 0; } +figcaption { + font-size: 11px; margin-top: var(--space-1); + color: color-mix(in srgb, var(--color-text) 55%, transparent); +} +.text-muted { color: color-mix(in srgb, var(--color-text) 55%, transparent); } +:focus { outline: none; } +:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; } +::selection { background: color-mix(in srgb, var(--color-accent) 30%, transparent); } + +/* — rules — */ +.hr { + height: 1px; border: 0; margin: var(--space-4) 0; + background: var(--color-divider); +} + +/* — buttons — */ +.btn { + display: inline-flex; align-items: center; justify-content: center; gap: 6px; + cursor: pointer; text-decoration: none; + font-family: var(--font-heading); font-weight: var(--font-heading-weight); + font-size: 14px; line-height: 1.2; color: var(--color-text); /* matches the .input's 14px — + the pair sits side by side in sign-up rows */ + background: transparent; border: 1px solid transparent; + padding: var(--space-2) calc(var(--space-3) * 1.2); + border-radius: var(--radius-md); +} +.btn svg { display: block; } +.btn:disabled { opacity: 0.45; cursor: not-allowed; } +.btn-primary { background: var(--color-accent); color: var(--color-bg); } +.btn-primary:hover { background: var(--color-accent-600); } +.btn-primary:active { background: var(--color-accent-700); } +.btn-secondary { border-color: var(--color-divider); } +.btn-secondary:hover { background: color-mix(in srgb, var(--color-text) 7%, transparent); } +.btn-secondary:active { background: color-mix(in srgb, var(--color-text) 14%, transparent); } +.btn-ghost { color: var(--color-accent); padding-inline: var(--space-1); } +.btn-ghost:hover { background: color-mix(in srgb, var(--color-accent) 10%, transparent); } +.btn-ghost:active { background: color-mix(in srgb, var(--color-accent) 18%, transparent); } +.btn-icon { width: 36px; height: 36px; padding: 0; } +.btn-block { width: 100%; margin-top: var(--space-2); } + +/* — forms — */ +.field > label { + display: block; font-size: 12px; margin-bottom: 5px; + color: color-mix(in srgb, var(--color-text) 70%, transparent); +} +.input { + width: 100%; min-height: 36px; padding: 6px 10px; font: inherit; + font-size: 14px; color: var(--color-text); caret-color: var(--color-accent); + background: var(--color-surface); + border: 1px solid var(--color-divider); border-radius: var(--radius-md); +} +.input:hover { border-color: color-mix(in srgb, var(--color-text) 45%, transparent); } +.input:focus-visible { border-color: var(--color-accent); outline-offset: 0; } +textarea.input { min-height: 90px; resize: vertical; } +.radio { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; font-size: 14px; } +.radio input, .seg-opt input { + position: absolute; opacity: 0; width: 0; height: 0; pointer-events: none; +} +.radio .dot { + width: 16px; height: 16px; flex: none; border-radius: 50%; + border: 1.5px solid var(--color-divider); +} +.radio:hover .dot { border-color: var(--color-accent); } +.radio input:checked + .dot { + border-color: var(--color-accent); background: var(--color-accent); + box-shadow: inset 0 0 0 4px var(--color-bg); +} +.radio input:focus-visible + .dot { outline: 2px solid var(--color-accent); outline-offset: 2px; } +.seg { + display: inline-flex; overflow: hidden; + border: 1px solid var(--color-divider); border-radius: var(--radius-md); +} +.seg-opt { + display: inline-flex; align-items: center; gap: 6px; + padding: 7px 12px; font-size: 13px; cursor: pointer; +} +.seg-opt + .seg-opt { border-left: 1px solid var(--color-divider); } +.seg-opt:has(input:checked) { background: var(--color-accent); color: var(--color-bg); } +.seg-opt:not(:has(input:checked)):hover { background: color-mix(in srgb, var(--color-text) 7%, transparent); } +.seg-opt:has(input:focus-visible) { outline: 2px solid var(--color-accent); outline-offset: -2px; } + +/* — cards — */ +.card { + display: flex; flex-direction: column; gap: var(--space-2); + padding: var(--space-3); border-radius: var(--radius-md); background: var(--color-surface); +} +.card-kicker { font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--color-accent); } +.card-title { + font-family: var(--font-heading); font-weight: var(--font-heading-weight); + font-size: 17px; line-height: 1.2; +} +.card-body { margin: 0; font-size: 13px; opacity: 0.8; flex: 1; } +.card-meta { + display: flex; align-items: center; gap: 6px; font-size: 11px; + color: color-mix(in srgb, var(--color-text) 50%, transparent); +} +.elev-sm { box-shadow: var(--shadow-sm); } +.elev-md { box-shadow: var(--shadow-md); } +.elev-lg { box-shadow: var(--shadow-lg); } + +/* — tags — */ +.tag { + display: inline-flex; align-items: center; font-size: 11px; + letter-spacing: 0.02em; padding: 3px 10px; + border-radius: calc(var(--radius-md) * 0.75); +} +.tag-accent { background: var(--color-accent-100); color: var(--color-accent-800); } +.tag-accent-2 { background: var(--color-accent-2-100); color: var(--color-accent-2-800); } +.tag-neutral { background: var(--color-neutral-100); color: var(--color-neutral-800); } +.tag-outline { border: 1px solid var(--color-accent); color: var(--color-accent); } + +/* — navigation — */ +.nav { + display: flex; align-items: center; gap: var(--space-4); + padding: var(--space-3) var(--space-4); + border-bottom: none; +} +.nav-brand { + font-family: var(--font-heading); font-weight: var(--font-heading-weight); + font-size: 18px; margin-right: auto; +} +.nav a { color: inherit; text-decoration: none; font-size: 14px; } +.nav a:hover, .nav a[aria-current='page'] { color: var(--color-accent); } + +/* — tables — */ +.table { width: 100%; border-collapse: collapse; font-size: 14px; } +.table th { + text-align: left; font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; + color: color-mix(in srgb, var(--color-text) 60%, transparent); + padding: var(--space-2); border-bottom: 1px solid var(--color-divider); +} +.table td { + padding: var(--space-2); + border-bottom: 1px solid color-mix(in srgb, var(--color-text) 8%, transparent); +} +.table tbody tr:hover { background: color-mix(in srgb, var(--color-text) 4%, transparent); } + +/* — dialog — */ +.dialog-backdrop { + position: fixed; inset: 0; display: grid; place-items: center; + padding: var(--space-4); + background: color-mix(in srgb, var(--color-neutral-900) 50%, transparent); +} +.dialog { + width: min(440px, 100%); display: flex; flex-direction: column; gap: var(--space-3); + padding: var(--space-4); border-radius: var(--radius-lg); + background: var(--color-surface); box-shadow: var(--shadow-lg); +} +.dialog-title { + font-family: var(--font-heading); font-weight: var(--font-heading-weight); + font-size: 20px; +} +.dialog-body { font-size: 14px; opacity: 0.85; } +.dialog-actions { display: flex; justify-content: flex-end; gap: var(--space-2); margin-top: var(--space-2); } + +/* — blueprint frame: components are wireframe objects (see .blueprint + and .corner above) — square, transparent, hairline-bordered — */ +.card, .btn, .input, .tag, .seg, .dialog { border-radius: 0; } +.card, .dialog { background: transparent; border: 1px solid var(--color-divider); } +.btn { border: 1px solid var(--color-divider); } +.btn-primary { border-color: var(--color-accent); } +.btn-ghost { border-color: transparent; } + diff --git a/Mockup/extracted/mockup/ClawdDotNet-UI-Mockup.dc.html b/Mockup/extracted/mockup/ClawdDotNet-UI-Mockup.dc.html new file mode 100644 index 0000000..80d5ca3 --- /dev/null +++ b/Mockup/extracted/mockup/ClawdDotNet-UI-Mockup.dc.html @@ -0,0 +1,1009 @@ + + + + + + + + + + + + + + + + +
+ +
+ Update: (1) Zielauflösung jetzt 1920×1080. (2) Sidebar per Pfeil zuklappbar (nur Icons). (3) Agenten-Seite folgt wieder der WinForms-Aufteilung: oben Agentenliste + Einstellungen, unten Werkzeugliste + Werkzeug-Konfiguration, in zwei horizontal geteilten Bereichen — aber mit klaren flachen Feldern statt PropertyGrid. (4) Werkzeugleisten bei Aufgaben (inkl. Job Aktivieren/Deaktivieren), Diensten und Logs ergänzt; Sicherung um Automatik und Zugangsdaten-Optionen erweitert. +
+ +
+ + +
+ +
+ + +
ClawdDotNet
+
+ +
+ + + +
+ +
+ +
Arbeiten
+
+ + + + + + +
+ +
+ +
Analyse
+
+ + + + +
+ +
+ +
System
+
+ + + + + + + + +
+
+ + +
+ ClawdDotNet 2.4 · Avalonia +
+
+
+ + +
+ + +
+
{{ pageTitle }}
+
+ {{ themeLabel }} + +
+
+ + + +
+ +
+ +
{{ note.instance }}: {{ note.text }}
+ +
+
+
+
+ + +
+ + + +
+ + +
+ +
+
+ + +
+ +
+ + +
+ +
+
+ + + + + + + + + + + +
AnzeigenameModellKurzinfo
{{ agent.displayName }}{{ agent.model }}{{ agent.description }}
+
+
+ +
+ +
+
+
+
Allgemein & Modell
+

{{ selectedAgent.displayName }}

+
+
+
+
+
+
+
+
+
+
+
Grenzen
+

Schutzgrenzen (LoopGuard & Budget)

+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+ + +
+ +
+
Zugelassene Werkzeuge für {{ selectedAgent.displayName }}
+
+ + + + + + + + + + + +
WerkzeugBeschreibung
{{ tool.name }}{{ tool.description }}
+
+
+ +
+ +
+
Werkzeug-Einstellungen
+

{{ selectedToolName }}

+ + +
+
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+ +
Dieses Werkzeug benötigt keine weiteren Einstellungen.
+
+
+
+
+
+ + + +
+
+ Agent: + +
+
+
+
Dev Assistant
+
Deploy-Pipeline für crypto-team ist grün. Soll ich die Release-Notes zusammenfassen?
+
+
+
Du
+
Ja, bitte kurz.
+
+
+
+ + +
+
+
+ + + +
+
+ + + +
+ + +
+
+ + + + +
+ + +
+
+ + + + + + + +
TypAgentTool / NachrichtCronNächster LaufLetzter LaufStatus
{{ job.jobType }}{{ job.agentName }}{{ job.taskMessage }}{{ job.cronExpression }}{{ job.nextRun }}{{ job.lastRun }}{{ job.status }}
+
+
+
+ + +
+
+ + +
+ + +
+ +
+
+ + + + + + + +
DienstnameTypPortStatusBeschreibung
{{ svc.name }}{{ svc.type }}{{ svc.port }}{{ svc.status }}{{ svc.description }}
+
+
+
+ + +
+
+ +
+
+ + + + + + + +
ZeitpunktJobAgentBeschreibungStatusDetails
{{ h.time }}{{ h.jobName }}{{ h.agent }}{{ h.description }}{{ h.status }}{{ h.info }}
+
+
+
+
+
+ + + +
+
+ +
+
Manuell
+

Sicherung erstellen

+
+
+
+ +
+
+ +
+ + +
+
+
+ +
+ + +
+
+ +
+
+ +
+ +
+
Automatik
+

Automatische Sicherung

+
+ +
+
+
+
+
Die Automatik sichert ohne Zugangsdaten — eine gespeicherte Passphrase wäre wirkungslos.
+
+
+ +
+ +
+
Bestand
+
+

Vorhandene Sicherungen

+
+ + + + +
+
+ + + + + + +
DateinameErstellt amInstanzGrößeZugangsdaten
backup_2026-08-16_0300.zip16.08.2026 03:00crypto-team214 MBausgeschlossen
backup_2026-08-15_0300.zip15.08.2026 03:00crypto-team211 MBausgeschlossen
+
+
+
+
+ + + +
+
+ Modul: + + Stufe: + +
+ + + + +
+
+
09:12:03 INFO AgentEngine: Run gestartet (Dev Assistant)
+
09:12:05 INFO Tools.FileRW: Lesevorgang abgeschlossen
+
09:12:08 WARN BackupScheduler: Sicherung verzögert (Ziel belegt)
+
09:12:11 INFO Tools.Database: Query ausgeführt (42ms)
+
+
+
+ + + +
+
+
Tokens (7 Tage)
{{ totalTokens7d }}
+
Kosten (7 Tage)
{{ totalCost7d }} €
+
Runs (7 Tage)
{{ totalRuns7d }}
+
+ +

Tokens pro Tag

+
+ +
+
{{ d.tokensLabel }}
+
+
{{ d.day }}
+
+
+
+ +

Aufschlüsselung nach Agent & Modell

+ + + + + + + +
AgentModellTokensKostenRuns
{{ row.agent }}{{ row.model }}{{ row.tokens }}{{ row.cost }} €{{ row.runs }}
+
+
+ + + +
+
+ Agent A: + + Agent B: + +
+
+ +
+
+ {{ msg.senderName }} + {{ msg.time }} +
+
{{ msg.text }}
+
+
+
+
+
+ + + +
+
+
+
Instanz
+
+
+
+
+
+
+
+
Allgemein
+
+
+
+
+
+
+
+
+ + + +
+ +
ClawdDotNet
+
Version 2.4.1 · Avalonia UI · net10.0
+
+
+ +
+ + +
+ Instanz: {{ currentInstance.name }} + · + API {{ apiStatusText }} + · + 1h: {{ tokensLastHour }} Tok · 24h: {{ tokensLast24h }} Tok (~{{ costLast24h }} €) + · + Credits: {{ creditsRemaining }} von {{ creditsTotal }} + {{ themeLabel }} +
+
+ + + +
+
+ +
+
Instanz wechseln
+ +
+
Jede Instanz läuft unabhängig mit eigenen Agenten und Daten. Wechseln startet die App mit der gewählten Instanz neu.
+
+ +
+
+ {{ inst.logoInitials }} + +
+
+
{{ inst.name }}
+
{{ inst.agentCount }} Agenten · API-Key {{ inst.apiKeyStatus }}
+
+ Aktiv + +
+
+
+
+
+ + +
+
+
+
+ + + +
+
+ +
{{ fieldEditorTitle }}
+ +
+ + +
+
+
+
+ +
+
+ +
+ + + diff --git a/Mockup/extracted/mockup/Implementierungsleitfaden.md b/Mockup/extracted/mockup/Implementierungsleitfaden.md new file mode 100644 index 0000000..a8d1f87 --- /dev/null +++ b/Mockup/extracted/mockup/Implementierungsleitfaden.md @@ -0,0 +1,96 @@ +# ClawdDotNet UI — Implementierungsleitfaden für Avalonia + +Dieses Verzeichnis enthält das HTML-Mockup (`ClawdDotNet-UI-Mockup.dc.html`, im Browser öffnen) +und diese Anleitung zur Übertragung nach Avalonia. Das Mockup ist eine Design-Referenz — keine +lauffähige App. Ziel-Codebasis: `src/ClawdDotNet.Desktop`. + +## 1. Was sich ändert + +- **Dunkelmodus** mit Schnellumschalter in der Kopfzeile. +- **Sidebar-Navigation** statt `TabControl` mit `TabStripPlacement="Left"` — zuklappbar auf Icon-Breite. +- **Instanzauswahl/-erstellung/-wechsel** als ein Dialog (ersetzt `InstancePickerWindow` in seiner + Doppelrolle als Start-Auswahl UND `OnOpenInstanceManager`-Reopen). Zeigt Status-Punkt + Logo-Monogramm. +- **Agenten-Seite**: wieder wie in WinForms in vier Quadranten (Liste/Einstellungen oben, + Werkzeuge/Werkzeug-Einstellungen unten), aber mit ziehbaren Splittern statt `PropertyGrid`, + und flachen Feldern statt verschachtelter Tabs. +- **Werkzeugleisten** ergänzt bei Jobs (inkl. Aktivieren/Deaktivieren), Diensten, Logs. +- **Statusleiste** erweitert um OpenRouter-API-Status und Token/Kosten-Kurzinfo (1h/24h, Credits). +- **Benachrichtigungsleiste** für instanzübergreifende Probleme (Exceptions, aufgebrauchte Limits). +- **Neue Menügruppe "Analyse"**: Tokennutzung (Charts + Tabelle), Agenten-Chats (Verlauf zwischen + zwei Agenten, siehe `docs/Agentenkommunikation-Konzept.md` für das Datenmodell `AgentMessages`). + +## 2. Design-Tokens + +Farben als `ResourceDictionary` mit `ThemeDictionaries` (Light/Dark), Zugriff per `DynamicResource` +— nie feste Farbwerte in AXAML (siehe Prüfliste in `Avalonia-Portierungsleitfaden.md`). + +``` +Light: Bg #f2f2f3 · Surface #e9e9ea · Text #1d1f20 · Accent #5980a6 · Divider #1d1f20 @16% +Dark: Bg #1a1c1e · Surface #232527 · Text #eef0f1 · Accent #7ea3c6 · Divider #eef0f1 @16% +``` + +Vollständige Ramp-Werte (Neutral/Accent 100–900, je Theme gespiegelt) stehen im `