enzostvs HF staff commited on
Commit
b10df03
1 Parent(s): e5f9c03

initial commit

Browse files
Dockerfile ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Dockerfile
2
+
3
+ # Use an official Node.js runtime as the base image
4
+ FROM node:18
5
+
6
+ # Set the working directory in the container
7
+ WORKDIR /usr/src/app
8
+
9
+ # Copy package.json and package-lock.json to the container
10
+ COPY package.json package-lock.json ./
11
+
12
+ # Install dependencies
13
+ RUN npm install
14
+
15
+ # Copy the rest of the application files to the container
16
+ COPY . .
17
+
18
+ # Build the Next.js application for production
19
+ RUN npm run build
20
+
21
+ # Expose the application port (assuming your app runs on port 3000)
22
+ EXPOSE 3000
23
+
24
+ # Start the application
25
+ CMD ["npm", "start"]
README.md CHANGED
@@ -1,36 +1,14 @@
1
- This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
2
-
3
- ## Getting Started
4
-
5
- First, run the development server:
6
-
7
- ```bash
8
- npm run dev
9
- # or
10
- yarn dev
11
- # or
12
- pnpm dev
13
- # or
14
- bun dev
15
- ```
16
-
17
- Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18
-
19
- You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
20
-
21
- This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
22
-
23
- ## Learn More
24
-
25
- To learn more about Next.js, take a look at the following resources:
26
-
27
- - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28
- - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29
-
30
- You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
31
-
32
- ## Deploy on Vercel
33
-
34
- 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.
35
-
36
- Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
 
