mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2025-11-12 07:43:10 +10:00
Compare commits
20 Commits
v4.5.0
...
c28bd3cd59
| Author | SHA1 | Date | |
|---|---|---|---|
| c28bd3cd59 | |||
| 6fcb7a4845 | |||
| 213f96b189 | |||
| e8d6d4ad3a | |||
| 87370cfdf0 | |||
| 112a644927 | |||
| 2977e3528a | |||
| 21fd079f94 | |||
| 9bdc61b50d | |||
| 2de24d5b55 | |||
| 1cba9d0fb9 | |||
| 8f532bf4a6 | |||
| 4efdabd475 | |||
| 8803101dcd | |||
| a4a9381b65 | |||
| 618d42019e | |||
| d9b56cfb5b | |||
| 5624dc4f83 | |||
| 313fe47050 | |||
| 772332661f |
81
.env.example
Normal file
81
.env.example
Normal file
@ -0,0 +1,81 @@
|
||||
# Environment
|
||||
NODE_ENV=development
|
||||
|
||||
# Ports
|
||||
PORT=3000
|
||||
|
||||
# URLs
|
||||
# These URLs must reference a publicly accessible domain or IP address, not a docker container ID (depending on your compose setup)
|
||||
PUBLIC_URL=http://localhost:3000
|
||||
STORAGE_URL=http://localhost:9000/default # default is the bucket name specified in the STORAGE_BUCKET variable
|
||||
|
||||
# Database (Prisma/PostgreSQL)
|
||||
# This can be swapped out to use any other database, like MySQL
|
||||
# Note: This is used only in the compose.yml file
|
||||
POSTGRES_PORT=5432
|
||||
POSTGRES_DB=postgres
|
||||
POSTGRES_USER=postgres
|
||||
POSTGRES_PASSWORD=postgres
|
||||
|
||||
# Database (Prisma/PostgreSQL)
|
||||
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres?schema=public
|
||||
|
||||
# Authentication Secrets
|
||||
# generated with `openssl rand -base64 64`
|
||||
ACCESS_TOKEN_SECRET=access_token_secret
|
||||
REFRESH_TOKEN_SECRET=refresh_token_secret
|
||||
|
||||
# Chrome Browser (for printing)
|
||||
# generated with `openssl rand -hex 32`
|
||||
CHROME_PORT=8080
|
||||
CHROME_TOKEN=chrome_token
|
||||
CHROME_URL=ws://localhost:8080
|
||||
# Launch puppeteer with flag to ignore https errors
|
||||
# CHROME_IGNORE_HTTPS_ERRORS=true
|
||||
|
||||
# Mail Server (for e-mails)
|
||||
# For testing, you can use https://ethereal.email/create
|
||||
MAIL_FROM=noreply@localhost
|
||||
# SMTP_URL=smtp://username:password@smtp.ethereal.email:587
|
||||
|
||||
# Storage
|
||||
STORAGE_ENDPOINT=localhost
|
||||
STORAGE_PORT=9000
|
||||
STORAGE_REGION=us-east-1
|
||||
STORAGE_BUCKET=default
|
||||
STORAGE_ACCESS_KEY=minioadmin
|
||||
STORAGE_SECRET_KEY=minioadmin
|
||||
STORAGE_USE_SSL=false
|
||||
STORAGE_SKIP_BUCKET_CHECK=false
|
||||
|
||||
# Nx Cloud (Optional)
|
||||
# NX_CLOUD_ACCESS_TOKEN=
|
||||
|
||||
# Crowdin (Optional)
|
||||
# CROWDIN_PROJECT_ID=
|
||||
# CROWDIN_PERSONAL_TOKEN=
|
||||
|
||||
# Feature Flags (Optional)
|
||||
# DISABLE_SIGNUPS=false
|
||||
# DISABLE_EMAIL_AUTH=false
|
||||
|
||||
# GitHub (OAuth, Optional)
|
||||
# GITHUB_CLIENT_ID=
|
||||
# GITHUB_CLIENT_SECRET=
|
||||
# GITHUB_CALLBACK_URL=http://localhost:5173/api/auth/github/callback
|
||||
|
||||
# Google (OAuth, Optional)
|
||||
# GOOGLE_CLIENT_ID=
|
||||
# GOOGLE_CLIENT_SECRET=
|
||||
# GOOGLE_CALLBACK_URL=http://localhost:5173/api/auth/google/callback
|
||||
|
||||
# OpenID (Optional)
|
||||
# VITE_OPENID_NAME=
|
||||
# OPENID_AUTHORIZATION_URL=
|
||||
# OPENID_CALLBACK_URL=http://localhost:5173/api/auth/openid/callback
|
||||
# OPENID_CLIENT_ID=
|
||||
# OPENID_CLIENT_SECRET=
|
||||
# OPENID_ISSUER=
|
||||
# OPENID_SCOPE=openid profile email
|
||||
# OPENID_TOKEN_URL=
|
||||
# OPENID_USER_INFO_URL=
|
||||
2
.vscode/extensions.json
vendored
2
.vscode/extensions.json
vendored
@ -1,3 +1,3 @@
|
||||
{
|
||||
"recommendations": ["nrwl.angular-console", "esbenp.prettier-vscode", "dbaeumer.vscode-eslint"]
|
||||
"recommendations": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint"]
|
||||
}
|
||||
|
||||
22
README.md
22
README.md
@ -37,17 +37,21 @@ Start creating your standout resume with Reactive Resume today!
|
||||
|
||||
## Templates
|
||||
|
||||
| Azurill | Bronzor | Chikorita |
|
||||
| ------------------------------------------------------------ | ----------------------------------------------------------- | ----------------------------------------------------------- |
|
||||
| <img src="https://i.imgur.com/jKgo04C.jpeg" width="200px" /> | <img src="https://i.imgur.com/DFNQZP2.jpg" width="200px" /> | <img src="https://i.imgur.com/Dwv8Y7f.jpg" width="200px" /> |
|
||||
| Azurill | Bronzor | Chikorita |
|
||||
| ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------- |
|
||||
| <img src="./apps/client/public/templates/jpg/azurill.jpg" width="200px" /> | <img src="./apps/client/public/templates/jpg/bronzor.jpg" width="200px" /> | <img src="./apps/client/public/templates/jpg/chikorita.jpg" width="200px" /> |
|
||||
|
||||
| Ditto | Kakuna | Nosepass |
|
||||
| ----------------------------------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------- |
|
||||
| <img src="https://i.imgur.com/6c5lASL.jpg" width="200px" /> | <img src="https://i.imgur.com/268ML3t.jpg" width="200px" /> | <img src="https://i.imgur.com/npRLsPS.jpg" width="200px" /> |
|
||||
| Ditto | Gengar | Glalie |
|
||||
| -------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- |
|
||||
| <img src="./apps/client/public/templates/jpg/ditto.jpg" width="200px" /> | <img src="./apps/client/public/templates/jpg/gengar.jpg" width="200px" /> | <img src="./apps/client/public/templates/jpg/glalie.jpg" width="200px" /> |
|
||||
|
||||
| Onyx | Pikachu | Rhyhorn |
|
||||
| ----------------------------------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------- |
|
||||
| <img src="https://i.imgur.com/cxplXOW.jpg" width="200px" /> | <img src="https://i.imgur.com/Y9f7qsh.jpg" width="200px" /> | <img src="https://i.imgur.com/h4kQxy2.jpg" width="200px" /> |
|
||||
| Kakuna | Leafish | Nosepass |
|
||||
| ---------------------------------------------------------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------ |
|
||||
| <img src="./apps/client/public/templates/jpg/kakuna.jpg" width="200px" /> | <img src="./apps/client/public/templates/jpg/leafish.jpg" width="200px" /> | <img src="./apps/client/public/templates/jpg/nosepass.jpg" width="200px" /> |
|
||||
|
||||
| Onyx | Pikachu | Rhyhorn |
|
||||
| ------------------------------------------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- |
|
||||
| <img src="./apps/client/public/templates/jpg/onyx.jpg" width="200px" /> | <img src="./apps/client/public/templates/jpg/pikachu.jpg" width="200px" /> | <img src="./apps/client/public/templates/jpg/rhyhorn.jpg" width="200px" /> |
|
||||
|
||||
## Features
|
||||
|
||||
|
||||
@ -14,8 +14,8 @@ export const Picture = ({ className }: PictureProps) => {
|
||||
|
||||
return (
|
||||
<img
|
||||
src={picture.url}
|
||||
alt="Profile"
|
||||
src={picture.url}
|
||||
className={cn(
|
||||
"relative z-20 object-cover",
|
||||
picture.effects.border && "border-primary",
|
||||
|
||||
@ -531,6 +531,11 @@ const mapSectionToComponent = (section: SectionKey) => {
|
||||
case "education": {
|
||||
return <Education />;
|
||||
}
|
||||
|
||||
case "summary": {
|
||||
return <Summary />;
|
||||
}
|
||||
|
||||
case "awards": {
|
||||
return <Awards />;
|
||||
}
|
||||
@ -592,8 +597,6 @@ export const Gengar = ({ columns, isFirstPage = false }: TemplateProps) => {
|
||||
</div>
|
||||
|
||||
<div className={cn("main group", sidebar.length > 0 ? "col-span-2" : "col-span-3")}>
|
||||
{isFirstPage && <Summary />}
|
||||
|
||||
<div className="p-custom space-y-4">
|
||||
{main.map((section) => (
|
||||
<Fragment key={section}>{mapSectionToComponent(section)}</Fragment>
|
||||
|
||||
@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: hi\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2025-10-01 09:32\n"
|
||||
"PO-Revision-Date: 2025-10-08 00:10\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Hindi\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,11 +1,6 @@
|
||||
import { Logger, Module } from "@nestjs/common";
|
||||
import { Module } from "@nestjs/common";
|
||||
import { ConfigService } from "@nestjs/config";
|
||||
import {
|
||||
loggingMiddleware,
|
||||
PrismaModule,
|
||||
PrismaService,
|
||||
providePrismaClientExceptionFilter,
|
||||
} from "nestjs-prisma";
|
||||
import { PrismaModule, providePrismaClientExceptionFilter } from "nestjs-prisma";
|
||||
|
||||
import { Config } from "@/server/config/schema";
|
||||
|
||||
@ -16,14 +11,6 @@ import { Config } from "@/server/config/schema";
|
||||
inject: [ConfigService],
|
||||
useFactory: (configService: ConfigService<Config>) => ({
|
||||
prismaOptions: { datasourceUrl: configService.get("DATABASE_URL") },
|
||||
middlewares: [
|
||||
loggingMiddleware({
|
||||
logLevel: "debug", // only in development
|
||||
logger: new Logger(PrismaService.name),
|
||||
logMessage: (query) =>
|
||||
`[Query] ${query.model}.${query.action} - ${query.executionTime}ms`,
|
||||
}),
|
||||
],
|
||||
}),
|
||||
}),
|
||||
],
|
||||
|
||||
@ -139,22 +139,6 @@ export class PrinterService {
|
||||
page.waitForSelector('[data-page="1"]', { timeout: 15_000 }),
|
||||
]);
|
||||
|
||||
if (resume.data.basics.picture.url) {
|
||||
await page.waitForSelector('img[alt="Profile"]');
|
||||
await page.evaluate(() =>
|
||||
Promise.all(
|
||||
// eslint-disable-next-line unicorn/prefer-spread
|
||||
Array.from(document.images).map((img) => {
|
||||
if (img.complete) return Promise.resolve();
|
||||
return new Promise((resolve) => {
|
||||
// eslint-disable-next-line unicorn/prefer-add-event-listener
|
||||
img.onload = img.onerror = resolve;
|
||||
});
|
||||
}),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
const pagesBuffer: Buffer[] = [];
|
||||
|
||||
const processPage = async (index: number) => {
|
||||
|
||||
@ -151,6 +151,7 @@ const Toolbar = ({ editor }: { editor: Editor }) => {
|
||||
type="button"
|
||||
pressed={editor.isActive("bold")}
|
||||
disabled={!editor.can().chain().toggleBold().run()}
|
||||
data-state={editor.isActive("bold") ? "on" : "off"}
|
||||
onPressedChange={() => editor.chain().focus().toggleBold().run()}
|
||||
>
|
||||
<TextBIcon />
|
||||
@ -163,6 +164,7 @@ const Toolbar = ({ editor }: { editor: Editor }) => {
|
||||
type="button"
|
||||
pressed={editor.isActive("italic")}
|
||||
disabled={!editor.can().chain().focus().toggleItalic().run()}
|
||||
data-state={editor.isActive("italic") ? "on" : "off"}
|
||||
onPressedChange={() => editor.chain().focus().toggleItalic().run()}
|
||||
>
|
||||
<TextItalicIcon />
|
||||
@ -175,6 +177,7 @@ const Toolbar = ({ editor }: { editor: Editor }) => {
|
||||
type="button"
|
||||
pressed={editor.isActive("strike")}
|
||||
disabled={!editor.can().chain().focus().toggleStrike().run()}
|
||||
data-state={editor.isActive("strike") ? "on" : "off"}
|
||||
onPressedChange={() => editor.chain().focus().toggleStrike().run()}
|
||||
>
|
||||
<TextStrikethroughIcon />
|
||||
@ -187,6 +190,7 @@ const Toolbar = ({ editor }: { editor: Editor }) => {
|
||||
type="button"
|
||||
pressed={editor.isActive("underline")}
|
||||
disabled={!editor.can().chain().focus().toggleUnderline().run()}
|
||||
data-state={editor.isActive("underline") ? "on" : "off"}
|
||||
onPressedChange={() => editor.chain().focus().toggleUnderline().run()}
|
||||
>
|
||||
<TextAUnderlineIcon />
|
||||
@ -199,6 +203,7 @@ const Toolbar = ({ editor }: { editor: Editor }) => {
|
||||
type="button"
|
||||
pressed={editor.isActive("highlight")}
|
||||
disabled={!editor.can().chain().focus().toggleHighlight().run()}
|
||||
data-state={editor.isActive("highlight") ? "on" : "off"}
|
||||
onPressedChange={() => editor.chain().focus().toggleHighlight().run()}
|
||||
>
|
||||
<HighlighterCircleIcon />
|
||||
@ -217,6 +222,7 @@ const Toolbar = ({ editor }: { editor: Editor }) => {
|
||||
type="button"
|
||||
pressed={editor.isActive("code")}
|
||||
disabled={!editor.can().chain().focus().toggleCode().run()}
|
||||
data-state={editor.isActive("code") ? "on" : "off"}
|
||||
onPressedChange={() => editor.chain().focus().toggleCode().run()}
|
||||
>
|
||||
<CodeIconImport />
|
||||
@ -229,6 +235,7 @@ const Toolbar = ({ editor }: { editor: Editor }) => {
|
||||
type="button"
|
||||
pressed={editor.isActive("codeBlock")}
|
||||
disabled={!editor.can().chain().focus().toggleCodeBlock().run()}
|
||||
data-state={editor.isActive("codeBlock") ? "on" : "off"}
|
||||
onPressedChange={() => editor.chain().focus().toggleCodeBlock().run()}
|
||||
>
|
||||
<CodeBlockIconImport />
|
||||
@ -241,6 +248,7 @@ const Toolbar = ({ editor }: { editor: Editor }) => {
|
||||
type="button"
|
||||
pressed={editor.isActive("heading", { level: 1 })}
|
||||
disabled={!editor.can().chain().focus().toggleHeading({ level: 1 }).run()}
|
||||
data-state={editor.isActive("heading", { level: 1 }) ? "on" : "off"}
|
||||
onPressedChange={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}
|
||||
>
|
||||
<TextHOneIcon />
|
||||
@ -253,6 +261,7 @@ const Toolbar = ({ editor }: { editor: Editor }) => {
|
||||
type="button"
|
||||
pressed={editor.isActive("heading", { level: 2 })}
|
||||
disabled={!editor.can().chain().focus().toggleHeading({ level: 2 }).run()}
|
||||
data-state={editor.isActive("heading", { level: 2 }) ? "on" : "off"}
|
||||
onPressedChange={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}
|
||||
>
|
||||
<TextHTwoIcon />
|
||||
@ -265,6 +274,7 @@ const Toolbar = ({ editor }: { editor: Editor }) => {
|
||||
type="button"
|
||||
pressed={editor.isActive("heading", { level: 3 })}
|
||||
disabled={!editor.can().chain().focus().toggleHeading({ level: 3 }).run()}
|
||||
data-state={editor.isActive("heading", { level: 3 }) ? "on" : "off"}
|
||||
onPressedChange={() => editor.chain().focus().toggleHeading({ level: 3 }).run()}
|
||||
>
|
||||
<TextHThreeIcon />
|
||||
@ -276,6 +286,7 @@ const Toolbar = ({ editor }: { editor: Editor }) => {
|
||||
size="sm"
|
||||
type="button"
|
||||
pressed={editor.isActive("paragraph")}
|
||||
data-state={editor.isActive("paragraph") ? "on" : "off"}
|
||||
onPressedChange={() => editor.chain().focus().setParagraph().run()}
|
||||
>
|
||||
<ParagraphIconImport />
|
||||
@ -288,6 +299,7 @@ const Toolbar = ({ editor }: { editor: Editor }) => {
|
||||
type="button"
|
||||
pressed={editor.isActive({ textAlign: "left" })}
|
||||
disabled={!editor.can().chain().focus().setTextAlign("left").run()}
|
||||
data-state={editor.isActive({ textAlign: "left" }) ? "on" : "off"}
|
||||
onPressedChange={() => editor.chain().focus().setTextAlign("left").run()}
|
||||
>
|
||||
<TextAlignLeftIcon />
|
||||
@ -300,6 +312,7 @@ const Toolbar = ({ editor }: { editor: Editor }) => {
|
||||
type="button"
|
||||
pressed={editor.isActive({ textAlign: "center" })}
|
||||
disabled={!editor.can().chain().focus().setTextAlign("center").run()}
|
||||
data-state={editor.isActive({ textAlign: "center" }) ? "on" : "off"}
|
||||
onPressedChange={() => editor.chain().focus().setTextAlign("center").run()}
|
||||
>
|
||||
<TextAlignCenterIcon />
|
||||
@ -312,6 +325,7 @@ const Toolbar = ({ editor }: { editor: Editor }) => {
|
||||
type="button"
|
||||
pressed={editor.isActive({ textAlign: "right" })}
|
||||
disabled={!editor.can().chain().focus().setTextAlign("right").run()}
|
||||
data-state={editor.isActive({ textAlign: "right" }) ? "on" : "off"}
|
||||
onPressedChange={() => editor.chain().focus().setTextAlign("right").run()}
|
||||
>
|
||||
<TextAlignRightIcon />
|
||||
@ -324,6 +338,7 @@ const Toolbar = ({ editor }: { editor: Editor }) => {
|
||||
type="button"
|
||||
pressed={editor.isActive({ textAlign: "justify" })}
|
||||
disabled={!editor.can().chain().focus().setTextAlign("justify").run()}
|
||||
data-state={editor.isActive({ textAlign: "justify" }) ? "on" : "off"}
|
||||
onPressedChange={() => editor.chain().focus().setTextAlign("justify").run()}
|
||||
>
|
||||
<TextAlignJustifyIcon />
|
||||
@ -336,6 +351,7 @@ const Toolbar = ({ editor }: { editor: Editor }) => {
|
||||
type="button"
|
||||
pressed={editor.isActive("bulletList")}
|
||||
disabled={!editor.can().chain().focus().toggleBulletList().run()}
|
||||
data-state={editor.isActive("bulletList") ? "on" : "off"}
|
||||
onPressedChange={() => editor.chain().focus().toggleBulletList().run()}
|
||||
>
|
||||
<ListBulletsIcon />
|
||||
@ -348,6 +364,7 @@ const Toolbar = ({ editor }: { editor: Editor }) => {
|
||||
type="button"
|
||||
pressed={editor.isActive("orderedList")}
|
||||
disabled={!editor.can().chain().focus().toggleOrderedList().run()}
|
||||
data-state={editor.isActive("orderedList") ? "on" : "off"}
|
||||
onPressedChange={() => editor.chain().focus().toggleOrderedList().run()}
|
||||
>
|
||||
<ListNumbersIcon />
|
||||
|
||||
22
package.json
22
package.json
@ -1,10 +1,10 @@
|
||||
{
|
||||
"name": "@reactive-resume/source",
|
||||
"description": "A free and open-source resume builder that simplifies the process of creating, updating, and sharing your resume.",
|
||||
"version": "4.5.0",
|
||||
"version": "4.5.2",
|
||||
"license": "MIT",
|
||||
"private": true,
|
||||
"packageManager": "pnpm@10.17.1+sha512.17c560fca4867ae9473a3899ad84a88334914f379be46d455cbf92e5cf4b39d34985d452d2583baf19967fa76cb5c17bc9e245529d0b98745721aa7200ecaf7a",
|
||||
"packageManager": "pnpm@10.18.1",
|
||||
"author": {
|
||||
"name": "Amruth Pillai",
|
||||
"url": "https://amruthpillai.com",
|
||||
@ -80,14 +80,14 @@
|
||||
"@types/passport-local": "^1.0.38",
|
||||
"@types/passport-openidconnect": "^0.1.3",
|
||||
"@types/prismjs": "^1.26.5",
|
||||
"@types/react": "^18.3.25",
|
||||
"@types/react": "^18.3.26",
|
||||
"@types/react-dom": "^18.3.7",
|
||||
"@types/react-is": "^18.3.1",
|
||||
"@types/retry": "^0.12.5",
|
||||
"@types/sanitize-html": "^2.16.0",
|
||||
"@types/webfontloader": "^1.6.38",
|
||||
"@typescript-eslint/eslint-plugin": "^8.45.0",
|
||||
"@typescript-eslint/parser": "^8.45.0",
|
||||
"@typescript-eslint/eslint-plugin": "^8.46.0",
|
||||
"@typescript-eslint/parser": "^8.46.0",
|
||||
"@vitejs/plugin-react": "^4.7.0",
|
||||
"@vitejs/plugin-react-swc": "^3.11.0",
|
||||
"@vitest/coverage-v8": "^2.1.9",
|
||||
@ -115,7 +115,7 @@
|
||||
"postcss-nested": "^6.2.0",
|
||||
"prettier": "^3.6.2",
|
||||
"prettier-plugin-tailwindcss": "^0.6.14",
|
||||
"tailwindcss": "^3.4.17",
|
||||
"tailwindcss": "^3.4.18",
|
||||
"tailwindcss-animate": "^1.0.7",
|
||||
"ts-jest": "^29.4.4",
|
||||
"ts-node": "^10.9.2",
|
||||
@ -209,9 +209,9 @@
|
||||
"minio": "^8.0.6",
|
||||
"nest-raven": "^10.1.0",
|
||||
"nestjs-minio-client": "^2.2.0",
|
||||
"nestjs-prisma": "^0.25.0",
|
||||
"nestjs-prisma": "^0.26.0",
|
||||
"nestjs-zod": "^3.0.0",
|
||||
"nodemailer": "^6.10.1",
|
||||
"nodemailer": "^7.0.7",
|
||||
"openai": "^4.104.0",
|
||||
"otplib": "^12.0.1",
|
||||
"papaparse": "^5.5.3",
|
||||
@ -230,10 +230,10 @@
|
||||
"react-colorful": "^5.6.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-helmet-async": "^2.0.5",
|
||||
"react-hook-form": "^7.63.0",
|
||||
"react-parallax-tilt": "^1.7.309",
|
||||
"react-hook-form": "^7.64.0",
|
||||
"react-parallax-tilt": "^1.7.310",
|
||||
"react-resizable-panels": "^2.1.9",
|
||||
"react-router": "^7.9.3",
|
||||
"react-router": "^7.9.4",
|
||||
"react-simple-code-editor": "^0.14.1",
|
||||
"react-zoom-pan-pinch": "^3.7.0",
|
||||
"reflect-metadata": "^0.2.2",
|
||||
|
||||
1116
pnpm-lock.yaml
generated
1116
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user