fix visual inconsistency
This commit is contained in:
parent
c280640dc1
commit
8cccb0f4a9
@ -458,7 +458,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return `
|
return `
|
||||||
<div class="tool-recommendation ${hasValidProjectUrl ? 'hosted' : (tool.license !== 'Proprietary' ? 'oss' : '')}"
|
<div class="tool-recommendation ${tool.type === 'method' ? 'method' : hasValidProjectUrl ? 'hosted' : (tool.license !== 'Proprietary' ? 'oss' : '')}"
|
||||||
onclick="window.showToolDetails('${tool.name}')">
|
onclick="window.showToolDetails('${tool.name}')">
|
||||||
<div class="tool-rec-header">
|
<div class="tool-rec-header">
|
||||||
<h4 class="tool-rec-name">${tool.name}</h4>
|
<h4 class="tool-rec-name">${tool.name}</h4>
|
||||||
@ -474,12 +474,13 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
|
|
||||||
<div class="tool-rec-metadata">
|
<div class="tool-rec-metadata">
|
||||||
<div style="display: flex; flex-wrap: wrap; gap: 0.25rem; margin-bottom: 0.5rem;">
|
<div style="display: flex; flex-wrap: wrap; gap: 0.25rem; margin-bottom: 0.5rem;">
|
||||||
${hasValidProjectUrl ? '<span class="badge badge-primary">CC24-Server</span>' : ''}
|
${tool.type === 'method' ? '<span class="badge" style="background-color: var(--color-method); color: white;">Methode</span>' : ''}
|
||||||
${tool.license !== 'Proprietary' ? '<span class="badge badge-success">Open Source</span>' : ''}
|
${tool.type !== 'method' && hasValidProjectUrl ? '<span class="badge badge-primary">CC24-Server</span>' : ''}
|
||||||
|
${tool.type !== 'method' && tool.license !== 'Proprietary' ? '<span class="badge badge-success">Open Source</span>' : ''}
|
||||||
<span class="badge" style="background-color: var(--color-bg-tertiary); color: var(--color-text);">${tool.skillLevel}</span>
|
<span class="badge" style="background-color: var(--color-bg-tertiary); color: var(--color-text);">${tool.skillLevel}</span>
|
||||||
</div>
|
</div>
|
||||||
<div style="font-size: 0.8125rem; color: var(--color-text-secondary);">
|
<div style="font-size: 0.8125rem; color: var(--color-text-secondary);">
|
||||||
${tool.platforms.join(', ')} • ${tool.license}
|
${tool.type === 'method' ? 'Methode' : tool.platforms.join(', ') + ' • ' + tool.license}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -603,7 +604,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
fullTool.projectUrl !== null &&
|
fullTool.projectUrl !== null &&
|
||||||
fullTool.projectUrl !== "" &&
|
fullTool.projectUrl !== "" &&
|
||||||
fullTool.projectUrl.trim() !== "";
|
fullTool.projectUrl.trim() !== "";
|
||||||
|
const isMethod = fullTool.type === 'method';
|
||||||
const suitabilityColors = {
|
const suitabilityColors = {
|
||||||
high: 'var(--color-accent)',
|
high: 'var(--color-accent)',
|
||||||
medium: 'var(--color-warning)',
|
medium: 'var(--color-warning)',
|
||||||
@ -617,7 +618,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return `
|
return `
|
||||||
<div class="tool-detailed-recommendation card ${hasValidProjectUrl ? 'card-hosted' : (fullTool.license !== 'Proprietary' ? 'card-oss' : '')}"
|
<div class="tool-detailed-recommendation card ${isMethod ? 'card-method' : hasValidProjectUrl ? 'card-hosted' : (fullTool.license !== 'Proprietary' ? 'card-oss' : '')}"
|
||||||
style="cursor: pointer; position: relative;"
|
style="cursor: pointer; position: relative;"
|
||||||
onclick="window.showToolDetails('${fullTool.name}')">
|
onclick="window.showToolDetails('${fullTool.name}')">
|
||||||
|
|
||||||
@ -631,8 +632,9 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
<span class="badge" style="background-color: ${suitabilityColors[toolRec.suitability_score]}; color: white; font-size: 0.8125rem;">
|
<span class="badge" style="background-color: ${suitabilityColors[toolRec.suitability_score]}; color: white; font-size: 0.8125rem;">
|
||||||
${getSuitabilityText(toolRec.suitability_score)}
|
${getSuitabilityText(toolRec.suitability_score)}
|
||||||
</span>
|
</span>
|
||||||
${hasValidProjectUrl ? '<span class="badge badge-primary">CC24-Server</span>' : ''}
|
${isMethod ? '<span class="badge" style="background-color: var(--color-method); color: white;">Methode</span>' : ''}
|
||||||
${fullTool.license !== 'Proprietary' ? '<span class="badge badge-success">Open Source</span>' : ''}
|
${!isMethod && hasValidProjectUrl ? '<span class="badge badge-primary">CC24-Server</span>' : ''}
|
||||||
|
${!isMethod && fullTool.license !== 'Proprietary' ? '<span class="badge badge-success">Open Source</span>' : ''}
|
||||||
${fullTool.knowledgebase === true ? '<span class="badge badge-error">📖</span>' : ''}
|
${fullTool.knowledgebase === true ? '<span class="badge badge-error">📖</span>' : ''}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -706,10 +708,10 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
` : ''}
|
` : ''}
|
||||||
|
|
||||||
<div class="tool-metadata" style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 0.75rem; font-size: 0.8125rem; color: var(--color-text-secondary); margin-bottom: 1rem;">
|
<div class="tool-metadata" style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 0.75rem; font-size: 0.8125rem; color: var(--color-text-secondary); margin-bottom: 1rem;">
|
||||||
<div><strong>Plattformen:</strong> ${fullTool.platforms.join(', ')}</div>
|
${!isMethod ? '<div><strong>Plattformen:</strong> ' + fullTool.platforms.join(', ') + '</div>' : ''}
|
||||||
<div><strong>Skill Level:</strong> ${fullTool.skillLevel}</div>
|
<div><strong>Skill Level:</strong> ${fullTool.skillLevel}</div>
|
||||||
<div><strong>Lizenz:</strong> ${fullTool.license}</div>
|
${!isMethod ? '<div><strong>Lizenz:</strong> ' + fullTool.license + '</div>' : ''}
|
||||||
<div><strong>Typ:</strong> ${fullTool.accessType}</div>
|
<div><strong>Typ:</strong> ${isMethod ? 'Methode' : fullTool.accessType}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
${toolRec.alternatives ? `
|
${toolRec.alternatives ? `
|
||||||
|
@ -44,7 +44,7 @@ const cardClass = isMethod ? 'card card-method tool-card' :
|
|||||||
<h3>{tool.name}</h3>
|
<h3>{tool.name}</h3>
|
||||||
<div class="tool-card-badges">
|
<div class="tool-card-badges">
|
||||||
{isMethod && <span class="badge" style="background-color: var(--color-method); color: white;">Methode</span>}
|
{isMethod && <span class="badge" style="background-color: var(--color-method); color: white;">Methode</span>}
|
||||||
{!isMethod && hasValidProjectUrl && <span class="badge badge-primary">Self-Hosted</span>}
|
{!isMethod && hasValidProjectUrl && <span class="badge badge-primary">CC24-Server</span>}
|
||||||
{!isMethod && tool.license !== 'Proprietary' && <span class="badge badge-success">OSS</span>}
|
{!isMethod && tool.license !== 'Proprietary' && <span class="badge badge-success">OSS</span>}
|
||||||
{hasKnowledgebase && <span class="badge badge-error">📖</span>}
|
{hasKnowledgebase && <span class="badge badge-error">📖</span>}
|
||||||
</div>
|
</div>
|
||||||
|
@ -246,6 +246,8 @@ domains.forEach((domain: any) => {
|
|||||||
const tool = toolsData.find(t => t.name === toolName);
|
const tool = toolsData.find(t => t.name === toolName);
|
||||||
if (!tool) return;
|
if (!tool) return;
|
||||||
|
|
||||||
|
const isMethod = tool.type === 'method';
|
||||||
|
|
||||||
// Update modal content
|
// Update modal content
|
||||||
document.getElementById('tool-name').textContent = tool.name;
|
document.getElementById('tool-name').textContent = tool.name;
|
||||||
document.getElementById('tool-description').textContent = tool.description;
|
document.getElementById('tool-description').textContent = tool.description;
|
||||||
@ -258,11 +260,15 @@ domains.forEach((domain: any) => {
|
|||||||
tool.projectUrl.trim() !== "";
|
tool.projectUrl.trim() !== "";
|
||||||
|
|
||||||
badgesContainer.innerHTML = '';
|
badgesContainer.innerHTML = '';
|
||||||
if (hasValidProjectUrl) {
|
if (isMethod) {
|
||||||
badgesContainer.innerHTML += '<span class="badge badge-primary">CC24-Server</span>';
|
badgesContainer.innerHTML += '<span class="badge" style="background-color: var(--color-method); color: white;">Methode</span>';
|
||||||
}
|
} else {
|
||||||
if (tool.license !== 'Proprietary') {
|
if (hasValidProjectUrl) {
|
||||||
badgesContainer.innerHTML += '<span class="badge badge-success">Open Source</span>';
|
badgesContainer.innerHTML += '<span class="badge badge-primary">CC24-Server</span>';
|
||||||
|
}
|
||||||
|
if (tool.license !== 'Proprietary') {
|
||||||
|
badgesContainer.innerHTML += '<span class="badge badge-success">Open Source</span>';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (tool.knowledgebase === true) {
|
if (tool.knowledgebase === true) {
|
||||||
badgesContainer.innerHTML += '<span class="badge badge-error">Infos 📖</span>';
|
badgesContainer.innerHTML += '<span class="badge badge-error">Infos 📖</span>';
|
||||||
@ -296,10 +302,17 @@ domains.forEach((domain: any) => {
|
|||||||
|
|
||||||
// Links
|
// Links
|
||||||
const linksContainer = document.getElementById('tool-links');
|
const linksContainer = document.getElementById('tool-links');
|
||||||
|
|
||||||
let linksHTML = '';
|
let linksHTML = '';
|
||||||
|
|
||||||
if (hasValidProjectUrl) {
|
if (isMethod) {
|
||||||
|
// For methods, show link to the method description/documentation
|
||||||
|
linksHTML += `
|
||||||
|
<a href="${tool.projectUrl || tool.url}" target="_blank" rel="noopener noreferrer" class="btn btn-primary" style="width: 100%; background-color: var(--color-method); border-color: var(--color-method);">
|
||||||
|
Zur Methode
|
||||||
|
</a>
|
||||||
|
`;
|
||||||
|
} else if (hasValidProjectUrl) {
|
||||||
linksHTML += `
|
linksHTML += `
|
||||||
<div style="display: flex; gap: 0.5rem;">
|
<div style="display: flex; gap: 0.5rem;">
|
||||||
<a href="${tool.url}" target="_blank" rel="noopener noreferrer" class="btn btn-secondary" style="flex: 1;">
|
<a href="${tool.url}" target="_blank" rel="noopener noreferrer" class="btn btn-secondary" style="flex: 1;">
|
||||||
|
@ -905,7 +905,7 @@ tools:
|
|||||||
integrierter Hash-Verifizierung für die Beweiskette. Die kostenlose
|
integrierter Hash-Verifizierung für die Beweiskette. Die kostenlose
|
||||||
Version reicht für die meisten Aufgaben, unterstützt alle gängigen
|
Version reicht für die meisten Aufgaben, unterstützt alle gängigen
|
||||||
Image-Formate. Etwas angestaubt in der Oberfläche, aber bewährt in
|
Image-Formate. Etwas angestaubt in der Oberfläche, aber bewährt in
|
||||||
tausenden Gerichtsverfahren.
|
tausenden Gerichtsverfahren. Freeware, aber nicht open source.
|
||||||
domains:
|
domains:
|
||||||
- law-enforcement
|
- law-enforcement
|
||||||
- incident-response
|
- incident-response
|
||||||
@ -918,7 +918,7 @@ tools:
|
|||||||
accessType: download
|
accessType: download
|
||||||
url: https://www.exterro.com/digital-forensics-software/ftk-imager
|
url: https://www.exterro.com/digital-forensics-software/ftk-imager
|
||||||
projectUrl: ''
|
projectUrl: ''
|
||||||
license: Freeware
|
license: Proprietary
|
||||||
knowledgebase: false
|
knowledgebase: false
|
||||||
tags:
|
tags:
|
||||||
- gui
|
- gui
|
||||||
@ -1276,7 +1276,7 @@ tools:
|
|||||||
Analyse. Unterstützt alle gängigen Formate von RAW über E01 bis zu
|
Analyse. Unterstützt alle gängigen Formate von RAW über E01 bis zu
|
||||||
VM-Images. Der schreibgeschützte Modus garantiert forensische Integrität
|
VM-Images. Der schreibgeschützte Modus garantiert forensische Integrität
|
||||||
der Beweise. Besonders praktisch für schnelle Triage ohne vollständige
|
der Beweise. Besonders praktisch für schnelle Triage ohne vollständige
|
||||||
Forensik-Suite.
|
Forensik-Suite. Freeware, aber nicht open source.
|
||||||
domains:
|
domains:
|
||||||
- incident-response
|
- incident-response
|
||||||
- law-enforcement
|
- law-enforcement
|
||||||
@ -1289,7 +1289,7 @@ tools:
|
|||||||
accessType: download
|
accessType: download
|
||||||
url: https://www.osforensics.com/tools/mount-disk-images.html
|
url: https://www.osforensics.com/tools/mount-disk-images.html
|
||||||
projectUrl: ''
|
projectUrl: ''
|
||||||
license: Freeware
|
license: Proprietary
|
||||||
knowledgebase: false
|
knowledgebase: false
|
||||||
tags:
|
tags:
|
||||||
- gui
|
- gui
|
||||||
@ -1298,6 +1298,7 @@ tools:
|
|||||||
- read-only
|
- read-only
|
||||||
- virtual-drive
|
- virtual-drive
|
||||||
- format-support
|
- format-support
|
||||||
|
- freeware
|
||||||
- name: Thumbcache Viewer
|
- name: Thumbcache Viewer
|
||||||
type: software
|
type: software
|
||||||
description: >-
|
description: >-
|
||||||
|
@ -358,7 +358,7 @@ function createToolCard(tool) {
|
|||||||
<h3>${tool.name}</h3>
|
<h3>${tool.name}</h3>
|
||||||
<div class="tool-card-badges">
|
<div class="tool-card-badges">
|
||||||
${isMethod ? '<span class="badge" style="background-color: var(--color-method); color: white;">Methode</span>' : ''}
|
${isMethod ? '<span class="badge" style="background-color: var(--color-method); color: white;">Methode</span>' : ''}
|
||||||
${!isMethod && hasValidProjectUrl ? '<span class="badge badge-primary">Self-Hosted</span>' : ''}
|
${!isMethod && hasValidProjectUrl ? '<span class="badge badge-primary">CC24-Server</span>' : ''}
|
||||||
${!isMethod && tool.license !== 'Proprietary' ? '<span class="badge badge-success">OSS</span>' : ''}
|
${!isMethod && tool.license !== 'Proprietary' ? '<span class="badge badge-success">OSS</span>' : ''}
|
||||||
${hasKnowledgebase ? '<span class="badge badge-error">📖</span>' : ''}
|
${hasKnowledgebase ? '<span class="badge badge-error">📖</span>' : ''}
|
||||||
</div>
|
</div>
|
||||||
|
@ -1034,6 +1034,21 @@ Collaboration Section Collapse */
|
|||||||
border-color: var(--color-oss);
|
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 {
|
.tool-rec-header {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
@ -5,6 +5,7 @@ import { z } from 'zod';
|
|||||||
|
|
||||||
const ToolSchema = z.object({
|
const ToolSchema = z.object({
|
||||||
name: z.string(),
|
name: z.string(),
|
||||||
|
icon: z.string().optional(),
|
||||||
type: z.string(),
|
type: z.string(),
|
||||||
description: z.string(),
|
description: z.string(),
|
||||||
domains: z.array(z.string()).optional().nullable().default([]),
|
domains: z.array(z.string()).optional().nullable().default([]),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user