1
+ ---
2
+ title: — Zero GPU Spaces —
3
+ header: mini
4
+ short_description: List of spaces using ZERO-GPU
5
+ emoji: ⚡️
6
+ colorFrom: yellow
7
+ colorTo: green
8
+ sdk: docker
9
+ app_port: 3000
10
+ pinned: false
11
+ license: mit
12
+ ---
13
+
14
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/globals.css DELETED
@@ -1,33 +0,0 @@
1
- @tailwind base;
2
- @tailwind components;
3
- @tailwind utilities;
4
-
5
- :root {
6
- --foreground-rgb: 0, 0, 0;
7
- --background-start-rgb: 214, 219, 220;
8
- --background-end-rgb: 255, 255, 255;
9
- }
10
-
11
- @media (prefers-color-scheme: dark) {
12
- :root {
13
- --foreground-rgb: 255, 255, 255;
14
- --background-start-rgb: 0, 0, 0;
15
- --background-end-rgb: 0, 0, 0;
16
- }
17
- }
18
-
19
- body {
20
- color: rgb(var(--foreground-rgb));
21
- background: linear-gradient(
22
- to bottom,
23
- transparent,
24
- rgb(var(--background-end-rgb))
25
- )
26
- rgb(var(--background-start-rgb));
27
- }
28
-
29
- @layer utilities {
30
- .text-balance {
31
- text-wrap: balance;
32
- }
33
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/layout.tsx CHANGED
@@ -1,12 +1,11 @@
1
  import type { Metadata } from "next";
2
  import { Inter } from "next/font/google";
3
- import "./globals.css";
4
 
5
  const inter = Inter({ subsets: ["latin"] });
6
 
7
  export const metadata: Metadata = {
8
- title: "Create Next App",
9
- description: "Generated by create next app",
10
  };
11
 
12
  export default function RootLayout({
 
1
  import type { Metadata } from "next";
2
  import { Inter } from "next/font/google";
3
+ import "@/assets/globals.css";
4
 
5
  const inter = Inter({ subsets: ["latin"] });
6
 
7
  export const metadata: Metadata = {
8
+ title: "Zero GPU Spaces | Hugging Face",
 
9
  };
10
 
11
  export default function RootLayout({
app/page.tsx CHANGED
@@ -1,113 +1,41 @@
1
- import Image from "next/image";
 
 
 
2
 
3
- export default function Home() {
4
- return (
5
- <main className="flex min-h-screen flex-col items-center justify-between p-24">
6
- <div className="z-10 w-full max-w-5xl items-center justify-between font-mono text-sm lg:flex">
7
- <p className="fixed left-0 top-0 flex w-full justify-center border-b border-gray-300 bg-gradient-to-b from-zinc-200 pb-6 pt-8 backdrop-blur-2xl dark:border-neutral-800 dark:bg-zinc-800/30 dark:from-inherit lg:static lg:w-auto lg:rounded-xl lg:border lg:bg-gray-200 lg:p-4 lg:dark:bg-zinc-800/30">
8
- Get started by editing&nbsp;
9
- <code className="font-mono font-bold">app/page.tsx</code>
10
- </p>
11
- <div className="fixed bottom-0 left-0 flex h-48 w-full items-end justify-center bg-gradient-to-t from-white via-white dark:from-black dark:via-black lg:static lg:size-auto lg:bg-none">
12
- <a
13
- className="pointer-events-none flex place-items-center gap-2 p-8 lg:pointer-events-auto lg:p-0"
14
- href="https://vercel.com?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
15
- target="_blank"
16
- rel="noopener noreferrer"
17
- >
18
- By{" "}
19
- <Image
20
- src="/vercel.svg"
21
- alt="Vercel Logo"
22
- className="dark:invert"
23
- width={100}
24
- height={24}
25
- priority
26
- />
27
- </a>
28
- </div>
29
- </div>
30
-
31
- <div className="relative z-[-1] flex place-items-center before:absolute before:h-[300px] before:w-full before:-translate-x-1/2 before:rounded-full before:bg-gradient-radial before:from-white before:to-transparent before:blur-2xl before:content-[''] after:absolute after:-z-20 after:h-[180px] after:w-full after:translate-x-1/3 after:bg-gradient-conic after:from-sky-200 after:via-blue-200 after:blur-2xl after:content-[''] before:dark:bg-gradient-to-br before:dark:from-transparent before:dark:to-blue-700 before:dark:opacity-10 after:dark:from-sky-900 after:dark:via-[#0141ff] after:dark:opacity-40 sm:before:w-[480px] sm:after:w-[240px] before:lg:h-[360px]">
32
- <Image
33
- className="relative dark:drop-shadow-[0_0_0.3rem_#ffffff70] dark:invert"
34
- src="/next.svg"
35
- alt="Next.js Logo"
36
- width={180}
37
- height={37}
38
- priority
39
- />
40
- </div>
41
-
42
- <div className="mb-32 grid text-center lg:mb-0 lg:w-full lg:max-w-5xl lg:grid-cols-4 lg:text-left">
43
- <a
44
- href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
45
- className="group rounded-lg border border-transparent px-5 py-4 transition-colors hover:border-gray-300 hover:bg-gray-100 hover:dark:border-neutral-700 hover:dark:bg-neutral-800/30"
46
- target="_blank"
47
- rel="noopener noreferrer"
48
- >
49
- <h2 className="mb-3 text-2xl font-semibold">
50
- Docs{" "}
51
- <span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">
52
- -&gt;
53
- </span>
54
- </h2>
55
- <p className="m-0 max-w-[30ch] text-sm opacity-50">
56
- Find in-depth information about Next.js features and API.
57
- </p>
58
- </a>
59
-
60
- <a
61
- href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
62
- className="group rounded-lg border border-transparent px-5 py-4 transition-colors hover:border-gray-300 hover:bg-gray-100 hover:dark:border-neutral-700 hover:dark:bg-neutral-800/30"
63
- target="_blank"
64
- rel="noopener noreferrer"
65
- >
66
- <h2 className="mb-3 text-2xl font-semibold">
67
- Learn{" "}
68
- <span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">
69
- -&gt;
70
- </span>
71
- </h2>
72
- <p className="m-0 max-w-[30ch] text-sm opacity-50">
73
- Learn about Next.js in an interactive course with&nbsp;quizzes!
74
- </p>
75
- </a>
76
-
77
- <a
78
- href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
79
- className="group rounded-lg border border-transparent px-5 py-4 transition-colors hover:border-gray-300 hover:bg-gray-100 hover:dark:border-neutral-700 hover:dark:bg-neutral-800/30"
80
- target="_blank"
81
- rel="noopener noreferrer"
82
- >
83
- <h2 className="mb-3 text-2xl font-semibold">
84
- Templates{" "}
85
- <span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">
86
- -&gt;
87
- </span>
88
- </h2>
89
- <p className="m-0 max-w-[30ch] text-sm opacity-50">
90
- Explore starter templates for Next.js.
91
- </p>
92
- </a>
93
 
94
- <a
95
- href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
96
- className="group rounded-lg border border-transparent px-5 py-4 transition-colors hover:border-gray-300 hover:bg-gray-100 hover:dark:border-neutral-700 hover:dark:bg-neutral-800/30"
97
- target="_blank"
98
- rel="noopener noreferrer"
99
- >
100
- <h2 className="mb-3 text-2xl font-semibold">
101
- Deploy{" "}
102
- <span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">
103
- -&gt;
104
- </span>
105
- </h2>
106
- <p className="m-0 max-w-[30ch] text-balance text-sm opacity-50">
107
- Instantly deploy your Next.js site to a shareable URL with Vercel.
 
 
108
  </p>
109
- </a>
 
 
 
 
 
110
  </div>
111
- </main>
112
  );
113
  }
 
1
+ import { Space } from "@/components/space";
2
+ import { SpaceIcon } from "@/components/space_icon";
3
+ import { fetchAllPages } from "@/utils";
4
+ import { SpaceProps } from "@/utils/type";
5
 
6
+ async function getSpaces() {
7
+ try {
8
+ const response = await fetchAllPages();
9
+ return response as SpaceProps[];
10
+ } catch {
11
+ return [];
12
+ }
13
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
 
15
+ export default async function Home() {
16
+ const spaces = await getSpaces();
17
+ console.log(spaces);
18
+ return (
19
+ <section className="flex h-screen overflow-auto">
20
+ <div className="w-full container px-6 py-10 lg:py-20 mx-auto space-y-14">
21
+ <header className="max-w-4xl mx-auto w-full text-center">
22
+ <div className="mb-6 mx-auto font-regular text-xs text-center max-w-max rounded-full border-gray-200 bg-gray-50 border text-gray-700 px-3 py-2 transition-all duration-300">
23
+ <SpaceIcon className="inline-block w-4 h-4 mr-2 drop-shadow-lg" />
24
+ Browse {spaces.length} spaces
25
+ </div>
26
+ <h1 className="font-extrabold text-3xl text-black">
27
+ Zero GPU Spaces
28
+ </h1>
29
+ <p className="text-neutral-500 font-regular text-base">
30
+ Discover spaces with zero GPU usage on 🤗 Hugging Face Spaces.
31
  </p>
32
+ </header>
33
+ <div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4">
34
+ {spaces?.map((space: SpaceProps) => (
35
+ <Space key={space.id} space={space} />
36
+ ))}
37
+ </div>
38
  </div>
39
+ </section>
40
  );
41
  }
assets/globals.css ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ body {
6
+ @apply bg-gray-100 overflow-hidden;
7
+ }
8
+
9
+ @layer utilities {
10
+ .text-balance {
11
+ text-wrap: balance;
12
+ }
13
+ }
components/space.tsx ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import Image from "next/image";
2
+ import { TiHeartFullOutline } from "react-icons/ti";
3
+
4
+ import { SpaceProps } from "@/utils/type";
5
+ import Link from "next/link";
6
+
7
+ interface Props {
8
+ space: SpaceProps;
9
+ }
10
+ export const Space: React.FC<Props> = ({ space }) => {
11
+ return (
12
+ <Link
13
+ href={`https://huggingface.co/spaces/${space.id}`}
14
+ target="_blank"
15
+ className="bg-gray-50 border border-gray-200 px-6 py-4 rounded-xl transition-all duration-300 hover:ring-[4px] hover:ring-blue-500/10"
16
+ >
17
+ <header className="flex items-center justify-between gap-5">
18
+ <div>
19
+ <h2 className="font-semibold text-black">{space?.title}</h2>
20
+ {space.shortDescription && (
21
+ <p className="text-gray-500 text-xs mt-0.5 line-clamp-1">
22
+ {space.shortDescription}
23
+ </p>
24
+ )}
25
+ <div className="flex items-center justify-start gap-2 whitespace-pre-line mt-2">
26
+ <Image
27
+ src={
28
+ space.authorData.avatarUrl?.startsWith("/")
29
+ ? `https://huggingface.co${space.authorData.avatarUrl}`
30
+ : space.authorData.avatarUrl
31
+ }
32
+ alt={space.authorData.name}
33
+ width={24}
34
+ height={24}
35
+ className="rounded-full w-4 h-4"
36
+ />
37
+ <div>
38
+ <p className="text-gray-500 text-xs font-regular">
39
+ {space.authorData.name}
40
+ </p>
41
+ </div>
42
+ </div>
43
+ </div>
44
+ <div className="space-y-3 flex flex-col items-end">
45
+ <div
46
+ className="rounded-full truncate min-w-[2.5rem] min-h-[2.5rem] max-w-[2.5rem] max-h-[2.5rem] overflow-hidden flex items-center justify-center bg-gradient-to-br from-blue-500 to-red-500 border-[2px] border-white ring-1 ring-gray-200"
47
+ style={{
48
+ // @ts-ignore
49
+ "--tw-gradient-from": `${space.colorFrom} var(--tw-gradient-to-position)`,
50
+ "--tw-gradient-to": space.colorTo,
51
+ }}
52
+ >
53
+ {space?.emoji && (
54
+ <p className="text-xl">
55
+ {/* keep only 1 char */}
56
+ {space.emoji}
57
+ </p>
58
+ )}
59
+ </div>
60
+ <div className="flex items-center max-w-max rounded-full px-1.5 py-1 text-sm bg-gray-100/80 border border-gray-200 text-gray-600">
61
+ <TiHeartFullOutline className="w-5" />
62
+ <p className="text-gray-500 text-xs font-regular">{space.likes}</p>
63
+ </div>
64
+ </div>
65
+ </header>
66
+ </Link>
67
+ );
68
+ };
components/space_icon.tsx ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export const SpaceIcon = ({ className }: { className?: string }) => {
2
+ return (
3
+ <svg
4
+ className={className}
5
+ xmlns="http://www.w3.org/2000/svg"
6
+ focusable="false"
7
+ role="img"
8
+ width="1em"
9
+ height="1em"
10
+ preserveAspectRatio="xMidYMid meet"
11
+ viewBox="0 0 39 40"
12
+ >
13
+ <path
14
+ d="M6.3712 2.04427C3.7183 2.04427 1.56771 4.19486 1.56771 6.84776V18.3546V18.6544V32.7341C1.56771 35.3868 3.71818 37.5377 6.3712 37.5377H17.878H20.7507H32.2575C34.9104 37.5377 37.0612 35.387 37.0612 32.7341V21.6204C37.0612 20.177 36.4252 18.8839 35.4189 18.004C36.4576 16.3895 37.0612 14.4666 37.0612 12.4046C37.0612 6.68274 32.4225 2.04427 26.7007 2.04427C24.6388 2.04427 22.7159 2.64776 21.1014 3.68647C20.2214 2.6802 18.9282 2.04427 17.4849 2.04427H6.3712Z"
15
+ fill="black"
16
+ className="stroke-white"
17
+ strokeWidth="3.07552"
18
+ />
19
+ <path
20
+ d="M9.56855 23.5001C8.8406 23.5001 8.25047 24.0902 8.25047 24.8182V29.5361C8.25047 30.2641 8.8406 30.8542 9.56855 30.8542H14.2864C15.0144 30.8542 15.6045 30.2641 15.6045 29.5361V24.8182C15.6045 24.0902 15.0143 23.5001 14.2864 23.5001H9.56855Z"
21
+ fill="#FF3270"
22
+ />
23
+ <path
24
+ d="M24.3409 23.5001C23.613 23.5001 23.0228 24.0902 23.0228 24.8182V29.5361C23.0228 30.2641 23.613 30.8542 24.3409 30.8542H29.0588C29.7868 30.8542 30.3769 30.2641 30.3769 29.5361V24.8182C30.3769 24.0902 29.7868 23.5001 29.0588 23.5001H24.3409Z"
25
+ fill="#861FFF"
26
+ />
27
+ <path
28
+ d="M9.56855 8.72815C8.8406 8.72815 8.25047 9.31827 8.25047 10.0462V14.7641C8.25047 15.4921 8.8406 16.0822 9.56855 16.0822H14.2864C15.0144 16.0822 15.6045 15.4921 15.6045 14.7641V10.0462C15.6045 9.31827 15.0143 8.72815 14.2864 8.72815H9.56855Z"
29
+ fill="#097EFF"
30
+ />
31
+ <path
32
+ d="M26.6999 8.72815C24.6692 8.72815 23.0228 10.3744 23.0228 12.4052C23.0228 14.4359 24.6692 16.0822 26.6999 16.0822C28.7306 16.0822 30.3769 14.4359 30.3769 12.4052C30.3769 10.3744 28.7306 8.72815 26.6999 8.72815Z"
33
+ fill="#FFD702"
34
+ />
35
+ </svg>
36
+ );
37
+ };
next.config.mjs CHANGED
@@ -1,4 +1,25 @@
1
  /** @type {import('next').NextConfig} */
2
- const nextConfig = {};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
  export default nextConfig;
 
1
  /** @type {import('next').NextConfig} */
2
+ const nextConfig = {
3
+ images: {
4
+ remotePatterns: [
5
+ {
6
+ protocol: "https",
7
+ hostname: "huggingface.co",
8
+ },
9
+ {
10
+ protocol: "https",
11
+ hostname: "aeiljuispo.cloudimg.io",
12
+ },
13
+ {
14
+ protocol: "https",
15
+ hostname: "cdn-avatars.huggingface.co",
16
+ },
17
+ {
18
+ protocol: "https",
19
+ hostname: "www.gravatar.com",
20
+ },
21
+ ],
22
+ },
23
+ };
24
 
25
  export default nextConfig;
package-lock.json CHANGED
@@ -8,9 +8,12 @@
8
  "name": "zero-gpu-spaces",
9
  "version": "0.1.0",
10
  "dependencies": {
 
11
  "next": "14.2.3",
12
  "react": "^18",
13
- "react-dom": "^18"
 
 
14
  },
15
  "devDependencies": {
16
  "@types/node": "^20",
@@ -39,7 +42,6 @@
39
  "version": "7.24.4",
40
  "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz",
41
  "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==",
42
- "dev": true,
43
  "dependencies": {
44
  "regenerator-runtime": "^0.14.0"
45
  },
@@ -215,8 +217,7 @@
215
  "node_modules/@jridgewell/sourcemap-codec": {
216
  "version": "1.4.15",
217
  "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
218
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
219
- "dev": true
220
  },
221
  "node_modules/@jridgewell/trace-mapping": {
222
  "version": "0.3.25",
@@ -442,6 +443,11 @@
442
  "tslib": "^2.4.0"
443
  }
444
  },
 
 
 
 
 
445
  "node_modules/@types/json5": {
446
  "version": "0.0.29",
447
  "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
@@ -615,6 +621,11 @@
615
  "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
616
  "dev": true
617
  },
 
 
 
 
 
618
  "node_modules/acorn": {
619
  "version": "8.11.3",
620
  "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
@@ -1082,6 +1093,11 @@
1082
  "node": ">= 6"
1083
  }
1084
  },
 
 
 
 
 
1085
  "node_modules/client-only": {
1086
  "version": "0.0.1",
1087
  "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
@@ -1120,6 +1136,14 @@
1120
  "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
1121
  "dev": true
1122
  },
 
 
 
 
 
 
 
 
1123
  "node_modules/cross-spawn": {
1124
  "version": "7.0.3",
1125
  "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -1134,6 +1158,26 @@
1134
  "node": ">= 8"
1135
  }
1136
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1137
  "node_modules/cssesc": {
1138
  "version": "3.0.0",
1139
  "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
@@ -1149,8 +1193,7 @@
1149
  "node_modules/csstype": {
1150
  "version": "3.1.3",
1151
  "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
1152
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
1153
- "dev": true
1154
  },
1155
  "node_modules/damerau-levenshtein": {
1156
  "version": "1.0.8",
@@ -1336,6 +1379,14 @@
1336
  "node": ">=10.13.0"
1337
  }
1338
  },
 
 
 
 
 
 
 
 
1339
  "node_modules/es-abstract": {
1340
  "version": "1.23.3",
1341
  "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
@@ -1921,8 +1972,7 @@
1921
  "node_modules/fast-deep-equal": {
1922
  "version": "3.1.3",
1923
  "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1924
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
1925
- "dev": true
1926
  },
1927
  "node_modules/fast-glob": {
1928
  "version": "3.3.2",
@@ -1964,6 +2014,21 @@
1964
  "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
1965
  "dev": true
1966
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1967
  "node_modules/fastq": {
1968
  "version": "1.17.1",
1969
  "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
@@ -2374,6 +2439,11 @@
2374
  "node": ">= 0.4"
2375
  }
2376
  },
 
 
 
 
 
2377
  "node_modules/ignore": {
2378
  "version": "5.3.1",
2379
  "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
@@ -2424,6 +2494,15 @@
2424
  "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
2425
  "dev": true
2426
  },
 
 
 
 
 
 
 
 
 
2427
  "node_modules/internal-slot": {
2428
  "version": "1.0.7",
2429
  "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
@@ -2857,6 +2936,11 @@
2857
  "jiti": "bin/jiti.js"
2858
  }
2859
  },
 
 
 
 
 
2860
  "node_modules/js-tokens": {
2861
  "version": "4.0.0",
2862
  "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -3015,6 +3099,11 @@
3015
  "node": "14 || >=16.14"
3016
  }
3017
  },
 
 
 
 
 
3018
  "node_modules/merge2": {
3019
  "version": "1.4.1",
3020
  "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -3084,6 +3173,25 @@
3084
  "thenify-all": "^1.0.0"
3085
  }
3086
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3087
  "node_modules/nanoid": {
3088
  "version": "3.3.7",
3089
  "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
@@ -3717,12 +3825,54 @@
3717
  "react": "^18.3.1"
3718
  }
3719
  },
 
 
 
 
 
 
 
 
3720
  "node_modules/react-is": {
3721
  "version": "16.13.1",
3722
  "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
3723
  "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
3724
  "dev": true
3725
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3726
  "node_modules/read-cache": {
3727
  "version": "1.0.0",
3728
  "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -3768,8 +3918,7 @@
3768
  "node_modules/regenerator-runtime": {
3769
  "version": "0.14.1",
3770
  "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
3771
- "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
3772
- "dev": true
3773
  },
3774
  "node_modules/regexp.prototype.flags": {
3775
  "version": "1.5.2",
@@ -3789,6 +3938,11 @@
3789
  "url": "https://github.com/sponsors/ljharb"
3790
  }
3791
  },
 
 
 
 
 
3792
  "node_modules/resolve": {
3793
  "version": "1.22.8",
3794
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
@@ -3869,6 +4023,14 @@
3869
  "url": "https://github.com/sponsors/isaacs"
3870
  }
3871
  },
 
 
 
 
 
 
 
 
3872
  "node_modules/run-parallel": {
3873
  "version": "1.2.0",
3874
  "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -3935,6 +4097,17 @@
3935
  "loose-envify": "^1.1.0"
3936
  }
3937
  },
 
 
 
 
 
 
 
 
 
 
 
3938
  "node_modules/semver": {
3939
  "version": "7.6.0",
3940
  "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
@@ -3994,6 +4167,14 @@
3994
  "node": ">= 0.4"
3995
  }
3996
  },
 
 
 
 
 
 
 
 
3997
  "node_modules/shebang-command": {
3998
  "version": "2.0.0",
3999
  "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -4054,6 +4235,14 @@
4054
  "node": ">=8"
4055
  }
4056
  },
 
 
 
 
 
 
 
 
