mirror of
https://github.com/praktimarc/kst4contest.git
synced 2026-07-13 16:16:44 +02:00
Refactor website into data-driven content model
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
module.exports = [
|
||||
{
|
||||
os: "Windows",
|
||||
format: "ZIP",
|
||||
icon: "🪟",
|
||||
recommended: true,
|
||||
url: "https://github.com/praktimarc/kst4contest/releases/latest"
|
||||
},
|
||||
{
|
||||
os: "macOS",
|
||||
format: "DMG",
|
||||
icon: "🍎",
|
||||
recommended: false,
|
||||
url: "https://github.com/praktimarc/kst4contest/releases/latest"
|
||||
},
|
||||
{
|
||||
os: "Linux",
|
||||
format: "AppImage / DEB / RPM / Arch",
|
||||
icon: "🐧",
|
||||
recommended: false,
|
||||
url: "https://github.com/praktimarc/kst4contest/releases/latest"
|
||||
},
|
||||
{
|
||||
os: "Flatpak",
|
||||
format: "flatpakref",
|
||||
icon: "📦",
|
||||
recommended: false,
|
||||
url: "https://github.com/praktimarc/kst4contest/releases/latest"
|
||||
},
|
||||
{
|
||||
os: "Manual",
|
||||
format: "PDF EN/DE",
|
||||
icon: "📘",
|
||||
recommended: false,
|
||||
url: "https://github.com/praktimarc/kst4contest/releases/latest"
|
||||
}
|
||||
];
|
||||
@@ -4,19 +4,21 @@ module.exports = [
|
||||
title: "Priority Score System",
|
||||
icon: "🎯",
|
||||
category: "Contest Workflow",
|
||||
since: "1.40",
|
||||
summary: "Find the most promising stations faster using contest-aware candidate scoring.",
|
||||
description: "KST4Contest ranks stations by contest-relevant signals such as activity, direction, sked context, bands, frequencies and operator workflow.",
|
||||
keywords: ["ON4KST", "contest", "priority candidates", "VHF", "UHF", "SHF"],
|
||||
related: ["airscout", "sked-reminder", "timeline"]
|
||||
description: "KST4Contest ranks stations by activity, direction, sked context, band information, QRG hints and operator workflow signals.",
|
||||
tags: ["ON4KST", "VHF", "UHF", "SHF", "contest", "priority candidates"],
|
||||
related: ["timeline", "airscout", "sked-reminder"]
|
||||
},
|
||||
{
|
||||
slug: "airscout",
|
||||
title: "AirScout Integration",
|
||||
icon: "✈️",
|
||||
category: "Aircraft Scatter",
|
||||
summary: "Use airplane scatter awareness directly inside your ON4KST contest workflow.",
|
||||
since: "1.26",
|
||||
summary: "Use aircraft scatter awareness directly inside your ON4KST contest workflow.",
|
||||
description: "AirScout information helps operators evaluate AP windows, aircraft scatter timing and candidate stations during VHF/UHF/SHF contests.",
|
||||
keywords: ["AirScout", "airplane scatter", "aircraft scatter", "VHF contest"],
|
||||
tags: ["AirScout", "airplane scatter", "aircraft scatter", "VHF contest"],
|
||||
related: ["timeline", "priority-score", "sked-reminder"]
|
||||
},
|
||||
{
|
||||
@@ -24,9 +26,10 @@ module.exports = [
|
||||
title: "Timeline View",
|
||||
icon: "⏱️",
|
||||
category: "Contest Awareness",
|
||||
since: "1.40",
|
||||
summary: "See upcoming AP windows and candidate timing in a compact contest timeline.",
|
||||
description: "The timeline view helps operators understand short propagation windows and candidate timing during active contest operation.",
|
||||
keywords: ["AP timeline", "airplane scatter", "contest timing"],
|
||||
tags: ["timeline", "AP windows", "airplane scatter"],
|
||||
related: ["airscout", "priority-score"]
|
||||
},
|
||||
{
|
||||
@@ -34,29 +37,54 @@ module.exports = [
|
||||
title: "Sked Reminder",
|
||||
icon: "🔔",
|
||||
category: "Sked Management",
|
||||
since: "1.40",
|
||||
summary: "Keep scheduled contacts visible and avoid missing time-critical skeds.",
|
||||
description: "KST4Contest keeps skeds in focus while the operator handles chat traffic, logging, bands and aircraft scatter timing.",
|
||||
keywords: ["sked", "ON4KST sked", "contest reminder"],
|
||||
related: ["priority-score", "airscout"]
|
||||
tags: ["sked", "ON4KST", "contest reminder"],
|
||||
related: ["priority-score", "airscout", "timeline"]
|
||||
},
|
||||
{
|
||||
slug: "log-sync",
|
||||
title: "Log Synchronization",
|
||||
icon: "🔄",
|
||||
category: "Logger Integration",
|
||||
since: "1.31",
|
||||
summary: "Connect ON4KST chat workflow with Win-Test, UCXLog and contest logging state.",
|
||||
description: "Log synchronization helps KST4Contest understand worked stations, active bands and contest context.",
|
||||
keywords: ["Win-Test", "UCXLog", "contest logger", "ON4KST"],
|
||||
related: ["priority-score"]
|
||||
tags: ["Win-Test", "UCXLog", "contest logger"],
|
||||
related: ["priority-score", "dual-chat"]
|
||||
},
|
||||
{
|
||||
slug: "dual-chat",
|
||||
title: "Dual Chat Categories",
|
||||
icon: "💬",
|
||||
category: "ON4KST Chat",
|
||||
since: "1.26",
|
||||
summary: "Operate in two ON4KST categories at once, for example VHF/UHF and microwave.",
|
||||
description: "Dual category support gives contest operators better overview when working across multiple ON4KST chat rooms.",
|
||||
keywords: ["ON4KST", "dual chat", "microwave contest"],
|
||||
tags: ["ON4KST", "dual chat", "microwave contest"],
|
||||
related: ["priority-score", "log-sync"]
|
||||
},
|
||||
{
|
||||
slug: "dx-cluster",
|
||||
title: "DXCluster Server",
|
||||
icon: "📡",
|
||||
category: "Radio Workflow",
|
||||
since: "1.23",
|
||||
summary: "Use DXCluster information as part of the wider contest operating workflow.",
|
||||
description: "KST4Contest includes DXCluster functionality to support situational awareness during contest operation.",
|
||||
tags: ["DXCluster", "ham radio", "contest"],
|
||||
related: ["log-sync", "priority-score"]
|
||||
},
|
||||
{
|
||||
slug: "macros",
|
||||
title: "Macros and Variables",
|
||||
icon: "⚡",
|
||||
category: "Operator Speed",
|
||||
since: "1.0",
|
||||
summary: "Send recurring contest messages faster with configurable macros and variables.",
|
||||
description: "Macros reduce repetitive typing and help operators respond quickly during active ON4KST contest sessions.",
|
||||
tags: ["macros", "ON4KST", "operator workflow"],
|
||||
related: ["sked-reminder", "dual-chat"]
|
||||
}
|
||||
];
|
||||
@@ -0,0 +1,9 @@
|
||||
module.exports = [
|
||||
{ title: "Home", url: "/" },
|
||||
{ title: "Features", url: "/features/" },
|
||||
{ title: "Screenshots", url: "/screenshots/" },
|
||||
{ title: "Download", url: "/download/" },
|
||||
{ title: "Manual", url: "/manual/" },
|
||||
{ title: "News", url: "/news/" },
|
||||
{ title: "FAQ", url: "/faq/" }
|
||||
];
|
||||
@@ -0,0 +1,23 @@
|
||||
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: "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: "timeline",
|
||||
title: "Timeline View",
|
||||
image: "/assets/screenshots/timeline.png",
|
||||
alt: "KST4Contest AP timeline view",
|
||||
caption: "Timeline support for AP windows and candidate timing."
|
||||
}
|
||||
];
|
||||
@@ -5,7 +5,6 @@
|
||||
<title>{{ title or "KST4Contest" }}</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="{{ description or 'KST4Contest is a contest-optimized ON4KST chat client for VHF, UHF and SHF ham radio contests.' }}">
|
||||
|
||||
<link rel="canonical" href="https://kst4contest.hamradioonline.de{{ page.url }}">
|
||||
|
||||
<meta property="og:type" content="website">
|
||||
@@ -20,17 +19,24 @@
|
||||
|
||||
<link rel="stylesheet" href="/assets/css/main.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="site-bg"></div>
|
||||
|
||||
<header class="site-header">
|
||||
<a class="brand" href="/">KST4Contest</a>
|
||||
<nav>
|
||||
<a href="/features/">Features</a>
|
||||
<a href="/download/">Download</a>
|
||||
<a href="/manual/">Manual</a>
|
||||
<a href="/screenshots/">Screenshots</a>
|
||||
<a href="/news/">News</a>
|
||||
<a href="https://github.com/praktimarc/kst4contest">GitHub</a>
|
||||
<a href="/faq/">FAQ</a>
|
||||
<a class="brand" href="/">
|
||||
<span class="brand-mark">◎</span>
|
||||
<span>
|
||||
<strong>KST4Contest</strong>
|
||||
<small>ON4KST Contest Client</small>
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="site-nav">
|
||||
{% for item in navigation %}
|
||||
<a href="{{ item.url }}">{{ item.title }}</a>
|
||||
{% endfor %}
|
||||
<a class="nav-cta" href="https://github.com/praktimarc/kst4contest/releases/latest">Download</a>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
@@ -39,7 +45,8 @@
|
||||
</main>
|
||||
|
||||
<footer class="site-footer">
|
||||
<p>KST4Contest – ON4KST contest workflow for VHF/UHF/SHF operators.</p>
|
||||
<p>KST4Contest – contest-optimized ON4KST workflow for VHF/UHF/SHF operators.</p>
|
||||
<p><a href="https://github.com/praktimarc/kst4contest">GitHub Repository</a></p>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
+311
-50
@@ -1,23 +1,54 @@
|
||||
:root {
|
||||
--bg: #0f172a;
|
||||
--panel: #111827;
|
||||
--panel2: #1f2937;
|
||||
--text: #e5e7eb;
|
||||
--muted: #9ca3af;
|
||||
--bg: #050816;
|
||||
--bg2: #0b1224;
|
||||
--panel: rgba(15, 23, 42, 0.78);
|
||||
--panel2: rgba(30, 41, 59, 0.72);
|
||||
--border: rgba(148, 163, 184, 0.22);
|
||||
--text: #f8fafc;
|
||||
--muted: #aab6ca;
|
||||
--soft: #64748b;
|
||||
--accent: #38bdf8;
|
||||
--accent2: #a78bfa;
|
||||
--accent2: #a855f7;
|
||||
--accent3: #22c55e;
|
||||
--shadow: 0 24px 80px rgba(0, 0, 0, 0.45);
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
background: radial-gradient(circle at top left, #1e293b, var(--bg));
|
||||
background: var(--bg);
|
||||
color: var(--text);
|
||||
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
||||
line-height: 1.6;
|
||||
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
||||
line-height: 1.65;
|
||||
}
|
||||
|
||||
.site-bg {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
z-index: -1;
|
||||
background:
|
||||
radial-gradient(circle at 15% 8%, rgba(168, 85, 247, 0.30), transparent 30%),
|
||||
radial-gradient(circle at 82% 18%, rgba(56, 189, 248, 0.26), transparent 30%),
|
||||
radial-gradient(circle at 50% 90%, rgba(34, 197, 94, 0.12), transparent 30%),
|
||||
linear-gradient(180deg, #050816 0%, #07111f 100%);
|
||||
}
|
||||
|
||||
.site-bg::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background-image:
|
||||
linear-gradient(rgba(255,255,255,0.035) 1px, transparent 1px),
|
||||
linear-gradient(90deg, rgba(255,255,255,0.035) 1px, transparent 1px);
|
||||
background-size: 54px 54px;
|
||||
mask-image: radial-gradient(circle at center, black, transparent 72%);
|
||||
}
|
||||
|
||||
a {
|
||||
@@ -25,72 +56,245 @@ a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.site-header {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 10;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: 24px;
|
||||
align-items: center;
|
||||
padding: 24px 7vw;
|
||||
padding: 18px 6vw;
|
||||
background: rgba(5, 8, 22, 0.76);
|
||||
backdrop-filter: blur(18px);
|
||||
border-bottom: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.brand {
|
||||
font-weight: 800;
|
||||
font-size: 1.25rem;
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
align-items: center;
|
||||
color: white;
|
||||
}
|
||||
|
||||
nav {
|
||||
.brand-mark {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 14px;
|
||||
background: linear-gradient(135deg, var(--accent), var(--accent2));
|
||||
box-shadow: 0 0 26px rgba(168, 85, 247, 0.45);
|
||||
}
|
||||
|
||||
.brand strong {
|
||||
display: block;
|
||||
font-size: 1.05rem;
|
||||
letter-spacing: 0.02em;
|
||||
}
|
||||
|
||||
.brand small {
|
||||
display: block;
|
||||
color: var(--muted);
|
||||
font-size: 0.78rem;
|
||||
margin-top: -4px;
|
||||
}
|
||||
|
||||
.site-nav {
|
||||
display: flex;
|
||||
gap: 18px;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
nav a {
|
||||
.site-nav a {
|
||||
color: var(--muted);
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
nav a:hover {
|
||||
.site-nav a:hover {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.nav-cta {
|
||||
padding: 9px 14px;
|
||||
border-radius: 999px;
|
||||
color: white !important;
|
||||
background: linear-gradient(135deg, var(--accent), var(--accent2));
|
||||
box-shadow: 0 0 22px rgba(56, 189, 248, 0.28);
|
||||
}
|
||||
|
||||
.hero {
|
||||
padding: 90px 7vw 70px;
|
||||
max-width: 1100px;
|
||||
padding: 92px 6vw 62px;
|
||||
max-width: 1180px;
|
||||
}
|
||||
|
||||
.hero-split {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 1fr) minmax(360px, 0.9fr);
|
||||
gap: 42px;
|
||||
align-items: center;
|
||||
max-width: 1500px;
|
||||
}
|
||||
|
||||
.hero h1 {
|
||||
font-size: clamp(2.4rem, 6vw, 5rem);
|
||||
line-height: 1.02;
|
||||
margin: 0 0 24px;
|
||||
margin: 0 0 22px;
|
||||
font-size: clamp(3rem, 8vw, 6.5rem);
|
||||
line-height: 0.95;
|
||||
letter-spacing: -0.07em;
|
||||
background: linear-gradient(90deg, white, var(--accent), var(--accent2));
|
||||
-webkit-background-clip: text;
|
||||
color: transparent;
|
||||
}
|
||||
|
||||
.hero p {
|
||||
font-size: 1.25rem;
|
||||
.hero .lead,
|
||||
.hero > p,
|
||||
.section-heading p,
|
||||
.cta-panel p {
|
||||
color: var(--muted);
|
||||
max-width: 760px;
|
||||
font-size: 1.18rem;
|
||||
max-width: 850px;
|
||||
}
|
||||
|
||||
.badge,
|
||||
.eyebrow {
|
||||
display: inline-flex;
|
||||
width: fit-content;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
color: #e9d5ff;
|
||||
background: rgba(168, 85, 247, 0.13);
|
||||
border: 1px solid rgba(168, 85, 247, 0.34);
|
||||
padding: 6px 12px;
|
||||
border-radius: 999px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.08em;
|
||||
font-size: 0.74rem;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.actions {
|
||||
display: flex;
|
||||
gap: 16px;
|
||||
margin-top: 32px;
|
||||
gap: 14px;
|
||||
margin-top: 30px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.button {
|
||||
padding: 13px 20px;
|
||||
border-radius: 999px;
|
||||
background: var(--accent);
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-height: 46px;
|
||||
padding: 12px 18px;
|
||||
border-radius: 14px;
|
||||
color: #020617;
|
||||
font-weight: 700;
|
||||
background: linear-gradient(135deg, var(--accent), var(--accent2));
|
||||
font-weight: 800;
|
||||
box-shadow: 0 16px 44px rgba(56, 189, 248, 0.25);
|
||||
}
|
||||
|
||||
.button.secondary {
|
||||
background: var(--panel2);
|
||||
color: white;
|
||||
background: rgba(30, 41, 59, 0.85);
|
||||
border: 1px solid var(--border);
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.button.ghost {
|
||||
color: white;
|
||||
background: transparent;
|
||||
border: 1px solid var(--border);
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.hero-panel,
|
||||
.card,
|
||||
.cta-panel {
|
||||
background: var(--panel);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 26px;
|
||||
box-shadow: var(--shadow);
|
||||
}
|
||||
|
||||
.hero-panel {
|
||||
overflow: hidden;
|
||||
transform: perspective(1200px) rotateY(-5deg) rotateX(2deg);
|
||||
}
|
||||
|
||||
.terminal-bar {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
padding: 14px 16px;
|
||||
border-bottom: 1px solid var(--border);
|
||||
background: rgba(2, 6, 23, 0.74);
|
||||
}
|
||||
|
||||
.terminal-bar span {
|
||||
width: 11px;
|
||||
height: 11px;
|
||||
border-radius: 50%;
|
||||
background: var(--accent2);
|
||||
}
|
||||
|
||||
.terminal-bar span:nth-child(2) {
|
||||
background: #f59e0b;
|
||||
}
|
||||
|
||||
.terminal-bar span:nth-child(3) {
|
||||
background: var(--accent3);
|
||||
}
|
||||
|
||||
.terminal-bar strong {
|
||||
margin-left: 8px;
|
||||
color: var(--muted);
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
.mock-grid {
|
||||
display: grid;
|
||||
gap: 12px;
|
||||
padding: 18px;
|
||||
}
|
||||
|
||||
.mini-card {
|
||||
padding: 14px;
|
||||
border-radius: 16px;
|
||||
background: rgba(15, 23, 42, 0.88);
|
||||
border: 1px solid rgba(148, 163, 184, 0.16);
|
||||
}
|
||||
|
||||
.mini-card strong,
|
||||
.mini-card small {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.mini-card small {
|
||||
color: var(--muted);
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.section {
|
||||
padding: 40px 7vw;
|
||||
padding: 52px 6vw;
|
||||
}
|
||||
|
||||
.section.narrow {
|
||||
max-width: 1040px;
|
||||
}
|
||||
|
||||
.section-heading {
|
||||
margin-bottom: 26px;
|
||||
}
|
||||
|
||||
.section h2 {
|
||||
font-size: clamp(2rem, 4vw, 3.4rem);
|
||||
line-height: 1.05;
|
||||
margin: 12px 0 14px;
|
||||
letter-spacing: -0.04em;
|
||||
}
|
||||
|
||||
.grid {
|
||||
@@ -100,21 +304,74 @@ nav a:hover {
|
||||
}
|
||||
|
||||
.card {
|
||||
background: rgba(17, 24, 39, 0.82);
|
||||
border: 1px solid rgba(148, 163, 184, 0.18);
|
||||
border-radius: 22px;
|
||||
padding: 24px;
|
||||
transition: transform 180ms ease, border-color 180ms ease, background 180ms ease;
|
||||
}
|
||||
|
||||
.card h3 {
|
||||
.card:hover {
|
||||
transform: translateY(-4px);
|
||||
border-color: rgba(56, 189, 248, 0.45);
|
||||
background: rgba(15, 23, 42, 0.92);
|
||||
}
|
||||
|
||||
.card h3,
|
||||
.card h2 {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.site-footer {
|
||||
padding: 40px 7vw;
|
||||
.card p {
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.feature-icon {
|
||||
font-size: 2rem;
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
|
||||
.feature-icon.large {
|
||||
font-size: 4rem;
|
||||
}
|
||||
|
||||
.content-card {
|
||||
max-width: 980px;
|
||||
}
|
||||
|
||||
.tag-list {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.tag-list span {
|
||||
padding: 7px 11px;
|
||||
border-radius: 999px;
|
||||
color: var(--muted);
|
||||
background: rgba(15, 23, 42, 0.85);
|
||||
border: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.download-card {
|
||||
min-height: 220px;
|
||||
}
|
||||
|
||||
.screenshot-placeholder {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
min-height: 180px;
|
||||
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);
|
||||
border: 1px solid var(--border);
|
||||
color: white;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.cta-panel {
|
||||
padding: clamp(28px, 5vw, 60px);
|
||||
}
|
||||
|
||||
.manual-content {
|
||||
max-width: 980px;
|
||||
}
|
||||
@@ -149,19 +406,23 @@ nav a:hover {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.eyebrow {
|
||||
color: var(--accent2);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.08em;
|
||||
font-size: 0.78rem;
|
||||
font-weight: 800;
|
||||
.site-footer {
|
||||
padding: 42px 6vw;
|
||||
color: var(--muted);
|
||||
border-top: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.feature-icon {
|
||||
font-size: 2rem;
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
@media (max-width: 900px) {
|
||||
.hero-split {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.feature-icon.large {
|
||||
font-size: 3.5rem;
|
||||
.hero-panel {
|
||||
transform: none;
|
||||
}
|
||||
|
||||
.site-header {
|
||||
align-items: flex-start;
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
@@ -5,14 +5,28 @@ description: Download KST4Contest releases for Windows, Linux and macOS.
|
||||
---
|
||||
|
||||
<section class="hero">
|
||||
<h1>Download KST4Contest</h1>
|
||||
<p>
|
||||
Official builds are published through GitHub Releases for Windows, Linux
|
||||
and macOS.
|
||||
<p class="badge">Download</p>
|
||||
<h1>Get KST4Contest</h1>
|
||||
<p class="lead">
|
||||
Official builds are published through GitHub Releases for Windows, Linux and macOS.
|
||||
</p>
|
||||
|
||||
<div class="actions">
|
||||
<a class="button" href="https://github.com/praktimarc/kst4contest/releases/latest">Latest Release</a>
|
||||
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases">All Releases</a>
|
||||
<a class="button" href="https://github.com/praktimarc/kst4contest/releases/latest">Latest release</a>
|
||||
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases">All releases</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="section">
|
||||
<div class="grid">
|
||||
{% for item in downloads %}
|
||||
<article class="card download-card">
|
||||
<div class="feature-icon">{{ item.icon }}</div>
|
||||
{% if item.recommended %}<p class="badge">Recommended</p>{% endif %}
|
||||
<h3>{{ item.os }}</h3>
|
||||
<p>{{ item.format }}</p>
|
||||
<a href="{{ item.url }}">Open download →</a>
|
||||
</article>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
@@ -10,13 +10,13 @@ description: "{{ feature.summary }}"
|
||||
---
|
||||
|
||||
<section class="hero">
|
||||
<p class="eyebrow">{{ feature.category }}</p>
|
||||
<p class="badge">{{ feature.category }} · since {{ feature.since }}</p>
|
||||
<h1>{{ feature.title }}</h1>
|
||||
<p>{{ feature.summary }}</p>
|
||||
<p class="lead">{{ feature.summary }}</p>
|
||||
</section>
|
||||
|
||||
<section class="section">
|
||||
<div class="card">
|
||||
<section class="section narrow">
|
||||
<article class="card content-card">
|
||||
<div class="feature-icon large">{{ feature.icon }}</div>
|
||||
|
||||
<h2>Why it matters</h2>
|
||||
@@ -24,11 +24,22 @@ description: "{{ feature.summary }}"
|
||||
|
||||
<h2>Built for contest operation</h2>
|
||||
<p>
|
||||
This feature is designed for real VHF, UHF and SHF contest workflows,
|
||||
where speed, awareness and correct operator decisions matter.
|
||||
This feature supports real VHF, UHF and SHF contest workflows where timing,
|
||||
awareness and fast decisions matter. It is part of the broader KST4Contest
|
||||
approach: ON4KST chat should not just be displayed, it should actively support
|
||||
contest operation.
|
||||
</p>
|
||||
|
||||
{% if feature.related and feature.related.length %}
|
||||
{% if feature.tags %}
|
||||
<h2>Keywords</h2>
|
||||
<div class="tag-list">
|
||||
{% for tag in feature.tags %}
|
||||
<span>{{ tag }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if feature.related %}
|
||||
<h2>Related features</h2>
|
||||
<div class="actions">
|
||||
{% for slug in feature.related %}
|
||||
@@ -40,5 +51,5 @@ description: "{{ feature.summary }}"
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</article>
|
||||
</section>
|
||||
@@ -5,8 +5,9 @@ description: Contest-optimized ON4KST features for VHF, UHF and SHF operation.
|
||||
---
|
||||
|
||||
<section class="hero">
|
||||
<h1>Features built for serious VHF/UHF/SHF contest operation.</h1>
|
||||
<p>
|
||||
<p class="badge">Features</p>
|
||||
<h1>Contest tools, not just chat windows.</h1>
|
||||
<p class="lead">
|
||||
KST4Contest combines ON4KST chat, candidate scoring, AirScout workflow,
|
||||
sked handling, log synchronization and operator decision support.
|
||||
</p>
|
||||
@@ -15,7 +16,7 @@ description: Contest-optimized ON4KST features for VHF, UHF and SHF operation.
|
||||
<section class="section">
|
||||
<div class="grid">
|
||||
{% for feature in features %}
|
||||
<article class="card">
|
||||
<article class="card feature-card">
|
||||
<div class="feature-icon">{{ feature.icon }}</div>
|
||||
<p class="eyebrow">{{ feature.category }}</p>
|
||||
<h3><a href="/features/{{ feature.slug }}/">{{ feature.title }}</a></h3>
|
||||
|
||||
+51
-105
@@ -4,128 +4,74 @@ title: KST4Contest – Contest-Optimized ON4KST Chat Client
|
||||
description: KST4Contest is a modern ON4KST chat client built for VHF, UHF and SHF contest operation.
|
||||
---
|
||||
|
||||
<section class="hero">
|
||||
|
||||
<p class="eyebrow">The contest-optimized ON4KST client</p>
|
||||
|
||||
<section class="hero hero-split">
|
||||
<div>
|
||||
<p class="badge">The contest-optimized ON4KST client</p>
|
||||
<h1>KST4Contest</h1>
|
||||
|
||||
<p>
|
||||
Work smarter. Make more QSOs.
|
||||
Built for serious VHF, UHF and SHF contest operators.
|
||||
<p class="lead">
|
||||
Work smarter. Make more QSOs. KST4Contest brings priority candidates,
|
||||
AirScout workflow, sked reminders, dual chat categories and log synchronization
|
||||
into one contest-focused ON4KST client.
|
||||
</p>
|
||||
|
||||
<div class="actions">
|
||||
<a class="button"
|
||||
href="https://github.com/praktimarc/kst4contest/releases/latest">
|
||||
Download latest release
|
||||
</a>
|
||||
|
||||
<a class="button secondary"
|
||||
href="https://github.com/praktimarc/kst4contest">
|
||||
GitHub
|
||||
</a>
|
||||
|
||||
<a class="button secondary"
|
||||
href="/manual/">
|
||||
Documentation
|
||||
</a>
|
||||
<a class="button" href="https://github.com/praktimarc/kst4contest/releases/latest">Download latest release</a>
|
||||
<a class="button secondary" href="https://github.com/praktimarc/kst4contest">View on GitHub</a>
|
||||
<a class="button ghost" href="/manual/">Read manual</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hero-panel">
|
||||
<div class="terminal-bar">
|
||||
<span></span><span></span><span></span>
|
||||
<strong>KST4Contest workflow</strong>
|
||||
</div>
|
||||
<div class="mock-grid">
|
||||
{% for feature in features | slice(0, 6) %}
|
||||
<div class="mini-card">
|
||||
<strong>{{ feature.icon }} {{ feature.title }}</strong>
|
||||
<small>{{ feature.summary }}</small>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<section class="section">
|
||||
<div class="section-heading">
|
||||
<p class="eyebrow">Powerful features</p>
|
||||
<h2>Everything you need for contest success</h2>
|
||||
<p>Every feature is designed to reduce operator workload and improve decision speed during real contest operation.</p>
|
||||
</div>
|
||||
|
||||
<p class="eyebrow">
|
||||
Powerful Features
|
||||
</p>
|
||||
|
||||
<h2>
|
||||
Everything you need for contest success
|
||||
</h2>
|
||||
|
||||
<div class="grid">
|
||||
|
||||
{% for feature in features %}
|
||||
|
||||
<article class="card">
|
||||
|
||||
<div class="feature-icon">
|
||||
{{ feature.icon }}
|
||||
</div>
|
||||
|
||||
<p class="eyebrow">
|
||||
{{ feature.category }}
|
||||
</p>
|
||||
|
||||
<h3>
|
||||
<a href="/features/{{ feature.slug }}/">
|
||||
{{ feature.title }}
|
||||
</a>
|
||||
</h3>
|
||||
|
||||
<p>
|
||||
{{ feature.summary }}
|
||||
</p>
|
||||
|
||||
<a href="/features/{{ feature.slug }}/">
|
||||
Learn more →
|
||||
</a>
|
||||
|
||||
</article>
|
||||
|
||||
{% endfor %}
|
||||
|
||||
</div>
|
||||
|
||||
<div class="grid">
|
||||
{% for feature in features %}
|
||||
<article class="card feature-card">
|
||||
<div class="feature-icon">{{ feature.icon }}</div>
|
||||
<p class="eyebrow">{{ feature.category }}</p>
|
||||
<h3><a href="/features/{{ feature.slug }}/">{{ feature.title }}</a></h3>
|
||||
<p>{{ feature.summary }}</p>
|
||||
<a href="/features/{{ feature.slug }}/">Learn more →</a>
|
||||
</article>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<section class="section">
|
||||
|
||||
<p class="eyebrow">
|
||||
Why KST4Contest?
|
||||
<div class="cta-panel">
|
||||
<p class="eyebrow">Open Source</p>
|
||||
<h2>Built by contesters for contesters.</h2>
|
||||
<p>
|
||||
KST4Contest is developed around real VHF/UHF/SHF contest workflows:
|
||||
ON4KST chat, aircraft scatter, skeds, logging and fast operator decisions.
|
||||
</p>
|
||||
|
||||
<h2>
|
||||
Built by contesters for contesters.
|
||||
</h2>
|
||||
|
||||
<div class="grid">
|
||||
|
||||
<div class="card">
|
||||
<h3>Contest Workflow</h3>
|
||||
|
||||
<p>
|
||||
Unlike traditional ON4KST clients, KST4Contest focuses on
|
||||
operator workflow instead of simply displaying chat messages.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h3>Decision Support</h3>
|
||||
|
||||
<p>
|
||||
Priority candidates, activity detection, AirScout integration,
|
||||
timeline and sked reminders help operators make better decisions.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h3>Open Source</h3>
|
||||
|
||||
<p>
|
||||
KST4Contest is open source and continuously developed together
|
||||
with the amateur radio contest community.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<a class="button" href="/download/">Download KST4Contest</a>
|
||||
<a class="button secondary" href="/features/">Explore features</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context":"https://schema.org",
|
||||
|
||||
@@ -5,8 +5,9 @@ description: Screenshots of KST4Contest, the contest-optimized ON4KST chat clien
|
||||
---
|
||||
|
||||
<section class="hero">
|
||||
<h1>Screenshots</h1>
|
||||
<p>
|
||||
<p class="badge">Screenshots</p>
|
||||
<h1>See the contest workflow.</h1>
|
||||
<p class="lead">
|
||||
Visual impressions of KST4Contest: ON4KST chat workflow, priority candidates,
|
||||
sked handling, AirScout integration and contest-focused operator tools.
|
||||
</p>
|
||||
@@ -14,19 +15,14 @@ description: Screenshots of KST4Contest, the contest-optimized ON4KST chat clien
|
||||
|
||||
<section class="section">
|
||||
<div class="grid">
|
||||
<div class="card">
|
||||
<h3>Main Window</h3>
|
||||
<p>ON4KST chat workflow with contest-oriented controls.</p>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h3>Priority Candidates</h3>
|
||||
<p>Candidate ranking for faster operator decisions.</p>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h3>AirScout / AP Timeline</h3>
|
||||
<p>Aircraft scatter timing support for VHF/UHF/SHF operation.</p>
|
||||
</div>
|
||||
{% for shot in screenshots %}
|
||||
<article class="card screenshot-card">
|
||||
<div class="screenshot-placeholder">
|
||||
<span>{{ shot.title }}</span>
|
||||
</div>
|
||||
<h3>{{ shot.title }}</h3>
|
||||
<p>{{ shot.caption }}</p>
|
||||
</article>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
Reference in New Issue
Block a user