From 8cccb0f4a9edce7669cdd11bfc398d88a3aa80f3 Mon Sep 17 00:00:00 2001 From: overcuriousity Date: Sat, 19 Jul 2025 22:25:43 +0200 Subject: [PATCH] fix visual inconsistency --- src/components/AIQueryInterface.astro | 24 ++++++++++++---------- src/components/ToolCard.astro | 2 +- src/components/ToolMatrix.astro | 29 +++++++++++++++++++-------- src/data/tools.yaml | 9 +++++---- src/pages/index.astro | 2 +- src/styles/global.css | 15 ++++++++++++++ src/utils/dataService.ts | 1 + 7 files changed, 57 insertions(+), 25 deletions(-) diff --git a/src/components/AIQueryInterface.astro b/src/components/AIQueryInterface.astro index a82da2e..d2e8f8f 100644 --- a/src/components/AIQueryInterface.astro +++ b/src/components/AIQueryInterface.astro @@ -458,7 +458,7 @@ document.addEventListener('DOMContentLoaded', () => { }; return ` -

${tool.name}

@@ -474,12 +474,13 @@ document.addEventListener('DOMContentLoaded', () => {
@@ -603,7 +604,7 @@ document.addEventListener('DOMContentLoaded', () => { fullTool.projectUrl !== null && fullTool.projectUrl !== "" && fullTool.projectUrl.trim() !== ""; - + const isMethod = fullTool.type === 'method'; const suitabilityColors = { high: 'var(--color-accent)', medium: 'var(--color-warning)', @@ -617,7 +618,7 @@ document.addEventListener('DOMContentLoaded', () => { }; return ` -
@@ -631,8 +632,9 @@ document.addEventListener('DOMContentLoaded', () => { ${getSuitabilityText(toolRec.suitability_score)} - ${hasValidProjectUrl ? 'CC24-Server' : ''} - ${fullTool.license !== 'Proprietary' ? 'Open Source' : ''} + ${isMethod ? 'Methode' : ''} + ${!isMethod && hasValidProjectUrl ? 'CC24-Server' : ''} + ${!isMethod && fullTool.license !== 'Proprietary' ? 'Open Source' : ''} ${fullTool.knowledgebase === true ? '📖' : ''}
@@ -706,10 +708,10 @@ document.addEventListener('DOMContentLoaded', () => { ` : ''}
-
Plattformen: ${fullTool.platforms.join(', ')}
+ ${!isMethod ? '
Plattformen: ' + fullTool.platforms.join(', ') + '
' : ''}
Skill Level: ${fullTool.skillLevel}
-
Lizenz: ${fullTool.license}
-
Typ: ${fullTool.accessType}
+ ${!isMethod ? '
Lizenz: ' + fullTool.license + '
' : ''} +
Typ: ${isMethod ? 'Methode' : fullTool.accessType}
${toolRec.alternatives ? ` diff --git a/src/components/ToolCard.astro b/src/components/ToolCard.astro index 6f2b846..f8fc161 100644 --- a/src/components/ToolCard.astro +++ b/src/components/ToolCard.astro @@ -44,7 +44,7 @@ const cardClass = isMethod ? 'card card-method tool-card' :

{tool.name}

{isMethod && Methode} - {!isMethod && hasValidProjectUrl && Self-Hosted} + {!isMethod && hasValidProjectUrl && CC24-Server} {!isMethod && tool.license !== 'Proprietary' && OSS} {hasKnowledgebase && 📖}
diff --git a/src/components/ToolMatrix.astro b/src/components/ToolMatrix.astro index d1d3bd0..6a43c65 100644 --- a/src/components/ToolMatrix.astro +++ b/src/components/ToolMatrix.astro @@ -246,6 +246,8 @@ domains.forEach((domain: any) => { const tool = toolsData.find(t => t.name === toolName); if (!tool) return; + const isMethod = tool.type === 'method'; + // Update modal content document.getElementById('tool-name').textContent = tool.name; document.getElementById('tool-description').textContent = tool.description; @@ -258,11 +260,15 @@ domains.forEach((domain: any) => { tool.projectUrl.trim() !== ""; badgesContainer.innerHTML = ''; - if (hasValidProjectUrl) { - badgesContainer.innerHTML += 'CC24-Server'; - } - if (tool.license !== 'Proprietary') { - badgesContainer.innerHTML += 'Open Source'; + if (isMethod) { + badgesContainer.innerHTML += 'Methode'; + } else { + if (hasValidProjectUrl) { + badgesContainer.innerHTML += 'CC24-Server'; + } + if (tool.license !== 'Proprietary') { + badgesContainer.innerHTML += 'Open Source'; + } } if (tool.knowledgebase === true) { badgesContainer.innerHTML += 'Infos 📖'; @@ -296,10 +302,17 @@ domains.forEach((domain: any) => { // Links const linksContainer = document.getElementById('tool-links'); - + let linksHTML = ''; - - if (hasValidProjectUrl) { + + if (isMethod) { + // For methods, show link to the method description/documentation + linksHTML += ` + + Zur Methode + + `; + } else if (hasValidProjectUrl) { linksHTML += `
diff --git a/src/data/tools.yaml b/src/data/tools.yaml index 3bfba51..8205ee8 100644 --- a/src/data/tools.yaml +++ b/src/data/tools.yaml @@ -905,7 +905,7 @@ tools: integrierter Hash-Verifizierung für die Beweiskette. Die kostenlose Version reicht für die meisten Aufgaben, unterstützt alle gängigen Image-Formate. Etwas angestaubt in der Oberfläche, aber bewährt in - tausenden Gerichtsverfahren. + tausenden Gerichtsverfahren. Freeware, aber nicht open source. domains: - law-enforcement - incident-response @@ -918,7 +918,7 @@ tools: accessType: download url: https://www.exterro.com/digital-forensics-software/ftk-imager projectUrl: '' - license: Freeware + license: Proprietary knowledgebase: false tags: - gui @@ -1276,7 +1276,7 @@ tools: Analyse. Unterstützt alle gängigen Formate von RAW über E01 bis zu VM-Images. Der schreibgeschützte Modus garantiert forensische Integrität der Beweise. Besonders praktisch für schnelle Triage ohne vollständige - Forensik-Suite. + Forensik-Suite. Freeware, aber nicht open source. domains: - incident-response - law-enforcement @@ -1289,7 +1289,7 @@ tools: accessType: download url: https://www.osforensics.com/tools/mount-disk-images.html projectUrl: '' - license: Freeware + license: Proprietary knowledgebase: false tags: - gui @@ -1298,6 +1298,7 @@ tools: - read-only - virtual-drive - format-support + - freeware - name: Thumbcache Viewer type: software description: >- diff --git a/src/pages/index.astro b/src/pages/index.astro index f9148fa..256a688 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -358,7 +358,7 @@ function createToolCard(tool) {

${tool.name}

${isMethod ? 'Methode' : ''} - ${!isMethod && hasValidProjectUrl ? 'Self-Hosted' : ''} + ${!isMethod && hasValidProjectUrl ? 'CC24-Server' : ''} ${!isMethod && tool.license !== 'Proprietary' ? 'OSS' : ''} ${hasKnowledgebase ? '📖' : ''}
diff --git a/src/styles/global.css b/src/styles/global.css index e5cfd1e..dd8fb17 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -1034,6 +1034,21 @@ Collaboration Section Collapse */ border-color: var(--color-oss); } +.tool-recommendation.method { + background-color: var(--color-method-bg); + border-color: var(--color-method); +} + +.tool-detailed-recommendation.card-method { + background-color: var(--color-method-bg); + border-color: var(--color-method); +} + +.tool-detailed-recommendation.card-method:hover { + border-color: var(--color-method); + box-shadow: 0 0 0 1px var(--color-method), var(--shadow-lg); +} + .tool-rec-header { display: flex; justify-content: space-between; diff --git a/src/utils/dataService.ts b/src/utils/dataService.ts index 1c44eb1..e5ad538 100644 --- a/src/utils/dataService.ts +++ b/src/utils/dataService.ts @@ -5,6 +5,7 @@ import { z } from 'zod'; const ToolSchema = z.object({ name: z.string(), + icon: z.string().optional(), type: z.string(), description: z.string(), domains: z.array(z.string()).optional().nullable().default([]),