4057
  "node_modules/source-map-js": {
4058
  "version": "1.2.0",
4059
  "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
@@ -4062,6 +4251,46 @@
4062
  "node": ">=0.10.0"
4063
  }
4064
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4065
  "node_modules/streamsearch": {
4066
  "version": "1.1.0",
4067
  "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
@@ -4278,6 +4507,11 @@
4278
  }
4279
  }
4280
  },
 
 
 
 
 
4281
  "node_modules/sucrase": {
4282
  "version": "3.35.0",
4283
  "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
@@ -4397,6 +4631,14 @@
4397
  "node": ">=0.8"
4398
  }
4399
  },
 
 
 
 
 
 
 
 
4400
  "node_modules/to-regex-range": {
4401
  "version": "5.0.1",
4402
  "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -4409,6 +4651,11 @@
4409
  "node": ">=8.0"
4410
  }
4411
  },
 
 
 
 
 
4412
  "node_modules/ts-api-utils": {
4413
  "version": "1.3.0",
4414
  "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
@@ -4421,6 +4668,11 @@
4421
  "typescript": ">=4.2.0"
4422
  }
4423
  },
 
 
 
 
 
4424
  "node_modules/ts-interface-checker": {
4425
  "version": "0.1.13",
4426
  "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
 
8
  "name": "zero-gpu-spaces",
9
  "version": "0.1.0",
10
  "dependencies": {
11
+ "classnames": "^2.5.1",
12
  "next": "14.2.3",
13
  "react": "^18",
14
+ "react-dom": "^18",
15
+ "react-icons": "^5.1.0",
16
+ "react-use": "^17.5.0"
17
  },
18
  "devDependencies": {
19
  "@types/node": "^20",
 
42
  "version": "7.24.4",
43
  "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz",
44
  "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==",
 
45
  "dependencies": {
46
  "regenerator-runtime": "^0.14.0"
47
  },
 
217
  "node_modules/@jridgewell/sourcemap-codec": {
218
  "version": "1.4.15",
219
  "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
220
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
 
221
  },
222
  "node_modules/@jridgewell/trace-mapping": {
223
  "version": "0.3.25",
 
443
  "tslib": "^2.4.0"
444
  }
445
  },
446
+ "node_modules/@types/js-cookie": {
447
+ "version": "2.2.7",
448
+ "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz",
449
+ "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA=="
450
+ },
451
  "node_modules/@types/json5": {
452
  "version": "0.0.29",
453
  "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
 
621
  "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
622
  "dev": true
623
  },
624
+ "node_modules/@xobotyi/scrollbar-width": {
625
+ "version": "1.9.5",
626
+ "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz",
627
+ "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ=="
628
+ },
629
  "node_modules/acorn": {
630
  "version": "8.11.3",
631
  "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
 
1093
  "node": ">= 6"
1094
  }
1095
  },
