new website in node wahoo

This commit is contained in:
Lah Shrimp 2026-07-11 15:20:14 -06:00
parent 09a4c79d5c
commit 64aa55dbfa
63 changed files with 691 additions and 547 deletions

View File

@ -0,0 +1,36 @@
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
## Getting Started
First, run the development server:
```bash
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
## Learn More
To learn more about Next.js, take a look at the following resources:
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
## Deploy on Vercel
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.

View File

@ -0,0 +1,28 @@
import Image from "next/image";
import shrimp3D from "./shrimp.png";
export default function Banner() {
return (
<section className="w-full flex bg-tangerine-dream-shrimp items-center justify-center md:gap-[30px] gap-[0] text-3xl text-space-shrimp-blue py-3 lg:px-25 px-5">
<Image
loading="eager"
src={shrimp3D}
alt="3D modeled shrimp"
width={774}
height={605}
className="md:w-[150px] w-[75px] h-auto"
/>
<h1 className="w-fit text-nowrap md:text-5xl text-2xl">
SHRIMP SQUAD
</h1>
<Image
loading="eager"
className="transform-[scaleX(-1)] md:w-[150px] w-[75px] h-auto"
src={shrimp3D}
alt="3D modeled shrimp"
width={774}
height={605}
/>
</section>
);
}

View File

Before

Width:  |  Height:  |  Size: 355 KiB

After

Width:  |  Height:  |  Size: 355 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 MiB

After

Width:  |  Height:  |  Size: 2.0 MiB

View File

@ -0,0 +1,17 @@
import Image from "next/image";
import heroShrimp from "./hero-shrimp.png";
export default function HeroShrimp() {
return (
<section className="w-full h-auto flex items-center justify-center w-full bg-apricot-shrimp">
<Image
loading="eager"
src={heroShrimp}
alt="photo of three gold shrimp on rocks underwater"
width={2400}
height={742}
className="w-full h-auto"
/>
</section>
);
}

View File

@ -0,0 +1,41 @@
import { useState } from "react";
import { createPortal } from "react-dom";
import { ShrimpRain } from "./shrimp-rain";
export default function SeafoodButton() {
const [showShrimpOverlay, setShowShrimpOverlay] = useState(false);
// set maxShrimp based on image size so not to overflow
const maxShrimp = 83;
const shrimpRainValues: number[] = [];
for (let i = 0; i < maxShrimp; i++) {
shrimpRainValues.push(Math.floor(Math.random() * 200));
}
function itsRainingShrimp() {
setShowShrimpOverlay(true);
// wait until after the animation plays to make the shrimp disappear 🪄
setTimeout(() => {
setShowShrimpOverlay(false);
}, 2900);
}
return (
<>
<button
className="cursor-[unset] bg-space-shrimp-blue text-tangerine-dream-shrimp p-[20px] mt-[10px] w-full rounded-xl border-transparent border-2 hover:border-ashy-shrimp shadow-lg/40"
type="button"
onClick={() => itsRainingShrimp()}
>
Dive into Seafood Delights
</button>
{showShrimpOverlay &&
createPortal(
<ShrimpRain randomValues={shrimpRainValues} />,
document.body
)}
</>
);
}
//todo nice to have: cooler button hover state - dancing shrimps

View File

@ -0,0 +1,16 @@
import SeafoodButton from "./seafood-button";
export default function SeafoodDelights() {
return (
<section className="shrimp-info w-full bg-cherry-shrimp py-[10px] lg:px-25 px-5">
<div className="text-space-shrimp-blue text-center">
<p className="font-bold">
We are Shrimp Squad and we make things.
</p>
There's no project we can't mantis punch. Shrimply take a look
at what we're known for.
</div>
<SeafoodButton />
</section>
);
}

View File

@ -0,0 +1,32 @@
import Image from "next/image";
import Shrimp from "./shrimp.png";
export function ShrimpRain({ randomValues }: { randomValues: number[] }) {
const maxWidthToShrimp = randomValues.length;
const shrimpImagesArray = Array.from(Array(maxWidthToShrimp).keys());
const shrimpImagesArrayElements = shrimpImagesArray.map((index) => {
const left = "left-[" + (index + 1) + "%]";
const bottom = "bottom-[" + randomValues[index] + "%]";
return (
<Image
key={index}
className="w-[15%] h-auto absolute animate-shrimply-rain"
src={Shrimp}
alt="3D modeled shrimp"
width={774}
height={605}
style={{
left: +index + 1 + "%",
bottom: randomValues[index] + "%",
}}
/>
);
});
return (
<div className="fixed w-full h-full overflow-hidden">
{shrimpImagesArrayElements}
</div>
);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="Discord-Logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 126.644 96"><defs><style>.cls-1{fill:#5865f2;}</style></defs><path id="Discord-Symbol-Blurple" class="cls-1" d="M81.15,0c-1.2376,2.1973-2.3489,4.4704-3.3591,6.794-9.5975-1.4396-19.3718-1.4396-28.9945,0-.985-2.3236-2.1216-4.5967-3.3591-6.794-9.0166,1.5407-17.8059,4.2431-26.1405,8.0568C2.779,32.5304-1.6914,56.3725.5312,79.8863c9.6732,7.1476,20.5083,12.603,32.0505,16.0884,2.6014-3.4854,4.8998-7.1981,6.8698-11.0623-3.738-1.3891-7.3497-3.1318-10.8098-5.1523.9092-.6567,1.7932-1.3386,2.6519-1.9953,20.281,9.547,43.7696,9.547,64.0758,0,.8587.7072,1.7427,1.3891,2.6519,1.9953-3.4601,2.0457-7.0718,3.7632-10.835,5.1776,1.97,3.8642,4.2683,7.5769,6.8698,11.0623,11.5419-3.4854,22.3769-8.9156,32.0509-16.0631,2.626-27.2771-4.496-50.9172-18.817-71.8548C98.9811,4.2684,90.1918,1.5659,81.1752.0505l-.0252-.0505ZM42.2802,65.4144c-6.2383,0-11.4159-5.6575-11.4159-12.6535s4.9755-12.6788,11.3907-12.6788,11.5169,5.708,11.4159,12.6788c-.101,6.9708-5.026,12.6535-11.3907,12.6535ZM84.3576,65.4144c-6.2637,0-11.3907-5.6575-11.3907-12.6535s4.9755-12.6788,11.3907-12.6788,11.4917,5.708,11.3906,12.6788c-.101,6.9708-5.026,12.6535-11.3906,12.6535Z"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

View File

Before

Width:  |  Height:  |  Size: 14 MiB

After

Width:  |  Height:  |  Size: 14 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 KiB

View File

@ -0,0 +1,24 @@
import Image from "next/image";
import danceShrimp from "../assets/dance-shrimp-dance.gif";
export default function DancingShrimps() {
const shrimpArray = Array.from(Array(20).keys());
const shrimpArrayElements = shrimpArray.map((index) => (
<Image
key={index}
className="w-[150px] h-auto"
src={danceShrimp}
alt="dancing 3D modeled shrimp"
width={910}
height={530}
/>
));
return (
<div className="flex flex-wrap justify-between py-5 bg-apricot-shrimp">
{shrimpArrayElements}
</div>
);
}
//todo try out one line of shrimp only that change size

View File

@ -0,0 +1,82 @@
import Image from "next/image";
import shrimp3D from "./assets/shrimp.png";
import discordSymbol from "./assets/Discord-Symbol-Blurple.svg";
import linkedInSymbol from "./assets/LI-In-Bug.png";
import mediawikiSymbol from "./assets/mediawiki.png";
import DancingShrimps from "./dancing-shrimps/dancing-shrimps";
export default function ShrimpFeet() {
const currentYear = new Date().getFullYear();
return (
<section>
<div className="flex md:flex-row flex-col items-center lg:gap-10 gap-5 justify-center py-5 lg:px-25 px-4 bg-ashy-shrimp text-space-shrimp-blue">
<div className="flex items-center">
<Image
src={shrimp3D}
alt="3D modeled shrimp"
width={774}
height={605}
className="w-[150px] h-auto"
/>
<div>
<p className="font-bold text-cherry-shrimp text-xl">
Making games should be fun
</p>
<p>Shrimp Squad Inc.</p>
<a
href="mailto:contact@shrimpsquad.ca"
className="underline cursor-[unset] hover:font-bold"
>
contact@shrimpsquad.ca
</a>
<p>© {currentYear}</p>
</div>
</div>
<div className="flex gap-5 justify-center items-center">
<a
href="https://discord.gg/RVhc27mbAc"
target="_blank"
className="cursor-[unset]"
>
<Image
src={discordSymbol}
alt="discord symbol"
width={150}
height={150}
className="w-[48px] h-auto"
/>
</a>
<a
href="https://dev.shrimpsquad.ca/"
target="_blank"
className="cursor-[unset]"
>
<Image
src={mediawikiSymbol}
alt="discord symbol"
width={135}
height={135}
className="w-[48px] h-auto"
/>
</a>
<a
href="https://www.linkedin.com/company/shrimp-squad-inc/"
target="_blank"
className="cursor-[unset]"
>
<Image
src={linkedInSymbol}
alt="linkedIn symbol"
width={635}
height={540}
className="w-[48px] h-auto"
/>
</a>
</div>
</div>
<DancingShrimps />
</section>
);
}
//todo get centered shrimp image

View File

@ -0,0 +1,6 @@
import ProjectContent from "./project-content";
import { ProjectImageProps, ProjectContentProps } from "../types";
export { ProjectContent };
export type { ProjectImageProps, ProjectContentProps };

View File

@ -0,0 +1,33 @@
import Image from "next/image";
import { ProjectContentProps } from "./";
export default function ProjectContent(projectContent: ProjectContentProps) {
return (
<section className="flex flex-col items-center w-full pt-[10px]">
<div className="flex flex-col xl:flex-row justify-between gap-[10px] *:basis-[32%] [&>div]:bg-tangerine-dream-shrimp">
<Image
src={projectContent.images.left.src}
alt=""
width={2000}
height={2000}
className="w-full xl:w-[30%] h-auto"
/>
<div className="p-[40px]">{projectContent.children}</div>
<Image
src={projectContent.images.right.src}
alt=""
width={2000}
height={2000}
className="w-full xl:w-[30%] h-auto"
/>
</div>
<Image
src={projectContent.images.central.src}
alt=""
width={2000}
height={2000}
className="w-full h-auto xl:mt-[15px] mt-[10px]"
/>
</section>
);
}

View File

@ -0,0 +1,23 @@
export default function BiotamaText() {
return (
<div>
<p className="mb-2">
<span className="font-bold">Biotama</span> is a game where
players attempt to convert wastelands into thriving ecosystems.
</p>
<p className="mb-2">
The player starts with a "Mother Tree" which acts as the core
component of the player's ecosystem. Trees grow roots that can
connect together, allowing them to communicate and send
resources between each other. Mycelial networks function
similarly for fungi.
</p>
<p>
Biotama aims to be educational as well as fun. It will feature
real-world species with tooltips showing fun facts about those
species. We are consulting with experts in biology where
necessary to ensure accuracy to the real world.
</p>
</div>
);
}

View File

@ -0,0 +1,29 @@
export default function HackThePlanetText() {
return (
<div className="h-full grid grid-cols-1 grid-row-2">
<div>
<p className="mb-2">
A game by Shrimp Squad Studios made for the Epic MegaJam!
</p>
<p className="mb-2">
One week to make a game and this is what we made! A game
based on the movie Hackers.
</p>
<p className="mb-2">
Your goal is to hack the Gibson computer and collect the
garbage file. Which will then in turn let you
<span className="font-bold"> HACK THE PLANET!</span>
</p>
</div>
<div className="mt-[16px] mb-[16px] bg-space-shrimp-blue p-[15px] size-fit rounded-md self-end">
<a
className="animate-blink border-solid border-r-[2px] border-ashy-shrimp text-[24px] text-ashy-shrimp cursor-[unset]"
href="https://megsum.itch.io/hack-the-planet"
target="_blank"
>
&gt;&gt; Try it out!
</a>
</div>
</div>
);
}

View File

@ -0,0 +1,31 @@
import { ProjectListProps } from "../types";
export default function ProjectList({
projects,
handleProjectClick,
}: {
projects: ProjectListProps[];
handleProjectClick: any;
}) {
const projectList = projects.map((project) => (
<button
key={project.id}
className={
(project.selected
? "text-shadow-[4px_3px_0_var(--color-cherry-shrimp)]"
: "") +
" hover:[text-decoration-line:underline_overline] hover:decoration-ashy-shrimp cursor-[unset]"
}
onClick={() => handleProjectClick(project.id)}
>
{project.name}
</button>
));
return (
<section className="flex gap-[20px] justify-evenly py-[10px] text-tangerine-dream-shrimp text-2xl">
{projectList}
</section>
);
}
//todo nice to have: border-image on hover would be cool

View File

@ -0,0 +1,35 @@
import { useState } from "react";
import ProjectList from "./project-list/project-list";
import ProjectContent from "./project-content/project-content";
import {
getCurrentProjectContent,
getProjectList,
} from "../../lib/project-content/getShrimps";
export default function ShrimpProjects() {
const [project, setProject] = useState("biotama");
const [projectContent, setProjectContent] = useState(
getCurrentProjectContent(project)
);
const [projectList, setProjectlist] = useState(getProjectList(project));
const handleProjectClick = (newProject: string) => {
setProject(newProject);
setProjectlist(getProjectList(newProject));
setProjectContent(getCurrentProjectContent(newProject));
};
const projectListProps = {
projects: projectList,
handleProjectClick: handleProjectClick,
};
return (
<section className="bg-space-shrimp-blue pb-5 lg:px-25 px-5 wave-border">
<ProjectList {...projectListProps} />
<ProjectContent {...projectContent}>
{projectContent.content}
</ProjectContent>
</section>
);
}

View File

@ -0,0 +1,25 @@
import { StaticImageData } from "next/image";
import { ReactNode } from "react";
export type ProjectImageProps = {
src: StaticImageData;
alt: string;
};
export type ProjectImages = {
left: ProjectImageProps;
right: ProjectImageProps;
central: ProjectImageProps;
};
export type ProjectContentProps = React.PropsWithChildren<{
name: string;
content: ReactNode;
images: ProjectImages;
}>;
export type ProjectListProps = {
id: string;
name: string;
selected: boolean;
};

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

53
app/globals.css Normal file
View File

@ -0,0 +1,53 @@
@import "tailwindcss";
:root {
--background: #ffffff;
--foreground: #171717;
}
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--font-sans: var(--font-geist-sans);
--font-mono: var(--font-geist-mono);
--color-space-shrimp-blue: #2c2c54;
--color-cherry-shrimp: #a40e4c;
--color-ashy-shrimp: #acc3a6;
--color-apricot-shrimp: #f5d6ba;
--color-tangerine-dream-shrimp: #f49d6e;
}
@utility wave-border {
border-image: url("lib/waves-border.png") 27 fill / 35px / 25px 0 0 0 round;
position: relative;
}
body {
background: var(--background);
color: var(--foreground);
font-family: Arial, Helvetica, sans-serif;
cursor: url("lib/cursors/shrimp_cursor.png"), auto;
}
@theme {
--animate-blink: blink-border 0.75s step-end infinite;
@keyframes blink-border {
from,
to {
border-color: transparent;
}
50% {
border-color: var(--ashy-shrimp);
}
}
--animate-shrimply-rain: rain-down 3s linear 1;
@keyframes rain-down {
0% {
transform: translateY(0);
}
100% {
transform: translateY(200vh);
}
}
}

33
app/layout.tsx Normal file
View File

@ -0,0 +1,33 @@
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
});
const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
});
export const metadata: Metadata = {
title: "Dive into Seafood Delights",
description: "It's shrimp",
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html
lang="en"
className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`}
>
<body className="min-h-full flex flex-col">{children}</body>
</html>
);
}

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 4.7 MiB

