import { PageHead } from "~/components/PageHead"; import { A } from "@solidjs/router"; import { createSignal, onMount, onCleanup } from "solid-js"; import DownloadOnAppStore from "~/components/icons/DownloadOnAppStore"; import { glitchText } from "~/lib/client-utils"; const DownloadButton = ({ onClick, children }: { onClick: () => void; children: Element | string; }) => { return ( ); }; export default function DownloadsPage() { const [LaLText, setLaLText] = createSignal("Life and Lineage"); const [SwAText, setSwAText] = createSignal("Shapes with Abigail!"); const [corkText, setCorkText] = createSignal("Cork"); const [gazeText, setGazeText] = createSignal("Gaze"); const download = (assetName: string) => { // Call the tRPC endpoint directly import("~/lib/api").then(({ api }) => { api.downloads.getDownloadUrl .query({ asset_name: assetName }) .then((data) => { const url = data.downloadURL; window.location.href = url; }) .catch((error) => { console.error("Download error:", error); // Optionally show user a message alert("Failed to initiate download. Please try again."); }); }); }; onMount(() => { const lalInterval = glitchText(LaLText(), setLaLText); const swaInterval = glitchText(SwAText(), setSwAText); const corkInterval = glitchText(corkText(), setCorkText); const gazeInterval = glitchText(gazeText(), setGazeText); onCleanup(() => { clearInterval(lalInterval); clearInterval(swaInterval); clearInterval(corkInterval); clearInterval(gazeInterval); }); }); return ( <>
{/* Subtle scanline effect */}
Ordered by date of initial release
{/* Gaze */}

{">"} {gazeText()}

platform: macOS (14.6+) download("gaze")}> download.dmg

{">"} {LaLText()}

platform: android download("lineage")}> download.apk # android build not optimized
platform: ios
{/* Cork */}

{">"} {corkText()}

platform: macOS (13+) download("cork")}> download.zip # unzip → drag to /Applications
{/* Shapes with Abigail */}

{">"} {SwAText()}

platform: android download("shapes-with-abigail")} > download.apk
platform: ios
); }