1096
+ "node_modules/classnames": {
1097
+ "version": "2.5.1",
1098
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
1099
+ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
1100
+ },
1101
  "node_modules/client-only": {
1102
  "version": "0.0.1",
1103
  "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
 
1136
  "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
1137
  "dev": true
1138
  },
1139
+ "node_modules/copy-to-clipboard": {
1140
+ "version": "3.3.3",
1141
+ "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
1142
+ "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
1143
+ "dependencies": {
1144
+ "toggle-selection": "^1.0.6"
1145
+ }
1146
+ },
1147
  "node_modules/cross-spawn": {
1148
  "version": "7.0.3",
1149
  "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
 
1158
  "node": ">= 8"
1159
  }
1160
  },
1161
+ "node_modules/css-in-js-utils": {
1162
+ "version": "3.1.0",
1163
+ "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz",
1164
+ "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==",
1165
+ "dependencies": {
1166
+ "hyphenate-style-name": "^1.0.3"
1167
+ }
1168
+ },
1169
+ "node_modules/css-tree": {
1170
+ "version": "1.1.3",
1171
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
1172
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
1173
+ "dependencies": {
1174
+ "mdn-data": "2.0.14",
1175
+ "source-map": "^0.6.1"
1176
+ },
1177
+ "engines": {
1178
+ "node": ">=8.0.0"
1179
+ }
1180
+ },
1181
  "node_modules/cssesc": {
1182
  "version": "3.0.0",
1183
  "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
 
1193
  "node_modules/csstype": {
1194
  "version": "3.1.3",
1195
  "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
1196
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
 
1197
  },
1198
  "node_modules/damerau-levenshtein": {
1199
  "version": "1.0.8",
 
1379
  "node": ">=10.13.0"
1380
  }
1381
  },