After

Width:  |  Height:  |  Size: 4.7 MiB

View File

Before

Width:  |  Height:  |  Size: 3.2 MiB

After

Width:  |  Height:  |  Size: 3.2 MiB

View File

Before

Width:  |  Height:  |  Size: 2.4 MiB

After

Width:  |  Height:  |  Size: 2.4 MiB

View File

Before

Width:  |  Height:  |  Size: 983 KiB

After

Width:  |  Height:  |  Size: 983 KiB

View File

Before

Width:  |  Height:  |  Size: 950 KiB

After

Width:  |  Height:  |  Size: 950 KiB

View File

Before

Width:  |  Height:  |  Size: 242 KiB

After

Width:  |  Height:  |  Size: 242 KiB

View File

@ -0,0 +1,17 @@
import { projects } from "./shrimpjects";
export function getCurrentProjectContent(project: string) {
return {
name: projects[project].name,
content: projects[project].content,
images: projects[project].images,
};
}
export function getProjectList(currentProject: string) {
return Object.keys(projects).map((key) => ({
id: key.toString(),
name: projects[key].name,
selected: key === currentProject,
}));
}

View File

@ -0,0 +1,74 @@
import { StaticImageData } from "next/image";
import { ReactNode } from "react";
import biotamaCentral from "./assets/biotama1.png";
import biotamaLeft from "./assets/biotama2.png";
import biotamaRight from "./assets/biotama3.png";
import htpCentral from "./assets/htp3.png";
import htpLeft from "./assets/htp1.png";
import htpRight from "./assets/htp2.png";
import BiotamaText from "@/app/components/shrimp-projects/project-descriptions/biotama";
import HackThePlanetText from "@/app/components/shrimp-projects/project-descriptions/htp";
type ProjectImage = {
src: StaticImageData;
alt: string;
};
type ProjectImages = {
left: ProjectImage;
right: ProjectImage;
central: ProjectImage;
};
type ProjectContent = {
name: string;
content: ReactNode;
images: ProjectImages;
};
export type Project = {
[key: string]: ProjectContent;
};
export const projects: Project = {
biotama: {
name: "BIOTAMA",
content: <BiotamaText />,
images: {
left: {
src: biotamaLeft,
alt: "mother tree with a river and cliffs in the background",
},
right: {
src: biotamaRight,
alt: "inside of an old brick house looking out the door onto a path leading to a bridge",
},
central: {
src: biotamaCentral,
alt: "top down view of the mother tree and greenery",
},
},
},
htp: {
name: "HACK THE PLANET",
content: <HackThePlanetText />,
images: {
left: {
src: htpLeft,
alt: "visual puzzle with different colours",
},
right: {
src: htpRight,
alt: "the player character standing surrounded by various text characters",
},
central: {
src: htpCentral,
alt: "top down camera view of a black screen with hex codes randomly placed",
},
},
},
};
//todo add new images for biotama
//todo use image components instead of properties

