hello worlds
This commit is contained in:
15
src/components/Footer.astro
Normal file
15
src/components/Footer.astro
Normal file
@@ -0,0 +1,15 @@
|
||||
<footer class="container">
|
||||
<hr />
|
||||
<div class="links">
|
||||
<a href="https://ko-fi.com/recroomarchive">Donate</a>
|
||||
<span class="mx-1.5">|</span>
|
||||
<a href="https://discord.gg/Mh725mfC4j" class="underline">Discord</a>
|
||||
</div>
|
||||
<div class="about">
|
||||
<span>© {new Date().getFullYear()} RecRoomArchive</span>
|
||||
<span>
|
||||
TenWholeYears is not affiliated with Rec Room Inc. All rights
|
||||
belong to their respective owners.
|
||||
</span>
|
||||
</div>
|
||||
</footer>
|
||||
25
src/layouts/Layout.astro
Normal file
25
src/layouts/Layout.astro
Normal file
@@ -0,0 +1,25 @@
|
||||
---
|
||||
import Footer from "../components/Footer.astro";
|
||||
---
|
||||
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>TenWholeYears</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link href="/css/bootstrap.min.css" rel="stylesheet" media="screen" />
|
||||
<link
|
||||
href="/css/bootstrap-responsive.min.css"
|
||||
rel="stylesheet"
|
||||
media="screen"
|
||||
/>
|
||||
<link href="/css/styles.css" rel="stylesheet" />
|
||||
<link rel="icon" type="image/x-icon" href="/favicon.ico">
|
||||
</head>
|
||||
<body>
|
||||
<slot />
|
||||
<Footer />
|
||||
<script src="/js/jquery-4.0.0.min.js" is:inline></script>
|
||||
<script src="/js/bootstrap.min.js" is:inline></script>
|
||||
</body>
|
||||
</html>
|
||||
53
src/lib/api.ts
Normal file
53
src/lib/api.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
import { TWY_API_URL } from 'astro:env/server';
|
||||
|
||||
import type { LatestBuildsResponse, PatchNote } from './types/api/builds';
|
||||
import { ApiResult } from './types/api';
|
||||
|
||||
const BUILDS_V1 = "api/builds/v1";
|
||||
|
||||
export const api = {
|
||||
builds: {
|
||||
v1: {
|
||||
async getLatestVersions(): Promise<ApiResult<LatestBuildsResponse>> {
|
||||
const response = await fetch(`${TWY_API_URL}/${BUILDS_V1}/latest`, {
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
cache: "no-store",
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
console.error("Failed to load latest versions.", {
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
});
|
||||
return ApiResult.failure<LatestBuildsResponse>("Failed to load latest versions.");
|
||||
}
|
||||
|
||||
var obj = (await response.json()) as LatestBuildsResponse;
|
||||
|
||||
return ApiResult.success(obj);
|
||||
},
|
||||
async getPatchNotes(): Promise<ApiResult<PatchNote[]>> {
|
||||
const response = await fetch(`${TWY_API_URL}/${BUILDS_V1}/patchNotes`, {
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
cache: "no-store",
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
console.error("Failed to load account.", {
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
});
|
||||
return ApiResult.failure<PatchNote[]>("Failed to load latest versions.");
|
||||
}
|
||||
|
||||
var obj = (await response.json()) as PatchNote[];
|
||||
|
||||
return ApiResult.success(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
11
src/lib/types/api/builds.ts
Normal file
11
src/lib/types/api/builds.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
export interface LatestBuildsResponse {
|
||||
latestWindowsVersion: string;
|
||||
latestLinuxVersion: string;
|
||||
latestMetaVersion: string;
|
||||
}
|
||||
|
||||
export interface PatchNote {
|
||||
version: string;
|
||||
date: string;
|
||||
changes: string[];
|
||||
}
|
||||
13
src/lib/types/api/index.ts
Normal file
13
src/lib/types/api/index.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
export type ApiResult<T> =
|
||||
| { success: true; data: T }
|
||||
| { success: false; error: string };
|
||||
|
||||
export const ApiResult = {
|
||||
success<T>(data: T): ApiResult<T> {
|
||||
return { success: true, data };
|
||||
},
|
||||
|
||||
failure<T>(error: string): ApiResult<T> {
|
||||
return { success: false, error };
|
||||
}
|
||||
};
|
||||
98
src/pages/downloads.astro
Normal file
98
src/pages/downloads.astro
Normal file
@@ -0,0 +1,98 @@
|
||||
---
|
||||
import Layout from "../layouts/Layout.astro";
|
||||
|
||||
const downloads = [
|
||||
{
|
||||
platform: "Windows",
|
||||
version: "v1.0.3",
|
||||
href: "#",
|
||||
icon: "/img/platforms/platform-windows.png",
|
||||
checksum: "checksum: REPLACE_ME",
|
||||
},
|
||||
{
|
||||
platform: "Linux",
|
||||
version: "v1.0.3",
|
||||
href: "#",
|
||||
icon: "/img/platforms/platform-linux.png",
|
||||
checksum: "checksum: REPLACE_ME",
|
||||
},
|
||||
{
|
||||
platform: "Oculus Quest",
|
||||
version: "v1.0.3",
|
||||
href: "#",
|
||||
icon: "/img/platforms/platform-oculus.png",
|
||||
checksum: "checksum: REPLACE_ME",
|
||||
},
|
||||
];
|
||||
|
||||
const patchNotes = [
|
||||
{
|
||||
version: "v1.0.3",
|
||||
date: "6/26/2026",
|
||||
changes: [
|
||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
|
||||
"Nunc at augue eu nulla aliquet consectetur et in magna.",
|
||||
],
|
||||
}
|
||||
];
|
||||
---
|
||||
|
||||
<Layout>
|
||||
<div class="container">
|
||||
<div class="page-header">
|
||||
<p><a href="/">← Back to home</a></p>
|
||||
<h1>Downloads</h1>
|
||||
</div>
|
||||
<p class="lead">
|
||||
Choose the build for your platform.
|
||||
</p>
|
||||
|
||||
<div class="row">
|
||||
{downloads.map((download) => (
|
||||
<div class="span4">
|
||||
<div class="well text-center download-card">
|
||||
<p>
|
||||
<img
|
||||
src={download.icon}
|
||||
alt=""
|
||||
width="72"
|
||||
height="72"
|
||||
/>
|
||||
</p>
|
||||
<h3>{download.platform}</h3>
|
||||
<p>{download.version}</p>
|
||||
{/* <p class="muted">
|
||||
<code>{download.checksum}</code>
|
||||
</p> */}
|
||||
<p>
|
||||
<a
|
||||
href={download.href}
|
||||
class="btn btn-primary"
|
||||
aria-label={`Download for ${download.platform}`}
|
||||
>
|
||||
Download
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<section class="download-patch-notes">
|
||||
<div class="page-header">
|
||||
<h2>Patch Notes</h2>
|
||||
</div>
|
||||
{patchNotes.map((patchNote) => (
|
||||
<div class="well patch-note">
|
||||
<h3>{patchNote.version}</h3>
|
||||
<p class="muted">{patchNote.date}</p>
|
||||
<ul>
|
||||
{patchNote.changes.map((change) => (
|
||||
<li>{change}</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
))}
|
||||
</section>
|
||||
</div>
|
||||
</Layout>
|
||||
278
src/pages/index.astro
Normal file
278
src/pages/index.astro
Normal file
@@ -0,0 +1,278 @@
|
||||
---
|
||||
import Layout from "../layouts/Layout.astro";
|
||||
|
||||
const credits = [
|
||||
{
|
||||
name: "splootybean",
|
||||
role: "Project Lead",
|
||||
image: "/img/credits/splooty.png",
|
||||
},
|
||||
{
|
||||
name: "fexlar",
|
||||
role: "Server Developer",
|
||||
image: "/img/credits/fexlar.png",
|
||||
},
|
||||
{
|
||||
name: "nex",
|
||||
role: "Developer",
|
||||
image: "/img/credits/nex.png",
|
||||
},
|
||||
{
|
||||
name: "Magix",
|
||||
role: "Developer",
|
||||
image: "/img/credits/magix.png",
|
||||
},
|
||||
{
|
||||
name: "Milky",
|
||||
role: "Developer",
|
||||
image: "/img/credits/milky.png",
|
||||
},
|
||||
{
|
||||
name: "SoCoolMan",
|
||||
role: "Developer",
|
||||
image: "/img/credits/socoolman.png",
|
||||
},
|
||||
{
|
||||
name: "historyeraser",
|
||||
role: "Logo Designer",
|
||||
image: "/img/credits/historyeraser.png",
|
||||
},
|
||||
{
|
||||
name: "Wayne",
|
||||
role: "Artist / Logo Designer",
|
||||
image: "/img/credits/wayne.png",
|
||||
},
|
||||
{
|
||||
name: "RyanCR",
|
||||
role: "Artist / Composer",
|
||||
image: "/img/credits/ryancr.png",
|
||||
},
|
||||
{
|
||||
name: "Funko",
|
||||
role: "Artist",
|
||||
image: "/img/credits/funko.png",
|
||||
},
|
||||
{
|
||||
name: "Cheezit",
|
||||
role: "Artist",
|
||||
image: "/img/credits/cheezit.png",
|
||||
},
|
||||
{
|
||||
name: "9021007",
|
||||
role: "Artist",
|
||||
image: "/img/credits/9021007.gif",
|
||||
},
|
||||
{
|
||||
name: "Star Centurion",
|
||||
role: "Artist",
|
||||
image: "/img/credits/starcenturion.gif",
|
||||
},
|
||||
{
|
||||
name: "GabeTheFirst",
|
||||
role: "Artist",
|
||||
image: "/img/credits/gabethefirst.png",
|
||||
},
|
||||
{
|
||||
name: "HappyVR",
|
||||
role: "Leaf Shader",
|
||||
image: "/img/credits/happyvr.png",
|
||||
},
|
||||
{
|
||||
name: "Magolor",
|
||||
role: "Test Squad",
|
||||
image: "/img/credits/magolor.png",
|
||||
},
|
||||
{
|
||||
name: "TagComputing",
|
||||
role: "Test Squad",
|
||||
image: "/img/credits/tagcomputing.png",
|
||||
},
|
||||
{
|
||||
name: "mia",
|
||||
role: "Test Squad",
|
||||
image: "/img/credits/mia.png",
|
||||
},
|
||||
];
|
||||
---
|
||||
|
||||
<Layout>
|
||||
<div class="jumbotron masthead">
|
||||
<div class="container">
|
||||
<img
|
||||
src="/img/logo-tenwholeyears.png"
|
||||
alt="asdasd"
|
||||
class="masthead-logo"
|
||||
/>
|
||||
<h1 class="masthead-title">TenWholeYears</h1>
|
||||
<p>A love letter to Rec Room on its true 10th anniversary</p>
|
||||
<div class="masthead-download">
|
||||
<a href="/downloads/" class="btn btn-primary btn-large">
|
||||
Download for Windows x64
|
||||
</a>
|
||||
<div class="subtext">
|
||||
<span>or</span>
|
||||
<a href="/downloads/" class="masthead-platforms"
|
||||
>Other Platforms</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container">
|
||||
<section class="home-section intro-section">
|
||||
<div class="row">
|
||||
<div class="span6">
|
||||
<h2>What is TenWholeYears?</h2>
|
||||
<p class="lead">
|
||||
TenWholeYears is a love letter to Rec Room and the
|
||||
community that made it special. Created to celebrate Rec
|
||||
Room's true tenth anniversary, we invite everyone to
|
||||
visit the first release of Rec Room, explore activities
|
||||
that never made it into the game, and reflect on how far
|
||||
Rec Room and it's community has progressed over the last
|
||||
ten years.
|
||||
</p>
|
||||
<p class="lead">
|
||||
Read about the inspiration behind TenWholeYears <a
|
||||
href="#">here</a
|
||||
>.
|
||||
</p>
|
||||
</div>
|
||||
<div class="span6">
|
||||
<img
|
||||
src="/img/home/feature.png"
|
||||
alt="Beta Frisbee Activity"
|
||||
class="thumbnail feature-photo"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="home-section">
|
||||
<div class="page-header">
|
||||
<h2>Explore the Game</h2>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="span4">
|
||||
<div class="archive-feature">
|
||||
<img
|
||||
src="/img/home/card-horseshoes.png"
|
||||
alt="Scrapped Horseshoes Activity"
|
||||
class="thumbnail"
|
||||
/>
|
||||
<h3>Scrapped Activities</h3>
|
||||
<p>
|
||||
Explore prototype activities and unfinished ideas
|
||||
that never made it into Rec Room. These activities
|
||||
have been restored to show a glimpse into
|
||||
what could of existed.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="span4">
|
||||
<div class="archive-feature">
|
||||
<img
|
||||
src="/img/home/card-recroom.png"
|
||||
alt="Beta LockerRoom (RecRoom)"
|
||||
class="thumbnail"
|
||||
/>
|
||||
<h3>Lorem Ipsum</h3>
|
||||
<p>
|
||||
Nam fermentum ut lectus et placerat. Nulla nibh
|
||||
nulla, rutrum at neque at, vulputate consequat.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="span4">
|
||||
<div class="archive-feature">
|
||||
<img
|
||||
src="/img/home/card-horseshoes.png"
|
||||
alt="Placeholder screenshots and media image"
|
||||
class="thumbnail"
|
||||
/>
|
||||
<h3>Lorem Ipsum</h3>
|
||||
<p>
|
||||
Duis efficitur ligula non sem hendrerit interdum.
|
||||
Donec facilisis efficitur malesuada. Nullam
|
||||
venenatis.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="home-section gallery-section">
|
||||
<div class="page-header">
|
||||
<h2>Community Handheld Videos</h2>
|
||||
</div>
|
||||
<ul class="thumbnails">
|
||||
<li class="span3">
|
||||
<a href="/img/videos/boombox.gif" class="thumbnail">
|
||||
<img
|
||||
src="/img/videos/boombox.gif"
|
||||
alt="splootybean grooving to the boombox"
|
||||
loading="lazy"
|
||||
/>
|
||||
</a>
|
||||
<p class="caption">Filmed by <b>@fexlar</b></p>
|
||||
</li>
|
||||
<li class="span3">
|
||||
<a href="/img/videos/hide.gif" class="thumbnail">
|
||||
<img
|
||||
src="/img/videos/hide.gif"
|
||||
alt="guy hiding"
|
||||
loading="lazy"
|
||||
/>
|
||||
</a>
|
||||
<p class="caption">Filmed by <b>@splootybean</b></p>
|
||||
</li>
|
||||
<li class="span3">
|
||||
<a href="#" class="thumbnail">
|
||||
<img
|
||||
src="/img/videos/trickshot.gif"
|
||||
alt="dodgeball trickshot"
|
||||
loading="lazy"
|
||||
/>
|
||||
</a>
|
||||
<p class="caption">Filmed by <b>@_.golden_.</b></p>
|
||||
</li>
|
||||
<li class="span3">
|
||||
<a href="#" class="thumbnail">
|
||||
<img
|
||||
src="/img/videos/wave.gif"
|
||||
alt="hello there!"
|
||||
loading="lazy"
|
||||
/>
|
||||
</a>
|
||||
<p class="caption">Filmed by <b>@splootybean</b></p>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section class="home-section credits-section">
|
||||
<div class="page-header">
|
||||
<h2>Credits</h2>
|
||||
</div>
|
||||
<div class="row">
|
||||
{
|
||||
credits.map((credit) => (
|
||||
<div class="span4">
|
||||
<div class="credit-entry">
|
||||
<img
|
||||
src={credit.image}
|
||||
alt={`${credit.name} pfp`}
|
||||
class="credit-avatar"
|
||||
loading="lazy"
|
||||
/>
|
||||
<div>
|
||||
<h3>{credit.name}</h3>
|
||||
<p>{credit.role}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))
|
||||
}
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</Layout>
|
||||
Reference in New Issue
Block a user