1382
+ "node_modules/error-stack-parser": {
1383
+ "version": "2.1.4",
1384
+ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
1385
+ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
1386
+ "dependencies": {
1387
+ "stackframe": "^1.3.4"
1388
+ }
1389
+ },
1390
  "node_modules/es-abstract": {
1391
  "version": "1.23.3",
1392
  "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
 
1972
  "node_modules/fast-deep-equal": {
1973
  "version": "3.1.3",
1974
  "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1975
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
 
1976
  },
1977
  "node_modules/fast-glob": {
1978
  "version": "3.3.2",
 
2014
  "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
2015
  "dev": true
2016
  },
2017
+ "node_modules/fast-loops": {
2018
+ "version": "1.1.3",
2019
+ "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.3.tgz",
2020
+ "integrity": "sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g=="
2021
+ },
2022
+ "node_modules/fast-shallow-equal": {
2023
+ "version": "1.0.0",
2024
+ "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz",
2025
+ "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw=="
2026
+ },
2027
+ "node_modules/fastest-stable-stringify": {
2028
+ "version": "2.0.2",
2029
+ "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz",
2030
+ "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q=="
2031
+ },
2032
  "node_modules/fastq": {
2033
  "version": "1.17.1",
2034
  "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
 
2439
  "node": ">= 0.4"
2440
  }
2441
  },