View File

Before

Width:  |  Height:  |  Size: 888 B

After

Width:  |  Height:  |  Size: 888 B

26
app/page.tsx Normal file
View File

@ -0,0 +1,26 @@
"use client";
import Banner from "./components/banner/banner";
import HeroShrimp from "./components/hero-shrimp/hero-shrimp";
import SeafoodDelights from "./components/seafood-delights/seafood-delights";
import ShrimpFeet from "./components/shrimp-feet/shrimp-feet";
import ShrimpProjects from "./components/shrimp-projects/shrimp-projects";
export default function Home() {
return (
<div>
<Banner />
<SeafoodDelights />
<HeroShrimp />
<ShrimpProjects />
<ShrimpFeet />
</div>
);
}
/* todo list
- more shrimpy font
- shrimp profiles (about us)
- menu i guess, hamburger, but the lines are waves
- animations
- shirmp cursor for hover - colour swap
*/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View File

@ -1,59 +0,0 @@
<!DOCTYPE html>
<html lang="en-CA">
<head>
<title>Dive into Seafood Delights</title>
<link rel="icon" type="image/x-icon" href="./shrimpmoji.ico">
<link rel="stylesheet" href="shrimpy-styles.css"/>
<script type="module">
import { getProjectData, itsRainingShrimp} from "./shrimply-the-best.js"
window.getProjectData = getProjectData;
window.itsRainingShrimp = itsRainingShrimp;
</script>
</head>
<body>
<div id="shrimply-the-rain"></div>
<section class="we-are-shrimp-squad">
<img src="assets/shrimp.png"/>
<h1>SHRIMP SQUAD</h1>
<img class="flip" src="assets/shrimp.png"/>
</section>
<section>
<div class="shrimp-info">
<div> We are Shrimp Squad and we make things. There's no project we can't mantis punch. Shrimply take a look at what we're known for.</div>
<button id="seafoodDelightsBtn" type="button">Dive into Seafood Delights</button>
</div>
</section>
<section class="shrimp-hero">
<img src="assets/hero-shrimp.png"/>
</section>
<section class="shrimp-projects">
<section class="shrimp-project-list">
<div id='biotama'>BIOTAMA</div>
<div id='htp'>HACK THE PLANET</div>
</section>
<section id="shrimp-project-content">
<div class="upper">
<img id="image-left" class="smol-image"/>
<div id="project-content"></div>
<img id="image-right" class="smol-image"/>
</div>
<img id="image-central"/>
</section>
</section>
<section class="footer">
<div id="shrimp-gif"></div>
</section>
</body>
</html>
<!--
todo list
- more shrimpy font
- shrimp profiles (about us)
- menu i guess, hamburger, but the lines are waves
- animations
- shirmp cursor for hover
- clean up click handling
-->

