framework-version #1
36
README.md
@ -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.
|
||||||
28
app/components/banner/banner.tsx
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 355 KiB After Width: | Height: | Size: 355 KiB |
|
Before Width: | Height: | Size: 2.0 MiB After Width: | Height: | Size: 2.0 MiB |
17
app/components/hero-shrimp/hero-shrimp.tsx
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
41
app/components/seafood-delights/seafood-button.tsx
Normal 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
|
||||||
16
app/components/seafood-delights/seafood-delights.tsx
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
32
app/components/seafood-delights/shrimp-rain.tsx
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
BIN
app/components/seafood-delights/shrimp.png
Normal file
|
After Width: | Height: | Size: 355 KiB |
@ -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 |
BIN
app/components/shrimp-feet/assets/LI-In-Bug.png
Normal file
|
After Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 14 MiB After Width: | Height: | Size: 14 MiB |
BIN
app/components/shrimp-feet/assets/mediawiki.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
app/components/shrimp-feet/assets/shrimp.png
Normal file
|
After Width: | Height: | Size: 355 KiB |
@ -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
|
||||||
82
app/components/shrimp-feet/shrimp-feet.tsx
Normal 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
|
||||||
6
app/components/shrimp-projects/project-content/index.tsx
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import ProjectContent from "./project-content";
|
||||||
|
import { ProjectImageProps, ProjectContentProps } from "../types";
|
||||||
|
|
||||||
|
export { ProjectContent };
|
||||||
|
|
||||||
|
export type { ProjectImageProps, ProjectContentProps };
|
||||||
@ -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>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -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>
|
||||||
|
);
|
||||||
|
}
|
||||||
29
app/components/shrimp-projects/project-descriptions/htp.tsx
Normal 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"
|
||||||
|
>
|
||||||
|
>> Try it out!
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
31
app/components/shrimp-projects/project-list/project-list.tsx
Normal 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
|
||||||
35
app/components/shrimp-projects/shrimp-projects.tsx
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
25
app/components/shrimp-projects/types.tsx
Normal 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;
|
||||||
|
};
|
||||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
53
app/globals.css
Normal 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
@ -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>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 4.7 MiB After Width: | Height: | Size: 4.7 MiB |
|
Before Width: | Height: | Size: 3.2 MiB After Width: | Height: | Size: 3.2 MiB |
|
Before Width: | Height: | Size: 2.4 MiB After Width: | Height: | Size: 2.4 MiB |
|
Before Width: | Height: | Size: 983 KiB After Width: | Height: | Size: 983 KiB |
|
Before Width: | Height: | Size: 950 KiB After Width: | Height: | Size: 950 KiB |
|
Before Width: | Height: | Size: 242 KiB After Width: | Height: | Size: 242 KiB |
17
app/lib/project-content/getShrimps.tsx
Normal 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,
|
||||||
|
}));
|
||||||
|
}
|
||||||
74
app/lib/project-content/shrimpjects.tsx
Normal 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
|
||||||
|
Before Width: | Height: | Size: 888 B After Width: | Height: | Size: 888 B |
26
app/page.tsx
Normal 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
|
||||||
|
*/
|
||||||
|
Before Width: | Height: | Size: 15 KiB |
59
index.html
@ -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
|
|
||||||
-->
|
|
||||||
@ -19,6 +19,7 @@
|
|||||||
"@types/react-dom": "^19",
|
"@types/react-dom": "^19",
|
||||||
"eslint": "^9",
|
"eslint": "^9",
|
||||||
"eslint-config-next": "16.2.4",
|
"eslint-config-next": "16.2.4",
|
||||||
|
"prettier": "3.8.3",
|
||||||
"tailwindcss": "^4",
|
"tailwindcss": "^4",
|
||||||
"typescript": "^5"
|
"typescript": "^5"
|
||||||
}
|
}
|
||||||
@ -5487,6 +5488,22 @@
|
|||||||
"node": ">= 0.8.0"
|
"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": {
|
"node_modules/prop-types": {
|
||||||
"version": "15.8.1",
|
"version": "15.8.1",
|
||||||
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
|
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
|
||||||
@ -20,6 +20,7 @@
|
|||||||
"@types/react-dom": "^19",
|
"@types/react-dom": "^19",
|
||||||
"eslint": "^9",
|
"eslint": "^9",
|
||||||
"eslint-config-next": "16.2.4",
|
"eslint-config-next": "16.2.4",
|
||||||
|
"prettier": "3.8.3",
|
||||||
"tailwindcss": "^4",
|
"tailwindcss": "^4",
|
||||||
"typescript": "^5"
|
"typescript": "^5"
|
||||||
}
|
}
|
||||||
10
prettier.config.ts
Normal 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;
|
||||||
|
After Width: | Height: | Size: 391 B |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 128 B |
|
After Width: | Height: | Size: 385 B |
@ -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.
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
@ -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>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -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>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -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"},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@ -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);
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -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}
|
|
||||||
@ -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 */
|
|
||||||