reduced site complexity

This commit is contained in:
Frank Harris 2026-06-17 18:38:40 -05:00
parent 3948dde2e7
commit 325feb7f25
6 changed files with 138 additions and 281 deletions

View file

@ -86,6 +86,22 @@ The website uses a central bootstrap instead of scattered relative paths.
- `website_order_url(1)`
- `documentation_url('minecraft')`
## Navigation and homepage
The shared header keeps the main navigation short:
- Home
- Game Servers
- Documentation
- Support
- Account/Login
- Custom Projects
- Control Panel
Pricing and locations pages can remain available through the footer or direct
links, but the public homepage carries concise pricing and location summaries so
the desktop and mobile menus stay focused.
## Billing, database, and staff behavior
The public site does not include `Panel/modules/billing/includes/config.inc.php` directly.

View file

@ -89,7 +89,7 @@ textarea {
.header-shell {
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
grid-template-columns: auto minmax(0, 1fr);
align-items: center;
gap: 18px;
min-height: 76px;
@ -132,7 +132,7 @@ textarea {
display: flex;
flex-wrap: nowrap;
align-items: center;
justify-content: center;
justify-content: flex-end;
gap: 6px;
min-width: 0;
}
@ -150,6 +150,29 @@ textarea {
background: var(--accent-soft);
}
.nav-action-secondary,
.nav-action-primary {
border: 1px solid var(--line-strong);
color: var(--text);
}
.nav-action-primary {
background: linear-gradient(180deg, #58abff 0%, #3589e8 100%);
border-color: transparent;
color: #051120;
font-weight: 700;
}
.nav-action-secondary:hover {
border-color: rgba(143, 174, 214, 0.42);
}
.nav-action-primary:hover,
.nav-action-primary.is-active {
color: #051120;
background: linear-gradient(180deg, #7bc0ff 0%, #4c9bf0 100%);
}
.account-menu {
position: relative;
}
@ -204,13 +227,6 @@ textarea {
background: var(--accent-soft);
}
.header-actions {
display: flex;
gap: 8px;
align-items: center;
flex-wrap: nowrap;
}
.button {
display: inline-flex;
align-items: center;
@ -428,6 +444,10 @@ textarea {
grid-template-columns: repeat(4, minmax(0, 1fr));
}
.feature-grid-three {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.location-grid,
.service-grid,
.support-grid,
@ -505,6 +525,37 @@ textarea {
background: #08111f;
}
.service-grid-compact {
margin-top: 22px;
}
.tag-list {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.tag-list span {
display: inline-flex;
align-items: center;
min-height: 40px;
padding: 8px 12px;
border: 1px solid var(--line);
border-radius: 999px;
background: rgba(84, 166, 255, 0.1);
color: #cbe1ff;
font-weight: 700;
}
.tag-list-small {
margin: 14px 0;
}
.tag-list-small span {
min-height: 36px;
font-size: 0.9rem;
}
.service-card header,
.doc-card header {
margin-bottom: 10px;
@ -751,26 +802,6 @@ textarea {
}
@media (max-width: 1080px) {
.header-shell {
grid-template-columns: 1fr;
justify-items: center;
padding: 12px 0;
}
.brand {
justify-self: center;
}
.primary-nav {
width: 100%;
flex-wrap: wrap;
row-gap: 8px;
}
.header-actions {
justify-content: center;
}
.hero-layout,
.panel-preview,
.footer-grid {
@ -778,7 +809,8 @@ textarea {
}
.stats-grid,
.feature-grid {
.feature-grid,
.feature-grid-three {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
@ -803,13 +835,11 @@ textarea {
justify-self: end;
}
.primary-nav,
.header-actions {
.primary-nav {
display: none;
}
.primary-nav.is-open,
.header-actions.is-open {
.primary-nav.is-open {
display: flex;
}
@ -858,19 +888,10 @@ textarea {
min-height: 42px;
}
.header-actions {
grid-column: 1 / -1;
display: none;
flex-direction: column;
margin-top: 6px;
}
.header-actions.is-open {
display: flex;
}
.header-actions .button {
width: 100%;
.nav-action-secondary,
.nav-action-primary {
justify-content: center;
margin-top: 4px;
}
.hero,
@ -887,6 +908,7 @@ textarea {
.hero-points,
.stats-grid,
.feature-grid,
.feature-grid-three,
.location-grid,
.service-grid,
.support-grid,

View file

@ -1,7 +1,6 @@
document.addEventListener('DOMContentLoaded', () => {
const toggle = document.querySelector('[data-nav-toggle]');
const menu = document.querySelector('[data-nav-menu]');
const actions = document.querySelector('[data-header-actions]');
const accountMenu = document.querySelector('[data-account-menu]');
if (!toggle || !menu) {
@ -12,9 +11,6 @@ document.addEventListener('DOMContentLoaded', () => {
const expanded = toggle.getAttribute('aria-expanded') === 'true';
toggle.setAttribute('aria-expanded', expanded ? 'false' : 'true');
menu.classList.toggle('is-open', !expanded);
if (actions) {
actions.classList.toggle('is-open', !expanded);
}
if (accountMenu && window.matchMedia('(max-width: 820px)').matches) {
accountMenu.open = !expanded;
}

View file

@ -8,8 +8,6 @@ $cartCount = website_cart_count();
$primaryLinks = [
['key' => 'home', 'label' => 'Home', 'href' => website_url('index.php')],
['key' => 'servers', 'label' => 'Game Servers', 'href' => website_url('serverlist.php')],
['key' => 'pricing', 'label' => 'Pricing', 'href' => website_url('pricing.php')],
['key' => 'locations', 'label' => 'Locations', 'href' => website_url('locations.php')],
['key' => 'docs', 'label' => 'Documentation', 'href' => website_url('docs.php')],
['key' => 'support', 'label' => 'Support', 'href' => website_url('support.php')],
];
@ -69,11 +67,8 @@ $accountIsActive = in_array($activePage, $accountActiveKeys, true);
<?php endforeach; ?>
</div>
</details>
<a class="nav-link nav-action-secondary" href="<?= website_escape(website_custom_project_url()) ?>">Custom Projects</a>
<a class="nav-link nav-action-primary" href="<?= website_escape(website_control_panel_url()) ?>">Control Panel</a>
</nav>
<div class="header-actions" data-header-actions>
<a class="button button-secondary" href="<?= website_escape(website_custom_project_url()) ?>">Custom Projects</a>
<a class="button button-primary" href="<?= website_escape(website_control_panel_url()) ?>">Control Panel</a>
</div>
</div>
</header>

View file

@ -9,107 +9,53 @@ $platform = website_config('platform', []);
$standardSlotStart = (float)($pricing['standard_slot_start'] ?? 0.50);
$legacyMonthlyStart = (float)($pricing['legacy_monthly_start'] ?? 4.00);
$standardMinSlots = (int)($pricing['standard_min_slots'] ?? 16);
$pricingDisclaimer = trim((string)($pricing['disclaimer'] ?? ''));
$customWorkNote = trim((string)($pricing['custom_work_note'] ?? ''));
$fixedCapNote = trim((string)($pricing['fixed_cap_note'] ?? ''));
$platformSummary = trim((string)($platform['summary'] ?? ''));
$platformCapacityNote = trim((string)($platform['capacity_note'] ?? ''));
$platformExampleCpu = (int)($platform['example_host_cpu_cores'] ?? 32);
$platformExampleRam = (int)($platform['example_host_ram_gb'] ?? 128);
$platformExampleStorage = trim((string)($platform['example_host_storage'] ?? '2 TB SSD storage'));
$platformBackupNote = trim((string)($platform['daily_backups_note'] ?? ''));
$pricingDisclaimer = trim((string)($pricing['disclaimer'] ?? 'Actual prices are reflected on each server order page.'));
$customWorkNote = trim((string)($pricing['custom_work_note'] ?? 'Custom development and complex integration work are quoted separately.'));
$fixedCapNote = trim((string)($pricing['fixed_cap_note'] ?? 'Some fixed-cap or small co-op games use different slot limits.'));
$platformCapacityNote = trim((string)($platform['capacity_note'] ?? 'We actively monitor host capacity and avoid overcrowding servers onto overloaded machines.'));
$popularGames = ['Arma 3', 'DayZ', 'CS 1.6', 'TF2', 'Garry\'s Mod', 'Rust', 'Valheim'];
$locationSummary = ['USA East', 'USA Central', 'USA West', 'Europe'];
?>
<section class="hero">
<div class="container hero-layout">
<div>
<div class="eyebrow">Game hosting backed by developers</div>
<h1>Game Hosting Backed by Developers</h1>
<p>Launch a standard server for a modern or legacy game, or work with the team behind Runlevel Systems to customize mods, scripts, integrations, automation, and server workflows around your community.</p>
<p>Launch a standard server for a modern or legacy game, or work with Runlevel Systems developers when your community needs mods, automation, integrations, or a setup that does not fit a stock template.</p>
<div class="hero-actions">
<a class="button button-primary" href="<?= website_escape(website_url('serverlist.php')) ?>">View Game Servers</a>
<a class="button button-secondary" href="<?= website_escape($customProjectUrl) ?>">Discuss a Custom Server</a>
<a class="button button-ghost" href="<?= website_escape(website_control_panel_url()) ?>">Open Control Panel</a>
</div>
<div class="hero-points">
<div class="hero-point">
<strong>Fair starting prices</strong>
<span class="muted">Standard servers start at $<?= website_escape(number_format($standardSlotStart, 2)) ?> per slot, while selected lightweight legacy servers can start around $<?= website_escape(number_format($legacyMonthlyStart, 2)) ?> per month.</span>
</div>
<div class="hero-point">
<strong>Never-oversold capacity</strong>
<span class="muted"><?= website_escape($platformCapacityNote !== '' ? $platformCapacityNote : 'Host systems are actively monitored so customers are not crowded onto overloaded nodes.') ?></span>
</div>
<div class="hero-point">
<strong>Real engineering help</strong>
<span class="muted">Developers, software engineers, game developers, and infrastructure specialists are available when a server needs more than a restart button.</span>
</div>
<div class="hero-point">
<strong>Legacy games welcome</strong>
<span class="muted">We still host classic and community-maintained multiplayer games that larger providers often overlook, including older Windows and Linux dedicated servers.</span>
</div>
</div>
</div>
<div class="hero-visual">
<img src="<?= website_escape(website_asset('images/banner.png')) ?>" alt="Gameservers.World supported games collage">
<div class="hero-visual-card">
<strong>More than hosting</strong>
<p>Gameservers.World hosts the server. Runlevel Systems provides the development, integration, and infrastructure expertise behind it, including custom workflows when a community needs more than a stock setup.</p>
<strong>We host it. We can help build it.</strong>
<p>Standard hosting is available, and unusual server requirements can be reviewed with developers and infrastructure specialists.</p>
</div>
</div>
</div>
</section>
<section class="section">
<div class="container">
<div class="summary-grid">
<article class="summary-card">
<h3>Legacy Games Welcome</h3>
<p>Older multiplayer communities should not have to disappear because larger hosts stopped supporting their game. Selected legacy servers can start around $<?= website_escape(number_format($legacyMonthlyStart, 2)) ?> per month.</p>
<ul class="list-clean">
<li>Classic FPS and older multiplayer titles</li>
<li>Small private communities and fixed-cap servers</li>
<li>Older Windows and Linux server software</li>
<li>Mod, configuration, and migration help</li>
</ul>
<div class="card-actions">
<a class="button button-primary" href="<?= website_escape(website_url('serverlist.php')) ?>">Browse Game Servers</a>
<a class="button button-secondary" href="<?= website_escape($customProjectUrl) ?>">Ask About an Older Game</a>
</div>
</article>
<article class="summary-card">
<h3>Straightforward Starting Prices</h3>
<p>Standard game servers start at $<?= website_escape(number_format($standardSlotStart, 2)) ?> per slot, and most standard plans use a <?= website_escape((string)$standardMinSlots) ?>-slot minimum.</p>
<p><?= website_escape($fixedCapNote) ?></p>
<p><?= website_escape($pricingDisclaimer) ?></p>
<p><?= website_escape($customWorkNote) ?></p>
</article>
</div>
</div>
</section>
<section class="section">
<div class="container">
<div class="section-heading">
<div class="kicker">More than hosting</div>
<h2>Gameservers.World can host a standard server or help build something more specific.</h2>
<p>Some customers want a clean server with good support and full access. Others need custom scripts, mod workflows, database connections, Discord integrations, migration help, or tools built around a long-running community. Both use cases belong here.</p>
<div class="kicker">Why use us</div>
<h2>Focused hosting for communities that want control.</h2>
</div>
<div class="feature-grid">
<div class="feature-grid feature-grid-three">
<article class="feature-card">
<h3>Developer-backed hosting</h3>
<p>Runlevel Systems brings development and engineering experience behind the hosting service, not just sales copy and a billing page.</p>
<p>Gameservers.World is backed by Runlevel Systems engineers who understand game servers, automation, mods, infrastructure, and custom tools.</p>
</article>
<article class="feature-card">
<h3>Custom server builds</h3>
<p>Individual servers can be configured around startup parameters, file layouts, admin tooling, automation, legacy game quirks, or game-specific operational requirements.</p>
<h3>Legacy games welcome</h3>
<p>Older multiplayer communities and community-maintained games are still worth hosting, especially when they need careful setup or migration help.</p>
</article>
<article class="feature-card">
<h3>Mod and Workshop integration</h3>
<p>Supported games can use GSP content workflows, dedicated Workshop support, and hands-on help with mod setup or compatibility issues.</p>
</article>
<article class="feature-card">
<h3>Infrastructure expertise</h3>
<p>Linux, Windows Server, databases, networking, logs, backups, monitoring, and deployment are part of the same practical support surface.</p>
<h3>Never-oversold capacity</h3>
<p><?= website_escape($platformCapacityNote) ?></p>
</article>
</div>
</div>
@ -118,97 +64,18 @@ $platformBackupNote = trim((string)($platform['daily_backups_note'] ?? ''));
<section class="section">
<div class="container">
<div class="section-heading">
<div class="kicker">What we can build</div>
<h2>Custom work can extend the server beyond the control panel.</h2>
<p>Tell us what you want your server to do. We will review the game, its tools, and the technical limits, then help design a practical solution. Not every request is possible, but unusual requests do not get dismissed out of hand.</p>
<div class="kicker">Legacy and popular servers</div>
<h2>Current, classic, and community favorites can fit here.</h2>
<p>We support standard game hosting while also helping communities keep older multiplayer titles alive.</p>
</div>
<div class="feature-grid">
<article class="feature-card">
<h3>Server scripts and automation</h3>
<p>Startup and update automation, scheduled workflows, restart logic, migration helpers, and practical server-side tooling.</p>
</article>
<article class="feature-card">
<h3>Mods, maps, and content</h3>
<p>Mod configuration, Workshop collections, custom maps, custom content packaging, and community-specific content workflows.</p>
</article>
<article class="feature-card">
<h3>Integrations and data</h3>
<p>APIs, web dashboards, Discord integrations, external applications, databases, launchers, and admin utilities.</p>
</article>
<article class="feature-card">
<h3>GSP extensions</h3>
<p>Custom GSP modules, game-specific fixes, monitoring workflows, and operational improvements when a project needs more than the default panel path.</p>
</article>
<div class="tag-list" aria-label="Example supported game server types">
<?php foreach ($popularGames as $game): ?>
<span><?= website_escape($game) ?></span>
<?php endforeach; ?>
</div>
</div>
</section>
<section class="section">
<div class="container">
<div class="cta-panel cta-panel-inline">
<div>
<div class="kicker">Runlevel Systems</div>
<h2>Need More Than Standard Hosting?</h2>
<p>Gameservers.World is backed by Runlevel Systems developers. We can help customize your server with mods, scripts, integrations, automation, migrations, and features built around your community.</p>
<p>We host the server. We can also help build what runs on it.</p>
</div>
<div class="stack-actions">
<a class="button button-primary" href="<?= website_escape($customProjectUrl) ?>">Request Custom Development</a>
<a class="button button-secondary" href="<?= website_escape(website_url('support.php')) ?>">Support and Troubleshooting</a>
</div>
</div>
</div>
</section>
<section class="section">
<div class="container">
<div class="section-heading">
<div class="kicker">Hosting platform</div>
<h2>Stable hosting without overcrowded nodes.</h2>
<p><?= website_escape($platformSummary !== '' ? $platformSummary : 'Hosted on modern server hardware with SSD storage, high-bandwidth connectivity, and actively monitored CPU and memory capacity.') ?></p>
</div>
<div class="summary-grid">
<article class="summary-card">
<h3>Real server access</h3>
<p>Edit files and configurations, adjust startup parameters, manage supported server content, review logs, and run updates or scheduled tasks through GSP.</p>
</article>
<article class="summary-card">
<h3>Platform note</h3>
<p>Example host: <?= website_escape((string)$platformExampleCpu) ?> CPU cores, <?= website_escape((string)$platformExampleRam) ?> GB RAM, and <?= website_escape($platformExampleStorage) ?>. <?= website_escape($platformBackupNote) ?></p>
</article>
</div>
</div>
</section>
<section class="section">
<div class="container">
<div class="section-heading">
<div class="kicker">Modding and game development support</div>
<h2>Support for current, older, and community-maintained games.</h2>
<p>Some communities need help with abandoned dedicated-server software, badly documented mod stacks, or workflows that mix game servers, websites, databases, and custom scripts. That is where developer-backed hosting matters.</p>
</div>
<div class="summary-grid">
<article class="summary-card">
<h3>What we understand</h3>
<p>Game development, mod development, PHP, Perl, C#, Unity, Linux, Windows Server, networking, databases, SteamCMD, Steam Workshop, dedicated-server software, automation, deployment, and troubleshooting.</p>
</article>
<article class="summary-card">
<h3>How we approach unusual requests</h3>
<p>We host standard servers every day, but we also help revive older multiplayer titles, evaluate unsupported configurations, and scope custom work when a community needs something more specific.</p>
</article>
</div>
</div>
</section>
<section class="section">
<div class="container">
<div class="section-heading">
<div class="kicker">Supported games and locations</div>
<h2>Live catalog where available, honest fallback where it is not.</h2>
<p>Available games and live catalog prices come from the active service catalog when configuration is available. Public starting-price guidance stays concise so the site does not invent fake availability or publish stale game lists just to fill space.</p>
</div>
<?php if (!empty($services)): ?>
<div class="service-grid">
<div class="service-grid service-grid-compact">
<?php foreach ($services as $service): ?>
<?php
$serviceName = trim((string)($service['cfg_game_name'] ?? $service['service_name'] ?? 'Game Server'));
@ -219,9 +86,8 @@ $platformBackupNote = trim((string)($platform['daily_backups_note'] ?? ''));
<img src="<?= website_escape(website_service_image_url((string)($service['img_url'] ?? ''))) ?>" alt="<?= website_escape($serviceName) ?>">
<header>
<h3><?= website_escape($serviceName) ?></h3>
<div class="service-price"><?= $price > 0 ? '$' . number_format($price, 2) . ' / month' : 'Contact for pricing' ?></div>
<div class="service-price"><?= $price > 0 ? '$' . number_format($price, 2) . ' / month' : 'See order page' ?></div>
</header>
<p><?= website_escape(trim((string)($service['description'] ?? 'Virtual private hosting with full configuration access, real support, and optional customization help.')) ?: 'Virtual private hosting with full configuration access, real support, and optional customization help.') ?></p>
<div class="card-actions">
<a class="button button-primary" href="<?= website_escape($orderUrl) ?>">Order</a>
<a class="button button-ghost" href="<?= website_escape(website_url('serverlist.php')) ?>">Catalog</a>
@ -229,34 +95,33 @@ $platformBackupNote = trim((string)($platform['daily_backups_note'] ?? ''));
</article>
<?php endforeach; ?>
</div>
<?php else: ?>
<div class="empty-state">
<h3>Current game catalog unavailable</h3>
<p><?= website_escape((string)website_config('admin_notice')) ?></p>
<div class="card-actions">
<a class="button button-secondary" href="<?= website_escape(website_url('support.php')) ?>">Contact Support</a>
<a class="button button-ghost" href="<?= website_escape(website_url('docs.php')) ?>">Read Documentation</a>
</div>
</div>
<?php endif; ?>
</div>
</section>
<section class="section">
<div class="container">
<div class="section-heading">
<div class="kicker">Real support</div>
<h2>Talk to people who understand what is under the hood.</h2>
<p>Support is not limited to “restart it and send a ticket. Customers can get help with setup, configuration, mods, Workshop, performance troubleshooting, automation questions, and practical recovery from bad changes.</p>
</div>
<div class="summary-grid">
<article class="summary-card">
<h3>Ordinary hosting is available</h3>
<p>Order a standard server, use the panel, and get practical support without being forced into a custom project. Most standard plans start with a <?= website_escape((string)$standardMinSlots) ?>-slot baseline, while some smaller or fixed-cap games differ.</p>
<div class="kicker">Pricing summary</div>
<h3>Prices belong on the order page.</h3>
<p>Actual prices are reflected on each server order page. Standard slot-based servers start at $<?= website_escape(number_format($standardSlotStart, 2)) ?> per slot, and most standard plans use a <?= website_escape((string)$standardMinSlots) ?>-slot minimum.</p>
<p>Selected lightweight legacy servers may start around $<?= website_escape(number_format($legacyMonthlyStart, 2)) ?> per month. <?= website_escape($fixedCapNote) ?></p>
<p><?= website_escape($pricingDisclaimer) ?> <?= website_escape($customWorkNote) ?></p>
<div class="card-actions">
<a class="button button-primary" href="<?= website_escape(website_url('serverlist.php')) ?>">View Game Servers</a>
</div>
</article>
<article class="summary-card">
<h3>Custom help is available too</h3>
<p>If you need scripts, integrations, workflow changes, or development help, we can scope that separately and quote it before work begins.</p>
<div class="kicker">Locations summary</div>
<h3>Regional hosting options.</h3>
<p>Locations are summarized here so visitors can get oriented without another sales page.</p>
<div class="tag-list tag-list-small" aria-label="Hosting region summary">
<?php foreach ($locationSummary as $locationName): ?>
<span><?= website_escape($locationName) ?></span>
<?php endforeach; ?>
</div>
<p>Final availability depends on the selected game, resource needs, and current capacity.</p>
</article>
</div>
</div>
@ -270,12 +135,9 @@ $platformBackupNote = trim((string)($platform['daily_backups_note'] ?? ''));
</div>
<div class="panel-preview-stats">
<div class="section-heading">
<h2>GSP control panel</h2>
<p>Start, stop, and restart servers. Edit files and configurations. Review logs. Install supported content. Manage Workshop workflows where the game allows it. Schedule tasks, run updates, work with backups, and monitor server state from one place.</p>
</div>
<div class="summary-card">
<h3>Built by the same team</h3>
<p>GSP itself is developed and customized by the same engineering team, which means new workflows or modules can be evaluated when a project calls for them.</p>
<div class="kicker">GSP control</div>
<h2>Manage servers through the GSP control panel.</h2>
<p>Start, stop, and restart servers. Edit configuration files, review logs, run supported content workflows, schedule tasks, and manage operational work from the panel.</p>
</div>
<div class="stack-actions">
<a class="button button-primary" href="<?= website_escape(website_control_panel_url()) ?>">Open Control Panel</a>
@ -286,43 +148,6 @@ $platformBackupNote = trim((string)($platform['daily_backups_note'] ?? ''));
</div>
</section>
<section class="section">
<div class="container">
<div class="section-heading">
<div class="kicker">How custom work operates</div>
<h2>Simple process, scoped before work begins.</h2>
<p>Custom coding and integration work is quoted separately, but the goal is practical, reasonable pricing rather than inflated enterprise consulting rates. No custom work starts without agreement on scope and cost.</p>
</div>
<div class="flow-grid">
<article class="flow-step">
<span class="flow-step-number">1</span>
<h3>Tell us what you want</h3>
<p>Explain the server, the game, the community, and what you want it to do differently.</p>
</article>
<article class="flow-step">
<span class="flow-step-number">2</span>
<h3>We evaluate the limits</h3>
<p>We review the game, its tools, the operating requirements, and what is practical to build or integrate.</p>
</article>
<article class="flow-step">
<span class="flow-step-number">3</span>
<h3>We scope and price it</h3>
<p>Custom coding, integration, or engineering work is discussed up front before any build work begins.</p>
</article>
<article class="flow-step">
<span class="flow-step-number">4</span>
<h3>We build and deploy</h3>
<p>Once approved, we implement, test, and help deploy the agreed changes.</p>
</article>
<article class="flow-step">
<span class="flow-step-number">5</span>
<h3>We maintain if needed</h3>
<p>Ongoing help can be discussed for communities that need support beyond the initial delivery.</p>
</article>
</div>
</div>
</section>
<section class="cta-band">
<div class="container">
<div class="cta-panel">

View file

@ -79,9 +79,12 @@ Website footer account links are state-aware:
The shared header uses one responsive navigation bar:
- primary links: Home, Game Servers, Pricing, Locations, Documentation, Support
- primary links: Home, Game Servers, Documentation, Support
- account menu: Login/Create Account/Cart or My Account/My Orders/My Servers/Cart/Staff Dashboard/Logout
- action buttons: Custom Projects and Control Panel
- action links: Custom Projects and Control Panel
Pricing and locations remain available as website pages and footer links, but they
are summarized on the homepage instead of being prominent main navigation items.
Control Panel links point directly to the configured Panel domain. `My Servers`
opens a website customer page that summarizes website orders and links to the