2442
+ "node_modules/hyphenate-style-name": {
2443
+ "version": "1.0.4",
2444
+ "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz",
2445
+ "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ=="
2446
+ },
2447
  "node_modules/ignore": {
2448
  "version": "5.3.1",
2449
  "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
 
2494
  "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
2495
  "dev": true
2496
  },
2497
+ "node_modules/inline-style-prefixer": {
2498
+ "version": "7.0.0",
2499
+ "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.0.tgz",
2500
+ "integrity": "sha512-I7GEdScunP1dQ6IM2mQWh6v0mOYdYmH3Bp31UecKdrcUgcURTcctSe1IECdUznSHKSmsHtjrT3CwCPI1pyxfUQ==",
2501
+ "dependencies": {
2502
+ "css-in-js-utils": "^3.1.0",
2503
+ "fast-loops": "^1.1.3"
2504
+ }
2505
+ },
2506
  "node_modules/internal-slot": {
2507
  "version": "1.0.7",
2508
  "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
 
2936
  "jiti": "bin/jiti.js"
2937
  }
2938
  },
2939
+ "node_modules/js-cookie": {
2940
+ "version": "2.2.1",
2941
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
2942
+ "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="
2943
+ },
2944
  "node_modules/js-tokens": {
2945
  "version": "4.0.0",
2946
  "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
 
3099
  "node": "14 || >=16.14"
3100
  }
3101
  },
3102
+ "node_modules/mdn-data": {
3103
+ "version": "2.0.14",
3104
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
3105
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
3106
+ },
3107
  "node_modules/merge2": {
3108
  "version": "1.4.1",
3109
  "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
 
3173
  "thenify-all": "^1.0.0"
3174
  }
3175
  },
3176
+ "node_modules/nano-css": {
3177
+ "version": "5.6.1",
3178
+ "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.6.1.tgz",
3179
+ "integrity": "sha512-T2Mhc//CepkTa3X4pUhKgbEheJHYAxD0VptuqFhDbGMUWVV2m+lkNiW/Ieuj35wrfC8Zm0l7HvssQh7zcEttSw==",
3180
+ "dependencies": {
3181
+ "@jridgewell/sourcemap-codec": "^1.4.15",
3182
+ "css-tree": "^1.1.2",
3183
+ "csstype": "^3.1.2",
3184
+ "fastest-stable-stringify": "^2.0.2",
3185
+ "inline-style-prefixer": "^7.0.0",
3186
+ "rtl-css-js": "^1.16.1",
3187
+ "stacktrace-js": "^2.0.2",
3188
+ "stylis": "^4.3.0"
3189
+ },
3190
+ "peerDependencies": {
3191
+ "react": "*",
3192
+ "react-dom": "*"
3193
+ }
3194
+ },
3195
  "node_modules/nanoid": {
3196
  "version": "3.3.7",
3197
  "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
 
3825
  "react": "^18.3.1"
3826
  }
