ehristoforu anzorq commited on
Commit
c78f86a
·
0 Parent(s):

Duplicate from anzorq/hf-spaces-semantic-search

Browse files

Co-authored-by: AQ <[email protected]>

.dockerignore ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ Dockerfile
2
+ .dockerignore
3
+ node_modules
4
+ npm-debug.log
5
+ README.md
6
+ .next
7
+ .git
.github/workflows/sync_to_hf_spaces.yml ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Sync to Hugging Face Spaces
2
+ on:
3
+ push:
4
+ branches: [main]
5
+ workflow_dispatch:
6
+
7
+ env:
8
+ HF_USERNAME: anzorq
9
+ HF_SPACE_NAME: hf-spaces-semantic-search
10
+
11
+ jobs:
12
+ sync-to-space:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v3
16
+ with:
17
+ fetch-depth: 0
18
+ lfs: true
19
+ - name: Push to Space
20
+ env:
21
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
22
+ run: git push --force https://$HF_USERNAME:[email protected]/spaces/$HF_USERNAME/$HF_SPACE_NAME main
.gitignore ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2
+
3
+ # dependencies
4
+ /node_modules
5
+ /.pnp
6
+ .pnp.js
7
+
8
+ # testing
9
+ /coverage
10
+
11
+ # next.js
12
+ /.next/
13
+ /out/
14
+
15
+ # production
16
+ /build
17
+
18
+ # misc
19
+ .DS_Store
20
+ *.pem
21
+
22
+ # debug
23
+ npm-debug.log*
24
+ yarn-debug.log*
25
+ yarn-error.log*
26
+
27
+ # local env files
28
+ .env*.local
29
+
30
+ # vercel
31
+ .vercel
32
+
33
+ # typescript
34
+ *.tsbuildinfo
35
+ next-env.d.ts
Dockerfile ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM node:18-alpine AS base
2
+
3
+ # Install dependencies only when needed
4
+ FROM base AS deps
5
+ # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
6
+ RUN apk add --no-cache libc6-compat
7
+ WORKDIR /app
8
+
9
+ # Install dependencies based on the preferred package manager
10
+ COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
11
+ RUN \
12
+ if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
13
+ elif [ -f package-lock.json ]; then npm ci; \
14
+ elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i --frozen-lockfile; \
15
+ else echo "Lockfile not found." && exit 1; \
16
+ fi
17
+
18
+
19
+ # Rebuild the source code only when needed
20
+ FROM base AS builder
21
+ WORKDIR /app
22
+ COPY --from=deps /app/node_modules ./node_modules
23
+ COPY . .
24
+
25
+ # Next.js collects completely anonymous telemetry data about general usage.
26
+ # Learn more here: https://nextjs.org/telemetry
27
+ # Uncomment the following line in case you want to disable telemetry during the build.
28
+ # ENV NEXT_TELEMETRY_DISABLED 1
29
+
30
+ RUN yarn build
31
+
32
+ # If using npm comment out above and use below instead
33
+ # RUN npm run build
34
+
35
+ # Production image, copy all the files and run next
36
+ FROM base AS runner
37
+ WORKDIR /app
38
+
39
+ ENV NODE_ENV production
40
+ # Uncomment the following line in case you want to disable telemetry during runtime.
41
+ # ENV NEXT_TELEMETRY_DISABLED 1
42
+
43
+ RUN addgroup --system --gid 1001 nodejs
44
+ RUN adduser --system --uid 1001 nextjs
45
+
46
+ COPY --from=builder /app/public ./public
47
+
48
+ # Automatically leverage output traces to reduce image size
49
+ # https://nextjs.org/docs/advanced-features/output-file-tracing
50
+ COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
51
+ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
52
+
53
+ USER nextjs
54
+
55
+ EXPOSE 3000
56
+
57
+ ENV PORT 3000
58
+
59
+ CMD ["node", "server.js"]
README.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: 🤗 Spaces Semantic Search
3
+ emoji: 🌌🔍
4
+ colorFrom: blue
5
+ colorTo: yellow
6
+ sdk: docker
7
+ pinned: false
8
+ license: mit
9
+ app_port: 3000
10
+ duplicated_from: anzorq/hf-spaces-semantic-search
11
+ ---
components/backgroundEmojiGrid.jsx ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useEffect, useState } from 'react';
2
+
3
+ const emojis = ['😄', '🚀', '👀', '👨‍💻', '👩‍💻', '🎉', '🔥', '🎊', '🙌', '👏', '🎁', '🤩', '🥳', '🔗', '🌟', '🌈', '🌞', '🌝', '🌚', '👋', '🍕', '🍔', '🍟', '🍳', '🍲', '🍱', '🍣', '🍤', '🍦', '🍩', '🍪', '🎂', '🍰', '🍫', '🍬', '🍭', '🍿', '🍷', '🍸', '🍹', '🍺', '🍻', '🍽', '🥢', '🧂', '⚽️', '🏀', '🏈', '⚾️', '🎾', '🏐', '🏉', '🎱', '🏓', '🏸', '🏒', '🏑', '🥍', '🏏', '🥅', '⛳️', '🏹', '🎣', '🥊', '🥋', '🎽', '🛹', '🛷', '🥌', '🎿', '⛷', '🏂', '🏋️‍♀️', '🤼‍♀️', '🤸‍♀️', '⛹️‍♀️', '🤺', '🤾‍♀️', '🏌️‍♀️', '🏇', '🧘‍♀️', '🏄‍♀️', '🏊‍♀️', '🤽‍♀️', '🚣‍♀️', '🧗‍♀️', '🚵‍♀️', '🚴‍♀️', '🏆', '💻']
4
+
5
+ export default function BackgroundEmojiGrid() {
6
+ const [grid, setGrid] = useState([]);
7
+
8
+ useEffect(() => {
9
+ const newGrid = Array.from({ length: 1000 }, () => emojis[Math.floor(Math.random() * emojis.length)]); // Adjust the length to suit the size of your grid
10
+ setGrid(newGrid);
11
+ }, []);
12
+
13
+ return (
14
+ <div className="fixed top-1/2 left-1/2 w-[200vh] h-[200vh] overflow-hidden -z-10 transform -translate-x-1/2 -translate-y-1/2 rotate-45 opacity-10">
15
+ {grid.map((emoji, i) => (
16
+ <span key={i} className="inline-block w-24 h-24 md:w-32 md:h-32 text-4xl">{emoji}</span> // Adjust the width and height to suit the size of your grid cells
17
+ ))}
18
+ </div>
19
+ );
20
+ }
components/card.jsx ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+
3
+ const tailwindColors = {
4
+ red: '#dc2626',
5
+ yellow: '#d97706',
6
+ green: '#16a34a',
7
+ blue: '#2563eb',
8
+ indigo: '#4f46e5',
9
+ purple: '#7c3aed',
10
+ pink: '#db2777',
11
+ gray: '#4b5563',
12
+ };
13
+
14
+ const Card = ({
15
+ space_id,
16
+ author,
17
+ title,
18
+ description,
19
+ emoji,
20
+ lastModified,
21
+ colorFrom,
22
+ colorTo,
23
+ likes,
24
+ sdk,
25
+ runtimeStage,
26
+ currentHardware,
27
+ }) => {
28
+ const gradientStyle = {
29
+ background: `linear-gradient(to bottom right, ${tailwindColors[colorFrom]}, ${tailwindColors[colorTo]})`,
30
+ };
31
+
32
+ const spaceUrl = `https://huggingface.co/spaces/${space_id}`;
33
+
34
+ let runtimeStageIcon = null;
35
+ if (runtimeStage === 'STOPPED') {
36
+ runtimeStageIcon = <svg className="mr-0.5" xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink" aria-hidden="true" focusable="false" role="img" width="1.1em" height="1.1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32">
37
+ <rect x="11" y="9" width="2" height="14" fill="currentColor" />
38
+ <rect x="19" y="9" width="2" height="14" fill="currentColor" />
39
+ </svg>;
40
+ } else if (runtimeStage.includes('ERROR')) {
41
+ runtimeStageIcon = <svg className="mr-0.5" xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink" aria-hidden="true" focusable="false" role="img" width="1.1em" height="1.1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M24 9.4L22.6 8L16 14.6L9.4 8L8 9.4l6.6 6.6L8 22.6L9.4 24l6.6-6.6l6.6 6.6l1.4-1.4l-6.6-6.6L24 9.4z" fill="currentColor"></path></svg>;
42
+ }
43
+
44
+ return (
45
+ <div className="flex flex-col">
46
+ {/* <a href={spaceUrl} target="_blank" rel="noopener noreferrer">
47
+ <div className="text-sm truncate px-2 py-1 w-full font-bold text-clip">
48
+ {emoji} {title}
49
+ </div>
50
+ </a> */}
51
+
52
+ <a href={spaceUrl} target="_blank" rel="noopener noreferrer">
53
+ <div
54
+ // className={`relative z-0 mx-auto flex flex-col items-center justify-center p-4 filter hover:brightness-110 overflow-hidden h-52 rounded-lg`}
55
+ // to resize to 100% on hover we can use the following:
56
+ className={`relative z-0 mx-auto flex flex-col items-center justify-center p-4 filter hover:brightness-110 overflow-hidden h-52 rounded-lg transition-all duration-50 ease-in-out hover:scale-[1.008]`}
57
+ style={gradientStyle}
58
+ >
59
+ <div className="flex justify-between items-center w-full">
60
+ <div className="right-16 flex flex-wrap content-start gap-1.5 overflow-hidden top-3 left-3 text-xs">
61
+ <div className={`inline-flex select-none items-center overflow-hidden font-mono rounded bg-white/10 px-1 py-0 leading-tight text-white opacity-80`}>
62
+ {runtimeStageIcon}
63
+ <strong>{runtimeStage}</strong>
64
+ {runtimeStage === "RUNNING" && (
65
+ <>
66
+ <span className="mx-1">on</span>
67
+ <strong>{currentHardware}</strong>
68
+ </>
69
+ )}
70
+ </div>
71
+ <div className="inline-flex select-none items-center overflow-hidden font-mono rounded bg-white/10 px-1 py-0 leading-tight text-white opacity-80">
72
+ <span>{lastModified}</span>
73
+ </div>
74
+ </div>
75
+ <div className="flex items-center">
76
+ <svg className="mr-1.5 text-white" xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink" aria-hidden="true" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32" fill="currentColor">
77
+ <path d="M22.45,6a5.47,5.47,0,0,1,3.91,1.64,5.7,5.7,0,0,1,0,8L16,26.13,5.64,15.64a5.7,5.7,0,0,1,0-8,5.48,5.48,0,0,1,7.82,0L16,10.24l2.53-2.58A5.44,5.44,0,0,1,22.45,6m0-2a7.47,7.47,0,0,0-5.34,2.24L16,7.36,14.89,6.24a7.49,7.49,0,0,0-10.68,0,7.72,7.72,0,0,0,0,10.82L16,29,27.79,17.06a7.72,7.72,0,0,0,0-10.82A7.49,7.49,0,0,0,22.45,4Z"></path>
78
+ </svg>
79
+ <span className="text-white text-sm">{likes}</span>
80
+ </div>
81
+ </div>
82
+ <div className="flex items-center h-full flex-col gap-2 p-4 w-full">
83
+ <div className="text-white text-center text-xl truncate px-2 py-1 w-full font-bold text-clip overflow-hidden">
84
+ {emoji} {title}
85
+ </div>
86
+ <p className="text-white text-base text-center font-medium text-ellipsis overflow-hidden">
87
+ {description}
88
+ </p>
89
+ </div>
90
+ </div>
91
+ </a>
92
+ </div>
93
+ );
94
+ };
95
+
96
+ export default Card;
components/searchBar.jsx ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect } from "react";
2
+
3
+ const SearchBar = ({ onSearch }) => {
4
+ const [query, setQuery] = useState("");
5
+ const [placeholderIndex, setPlaceholderIndex] = useState(0);
6
+ const [placeholder, setPlaceholder] = useState("");
7
+ const [showInitialPlaceholder, setShowInitialPlaceholder] = useState(true);
8
+ const initialPlaceholder = "Discover thousands of spaces";
9
+ const placeholders = [
10
+ "Generate music",
11
+ "Remove background from images",
12
+ "Translate text",
13
+ "Chat with a PDF file",
14
+ "Generate anime images",
15
+ "Recognize objects in images",
16
+ "Perform sentiment analysis",
17
+ "Help me pick a laptop",
18
+ "Face recognition",
19
+ "Drawing canvas",
20
+ "Create 3D objects from images",
21
+ "Play a text-based game",
22
+ "Predict stock prices",
23
+ "Recommend movies",
24
+ "Image classification",
25
+ "Summarize text",
26
+ "Generate video from text and audio",
27
+ "Help me organize a trip",
28
+ "Write a children's story",
29
+ "Chat with a cat",
30
+ ];
31
+
32
+ useEffect(() => {
33
+ const initialTimeout = setTimeout(() => {
34
+ setShowInitialPlaceholder(false);
35
+ }, 4000);
36
+
37
+ return () => clearTimeout(initialTimeout);
38
+ }, []);
39
+
40
+ useEffect(() => {
41
+ if (!showInitialPlaceholder && query === "") {
42
+ let typingInterval;
43
+ if (placeholder.length < placeholders[placeholderIndex].length) {
44
+ const typingSpeed = Math.floor(Math.random() * 50) + 100;
45
+ typingInterval = setInterval(() => {
46
+ setPlaceholder(prevPlaceholder => prevPlaceholder + placeholders[placeholderIndex][placeholder.length]);
47
+ }, typingSpeed);
48
+ }
49
+ return () => clearInterval(typingInterval);
50
+ }
51
+ }, [placeholder, placeholderIndex, showInitialPlaceholder, query]);
52
+
53
+ useEffect(() => {
54
+ if (!showInitialPlaceholder && query === "") {
55
+ const indexInterval = setInterval(() => {
56
+ if (placeholder === placeholders[placeholderIndex]) {
57
+ setPlaceholderIndex(Math.floor(Math.random() * placeholders.length));
58
+ setPlaceholder(""); // reset the placeholder when the index changes
59
+ }
60
+ }, 1500);
61
+
62
+ return () => clearInterval(indexInterval);
63
+ }
64
+ }, [placeholder, placeholderIndex, showInitialPlaceholder, query]);
65
+
66
+ const handleKeyDown = (event) => {
67
+ if (event.key === "Enter") {
68
+ onSearch(query);
69
+ }
70
+ };
71
+
72
+ const handleChange = (e) => {
73
+ setQuery(e.target.value);
74
+ if (e.target.value === "") {
75
+ setPlaceholder("");
76
+ setPlaceholderIndex(Math.floor(Math.random() * placeholders.length));
77
+ }
78
+ };
79
+
80
+ return (
81
+ <div className="flex items-center justify-center bg-gray-900 rounded-xl shadow-sm w-full lg:w-1/2 h-12 my-8">
82
+ <input
83
+ type="text"
84
+ placeholder={showInitialPlaceholder ? initialPlaceholder : placeholder}
85
+ className="search-bar w-full h-full px-4 py-2 text-gray-200 bg-gray-800 border border-gray-700 rounded-xl shadow-sm appearance-none focus:outline-none focus:ring-2"
86
+ value={query}
87
+ onChange={handleChange}
88
+ onKeyDown={handleKeyDown}
89
+ />
90
+ </div>
91
+ );
92
+ };
93
+
94
+ export default SearchBar;
jsconfig.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "paths": {
4
+ "@/*": ["./*"]
5
+ }
6
+ }
7
+ }
next.config.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ /** @type {import('next').NextConfig} */
2
+ const nextConfig = {
3
+ output: 'standalone',
4
+ reactStrictMode: true,
5
+ }
6
+
7
+ module.exports = nextConfig
package-lock.json ADDED
The diff for this file is too large to render. See raw diff
 
