feat(UI): add Support the Project settings page

Adds a new settings page with Ko-fi donation link, Rogue Support
banner, and community contribution options (GitHub, Discord).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Chris Sherwood 2026-03-13 19:41:32 -07:00 committed by Jake Turner
parent 4db69d2173
commit e847c6b3d0
No known key found for this signature in database
GPG Key ID: 6DCBBAE4FEAB53EB
5 changed files with 117 additions and 0 deletions

View File

@ -39,6 +39,10 @@ export default class SettingsController {
return inertia.render('settings/legal'); return inertia.render('settings/legal');
} }
async support({ inertia }: HttpContext) {
return inertia.render('settings/support');
}
async maps({ inertia }: HttpContext) { async maps({ inertia }: HttpContext) {
const baseAssetsCheck = await this.mapService.ensureBaseAssets(); const baseAssetsCheck = await this.mapService.ensureBaseAssets();
const regionFiles = await this.mapService.listRegions(); const regionFiles = await this.mapService.listRegions();

View File

@ -4,6 +4,7 @@ import {
IconDashboard, IconDashboard,
IconFolder, IconFolder,
IconGavel, IconGavel,
IconHeart,
IconMapRoute, IconMapRoute,
IconSettings, IconSettings,
IconTerminal2, IconTerminal2,
@ -41,6 +42,7 @@ export default function SettingsLayout({ children }: { children: React.ReactNode
current: false, current: false,
}, },
{ name: 'System', href: '/settings/system', icon: IconSettings, current: false }, { name: 'System', href: '/settings/system', icon: IconSettings, current: false },
{ name: 'Support the Project', href: '/settings/support', icon: IconHeart, current: false },
{ name: 'Legal Notices', href: '/settings/legal', icon: IconGavel, current: false }, { name: 'Legal Notices', href: '/settings/legal', icon: IconGavel, current: false },
] ]

View File

@ -0,0 +1,110 @@
import { Head } from '@inertiajs/react'
import { IconExternalLink } from '@tabler/icons-react'
import SettingsLayout from '~/layouts/SettingsLayout'
export default function SupportPage() {
return (
<SettingsLayout>
<Head title="Support the Project | Project N.O.M.A.D." />
<div className="xl:pl-72 w-full">
<main className="px-12 py-6 max-w-4xl">
<h1 className="text-4xl font-semibold mb-4">Support the Project</h1>
<p className="text-gray-600 mb-10 text-lg">
Project NOMAD is 100% free and open source no subscriptions, no paywalls, no catch.
If you'd like to help keep the project going, here are a few ways to show your support.
</p>
{/* Ko-fi */}
<section className="mb-12">
<h2 className="text-2xl font-semibold mb-3">Buy Us a Coffee</h2>
<p className="text-gray-700 mb-4">
Every contribution helps fund development, server costs, and new content packs for NOMAD.
Even a small donation goes a long way.
</p>
<a
href="https://ko-fi.com/crosstalk"
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center gap-2 px-5 py-2.5 bg-[#FF5E5B] hover:bg-[#e54e4b] text-white font-semibold rounded-lg transition-colors"
>
Support on Ko-fi
<IconExternalLink size={18} />
</a>
</section>
{/* Rogue Support */}
<section className="mb-12">
<h2 className="text-2xl font-semibold mb-3">Need Help With Your Home Network?</h2>
<a
href="https://roguesupport.com"
target="_blank"
rel="noopener noreferrer"
className="block mb-4 rounded-lg overflow-hidden hover:opacity-90 transition-opacity"
>
<img
src="/rogue-support-banner.png"
alt="Rogue Support — Conquer Your Home Network"
className="w-full"
/>
</a>
<p className="text-gray-700 mb-4">
Rogue Support is a networking consultation service for home users.
Think of it as Uber for computer networking expert help when you need it.
</p>
<a
href="https://roguesupport.com"
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center gap-2 text-blue-600 hover:underline font-medium"
>
Visit RogueSupport.com
<IconExternalLink size={16} />
</a>
</section>
{/* Other Ways to Help */}
<section className="mb-10">
<h2 className="text-2xl font-semibold mb-3">Other Ways to Help</h2>
<ul className="space-y-2 text-gray-700">
<li>
<a
href="https://github.com/Crosstalk-Solutions/project-nomad"
target="_blank"
rel="noopener noreferrer"
className="text-blue-600 hover:underline"
>
Star the project on GitHub
</a>
{' '} it helps more people discover NOMAD
</li>
<li>
<a
href="https://github.com/Crosstalk-Solutions/project-nomad/issues"
target="_blank"
rel="noopener noreferrer"
className="text-blue-600 hover:underline"
>
Report bugs and suggest features
</a>
{' '} every report makes NOMAD better
</li>
<li>Share NOMAD with someone who'd use it word of mouth is the best marketing</li>
<li>
<a
href="https://discord.com/invite/crosstalksolutions"
target="_blank"
rel="noopener noreferrer"
className="text-blue-600 hover:underline"
>
Join the Discord community
</a>
{' '} hang out, share your build, help other users
</li>
</ul>
</section>
</main>
</div>
</SettingsLayout>
)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

View File

@ -54,6 +54,7 @@ router
router.get('/zim', [SettingsController, 'zim']) router.get('/zim', [SettingsController, 'zim'])
router.get('/zim/remote-explorer', [SettingsController, 'zimRemote']) router.get('/zim/remote-explorer', [SettingsController, 'zimRemote'])
router.get('/benchmark', [SettingsController, 'benchmark']) router.get('/benchmark', [SettingsController, 'benchmark'])
router.get('/support', [SettingsController, 'support'])
}) })
.prefix('/settings') .prefix('/settings')