View File

@ -19,6 +19,7 @@
"@types/react-dom": "^19",
"eslint": "^9",
"eslint-config-next": "16.2.4",
"prettier": "3.8.3",
"tailwindcss": "^4",
"typescript": "^5"
}
@ -5487,6 +5488,22 @@
"node": ">= 0.8.0"
}
},
"node_modules/prettier": {
"version": "3.8.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz",
"integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==",
"dev": true,
"license": "MIT",
"bin": {
"prettier": "bin/prettier.cjs"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",

View File

@ -20,6 +20,7 @@
"@types/react-dom": "^19",
"eslint": "^9",
"eslint-config-next": "16.2.4",
"prettier": "3.8.3",
"tailwindcss": "^4",
"typescript": "^5"
}

10
prettier.config.ts Normal file
View File

@ -0,0 +1,10 @@
// prettier.config.ts, .prettierrc.ts, prettier.config.mts, or .prettierrc.mts
import { type Config } from "prettier";
const config: Config = {
trailingComma: "es5",
tabWidth: 4,
};
export default config;

View File

Before

Width:  |  Height:  |  Size: 391 B

After

Width:  |  Height:  |  Size: 391 B

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 128 B

After

Width:  |  Height:  |  Size: 128 B

View File

Before

Width:  |  Height:  |  Size: 385 B

After

Width:  |  Height:  |  Size: 385 B

View File

@ -1,36 +0,0 @@
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
## Getting Started
First, run the development server:
```bash
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
## Learn More
To learn more about Next.js, take a look at the following resources:
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
## Deploy on Vercel
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

View File

@ -1,26 +0,0 @@
@import "tailwindcss";
:root {
--background: #ffffff;
--foreground: #171717;
}
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--font-sans: var(--font-geist-sans);
--font-mono: var(--font-geist-mono);
}
@media (prefers-color-scheme: dark) {
:root {
--background: #0a0a0a;
--foreground: #ededed;
}
}
body {
background: var(--background);
color: var(--foreground);
font-family: Arial, Helvetica, sans-serif;
}

View File

@ -1,33 +0,0 @@
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
});
const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
});
export const metadata: Metadata = {
title: "Create Next App",
description: "Generated by create next app",
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html
lang="en"
className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`}
>
<body className="min-h-full flex flex-col">{children}</body>
</html>
);
}