package.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "js-app",
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
+ "@gradio/client": "^0.1.1",
13
+ "autoprefixer": "10.4.14",
14
+ "dayjs": "^1.11.7",
15
+ "net": "^1.0.2",
16
+ "next": "13.4.3",
17
+ "npx": "^10.2.2",
18
+ "postcss": "8.4.23",
19
+ "react": "18.2.0",
20
+ "react-dom": "18.2.0",
21
+ "tailwindcss": "3.3.2"
22
+ }
23
+ }
pages/_app.js ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ import '@/styles/globals.css'
2
+
3
+ export default function App({ Component, pageProps }) {
4
+ return <Component {...pageProps} />
5
+ }
pages/_document.js ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Html, Head, Main, NextScript } from 'next/document'
2
+
3
+ export default function Document() {
4
+ return (
5
+ <Html lang="en">
6
+ <Head />
7
+ <body>
8
+ <Main />
9
+ <NextScript />
10
+ </body>
11
+ </Html>
12
+ )
13
+ }
pages/api/api_hf.js ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ const predict = async (query, num_results=10) => {
3
+ try {
4
+
5
+ const response = await fetch("https://anzorq-spaces-semantic-search-api.hf.space/api/search", {
6
+ method: "POST",
7
+ headers: {
8
+ "Content-Type": "application/json",
9
+ },
10
+ body: JSON.stringify({ data: [query.trim(), num_results] }),
11
+ })
12
+ const json = await response.json()
13
+ // console.debug("API response: ", json)
14
+ return json.data[0].data
15
+ } catch (error) {
16
+ console.error(error)
17
+ throw error
18
+ }
19
+ }
20
+
21
+ export { predict }
pages/api/hf_space.js ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const get_space_info = async (space_id) => {
2
+ try {
3
+ const response = await fetch(`https://huggingface.co/api/spaces/${space_id}`)
4
+ const json = await response.json()
5
+
6
+ if (json.error) {
7
+ return null
8
+ }
9
+
10
+ const dayjs = require('dayjs')
11
+ const relativeTime = require('dayjs/plugin/relativeTime')
12
+ dayjs.extend(relativeTime)
13
+ const lastModified = dayjs(json.lastModified).fromNow()
14
+
15
+ const author = json.author
16
+ const title = json.cardData?.title || json.id.split('/')[1].replace(/-/g, ' ') || 'Untitled'
17
+ const emoji = json.cardData?.emoji || '🤗'
18
+ let colorFrom = json.cardData?.colorFrom || 'pink'
19
+ let colorTo = json.cardData?.colorTo || 'purple'
20
+ const likes = json.likes
21
+ const sdk = json.sdk
22
+ const runtime_stage = json.runtime.stage
23
+ const current_hardware = json.runtime.hardware.current
24
+
25
+ const colors = ['red', 'yellow', 'green', 'blue', 'indigo', 'purple', 'pink', 'gray']
26
+ if (!colors.includes(colorFrom)) {
27
+ colorFrom = 'pink'
28
+ }
29
+ if (!colors.includes(colorTo)) {
30
+ colorTo = 'purple'
31
+ }
32
+
33
+ const result = { space_id, author, title, emoji, lastModified, colorFrom, colorTo, likes, sdk, runtime_stage, current_hardware }
34
+
35
+ // console.debug("API response: ", result)
36
+
37
+ return result
38
+
39
+ } catch (error) {
40
+ console.error(error)
41
+ throw error
42
+ }
43
+ }
44
+
45
+ export { get_space_info }
pages/index.js ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Inter } from 'next/font/google';
2
+ import SearchBar from '@/components/searchBar';
3
+ import Card from '@/components/card';
4
+ import { predict } from '@/pages/api/api_hf';
5
+ import { get_space_info } from '@/pages/api/hf_space';
6
+ import { useState, useEffect } from 'react';
7
+
8
+ const inter = Inter({ subsets: ['latin'] });
9
+
10
+ export default function Home() {
11
+ const [spaceInfo, setSpaceInfo] = useState(null);
12
+ const [sortedSpaceInfo, setSortedSpaceInfo] = useState(null);
13
+ const [searchResults, setSearchResults] = useState([]);
14
+ const [isLoading, setIsLoading] = useState(false);
15
+ const [sortBy, setSortBy] = useState('relevance');
16
+ const [onlyRunning, setOnlyRunning] = useState(false);
17
+
18
+ useEffect(() => {
19
+ if (searchResults.length > 0) {
20
+ fetchSpaceInfo(searchResults);
21
+ } else {
22
+ setSpaceInfo(null);
23
+ }
24
+
25
+ async function fetchSpaceInfo(results) {
26
+ setIsLoading(true);
27
+ const spaceData = await Promise.all(
28
+ results.map(async ([id, description]) => {
29
+ const space = await get_space_info(id);
30
+ return space ? { ...space, description } : null;
31
+ })
32
+ );
33
+ setSpaceInfo(spaceData);
34
+ setIsLoading(false);
35
+ document.querySelector('.search-bar').scrollIntoView({
36
+ behavior: 'smooth',
37
+ block: 'start',
38
+ });
39
+ }
40
+ }, [searchResults]);
41
+
42
+ useEffect(() => {
43
+ if (spaceInfo) {
44
+ setSortedSpaceInfo(filterResults(sortResults(spaceInfo, sortBy)));
45
+ }
46
+ }, [spaceInfo, sortBy, onlyRunning]);
47
+
48
+ useEffect(() => {
49
+ document.querySelector('.search-bar')?.focus();
50
+ }, []);
51
+
52
+ async function onSearch(query) {
53
+ setIsLoading(true);
54
+ setSortBy('relevance');
55
+ setSearchResults(query ? await predict(query, 24) : []);
56
+ }
57
+
58
+ function sortResults(results, sortBy) {
59
+ return sortBy === 'likes' ? [...results].sort((a, b) => b.likes - a.likes) : results;
60
+ }
61
+
62
+ function filterResults(results) {
63
+ return onlyRunning ? results.filter((space) => space.runtime_stage === 'RUNNING') : results;
64
+ }
65
+
66
+ function toggleOnlyRunning() {
67
+ setOnlyRunning(!onlyRunning);
68
+ }
69
+
70
+ const renderSortButtons = () => (
71
+ <>
72
+ {['relevance', 'likes'].map((option) => (
73
+ <div>
74
+ <button
75
+ key={option}
76
+ className={`px-4 py-1 rounded-full mr-2 ${sortBy === option ? 'bg-white text-gray-900' : 'bg-gray-900 text-white'}`}
77
+ onClick={() => setSortBy(option)}
78
+ >
79
+ {option.charAt(0).toUpperCase() + option.slice(1)}
80
+ </button>
81
+ </div>
82
+ ))}
83
+ </>
84
+ );
85
+
86
+ const renderCards = () =>
87
+ sortedSpaceInfo.map(
88
+ (space, index) =>
89
+ space && (
90
+ <Card
91
+ key={index}
92
+ {...space}
93
+ space_id={space.space_id}
94
+ author={space.author}
95
+ title={space.title}
96
+ emoji={space.emoji}
97
+ lastModified={space.lastModified}
98
+ colorFrom={space.colorFrom}
99
+ colorTo={space.colorTo}
100
+ sdk={space.sdk}
101
+ runtimeStage={space.runtime_stage}
102
+ currentHardware={space.current_hardware}
103
+ />
104
+ )
105
+ );
106
+
107
+ return (
108
+ <main className={`flex min-h-screen flex-col items-center p-8 md:px-24 pt-20 bg-gray-950 ${inter.className} justify-between`}>
109
+ <h1 className="text-4xl md:text-6xl font-bold text-center mb-12 text-white">🤗 Hugging Face Spaces</h1>
110
+ <SearchBar onSearch={onSearch} />
111
+ {isLoading ? (
112
+ <div className="col-span-full flex justify-center items-center">
113
+ <div className="animate-spin rounded-full h-10 w-10 border-t-2 border-b-2 border-white"></div>
114
+ </div>
115
+ ) : (
116
+ sortedSpaceInfo && (
117
+ <>
118
+ <div className="flex justify-center mt-4 items-baseline">
119
+ <button
120
+ className={`px-4 mx-4 py-1 rounded-full ${onlyRunning ? 'bg-white text-gray-900' : 'bg-gray-900 text-white'}`}
121
+ onClick={toggleOnlyRunning}
122
+ >
123
+ Only running
124
+ </button>
125
+ <span className="text-white mr-2">Sort by:</span>
126
+ {renderSortButtons()}
127
+ </div>
128
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-5 w-full mt-8">
129
+ {renderCards()}
130
+ </div>
131
+ </>
132
+ )
133
+ )}
134
+ <footer className="text-center text-gray-500 text-sm mt-8 bottom-0 w-full p-4">
135
+ Created by Anzor Qunash
136
+ <br />
137
+ <a href="https://huggingface.co/datasets/anzorq/hf-spaces-descriptions-embeddings" target="_blank" rel="noopener noreferrer">
138
+ Dataset
139
+ </a>
140
+ <span className="mx-2">•</span>
141
+ <a href="https://github.com/qunash" target="_blank" rel="noopener noreferrer">
142
+ GitHub
143
+ </a>
144
+ <span className="mx-2">•</span>
145
+ <a href="https://twitter.com/hahahahohohe" target="_blank" rel="noopener noreferrer">
146
+ Twitter
147
+ </a>
148
+ <span className="mx-2">•</span>
149
+ <a href="https://www.buymeacoffee.com/anzorq" target="_blank" rel="noopener noreferrer">
150
+ Buy me a coffee
151
+ </a>
152
+ </footer>
153
+ </main>
154
+ );
155
+ }
pnpm-lock.yaml ADDED
@@ -0,0 +1,905 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ lockfileVersion: '6.0'
2
+
3
+ dependencies:
4
+ '@gradio/client':
5
+ specifier: ^0.1.1
6
+ version: 0.1.1
7
+ autoprefixer:
8
+ specifier: 10.4.14
9
+ version: 10.4.14([email protected])
10
+ next:
11
+ specifier: 13.4.3
12
13
+ postcss:
14
+ specifier: 8.4.23
15
+ version: 8.4.23
16
+ react:
17
+ specifier: 18.2.0
18
+ version: 18.2.0
19
+ react-dom:
20
+ specifier: 18.2.0
21
+ version: 18.2.0([email protected])
22
+ tailwindcss:
23
+ specifier: 3.3.2
24
+ version: 3.3.2
25
+
26
+ packages:
27
+
28
+ /@alloc/[email protected]:
29
+ resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
30
+ engines: {node: '>=10'}
31
+ dev: false
32
+
33
+ /@gradio/[email protected]:
34
+ resolution: {integrity: sha512-BasdCFnRVyaXQwibJ9fxVsGDLYpH7YV9yhklE0KL2xQvVh+nyNgeJYoa735b7MatJxkfq3/Sqw700oPUrDXh3w==}
35
+ engines: {node: '>=18.0.0'}
36
+ dependencies:
37
+ bufferutil: 4.0.7
38
+ semiver: 1.1.0
39
+ ws: 8.13.0([email protected])
40
+ transitivePeerDependencies:
41
+ - utf-8-validate
42
+ dev: false
43
+
44
+ /@jridgewell/[email protected]:
45
+ resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
46
+ engines: {node: '>=6.0.0'}
47
+ dependencies:
48
+ '@jridgewell/set-array': 1.1.2
49
+ '@jridgewell/sourcemap-codec': 1.4.15
50
+ '@jridgewell/trace-mapping': 0.3.18
51
+ dev: false
52
+
53
+ /@jridgewell/[email protected]:
54
+ resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
55
+ engines: {node: '>=6.0.0'}
56
+ dev: false
57
+
58
+ /@jridgewell/[email protected]:
59
+ resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
60
+ engines: {node: '>=6.0.0'}
61
+ dev: false
62
+
63
+ /@jridgewell/[email protected]:
64
+ resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
65
+ dev: false
66
+
67
+ /@jridgewell/[email protected]:
68
+ resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
69
+ dev: false
70
+
71
+ /@jridgewell/[email protected]:
72
+ resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==}
73
+ dependencies:
74
+ '@jridgewell/resolve-uri': 3.1.0
75
+ '@jridgewell/sourcemap-codec': 1.4.14
76
+ dev: false
77
+
78
+ /@next/[email protected]:
79
+ resolution: {integrity: sha512-pa1ErjyFensznttAk3EIv77vFbfSYT6cLzVRK5jx4uiRuCQo+m2wCFAREaHKIy63dlgvOyMlzh6R8Inu8H3KrQ==}
80
+ dev: false
81
+
82
+ /@next/[email protected]:
83
+ resolution: {integrity: sha512-yx18udH/ZmR4Bw4M6lIIPE3JxsAZwo04iaucEfA2GMt1unXr2iodHUX/LAKNyi6xoLP2ghi0E+Xi1f4Qb8f1LQ==}
84
+ engines: {node: '>= 10'}
85
+ cpu: [arm64]
86
+ os: [darwin]
87
+ requiresBuild: true
88
+ dev: false
89
+ optional: true
90
+
91
+ /@next/[email protected]:
92
+ resolution: {integrity: sha512-Mi8xJWh2IOjryAM1mx18vwmal9eokJ2njY4nDh04scy37F0LEGJ/diL6JL6kTXi0UfUCGbMsOItf7vpReNiD2A==}
93
+ engines: {node: '>= 10'}
94
+ cpu: [x64]
95
+ os: [darwin]
96
+ requiresBuild: true
97
+ dev: false
98
+ optional: true
99
+
100
+ /@next/[email protected]:
101
+ resolution: {integrity: sha512-aBvtry4bxJ1xwKZ/LVPeBGBwWVwxa4bTnNkRRw6YffJnn/f4Tv4EGDPaVeYHZGQVA56wsGbtA6nZMuWs/EIk4Q==}
102
+ engines: {node: '>= 10'}
103
+ cpu: [arm64]
104
+ os: [linux]
105
+ requiresBuild: true
106
+ dev: false
107
+ optional: true
108
+
109
+ /@next/[email protected]:
110
+ resolution: {integrity: sha512-krT+2G3kEsEUvZoYte3/2IscscDraYPc2B+fDJFipPktJmrv088Pei/RjrhWm5TMIy5URYjZUoDZdh5k940Dyw==}
111
+ engines: {node: '>= 10'}
112
+ cpu: [arm64]
113
+ os: [linux]
114
+ requiresBuild: true
115
+ dev: false
116
+ optional: true
117
+
118
+ /@next/[email protected]:
119
+ resolution: {integrity: sha512-AMdFX6EKJjC0G/CM6hJvkY8wUjCcbdj3Qg7uAQJ7PVejRWaVt0sDTMavbRfgMchx8h8KsAudUCtdFkG9hlEClw==}
120
+ engines: {node: '>= 10'}
121
+ cpu: [x64]
122
+ os: [linux]
123
+ requiresBuild: true
124
+ dev: false
125
+ optional: true
126
+
127
+ /@next/[email protected]:
128
+ resolution: {integrity: sha512-jySgSXE48shaLtcQbiFO9ajE9mqz7pcAVLnVLvRIlUHyQYR/WyZdK8ehLs65Mz6j9cLrJM+YdmdJPyV4WDaz2g==}
129
+ engines: {node: '>= 10'}
130
+ cpu: [x64]
131
+ os: [linux]
132
+ requiresBuild: true
133
+ dev: false
134
+ optional: true
135
+
136
+ /@next/[email protected]:
137
+ resolution: {integrity: sha512-5DxHo8uYcaADiE9pHrg8o28VMt/1kR8voDehmfs9AqS0qSClxAAl+CchjdboUvbCjdNWL1MISCvEfKY2InJ3JA==}
138
+ engines: {node: '>= 10'}
139
+ cpu: [arm64]
140
+ os: [win32]
141
+ requiresBuild: true
142
+ dev: false
143
+ optional: true
144
+
145
+ /@next/[email protected]:
146
+ resolution: {integrity: sha512-LaqkF3d+GXRA5X6zrUjQUrXm2MN/3E2arXBtn5C7avBCNYfm9G3Xc646AmmmpN3DJZVaMYliMyCIQCMDEzk80w==}
147
+ engines: {node: '>= 10'}
148
+ cpu: [ia32]
149
+ os: [win32]
150
+ requiresBuild: true
151
+ dev: false
152
+ optional: true
153
+
154
+ /@next/[email protected]:
155
+ resolution: {integrity: sha512-jglUk/x7ZWeOJWlVoKyIAkHLTI+qEkOriOOV+3hr1GyiywzcqfI7TpFSiwC7kk1scOiH7NTFKp8mA3XPNO9bDw==}
156
+ engines: {node: '>= 10'}
157
+ cpu: [x64]
158
+ os: [win32]
159
+ requiresBuild: true
160
+ dev: false
161
+ optional: true
162
+
163
+ /@nodelib/[email protected]:
164
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
165
+ engines: {node: '>= 8'}
166
+ dependencies:
167
+ '@nodelib/fs.stat': 2.0.5
168
+ run-parallel: 1.2.0
169
+ dev: false
170
+
171
+ /@nodelib/[email protected]:
172
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
173
+ engines: {node: '>= 8'}
174
+ dev: false
175
+
176
+ /@nodelib/[email protected]:
177
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
178
+ engines: {node: '>= 8'}
179
+ dependencies:
180
+ '@nodelib/fs.scandir': 2.1.5
181
+ fastq: 1.15.0
182
+ dev: false
183
+
184
185
+ resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==}
186
+ dependencies:
187
+ tslib: 2.5.2
188
+ dev: false
189
+
190
191
+ resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
192
+ dev: false
193
+
194
195
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
196
+ engines: {node: '>= 8'}
197
+ dependencies:
198
+ normalize-path: 3.0.0
199
+ picomatch: 2.3.1
200
+ dev: false
201
+
202
203
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
204
+ dev: false
205
+
206
207
+ resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==}
208
+ engines: {node: ^10 || ^12 || >=14}
209
+ hasBin: true
210
+ peerDependencies:
211
+ postcss: ^8.1.0
212
+ dependencies:
213
+ browserslist: 4.21.5
214
+ caniuse-lite: 1.0.30001489
215
+ fraction.js: 4.2.0
216
+ normalize-range: 0.1.2
217
+ picocolors: 1.0.0
218
+ postcss: 8.4.23
219
+ postcss-value-parser: 4.2.0
220
+ dev: false
221
+
222
223
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
224
+ dev: false
225
+
226
227
+ resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
228
+ engines: {node: '>=8'}
229
+ dev: false
230
+
231
232
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
233
+ dependencies:
234
+ balanced-match: 1.0.2
235
+ concat-map: 0.0.1
236
+ dev: false
237
+
238
239
+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
240
+ engines: {node: '>=8'}
241
+ dependencies:
242
+ fill-range: 7.0.1
243
+ dev: false
244
+
245
246
+ resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==}
247
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
248
+ hasBin: true
249
+ dependencies:
250
+ caniuse-lite: 1.0.30001489
251
+ electron-to-chromium: 1.4.407
252
+ node-releases: 2.0.12
253
+ update-browserslist-db: 1.0.11([email protected])
254
+ dev: false
255
+
256
257
+ resolution: {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==}
258
+ engines: {node: '>=6.14.2'}
259
+ requiresBuild: true
260
+ dependencies:
261
+ node-gyp-build: 4.6.0
262
+ dev: false
263
+
264
265
+ resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
266
+ engines: {node: '>=10.16.0'}
267
+ dependencies:
268
+ streamsearch: 1.1.0
269
+ dev: false
270
+
271
272
+ resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
273
+ engines: {node: '>= 6'}
274
+ dev: false
275
+
276
277
+ resolution: {integrity: sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==}
278
+ dev: false
279
+
280
281
+ resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
282
+ engines: {node: '>= 8.10.0'}
283
+ dependencies:
284
+ anymatch: 3.1.3
285
+ braces: 3.0.2
286
+ glob-parent: 5.1.2
287
+ is-binary-path: 2.1.0
288
+ is-glob: 4.0.3
289
+ normalize-path: 3.0.0
290
+ readdirp: 3.6.0
291
+ optionalDependencies:
292
+ fsevents: 2.3.2
293
+ dev: false
294
+
295
296
+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
297
+ dev: false
298
+
299
300
+ resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
301
+ engines: {node: '>= 6'}
302
+ dev: false
303
+
304
305
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
306
+ dev: false
307
+
308
309
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
310
+ engines: {node: '>=4'}
311
+ hasBin: true
312
+ dev: false
313
+
314
315
+ resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
316
+ dev: false
317
+
318
319
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
320
+ dev: false
321
+
322
323
+ resolution: {integrity: sha512-5smEvFSFYMv90tICOzRVP7Opp98DAC4KW7RRipg3BuNpGbbV3N+x24Zh3sbLb1T5haGtOSy/hrBfXsWnIM9aCg==}
324
+ dev: false
325
+
326
327
+ resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
328
+ engines: {node: '>=6'}
329
+ dev: false
330
+
331
332
+ resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
333
+ engines: {node: '>=8.6.0'}
334
+ dependencies:
335
+ '@nodelib/fs.stat': 2.0.5
336
+ '@nodelib/fs.walk': 1.2.8
337
+ glob-parent: 5.1.2
338
+ merge2: 1.4.1
339
+ micromatch: 4.0.5
340
+ dev: false
341
+
342
343
+ resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
344
+ dependencies:
345
+ reusify: 1.0.4
346
+ dev: false
347
+
348
349
+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
350
+ engines: {node: '>=8'}
351
+ dependencies:
352
+ to-regex-range: 5.0.1
353
+ dev: false
354
+
355
356
+ resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
357
+ dev: false
358
+
359
360
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
361
+ dev: false
362
+
363
364
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
365
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
366
+ os: [darwin]
367
+ requiresBuild: true
368
+ dev: false
369
+ optional: true
370
+
371
372
+ resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
373
+ dev: false
374
+
375
376
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
377
+ engines: {node: '>= 6'}
378
+ dependencies:
379
+ is-glob: 4.0.3
380
+ dev: false
381
+
382
383
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
384
+ engines: {node: '>=10.13.0'}
385
+ dependencies:
386
+ is-glob: 4.0.3
387
+ dev: false
388
+
389
390
+ resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
391
+ dependencies:
392
+ fs.realpath: 1.0.0
393
+ inflight: 1.0.6
394
+ inherits: 2.0.4
395
+ minimatch: 3.1.2
396
+ once: 1.4.0
397
+ path-is-absolute: 1.0.1
398
+ dev: false
399
+
400
401
+ resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
402
+ engines: {node: '>= 0.4.0'}
403
+ dependencies:
404
+ function-bind: 1.1.1
405
+ dev: false
406
+
407
408
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
409
+ dependencies:
410
+ once: 1.4.0
411
+ wrappy: 1.0.2
412
+ dev: false
413
+
414
415
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
416
+ dev: false
417
+
418
419
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
420
+ engines: {node: '>=8'}
421
+ dependencies:
422
+ binary-extensions: 2.2.0
423
+ dev: false
424
+
425
426
+ resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==}
427
+ dependencies:
428
+ has: 1.0.3
429
+ dev: false
430
+
431
432
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
433
+ engines: {node: '>=0.10.0'}
434
+ dev: false
435
+
436
437
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
438
+ engines: {node: '>=0.10.0'}
439
+ dependencies:
440
+ is-extglob: 2.1.1
441
+ dev: false
442
+
443
444
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
445
+ engines: {node: '>=0.12.0'}
446
+ dev: false
447
+
448
449
+ resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==}
450
+ hasBin: true
451
+ dev: false
452
+
453
454
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
455
+ dev: false
456
+
457
458
+ resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
459
+ engines: {node: '>=10'}
460
+ dev: false
461
+
462
463
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
464
+ dev: false
465
+
466
467
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
468
+ hasBin: true
469
+ dependencies:
470
+ js-tokens: 4.0.0
471
+ dev: false
472
+
473
474
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
475
+ engines: {node: '>= 8'}
476
+ dev: false
477
+
478
479
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
480
+ engines: {node: '>=8.6'}
481
+ dependencies:
482
+ braces: 3.0.2
483
+ picomatch: 2.3.1
484
+ dev: false
485
+
486
487
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
488
+ dependencies:
489
+ brace-expansion: 1.1.11
490
+ dev: false
491
+
492
493
+ resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
494
+ dependencies:
495
+ any-promise: 1.3.0
496
+ object-assign: 4.1.1
497
+ thenify-all: 1.6.0
498
+ dev: false
499
+
500
501
+ resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
502
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
503
+ hasBin: true
504
+ dev: false
505
+
506
507
+ resolution: {integrity: sha512-FV3pBrAAnAIfOclTvncw9dDohyeuEEXPe5KNcva91anT/rdycWbgtu3IjUj4n5yHnWK8YEPo0vrUecHmnmUNbA==}
508
+ engines: {node: '>=16.8.0'}
509
+ hasBin: true
510
+ peerDependencies:
511
+ '@opentelemetry/api': ^1.1.0
512
+ fibers: '>= 3.1.0'
513
+ node-sass: ^6.0.0 || ^7.0.0
514
+ react: ^18.2.0
515
+ react-dom: ^18.2.0
516
+ sass: ^1.3.0
517
+ peerDependenciesMeta:
518
+ '@opentelemetry/api':
519
+ optional: true
520
+ fibers:
521
+ optional: true
522
+ node-sass:
523
+ optional: true
524
+ sass:
525
+ optional: true
526
+ dependencies:
527
+ '@next/env': 13.4.3
528
+ '@swc/helpers': 0.5.1
529
+ busboy: 1.6.0
530
+ caniuse-lite: 1.0.30001489
531
+ postcss: 8.4.14
532
+ react: 18.2.0
533
+ react-dom: 18.2.0([email protected])
534
+ styled-jsx: 5.1.1([email protected])
535
+ zod: 3.21.4
536
+ optionalDependencies:
537
+ '@next/swc-darwin-arm64': 13.4.3
538
+ '@next/swc-darwin-x64': 13.4.3
539
+ '@next/swc-linux-arm64-gnu': 13.4.3
540
+ '@next/swc-linux-arm64-musl': 13.4.3
541
+ '@next/swc-linux-x64-gnu': 13.4.3
542
+ '@next/swc-linux-x64-musl': 13.4.3
543
+ '@next/swc-win32-arm64-msvc': 13.4.3
544
+ '@next/swc-win32-ia32-msvc': 13.4.3
545
+ '@next/swc-win32-x64-msvc': 13.4.3
546
+ transitivePeerDependencies:
547
+ - '@babel/core'
548
+ - babel-plugin-macros
549
+ dev: false
550
+
551
552
+ resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==}
553
+ hasBin: true
554
+ dev: false
555
+
556
557
+ resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==}
558
+ dev: false
559
+
560
561
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
562
+ engines: {node: '>=0.10.0'}
563
+ dev: false
564
+
565
566
+ resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
567
+ engines: {node: '>=0.10.0'}
568
+ dev: false
569
+
570
571
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
572
+ engines: {node: '>=0.10.0'}
573
+ dev: false
574
+
575
576
+ resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
577
+ engines: {node: '>= 6'}
578
+ dev: false
579
+
580
581
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
582
+ dependencies:
583
+ wrappy: 1.0.2
584
+ dev: false
585
+
586
587
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
588
+ engines: {node: '>=0.10.0'}
589
+ dev: false
590
+
591
592
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
593
+ dev: false
594
+
595
596
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
597
+ dev: false
598
+
599
600
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
601
+ engines: {node: '>=8.6'}
602
+ dev: false
603
+
604
605
+ resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
606
+ engines: {node: '>=0.10.0'}
607
+ dev: false
608
+
609
610
+ resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==}
611
+ engines: {node: '>= 6'}
612
+ dev: false
613
+
614
615
+ resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
616
+ engines: {node: '>=14.0.0'}
617
+ peerDependencies:
618
+ postcss: ^8.0.0
619
+ dependencies:
620
+ postcss: 8.4.23
621
+ postcss-value-parser: 4.2.0
622
+ read-cache: 1.0.0
623
+ resolve: 1.22.2
624
+ dev: false
625
+
626
627
+ resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
628
+ engines: {node: ^12 || ^14 || >= 16}
629
+ peerDependencies:
630
+ postcss: ^8.4.21
631
+ dependencies:
632
+ camelcase-css: 2.0.1
633
+ postcss: 8.4.23
634
+ dev: false
635
+
636
637
+ resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==}
638
+ engines: {node: '>= 14'}
639
+ peerDependencies:
640
+ postcss: '>=8.0.9'
641
+ ts-node: '>=9.0.0'
642
+ peerDependenciesMeta:
643
+ postcss:
644
+ optional: true
645
+ ts-node:
646
+ optional: true
647
+ dependencies:
648
+ lilconfig: 2.1.0
649
+ postcss: 8.4.23
650
+ yaml: 2.3.0
651
+ dev: false
652
+
653
654
+ resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
655
+ engines: {node: '>=12.0'}
656
+ peerDependencies:
657
+ postcss: ^8.2.14
658
+ dependencies:
659
+ postcss: 8.4.23
660
+ postcss-selector-parser: 6.0.13
661
+ dev: false
662
+
663
664
+ resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==}
665
+ engines: {node: '>=4'}
666
+ dependencies:
667
+ cssesc: 3.0.0
668
+ util-deprecate: 1.0.2
669
+ dev: false
670
+
671
672
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
673
+ dev: false
674
+
675
676
+ resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
677
+ engines: {node: ^10 || ^12 || >=14}
678
+ dependencies:
679
+ nanoid: 3.3.6
680
+ picocolors: 1.0.0
681
+ source-map-js: 1.0.2
682
+ dev: false
683
+
684
685
+ resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==}
686
+ engines: {node: ^10 || ^12 || >=14}
687
+ dependencies:
688
+ nanoid: 3.3.6
689
+ picocolors: 1.0.0
690
+ source-map-js: 1.0.2
691
+ dev: false
692
+
693
694
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
695
+ dev: false
696
+
697
698
+ resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
699
+ peerDependencies:
700
+ react: ^18.2.0
701
+ dependencies:
702
+ loose-envify: 1.4.0
703
+ react: 18.2.0
704
+ scheduler: 0.23.0
705
+ dev: false
706
+
707
708
+ resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
709
+ engines: {node: '>=0.10.0'}
710
+ dependencies:
711
+ loose-envify: 1.4.0
712
+ dev: false
713
+
714
715
+ resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
716
+ dependencies:
717
+ pify: 2.3.0
718
+ dev: false
719
+
720
721
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
722
+ engines: {node: '>=8.10.0'}
723
+ dependencies:
724
+ picomatch: 2.3.1
725
+ dev: false
726
+
727
728
+ resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==}
729
+ hasBin: true
730
+ dependencies:
731
+ is-core-module: 2.12.1
732
+ path-parse: 1.0.7
733
+ supports-preserve-symlinks-flag: 1.0.0
734
+ dev: false
735
+
736
737
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
738
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
739
+ dev: false
740
+
741
742
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
743
+ dependencies:
744
+ queue-microtask: 1.2.3
745
+ dev: false
746
+
747
748
+ resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
749
+ dependencies:
750
+ loose-envify: 1.4.0
751
+ dev: false
752
+
753
754
+ resolution: {integrity: sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==}
755
+ engines: {node: '>=6'}
756
+ dev: false
757
+
758
759
+ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
760
+ engines: {node: '>=0.10.0'}
761
+ dev: false
762
+
763
764
+ resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
765
+ engines: {node: '>=10.0.0'}
766
+ dev: false
767
+
768
769
+ resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
770
+ engines: {node: '>= 12.0.0'}
771
+ peerDependencies:
772
+ '@babel/core': '*'
773
+ babel-plugin-macros: '*'
774
+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0'
775
+ peerDependenciesMeta:
776
+ '@babel/core':
777
+ optional: true
778
+ babel-plugin-macros:
779
+ optional: true
780
+ dependencies:
781
+ client-only: 0.0.1
782
+ react: 18.2.0
783
+ dev: false
784
+
785
786
+ resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==}
787
+ engines: {node: '>=8'}
788
+ hasBin: true
789
+ dependencies:
790
+ '@jridgewell/gen-mapping': 0.3.3
791
+ commander: 4.1.1
792
+ glob: 7.1.6
793
+ lines-and-columns: 1.2.4
794
+ mz: 2.7.0
795
+ pirates: 4.0.5
796
+ ts-interface-checker: 0.1.13
797
+ dev: false
798
+
799
800
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
801
+ engines: {node: '>= 0.4'}
802
+ dev: false
803
+
804
805
+ resolution: {integrity: sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==}
806
+ engines: {node: '>=14.0.0'}
807
+ hasBin: true
808
+ dependencies:
809
+ '@alloc/quick-lru': 5.2.0
810
+ arg: 5.0.2
811
+ chokidar: 3.5.3
812
+ didyoumean: 1.2.2
813
+ dlv: 1.1.3
814
+ fast-glob: 3.2.12
815
+ glob-parent: 6.0.2
816
+ is-glob: 4.0.3
817
+ jiti: 1.18.2
818
+ lilconfig: 2.1.0
819
+ micromatch: 4.0.5
820
+ normalize-path: 3.0.0
821
+ object-hash: 3.0.0
822
+ picocolors: 1.0.0
823
+ postcss: 8.4.23
824
+ postcss-import: 15.1.0([email protected])
825
+ postcss-js: 4.0.1([email protected])
826
+ postcss-load-config: 4.0.1([email protected])
827
+ postcss-nested: 6.0.1([email protected])
828
+ postcss-selector-parser: 6.0.13
829
+ postcss-value-parser: 4.2.0
830
+ resolve: 1.22.2
831
+ sucrase: 3.32.0
832
+ transitivePeerDependencies:
833
+ - ts-node
834
+ dev: false
835
+
836
837
+ resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
838
+ engines: {node: '>=0.8'}
839
+ dependencies:
840
+ thenify: 3.3.1
841
+ dev: false
842
+
843
844
+ resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
845
+ dependencies:
846
+ any-promise: 1.3.0
847
+ dev: false
848
+
849
850
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
851
+ engines: {node: '>=8.0'}
852
+ dependencies:
853
+ is-number: 7.0.0
854
+ dev: false
855
+
856
857
+ resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
858
+ dev: false
859
+
860
861
+ resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==}
862
+ dev: false
863
+
864
865
+ resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==}
866
+ hasBin: true
867
+ peerDependencies:
868
+ browserslist: '>= 4.21.0'
869
+ dependencies:
870
+ browserslist: 4.21.5
871
+ escalade: 3.1.1
872
+ picocolors: 1.0.0
873
+ dev: false
874
+
875
876
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
877
+ dev: false
878
+
879
880
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
881
+ dev: false
882
+
883
884
+ resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==}
885
+ engines: {node: '>=10.0.0'}
886
+ peerDependencies:
887
+ bufferutil: ^4.0.1
888
+ utf-8-validate: '>=5.0.2'
889
+ peerDependenciesMeta:
890
+ bufferutil:
891
+ optional: true
892
+ utf-8-validate:
893
+ optional: true
894
+ dependencies:
895
+ bufferutil: 4.0.7
896
+ dev: false
897
+
898
899
+ resolution: {integrity: sha512-8/1wgzdKc7bc9E6my5wZjmdavHLvO/QOmLG1FBugblEvY4IXrLjlViIOmL24HthU042lWTDRO90Fz1Yp66UnMw==}
900
+ engines: {node: '>= 14', npm: '>= 7'}
901
+ dev: false
902
+
903
904
+ resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==}
905
+ dev: false
postcss.config.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ module.exports = {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ }
public/favicon.ico ADDED
public/next.svg ADDED
public/vercel.svg ADDED
styles/globals.css ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ }
tailwind.config.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /** @type {import('tailwindcss').Config} */
2
+ module.exports = {
3
+ content: [
4
+ './pages/**/*.{js,ts,jsx,tsx,mdx}',
5
+ './components/**/*.{js,ts,jsx,tsx,mdx}',
6
+ './app/**/*.{js,ts,jsx,tsx,mdx}',
7
+ ],
8
+ theme: {
9
+ extend: {
10
+ backgroundImage: {
11
+ 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))',
12
+ 'gradient-conic':
13
+ 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))',
14
+ },
15
+
16
+ },
17
+ },
18
+ plugins: [],
19
+ }