├── .gitignore
├── README.md
├── next.config.mjs
├── package.json
├── public
├── 3dicons.png
├── card.png
├── christmas-pack.png
├── coolshapes.png
├── cut-hover.png
├── cut.png
├── figmaplugin.png
├── header-gradient.svg
├── icons
│ └── twitter.svg
├── illlustrations.png
├── next.svg
├── plugin-logos
│ ├── 3dicons.png
│ ├── animate-it.png
│ ├── gradient-map.png
│ ├── hues-and-gradients.png
│ ├── illlustrations.png
│ ├── kigen.png
│ ├── my-invoice.png
│ ├── noisy-gradients.png
│ ├── project-ds.png
│ ├── random-hues.png
│ ├── shape-shifter.png
│ ├── stippling.png
│ ├── svg-to-code.png
│ ├── uilogos.png
│ └── wavify.png
├── power-logo.png
├── preview.jpg
├── realvjy.svg
├── screenshot.png
├── thumbnails
│ ├── 3dicons.png
│ ├── animate-it.png
│ ├── gradient-map.png
│ ├── hues-and-gradients.png
│ ├── illlustrations.png
│ ├── kigen.png
│ ├── my-invoice.png
│ ├── noisy-gradients.png
│ ├── project-animate.png
│ ├── project-dots.png
│ ├── project-ds.png
│ ├── project-wave.png
│ ├── random-hues.png
│ ├── shape-shifter.png
│ ├── stippling.png
│ ├── svg-to-code.png
│ ├── uilogos.png
│ └── wavify.png
└── vercel.svg
├── src
├── app
│ ├── (main)
│ │ ├── layout.tsx
│ │ └── page.tsx
│ ├── favicon.ico
│ └── layout.tsx
├── components
│ ├── PlguinComponent.tsx
│ ├── ShootingStars.tsx
│ ├── StarBackground.tsx
│ ├── TypingEffect.tsx
│ ├── footer.tsx
│ └── header.tsx
├── lib
│ ├── analytics.tsx
│ ├── common.tsx
│ ├── next-seo.config.js
│ ├── plguin-data.tsx
│ └── utils.tsx
└── styles
│ ├── fonts.ts
│ ├── fonts
│ ├── InterDisplay-Bold.woff2
│ ├── InterDisplay-Light.woff2
│ ├── InterDisplay-Medium.woff2
│ ├── InterDisplay-Regular.woff2
│ ├── InterDisplay-SemiBold.woff2
│ └── inter.css
│ ├── globals.scss
│ └── styled-registry.tsx
├── tsconfig.json
└── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
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 | .yarn/install-state.gz
8 |
9 | # testing
10 | /coverage
11 |
12 | # next.js
13 | /.next/
14 | /out/
15 |
16 | # production
17 | /build
18 |
19 | # misc
20 | .DS_Store
21 | *.pem
22 |
23 | # debug
24 | npm-debug.log*
25 | yarn-debug.log*
26 | yarn-error.log*
27 |
28 | # local env files
29 | .env*.local
30 |
31 | # vercel
32 | .vercel
33 |
34 | # typescript
35 | *.tsbuildinfo
36 | next-env.d.ts
37 | .idea
38 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | figma plugins
--------------------------------------------------------------------------------
/next.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {
3 | compiler: {
4 | styledComponents: true,
5 | },
6 | };
7 |
8 | export default nextConfig;
9 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "with-ts",
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 | "coolshapes-react": "^1.0.1",
13 | "next": "14.1.4",
14 | "next-seo": "^6.5.0",
15 | "nextjs-google-analytics": "^2.3.3",
16 | "react": "^18",
17 | "react-dom": "^18",
18 | "styled-components": "^6.1.8"
19 | },
20 | "devDependencies": {
21 | "@types/node": "^20",
22 | "@types/react": "^18",
23 | "@types/react-dom": "^18",
24 | "sass": "^1.72.0",
25 | "scss-reset": "^1.4.2",
26 | "typescript": "^5"
27 | }
28 | }
--------------------------------------------------------------------------------
/public/3dicons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/3dicons.png
--------------------------------------------------------------------------------
/public/card.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/card.png
--------------------------------------------------------------------------------
/public/christmas-pack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/christmas-pack.png
--------------------------------------------------------------------------------
/public/coolshapes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/coolshapes.png
--------------------------------------------------------------------------------
/public/cut-hover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/cut-hover.png
--------------------------------------------------------------------------------
/public/cut.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/cut.png
--------------------------------------------------------------------------------
/public/figmaplugin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/figmaplugin.png
--------------------------------------------------------------------------------
/public/header-gradient.svg:
--------------------------------------------------------------------------------
1 |
24 |
--------------------------------------------------------------------------------
/public/icons/twitter.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/illlustrations.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/illlustrations.png
--------------------------------------------------------------------------------
/public/next.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/public/plugin-logos/3dicons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/plugin-logos/3dicons.png
--------------------------------------------------------------------------------
/public/plugin-logos/animate-it.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/plugin-logos/animate-it.png
--------------------------------------------------------------------------------
/public/plugin-logos/gradient-map.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/plugin-logos/gradient-map.png
--------------------------------------------------------------------------------
/public/plugin-logos/hues-and-gradients.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/plugin-logos/hues-and-gradients.png
--------------------------------------------------------------------------------
/public/plugin-logos/illlustrations.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/plugin-logos/illlustrations.png
--------------------------------------------------------------------------------
/public/plugin-logos/kigen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/plugin-logos/kigen.png
--------------------------------------------------------------------------------
/public/plugin-logos/my-invoice.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/plugin-logos/my-invoice.png
--------------------------------------------------------------------------------
/public/plugin-logos/noisy-gradients.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/plugin-logos/noisy-gradients.png
--------------------------------------------------------------------------------
/public/plugin-logos/project-ds.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/plugin-logos/project-ds.png
--------------------------------------------------------------------------------
/public/plugin-logos/random-hues.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/plugin-logos/random-hues.png
--------------------------------------------------------------------------------
/public/plugin-logos/shape-shifter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/plugin-logos/shape-shifter.png
--------------------------------------------------------------------------------
/public/plugin-logos/stippling.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/plugin-logos/stippling.png
--------------------------------------------------------------------------------
/public/plugin-logos/svg-to-code.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/plugin-logos/svg-to-code.png
--------------------------------------------------------------------------------
/public/plugin-logos/uilogos.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/plugin-logos/uilogos.png
--------------------------------------------------------------------------------
/public/plugin-logos/wavify.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/plugin-logos/wavify.png
--------------------------------------------------------------------------------
/public/power-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/power-logo.png
--------------------------------------------------------------------------------
/public/preview.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/preview.jpg
--------------------------------------------------------------------------------
/public/realvjy.svg:
--------------------------------------------------------------------------------
1 |
26 |
--------------------------------------------------------------------------------
/public/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/screenshot.png
--------------------------------------------------------------------------------
/public/thumbnails/3dicons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/3dicons.png
--------------------------------------------------------------------------------
/public/thumbnails/animate-it.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/animate-it.png
--------------------------------------------------------------------------------
/public/thumbnails/gradient-map.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/gradient-map.png
--------------------------------------------------------------------------------
/public/thumbnails/hues-and-gradients.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/hues-and-gradients.png
--------------------------------------------------------------------------------
/public/thumbnails/illlustrations.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/illlustrations.png
--------------------------------------------------------------------------------
/public/thumbnails/kigen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/kigen.png
--------------------------------------------------------------------------------
/public/thumbnails/my-invoice.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/my-invoice.png
--------------------------------------------------------------------------------
/public/thumbnails/noisy-gradients.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/noisy-gradients.png
--------------------------------------------------------------------------------
/public/thumbnails/project-animate.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/project-animate.png
--------------------------------------------------------------------------------
/public/thumbnails/project-dots.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/project-dots.png
--------------------------------------------------------------------------------
/public/thumbnails/project-ds.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/project-ds.png
--------------------------------------------------------------------------------
/public/thumbnails/project-wave.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/project-wave.png
--------------------------------------------------------------------------------
/public/thumbnails/random-hues.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/random-hues.png
--------------------------------------------------------------------------------
/public/thumbnails/shape-shifter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/shape-shifter.png
--------------------------------------------------------------------------------
/public/thumbnails/stippling.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/stippling.png
--------------------------------------------------------------------------------
/public/thumbnails/svg-to-code.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/svg-to-code.png
--------------------------------------------------------------------------------
/public/thumbnails/uilogos.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/uilogos.png
--------------------------------------------------------------------------------
/public/thumbnails/wavify.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/public/thumbnails/wavify.png
--------------------------------------------------------------------------------
/public/vercel.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/app/(main)/layout.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import Footer from "@/components/footer";
3 | import Header from "@/components/header";
4 | import ShootingStars from "@/components/ShootingStars";
5 | import StarBackground from "@/components/StarBackground";
6 | import { ReactNode } from "react";
7 | import styled from "styled-components";
8 |
9 | export default function Layout({ children }: { children: ReactNode }) {
10 | return (
11 |
12 |
13 |
14 |
15 |
16 | {children}
17 |
18 | );
19 | }
20 |
21 | const Main = styled.main`
22 | position: relative;
23 | height: 100vh;
24 | overflow-x: hidden;
25 | &::before {
26 | content: "";
27 | position: absolute;
28 | inset: 0;
29 | z-index: -100;
30 | left: 50%;
31 | top: -50px;
32 | transform: translate(-50%, -50%);
33 | height: 250px;
34 | width: 800px;
35 | mix-blend-mode: color-dodge;
36 | border-radius: 50%;
37 | filter: blur(62px);
38 | background: linear-gradient(
39 | 0deg,
40 | rgba(43, 0, 255, 0.415) 0%,
41 | rgba(255, 0, 0, 0.8) 100%
42 | );
43 | z-index: -1;
44 | pointer-events: none;
45 | }
46 | `;
47 |
48 | const StarWrapper = styled.div`
49 | position: fixed;
50 | width: 100%;
51 | height: 100vh;
52 | z-index: -1;
53 | `;
54 |
--------------------------------------------------------------------------------
/src/app/(main)/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import Footer from "@/components/footer";
3 | import Header from "@/components/header";
4 | import styled from "styled-components";
5 | import PluginComponent from "@/components/PlguinComponent";
6 | import { pluginData } from "@/lib/plguin-data";
7 | import { getRandomShape, shapeTypes } from "coolshapes-react";
8 | import Link from "next/link";
9 |
10 | //TODO: reformat everything and add more animations
11 |
12 | export default function Home() {
13 | const randomCoolshape = getRandomShape({ onlyId: true }) as any;
14 | const sortedPlugins = [...pluginData].sort((a, b) => {
15 | // First sort by featured status (featured first)
16 | if (a.featured && !b.featured) return -1;
17 | if (!a.featured && b.featured) return 1;
18 |
19 | // If both are featured or both are not, sort by downloads (descending)
20 | return b.downloads - a.downloads;
21 | });
22 | return (
23 |
24 |
25 |
26 |
27 |
28 | {sortedPlugins.map((data) => (
29 |
30 |
31 |
32 | ))}
33 |
34 |
35 |
36 |
37 |
38 |
39 |
50 |
51 |
52 | );
53 | }
54 |
55 | const MainSection = styled.section``;
56 |
57 | const MainPage = styled.div`
58 | position: relative;
59 | `;
60 | const Family = styled.div`
61 | bottom: 0;
62 | right: 0;
63 | position: fixed;
64 | display: flex;
65 | justify-content: right;
66 | @media screen and (max-width: 500px) {
67 | position: relative;
68 | justify-content: center;
69 | overflow: hidden;
70 | }
71 | .color {
72 | position: absolute;
73 | bottom: -50%;
74 | height: 300px;
75 | width: 60px;
76 | border-radius: 50%;
77 | z-index: -1;
78 | background: linear-gradient(
79 | 134.41deg,
80 | rgba(47, 0, 255, 0.2) 0%,
81 | rgba(255, 0, 0, 1) 100%
82 | );
83 | filter: blur(62px);
84 | }
85 | .wrap {
86 | padding: 20px 40px;
87 | display: flex;
88 | align-items: end;
89 | flex-direction: column;
90 | @media screen and (max-width: 500px) {
91 | align-items: center;
92 | }
93 | gap: 16px;
94 | a {
95 | transition: all ease 400ms;
96 | &:hover {
97 | transform: rotate(-4deg) scale(1.05);
98 | }
99 | }
100 | .cs {
101 | height: 54px;
102 | }
103 | .il {
104 | height: 40px;
105 | }
106 | .td {
107 | height: 44px;
108 | }
109 | }
110 | `;
111 |
112 | const MainWrapper = styled.div`
113 | margin-top: 40px;
114 | display: flex;
115 | flex-direction: column;
116 | gap: 40px;
117 | `;
118 |
119 | const Nav = styled.nav`
120 | display: flex;
121 | flex-direction: column;
122 | width: 260px;
123 | padding-top: 120px;
124 | `;
125 | const PluginWrapper = styled.div`
126 | text-align: center;
127 | padding-top: 30px;
128 | display: flex;
129 | flex-direction: column;
130 | gap: 25px;
131 | /* overflow: auto; */
132 | width: 345px;
133 | `;
134 |
--------------------------------------------------------------------------------
/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/src/app/favicon.ico
--------------------------------------------------------------------------------
/src/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import { JetBrains_Mono } from "next/font/google";
2 | import "../styles/globals.scss";
3 | import StyledComponentsRegistry from "@/styles/styled-registry";
4 | import { Metadata } from "next";
5 | import localFont from "next/font/local";
6 | import { inter, jetBrainsMono } from "@/styles/fonts";
7 | import seoData from "@/lib/next-seo.config";
8 | import AnalyticsProvider from "@/lib/analytics";
9 |
10 | export const metadata = {
11 | metadataBase: new URL(seoData.openGraph.url),
12 | title: {
13 | default: seoData.openGraph.title,
14 | template: " %s",
15 | },
16 | description: seoData.openGraph.description,
17 | keywords: seoData.openGraph.keywords,
18 | openGraph: {
19 | type: "website",
20 | description: seoData.openGraph.description,
21 | url: seoData.openGraph.url,
22 | title: seoData.openGraph.title,
23 | locale: "en_EN",
24 | siteName: "figmaplug.in",
25 | images: [
26 | {
27 | width: 1200,
28 | height: 630,
29 | url: seoData.openGraph.images[0].url,
30 | alt: seoData.openGraph.title,
31 | },
32 | ],
33 | },
34 | twitter: {
35 | card: seoData.twitter.cardType,
36 | title: seoData.openGraph.title,
37 | description: seoData.openGraph.description,
38 | creator: seoData.twitter.handle,
39 | creatorId: seoData.twitter.id,
40 | site: "figmaplug.in",
41 | images: [seoData.openGraph.images[0].url],
42 | },
43 | robots: {
44 | nosnippet: false,
45 | notranslate: true,
46 | noimageindex: false,
47 | noarchive: false,
48 | maxSnippet: -1,
49 | maxImagePreview: "large",
50 | maxVideoPreview: -1,
51 | },
52 | };
53 |
54 | export default function RootLayout({
55 | children,
56 | }: {
57 | children: React.ReactNode;
58 | }) {
59 | return (
60 |
61 |
62 |
63 |
64 | {children}
65 |
66 |
67 |
68 | );
69 | }
70 |
--------------------------------------------------------------------------------
/src/components/PlguinComponent.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { pluginDatatype } from "@/lib/plguin-data";
3 | import styled from "styled-components";
4 | import Link from "next/link";
5 | import React, { useState, useRef } from "react";
6 | import { ArrowIcon } from "@/lib/common";
7 | import TypingEffect from "./TypingEffect";
8 |
9 | export default function PluginComponent({
10 | pluginData,
11 | }: {
12 | pluginData: pluginDatatype;
13 | }) {
14 | const downloads = Intl.NumberFormat("en-US", {
15 | notation: "compact",
16 | maximumFractionDigits: 1,
17 | }).format(pluginData.downloads);
18 |
19 | const likes = Intl.NumberFormat("en-US", {
20 | notation: "compact",
21 | maximumFractionDigits: 1,
22 | }).format(pluginData.likes);
23 |
24 | const [transformOrigin, setTransformOrigin] = useState("center center");
25 | const [isHovered, setIsHovered] = useState(false);
26 | const delayTimeout = useRef(null);
27 |
28 | const handleMouseEnter = (
29 | e: React.MouseEvent
30 | ) => {
31 | const rect = e.currentTarget.getBoundingClientRect();
32 | const x = e.clientX - rect.left; // x position within the element
33 | const y = e.clientY - rect.top; // y position within the element
34 | setTransformOrigin(`${x}px ${y}px`);
35 | setIsHovered(true);
36 | };
37 |
38 | const handleMouseLeave = () => {
39 | setIsHovered(false);
40 | };
41 | const words = [
42 | { key: "likes", type: `stat`, value: `${likes === "0" ? "new" : likes}` },
43 | {
44 | key: "usage",
45 | type: `stat`,
46 | value: `${downloads === "0" ? "new" : downloads}`,
47 | },
48 | ];
49 |
50 | return (
51 |
59 |
60 |
61 |
62 | figmaplug.in
63 |
64 |

65 |

66 |
67 |
68 |
69 |
70 |
71 |
72 | {pluginData.name}
73 | {pluginData.description}
74 |
75 |
76 |
77 |
78 |
81 | {pluginData.type}
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 | );
91 | }
92 |
93 | export const Wrapper = styled.div`
94 | display: flex;
95 | position: relative;
96 | flex-direction: column;
97 | width: 344px;
98 | height: 382px;
99 | align-items: center;
100 | cursor: pointer;
101 | transition: transform 0.3s ease;
102 | transform-origin: top left; /* Set the anchor point for rotation */
103 |
104 | .card {
105 | max-width: 344px;
106 | }
107 |
108 | .cut {
109 | position: absolute;
110 | bottom: 0;
111 | width: 38px;
112 | height: 24px;
113 | left: calc(50% + 10px);
114 | bottom: 17.5px;
115 | transform: translateX(-50%);
116 | img {
117 | position: absolute;
118 | top: 50%;
119 | left: 50%;
120 | transform: translate(-50%, -50%);
121 | transition: all ease 300ms;
122 | &.hov {
123 | opacity: 0;
124 | max-width: 94px !important;
125 | }
126 | }
127 | }
128 | &:hover {
129 | transform: rotate(2deg); /* Rotate 45 degrees on hover */
130 | .cut {
131 | .normal {
132 | opacity: 0;
133 | }
134 | .hov {
135 | opacity: 1;
136 | mix-blend-mode: overlay;
137 | }
138 | }
139 | }
140 |
141 | .credit {
142 | position: absolute;
143 | transform: rotate(-90deg) translateX(-105%);
144 | left: -36px;
145 | font-size: 12px;
146 | text-transform: uppercase;
147 | letter-spacing: 3px;
148 | color: #606060;
149 | text-shadow: 0px 1.5px 1px #000000;
150 | }
151 | `;
152 |
153 | const CardBase = styled.div`
154 | position: absolute;
155 | top: 0;
156 | filter: drop-shadow(16px 10px 12px rgba(0, 0, 0, 0.5))
157 | drop-shadow(8px 12px 8px rgba(0, 0, 0, 0.55));
158 | `;
159 | export const Thumbnail = styled.div`
160 | img {
161 | border-radius: 6px;
162 | }
163 | `;
164 |
165 | const TextInfo = styled.div`
166 | display: flex;
167 | flex-direction: column;
168 | `;
169 |
170 | export const Content = styled.div`
171 | display: flex;
172 | position: relative;
173 | flex-direction: column;
174 | height: fit-content;
175 | justify-content: space-between;
176 | padding: 14px 12px;
177 | transform: translateX(10px) translateY(60px);
178 | height: 260px;
179 | width: 260px;
180 | background: linear-gradient(
181 | 160deg,
182 | rgba(103, 103, 103, 0.25) 14%,
183 | rgba(14, 14, 14, 0.2) 97.3%
184 | ),
185 | #0c0c0c;
186 | box-shadow: 0.6px 0.6px 0px rgba(255, 255, 255, 0.297),
187 | inset 0px 4.8px 4.8px rgba(0, 0, 0, 0.2),
188 | inset 2px 3px 1.2px rgba(0, 0, 0, 0.45);
189 | border-radius: 12px;
190 | `;
191 |
192 | export const ContentMeta = styled.div`
193 | display: flex;
194 | flex-direction: row;
195 | justify-content: space-between;
196 | width: 100%;
197 | margin-top: 12px;
198 | margin-bottom: 4px;
199 | align-items: center;
200 | .info {
201 | font-size: 11px;
202 | text-transform: uppercase;
203 | display: flex;
204 | align-items: center;
205 | gap: 4px;
206 | }
207 | .plugin-type {
208 | text-transform: uppercase;
209 | border-radius: 10px;
210 | padding: 4px 8px;
211 |
212 | &.free {
213 | background: var(--color-bg-cyan);
214 | color: var(--color-text-blue);
215 | }
216 |
217 | &.freemium,
218 | &.pad {
219 | background: var(--color-bg-orange);
220 | color: var(--color-text-orange);
221 | }
222 | }
223 | .downloads {
224 | color: var(--primary-fg-color);
225 | @media screen and (max-width: 500px) {
226 | }
227 | }
228 | `;
229 |
230 | const Badge = styled.div`
231 | background-color: rgba(95, 95, 95, 0.2);
232 | font-size: 10px;
233 | text-transform: uppercase;
234 | letter-spacing: 1px;
235 | border-radius: 2px;
236 | padding: 2px 6px;
237 | &.freemium {
238 | color: #fffa6d;
239 | }
240 | &.free {
241 | color: #68ff32;
242 | }
243 | `;
244 | export const PluginLogo = styled.div`
245 | /* transform: translateY(calc(-50% - 12px)); */
246 | right: 20px;
247 | position: absolute;
248 | display: flex;
249 | top: 7px;
250 | .logo-fx {
251 | top: 0;
252 | background-color: rgba(250, 0, 0, 0.7);
253 | transform: translateX(30px);
254 | height: 6px;
255 | width: 40px;
256 | filter: blur(12px);
257 | border-radius: 50%;
258 | }
259 | img {
260 | z-index: 1;
261 | height: 26px;
262 | border-radius: 6px;
263 | filter: drop-shadow(1px 1px 4px rgba(255, 0, 0, 0.4));
264 | border: 1px solid rgba(220, 220, 220, 0.2);
265 | }
266 | `;
267 | export const PluginTitle = styled.h3`
268 | font-weight: 700;
269 | font-size: 16px;
270 | letter-spacing: 0.3px;
271 | margin-top: 4px;
272 | text-transform: uppercase;
273 | text-shadow: 2px 2px 0.2px rgba(0, 0, 0, 0.7);
274 | @media screen and (max-width: 500px) {
275 | }
276 | `;
277 | export const PluginDescription = styled.p`
278 | font-size: 14px;
279 | font-weight: 400;
280 | line-height: 16px;
281 | letter-spacing: -0.5px;
282 | color: var(--primary-fg-text);
283 | margin-top: 8px;
284 | overflow: hidden;
285 | display: -webkit-box;
286 | -webkit-line-clamp: 2; /* number of lines to show */
287 | line-clamp: 2;
288 | -webkit-box-orient: vertical;
289 | @media screen and (max-width: 500px) {
290 | }
291 | `;
292 | export const PluginButton = styled(Link)`
293 | font-size: 1em;
294 | border-radius: 15px;
295 | padding: 8px 20px;
296 | background: var(--primary-fg-color);
297 | color: var(--primary-bg-color);
298 | margin-top: 18px;
299 | `;
300 |
--------------------------------------------------------------------------------
/src/components/ShootingStars.tsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState, useRef } from "react";
2 |
3 | interface ShootingStar {
4 | id: number;
5 | x: number;
6 | y: number;
7 | angle: number;
8 | scale: number;
9 | speed: number;
10 | distance: number;
11 | }
12 |
13 | const getRandomStartPoint = () => {
14 | const side = Math.floor(Math.random() * 4);
15 | const offset = Math.random() * window.innerWidth;
16 |
17 | switch (side) {
18 | case 0: // Top
19 | return { x: offset, y: 0, angle: 45 };
20 | case 1: // Right
21 | return { x: window.innerWidth, y: offset, angle: 135 };
22 | case 2: // Bottom
23 | return { x: offset, y: window.innerHeight, angle: 225 };
24 | case 3: // Left
25 | return { x: 0, y: offset, angle: 315 };
26 | default:
27 | return { x: 0, y: 0, angle: 45 };
28 | }
29 | };
30 |
31 | const ShootingStars: React.FC = () => {
32 | const [star, setStar] = useState(null);
33 | const svgRef = useRef(null);
34 |
35 | useEffect(() => {
36 | const createStar = () => {
37 | const { x, y, angle } = getRandomStartPoint();
38 | const newStar: ShootingStar = {
39 | id: Date.now(),
40 | x,
41 | y,
42 | angle,
43 | scale: 1,
44 | speed: Math.random() * 20 + 10, // Increased speed range
45 | distance: 0,
46 | };
47 | setStar(newStar);
48 |
49 | // Set a random delay (between 0.5 and 4 seconds) for creating the next star
50 | const randomDelay = Math.random() * 4500 + 4200;
51 | setTimeout(createStar, randomDelay);
52 | };
53 |
54 | createStar(); // Initial star creation
55 |
56 | return () => {}; // No cleanup needed for timeout
57 | }, []);
58 |
59 | useEffect(() => {
60 | const moveStar = () => {
61 | if (star) {
62 | setStar((prevStar) => {
63 | if (!prevStar) return null;
64 | const newX =
65 | prevStar.x +
66 | prevStar.speed * Math.cos((prevStar.angle * Math.PI) / 180);
67 | const newY =
68 | prevStar.y +
69 | prevStar.speed * Math.sin((prevStar.angle * Math.PI) / 180);
70 | const newDistance = prevStar.distance + prevStar.speed;
71 | const newScale = 1 + newDistance / 100; // Adjust scale based on distance traveled
72 | // Check if the star is out of bounds considering the star size
73 | if (
74 | newX < -20 ||
75 | newX > window.innerWidth + 20 ||
76 | newY < -20 ||
77 | newY > window.innerHeight + 20
78 | ) {
79 | return null; // Star moves out of bounds, remove it
80 | }
81 | return {
82 | ...prevStar,
83 | x: newX,
84 | y: newY,
85 | distance: newDistance,
86 | scale: newScale,
87 | };
88 | });
89 | }
90 | };
91 |
92 | const animationFrame = requestAnimationFrame(moveStar);
93 | return () => cancelAnimationFrame(animationFrame);
94 | }, [star]);
95 |
96 | return (
97 |
126 | );
127 | };
128 |
129 | export default ShootingStars;
130 |
--------------------------------------------------------------------------------
/src/components/StarBackground.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect, useRef, RefObject } from "react";
2 |
3 | interface StarProps {
4 | x: number;
5 | y: number;
6 | radius: number;
7 | opacity: number;
8 | twinkleSpeed: number | null;
9 | }
10 |
11 | const Star: React.FC = ({ x, y, radius, opacity, twinkleSpeed }) => (
12 |
13 | {twinkleSpeed !== null && (
14 |
20 | )}
21 |
22 | );
23 |
24 | interface StarBackgroundProps {
25 | starDensity?: number;
26 | allStarsTwinkle?: boolean;
27 | twinkleProbability?: number;
28 | minTwinkleSpeed?: number;
29 | maxTwinkleSpeed?: number;
30 | }
31 |
32 | const StarBackground: React.FC = ({
33 | starDensity = 0.00015,
34 | allStarsTwinkle = true,
35 | twinkleProbability = 0.7,
36 | minTwinkleSpeed = 0.5,
37 | maxTwinkleSpeed = 1,
38 | }) => {
39 | const [stars, setStars] = useState([]);
40 | const containerRef: RefObject = useRef(null);
41 |
42 | const generateStars = (width: number, height: number): StarProps[] => {
43 | const area = width * height;
44 | const numStars = Math.floor(area * starDensity);
45 | return Array.from({ length: numStars }, () => {
46 | const shouldTwinkle =
47 | allStarsTwinkle || Math.random() < twinkleProbability;
48 | return {
49 | x: Math.random() * width,
50 | y: Math.random() * height,
51 | radius: Math.random() * 0.05 + 0.5, // Random radius between 0.5 and 0.7
52 | opacity: Math.random() * 0.5 + 0.5, // Random opacity between 0.5 and 1
53 | twinkleSpeed: shouldTwinkle
54 | ? minTwinkleSpeed +
55 | Math.random() * (maxTwinkleSpeed - minTwinkleSpeed)
56 | : null,
57 | };
58 | });
59 | };
60 |
61 | useEffect(() => {
62 | const updateStars = () => {
63 | if (containerRef.current) {
64 | const { width, height } = containerRef.current.getBoundingClientRect();
65 | setStars(generateStars(width, height));
66 | }
67 | };
68 |
69 | updateStars(); // Initial generation
70 |
71 | const resizeObserver = new ResizeObserver(updateStars);
72 | if (containerRef.current) {
73 | resizeObserver.observe(containerRef.current);
74 | }
75 |
76 | return () => {
77 | if (containerRef.current) {
78 | resizeObserver.unobserve(containerRef.current);
79 | }
80 | };
81 | }, [
82 | starDensity,
83 | allStarsTwinkle,
84 | twinkleProbability,
85 | minTwinkleSpeed,
86 | maxTwinkleSpeed,
87 | ]);
88 |
89 | return (
90 |
91 |
102 |
103 | );
104 | };
105 |
106 | export default StarBackground;
107 |
--------------------------------------------------------------------------------
/src/components/TypingEffect.tsx:
--------------------------------------------------------------------------------
1 | import { ArrowIcon, HeartIcon } from "@/lib/common";
2 | import React, { useState, useEffect } from "react";
3 | import styled from "styled-components";
4 |
5 | interface Word {
6 | key: string;
7 | type: string;
8 | value: string;
9 | }
10 |
11 | interface TypingEffectProps {
12 | words: Word[];
13 | delayTypingChar?: number;
14 | delayBetweenWords?: number;
15 | }
16 |
17 | const TypingEffect: React.FC = ({
18 | words = [
19 | { key: "default1", type: "normal", value: "Default" },
20 | { key: "default2", type: "normal", value: "Words" },
21 | ],
22 | delayTypingChar = 200,
23 | delayBetweenWords = 2000,
24 | }) => {
25 | const [currentText, setCurrentText] = useState("");
26 | const [currentType, setCurrentType] = useState("");
27 | const [currentIndex, setCurrentIndex] = useState(0);
28 | const [isTyping, setIsTyping] = useState(true);
29 |
30 | useEffect(() => {
31 | if (!Array.isArray(words) || words.length === 0) {
32 | return;
33 | }
34 |
35 | let timeout: NodeJS.Timeout;
36 |
37 | const currentWord = words[currentIndex];
38 | if (
39 | !currentWord ||
40 | typeof currentWord.value !== "string" ||
41 | typeof currentWord.key !== "string"
42 | ) {
43 | return;
44 | }
45 |
46 | const combinedText = `${currentWord.value} ${currentWord.key}`;
47 | setCurrentType(`${currentWord.key}`);
48 | if (isTyping) {
49 | if (currentText.length < combinedText.length) {
50 | timeout = setTimeout(() => {
51 | setCurrentText((prev) => combinedText.slice(0, prev.length + 1));
52 | }, delayTypingChar);
53 | } else {
54 | timeout = setTimeout(() => setIsTyping(false), delayBetweenWords);
55 | }
56 | } else {
57 | if (currentText.length > 0) {
58 | timeout = setTimeout(() => {
59 | setCurrentText((prev) => prev.slice(0, -1));
60 | }, delayTypingChar);
61 | } else {
62 | setCurrentIndex((prev) => (prev + 1) % words.length);
63 | setIsTyping(true);
64 | }
65 | }
66 |
67 | return () => clearTimeout(timeout);
68 | }, [
69 | currentText,
70 | currentIndex,
71 | isTyping,
72 | words,
73 | delayTypingChar,
74 | delayBetweenWords,
75 | ]);
76 |
77 | const getIcon = (tag: string) => {
78 | switch (tag) {
79 | case "usage":
80 | default:
81 | return ;
82 | break;
83 | case "likes":
84 | return ;
85 | break;
86 | }
87 | };
88 | return (
89 |
90 | {getIcon(currentType)}
91 | {currentText}
92 | _
93 |
94 | );
95 | };
96 |
97 | export default TypingEffect;
98 |
99 | const MetaInfo = styled.div`
100 | display: flex;
101 | align-items: center;
102 | gap: 4px;
103 | span {
104 | font-size: 11px;
105 | }
106 | `;
107 |
--------------------------------------------------------------------------------
/src/components/footer.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import styled from "styled-components";
3 | import Link from "next/link";
4 |
5 | export default function Footer() {
6 | return (
7 |
8 |
9 |
10 | made by
11 |
12 |
13 |
14 |
15 |
16 | at
17 |
18 |
22 | @overlayz
23 |
24 | {" "}
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | );
34 | }
35 |
36 | const Section = styled.footer`
37 | padding: 10px 0px;
38 | margin-top: auto;
39 | `;
40 | const Wrapper = styled.div`
41 | display: flex;
42 | justify-content: center;
43 | margin-top: 30px;
44 | padding: 40px 0;
45 | font-size: 14px;
46 | letter-spacing: -0.2px;
47 | font-weight: 500;
48 | color: #626262;
49 | gap: 4px;
50 | font-family: var(--font-inter);
51 | align-items: center;
52 | span {
53 | padding-inline: 5px;
54 | font-weight: 500;
55 | a {
56 | opacity: 0.5;
57 | &:hover {
58 | opacity: 1;
59 | }
60 | }
61 | &.img {
62 | padding: 0;
63 | }
64 | }
65 | `;
66 |
--------------------------------------------------------------------------------
/src/components/header.tsx:
--------------------------------------------------------------------------------
1 | /* eslint-disable @next/next/no-img-element */
2 | "use client";
3 | import Link from "next/link";
4 | import styled from "styled-components";
5 | import { Coolshape, shapeTypes } from "coolshapes-react";
6 | import { FigmaIcon } from "@/lib/common";
7 |
8 | export default function Header({
9 | shape,
10 | }: {
11 | shape: { shapeType: shapeTypes; index: number };
12 | }) {
13 | return (
14 |
15 |
16 |
17 |
18 | {/* */}
19 |
20 |
21 | Figma plugins I made over the years
22 |
25 |
26 |
27 |
28 | );
29 | }
30 |
31 | const Section = styled.header``;
32 | const Wrapper = styled.div`
33 | display: flex;
34 | justify-content: space-between;
35 | flex-direction: column;
36 | gap: 4px;
37 | align-items: center;
38 | margin-top: 40px;
39 |
40 | transition: transform 0.3s ease, transform-origin 0.3s ease;
41 | `;
42 | const LogoWrapper = styled(Link)`
43 | display: flex;
44 | margin-bottom: 6px;
45 | img {
46 | max-width: 64px;
47 | transition: transform 1200ms ease;
48 | filter: drop-shadow(1px 3px 1px rgba(0, 0, 0, 0.4))
49 | drop-shadow(3px 2px 6px rgba(0, 0, 0, 0.2));
50 | &:hover {
51 | transform: rotate(360deg);
52 | }
53 | }
54 | .logo {
55 | width: auto;
56 | max-height: 60px;
57 |
58 | filter: drop-shadow(0.48px 2px 0.24px rgba(0, 0, 0, 0.95))
59 | drop-shadow(0.48px 1.44px 2.88px rgba(0, 0, 0, 0.95));
60 | }
61 | `;
62 | const HeaderText = styled.h1`
63 | display: flex;
64 | align-items: center;
65 | text-align: center;
66 | font-size: 24px;
67 | max-width: 250px;
68 | font-weight: 700;
69 | letter-spacing: -0.4px;
70 | font-family: var(--font-inter);
71 | background: linear-gradient(
72 | to right,
73 | #ffffff,
74 | #696969
75 | ); /* Define the gradient colors */
76 | -webkit-background-clip: text; /* Safari/Chrome */
77 | -webkit-text-fill-color: transparent; /* Safari/Chrome */
78 | background-clip: text; /* Standard syntax */
79 | color: transparent; /* Standard syntax */
80 | `;
81 |
82 | const NavLink = styled(Link)`
83 | font-size: 16px;
84 | display: flex;
85 | align-items: center;
86 | text-align: center;
87 |
88 | &.themed {
89 | padding: 4px 16px;
90 | background: black;
91 | border-radius: 20px;
92 | color: white;
93 | }
94 | `;
95 |
96 | const Button = styled(Link)`
97 | font-size: 16px;
98 | font-weight: 600;
99 | border-radius: 15px;
100 | padding: 12px 24px;
101 | margin-top: 18px;
102 | display: flex;
103 | align-items: center;
104 | gap: 6px;
105 | letter-spacing: -0.2px;
106 | background: linear-gradient(
107 | 90deg,
108 | rgba(61, 61, 61, 0.5) 0%,
109 | rgba(45, 45, 45, 0.1) 100%
110 | );
111 | box-shadow: 1px 2px 1px rgba(0, 0, 0, 0.3),
112 | inset 0px 0px 1px 1px rgba(155, 155, 155, 0.25);
113 | border-radius: 12px;
114 | color: var(--primary-fg-color);
115 | font-family: var(--font-inter);
116 | transition: all ease 300ms;
117 | &:hover {
118 | background: linear-gradient(
119 | 90deg,
120 | rgba(61, 61, 61, 0.5) 100%,
121 | rgba(24, 24, 24, 0) 0%
122 | );
123 | }
124 | `;
125 |
--------------------------------------------------------------------------------
/src/lib/analytics.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import React from "react";
4 | import { GoogleAnalytics } from "nextjs-google-analytics";
5 |
6 | interface AnalyticsProviderProps {
7 | children: React.ReactNode;
8 | }
9 |
10 | const AnalyticsProvider: React.FC = ({ children }) => {
11 | return (
12 | <>
13 |
17 | {children}
18 | >
19 | );
20 | };
21 |
22 | export default AnalyticsProvider;
23 |
--------------------------------------------------------------------------------
/src/lib/common.tsx:
--------------------------------------------------------------------------------
1 | export const figmaPluginUrl = "https://www.figma.com/api/feed/plugins";
2 |
3 | export const userAgentToFake =
4 | "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36";
5 |
6 | export const HeartIcon = ({
7 | size = "12px",
8 | color = "black",
9 | fill = "currentColor",
10 | ...props
11 | }: React.SVGProps & { size?: string }) => (
12 |
24 | );
25 |
26 | export const ArrowIcon = ({
27 | size = "12px",
28 | color = "black",
29 | fill = "currentColor",
30 | ...props
31 | }: React.SVGProps & { size?: string }) => (
32 |
44 | );
45 |
46 | export const FigmaIcon = ({
47 | height = "8px",
48 | width = "12px",
49 | color = "black",
50 | secondaryColor,
51 | ...props
52 | }: React.SVGProps & { secondaryColor?: string }) => (
53 |
66 | );
67 |
--------------------------------------------------------------------------------
/src/lib/next-seo.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | openGraph: {
3 | type: 'website',
4 | locale: 'en_IE',
5 | title: `realvjy's figma plugins`,
6 | url: 'https://figmaplug.in',
7 | description: `All the figma plugins created so far curated here`,
8 | locale: 'en_EN',
9 | keywords: 'design, figma plugin, plugins, figma, tutorials, vijay verma, realvjy, logo placeholder, design, ui, ux, ui design, 3dicons, illustration, svg react',
10 | images: [
11 | {
12 | width: 1200,
13 | height: 630,
14 | url: `https://figmaplug.in/preview.jpg`,
15 | },
16 | ],
17 | site_name: 'realvjy',
18 | },
19 | twitter: {
20 | id: '357250088',
21 | handle: '@realvjy',
22 | site: 'figmaplug.in',
23 | cardType: 'summary_large_image',
24 | },
25 | };
26 |
--------------------------------------------------------------------------------
/src/lib/plguin-data.tsx:
--------------------------------------------------------------------------------
1 | export type pluginDatatype = {
2 | name: string;
3 | manifestId: string;
4 | slug: string;
5 | author: string;
6 | type: "free" | "paid" | "freemium" | "soon";
7 | hide?: false;
8 | featured?: boolean;
9 | downloads: number;
10 | likes: number;
11 | logoType?: "circle";
12 | description?: string;
13 | figmaurl: string;
14 | id: number;
15 | };
16 |
17 | // see public folder for thumbnail and logos
18 | export const pluginData: pluginDatatype[] = [
19 | {
20 | id: 1,
21 | name: "3dicons",
22 | manifestId: "1107546399747513238",
23 | description: "High quality hand crafted open-source 3d icons",
24 | slug: "3dicons",
25 | author: "realvjy",
26 | type: "free",
27 | downloads: 190000,
28 | likes: 2100,
29 | figmaurl:
30 | "https://www.figma.com/community/plugin/1107546399747513238/3dicons",
31 | },
32 | {
33 | id: 2,
34 | name: "Noisy Gradients",
35 | manifestId: "1174390287006360600",
36 | slug: "noisy-gradients",
37 | description: "Create cool gradient backgrounds with noise",
38 | author: "realvjy",
39 | type: "freemium",
40 | downloads: 250000,
41 | likes: 4500,
42 | figmaurl:
43 | "https://www.figma.com/community/plugin/1174390287006360600/noisy-gradients",
44 | },
45 | {
46 | id: 3,
47 | name: "Illlustrations",
48 | manifestId: "1124370159336948073",
49 | slug: "illlustrations",
50 | description:
51 | "Insert all 120+ illustrations from the illustrations.co open-source library",
52 | author: "realvjy",
53 | type: "free",
54 | downloads: 55000,
55 | likes: 504,
56 | figmaurl: "https://www.figma.com/community/plugin/1124370159336948073",
57 | },
58 | {
59 | id: 4,
60 | name: "uilogos",
61 | manifestId: "1107546399747513238",
62 | description: "Free Professional logos placeholder, brand logos and flags",
63 | slug: "uilogos",
64 | author: "realvjy",
65 | type: "free",
66 | downloads: 25000,
67 | likes: 490,
68 | figmaurl:
69 | "https://www.figma.com/community/plugin/1120667703468196103/uilogos",
70 | },
71 | {
72 | id: 5,
73 | name: "Hues & Gradients",
74 | manifestId: "1361736324008749685",
75 | slug: "hues-and-gradients",
76 | description: "Explore millions of color hues/shades/tones & gradients",
77 | author: "realvjy",
78 | type: "free",
79 | downloads: 7100,
80 | likes: 290,
81 | figmaurl:
82 | "https://www.figma.com/community/plugin/1361736324008749685/hues-gradients",
83 | },
84 | {
85 | id: 6,
86 | name: "Gradient Map",
87 | manifestId: "1280452653001223747",
88 | slug: "gradient-map",
89 | description: "Generate photoshop like gradient map in figma.",
90 | author: "realvjy",
91 | type: "free",
92 | downloads: 11000,
93 | likes: 310,
94 | figmaurl:
95 | "https://www.figma.com/community/plugin/1280452653001223747/gradient-map",
96 | },
97 | {
98 | id: 7,
99 | name: "SVG to Code",
100 | manifestId: "1348045528828166727",
101 | slug: "svg-to-code",
102 | description: "Generate SVG react components from selected object.",
103 | author: "realvjy",
104 | type: "free",
105 | downloads: 2400,
106 | likes: 100,
107 | figmaurl:
108 | "https://www.figma.com/community/plugin/1348045528828166727/svg-to-code-react-component",
109 | },
110 | {
111 | id: 8,
112 | name: "Random Hues",
113 | manifestId: "1361736324008749685",
114 | slug: "random-hues",
115 | description: "A widget to generate colors and gradients",
116 | author: "realvjy",
117 | type: "free",
118 | downloads: 7000,
119 | likes: 300,
120 | figmaurl:
121 | "https://www.figma.com/community/widget/1128028298799358676/random-hues",
122 | },
123 | {
124 | id: 9,
125 | name: "Shape Shifter",
126 | manifestId: "1406930998097962760",
127 | slug: "shape-shifter",
128 | description: "Figma companion for vector/illustration work",
129 | author: "realvjy",
130 | type: "free",
131 | downloads: 3900,
132 | likes: 206,
133 | figmaurl:
134 | "https://www.figma.com/community/plugin/1406930998097962760/shape-shifter",
135 | },
136 | {
137 | id: 11,
138 | name: "Stippling",
139 | manifestId: "1409794712197371392",
140 | slug: "stippling",
141 | description: "Generate dots like stippling or halftone effect",
142 | author: "realvjy",
143 | type: "freemium",
144 | downloads: 14000,
145 | likes: 1200,
146 | figmaurl: "https://s.vjy.me/stippling",
147 | },
148 | {
149 | id: 15,
150 | name: "Animate it",
151 | manifestId: "1470719638106565683",
152 | slug: "animate-it",
153 | description: "Create smart component with predefine animation set",
154 | author: "realvjy",
155 | type: "free",
156 | downloads: 11000,
157 | likes: 400,
158 | figmaurl: "https://www.figma.com/community/plugin/1470719638106565683",
159 | },
160 | {
161 | id: 12,
162 | name: "My Invoice",
163 | manifestId: "1128028298799398676",
164 | slug: "my-invoice",
165 | description: "Easily create and customize invoices directly in Figma",
166 | author: "realvjy",
167 | type: "free",
168 | downloads: 1300,
169 | likes: 130,
170 | figmaurl: "https://s.vjy.me/invoice-plugin",
171 | },
172 | {
173 | id: 13,
174 | name: "Project Wave",
175 | manifestId: "1430118694216929246",
176 | slug: "wavify",
177 | description: "Generate wave on selected vector or shape",
178 | author: "realvjy",
179 | type: "soon",
180 | downloads: 0,
181 | likes: 0,
182 | figmaurl: "https://s.vjy.me/project-wave",
183 | },
184 | {
185 | id: 14,
186 | name: "Kigen",
187 | manifestId: "1499119094608975695",
188 | slug: "kigen",
189 | description: "Generate design system Variables and styles quickly from presets",
190 | author: "realvjy",
191 | featured: true,
192 | type: "free",
193 | downloads: 1000,
194 | likes: 120,
195 | figmaurl: "https://s.vjy.me/kigen-plugin",
196 | }
197 | ];
198 |
--------------------------------------------------------------------------------
/src/lib/utils.tsx:
--------------------------------------------------------------------------------
1 | import { figmaPluginUrl, userAgentToFake } from "@/lib/common";
2 |
3 |
4 | export const fetchDownloads = async (pluginName: string, pluginId: string) => {
5 | const params = {
6 | "sort_by": "all_time",
7 | "pagination": "null",
8 | "editor_type": "all",
9 | "category": "null",
10 | "include_tags": "true",
11 | "tags": pluginName
12 |
13 | }
14 | const headers = {
15 | "User-Agent": userAgentToFake
16 | }
17 | const params_string = new URLSearchParams(params).toString()
18 | const response = await fetch(figmaPluginUrl + `?${params_string}`, {headers});
19 | const body = await response.text();
20 | console.log(body)
21 | };
--------------------------------------------------------------------------------
/src/styles/fonts.ts:
--------------------------------------------------------------------------------
1 | import localFont from "next/font/local";
2 | import { JetBrains_Mono, Inter } from "next/font/google";
3 |
4 | export const jetBrainsMono = JetBrains_Mono({
5 | weight: ["200", "400", "500"],
6 | style: ["normal"],
7 | subsets: ["latin"],
8 | display: "swap",
9 | variable: "--font-jetBrainsMono",
10 | });
11 |
12 | export const inter = Inter({
13 | weight: ["200", "300", "400", "500"],
14 | style: ["normal"],
15 | subsets: ["latin"],
16 | display: "swap",
17 | variable: "--font-inter",
18 | });
19 |
--------------------------------------------------------------------------------
/src/styles/fonts/InterDisplay-Bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/src/styles/fonts/InterDisplay-Bold.woff2
--------------------------------------------------------------------------------
/src/styles/fonts/InterDisplay-Light.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/src/styles/fonts/InterDisplay-Light.woff2
--------------------------------------------------------------------------------
/src/styles/fonts/InterDisplay-Medium.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/src/styles/fonts/InterDisplay-Medium.woff2
--------------------------------------------------------------------------------
/src/styles/fonts/InterDisplay-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/src/styles/fonts/InterDisplay-Regular.woff2
--------------------------------------------------------------------------------
/src/styles/fonts/InterDisplay-SemiBold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realvjy/figma-plugin/1739bd7bc638d9f94bb0ea7c700d0d4a2b0ff6d9/src/styles/fonts/InterDisplay-SemiBold.woff2
--------------------------------------------------------------------------------
/src/styles/fonts/inter.css:
--------------------------------------------------------------------------------
1 | /* Variable fonts usage:
2 | :root { font-family: "Inter", sans-serif; }
3 | @supports (font-variation-settings: normal) {
4 | :root { font-family: "InterVariable", sans-serif; font-optical-sizing: auto; }
5 | } */
6 |
7 | /* static fonts */
8 |
9 | @font-face { font-family: "InterDisplay"; font-style: normal; font-weight: 300; font-display: swap; src: url("InterDisplay-Light.woff2") format("woff2"); }
10 |
11 | @font-face { font-family: "InterDisplay"; font-style: normal; font-weight: 400; font-display: swap; src: url("InterDisplay-Regular.woff2") format("woff2"); }
12 |
13 | @font-face { font-family: "InterDisplay"; font-style: normal; font-weight: 500; font-display: swap; src: url("InterDisplay-Medium.woff2") format("woff2"); }
14 |
15 | @font-face { font-family: "InterDisplay"; font-style: normal; font-weight: 600; font-display: swap; src: url("InterDisplay-SemiBold.woff2") format("woff2"); }
16 |
17 | @font-face { font-family: "InterDisplay"; font-style: normal; font-weight: 700; font-display: swap; src: url("InterDisplay-Bold.woff2") format("woff2"); }
18 |
19 |
20 |
--------------------------------------------------------------------------------
/src/styles/globals.scss:
--------------------------------------------------------------------------------
1 | @use 'scss-reset/reset';
2 |
3 | :root {
4 |
5 | //colors
6 | --primary-bg-color: #141415;
7 | --primary-fg-color: #ffffff;
8 | --primary-fg-text: rgba(200, 200, 200, 0.7);
9 | --primary-border-color: rgba(200, 200, 200, 9%);
10 | --color-text-blue: #066AFF;
11 | --color-bg-cyan: #CBEFFF;
12 | --color-text-orange: #FF4206;
13 | --color-bg-orange: rgba(255, 228, 203, 1);
14 | --max-container-width: 400px;
15 | }
16 |
17 | a {
18 | text-decoration: none;
19 | color: var(--primary-fg-color);
20 | }
21 |
22 | // main
23 |
24 | body {
25 | font-family: var(--font-jetBrainsMono);
26 | background: var(--primary-bg-color);
27 | color: var(--primary-fg-color);
28 | min-height: 100vh;
29 |
30 | }
31 |
32 | ::-webkit-scrollbar {
33 | width: 6px;
34 | height: 0px;
35 | }
36 |
37 | ::-webkit-scrollbar-track {
38 | padding: 0 1px;
39 | background: var(--primary-bg-color);
40 | border-left: 1px solid rgba(120,120,120,0.1);
41 | }
42 |
43 | ::-webkit-scrollbar-thumb {
44 | border-radius: 3px;
45 | background: rgba(120,120,120,0.3);
46 | }
47 |
48 | ::-webkit-scrollbar-thumb:hover {
49 | background: #555;
50 | }
51 |
52 |
53 | main {
54 | min-height: 100vh;
55 | display: block;
56 | position: relative;
57 | @media screen and (max-width: 500px) {
58 | }
59 | }
60 |
61 | .container {
62 | max-width: var(--max-container-width);
63 | margin: 0 auto;
64 | display: flex;
65 | flex-direction: column;
66 | align-items: center;
67 | }
68 |
--------------------------------------------------------------------------------
/src/styles/styled-registry.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import React, { useState } from "react";
4 | import { useServerInsertedHTML } from "next/navigation";
5 | import { ServerStyleSheet, StyleSheetManager } from "styled-components";
6 |
7 | export default function StyledComponentsRegistry({
8 | children,
9 | }: {
10 | children: React.ReactNode;
11 | }) {
12 | const [styledComponentsStyleSheet] = useState(() => new ServerStyleSheet());
13 |
14 | useServerInsertedHTML(() => {
15 | const styles = styledComponentsStyleSheet.getStyleElement();
16 | styledComponentsStyleSheet.instance.clearTag();
17 | return <>{styles}>;
18 | });
19 |
20 | if (typeof window !== "undefined") return <>{children}>;
21 |
22 | return (
23 |
24 | {children}
25 |
26 | );
27 | }
28 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "lib": ["dom", "dom.iterable", "esnext"],
4 | "allowJs": true,
5 | "skipLibCheck": true,
6 | "strict": true,
7 | "noEmit": true,
8 | "esModuleInterop": true,
9 | "module": "esnext",
10 | "moduleResolution": "bundler",
11 | "resolveJsonModule": true,
12 | "isolatedModules": true,
13 | "jsx": "preserve",
14 | "incremental": true,
15 | "plugins": [
16 | {
17 | "name": "next"
18 | }
19 | ],
20 | "paths": {
21 | "@/*": ["./src/*"]
22 | }
23 | },
24 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "src/components/header.tsx"],
25 | "exclude": ["node_modules"]
26 | }
27 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@emotion/is-prop-valid@1.2.2":
6 | version "1.2.2"
7 | resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz"
8 | integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==
9 | dependencies:
10 | "@emotion/memoize" "^0.8.1"
11 |
12 | "@emotion/memoize@^0.8.1":
13 | version "0.8.1"
14 | resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz"
15 | integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
16 |
17 | "@emotion/unitless@0.8.1":
18 | version "0.8.1"
19 | resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz"
20 | integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==
21 |
22 | "@next/env@14.1.4":
23 | version "14.1.4"
24 | resolved "https://registry.npmjs.org/@next/env/-/env-14.1.4.tgz"
25 | integrity sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ==
26 |
27 | "@next/swc-darwin-arm64@14.1.4":
28 | version "14.1.4"
29 | resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.4.tgz"
30 | integrity sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg==
31 |
32 | "@next/swc-darwin-x64@14.1.4":
33 | version "14.1.4"
34 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.4.tgz#ba3683d4e2d30099f3f2864dd7349a4d9f440140"
35 | integrity sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ==
36 |
37 | "@next/swc-linux-arm64-gnu@14.1.4":
38 | version "14.1.4"
39 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.4.tgz#3519969293f16379954b7e196deb0c1eecbb2f8b"
40 | integrity sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA==
41 |
42 | "@next/swc-linux-arm64-musl@14.1.4":
43 | version "14.1.4"
44 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.4.tgz#4bb3196bd402b3f84cf5373ff1021f547264d62f"
45 | integrity sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g==
46 |
47 | "@next/swc-linux-x64-gnu@14.1.4":
48 | version "14.1.4"
49 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.4.tgz#1b3372c98c83dcdab946cdb4ee06e068b8139ba3"
50 | integrity sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw==
51 |
52 | "@next/swc-linux-x64-musl@14.1.4":
53 | version "14.1.4"
54 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.4.tgz#8459088bdc872648ff78f121db596f2533df5808"
55 | integrity sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg==
56 |
57 | "@next/swc-win32-arm64-msvc@14.1.4":
58 | version "14.1.4"
59 | resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.4.tgz#84280a08c00cc3be24ddd3a12f4617b108e6dea6"
60 | integrity sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag==
61 |
62 | "@next/swc-win32-ia32-msvc@14.1.4":
63 | version "14.1.4"
64 | resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.4.tgz#23ff7f4bd0a27177428669ef6fa5c3923c738031"
65 | integrity sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw==
66 |
67 | "@next/swc-win32-x64-msvc@14.1.4":
68 | version "14.1.4"
69 | resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.4.tgz#bccf5beccfde66d6c66fa4e2509118c796385eda"
70 | integrity sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w==
71 |
72 | "@swc/helpers@0.5.2":
73 | version "0.5.2"
74 | resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz"
75 | integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==
76 | dependencies:
77 | tslib "^2.4.0"
78 |
79 | "@types/node@^20":
80 | version "20.14.9"
81 | resolved "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz"
82 | integrity sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==
83 | dependencies:
84 | undici-types "~5.26.4"
85 |
86 | "@types/prop-types@*":
87 | version "15.7.12"
88 | resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz"
89 | integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==
90 |
91 | "@types/react-dom@^18":
92 | version "18.3.0"
93 | resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz"
94 | integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==
95 | dependencies:
96 | "@types/react" "*"
97 |
98 | "@types/react@*", "@types/react@^18":
99 | version "18.3.3"
100 | resolved "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz"
101 | integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==
102 | dependencies:
103 | "@types/prop-types" "*"
104 | csstype "^3.0.2"
105 |
106 | "@types/stylis@4.2.5":
107 | version "4.2.5"
108 | resolved "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz"
109 | integrity sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==
110 |
111 | anymatch@~3.1.2:
112 | version "3.1.3"
113 | resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz"
114 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
115 | dependencies:
116 | normalize-path "^3.0.0"
117 | picomatch "^2.0.4"
118 |
119 | binary-extensions@^2.0.0:
120 | version "2.3.0"
121 | resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz"
122 | integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
123 |
124 | braces@~3.0.2:
125 | version "3.0.3"
126 | resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz"
127 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
128 | dependencies:
129 | fill-range "^7.1.1"
130 |
131 | busboy@1.6.0:
132 | version "1.6.0"
133 | resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz"
134 | integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==
135 | dependencies:
136 | streamsearch "^1.1.0"
137 |
138 | camelize@^1.0.0:
139 | version "1.0.1"
140 | resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz"
141 | integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==
142 |
143 | caniuse-lite@^1.0.30001579:
144 | version "1.0.30001638"
145 | resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001638.tgz"
146 | integrity sha512-5SuJUJ7cZnhPpeLHaH0c/HPAnAHZvS6ElWyHK9GSIbVOQABLzowiI2pjmpvZ1WEbkyz46iFd4UXlOHR5SqgfMQ==
147 |
148 | "chokidar@>=3.0.0 <4.0.0":
149 | version "3.6.0"
150 | resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz"
151 | integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
152 | dependencies:
153 | anymatch "~3.1.2"
154 | braces "~3.0.2"
155 | glob-parent "~5.1.2"
156 | is-binary-path "~2.1.0"
157 | is-glob "~4.0.1"
158 | normalize-path "~3.0.0"
159 | readdirp "~3.6.0"
160 | optionalDependencies:
161 | fsevents "~2.3.2"
162 |
163 | client-only@0.0.1:
164 | version "0.0.1"
165 | resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz"
166 | integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==
167 |
168 | coolshapes-react@^1.0.1:
169 | version "1.0.1"
170 | resolved "https://registry.npmjs.org/coolshapes-react/-/coolshapes-react-1.0.1.tgz"
171 | integrity sha512-ge6hDrOxKDfZsLGAQa8CgcbtGHMtIc5UMwA94b0/c9uwvDIpVmb/VMXUI8Uu09ZYUa86lvnk3Fui2de6dnFdWw==
172 |
173 | css-color-keywords@^1.0.0:
174 | version "1.0.0"
175 | resolved "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz"
176 | integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==
177 |
178 | css-to-react-native@3.2.0:
179 | version "3.2.0"
180 | resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz"
181 | integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==
182 | dependencies:
183 | camelize "^1.0.0"
184 | css-color-keywords "^1.0.0"
185 | postcss-value-parser "^4.0.2"
186 |
187 | csstype@3.1.3, csstype@^3.0.2:
188 | version "3.1.3"
189 | resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz"
190 | integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
191 |
192 | fill-range@^7.1.1:
193 | version "7.1.1"
194 | resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz"
195 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
196 | dependencies:
197 | to-regex-range "^5.0.1"
198 |
199 | fsevents@^2.3.2, fsevents@~2.3.2:
200 | version "2.3.3"
201 | resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"
202 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
203 |
204 | glob-parent@~5.1.2:
205 | version "5.1.2"
206 | resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
207 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
208 | dependencies:
209 | is-glob "^4.0.1"
210 |
211 | graceful-fs@^4.2.11:
212 | version "4.2.11"
213 | resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"
214 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
215 |
216 | immutable@^4.0.0:
217 | version "4.3.6"
218 | resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz"
219 | integrity sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==
220 |
221 | is-binary-path@~2.1.0:
222 | version "2.1.0"
223 | resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz"
224 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
225 | dependencies:
226 | binary-extensions "^2.0.0"
227 |
228 | is-extglob@^2.1.1:
229 | version "2.1.1"
230 | resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
231 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
232 |
233 | is-glob@^4.0.1, is-glob@~4.0.1:
234 | version "4.0.3"
235 | resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
236 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
237 | dependencies:
238 | is-extglob "^2.1.1"
239 |
240 | is-number@^7.0.0:
241 | version "7.0.0"
242 | resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
243 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
244 |
245 | "js-tokens@^3.0.0 || ^4.0.0":
246 | version "4.0.0"
247 | resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
248 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
249 |
250 | loose-envify@^1.1.0:
251 | version "1.4.0"
252 | resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
253 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
254 | dependencies:
255 | js-tokens "^3.0.0 || ^4.0.0"
256 |
257 | nanoid@^3.3.6, nanoid@^3.3.7:
258 | version "3.3.7"
259 | resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz"
260 | integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
261 |
262 | next-seo@^6.5.0:
263 | version "6.5.0"
264 | resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-6.5.0.tgz#5ccfbcfaced9d296499aa88f074b9e82e252a9c8"
265 | integrity sha512-MfzUeWTN/x/rsKp/1n0213eojO97lIl0unxqbeCY+6pAucViHDA8GSLRRcXpgjsSmBxfCFdfpu7LXbt4ANQoNQ==
266 |
267 | next@14.1.4:
268 | version "14.1.4"
269 | resolved "https://registry.npmjs.org/next/-/next-14.1.4.tgz"
270 | integrity sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ==
271 | dependencies:
272 | "@next/env" "14.1.4"
273 | "@swc/helpers" "0.5.2"
274 | busboy "1.6.0"
275 | caniuse-lite "^1.0.30001579"
276 | graceful-fs "^4.2.11"
277 | postcss "8.4.31"
278 | styled-jsx "5.1.1"
279 | optionalDependencies:
280 | "@next/swc-darwin-arm64" "14.1.4"
281 | "@next/swc-darwin-x64" "14.1.4"
282 | "@next/swc-linux-arm64-gnu" "14.1.4"
283 | "@next/swc-linux-arm64-musl" "14.1.4"
284 | "@next/swc-linux-x64-gnu" "14.1.4"
285 | "@next/swc-linux-x64-musl" "14.1.4"
286 | "@next/swc-win32-arm64-msvc" "14.1.4"
287 | "@next/swc-win32-ia32-msvc" "14.1.4"
288 | "@next/swc-win32-x64-msvc" "14.1.4"
289 |
290 | nextjs-google-analytics@^2.3.3:
291 | version "2.3.3"
292 | resolved "https://registry.yarnpkg.com/nextjs-google-analytics/-/nextjs-google-analytics-2.3.3.tgz#8393804b89915b22d94e0fabb786bdd4012cb888"
293 | integrity sha512-Y6sI6A7wt5dji8hYBnVkOh9LTyImSLFZXx3FpyQgVW7W4b4qEFHjH2u3fhDJsrRZeLlUGM8/RuHD/mhHc2Axfg==
294 | optionalDependencies:
295 | fsevents "^2.3.2"
296 |
297 | normalize-path@^3.0.0, normalize-path@~3.0.0:
298 | version "3.0.0"
299 | resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
300 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
301 |
302 | picocolors@^1.0.0:
303 | version "1.0.1"
304 | resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz"
305 | integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
306 |
307 | picomatch@^2.0.4, picomatch@^2.2.1:
308 | version "2.3.1"
309 | resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
310 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
311 |
312 | postcss-value-parser@^4.0.2:
313 | version "4.2.0"
314 | resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
315 | integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
316 |
317 | postcss@8.4.31:
318 | version "8.4.31"
319 | resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz"
320 | integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
321 | dependencies:
322 | nanoid "^3.3.6"
323 | picocolors "^1.0.0"
324 | source-map-js "^1.0.2"
325 |
326 | postcss@8.4.38:
327 | version "8.4.38"
328 | resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz"
329 | integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==
330 | dependencies:
331 | nanoid "^3.3.7"
332 | picocolors "^1.0.0"
333 | source-map-js "^1.2.0"
334 |
335 | react-dom@^18:
336 | version "18.3.1"
337 | resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz"
338 | integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==
339 | dependencies:
340 | loose-envify "^1.1.0"
341 | scheduler "^0.23.2"
342 |
343 | react@^18:
344 | version "18.3.1"
345 | resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz"
346 | integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==
347 | dependencies:
348 | loose-envify "^1.1.0"
349 |
350 | readdirp@~3.6.0:
351 | version "3.6.0"
352 | resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz"
353 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
354 | dependencies:
355 | picomatch "^2.2.1"
356 |
357 | sass@^1.72.0:
358 | version "1.77.6"
359 | resolved "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz"
360 | integrity sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==
361 | dependencies:
362 | chokidar ">=3.0.0 <4.0.0"
363 | immutable "^4.0.0"
364 | source-map-js ">=0.6.2 <2.0.0"
365 |
366 | scheduler@^0.23.2:
367 | version "0.23.2"
368 | resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz"
369 | integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==
370 | dependencies:
371 | loose-envify "^1.1.0"
372 |
373 | scss-reset@^1.4.2:
374 | version "1.4.2"
375 | resolved "https://registry.npmjs.org/scss-reset/-/scss-reset-1.4.2.tgz"
376 | integrity sha512-eXtSeI5APjD/TtaIlRdiMRapgsX5GCP4I1Ti3FiUzCSE4GEYnfT1hGISrJkKGZsZbCDhwZv1bUdOOZfPGs3R1A==
377 |
378 | shallowequal@1.1.0:
379 | version "1.1.0"
380 | resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz"
381 | integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
382 |
383 | "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2, source-map-js@^1.2.0:
384 | version "1.2.0"
385 | resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz"
386 | integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
387 |
388 | streamsearch@^1.1.0:
389 | version "1.1.0"
390 | resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz"
391 | integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==
392 |
393 | styled-components@^6.1.8:
394 | version "6.1.11"
395 | resolved "https://registry.npmjs.org/styled-components/-/styled-components-6.1.11.tgz"
396 | integrity sha512-Ui0jXPzbp1phYij90h12ksljKGqF8ncGx+pjrNPsSPhbUUjWT2tD1FwGo2LF6USCnbrsIhNngDfodhxbegfEOA==
397 | dependencies:
398 | "@emotion/is-prop-valid" "1.2.2"
399 | "@emotion/unitless" "0.8.1"
400 | "@types/stylis" "4.2.5"
401 | css-to-react-native "3.2.0"
402 | csstype "3.1.3"
403 | postcss "8.4.38"
404 | shallowequal "1.1.0"
405 | stylis "4.3.2"
406 | tslib "2.6.2"
407 |
408 | styled-jsx@5.1.1:
409 | version "5.1.1"
410 | resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz"
411 | integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==
412 | dependencies:
413 | client-only "0.0.1"
414 |
415 | stylis@4.3.2:
416 | version "4.3.2"
417 | resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz"
418 | integrity sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==
419 |
420 | to-regex-range@^5.0.1:
421 | version "5.0.1"
422 | resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
423 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
424 | dependencies:
425 | is-number "^7.0.0"
426 |
427 | tslib@2.6.2:
428 | version "2.6.2"
429 | resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz"
430 | integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
431 |
432 | tslib@^2.4.0:
433 | version "2.6.3"
434 | resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz"
435 | integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==
436 |
437 | typescript@^5:
438 | version "5.5.2"
439 | resolved "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz"
440 | integrity sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==
441 |
442 | undici-types@~5.26.4:
443 | version "5.26.5"
444 | resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz"
445 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
446 |
--------------------------------------------------------------------------------