View File

@ -1,65 +0,0 @@
import Image from "next/image";
export default function Home() {
return (
<div className="flex flex-col flex-1 items-center justify-center bg-zinc-50 font-sans dark:bg-black">
<main className="flex flex-1 w-full max-w-3xl flex-col items-center justify-between py-32 px-16 bg-white dark:bg-black sm:items-start">
<Image
className="dark:invert"
src="/next.svg"
alt="Next.js logo"
width={100}
height={20}
priority
/>
<div className="flex flex-col items-center gap-6 text-center sm:items-start sm:text-left">
<h1 className="max-w-xs text-3xl font-semibold leading-10 tracking-tight text-black dark:text-zinc-50">
To get started, edit the page.tsx file.
</h1>
<p className="max-w-md text-lg leading-8 text-zinc-600 dark:text-zinc-400">
Looking for a starting point or more instructions? Head over to{" "}
<a
href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
className="font-medium text-zinc-950 dark:text-zinc-50"
>
Templates
</a>{" "}
or the{" "}
<a
href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
className="font-medium text-zinc-950 dark:text-zinc-50"
>
Learning
</a>{" "}
center.
</p>
</div>
<div className="flex flex-col gap-4 text-base font-medium sm:flex-row">
<a
className="flex h-12 w-full items-center justify-center gap-2 rounded-full bg-foreground px-5 text-background transition-colors hover:bg-[#383838] dark:hover:bg-[#ccc] md:w-[158px]"
href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
<Image
className="dark:invert"
src="/vercel.svg"
alt="Vercel logomark"
width={16}
height={16}
/>
Deploy Now
</a>
<a
className="flex h-12 w-full items-center justify-center rounded-full border border-solid border-black/[.08] px-5 transition-colors hover:border-transparent hover:bg-black/[.04] dark:border-white/[.145] dark:hover:bg-[#1a1a1a] md:w-[158px]"
href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
Documentation
</a>
</div>
</main>
</div>
);
}

