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:
@@ -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;
|
||||
Reference in New Issue
Block a user