From 38a75bc720616ad67650bfe94103ab2111ebebac Mon Sep 17 00:00:00 2001 From: M_Viper Date: Thu, 22 Oct 2026 07:22:49 +0000 Subject: [PATCH] Upload via GUI (60 Dateien) --- __tests__/gitignoreTemplates.test.js | 25 +++++++ renderer/style.css | 108 +++++++++++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 __tests__/gitignoreTemplates.test.js diff --git a/__tests__/gitignoreTemplates.test.js b/__tests__/gitignoreTemplates.test.js new file mode 100644 index 0000000..f996209 --- /dev/null +++ b/__tests__/gitignoreTemplates.test.js @@ -0,0 +1,25 @@ +const test = require('node:test'); +const assert = require('node:assert'); +const { listTemplates, buildGitignore } = require('../src/features/gitignoreTemplates.js'); + +test('listTemplates nennt Node, .NET und Electron', () => { + const keys = listTemplates().map(t => t.key); + assert.deepStrictEqual(keys, ['node', 'dotnet', 'electron']); +}); + +test('buildGitignore enthält immer den allgemeinen Teil', () => { + const out = buildGitignore([]); + assert.match(out, /\.env/); + assert.doesNotMatch(out, /node_modules/); +}); + +test('buildGitignore fügt gewählte Vorlagen genau einmal hinzu', () => { + const out = buildGitignore(['node', 'node', 'electron']); + assert.strictEqual(out.split('node_modules/').length - 1, 1); + assert.match(out, /dist\//); + assert.doesNotMatch(out, /\.vs\//); +}); + +test('buildGitignore ignoriert unbekannte Schlüssel', () => { + assert.doesNotThrow(() => buildGitignore(['gibt-es-nicht', '__proto__', null])); +}); diff --git a/renderer/style.css b/renderer/style.css index 48e0362..813d352 100644 --- a/renderer/style.css +++ b/renderer/style.css @@ -4468,3 +4468,111 @@ select option:checked { background: #2d4ea4; color: #ffffff; } :root[data-theme="light"] .project-gravur-title .gravur-sub { color: rgba(40, 60, 100, 0.6); } :root[data-theme="light"] .titlebar-strip-title { color: #4f6180 !important; } :root[data-theme="light"] .activity-log-category { color: #1e4f8a !important; } + +/* =========================== + TOOLBAR: AUFGERÄUMTE ANORDNUNG + Zeile 1: Marke, Hauptaktionen | Steuerung + Zeile 2: Quelle | Plattform, Status + Zeile 3: Repo-Leiste, nur in der Repo-Ansicht + =========================== */ +#toolbar { gap: 10px; } + +#toolbar button { white-space: nowrap; flex: 0 0 auto; } + +/* Hauptaktion hervorheben, der Rest bleibt ruhig */ +#toolbar #btnOpenRepoActions { + background: linear-gradient(135deg, #67e8f9 0%, #58a6ff 100%); + color: #03131a; + border-color: transparent; + text-shadow: none; +} + +.toolbar-row--top .toolbar-top-actions { gap: 14px; } + +/* Trennlinie zwischen Hauptaktionen und Steuerung */ +.tool-group--utility { + gap: 6px; + padding-left: 14px; + border-left: 1px solid rgba(138, 164, 214, 0.2); +} + +.toolbar-row--bottom { justify-content: space-between; } + +.tool-group--platform { + margin-left: auto; + gap: 12px; + flex-wrap: nowrap; +} + +.tool-group--platform .toolbar-status-wrap { max-width: 300px; } +.tool-group--platform .status { width: min(260px, 100%); } + +/* Repo-Leiste: eigene Zeile, nur sichtbar wenn mindestens ein Knopf eingeblendet ist */ +.toolbar-row--context { + justify-content: flex-start; + flex-wrap: wrap; + gap: 10px; + padding: 6px 8px; + border-radius: 12px; + background: rgba(8, 16, 32, 0.55); + border: 1px solid rgba(88, 213, 255, 0.12); +} + +.toolbar-row--context:not(:has(button:not(.hidden))) { display: none; } + +.toolbar-row--context .tool-group { + gap: 6px; + flex-wrap: nowrap; +} + +/* Leere Gruppe samt Trennlinie ausblenden */ +.toolbar-row--context .tool-group:not(:has(button:not(.hidden))) { display: none; } + +.toolbar-row--context .tool-group--repo-tools { + margin-left: auto; + padding-left: 12px; + border-left: 1px solid rgba(138, 164, 214, 0.2); +} + +#toolbar .toolbar-row--context button { height: 28px; font-weight: 600; } + +/* Schmale Fenster: Steuerung nur mit Symbolen (Beschriftung steht im Tooltip) */ +@media (max-width: 1100px) { + .tool-group--utility .btn-label { display: none; } + #toolbar .tool-group--utility button { padding: 0 10px; } +} + +:root[data-theme="light"] .toolbar-row--context { + background: rgba(255, 255, 255, 0.6); + border-color: rgba(30, 60, 110, 0.12); +} +:root[data-theme="light"] .tool-group--utility, +:root[data-theme="light"] .toolbar-row--context .tool-group--repo-tools { + border-left-color: rgba(30, 60, 110, 0.18); +} + +/* Schmale Fenster: Zeilen bleiben nebeneinander und brechen bei Platzmangel um, + statt wie früher komplett gestapelt und gestreckt zu werden. */ +@media (max-width: 1180px) { + .toolbar-row { flex-direction: row; align-items: center; flex-wrap: wrap; } + .toolbar-top-actions { + flex-direction: row; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + } + .toolbar-status-wrap { justify-content: flex-end; max-width: 300px; } + .tool-group--platform .status { width: min(260px, 100%); } +} + +@media (max-width: 768px) { + .tool-group, + .toolbar-status-wrap { width: auto; } + .toolbar-row--context .tool-group { flex-wrap: wrap; } +} + +:root[data-theme="light"] #toolbar #btnOpenRepoActions { + background: linear-gradient(135deg, #67e8f9 0%, #58a6ff 100%) !important; + color: #04101f !important; + border-color: transparent !important; +}