View File

@ -1,32 +0,0 @@
export const projects = {
"biotama":{
content:
`<p><span class="bold">Biotama</span> is a game where players attempt to convert wastelands into thriving ecosystems.</p>
<p>The player starts with a "Mother Tree"
which acts as the core component of the player's ecosystem.
Trees grow roots that can connect together,
allowing them to communicate and send resources between each other.
Mycelial networks function similarly for fungi. </p>
<p>Biotama aims to be educational as well as fun.
It will feature real-world species with tooltips showing fun facts about those species.
We are consulting with experts in biology where necessary to ensure accuracy to the real world.</p>
`,
images: {
left: {src:"biotama2.png",alt:"mother tree with a river and cliffs in the background"},
right: {src:"biotama3.png",alt:"inside of an old brick house looking out the door onto a path leading to a bridge"},
central: {src:"biotama1.png",alt:"top down view of the mother tree and greenery"},
},
},
"htp":{
content: `<p>A game by Shrimp Squad Studios made for the Epic MegaJam!</p>
<p>One week to make a game and this is what we made! A game based on the movie Hackers.</p>
<p>Your goal is to hack the Gibson computer and collect the garbage file.
Which will then in turn let you <span class="bold">HACK THE PLANET!</span> </p>
<div class='cta-wrapper'><a class='cta' href='https://megsum.itch.io/hack-the-planet'> >> Try it out!</a></div>`,
images: {
left: {src:"htp1.png",alt:"visual puzzle with different colours"},
right: {src:"htp2.png",alt:"the player character standing surrounded by various text characters"},
central: {src:"htp3.png",alt:"top down camera view of a black screen with hex codes randomly placed"},
},
},
}

