Add TTRPG Player marketing landing site.

React/Vite landing with RU/EN i18n, live USD pricing, download links to updates.mailib.ru, and donate.stream checkout.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Ivan Fontosh
2026-06-28 11:58:31 +08:00
commit b0ab6cc729
70 changed files with 9151 additions and 0 deletions
+116
View File
@@ -0,0 +1,116 @@
export const SITE_LINKS = {
features: "#features",
howItWorks: "#how-it-works",
platforms: "#platforms",
pricing: "#pricing",
faq: "#faq",
download: "#platforms",
buy: "https://donate.stream/ttrpgplayer",
enterKey: "#pricing",
support: "mailto:support@ttrpgplayer.example",
privacy: "#",
} as const;
/** Same feed as electron-builder `publish.url` in dnd_player/package.json */
export const UPDATE_FEED_BASE = "https://updates.mailib.ru/";
/** Fixed artifact names — version lives only in latest*.yml on the server */
export const DOWNLOAD_ARTIFACTS = {
windows: "TTRPGPlayer-Setup.exe",
macos: {
x64: "TTRPGPlayer-x64.dmg",
arm64: "TTRPGPlayer-arm64.dmg",
},
linux: {
x64: "TTRPGPlayer-x64.AppImage",
arm64: "TTRPGPlayer-arm64.AppImage",
},
} as const;
function artifactUrl(filename: string): string {
return `${UPDATE_FEED_BASE}${filename}`;
}
export const DOWNLOAD_LINKS = {
windows: artifactUrl(DOWNLOAD_ARTIFACTS.windows),
macos: {
x64: artifactUrl(DOWNLOAD_ARTIFACTS.macos.x64),
arm64: artifactUrl(DOWNLOAD_ARTIFACTS.macos.arm64),
},
linux: {
x64: artifactUrl(DOWNLOAD_ARTIFACTS.linux.x64),
arm64: artifactUrl(DOWNLOAD_ARTIFACTS.linux.arm64),
},
} as const;
export type DownloadLinks = typeof DOWNLOAD_LINKS;
export const NAV_LINK_KEYS = [
"features",
"howItWorks",
"platforms",
"pricing",
"faq",
] as const;
export type NavLinkKey = (typeof NAV_LINK_KEYS)[number];
export const NAV_HREFS: Record<NavLinkKey, string> = {
features: SITE_LINKS.features,
howItWorks: SITE_LINKS.howItWorks,
platforms: SITE_LINKS.platforms,
pricing: SITE_LINKS.pricing,
faq: SITE_LINKS.faq,
};
export const AUDIENCE_CARD_IDS = ["gm", "prep", "table"] as const;
export const BENEFIT_CARD_IDS = [
"allInOne",
"sync",
"immersion",
"branching",
"portable",
"pro",
] as const;
export const FEATURE_VARIANTS = [
"editor",
"control",
"presentation",
"atmosphere",
] as const;
export type FeatureVariant = (typeof FEATURE_VARIANTS)[number];
export const STEP_IDS = ["create", "launch", "run"] as const;
export const PLATFORM_IDS = ["windows", "macos", "linux"] as const;
export type PlatformId = (typeof PLATFORM_IDS)[number];
export const PRICING_TIER_IDS = ["basic", "master", "legend"] as const;
export type PricingTierId = (typeof PRICING_TIER_IDS)[number];
export const RECOMMENDED_PRICING_TIER: PricingTierId = "master";
export const FAQ_IDS = [
"what",
"internet",
"monitor",
"activate",
"os",
] as const;
export type FaqId = (typeof FAQ_IDS)[number];
export const HERO_HIGHLIGHT_IDS = ["offline", "secondScreen"] as const;
export const REQUIRED_SECTION_IDS = [
"features",
"how-it-works",
"platforms",
"pricing",
"faq",
] as const;