Added screenshot where thhey belongs to at the project hp

This commit is contained in:
Marc Froehlich
2026-09-13 16:57:36 +02:00
parent 923d76beb0
commit f0508f51a2
10 changed files with 169 additions and 30 deletions
+24 -15
View File
@@ -1,23 +1,32 @@
module.exports = [
{
id: "main-window",
title: "Main Window",
image: "/assets/screenshots/main-window.png",
alt: "KST4Contest ON4KST contest chat client main window",
caption: "Contest-oriented ON4KST chat workflow with candidate awareness."
id: "main-window-light",
title: "Main window · Light theme",
image: "/assets/completeViewLight.png",
alt: "KST4Contest main window in the light theme with ON4KST chat, station filters, priority candidates and sked controls",
caption: "The complete contest view brings chat messages, active bands, filters and priority candidates together."
},
{
id: "priority-candidates",
title: "Priority Candidates",
image: "/assets/screenshots/priority-candidates.png",
alt: "Priority candidate list in KST4Contest",
caption: "Score-based candidate ranking for faster operator decisions."
id: "main-window-dark",
title: "Main window · Dark theme",
image: "/assets/completeViewDark.png",
alt: "KST4Contest main window in the dark theme with ON4KST chat, station filters, priority candidates and sked controls",
caption: "The same operating view in the dark theme, including worked status, candidate priorities and message preparation."
},
{
id: "timeline",
title: "Timeline View",
image: "/assets/screenshots/timeline.png",
alt: "KST4Contest AP timeline view",
caption: "Timeline support for AP windows and candidate timing."
title: "AP and sked timeline",
image: "/assets/timeline.png",
alt: "KST4Contest timeline showing scheduled contacts and Aircraft Scatter crossing windows",
caption: "Skeds and Aircraft Scatter opportunities share one time axis, making upcoming operating windows easier to coordinate.",
wide: true
},
{
id: "airscout",
title: "KST4Contest with AirScout",
image: "/assets/complete_incl_AS.png",
alt: "KST4Contest main window alongside AirScout path and aircraft information",
caption: "AirScout adds path and aircraft information while KST4Contest keeps the related chat and station context visible.",
wide: true
}
];
];
+1
View File
@@ -61,6 +61,7 @@
<p><a href="/features/">Features</a></p>
<p><a href="/download/">Download</a></p>
<p><a href="/manual/">Manual</a></p>
<p><a href="/background/">Background</a></p>
<p><a href="/roadmap/">Roadmap</a></p>
</div>
<div>
Binary file not shown.

After

Width:  |  Height:  |  Size: 382 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