3827
  },
3828
+ "node_modules/react-icons": {
3829
+ "version": "5.1.0",
3830
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.1.0.tgz",
3831
+ "integrity": "sha512-D3zug1270S4hbSlIRJ0CUS97QE1yNNKDjzQe3HqY0aefp2CBn9VgzgES27sRR2gOvFK+0CNx/BW0ggOESp6fqQ==",
3832
+ "peerDependencies": {
3833
+ "react": "*"
3834
+ }
3835
+ },
3836
  "node_modules/react-is": {
3837
  "version": "16.13.1",
3838
  "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
3839
  "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
3840
  "dev": true
3841
  },
3842
+ "node_modules/react-universal-interface": {
3843
+ "version": "0.6.2",
3844
+ "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz",
3845
+ "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==",
3846
+ "peerDependencies": {
3847
+ "react": "*",
3848
+ "tslib": "*"
3849
+ }
3850
+ },
3851
+ "node_modules/react-use": {
3852
+ "version": "17.5.0",
3853
+ "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.5.0.tgz",
3854
+ "integrity": "sha512-PbfwSPMwp/hoL847rLnm/qkjg3sTRCvn6YhUZiHaUa3FA6/aNoFX79ul5Xt70O1rK+9GxSVqkY0eTwMdsR/bWg==",
3855
+ "dependencies": {
3856
+ "@types/js-cookie": "^2.2.6",
3857
+ "@xobotyi/scrollbar-width": "^1.9.5",
3858
+ "copy-to-clipboard": "^3.3.1",
3859
+ "fast-deep-equal": "^3.1.3",
3860
+ "fast-shallow-equal": "^1.0.0",
3861
+ "js-cookie": "^2.2.1",
3862
+ "nano-css": "^5.6.1",
3863
+ "react-universal-interface": "^0.6.2",
3864
+ "resize-observer-polyfill": "^1.5.1",
3865
+ "screenfull": "^5.1.0",
3866
+ "set-harmonic-interval": "^1.0.1",
3867
+ "throttle-debounce": "^3.0.1",
3868
+ "ts-easing": "^0.2.0",
3869
+ "tslib": "^2.1.0"
3870
+ },
3871
+ "peerDependencies": {
3872
+ "react": "*",
3873
+ "react-dom": "*"
3874
+ }
3875
+ },
3876
  "node_modules/read-cache": {
3877
  "version": "1.0.0",
3878
  "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
 
3918
  "node_modules/regenerator-runtime": {
3919
  "version": "0.14.1",
3920
  "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
3921
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
 
3922
  },
3923
  "node_modules/regexp.prototype.flags": {
3924
  "version": "1.5.2",
 
3938
  "url": "https://github.com/sponsors/ljharb"
3939
  }
3940
  },
3941
+ "node_modules/resize-observer-polyfill": {
3942
+ "version": "1.5.1",
3943
+ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
3944
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
3945
+ },
3946
  "node_modules/resolve": {
3947
  "version": "1.22.8",
3948
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
 
4023
  "url": "https://github.com/sponsors/isaacs"
4024
  }
4025
  },
4026
+ "node_modules/rtl-css-js": {
4027
+ "version": "1.16.1",
4028
+ "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz",
4029
+ "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==",
4030
+ "dependencies": {
4031
+ "@babel/runtime": "^7.1.2"
4032
+ }
4033
+ },
4034
  "node_modules/run-parallel": {
4035
  "version": "1.2.0",
4036
  "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
 
4097
  "loose-envify": "^1.1.0"
4098
  }
4099
  },
4100
+ "node_modules/screenfull": {
4101
+ "version": "5.2.0",
4102
+ "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz",
4103
+ "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==",
4104
+ "engines": {
4105
+ "node": ">=0.10.0"
4106
+ },
4107
+ "funding": {
4108
+ "url": "https://github.com/sponsors/sindresorhus"
4109
+ }
4110
+ },
4111
  "node_modules/semver": {
4112
  "version": "7.6.0",
4113
  "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
 
4167
  "node": ">= 0.4"
4168
  }
4169
  },
4170
+ "node_modules/set-harmonic-interval": {
4171
+ "version": "1.0.1",
4172
+ "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz",
4173
+ "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==",
4174
+ "engines": {
4175
+ "node": ">=6.9"
4176
+ }
4177
+ },
4178
  "node_modules/shebang-command": {
4179
  "version": "2.0.0",
4180
  "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
 
4235
  "node": ">=8"
4236
  }
4237
  },
4238
+ "node_modules/source-map": {
4239
+ "version": "0.6.1",
4240
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
4241
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
4242
+ "engines": {
4243
+ "node": ">=0.10.0"
4244
+ }
4245
+ },
4246
  "node_modules/source-map-js": {
4247
  "version": "1.2.0",
4248
  "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
 
4251
  "node": ">=0.10.0"
4252
  }
4253
  },