View File

@ -1,60 +0,0 @@
import { projects } from "./shrimpjects.js";
export function getProjectData(project){
const leftImage = document.getElementById("image-left");
const rightImage = document.getElementById("image-right");
const centralImage = document.getElementById("image-central");
const projectContent = document.getElementById("project-content");
const projectData = projects[project];
projectContent.innerHTML = projectData.content;
const assetPath = "assets/"
leftImage.src = assetPath + projectData.images.left.src;
leftImage.alt = "altleft";
rightImage.src = assetPath + projectData.images.right.src;
centralImage.src = assetPath + projectData.images.central.src;
return;
}
export function clearSelectedProjectClass() {
document.getElementById("biotama").classList.remove("selected-project");
document.getElementById("htp").classList.remove("selected-project");
}
export function createShrimpFooter() {
const footer = document.getElementById("shrimp-gif");
footer.innerHTML = "<img src='./assets/dance-shrimp-dance.gif' alt='a shrimp dancing'>".repeat(10);
}
export function itsRainingShrimp() {
const shrimpyRain = document.getElementById("shrimply-the-rain");
// push shrimp rain to the front. It's basically an overlay
shrimpyRain.style.zIndex = 2;
var increment = 0;
var drops = "";
// maxWidthToShrimp is set based on image size so not to overflow
const maxWidthToShrimp = 83;
while (increment < maxWidthToShrimp) {
// how much you want shrimp to cover
var randomTwoHundo = (Math.floor(Math.random() * 200));
drops += '<img src="assets/shrimp.png" style="'
+ 'left: ' + increment
+ '%; bottom: ' + (randomTwoHundo) + '%;" />'
increment++;
}
shrimpyRain.innerHTML = drops;
// wait until after the animation plays to make the shrimp disappear 🪄
setTimeout(() => {
shrimpyRain.style.zIndex = -1;
shrimpyRain.innerHTML = "";
}, 2950);
}

View File

@ -1,34 +0,0 @@
import {
getProjectData,
clearSelectedProjectClass,
createShrimpFooter,
itsRainingShrimp
} from "./shrimple-functions.js";
const biotamaBtn = document.getElementById("biotama");
const htpBtn = document.getElementById("htp");
const seafoodBtn = document.getElementById("seafoodDelightsBtn");
document.addEventListener("DOMContentLoaded", function(event) {
biotamaBtn.click();
createShrimpFooter();
});
biotamaBtn.addEventListener("click", function() {
clearSelectedProjectClass();
this.classList.add("selected-project");
getProjectData("biotama");
});
htpBtn.addEventListener("click", function() {
clearSelectedProjectClass();
this.classList.add("selected-project");
getProjectData("htp");
});
seafoodBtn.addEventListener("click", function() {
itsRainingShrimp();
})
export {getProjectData, itsRainingShrimp}