+30 -9
View File
@@ -641,18 +641,31 @@ a:hover {
margin-top: 30px;
}
.screenshot-placeholder {
display: grid;
place-items: center;
min-height: 180px;
.screenshot-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.screenshot-card--wide {
grid-column: 1 / -1;
}
.screenshot-link {
display: block;
margin-bottom: 16px;
border-radius: 18px;
background:
linear-gradient(135deg, rgba(56, 189, 248, 0.20), rgba(168, 85, 247, 0.20)),
rgba(2, 6, 23, 0.7);
overflow: hidden;
border: 1px solid var(--border);
color: white;
font-weight: 800;
background: rgba(2, 6, 23, 0.7);
}
.screenshot-image {
display: block;
width: 100%;
height: auto;
}
.screenshot-card h3 {
margin-bottom: 8px;
}
.cta-panel {
@@ -718,6 +731,14 @@ code {
align-items: flex-start;
flex-direction: column;
}
.screenshot-grid {
grid-template-columns: 1fr;
}
.screenshot-card--wide {
grid-column: auto;
}
}
@media (prefers-reduced-motion: no-preference) {
Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

+39
View File
@@ -212,6 +212,45 @@ description: Download the latest stable KST4Contest packages for Windows, Linux
</div>
</section>
<section class="section">
<div class="section-heading">
<p class="eyebrow">Conference papers</p>
<h2>Background from GHz-Tagung Dorsten</h2>
<p>
These historical conference papers document KST4Contest at the time of the 2025 and 2026 talks.
They provide project background, not a complete description of the current feature set.
</p>
</div>
<div class="grid">
<article class="card content-card">
<h3>GHz-Tagung 2025</h3>
<p>
How KST4Contest grew from practical contest operation and addressed limitations of conventional
chat clients.
</p>
<div class="actions">
<a class="button secondary" href="/assets/papers/kst4contest-ghz-tagung-2025-de.pdf">Download German PDF</a>
<a class="button secondary" href="/assets/papers/kst4contest-ghz-tagung-2025-en.pdf">Download English PDF</a>
</div>
<p><a href="/background/#paper-2025">Background and source details →</a></p>
</article>
<article class="card content-card">
<h3>GHz-Tagung 2026</h3>
<p>
How archived ON4KST chat data was evaluated and how the findings influenced later KST4Contest
functions.
</p>
<div class="actions">
<a class="button secondary" href="/assets/papers/kst4contest-ghz-tagung-2026-de.pdf">Download German PDF</a>
<a class="button secondary" href="/assets/papers/kst4contest-ghz-tagung-2026-en.pdf">Download English PDF</a>
</div>
<p><a href="/background/#paper-2026">Background and source details →</a></p>
</article>
</div>
</section>
<section class="section">
<div class="cta-panel">
<p class="eyebrow">Choosing a package</p>
+17 -6
View File
@@ -14,15 +14,26 @@ description: Screenshots of KST4Contest, the contest-optimized ON4KST chat clien
</section>
<section class="section">
<div class="grid">
<div class="section-heading">
<p class="eyebrow">Four working views</p>
<h2>From chat overview to Aircraft Scatter timing</h2>
<p>
These screenshots were captured in a test environment. Version-like text inside chat messages is
test data, not an announcement of a published KST4Contest version.
</p>
</div>
<div class="grid screenshot-grid">
{% for shot in screenshots %}
<article class="card screenshot-card">
<div class="screenshot-placeholder">
<span>{{ shot.title }}</span>
</div>
<article class="card screenshot-card{% if shot.wide %} screenshot-card--wide{% endif %}">
<a class="screenshot-link" href="{{ shot.image }}" target="_blank" rel="noopener"
aria-label="Open {{ shot.title }} in full size">
<img class="screenshot-image" src="{{ shot.image }}" alt="{{ shot.alt }}" loading="lazy" decoding="async">
</a>
<h3>{{ shot.title }}</h3>
<p>{{ shot.caption }}</p>
<p><a href="{{ shot.image }}" target="_blank" rel="noopener">Open full-size image →</a></p>
</article>
{% endfor %}
</div>
</section>
</section>
+58
View File
@@ -60,3 +60,61 @@ test("homepage contains one selected function grid and a complete-overview link"
assert.match(source, /href="\/features\/"[^>]*>Open the complete function overview/);
assert.doesNotMatch(source, /Observe|Evaluate|>Act<|One workflow, shared context/);
});
test("screenshot page uses the four approved originals as full-size links", () => {
const page = fs.readFileSync(
path.join(__dirname, "../src/screenshots/index.njk"),
"utf8"
);
const css = fs.readFileSync(
path.join(__dirname, "../src/assets/css/main.css"),
"utf8"
);
const screenshots = require("../src/_data/screenshots.js");
assert.equal(screenshots.length, 4);
assert.deepEqual(
screenshots.map(({ image }) => image),
[
"/assets/completeViewLight.png",
"/assets/completeViewDark.png",
"/assets/timeline.png",
"/assets/complete_incl_AS.png"
]
);
assert.ok(screenshots.every(({ alt, caption }) => alt && caption));
assert.equal(screenshots.find(({ id }) => id === "timeline").wide, true);
assert.doesNotMatch(JSON.stringify(screenshots), /Priority Candidates/);
assert.match(page, /href="{{ shot\.image }}"[\s\S]*<img[^>]*src="{{ shot\.image }}"/);
assert.match(page, /Version-like text inside chat messages is[\s\S]*not an announcement/);
assert.match(css, /\.screenshot-image\s*\{[\s\S]*?width:\s*100%;[\s\S]*?height:\s*auto;/);
assert.match(css, /\.screenshot-card--wide\s*\{\s*grid-column:\s*1\s*\/\s*-1;/);
});
test("footer and download page expose background and conference papers", () => {
const layout = fs.readFileSync(
path.join(__dirname, "../src/_layouts/base.njk"),
"utf8"
);
const download = fs.readFileSync(
path.join(__dirname, "../src/download/index.njk"),
"utf8"
);
assert.match(layout, /<p><a href="\/background\/">Background<\/a><\/p>/);
for (const name of [
"kst4contest-ghz-tagung-2025-de.pdf",
"kst4contest-ghz-tagung-2025-en.pdf",
"kst4contest-ghz-tagung-2026-de.pdf",
"kst4contest-ghz-tagung-2026-en.pdf"
]) {
assert.match(download, new RegExp(`/assets/papers/${name.replaceAll(".", "\\.")}`));
}
assert.match(download, /href="\/background\/#paper-2025"/);
assert.match(download, /href="\/background\/#paper-2026"/);
assert.match(download, /historical conference papers[\s\S]*not a complete description of the current feature set/);
assert.ok(
download.indexOf("Background from GHz-Tagung Dorsten") >
download.indexOf('<div class="channel-panel" data-channel="nightly">')
);
});