4254
+ "node_modules/stack-generator": {
4255
+ "version": "2.0.10",
4256
+ "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz",
4257
+ "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==",
4258
+ "dependencies": {
4259
+ "stackframe": "^1.3.4"
4260
+ }
4261
+ },
4262
+ "node_modules/stackframe": {
4263
+ "version": "1.3.4",
4264
+ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
4265
+ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="
4266
+ },
4267
+ "node_modules/stacktrace-gps": {
4268
+ "version": "3.1.2",
4269
+ "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz",
4270
+ "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==",
4271
+ "dependencies": {
4272
+ "source-map": "0.5.6",
4273
+ "stackframe": "^1.3.4"
4274
+ }
4275
+ },
4276
+ "node_modules/stacktrace-gps/node_modules/source-map": {
4277
+ "version": "0.5.6",
4278
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
4279
+ "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==",
4280
+ "engines": {
4281
+ "node": ">=0.10.0"
4282
+ }
4283
+ },
4284
+ "node_modules/stacktrace-js": {
4285
+ "version": "2.0.2",
4286
+ "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz",
4287
+ "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==",
4288
+ "dependencies": {
4289
+ "error-stack-parser": "^2.0.6",
4290
+ "stack-generator": "^2.0.5",
4291
+ "stacktrace-gps": "^3.0.4"
4292
+ }
4293
+ },
4294
  "node_modules/streamsearch": {
4295
  "version": "1.1.0",
4296
  "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
 
4507
  }
4508
  }
4509
  },
4510
+ "node_modules/stylis": {
4511
+ "version": "4.3.2",
4512
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz",
4513
+ "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg=="
4514
+ },
4515
  "node_modules/sucrase": {
4516
  "version": "3.35.0",
4517
  "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
 
4631
  "node": ">=0.8"
4632
  }
4633
  },
4634
+ "node_modules/throttle-debounce": {
4635
+ "version": "3.0.1",
4636
+ "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz",
4637
+ "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==",
4638
+ "engines": {
4639
+ "node": ">=10"
4640
+ }
4641
+ },
4642
  "node_modules/to-regex-range": {
4643
  "version": "5.0.1",
4644
  "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
 
4651
  "node": ">=8.0"
4652
  }
4653
  },
4654
+ "node_modules/toggle-selection": {
4655
+ "version": "1.0.6",
4656
+ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
4657
+ "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
4658
+ },
4659
  "node_modules/ts-api-utils": {
4660
  "version": "1.3.0",
4661
  "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
 
4668
  "typescript": ">=4.2.0"
4669
  }
4670
  },
4671
+ "node_modules/ts-easing": {
4672
+ "version": "0.2.0",
4673
+ "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz",
4674
+ "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ=="
4675
+ },
4676
  "node_modules/ts-interface-checker": {
4677
  "version": "0.1.13",
4678
  "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
package.json CHANGED
@@ -3,24 +3,27 @@
3
  "version": "0.1.0",
4
  "private": true,
5
  "scripts": {
6
- "dev": "next dev",
7
  "build": "next build",
8
  "start": "next start",
9
  "lint": "next lint"
10
  },
11
  "dependencies": {
 
 
12
  "react": "^18",
13
  "react-dom": "^18",
14
- "next": "14.2.3"
 
15
  },
16
  "devDependencies": {
17
- "typescript": "^5",
18
  "@types/node": "^20",
19
  "@types/react": "^18",
20
  "@types/react-dom": "^18",
 
 
21
  "postcss": "^8",
22
  "tailwindcss": "^3.4.1",
23
- "eslint": "^8",
24
- "eslint-config-next": "14.2.3"
25
  }
26
  }
 
3
  "version": "0.1.0",
4
  "private": true,
5
  "scripts": {
6
+ "dev": "next dev --port 3001",
7
  "build": "next build",
8
  "start": "next start",
9
  "lint": "next lint"
10
  },
11
  "dependencies": {
12
+ "classnames": "^2.5.1",
13
+ "next": "14.2.3",
14
  "react": "^18",
15
  "react-dom": "^18",
16
+ "react-icons": "^5.1.0",
17
+ "react-use": "^17.5.0"
18
  },
19
  "devDependencies": {
 
20
  "@types/node": "^20",
21
  "@types/react": "^18",
22
  "@types/react-dom": "^18",
23
+ "eslint": "^8",
24
+ "eslint-config-next": "14.2.3",
25
  "postcss": "^8",
26
  "tailwindcss": "^3.4.1",
27
+ "typescript": "^5"
 
28
  }
29
  }
utils/index.ts ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export const fetchAllPages = async () => {
2
+ const filter_key = "zero-a10g";
3
+
4
+ const pageNumbers = Array.from({ length: 200 }, (_, i) => i);
5
+ const urls = pageNumbers.map(async (pageNumber) => {
6
+ const url = `https://huggingface.co/spaces-json?p=${pageNumber}&sort=trending`;
7
+ const response = await fetch(url);
8
+ const json = await response.json();
9
+ return json?.spaces ?? [];
10
+ });
11
+ const jsonResponses = await Promise.all(urls);
12
+ const spaces = jsonResponses.flat()?.filter((space) => space?.runtime?.hardware?.current === filter_key);
13
+ return spaces;
14
+ };
utils/type.ts ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export interface SpaceProps {
2
+ name: string;
3
+ id: string;
4
+ title: string;
5
+ emoji?: string;
6
+ runtime: any;
7
+ shortDescription?: string;
8
+ likes?: number;
9
+ authorData: Author;
10
+ colorFrom: string;
11
+ colorTo: string;
12
+ }
13
+
14
+ interface Author {
15
+ name: string;
16
+ username: string;
17
+ fullName?: string;
18
+ avatarUrl: string;
19
+ }