View File

@ -1,201 +0,0 @@
body {
cursor: url("assets/shrimp_cursor.png"), auto;
--space-shrimp-blue: #2C2C54;
--cherry-shrimp: #A40E4C;
--ashy-shrimp: #ACC3A6;
--apricot-shrimp: #F5D6BA;
--tangerine-dream-shrimp: #F49D6E;
color: var(--space-shrimp-blue);
background: repeat url(assets/shrimp-tile.png);
background-size: 50px;
margin: 0 20px;
}
.we-are-shrimp-squad {
width:100%;
height: 50%;
background-color: var(--tangerine-dream-shrimp);
font-size:30px;
display:flex;
align-items: center;
justify-content: center;
gap: 30px;
}
.we-are-shrimp-squad img {
height:10%;
width: 10%;
}
.flip {
transform: scaleX(-1);
}
.shrimp-hero {
max-width:100%;
height:auto;
background-color: var(--apricot-shrimp);
display:flex;
align-items: center;
justify-content: center;
width:100%;
}
.shrimp-hero img {
max-width:100%;
height:auto;
vertical-align: top;
}
.shrimp-hero div.inside-container, .shrimp-info {
background-color: var(--cherry-shrimp);
padding:10px;
}
.shrimp-hero button, .shrimp-info button{
border-radius: 10px;
background-color: var(--space-shrimp-blue);
color: var(--tangerine-dream-shrimp);
padding:10px;
margin-top:10px;
width: 100%;
cursor: unset;
}
.shrimp-project-list {
padding: 10px 0;
display: flex;
gap: 20px;
justify-content: space-evenly;
border-image: url("./assets/waves-border.png") 27 fill / 35px / 25px 0 0 0 round;
position:relative;
color: var(--tangerine-dream-shrimp);
font-size: 24px;
}
.shrimp-project-list div:hover {
text-decoration: underline overline var(--ashy-shrimp);
}
.selected-project{
text-shadow: 4px 3px 0 var(--cherry-shrimp);
}
#shrimp-project-content {
display: flex;
flex-direction: column;
align-items: center;
width: 100%;
margin-top: 10px;
}
#shrimp-project-content .upper{
display: flex;
justify-content: space-between;
gap: 10px;
}
#shrimp-project-content .upper > * {
flex-basis: 32%;
}
#shrimp-project-content .upper > div{
background-color:var(--tangerine-dream-shrimp);
padding: 0 10px;
}
#shrimp-project-content .smol-image{
width: 30%;
}
#shrimp-project-content #image-central {
width: inherit;
margin-top: 15px;
}
#shrimp-gif {
display: flex;
flex-flow: row wrap;
}
#shrimp-gif > * {
width:50%;
}
#project-content{
display:flex;
flex-flow:column;
margin-top: 0;
margin-bottom: 0;
justify-content: space-between;
}
@media screen and (orientation: portrait) {
#shrimp-project-content .upper{
flex-direction: column;
gap: 15px;
}
#shrimp-project-content .smol-image{
width: 100%;
}
p {
font-size: 16px;
}
h1{
font-size: 32px;
}
}
.bold {
font-weight: bold;
}
/* buttons */
.cta-wrapper{
margin:16px 0;
background-color: var(--space-shrimp-blue);
border-radius: 5px;
padding:15px;
width:fit-content;
}
.cta-wrapper .cta {
text-decoration: none;
border-right: 2px solid var(--ashy-shrimp);
color: var(--ashy-shrimp);
font-size: 24px;
animation: blink-border .75s step-end infinite;
}
@keyframes blink-border {
from, to { border-color: transparent }
50% { border-color: var(--ashy-shrimp); }
}
/* end buttons */
/* shrimp rain animation */
#shrimply-the-rain {
height:100%;
width:100%;
overflow: hidden;
position:fixed;
z-index: -1;
}
#shrimply-the-rain > img {
animation: RainDown 3s linear 1;
position:absolute;
width:15%;
}
@keyframes RainDown {
0% {
transform: translateY(0);
}
100% {
transform: translateY(200vh);
}
}
/* end shrimp rain animation */