Kar 2025-03-24 14:10:39 +05:30
commit 3a112d2fd1
48 changed files with 8983 additions and 0 deletions

41
.gitignore vendored Normal file
View File

@ -0,0 +1,41 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
deploy.zip
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# env files (can opt-in for committing if needed)
.env*
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts

36
README.md Normal file
View File

@ -0,0 +1,36 @@
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
## Getting Started
First, run the development server:
```bash
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
## Learn More
To learn more about Next.js, take a look at the following resources:
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
## Deploy on Vercel
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.

920
bun.lock Normal file
View File

@ -0,0 +1,920 @@
{
"lockfileVersion": 1,
"workspaces": {
"": {
"name": "nextjs-shadcn",
"dependencies": {
"@radix-ui/react-dialog": "^1.1.6",
"@radix-ui/react-hover-card": "^1.1.6",
"@radix-ui/react-separator": "^1.1.2",
"@radix-ui/react-slot": "^1.1.2",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-react": "^0.475.0",
"next": "^15.2.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"tailwind-merge": "^3.0.1",
"tailwindcss-animate": "^1.0.7",
},
"devDependencies": {
"@eslint/eslintrc": "^3",
"@types/node": "^20",
"@types/react": "^18.3.18",
"@types/react-dom": "^18.3.5",
"eslint": "^9",
"eslint-config-next": "15.1.7",
"postcss": "^8",
"tailwindcss": "^3.4.1",
"typescript": "^5",
},
},
},
"packages": {
"@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
"@emnapi/runtime": ["@emnapi/runtime@1.3.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw=="],
"@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA=="],
"@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="],
"@eslint/config-array": ["@eslint/config-array@0.19.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w=="],
"@eslint/core": ["@eslint/core@0.12.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg=="],
"@eslint/eslintrc": ["@eslint/eslintrc@3.3.0", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ=="],
"@eslint/js": ["@eslint/js@9.21.0", "", {}, "sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw=="],
"@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="],
"@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.7", "", { "dependencies": { "@eslint/core": "^0.12.0", "levn": "^0.4.1" } }, "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g=="],
"@floating-ui/core": ["@floating-ui/core@1.6.9", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw=="],
"@floating-ui/dom": ["@floating-ui/dom@1.6.13", "", { "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.9" } }, "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w=="],
"@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.2", "", { "dependencies": { "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A=="],
"@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="],
"@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
"@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="],
"@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
"@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.2", "", {}, "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ=="],
"@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="],
"@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="],
"@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="],
"@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="],
"@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="],
"@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="],
"@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="],
"@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="],
"@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="],
"@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="],
"@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="],
"@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="],
"@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="],
"@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="],
"@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="],
"@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="],
"@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="],
"@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="],
"@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="],
"@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="],
"@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
"@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="],
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="],
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="],
"@next/env": ["@next/env@15.2.0", "", {}, "sha512-eMgJu1RBXxxqqnuRJQh5RozhskoNUDHBFybvi+Z+yK9qzKeG7dadhv/Vp1YooSZmCnegf7JxWuapV77necLZNA=="],
"@next/eslint-plugin-next": ["@next/eslint-plugin-next@15.1.7", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-kRP7RjSxfTO13NE317ek3mSGzoZlI33nc/i5hs1KaWpK+egs85xg0DJ4p32QEiHnR0mVjuUfhRIun7awqfL7pQ=="],
"@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.2.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-rlp22GZwNJjFCyL7h5wz9vtpBVuCt3ZYjFWpEPBGzG712/uL1bbSkS675rVAUCRZ4hjoTJ26Q7IKhr5DfJrHDA=="],
"@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.2.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-DiU85EqSHogCz80+sgsx90/ecygfCSGl5P3b4XDRVZpgujBm5lp4ts7YaHru7eVTyZMjHInzKr+w0/7+qDrvMA=="],
"@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-VnpoMaGukiNWVxeqKHwi8MN47yKGyki5q+7ql/7p/3ifuU2341i/gDwGK1rivk0pVYbdv5D8z63uu9yMw0QhpQ=="],
"@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-ka97/ssYE5nPH4Qs+8bd8RlYeNeUVBhcnsNUmFM6VWEob4jfN9FTr0NBhXVi1XEJpj3cMfgSRW+LdE3SUZbPrw=="],
"@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-zY1JduE4B3q0k2ZCE+DAF/1efjTXUsKP+VXRtrt/rJCTgDlUyyryx7aOgYXNc1d8gobys/Lof9P9ze8IyRDn7Q=="],
"@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-QqvLZpurBD46RhaVaVBepkVQzh8xtlUN00RlG4Iq1sBheNugamUNPuZEH1r9X1YGQo1KqAe1iiShF0acva3jHQ=="],
"@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.2.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-ODZ0r9WMyylTHAN6pLtvUtQlGXBL9voljv6ujSlcsjOxhtXPI1Ag6AhZK0SE8hEpR1374WZZ5w33ChpJd5fsjw=="],
"@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.2.0", "", { "os": "win32", "cpu": "x64" }, "sha512-8+4Z3Z7xa13NdUuUAcpVNA6o76lNPniBd9Xbo02bwXQXnZgFvEopwY2at5+z7yHl47X9qbZpvwatZ2BRo3EdZw=="],
"@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
"@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
"@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
"@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="],
"@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="],
"@radix-ui/primitive": ["@radix-ui/primitive@1.1.1", "", {}, "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA=="],
"@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg=="],
"@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw=="],
"@radix-ui/react-context": ["@radix-ui/react-context@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q=="],
"@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.2", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw=="],
"@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-escape-keydown": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg=="],
"@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg=="],
"@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA=="],
"@radix-ui/react-hover-card": ["@radix-ui/react-hover-card@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-E4ozl35jq0VRlrdc4dhHrNSV0JqBb4Jy73WAhBEK7JoYnQ83ED5r0Rb/XdVKw89ReAJN38N492BAPBZQ57VmqQ=="],
"@radix-ui/react-id": ["@radix-ui/react-id@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA=="],
"@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.2", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-rect": "1.1.0", "@radix-ui/react-use-size": "1.1.0", "@radix-ui/rect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA=="],
"@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.4", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA=="],
"@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg=="],
"@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.0.2", "", { "dependencies": { "@radix-ui/react-slot": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w=="],
"@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ=="],
"@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ=="],
"@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw=="],
"@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw=="],
"@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw=="],
"@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w=="],
"@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.0", "", { "dependencies": { "@radix-ui/rect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ=="],
"@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw=="],
"@radix-ui/rect": ["@radix-ui/rect@1.1.0", "", {}, "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg=="],
"@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="],
"@rushstack/eslint-patch": ["@rushstack/eslint-patch@1.10.5", "", {}, "sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A=="],
"@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="],
"@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="],
"@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="],
"@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
"@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="],
"@types/node": ["@types/node@20.17.22", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-9RV2zST+0s3EhfrMZIhrz2bhuhBwxgkbHEwP2gtGWPjBzVQjifMzJ9exw7aDZhR1wbpj8zBrfp3bo8oJcGiUUw=="],
"@types/prop-types": ["@types/prop-types@15.7.14", "", {}, "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ=="],
"@types/react": ["@types/react@18.3.18", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ=="],
"@types/react-dom": ["@types/react-dom@18.3.5", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q=="],
"@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.25.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.25.0", "@typescript-eslint/type-utils": "8.25.0", "@typescript-eslint/utils": "8.25.0", "@typescript-eslint/visitor-keys": "8.25.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA=="],
"@typescript-eslint/parser": ["@typescript-eslint/parser@8.25.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.25.0", "@typescript-eslint/types": "8.25.0", "@typescript-eslint/typescript-estree": "8.25.0", "@typescript-eslint/visitor-keys": "8.25.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg=="],
"@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.25.0", "", { "dependencies": { "@typescript-eslint/types": "8.25.0", "@typescript-eslint/visitor-keys": "8.25.0" } }, "sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg=="],
"@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.25.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.25.0", "@typescript-eslint/utils": "8.25.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g=="],
"@typescript-eslint/types": ["@typescript-eslint/types@8.25.0", "", {}, "sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw=="],
"@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.25.0", "", { "dependencies": { "@typescript-eslint/types": "8.25.0", "@typescript-eslint/visitor-keys": "8.25.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.8.0" } }, "sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q=="],
"@typescript-eslint/utils": ["@typescript-eslint/utils@8.25.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.25.0", "@typescript-eslint/types": "8.25.0", "@typescript-eslint/typescript-estree": "8.25.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA=="],
"@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.25.0", "", { "dependencies": { "@typescript-eslint/types": "8.25.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ=="],
"acorn": ["acorn@8.14.0", "", { "bin": "bin/acorn" }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="],
"acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
"ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
"ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="],
"ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
"any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="],
"anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
"arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="],
"argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
"aria-hidden": ["aria-hidden@1.2.4", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A=="],
"aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
"array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="],
"array-includes": ["array-includes@3.1.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" } }, "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ=="],
"array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="],
"array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ=="],
"array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="],
"array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="],
"array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="],
"arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="],
"ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="],
"async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="],
"available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="],
"axe-core": ["axe-core@4.10.2", "", {}, "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w=="],
"axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
"balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
"binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="],
"brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="],
"braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
"busboy": ["busboy@1.6.0", "", { "dependencies": { "streamsearch": "^1.1.0" } }, "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA=="],
"call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="],
"call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
"call-bound": ["call-bound@1.0.3", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "get-intrinsic": "^1.2.6" } }, "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA=="],
"callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
"camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="],
"caniuse-lite": ["caniuse-lite@1.0.30001701", "", {}, "sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw=="],
"chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
"chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
"class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="],
"client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="],
"clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
"color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="],
"color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
"color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="],
"commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
"concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
"cssesc": ["cssesc@3.0.0", "", { "bin": "bin/cssesc" }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
"csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
"damerau-levenshtein": ["damerau-levenshtein@1.0.8", "", {}, "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="],
"data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="],
"data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="],
"data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="],
"debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
"deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
"define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="],
"define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="],
"detect-libc": ["detect-libc@2.0.3", "", {}, "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw=="],
"detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="],
"didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="],
"dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="],
"doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="],
"dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
"eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="],
"emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
"enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="],
"es-abstract": ["es-abstract@1.23.9", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.0", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-regex": "^1.2.1", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.0", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.18" } }, "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA=="],
"es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
"es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
"es-iterator-helpers": ["es-iterator-helpers@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.4", "safe-array-concat": "^1.1.3" } }, "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w=="],
"es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
"es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="],
"es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="],
"es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="],
"escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
"eslint": ["eslint@9.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.2", "@eslint/core": "^0.12.0", "@eslint/eslintrc": "^3.3.0", "@eslint/js": "9.21.0", "@eslint/plugin-kit": "^0.2.7", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "bin": "bin/eslint.js" }, "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg=="],
"eslint-config-next": ["eslint-config-next@15.1.7", "", { "dependencies": { "@next/eslint-plugin-next": "15.1.7", "@rushstack/eslint-patch": "^1.10.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^5.0.0" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", "typescript": ">=3.3.1" } }, "sha512-zXoMnYUIy3XHaAoOhrcYkT9UQWvXqWju2K7NNsmb5wd/7XESDwof61eUdW4QhERr3eJ9Ko/vnXqIrj8kk/drYw=="],
"eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="],
"eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.8.3", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.3.7", "enhanced-resolve": "^5.15.0", "get-tsconfig": "^4.10.0", "is-bun-module": "^1.0.2", "stable-hash": "^0.0.4", "tinyglobby": "^0.2.12" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import-x"] }, "sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ=="],
"eslint-module-utils": ["eslint-module-utils@2.12.0", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg=="],
"eslint-plugin-import": ["eslint-plugin-import@2.31.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.0", "hasown": "^2.0.2", "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.0", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A=="],
"eslint-plugin-jsx-a11y": ["eslint-plugin-jsx-a11y@6.10.2", "", { "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", "axe-core": "^4.10.0", "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", "string.prototype.includes": "^2.0.1" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q=="],
"eslint-plugin-react": ["eslint-plugin-react@7.37.4", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.8", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ=="],
"eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="],
"eslint-scope": ["eslint-scope@8.2.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A=="],
"eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="],
"espree": ["espree@10.3.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" } }, "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg=="],
"esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="],
"esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
"estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
"esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
"fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
"fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
"fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
"fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
"fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="],
"fdir": ["fdir@6.4.3", "", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw=="],
"file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
"fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
"find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
"flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
"flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="],
"for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="],
"foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
"function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
"function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="],
"functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="],
"get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
"get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="],
"get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
"get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="],
"get-tsconfig": ["get-tsconfig@4.10.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A=="],
"glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": "dist/esm/bin.mjs" }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="],
"glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
"globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
"globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="],
"gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
"graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="],
"has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="],
"has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
"has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="],
"has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="],
"has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
"has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="],
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
"ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
"import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
"imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
"internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="],
"is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="],
"is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="],
"is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="],
"is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="],
"is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="],
"is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="],
"is-bun-module": ["is-bun-module@1.3.0", "", { "dependencies": { "semver": "^7.6.3" } }, "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA=="],
"is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="],
"is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
"is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="],
"is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="],
"is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
"is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="],
"is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
"is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="],
"is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
"is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="],
"is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
"is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="],
"is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="],
"is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="],
"is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="],
"is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="],
"is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="],
"is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="],
"is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="],
"is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="],
"is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="],
"isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="],
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
"iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="],
"jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
"jiti": ["jiti@1.21.7", "", { "bin": "bin/jiti.js" }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="],
"js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
"js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": "bin/js-yaml.js" }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="],
"json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
"json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
"json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
"json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": "lib/cli.js" }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="],
"jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="],
"keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
"language-subtag-registry": ["language-subtag-registry@0.3.23", "", {}, "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="],
"language-tags": ["language-tags@1.0.9", "", { "dependencies": { "language-subtag-registry": "^0.3.20" } }, "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA=="],
"levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
"lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
"lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
"locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
"lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
"loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": "cli.js" }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="],
"lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
"lucide-react": ["lucide-react@0.475.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-NJzvVu1HwFVeZ+Gwq2q00KygM1aBhy/ZrhY9FsAgJtpB+E4R7uxRk9M2iKvHa6/vNxZydIB59htha4c2vvwvVg=="],
"math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
"merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
"micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
"minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
"minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
"minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
"mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="],
"nanoid": ["nanoid@3.3.8", "", { "bin": "bin/nanoid.cjs" }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="],
"natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
"next": ["next@15.2.0", "", { "dependencies": { "@next/env": "15.2.0", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.2.0", "@next/swc-darwin-x64": "15.2.0", "@next/swc-linux-arm64-gnu": "15.2.0", "@next/swc-linux-arm64-musl": "15.2.0", "@next/swc-linux-x64-gnu": "15.2.0", "@next/swc-linux-x64-musl": "15.2.0", "@next/swc-win32-arm64-msvc": "15.2.0", "@next/swc-win32-x64-msvc": "15.2.0", "sharp": "^0.33.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": "dist/bin/next" }, "sha512-VaiM7sZYX8KIAHBrRGSFytKknkrexNfGb8GlG6e93JqueCspuGte8i4ybn8z4ww1x3f2uzY4YpTaBEW4/hvsoQ=="],
"normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
"object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
"object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="],
"object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
"object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="],
"object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="],
"object.entries": ["object.entries@1.1.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ=="],
"object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="],
"object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="],
"object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="],
"optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
"own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="],
"p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
"p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
"package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
"parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
"path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
"path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
"path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="],
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
"picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
"pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="],
"pirates": ["pirates@4.0.6", "", {}, "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg=="],
"possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="],
"postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="],
"postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="],
"postcss-js": ["postcss-js@4.0.1", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw=="],
"postcss-load-config": ["postcss-load-config@4.0.2", "", { "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["ts-node"] }, "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ=="],
"postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="],
"postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="],
"postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="],
"prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
"prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="],
"punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
"queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
"react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="],
"react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="],
"react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
"react-remove-scroll": ["react-remove-scroll@2.6.3", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ=="],
"react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="],
"react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="],
"read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="],
"readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],
"reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="],
"regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="],
"resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": "bin/resolve" }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="],
"resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
"resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
"reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
"run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
"safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="],
"safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="],
"safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="],
"scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="],
"semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
"set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="],
"set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="],
"set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="],
"sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="],
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
"shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
"side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="],
"side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="],
"side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="],
"side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="],
"signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
"simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="],
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
"stable-hash": ["stable-hash@0.0.4", "", {}, "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g=="],
"streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="],
"string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
"string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
"string.prototype.includes": ["string.prototype.includes@2.0.1", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3" } }, "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg=="],
"string.prototype.matchall": ["string.prototype.matchall@4.0.12", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="],
"string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="],
"string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="],
"string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="],
"string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="],
"strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
"strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
"strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],
"strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
"styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="],
"sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="],
"supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
"tailwind-merge": ["tailwind-merge@3.0.2", "", {}, "sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw=="],
"tailwindcss": ["tailwindcss@3.4.17", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.6", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og=="],
"tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="],
"tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="],
"thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
"thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
"tinyglobby": ["tinyglobby@0.2.12", "", { "dependencies": { "fdir": "^6.4.3", "picomatch": "^4.0.2" } }, "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww=="],
"to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
"ts-api-utils": ["ts-api-utils@2.0.1", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w=="],
"ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
"tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="],
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
"type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
"typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="],
"typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="],
"typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="],
"typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="],
"typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="],
"unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="],
"undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="],
"uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
"use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="],
"use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="],
"util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
"which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="],
"which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="],
"which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="],
"which-typed-array": ["which-typed-array@1.1.18", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA=="],
"word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
"wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],
"wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
"yaml": ["yaml@2.7.0", "", { "bin": "bin.mjs" }, "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA=="],
"yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
"@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
"@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="],
"@next/eslint-plugin-next/fast-glob": ["fast-glob@3.3.1", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg=="],
"@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
"@typescript-eslint/typescript-estree/semver": ["semver@7.7.1", "", { "bin": "bin/semver.js" }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
"chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
"eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
"eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
"eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
"eslint-plugin-react/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": "bin/resolve" }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="],
"fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
"fdir/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="],
"glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
"is-bun-module/semver": ["semver@7.7.1", "", { "bin": "bin/semver.js" }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
"next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="],
"sharp/semver": ["semver@7.7.1", "", { "bin": "bin/semver.js" }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
"string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
"string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
"strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
"tinyglobby/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="],
"wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="],
"wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
"wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
"@next/eslint-plugin-next/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
"@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
"glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
"string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
"wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
"wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
}
}

21
components.json Normal file
View File

@ -0,0 +1,21 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": true,
"tsx": true,
"tailwind": {
"config": "tailwind.config.ts",
"css": "src/app/globals.css",
"baseColor": "zinc",
"cssVariables": true,
"prefix": ""
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
},
"iconLibrary": "lucide"
}

22
eslint.config.mjs Normal file
View File

@ -0,0 +1,22 @@
import { dirname } from "path";
import { fileURLToPath } from "url";
import { FlatCompat } from "@eslint/eslintrc";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const compat = new FlatCompat({
baseDirectory: __dirname,
});
const eslintConfig = [
...compat.extends("next/core-web-vitals", "next/typescript"),
{
rules: {
"@typescript-eslint/no-unused-vars": "off",
"react/no-unescaped-entities": "off",
},
},
];
export default eslintConfig;

29
netlify.toml Normal file
View File

@ -0,0 +1,29 @@
[build]
command = "npm run export"
publish = "out"
[build.environment]
NETLIFY_NEXT_PLUGIN_SKIP = "true"
[[plugins]]
package = "@netlify/plugin-nextjs"
[[redirects]]
from = "/*"
to = "/index.html"
status = 200
force = false
conditions = {Client {path = "/api/*"}}
# Handle form submissions
[[redirects]]
from = "/api/*"
to = "/.netlify/functions/:splat"
status = 200
force = true
# Images config for remote images
[images]
remote_images = [
"https://same-assets.com/**"
]

7
next.config.js Normal file
View File

@ -0,0 +1,7 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
output: 'export', // Ensures proper static export
trailingSlash: true, // Optional: Ensures URLs have trailing slashes
};
module.exports = nextConfig;

37
next.config.mjs Normal file
View File

@ -0,0 +1,37 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
/* config options here */
images: {
unoptimized: true,
domains: [
"source.unsplash.com",
"images.unsplash.com",
"ext.same-assets.com",
"ugc.same-assets.com",
],
remotePatterns: [
{
protocol: "https",
hostname: "source.unsplash.com",
pathname: "/**",
},
{
protocol: "https",
hostname: "images.unsplash.com",
pathname: "/**",
},
{
protocol: "https",
hostname: "ext.same-assets.com",
pathname: "/**",
},
{
protocol: "https",
hostname: "ugc.same-assets.com",
pathname: "/**",
},
],
},
};
export default nextConfig;

39
package.json Normal file
View File

@ -0,0 +1,39 @@
{
"name": "dwd-consultancy",
"version": "0.2.0",
"private": true,
"scripts": {
"dev": "next dev -H 0.0.0.0",
"build": "next build",
"export": "next build && node scripts/post-export.js",
"postexport": "node scripts/post-export.js",
"start": "next start",
"serve": "npx serve out",
"lint": "next lint"
},
"dependencies": {
"@radix-ui/react-dialog": "^1.1.6",
"@radix-ui/react-hover-card": "^1.1.6",
"@radix-ui/react-separator": "^1.1.2",
"@radix-ui/react-slot": "^1.1.2",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-react": "^0.475.0",
"next": "^15.2.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"tailwind-merge": "^3.0.1",
"tailwindcss-animate": "^1.0.7"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
"@types/node": "^20",
"@types/react": "^18.3.18",
"@types/react-dom": "^18.3.5",
"eslint": "^9",
"eslint-config-next": "15.1.7",
"postcss": "^8",
"tailwindcss": "^3.4.1",
"typescript": "^5"
}
}

8
postcss.config.mjs Normal file
View File

@ -0,0 +1,8 @@
/** @type {import('postcss-load-config').Config} */
const config = {
plugins: {
tailwindcss: {},
},
};
export default config;

14
public/form.html Normal file
View File

@ -0,0 +1,14 @@
<!-- A hidden form for Netlify to parse and recognize -->
<form name="contact" netlify netlify-honeypot="bot-field" hidden>
<input type="text" name="name" />
<input type="email" name="email" />
<input type="tel" name="phone" />
<select name="subject">
<option value="Hardware Solutions">Hardware Solutions</option>
<option value="FOSS Support">FOSS Support</option>
<option value="Data Services">Data Services</option>
<option value="Custom Development">Custom Development</option>
<option value="Other">Other</option>
</select>
<textarea name="message"></textarea>
</form>

28
public/index.html Normal file
View File

@ -0,0 +1,28 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DWD Consultancy Services | Keeping Your Data Resilient</title>
<meta name="description" content="We provide ready-to-use hardware with preset software with full freedom and ownership. Paid support for FOSS, with customized development. Data archival, migration and recovery services.">
<meta http-equiv="refresh" content="0;url=/" />
</head>
<body>
<!-- A hidden form for Netlify to parse and recognize -->
<form name="contact" netlify netlify-honeypot="bot-field" hidden>
<input type="text" name="name" />
<input type="email" name="email" />
<input type="tel" name="phone" />
<select name="subject">
<option value="Hardware Solutions">Hardware Solutions</option>
<option value="FOSS Support">FOSS Support</option>
<option value="Data Services">Data Services</option>
<option value="Custom Development">Custom Development</option>
<option value="Other">Other</option>
</select>
<textarea name="message"></textarea>
</form>
<p>Redirecting to DWD Consultancy Services...</p>
</body>
</html>

45
public/path-fix.js Normal file
View File

@ -0,0 +1,45 @@
/**
* Path fix script for static exports
* This script helps to fix absolute path references in the static HTML
* when served from a file system or simple static server
*/
(function() {
// Only run this script when the window has loaded
window.addEventListener('DOMContentLoaded', function() {
// Fix for stylesheet links
document.querySelectorAll('link[rel="stylesheet"]').forEach(function(link) {
if (link.href.startsWith('http')) return; // Skip absolute URLs
if (link.href.startsWith('/')) {
link.href = './' + link.href.slice(1);
}
});
// Fix for script tags
document.querySelectorAll('script[src]').forEach(function(script) {
if (script.src.startsWith('http')) return; // Skip absolute URLs
if (script.src.startsWith('/')) {
script.src = './' + script.src.slice(1);
}
});
// Fix for images
document.querySelectorAll('img[src]').forEach(function(img) {
if (img.src.startsWith('http')) return; // Skip absolute URLs
if (img.src.startsWith('/')) {
img.src = './' + img.src.slice(1);
}
});
// Initialize the mobile menu toggle
const toggleButton = document.querySelector('[aria-haspopup="dialog"]');
const sheet = document.querySelector('[data-state="closed"]');
if (toggleButton && sheet) {
toggleButton.addEventListener('click', function() {
const isOpen = sheet.getAttribute('data-state') === 'open';
sheet.setAttribute('data-state', isOpen ? 'closed' : 'open');
toggleButton.setAttribute('aria-expanded', !isOpen);
});
}
});
})();

71
scripts/post-export.js Normal file
View File

@ -0,0 +1,71 @@
const fs = require('fs');
const path = require('path');
// Function to find all HTML files recursively
function findHtmlFiles(dir, fileList = []) {
const files = fs.readdirSync(dir);
files.forEach(file => {
const filePath = path.join(dir, file);
const stat = fs.statSync(filePath);
if (stat.isDirectory()) {
findHtmlFiles(filePath, fileList);
} else if (path.extname(file) === '.html') {
fileList.push(filePath);
}
});
return fileList;
}
// Function to get relative path from HTML file to root
function getRelativePathToRoot(filePath, outDir) {
const relativePath = path.relative(path.dirname(filePath), outDir);
return relativePath || '.'; // If empty, use '.' for same directory
}
// Function to inject script tag into HTML files
function injectScriptTag(filePath, outDir) {
let html = fs.readFileSync(filePath, 'utf8');
// Skip if script is already injected
if (html.includes('path-fix.js')) {
return;
}
// Find the closing head tag
const headCloseIndex = html.indexOf('</head>');
if (headCloseIndex !== -1) {
// Get relative path from this HTML file to the root
const relativePath = getRelativePathToRoot(filePath, outDir);
// Inject the script tag before the closing head tag
const scriptTag = `<script src="${relativePath}/path-fix.js"></script>`;
const newHtml = html.slice(0, headCloseIndex) + scriptTag + html.slice(headCloseIndex);
// Write the modified HTML back to the file
fs.writeFileSync(filePath, newHtml, 'utf8');
console.log(`Injected script into ${filePath}`);
} else {
console.log(`Could not find </head> in ${filePath}`);
}
}
// Main function
function main() {
const outDir = path.join(__dirname, '..', 'out');
const htmlFiles = findHtmlFiles(outDir);
console.log(`Found ${htmlFiles.length} HTML files`);
htmlFiles.forEach(file => {
injectScriptTag(file, outDir);
});
console.log('Post-export processing complete!');
}
// Run the main function
main();

21
src/app/ClientBody.tsx Normal file
View File

@ -0,0 +1,21 @@
"use client";
import { useEffect } from "react";
export default function ClientBody({
children,
}: {
children: React.ReactNode;
}) {
// Remove any extension-added classes during hydration
useEffect(() => {
// This runs only on the client after hydration
document.body.className = "antialiased";
}, []);
return (
<body className="antialiased" suppressHydrationWarning>
{children}
</body>
);
}

364
src/app/animations.css Normal file
View File

@ -0,0 +1,364 @@
/* Animations for DWD Consultancy Website */
/* Fade In Animation */
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.animate-fade-in {
animation: fadeIn 0.8s ease-in-out forwards;
}
/* Slide In From Bottom */
@keyframes slideInBottom {
from {
transform: translateY(50px);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}
.animate-slide-in-bottom {
animation: slideInBottom 0.8s ease-out forwards;
}
/* Slide In From Left */
@keyframes slideInLeft {
from {
transform: translateX(-50px);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
.animate-slide-in-left {
animation: slideInLeft 0.8s ease-out forwards;
}
/* Slide In From Right */
@keyframes slideInRight {
from {
transform: translateX(50px);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
.animate-slide-in-right {
animation: slideInRight 0.8s ease-out forwards;
}
/* Scale Up Animation */
@keyframes scaleUp {
from {
transform: scale(0.8);
opacity: 0;
}
to {
transform: scale(1);
opacity: 1;
}
}
.animate-scale-up {
animation: scaleUp 0.8s ease-out forwards;
}
/* Pulse Animation */
@keyframes pulse {
0% {
transform: scale(1);
}
50% {
transform: scale(1.05);
}
100% {
transform: scale(1);
}
}
.animate-pulse-slow {
animation: pulse 3s infinite ease-in-out;
}
/* Glow Animation */
@keyframes glow {
0% {
box-shadow: 0 0 5px rgba(255, 107, 0, 0.3);
}
50% {
box-shadow: 0 0 20px rgba(255, 107, 0, 0.6);
}
100% {
box-shadow: 0 0 5px rgba(255, 107, 0, 0.3);
}
}
.animate-glow {
animation: glow 3s infinite ease-in-out;
}
/* Typing Animation */
@keyframes typing {
from {
width: 0;
}
to {
width: 100%;
}
}
.animate-typing {
display: inline-block;
overflow: hidden;
white-space: nowrap;
animation: typing 2.5s steps(30, end) forwards;
}
/* Float Animation */
@keyframes float {
0% {
transform: translateY(0px);
}
50% {
transform: translateY(-10px);
}
100% {
transform: translateY(0px);
}
}
.animate-float {
animation: float 4s ease-in-out infinite;
}
/* Background Gradient Animation */
@keyframes gradientFlow {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
.animate-gradient {
background: linear-gradient(-45deg, #ff6b00, #ff9a56, #64D0FF, #337799);
background-size: 400% 400%;
animation: gradientFlow 15s ease infinite;
}
/* Data Flow Animation */
@keyframes dataFlow {
0% {
background-position: 0% 0%;
}
100% {
background-position: 100% 100%;
}
}
.animate-data-flow {
background: linear-gradient(45deg, rgba(255, 107, 0, 0.1) 25%, transparent 25%, transparent 50%, rgba(255, 107, 0, 0.1) 50%, rgba(255, 107, 0, 0.1) 75%, transparent 75%, transparent);
background-size: 20px 20px;
animation: dataFlow 2s linear infinite;
}
/* Animation Delays */
.delay-100 {
animation-delay: 100ms;
}
.delay-200 {
animation-delay: 200ms;
}
.delay-300 {
animation-delay: 300ms;
}
.delay-400 {
animation-delay: 400ms;
}
.delay-500 {
animation-delay: 500ms;
}
.delay-600 {
animation-delay: 600ms;
}
.delay-700 {
animation-delay: 700ms;
}
.delay-800 {
animation-delay: 800ms;
}
/* Service Card Hover Effect */
.service-card {
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.service-card:hover {
transform: translateY(-10px);
box-shadow: 0 15px 30px rgba(0, 0, 0, 0.3);
}
/* Button Animation */
.btn-animated {
position: relative;
overflow: hidden;
}
.btn-animated::before {
content: "";
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
rgba(255, 255, 255, 0),
rgba(255, 255, 255, 0.2),
rgba(255, 255, 255, 0)
);
transition: all 0.6s ease;
}
.btn-animated:hover::before {
left: 100%;
}
/* Icon Spin Animation */
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.animate-spin-slow {
animation: spin 6s linear infinite;
}
/* Bounce Animation */
@keyframes bounce {
0%, 20%, 50%, 80%, 100% {
transform: translateY(0);
}
40% {
transform: translateY(-20px);
}
60% {
transform: translateY(-10px);
}
}
.animate-bounce-custom {
animation: bounce 2s ease infinite;
}
/* Fade in animations with different directions */
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.animate-fade-in-up {
animation: fadeInUp 0.8s ease forwards;
}
/* Staggered animation for lists */
.stagger-animate > *:nth-child(1) { animation-delay: 100ms; }
.stagger-animate > *:nth-child(2) { animation-delay: 200ms; }
.stagger-animate > *:nth-child(3) { animation-delay: 300ms; }
.stagger-animate > *:nth-child(4) { animation-delay: 400ms; }
.stagger-animate > *:nth-child(5) { animation-delay: 500ms; }
.stagger-animate > *:nth-child(6) { animation-delay: 600ms; }
.stagger-animate > *:nth-child(7) { animation-delay: 700ms; }
.stagger-animate > *:nth-child(8) { animation-delay: 800ms; }
/* Network Connection Animation */
.network-lines {
stroke-dasharray: 15;
stroke-dashoffset: 15;
animation: dash 2s linear infinite;
}
@keyframes dash {
to {
stroke-dashoffset: 0;
}
}
/* Shine Effect */
.shine-effect {
position: relative;
overflow: hidden;
}
.shine-effect::after {
content: '';
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: linear-gradient(
to right,
rgba(255, 255, 255, 0) 0%,
rgba(255, 255, 255, 0.3) 50%,
rgba(255, 255, 255, 0) 100%
);
transform: rotate(30deg);
animation: shine 6s infinite linear;
}
@keyframes shine {
0% {
transform: rotate(30deg) translate(-100%, -100%);
}
100% {
transform: rotate(30deg) translate(100%, 100%);
}
}
/* Blinking Cursor Effect for Typing Animation */
.typing-cursor::after {
content: '|';
animation: blink 1s step-end infinite;
}
@keyframes blink {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}

252
src/app/contact/page.tsx Normal file
View File

@ -0,0 +1,252 @@
import { Metadata } from "next";
import { Mail, Phone, MapPin, Clock, ArrowRight } from "lucide-react";
import { Button } from "@/components/ui/button";
import { Card } from "@/components/ui/card";
export const metadata: Metadata = {
title: "Contact Us | DWD Consultancy",
description: "Get in touch with DWD Consultancy to discuss your data needs. Let's work together to keep your data resilient and secure.",
keywords: ["contact DWD", "data consultancy", "IT support", "data resilience", "request consultation"],
openGraph: {
title: "Contact Us | DWD Consultancy",
description: "Get in touch with DWD Consultancy to discuss your data needs. Let's work together to keep your data resilient and secure.",
url: "https://dwdconsultancy.com/contact",
images: [
{
url: "/og-image-contact.jpg",
width: 1200,
height: 630,
alt: "Contact DWD Consultancy",
},
],
},
};
export default function ContactPage() {
return (
<div className="min-h-screen">
{/* Hero Section */}
<section className="relative pt-32 pb-16 overflow-hidden">
{/* Background Pattern */}
<div className="absolute inset-0 z-0 opacity-20">
<div className="absolute -top-40 -right-40 w-80 h-80 bg-netbirdOrange rounded-full blur-[100px]" />
<div className="absolute bottom-0 right-1/3 w-60 h-60 bg-netbirdOrange/50 rounded-full blur-[100px]" />
</div>
<div className="container mx-auto relative z-10">
<div className="max-w-3xl">
<div className="flex items-center mb-6">
<div className="h-1 w-10 bg-netbirdOrange rounded-full mr-3"></div>
<span className="text-sm text-white/80 uppercase tracking-wider font-medium">
Contact Us
</span>
</div>
<h1 className="text-4xl md:text-5xl font-bold mb-6 text-white leading-tight">
Let's Discuss Your <span className="gradient-text">Data Needs</span>
</h1>
<p className="text-xl text-white/80 mb-8 max-w-2xl">
Have questions about our services or want to discuss a project? Reach out to us and our team will get back to you as soon as possible.
</p>
</div>
</div>
</section>
{/* Contact Section */}
<section className="py-16 relative">
<div className="container mx-auto">
<div className="grid grid-cols-1 lg:grid-cols-3 gap-8">
{/* Contact Information Card */}
<Card className="bg-[#0d1324] border border-white/10 p-8 shadow-xl lg:col-span-1">
<h3 className="text-xl font-semibold text-white mb-6">Contact Information</h3>
<div className="space-y-6">
<div className="flex">
<div className="mr-4 p-3 bg-[#1c2640] rounded-lg h-min">
<MapPin className="h-5 w-5 text-netbirdOrange" />
</div>
<div>
<h4 className="text-white font-medium mb-1">Our Location</h4>
<p className="text-white/70 text-sm">
123 Business Avenue<br />
Tech District, City<br />
Country, 12345
</p>
</div>
</div>
<div className="flex">
<div className="mr-4 p-3 bg-[#1c2640] rounded-lg h-min">
<Mail className="h-5 w-5 text-netbirdOrange" />
</div>
<div>
<h4 className="text-white font-medium mb-1">Email Us</h4>
<p className="text-white/70 text-sm">
info@dwdconsultancy.com<br />
support@dwdconsultancy.com
</p>
</div>
</div>
<div className="flex">
<div className="mr-4 p-3 bg-[#1c2640] rounded-lg h-min">
<Phone className="h-5 w-5 text-netbirdOrange" />
</div>
<div>
<h4 className="text-white font-medium mb-1">Call Us</h4>
<p className="text-white/70 text-sm">
+1 (555) 123-4567<br />
+1 (555) 987-6543
</p>
</div>
</div>
<div className="flex">
<div className="mr-4 p-3 bg-[#1c2640] rounded-lg h-min">
<Clock className="h-5 w-5 text-netbirdOrange" />
</div>
<div>
<h4 className="text-white font-medium mb-1">Business Hours</h4>
<p className="text-white/70 text-sm">
Monday - Friday: 9:00 AM - 6:00 PM<br />
Saturday: 10:00 AM - 2:00 PM<br />
Sunday: Closed
</p>
</div>
</div>
</div>
<div className="mt-8 p-4 bg-white/5 border border-white/10 rounded-lg">
<h4 className="text-white font-medium mb-2">Emergency Support</h4>
<p className="text-white/70 text-sm mb-3">
For urgent technical issues, our 24/7 emergency support team is available.
</p>
<Button variant="outline" className="w-full border-netbirdOrange/50 text-netbirdOrange hover:bg-netbirdOrange/10">
Contact Emergency Support
</Button>
</div>
</Card>
{/* Contact Form */}
<Card className="bg-[#0d1324] border border-white/10 p-8 shadow-xl lg:col-span-2 relative overflow-hidden">
<div className="absolute -top-20 -right-20 w-40 h-40 bg-netbirdOrange rounded-full blur-[60px] opacity-10"></div>
<h3 className="text-xl font-semibold text-white mb-6">Send Us a Message</h3>
{/* Netlify form - works with static sites */}
<form
name="contact"
method="POST"
data-netlify="true"
netlify-honeypot="bot-field"
className="space-y-6"
>
<input type="hidden" name="form-name" value="contact" />
<p className="hidden">
<label>
Don't fill this out if you're human: <input name="bot-field" />
</label>
</p>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<label htmlFor="name" className="block text-white/90 mb-2 text-sm">
Your Name <span className="text-netbirdOrange">*</span>
</label>
<input
type="text"
id="name"
name="name"
required
className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg text-white focus:outline-none focus:border-netbirdOrange/50 focus:ring-1 focus:ring-netbirdOrange/50"
placeholder="John Doe"
/>
</div>
<div>
<label htmlFor="email" className="block text-white/90 mb-2 text-sm">
Email Address <span className="text-netbirdOrange">*</span>
</label>
<input
type="email"
id="email"
name="email"
required
className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg text-white focus:outline-none focus:border-netbirdOrange/50 focus:ring-1 focus:ring-netbirdOrange/50"
placeholder="john@example.com"
/>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<label htmlFor="phone" className="block text-white/90 mb-2 text-sm">
Phone Number
</label>
<input
type="tel"
id="phone"
name="phone"
className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg text-white focus:outline-none focus:border-netbirdOrange/50 focus:ring-1 focus:ring-netbirdOrange/50"
placeholder="+1 (555) 123-4567"
/>
</div>
<div>
<label htmlFor="subject" className="block text-white/90 mb-2 text-sm">
Subject <span className="text-netbirdOrange">*</span>
</label>
<select
id="subject"
name="subject"
required
className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg text-white focus:outline-none focus:border-netbirdOrange/50 focus:ring-1 focus:ring-netbirdOrange/50"
defaultValue=""
>
<option value="" disabled className="bg-netbirdDark">Select a subject</option>
<option value="Hardware Solutions" className="bg-netbirdDark">Hardware Solutions</option>
<option value="FOSS Support" className="bg-netbirdDark">FOSS Support</option>
<option value="Data Services" className="bg-netbirdDark">Data Services</option>
<option value="Custom Development" className="bg-netbirdDark">Custom Development</option>
<option value="Other" className="bg-netbirdDark">Other</option>
</select>
</div>
</div>
<div>
<label htmlFor="message" className="block text-white/90 mb-2 text-sm">
Your Message <span className="text-netbirdOrange">*</span>
</label>
<textarea
id="message"
name="message"
required
rows={5}
className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg text-white focus:outline-none focus:border-netbirdOrange/50 focus:ring-1 focus:ring-netbirdOrange/50 resize-none"
placeholder="Tell us about your project or inquiry..."
></textarea>
</div>
<div className="flex justify-end">
<Button type="submit" className="bg-netbirdOrange hover:bg-netbirdOrange/90 text-white px-8">
Send Message
<ArrowRight className="ml-2 h-4 w-4" />
</Button>
</div>
</form>
</Card>
</div>
{/* Map Section */}
<div className="mt-16">
<div className="bg-[#0d1324] border border-white/10 p-6 rounded-xl">
<h3 className="text-xl font-semibold text-white mb-6">Our Location</h3>
<div className="w-full h-80 bg-[#1c2640]/50 rounded-lg flex items-center justify-center border border-white/10">
<p className="text-white/70">Interactive map would be displayed here</p>
</div>
</div>
</div>
</div>
</section>
</div>
);
}

View File

@ -0,0 +1,129 @@
import { Separator } from "@/components/ui/separator";
import { Cookie, Shield } from "lucide-react";
export const metadata = {
title: "Cookie Policy | DWD Consultancy",
description: "Our approach to cookies and website session management",
};
export default function CookiePolicy() {
return (
<main className="container max-w-4xl mx-auto py-24">
<div className="mb-12 text-center">
<h1 className="text-3xl md:text-4xl font-bold mb-4 text-white">Cookie Policy</h1>
<p className="text-white/70 max-w-2xl mx-auto">
Our straightforward approach to cookies and session management
</p>
</div>
<div className="prose prose-invert max-w-none">
<section className="mb-8">
<div className="flex items-start">
<Cookie className="h-8 w-8 text-netbirdOrange mr-4 mt-1 flex-shrink-0" />
<div>
<h2 className="text-2xl font-semibold text-white mb-4">Our Cookie Philosophy</h2>
<p className="text-white/80 mb-4">
At DWD Consultancy, we believe in transparency and simplicity. We view cookies for what they
truly are a basic technology to maintain session state between web servers and browsers.
<span className="text-netbirdOrange font-medium"> We do not collect any Personally Identifiable Information (PIA)
using cookies</span>.
</p>
<p className="text-white/80">
We find mandatory cookie consent popups unnecessary and often disruptive to the user experience,
especially when they're used on websites that only employ essential functional cookies for basic operation.
</p>
</div>
</div>
</section>
<Separator className="my-8 bg-white/10" />
<section className="mb-8">
<h2 className="text-2xl font-semibold text-white mb-4">How We Use Cookies</h2>
<div className="bg-[#0d1324] border border-white/10 rounded-lg p-6 mb-6">
<h3 className="text-xl font-medium text-white mb-3">Essential Session Management Only</h3>
<p className="text-white/80">
We only use cookies for essential session management between the server and your browser.
These cookies are strictly necessary for the functioning of our website and do not store any
personal information. They simply enable our server to recognize your browser during a session.
</p>
</div>
<div className="bg-[#0d1324] border border-white/10 rounded-lg p-6">
<h3 className="text-xl font-medium text-white mb-3">What We Don't Do With Cookies</h3>
<ul className="list-disc pl-6 text-white/80 space-y-2">
<li>We do not use tracking cookies</li>
<li>We do not use advertising cookies</li>
<li>We do not use analytics cookies to monitor your behavior</li>
<li>We do not share cookie data with third parties</li>
<li>We do not create user profiles based on cookies</li>
<li>We do not store any personal identifiable information in cookies</li>
</ul>
</div>
</section>
<Separator className="my-8 bg-white/10" />
<section className="mb-8">
<div className="flex items-start">
<Shield className="h-8 w-8 text-netbirdOrange mr-4 mt-1 flex-shrink-0" />
<div>
<h2 className="text-2xl font-semibold text-white mb-4">Your Privacy is Protected</h2>
<p className="text-white/80 mb-4">
Our approach to cookies aligns with our overall privacy philosophy we respect your right
to privacy and control over your data. We maintain a minimal digital footprint and do not
employ invasive tracking technologies.
</p>
<p className="text-white/80">
If you're concerned about cookies in general, most browsers allow you to:
</p>
<ul className="list-disc pl-6 text-white/80 space-y-2 mt-2">
<li>Delete cookies after each browsing session</li>
<li>Block cookies entirely (though this may affect website functionality)</li>
<li>Configure which websites can store cookies</li>
</ul>
</div>
</div>
</section>
<Separator className="my-8 bg-white/10" />
<section className="mb-8">
<h2 className="text-2xl font-semibold text-white mb-4">Industry Context</h2>
<p className="text-white/80 mb-4">
Many websites implement intrusive cookie banners primarily due to regulatory requirements
like the EU's General Data Protection Regulation (GDPR) and similar laws. These regulations
were designed to address privacy concerns related to extensive tracking and profiling practices
employed by advertising networks and large tech platforms.
</p>
<p className="text-white/80">
Since we don't engage in these practices and only use cookies for essential functionality,
we maintain a simple and straightforward cookie policy that respects both regulatory requirements
and your browsing experience.
</p>
</section>
<Separator className="my-8 bg-white/10" />
<section>
<h2 className="text-2xl font-semibold text-white mb-4">Questions About Our Cookie Usage?</h2>
<p className="text-white/80 mb-6">
If you have any concerns or questions about how we use cookies or manage session data,
please don't hesitate to contact us.
</p>
<div className="bg-netbirdOrange/10 border border-netbirdOrange/30 rounded-lg p-6">
<h3 className="text-xl font-medium text-white mb-3">Contact Us</h3>
<p className="text-white/80 mb-4">
For questions about our cookie usage or privacy practices:
</p>
<p className="text-white/80">
<strong>Email:</strong> privacy@dwdconsultancy.com
</p>
</div>
</section>
</div>
</main>
);
}

116
src/app/globals.css Normal file
View File

@ -0,0 +1,116 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
--background: 222 47% 11%;
--foreground: 0 0% 98%;
--card: 222 47% 11%;
--card-foreground: 0 0% 98%;
--popover: 222 47% 11%;
--popover-foreground: 0 0% 98%;
--primary: 24 100% 50%;
--primary-foreground: 0 0% 98%;
--secondary: 217 32% 18%;
--secondary-foreground: 0 0% 98%;
--muted: 217 32% 18%;
--muted-foreground: 215 20.2% 65.1%;
--accent: 217 32% 18%;
--accent-foreground: 0 0% 98%;
--destructive: 0 62.8% 30.6%;
--destructive-foreground: 0 0% 98%;
--border: 217 32% 18%;
--input: 217 32% 18%;
--ring: 24 100% 50%;
--radius: 0.5rem;
}
* {
@apply border-border;
}
html, body {
overflow-x: hidden;
width: 100%;
position: relative;
}
body {
@apply bg-netbirdDark text-foreground;
}
/* Custom Scrollbar Styling */
::-webkit-scrollbar {
width: 12px;
}
::-webkit-scrollbar-track {
background-color: #0f1729; /* netbirdDark */
border-radius: 10px;
}
::-webkit-scrollbar-thumb {
background-color: #ff6b00; /* netbirdOrange */
border-radius: 10px;
border: 2px solid #0f1729; /* Border to match track */
}
::-webkit-scrollbar-thumb:hover {
background-color: #ff8833; /* Lighter shade on hover */
}
/* Firefox */
* {
scrollbar-width: thin;
scrollbar-color: #ff6b00 #0f1729;
}
}
.gradient-text {
background: linear-gradient(90deg, #ff6b00, #ff9d57);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.data-flow-animation {
position: relative;
overflow: hidden;
}
.data-flow-animation::before {
content: "";
position: absolute;
top: 0;
left: -100%;
width: 50%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
rgba(255, 107, 0, 0.2),
transparent
);
animation: data-flow 3s infinite;
}
@keyframes data-flow {
0% {
left: -100%;
}
100% {
left: 100%;
}
}
/* Import animations */
@import './animations.css';

75
src/app/layout.tsx Normal file
View File

@ -0,0 +1,75 @@
import type { Metadata, Viewport } from "next";
import { Inter } from "next/font/google";
import "./globals.css";
import NavBar from "@/components/ui/nav-bar";
import Footer from "@/components/ui/footer";
const inter = Inter({ subsets: ["latin"] });
export const viewport: Viewport = {
width: "device-width",
initialScale: 1,
minimumScale: 1,
maximumScale: 5,
userScalable: true,
viewportFit: "cover",
};
export const metadata: Metadata = {
metadataBase: new URL("https://dwdconsultancy.com"),
title: "DWD Consultancy Services | Keeping Your Data Resilient",
description: "We provide ready-to-use hardware with preset software with full freedom and ownership. Paid support for FOSS, with customized development. Data archival, migration and recovery services.",
keywords: ["data resilience", "hardware solutions", "FOSS support", "data services", "IT consultancy", "data recovery", "software support"],
openGraph: {
title: "DWD Consultancy Services | Data Resilience Experts",
description: "Keeping your data resilient with hardware solutions, FOSS support, and comprehensive data services.",
url: "https://dwdconsultancy.com",
siteName: "DWD Consultancy",
images: [
{
url: "/og-image.jpg",
width: 1200,
height: 630,
alt: "DWD Consultancy Services",
},
],
locale: "en_US",
type: "website",
},
twitter: {
card: "summary_large_image",
title: "DWD Consultancy Services | Data Resilience Experts",
description: "Keeping your data resilient with hardware solutions, FOSS support, and comprehensive data services.",
images: ["/og-image.jpg"],
},
icons: {
icon: [
{ url: "/favicon.ico" },
{ url: "/favicon-16x16.png", sizes: "16x16", type: "image/png" },
{ url: "/favicon-32x32.png", sizes: "32x32", type: "image/png" },
],
apple: [{ url: "/apple-touch-icon.png", sizes: "180x180" }],
},
verification: {
google: "google-site-verification-code",
},
alternates: {
canonical: "https://dwdconsultancy.com",
},
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en" className="overflow-x-hidden scroll-smooth">
<body className={`${inter.className} overflow-x-hidden`}>
<NavBar />
{children}
<Footer />
</body>
</html>
);
}

50
src/app/not-found.tsx Normal file
View File

@ -0,0 +1,50 @@
import Link from "next/link";
import { ArrowLeft } from "lucide-react";
import { Button } from "@/components/ui/button";
export default function NotFound() {
return (
<div className="min-h-screen flex flex-col items-center justify-center p-6">
<div className="max-w-md text-center">
<h1 className="text-6xl font-bold text-white mb-4">
<span className="gradient-text">404</span>
</h1>
<h2 className="text-2xl font-semibold text-white mb-6">Page Not Found</h2>
<p className="text-white/70 mb-8">
The page you are looking for doesn't exist or has been moved. Please check the URL or go back to the homepage.
</p>
<Link href="/">
<Button className="bg-netbirdOrange hover:bg-netbirdOrange/90 text-white">
<ArrowLeft className="mr-2 h-4 w-4" />
Back to Home
</Button>
</Link>
{/* Visual elements */}
<div className="relative mt-16">
<div className="bg-[#0d1324] border border-white/10 p-6 rounded-xl">
<h3 className="text-lg font-semibold text-white mb-4">Looking for something specific?</h3>
<p className="text-white/70 text-sm mb-4">
Check out our main service pages or contact us for assistance.
</p>
<div className="grid grid-cols-1 md:grid-cols-3 gap-3 text-sm">
<Link href="/services/hardware-solutions/" className="text-netbirdOrange hover:underline">
Hardware Solutions
</Link>
<Link href="/services/foss-support/" className="text-netbirdOrange hover:underline">
FOSS Support
</Link>
<Link href="/services/data-services/" className="text-netbirdOrange hover:underline">
Data Services
</Link>
</div>
</div>
{/* Decorative elements */}
<div className="absolute -top-20 -left-20 w-40 h-40 bg-netbirdOrange rounded-full blur-[60px] opacity-10 z-0"></div>
<div className="absolute -bottom-10 -right-10 w-40 h-40 bg-netbirdOrange/50 rounded-full blur-[60px] opacity-10 z-0"></div>
</div>
</div>
</div>
);
}

55
src/app/page.tsx Normal file
View File

@ -0,0 +1,55 @@
import HeroSection from "@/components/sections/hero-section";
import ServicesSection from "@/components/sections/services-section";
import AboutSection from "@/components/sections/about-section";
import ContactSection from "@/components/sections/contact-section";
import Script from "next/script";
export default function Home() {
const jsonLd = {
"@context": "https://schema.org",
"@type": "Organization",
"name": "DWD Consultancy Services",
"url": "https://dwdconsultancy.com",
"logo": "https://dwdconsultancy.com/logo.png",
"description": "We provide ready-to-use hardware with preset software with full freedom and ownership. Paid support for FOSS, with customized development. Data archival, migration and recovery services.",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Business Avenue",
"addressLocality": "Tech District",
"addressRegion": "City",
"postalCode": "12345",
"addressCountry": "Country"
},
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+1-555-123-4567",
"contactType": "customer service",
"email": "info@dwdconsultancy.com"
},
"sameAs": [
"https://www.facebook.com/dwdconsultancy",
"https://www.twitter.com/dwdconsultancy",
"https://www.linkedin.com/company/dwdconsultancy"
],
"serviceArea": "Global",
"serviceType": [
"Hardware Solutions",
"FOSS Support",
"Data Services"
]
};
return (
<main>
<Script
id="organization-schema"
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
/>
<HeroSection />
<ServicesSection />
<AboutSection />
<ContactSection />
</main>
);
}

View File

@ -0,0 +1,134 @@
import { Separator } from "@/components/ui/separator";
export const metadata = {
title: "Privacy Policy | DWD Consultancy",
description: "Learn about our commitment to privacy and data security at DWD Consultancy",
};
export default function PrivacyPolicy() {
return (
<main className="container max-w-4xl mx-auto py-24">
<div className="mb-12 text-center">
<h1 className="text-3xl md:text-4xl font-bold mb-4 text-white">Privacy Policy</h1>
<p className="text-white/70 max-w-2xl mx-auto">
Our approach to privacy and data security
</p>
</div>
<div className="prose prose-invert max-w-none">
<section className="mb-8">
<h2 className="text-2xl font-semibold text-white mb-4">Our Privacy Commitment</h2>
<p className="text-white/80 mb-4">
At DWD Consultancy, we believe your data belongs to you. Our fundamental approach to privacy is simple:
<span className="text-netbirdOrange font-medium"> we don't collect, store, track, or sell any of your personal data</span>.
</p>
<p className="text-white/80">
Since we don't operate as an online service provider and only provide direct client services, we maintain
minimal digital footprint of your information. Our website exists solely to provide information about our services.
</p>
</section>
<Separator className="my-8 bg-white/10" />
<section className="mb-8">
<h2 className="text-2xl font-semibold text-white mb-4">How We Handle Your Data</h2>
<div className="bg-[#0d1324] border border-white/10 rounded-lg p-6 mb-6">
<h3 className="text-xl font-medium text-white mb-3">Client Data Encryption</h3>
<p className="text-white/80 mb-4">
When you engage our services, any data you share with us is protected using industry-leading
encryption standards based exclusively on Free and Open Source Software (FOSS) technology.
</p>
<p className="text-white/80">
Your data remains under <strong>your ownership and control</strong> at all times. Our FOSS-based
approach means that the encryption tools we use have been publicly audited for security vulnerabilities,
making them more secure than proprietary alternatives.
</p>
</div>
<div className="bg-[#0d1324] border border-white/10 rounded-lg p-6 mb-6">
<h3 className="text-xl font-medium text-white mb-3">No Online Data Collection</h3>
<p className="text-white/80">
Unlike most companies:
</p>
<ul className="list-disc pl-6 text-white/80 space-y-2 mt-2">
<li>We do not use cookies to track you</li>
<li>We do not collect analytics about your usage behavior</li>
<li>We do not use any third-party advertising services</li>
<li>We do not store your information in cloud databases</li>
<li>We do not sell or share your data with third parties</li>
</ul>
</div>
<div className="bg-[#0d1324] border border-white/10 rounded-lg p-6">
<h3 className="text-xl font-medium text-white mb-3">Contact Form</h3>
<p className="text-white/80">
When you use our contact form, the information you provide is transmitted directly to our
internal systems and is not stored on any third-party servers. This information is only used to
respond to your inquiry and is not used for marketing purposes.
</p>
</div>
</section>
<Separator className="my-8 bg-white/10" />
<section className="mb-8">
<h2 className="text-2xl font-semibold text-white mb-4">Our FOSS Security Approach</h2>
<p className="text-white/80 mb-4">
Free and Open Source Software is at the core of our privacy and security philosophy. By using FOSS technologies:
</p>
<ul className="list-disc pl-6 text-white/80 space-y-2 mb-4">
<li>The code protecting your data is transparent and publicly auditable</li>
<li>Security vulnerabilities are quickly identified and patched by a global community</li>
<li>No backdoors or hidden surveillance mechanisms can exist within the software</li>
<li>You gain complete control over your own data</li>
</ul>
<p className="text-white/80">
We believe this approach provides significantly stronger privacy protections than
conventional proprietary solutions that rely on "trust us" promises.
</p>
</section>
<Separator className="my-8 bg-white/10" />
<section className="mb-8">
<h2 className="text-2xl font-semibold text-white mb-4">Your Data Rights</h2>
<p className="text-white/80 mb-4">
As a client of DWD Consultancy, you:
</p>
<ul className="list-disc pl-6 text-white/80 space-y-2">
<li>Retain full ownership of your data at all times</li>
<li>Receive the encryption keys for your own data</li>
<li>Have the ability to delete your data completely at any time</li>
<li>Can request detailed information about any data we may have about you</li>
<li>Can export your data in standard formats for portability</li>
</ul>
</section>
<Separator className="my-8 bg-white/10" />
<section>
<h2 className="text-2xl font-semibold text-white mb-4">Policy Updates</h2>
<p className="text-white/80 mb-6">
We may update this privacy policy from time to time to reflect changes in our practices or
for legal, operational, or regulatory reasons. However, our core commitment to not collecting,
tracking, or selling your data will remain unchanged.
</p>
<p className="text-white/80 mb-4">
Last updated: March 24, 2025
</p>
<div className="bg-netbirdOrange/10 border border-netbirdOrange/30 rounded-lg p-6">
<h3 className="text-xl font-medium text-white mb-3">Contact Us About Privacy</h3>
<p className="text-white/80 mb-4">
If you have any questions about our privacy practices or this policy, please contact us at:
</p>
<p className="text-white/80">
<strong>Email:</strong> privacy@dwdconsultancy.com
</p>
</div>
</section>
</div>
</main>
);
}

13
src/app/robots.ts Normal file
View File

@ -0,0 +1,13 @@
import { MetadataRoute } from 'next';
export const dynamic = 'force-static';
export default function robots(): MetadataRoute.Robots {
return {
rules: {
userAgent: '*',
allow: '/',
},
sitemap: 'https://dwdconsultancy.com/sitemap.xml',
};
}

View File

@ -0,0 +1,350 @@
import { Metadata } from "next";
import Link from "next/link";
import { Database, HardDrive, CheckCircle, ArrowLeft, ArrowRight, History, FileUp, MoveRight } from "lucide-react";
import { Button } from "@/components/ui/button";
export const metadata: Metadata = {
title: "Data Services | DWD Consultancy",
description: "Comprehensive data archival, migration and recovery services to keep your information secure and accessible.",
keywords: ["data archival", "data migration", "data recovery", "backup solutions", "disaster recovery", "long-term storage"],
openGraph: {
title: "Data Services | DWD Consultancy",
description: "Comprehensive data archival, migration and recovery services to keep your information secure and accessible.",
url: "https://dwdconsultancy.com/services/data-services",
images: [
{
url: "/og-image-data.jpg",
width: 1200,
height: 630,
alt: "DWD Consultancy Data Services",
},
],
},
};
// Custom icon for data migration
const DataMigrationIcon = () => (
<svg
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
className="h-5 w-5 text-netbirdOrange"
>
<path d="M10 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h4"></path>
<path d="M18 9h-8"></path>
<path d="m15 6-3 3 3 3"></path>
<path d="M14 21h4a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2h-4"></path>
<path d="M6 15h8"></path>
<path d="m9 18 3-3-3-3"></path>
</svg>
);
export default function DataServicesPage() {
const benefits = [
"Secure, reliable data preservation for compliance and business continuity",
"Seamless migration with minimal downtime or disruption",
"Expert recovery of corrupted or lost data",
"Customized solutions that scale with your business needs",
"Comprehensive documentation and knowledge transfer",
"Reduced risk of data loss and associated costs",
"Compliance with industry regulations and standards",
"Cost-effective long-term storage strategies",
];
const offerings = [
{
title: "Data Archival",
description: "Secure, long-term storage solutions for your valuable data assets.",
icon: HardDrive,
},
{
title: "Data Migration",
description: "Seamless transfer of data between platforms and environments.",
icon: DataMigrationIcon,
isCustomIcon: true,
},
{
title: "Data Recovery",
description: "Expert retrieval of lost or corrupted data from various storage media.",
icon: FileUp, // Changed from FileRecovery to FileUp
},
{
title: "Backup Solutions",
description: "Robust backup strategies to ensure business continuity and disaster recovery.",
icon: Database,
},
];
// Rest of the component implementation remains the same
return (
<div className="min-h-screen">
{/* Hero Section */}
<section className="relative pt-32 pb-16 overflow-hidden">
{/* Background Pattern */}
<div className="absolute inset-0 z-0 opacity-20">
<div className="absolute -top-40 -right-40 w-80 h-80 bg-netbirdOrange rounded-full blur-[100px]" />
<div className="absolute bottom-0 right-1/3 w-60 h-60 bg-netbirdOrange/50 rounded-full blur-[100px]" />
</div>
<div className="container mx-auto relative z-10">
<div className="mb-6">
<Link href="/services" className="flex items-center text-white/70 hover:text-netbirdOrange transition-colors">
<ArrowLeft className="mr-2 h-4 w-4" />
Back to Services
</Link>
</div>
<div className="max-w-3xl">
<div className="flex items-center mb-6">
<div className="h-1 w-10 bg-netbirdOrange rounded-full mr-3"></div>
<span className="text-sm text-white/80 uppercase tracking-wider font-medium">
Data Services
</span>
</div>
<h1 className="text-4xl md:text-5xl font-bold mb-6 text-white leading-tight">
Keeping Your <span className="gradient-text">Data</span> Resilient
</h1>
<p className="text-xl text-white/80 mb-8 max-w-2xl">
We provide comprehensive data archival, migration, and recovery services to ensure
your valuable information remains secure, accessible, and protected against all types of failures.
</p>
</div>
</div>
</section>
{/* Main Content */}
<section className="py-16 relative">
<div className="container mx-auto">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-16">
{/* Left Column - Details */}
<div>
<h2 className="text-2xl md:text-3xl font-bold text-white mb-6">
Our Data Services
</h2>
<p className="text-white/80 mb-8">
In today's digital landscape, your data is one of your most valuable assets. Our data
services ensure that this critical information is properly managed, protected, and
available when you need it, regardless of unforeseen circumstances.
</p>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 mb-10">
{offerings.map((offering, index) => (
<div key={index} className="bg-[#0d1324] border border-white/10 p-5 rounded-xl">
<div className="w-10 h-10 bg-[#1c2640] rounded-lg flex items-center justify-center mb-4">
{offering.isCustomIcon ? (
<offering.icon />
) : (
<offering.icon className="h-5 w-5 text-netbirdOrange" />
)}
</div>
<h3 className="text-white font-semibold mb-2">{offering.title}</h3>
<p className="text-white/70 text-sm">{offering.description}</p>
</div>
))}
</div>
<h2 className="text-2xl md:text-3xl font-bold text-white mb-6">
Our Data Approach
</h2>
<p className="text-white/80 mb-6">
We take a methodical, security-focused approach to all data services. Our team begins
with a comprehensive assessment of your current data landscape, develops a tailored
strategy, and implements solutions with minimal disruption to your operations.
</p>
<p className="text-white/80 mb-8">
All our processes are fully documented, and we provide detailed knowledge transfer to
ensure your team understands how to leverage the systems we implement.
</p>
<div className="bg-[#0d1324] border border-white/10 p-6 rounded-xl mb-10">
<h3 className="text-xl font-semibold text-white mb-4">Benefits of Our Data Services</h3>
<p className="text-white/80 mb-6">
Partnering with DWD Consultancy for your data needs provides numerous advantages:
</p>
<ul className="space-y-3">
{benefits.map((benefit, index) => (
<li key={index} className="flex items-start">
<CheckCircle className="mr-3 text-netbirdOrange h-5 w-5 mt-1 flex-shrink-0" />
<span className="text-white/80">{benefit}</span>
</li>
))}
</ul>
</div>
<Link href="/contact">
<Button className="bg-netbirdOrange hover:bg-netbirdOrange/90 text-white">
Discuss Your Data Needs
<ArrowRight className="ml-2 h-4 w-4" />
</Button>
</Link>
</div>
{/* Right Column - Visual Elements */}
<div className="relative">
<div className="sticky top-32">
<div className="relative bg-[#0d1324] border border-white/10 rounded-xl p-8 shadow-xl mb-8 overflow-hidden">
{/* Decorative elements */}
<div className="absolute -top-20 -right-20 w-40 h-40 bg-netbirdOrange rounded-full blur-[60px] opacity-20"></div>
<h3 className="text-xl font-semibold text-white mb-6">Case Study: Critical Data Recovery</h3>
<p className="text-white/80 mb-6">
A manufacturing company experienced a catastrophic system failure that compromised
their production database and threatened to halt operations.
</p>
<div className="mb-6">
<h4 className="text-white font-medium mb-2">The Challenge</h4>
<p className="text-white/70 text-sm mb-4">
The company's database had become corrupted, and their backup system had not been
properly maintained. They faced weeks of downtime and potential loss of customer orders.
</p>
<h4 className="text-white font-medium mb-2">Our Solution</h4>
<p className="text-white/70 text-sm mb-4">
Our data recovery team worked around the clock to recover the corrupted database,
reconstructing missing data using forensic techniques and partial backups.
</p>
<h4 className="text-white font-medium mb-2">The Results</h4>
<p className="text-white/70 text-sm">
We recovered 99.7% of the critical data within 48 hours, allowing operations to
resume with minimal disruption. We also implemented a robust backup strategy to
prevent future incidents.
</p>
</div>
<div className="p-4 bg-white/5 border border-white/10 rounded-lg">
<div className="flex items-center">
<div className="mr-4 p-3 bg-[#1c2640] rounded-full">
<History className="h-6 w-6 text-netbirdOrange" />
</div>
<div>
<h4 className="text-white font-medium">Concerned about data loss?</h4>
<p className="text-white/70 text-sm">
Request a free data resilience assessment for your organization.
</p>
</div>
</div>
</div>
</div>
<div className="bg-[#0d1324] border border-white/10 rounded-xl p-6 shadow-xl">
<h3 className="text-xl font-semibold text-white mb-4">Our Data Process</h3>
<div className="space-y-6">
<div className="flex">
<div className="mr-4 flex flex-col items-center">
<div className="w-8 h-8 bg-[#1c2640] rounded-full flex items-center justify-center border border-netbirdOrange/30 text-white font-medium">1</div>
<div className="w-0.5 h-full bg-white/10 my-2 flex-grow"></div>
</div>
<div>
<h4 className="text-white font-medium mb-2">Assessment</h4>
<p className="text-white/70 text-sm">
We evaluate your current data infrastructure, identify vulnerabilities,
and understand your business requirements.
</p>
</div>
</div>
<div className="flex">
<div className="mr-4 flex flex-col items-center">
<div className="w-8 h-8 bg-[#1c2640] rounded-full flex items-center justify-center border border-netbirdOrange/30 text-white font-medium">2</div>
<div className="w-0.5 h-full bg-white/10 my-2 flex-grow"></div>
</div>
<div>
<h4 className="text-white font-medium mb-2">Strategy Development</h4>
<p className="text-white/70 text-sm">
Our team designs a tailored approach that addresses your specific data needs
and challenges.
</p>
</div>
</div>
<div className="flex">
<div className="mr-4 flex flex-col items-center">
<div className="w-8 h-8 bg-[#1c2640] rounded-full flex items-center justify-center border border-netbirdOrange/30 text-white font-medium">3</div>
<div className="w-0.5 h-full bg-white/10 my-2 flex-grow"></div>
</div>
<div>
<h4 className="text-white font-medium mb-2">Implementation</h4>
<p className="text-white/70 text-sm">
We execute the data services with minimal disruption to your operations,
following industry best practices.
</p>
</div>
</div>
<div className="flex">
<div className="mr-4 flex flex-col items-center">
<div className="w-8 h-8 bg-[#1c2640] rounded-full flex items-center justify-center border border-netbirdOrange/30 text-white font-medium">4</div>
</div>
<div>
<h4 className="text-white font-medium mb-2">Verification & Ongoing Support</h4>
<p className="text-white/70 text-sm">
We rigorously test all implementations and provide ongoing support to
ensure your data remains resilient and accessible.
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{/* Related Services */}
<div className="mt-20">
<h2 className="text-2xl font-bold text-white mb-8">Related Services</h2>
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
<div className="bg-[#0d1324] border border-white/10 p-6 rounded-xl">
<h3 className="text-white font-semibold mb-3">Hardware Solutions</h3>
<p className="text-white/70 text-sm mb-4">
Ready-to-use hardware with preset software and full freedom of ownership.
</p>
<Link href="/services/hardware-solutions">
<Button variant="ghost" className="group px-0 text-white hover:text-netbirdOrange">
Learn more
<ArrowRight className="ml-2 h-4 w-4 transition-transform group-hover:translate-x-1" />
</Button>
</Link>
</div>
<div className="bg-[#0d1324] border border-white/10 p-6 rounded-xl">
<h3 className="text-white font-semibold mb-3">FOSS Support</h3>
<p className="text-white/70 text-sm mb-4">
Professional support for free and open-source software with customized development.
</p>
<Link href="/services/foss-support">
<Button variant="ghost" className="group px-0 text-white hover:text-netbirdOrange">
Learn more
<ArrowRight className="ml-2 h-4 w-4 transition-transform group-hover:translate-x-1" />
</Button>
</Link>
</div>
<div className="bg-[#0d1324] border border-white/10 p-6 rounded-xl">
<h3 className="text-white font-semibold mb-3">Custom Development</h3>
<p className="text-white/70 text-sm mb-4">
Tailored software solutions designed to meet your organization's specific needs.
</p>
<Link href="/services/custom-development">
<Button variant="ghost" className="group px-0 text-white hover:text-netbirdOrange">
Learn more
<ArrowRight className="ml-2 h-4 w-4 transition-transform group-hover:translate-x-1" />
</Button>
</Link>
</div>
</div>
</div>
</div>
</section>
</div>
);
}

View File

@ -0,0 +1,305 @@
import { Metadata } from "next";
import Link from "next/link";
import { GitMerge, Code, CheckCircle, ArrowLeft, ArrowRight, BookOpen, ShieldCheck, Wrench } from "lucide-react";
import { Button } from "@/components/ui/button";
export const metadata: Metadata = {
title: "FOSS Support | DWD Consultancy",
description: "Professional support for free and open-source software (FOSS) with customized development and integration services.",
keywords: ["FOSS support", "open source software", "Linux support", "custom development", "software integration", "open source maintenance"],
openGraph: {
title: "FOSS Support | DWD Consultancy",
description: "Professional support for free and open-source software (FOSS) with customized development and integration services.",
url: "https://dwdconsultancy.com/services/foss-support",
images: [
{
url: "/og-image-foss.jpg",
width: 1200,
height: 630,
alt: "DWD Consultancy FOSS Support",
},
],
},
};
export default function FOSSSupportPage() {
const benefits = [
"Enterprise-grade support for open-source technologies",
"Custom feature development for open-source software",
"Integration with existing business systems",
"Regular maintenance and updates",
"Security patches and vulnerability remediation",
"Performance optimization",
"Comprehensive documentation",
"Knowledge transfer and team training",
];
const offerings = [
{
title: "Linux System Support",
description: "Expert support for various Linux distributions and environments.",
icon: ShieldCheck,
},
{
title: "Custom Development",
description: "Tailored development to extend FOSS functionality for your needs.",
icon: Code,
},
{
title: "Integration Services",
description: "Seamless integration of open-source tools with your existing systems.",
icon: GitMerge,
},
{
title: "Documentation & Training",
description: "Comprehensive documentation and staff training for FOSS implementation.",
icon: BookOpen,
},
];
return (
<div className="min-h-screen">
{/* Hero Section */}
<section className="relative pt-32 pb-16 overflow-hidden">
{/* Background Pattern */}
<div className="absolute inset-0 z-0 opacity-20">
<div className="absolute -top-40 -right-40 w-80 h-80 bg-netbirdOrange rounded-full blur-[100px]" />
<div className="absolute bottom-0 right-1/3 w-60 h-60 bg-netbirdOrange/50 rounded-full blur-[100px]" />
</div>
<div className="container mx-auto relative z-10">
<div className="mb-6">
<Link href="/services" className="flex items-center text-white/70 hover:text-netbirdOrange transition-colors">
<ArrowLeft className="mr-2 h-4 w-4" />
Back to Services
</Link>
</div>
<div className="max-w-3xl">
<div className="flex items-center mb-6">
<div className="h-1 w-10 bg-netbirdOrange rounded-full mr-3"></div>
<span className="text-sm text-white/80 uppercase tracking-wider font-medium">
FOSS Support
</span>
</div>
<h1 className="text-4xl md:text-5xl font-bold mb-6 text-white leading-tight">
Professional <span className="gradient-text">Open Source</span> Support
</h1>
<p className="text-xl text-white/80 mb-8 max-w-2xl">
We provide enterprise-grade support for free and open-source software (FOSS),
with custom development capabilities to extend functionality for your specific needs.
</p>
</div>
</div>
</section>
{/* Main Content */}
<section className="py-16 relative">
<div className="container mx-auto">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-16">
{/* Left Column - Details */}
<div>
<h2 className="text-2xl md:text-3xl font-bold text-white mb-6">
Our FOSS Support Services
</h2>
<p className="text-white/80 mb-8">
Open-source software offers incredible value, flexibility, and freedom from vendor lock-in.
However, organizations often need professional support to implement, customize, and maintain
these solutions effectively. That's where we come in.
</p>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 mb-10">
{offerings.map((offering, index) => (
<div key={index} className="bg-[#0d1324] border border-white/10 p-5 rounded-xl">
<div className="w-10 h-10 bg-[#1c2640] rounded-lg flex items-center justify-center mb-4">
<offering.icon className="h-5 w-5 text-netbirdOrange" />
</div>
<h3 className="text-white font-semibold mb-2">{offering.title}</h3>
<p className="text-white/70 text-sm">{offering.description}</p>
</div>
))}
</div>
<h2 className="text-2xl md:text-3xl font-bold text-white mb-6">
Why Choose Our FOSS Support
</h2>
<p className="text-white/80 mb-6">
Our team consists of experienced developers and system administrators who are deeply
familiar with a wide range of open-source technologies. We take pride in our ability
to provide timely, effective support while respecting the principles of the open-source community.
</p>
<p className="text-white/80 mb-8">
When you work with us, you get the best of both worlds: the freedom and cost-effectiveness
of open-source software, combined with the reliability and peace of mind that comes with
professional enterprise support.
</p>
<div className="bg-[#0d1324] border border-white/10 p-6 rounded-xl mb-10">
<h3 className="text-xl font-semibold text-white mb-4">Benefits of Our FOSS Support</h3>
<p className="text-white/80 mb-6">
With our comprehensive FOSS support services, you'll gain:
</p>
<ul className="space-y-3">
{benefits.map((benefit, index) => (
<li key={index} className="flex items-start">
<CheckCircle className="mr-3 text-netbirdOrange h-5 w-5 mt-1 flex-shrink-0" />
<span className="text-white/80">{benefit}</span>
</li>
))}
</ul>
</div>
<Link href="/contact">
<Button className="bg-netbirdOrange hover:bg-netbirdOrange/90 text-white">
Discuss Your FOSS Requirements
<ArrowRight className="ml-2 h-4 w-4" />
</Button>
</Link>
</div>
{/* Right Column - Visual Elements */}
<div className="relative">
<div className="sticky top-32">
<div className="relative bg-[#0d1324] border border-white/10 rounded-xl p-8 shadow-xl mb-8 overflow-hidden">
{/* Decorative elements */}
<div className="absolute -top-20 -right-20 w-40 h-40 bg-netbirdOrange rounded-full blur-[60px] opacity-20"></div>
<h3 className="text-xl font-semibold text-white mb-6">Case Study: Healthcare Provider</h3>
<p className="text-white/80 mb-6">
A regional healthcare provider needed to implement an open-source electronic health
record (EHR) system with custom features for their specific workflows.
</p>
<div className="mb-6">
<h4 className="text-white font-medium mb-2">The Challenge</h4>
<p className="text-white/70 text-sm mb-4">
The client needed specialized features not available in the standard distribution,
along with reliable ongoing support and security compliance.
</p>
<h4 className="text-white font-medium mb-2">Our Solution</h4>
<p className="text-white/70 text-sm mb-4">
We customized the open-source EHR platform, developed additional modules for their
specific requirements, and implemented a robust support and maintenance program.
</p>
<h4 className="text-white font-medium mb-2">The Results</h4>
<p className="text-white/70 text-sm">
The healthcare provider saved over $1.2 million compared to proprietary solutions,
while gaining a system perfectly tailored to their workflows with ongoing support.
</p>
</div>
<div className="p-4 bg-white/5 border border-white/10 rounded-lg">
<div className="flex items-center">
<div className="mr-4 p-3 bg-[#1c2640] rounded-full">
<Wrench className="h-6 w-6 text-netbirdOrange" />
</div>
<div>
<h4 className="text-white font-medium">Need custom FOSS development?</h4>
<p className="text-white/70 text-sm">
Let's discuss your requirements and how we can help.
</p>
</div>
</div>
</div>
</div>
<div className="bg-[#0d1324] border border-white/10 rounded-xl p-6 shadow-xl">
<h3 className="text-xl font-semibold text-white mb-4">Technologies We Support</h3>
<div className="space-y-4">
<div>
<h4 className="text-white font-medium mb-2">Operating Systems</h4>
<div className="flex flex-wrap gap-2">
<span className="px-3 py-1 bg-[#1c2640] rounded-full text-sm text-white/90">Ubuntu</span>
<span className="px-3 py-1 bg-[#1c2640] rounded-full text-sm text-white/90">Red Hat</span>
<span className="px-3 py-1 bg-[#1c2640] rounded-full text-sm text-white/90">CentOS</span>
<span className="px-3 py-1 bg-[#1c2640] rounded-full text-sm text-white/90">Debian</span>
</div>
</div>
<div>
<h4 className="text-white font-medium mb-2">Databases</h4>
<div className="flex flex-wrap gap-2">
<span className="px-3 py-1 bg-[#1c2640] rounded-full text-sm text-white/90">PostgreSQL</span>
<span className="px-3 py-1 bg-[#1c2640] rounded-full text-sm text-white/90">MySQL</span>
<span className="px-3 py-1 bg-[#1c2640] rounded-full text-sm text-white/90">MongoDB</span>
<span className="px-3 py-1 bg-[#1c2640] rounded-full text-sm text-white/90">MariaDB</span>
</div>
</div>
<div>
<h4 className="text-white font-medium mb-2">Web Technologies</h4>
<div className="flex flex-wrap gap-2">
<span className="px-3 py-1 bg-[#1c2640] rounded-full text-sm text-white/90">Apache</span>
<span className="px-3 py-1 bg-[#1c2640] rounded-full text-sm text-white/90">Nginx</span>
<span className="px-3 py-1 bg-[#1c2640] rounded-full text-sm text-white/90">Node.js</span>
<span className="px-3 py-1 bg-[#1c2640] rounded-full text-sm text-white/90">Django</span>
</div>
</div>
<div>
<h4 className="text-white font-medium mb-2">Containerization</h4>
<div className="flex flex-wrap gap-2">
<span className="px-3 py-1 bg-[#1c2640] rounded-full text-sm text-white/90">Docker</span>
<span className="px-3 py-1 bg-[#1c2640] rounded-full text-sm text-white/90">Kubernetes</span>
<span className="px-3 py-1 bg-[#1c2640] rounded-full text-sm text-white/90">Podman</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{/* Related Services */}
<div className="mt-20">
<h2 className="text-2xl font-bold text-white mb-8">Related Services</h2>
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
<div className="bg-[#0d1324] border border-white/10 p-6 rounded-xl">
<h3 className="text-white font-semibold mb-3">Hardware Solutions</h3>
<p className="text-white/70 text-sm mb-4">
Ready-to-use hardware with preset software and full freedom of ownership.
</p>
<Link href="/services/hardware-solutions">
<Button variant="ghost" className="group px-0 text-white hover:text-netbirdOrange">
Learn more
<ArrowRight className="ml-2 h-4 w-4 transition-transform group-hover:translate-x-1" />
</Button>
</Link>
</div>
<div className="bg-[#0d1324] border border-white/10 p-6 rounded-xl">
<h3 className="text-white font-semibold mb-3">Data Services</h3>
<p className="text-white/70 text-sm mb-4">
Comprehensive data archival, migration, and recovery services to keep your information safe.
</p>
<Link href="/services/data-services">
<Button variant="ghost" className="group px-0 text-white hover:text-netbirdOrange">
Learn more
<ArrowRight className="ml-2 h-4 w-4 transition-transform group-hover:translate-x-1" />
</Button>
</Link>
</div>
<div className="bg-[#0d1324] border border-white/10 p-6 rounded-xl">
<h3 className="text-white font-semibold mb-3">Custom Development</h3>
<p className="text-white/70 text-sm mb-4">
Tailored software solutions designed to meet your organization's specific needs.
</p>
<Link href="/services/custom-development">
<Button variant="ghost" className="group px-0 text-white hover:text-netbirdOrange">
Learn more
<ArrowRight className="ml-2 h-4 w-4 transition-transform group-hover:translate-x-1" />
</Button>
</Link>
</div>
</div>
</div>
</div>
</section>
</div>
);
}

View File

@ -0,0 +1,304 @@
import { Metadata } from "next";
import Link from "next/link";
import { HardDrive, Server, CheckCircle, ArrowLeft, ArrowRight } from "lucide-react";
import { Button } from "@/components/ui/button";
export const metadata: Metadata = {
title: "Hardware Solutions | DWD Consultancy",
description: "Ready-to-use hardware with preset software, providing full freedom and ownership without any strings attached.",
keywords: ["hardware solutions", "preset software", "IT hardware", "data resilience hardware", "customized hardware", "server infrastructure"],
openGraph: {
title: "Hardware Solutions | DWD Consultancy",
description: "Ready-to-use hardware with preset software, providing full freedom and ownership without any strings attached.",
url: "https://dwdconsultancy.com/services/hardware-solutions",
images: [
{
url: "/og-image-hardware.jpg",
width: 1200,
height: 630,
alt: "DWD Consultancy Hardware Solutions",
},
],
},
};
export default function HardwareSolutionsPage() {
const benefits = [
"Full ownership with no vendor lock-in",
"Pre-configured software tailored to your needs",
"Enterprise-grade hardware with warranty",
"Seamless integration with existing systems",
"Expert installation and setup",
"Ongoing technical support",
"Scalable solutions that grow with your business",
"Cost-effective compared to cloud alternatives",
];
const offerings = [
{
title: "Server Infrastructure",
description: "High-performance servers designed for reliability and scalability.",
icon: Server,
},
{
title: "Storage Solutions",
description: "Robust storage systems for secure data archiving and quick retrieval.",
icon: HardDrive,
},
{
title: "Workstation Setup",
description: "Powerful workstations optimized for productivity and performance.",
icon: Server,
},
{
title: "Network Equipment",
description: "Reliable networking gear to ensure seamless connectivity across your organization.",
icon: Server,
},
];
return (
<div className="min-h-screen">
{/* Hero Section */}
<section className="relative pt-32 pb-16 overflow-hidden">
{/* Background Pattern */}
<div className="absolute inset-0 z-0 opacity-20">
<div className="absolute -top-40 -right-40 w-80 h-80 bg-netbirdOrange rounded-full blur-[100px]" />
<div className="absolute bottom-0 right-1/3 w-60 h-60 bg-netbirdOrange/50 rounded-full blur-[100px]" />
</div>
<div className="container mx-auto relative z-10">
<div className="mb-6">
<Link href="/services" className="flex items-center text-white/70 hover:text-netbirdOrange transition-colors">
<ArrowLeft className="mr-2 h-4 w-4" />
Back to Services
</Link>
</div>
<div className="max-w-3xl">
<div className="flex items-center mb-6">
<div className="h-1 w-10 bg-netbirdOrange rounded-full mr-3"></div>
<span className="text-sm text-white/80 uppercase tracking-wider font-medium">
Hardware Solutions
</span>
</div>
<h1 className="text-4xl md:text-5xl font-bold mb-6 text-white leading-tight">
Ready-to-Use <span className="gradient-text">Hardware</span> Solutions
</h1>
<p className="text-xl text-white/80 mb-8 max-w-2xl">
We provide pre-configured hardware solutions that give you complete ownership and freedom,
with no strings attached. Our solutions are designed to keep your data resilient and secure.
</p>
</div>
</div>
</section>
{/* Main Content */}
<section className="py-16 relative">
<div className="container mx-auto">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-16">
{/* Left Column - Details */}
<div>
<h2 className="text-2xl md:text-3xl font-bold text-white mb-6">
What We Offer
</h2>
<p className="text-white/80 mb-8">
Our hardware solutions are designed to provide you with the best technology infrastructure
without the common pitfalls of vendor lock-in or hidden costs. We believe in giving you
complete control over your hardware, while still providing expert support when you need it.
</p>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 mb-10">
{offerings.map((offering, index) => (
<div key={index} className="bg-[#0d1324] border border-white/10 p-5 rounded-xl">
<div className="w-10 h-10 bg-[#1c2640] rounded-lg flex items-center justify-center mb-4">
<offering.icon className="h-5 w-5 text-netbirdOrange" />
</div>
<h3 className="text-white font-semibold mb-2">{offering.title}</h3>
<p className="text-white/70 text-sm">{offering.description}</p>
</div>
))}
</div>
<h2 className="text-2xl md:text-3xl font-bold text-white mb-6">
Our Approach
</h2>
<p className="text-white/80 mb-6">
We take a consultative approach to understand your specific needs before recommending
any hardware solutions. This ensures that the technology we provide aligns perfectly
with your business requirements and budget.
</p>
<p className="text-white/80 mb-8">
After deployment, we provide comprehensive training and ongoing support to ensure
you get the maximum value from your investment.
</p>
<div className="bg-[#0d1324] border border-white/10 p-6 rounded-xl mb-10">
<h3 className="text-xl font-semibold text-white mb-4">The DWD Difference</h3>
<p className="text-white/80 mb-6">
Unlike many providers who lock you into ongoing contracts or proprietary systems,
we believe in giving you complete ownership and freedom. Our hardware solutions
come with:
</p>
<ul className="space-y-3">
{benefits.map((benefit, index) => (
<li key={index} className="flex items-start">
<CheckCircle className="mr-3 text-netbirdOrange h-5 w-5 mt-1 flex-shrink-0" />
<span className="text-white/80">{benefit}</span>
</li>
))}
</ul>
</div>
<Link href="/contact">
<Button className="bg-netbirdOrange hover:bg-netbirdOrange/90 text-white">
Request a Consultation
<ArrowRight className="ml-2 h-4 w-4" />
</Button>
</Link>
</div>
{/* Right Column - Visual Elements */}
<div className="relative">
<div className="sticky top-32">
<div className="relative bg-[#0d1324] border border-white/10 rounded-xl p-8 shadow-xl mb-8 overflow-hidden">
{/* Decorative elements */}
<div className="absolute -top-20 -right-20 w-40 h-40 bg-netbirdOrange rounded-full blur-[60px] opacity-20"></div>
<h3 className="text-xl font-semibold text-white mb-6">Case Study: Enterprise Data Center</h3>
<p className="text-white/80 mb-6">
A mid-sized financial services firm needed a secure, high-performance data center
solution that would give them complete control over their infrastructure.
</p>
<div className="mb-6">
<h4 className="text-white font-medium mb-2">The Challenge</h4>
<p className="text-white/70 text-sm mb-4">
The client was concerned about data sovereignty, security, and the escalating
costs of their cloud infrastructure as they scaled.
</p>
<h4 className="text-white font-medium mb-2">Our Solution</h4>
<p className="text-white/70 text-sm mb-4">
We designed and deployed a custom server infrastructure with pre-configured
security software and data backup systems.
</p>
<h4 className="text-white font-medium mb-2">The Results</h4>
<p className="text-white/70 text-sm">
The client reduced their operating costs by 40% over three years while gaining
complete control over their data and infrastructure.
</p>
</div>
<div className="p-4 bg-white/5 border border-white/10 rounded-lg">
<div className="flex items-center">
<div className="mr-4 p-3 bg-[#1c2640] rounded-full">
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
className="h-6 w-6 text-netbirdOrange"
>
<path d="M3 7V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v2" />
<path d="M6 9v8a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V9" />
<path d="M12 13V9" />
<path d="M3 13h18" />
</svg>
</div>
<div>
<h4 className="text-white font-medium">Ready to upgrade?</h4>
<p className="text-white/70 text-sm">
Schedule a free hardware assessment with our team.
</p>
</div>
</div>
</div>
</div>
<div className="bg-[#0d1324] border border-white/10 rounded-xl p-6 shadow-xl">
<h3 className="text-xl font-semibold text-white mb-4">FAQ</h3>
<div className="space-y-4">
<div>
<h4 className="text-white font-medium mb-1">How long does deployment typically take?</h4>
<p className="text-white/70 text-sm">
Most standard deployments are completed within 2-4 weeks, depending on the scope and complexity.
</p>
</div>
<div>
<h4 className="text-white font-medium mb-1">Do you provide warranty and support?</h4>
<p className="text-white/70 text-sm">
Yes, all our hardware comes with manufacturer warranties, and we offer various support packages.
</p>
</div>
<div>
<h4 className="text-white font-medium mb-1">Can you integrate with our existing systems?</h4>
<p className="text-white/70 text-sm">
Absolutely. We design solutions that work seamlessly with your current infrastructure.
</p>
</div>
</div>
</div>
</div>
</div>
</div>
{/* Related Services */}
<div className="mt-20">
<h2 className="text-2xl font-bold text-white mb-8">Related Services</h2>
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
<div className="bg-[#0d1324] border border-white/10 p-6 rounded-xl">
<h3 className="text-white font-semibold mb-3">FOSS Support</h3>
<p className="text-white/70 text-sm mb-4">
Professional support for free and open-source software with customized development.
</p>
<Link href="/services/foss-support">
<Button variant="ghost" className="group px-0 text-white hover:text-netbirdOrange">
Learn more
<ArrowRight className="ml-2 h-4 w-4 transition-transform group-hover:translate-x-1" />
</Button>
</Link>
</div>
<div className="bg-[#0d1324] border border-white/10 p-6 rounded-xl">
<h3 className="text-white font-semibold mb-3">Data Services</h3>
<p className="text-white/70 text-sm mb-4">
Comprehensive data archival, migration, and recovery services to keep your information safe.
</p>
<Link href="/services/data-services">
<Button variant="ghost" className="group px-0 text-white hover:text-netbirdOrange">
Learn more
<ArrowRight className="ml-2 h-4 w-4 transition-transform group-hover:translate-x-1" />
</Button>
</Link>
</div>
<div className="bg-[#0d1324] border border-white/10 p-6 rounded-xl">
<h3 className="text-white font-semibold mb-3">Custom Development</h3>
<p className="text-white/70 text-sm mb-4">
Tailored software solutions designed to meet your organization's specific needs.
</p>
<Link href="/services/custom-development">
<Button variant="ghost" className="group px-0 text-white hover:text-netbirdOrange">
Learn more
<ArrowRight className="ml-2 h-4 w-4 transition-transform group-hover:translate-x-1" />
</Button>
</Link>
</div>
</div>
</div>
</div>
</section>
</div>
);
}

View File

@ -0,0 +1,35 @@
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Services | DWD Consultancy - Data Resilience Experts",
description: "Explore our comprehensive range of services including hardware solutions, FOSS support, and data services. We help organizations keep their data resilient and secure.",
keywords: ["data services", "hardware solutions", "FOSS support", "data resilience", "data recovery", "IT consulting"],
openGraph: {
title: "Services | DWD Consultancy - Data Resilience Experts",
description: "Explore our comprehensive range of services including hardware solutions, FOSS support, and data services.",
url: "https://dwdconsultancy.com/services",
siteName: "DWD Consultancy",
images: [
{
url: "/og-image-services.jpg",
width: 1200,
height: 630,
alt: "DWD Consultancy Services",
},
],
locale: "en_US",
type: "website",
},
};
export default function ServicesLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<>
{children}
</>
);
}

143
src/app/services/page.tsx Normal file
View File

@ -0,0 +1,143 @@
import { Metadata } from "next";
import Link from "next/link";
import { HardDrive, GitMerge, Database, ArrowRight, Shield, Server, LucideIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
export const metadata: Metadata = {
title: "Our Services | DWD Consultancy",
description: "Explore our comprehensive range of services including hardware solutions, FOSS support, and data services.",
};
const ServiceCard = ({
icon: Icon,
title,
description,
slug,
}: {
icon: LucideIcon;
title: string;
description: string;
slug: string;
}) => {
return (
<Card className="bg-[#0d1324] border border-white/10 shadow-xl overflow-hidden group">
<div className="absolute -top-10 -right-10 w-20 h-20 bg-netbirdOrange/20 rounded-full blur-2xl group-hover:w-32 group-hover:h-32 transition-all duration-500"></div>
<CardHeader className="pb-2">
<div className="w-12 h-12 bg-[#1c2640] rounded-lg flex items-center justify-center mb-4">
<Icon className="h-6 w-6 text-netbirdOrange" />
</div>
<CardTitle className="text-white text-xl">{title}</CardTitle>
<CardDescription className="text-white/70">{description}</CardDescription>
</CardHeader>
<CardContent>
<Link href={`/services/${slug}`}>
<Button variant="ghost" className="group px-0 text-white hover:text-netbirdOrange">
Learn more
<ArrowRight className="ml-2 h-4 w-4 transition-transform group-hover:translate-x-1" />
</Button>
</Link>
</CardContent>
</Card>
);
};
export default function ServicesPage() {
const services = [
{
icon: HardDrive,
title: "Hardware Solutions",
description: "Ready-to-use hardware with preset software and full freedom of ownership.",
slug: "hardware-solutions",
},
{
icon: GitMerge,
title: "FOSS Support",
description: "Professional support for free and open-source software with customized development.",
slug: "foss-support",
},
{
icon: Database,
title: "Data Services",
description: "Comprehensive data archival, migration, and recovery services to keep your information safe.",
slug: "data-services",
},
{
icon: Server,
title: "Custom Development",
description: "Tailored software solutions designed to meet your organization's specific needs.",
slug: "custom-development",
},
{
icon: Shield,
title: "Security Services",
description: "Protect your data and infrastructure with our comprehensive security solutions.",
slug: "security-services",
},
];
return (
<div className="min-h-screen">
{/* Hero Section */}
<section className="relative pt-32 pb-16 overflow-hidden">
{/* Background Pattern */}
<div className="absolute inset-0 z-0 opacity-20">
<div className="absolute -top-40 -right-40 w-80 h-80 bg-netbirdOrange rounded-full blur-[100px]" />
<div className="absolute bottom-0 right-1/3 w-60 h-60 bg-netbirdOrange/50 rounded-full blur-[100px]" />
</div>
<div className="container mx-auto relative z-10">
<div className="max-w-3xl">
<div className="flex items-center mb-6">
<div className="h-1 w-10 bg-netbirdOrange rounded-full mr-3"></div>
<span className="text-sm text-white/80 uppercase tracking-wider font-medium">
Our Services
</span>
</div>
<h1 className="text-4xl md:text-5xl font-bold mb-6 text-white leading-tight">
Comprehensive <span className="gradient-text">Technology</span> Solutions
</h1>
<p className="text-xl text-white/80 mb-8 max-w-2xl">
We offer a range of services designed to keep your data secure, accessible, and resilient
against all types of failures and disruptions.
</p>
</div>
</div>
</section>
{/* Services Grid */}
<section className="py-16 relative">
<div className="container mx-auto">
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{services.map((service, index) => (
<ServiceCard
key={index}
icon={service.icon}
title={service.title}
description={service.description}
slug={service.slug}
/>
))}
</div>
<div className="mt-16 p-8 bg-[#0d1324] border border-white/10 rounded-xl">
<div className="flex flex-col md:flex-row items-center justify-between">
<div className="mb-6 md:mb-0 md:mr-8">
<h3 className="text-2xl font-bold text-white mb-3">Need a customized solution?</h3>
<p className="text-white/70">
Contact our team to discuss your specific requirements and how we can help you achieve your goals.
</p>
</div>
<Link href="/contact">
<Button className="bg-netbirdOrange hover:bg-netbirdOrange/90 text-white min-w-[160px]">
Contact Us
<ArrowRight className="ml-2 h-4 w-4" />
</Button>
</Link>
</div>
</div>
</div>
</section>
</div>
);
}

64
src/app/sitemap.ts Normal file
View File

@ -0,0 +1,64 @@
import { MetadataRoute } from 'next';
export const dynamic = 'force-static';
export default function sitemap(): MetadataRoute.Sitemap {
const baseUrl = 'https://dwdconsultancy.com';
return [
{
url: baseUrl,
lastModified: new Date(),
changeFrequency: 'monthly',
priority: 1.0,
},
{
url: `${baseUrl}/services`,
lastModified: new Date(),
changeFrequency: 'monthly',
priority: 0.9,
},
{
url: `${baseUrl}/services/hardware-solutions`,
lastModified: new Date(),
changeFrequency: 'monthly',
priority: 0.8,
},
{
url: `${baseUrl}/services/foss-support`,
lastModified: new Date(),
changeFrequency: 'monthly',
priority: 0.8,
},
{
url: `${baseUrl}/services/data-services`,
lastModified: new Date(),
changeFrequency: 'monthly',
priority: 0.8,
},
{
url: `${baseUrl}/services/custom-development`,
lastModified: new Date(),
changeFrequency: 'monthly',
priority: 0.8,
},
{
url: `${baseUrl}/services/security-services`,
lastModified: new Date(),
changeFrequency: 'monthly',
priority: 0.8,
},
{
url: `${baseUrl}/about`,
lastModified: new Date(),
changeFrequency: 'monthly',
priority: 0.7,
},
{
url: `${baseUrl}/contact`,
lastModified: new Date(),
changeFrequency: 'monthly',
priority: 0.7,
},
];
}

144
src/app/terms/page.tsx Normal file
View File

@ -0,0 +1,144 @@
import { Separator } from "@/components/ui/separator";
import { AlertTriangle } from "lucide-react";
export const metadata = {
title: "Terms of Service | DWD Consultancy",
description: "Information about our client-specific terms of service approach",
};
export default function TermsOfService() {
return (
<main className="container max-w-4xl mx-auto py-24">
<div className="mb-12 text-center">
<h1 className="text-3xl md:text-4xl font-bold mb-4 text-white">Terms of Service</h1>
<p className="text-white/70 max-w-2xl mx-auto">
Our client-specific approach to service agreements
</p>
</div>
<div className="bg-netbirdOrange/10 border border-netbirdOrange/30 rounded-lg p-6 mb-12">
<div className="flex items-start">
<AlertTriangle className="h-6 w-6 text-netbirdOrange mr-3 mt-1 flex-shrink-0" />
<div>
<h3 className="text-xl font-medium text-white mb-3">Client-Specific Terms</h3>
<p className="text-white/80">
At DWD Consultancy, we create and maintain <span className="font-bold text-white">separate terms of service for each client</span>.
This page provides general information only. Your specific terms will be provided directly as part of our service agreement.
</p>
</div>
</div>
</div>
<div className="prose prose-invert max-w-none">
<section className="mb-8">
<h2 className="text-2xl font-semibold text-white mb-4">Our Approach to Terms of Service</h2>
<p className="text-white/80 mb-4">
Unlike standard online services that use generic terms of service, DWD Consultancy develops
customized service agreements tailored to each client's specific needs, circumstances, and projects.
</p>
<p className="text-white/80">
We believe that a personalized approach to business relationships leads to clearer expectations,
better protection for both parties, and ultimately a more successful partnership.
</p>
</section>
<Separator className="my-8 bg-white/10" />
<section className="mb-8">
<h2 className="text-2xl font-semibold text-white mb-4">What to Expect</h2>
<p className="text-white/80 mb-4">
When you engage our services, we will provide you with a detailed service agreement that includes:
</p>
<ul className="list-disc pl-6 text-white/80 space-y-2">
<li>Specific scope of work tailored to your project</li>
<li>Customized terms regarding data handling and security protocols</li>
<li>Project-specific deliverables, timelines, and milestones</li>
<li>Personalized payment terms and schedules</li>
<li>Tailored support and maintenance provisions</li>
<li>Client-specific confidentiality and intellectual property terms</li>
</ul>
</section>
<Separator className="my-8 bg-white/10" />
<section className="mb-8">
<h2 className="text-2xl font-semibold text-white mb-4">Our Core Principles</h2>
<p className="text-white/80 mb-4">
While each client agreement is unique, all our terms of service are guided by these core principles:
</p>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 mt-6">
<div className="bg-[#0d1324] border border-white/10 rounded-lg p-6">
<h3 className="text-xl font-medium text-white mb-3">Data Ownership & Privacy</h3>
<p className="text-white/80">
Your data remains your property. We implement FOSS-based encryption to ensure security,
and we don't collect or sell user data.
</p>
</div>
<div className="bg-[#0d1324] border border-white/10 rounded-lg p-6">
<h3 className="text-xl font-medium text-white mb-3">Transparency</h3>
<p className="text-white/80">
We provide clear documentation of all components, including third-party licenses
and open-source software used in your solution.
</p>
</div>
<div className="bg-[#0d1324] border border-white/10 rounded-lg p-6">
<h3 className="text-xl font-medium text-white mb-3">Full Ownership</h3>
<p className="text-white/80">
Upon full payment, you receive complete ownership of custom development work
done specifically for your project.
</p>
</div>
<div className="bg-[#0d1324] border border-white/10 rounded-lg p-6">
<h3 className="text-xl font-medium text-white mb-3">Fair Dispute Resolution</h3>
<p className="text-white/80">
We include reasonable processes for addressing any concerns or disputes that
may arise during our working relationship.
</p>
</div>
</div>
</section>
<Separator className="my-8 bg-white/10" />
<section>
<h2 className="text-2xl font-semibold text-white mb-4">Pre-Engagement Process</h2>
<p className="text-white/80 mb-4">
Our typical process for establishing client-specific terms:
</p>
<ol className="list-decimal pl-6 text-white/80 space-y-4">
<li>
<strong className="text-white">Initial Consultation</strong> We discuss your specific needs,
requirements, and expectations.
</li>
<li>
<strong className="text-white">Draft Agreement</strong> We prepare a customized service
agreement based on your project's specifics.
</li>
<li>
<strong className="text-white">Review & Feedback</strong> You review the terms, and we address
any questions or requests for modifications.
</li>
<li>
<strong className="text-white">Finalization</strong> Once both parties are satisfied, we finalize
and sign the agreement before commencing work.
</li>
</ol>
<div className="bg-netbirdOrange/10 border border-netbirdOrange/30 rounded-lg p-6 mt-8">
<h3 className="text-xl font-medium text-white mb-3">Contact Us</h3>
<p className="text-white/80 mb-4">
To start the process of creating your customized terms of service, or if you have any questions:
</p>
<p className="text-white/80">
<strong>Email:</strong> legal@dwdconsultancy.com
</p>
</div>
</section>
</div>
</main>
);
}

View File

@ -0,0 +1,158 @@
"use client";
import { Button } from "@/components/ui/button";
import { ArrowRight, CheckCircle } from "lucide-react";
const AboutSection = () => {
const values = [
{
title: "Reliability",
description: "We build resilient solutions that you can depend on, day after day."
},
{
title: "Transparency",
description: "No hidden costs or vendor lock-in. We believe in clear communication and honest pricing."
},
{
title: "Freedom",
description: "We provide solutions that give you full ownership and control over your technology."
},
{
title: "Expertise",
description: "Our team brings deep technical knowledge to solve even the most complex challenges."
}
];
return (
<section id="about" className="py-24 relative">
{/* Background Gradient */}
<div className="absolute inset-0 z-0">
<div className="absolute -top-40 left-1/4 w-80 h-80 bg-netbirdOrange rounded-full blur-[150px] opacity-10" />
<div className="absolute bottom-0 right-1/4 w-80 h-80 bg-netbirdLightBlue rounded-full blur-[150px] opacity-5" />
</div>
<div className="container mx-auto relative z-10">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
{/* Left Column - Information */}
<div>
<div className="flex items-center mb-6">
<div className="h-1 w-10 bg-netbirdOrange rounded-full mr-3"></div>
<span className="text-sm text-white/80 uppercase tracking-wider font-medium">
About Us
</span>
</div>
<h2 className="text-3xl md:text-4xl font-bold text-white mb-6">
Empowering Businesses with <span className="gradient-text">Data Resilience</span>
</h2>
<p className="text-white/80 mb-6">
At DWD Consultancy Services, we believe that technology should work for you, not the other way around.
We're dedicated to providing hardware and software solutions that give you complete freedom and ownership.
</p>
<p className="text-white/80 mb-8">
Our mission is to keep your data resilient against all forms of failures through robust hardware solutions,
professional support for open-source software, and comprehensive data services.
</p>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 mb-8">
{values.map((value, index) => (
<div key={index} className="flex items-start">
<CheckCircle className="mr-3 text-netbirdOrange h-5 w-5 mt-1 flex-shrink-0" />
<div>
<h3 className="text-white font-semibold mb-1">{value.title}</h3>
<p className="text-white/70 text-sm">{value.description}</p>
</div>
</div>
))}
</div>
<Button className="bg-netbirdOrange hover:bg-netbirdOrange/90 text-white">
Learn More About Us
<ArrowRight className="ml-2 h-4 w-4" />
</Button>
</div>
{/* Right Column - Visual */}
<div className="relative">
<div className="relative bg-[#0d1324] border border-white/10 rounded-xl p-8 shadow-xl">
<div className="absolute -top-4 -left-4 w-24 h-24 bg-netbirdDark rounded-xl border border-netbirdOrange/30 flex items-center justify-center shadow-lg">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
className="h-12 w-12 text-netbirdOrange"
>
<path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/>
</svg>
</div>
<h3 className="text-white text-xl font-semibold mb-4 mt-6">Our Approach</h3>
<p className="text-white/70 mb-6">
We take a collaborative approach to every project, working closely with you to understand your
needs and deliver solutions that exceed expectations.
</p>
<div className="space-y-4">
<div className="flex items-center">
<div className="w-12 h-2 bg-netbirdOrange rounded-full mr-4"></div>
<span className="text-white">Consultation</span>
</div>
<div className="flex items-center">
<div className="w-20 h-2 bg-netbirdOrange/80 rounded-full mr-4"></div>
<span className="text-white">Solution Design</span>
</div>
<div className="flex items-center">
<div className="w-16 h-2 bg-netbirdOrange/60 rounded-full mr-4"></div>
<span className="text-white">Implementation</span>
</div>
<div className="flex items-center">
<div className="w-24 h-2 bg-netbirdOrange/40 rounded-full mr-4"></div>
<span className="text-white">Ongoing Support</span>
</div>
</div>
<div className="mt-8 p-4 bg-white/5 border border-white/10 rounded-lg">
<div className="flex items-center">
<div className="mr-4 p-3 bg-[#1c2640] rounded-full">
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
className="h-6 w-6 text-netbirdOrange"
>
<circle cx="12" cy="12" r="10" />
<path d="m15 9-6 6" />
<path d="m9 9 6 6" />
</svg>
</div>
<div>
<h4 className="text-white font-medium">No Vendor Lock-in</h4>
<p className="text-white/70 text-sm">
We believe in giving you complete freedom and ownership of your technology.
</p>
</div>
</div>
</div>
</div>
{/* Decorative Elements */}
<div className="absolute -bottom-4 -right-4 w-40 h-40 bg-netbirdOrange/30 rounded-full blur-[60px] opacity-30"></div>
<div className="absolute top-1/2 -right-6 w-12 h-12 bg-netbirdDark border border-netbirdOrange/50 rounded-lg"></div>
<div className="absolute bottom-12 -left-6 w-8 h-8 bg-netbirdDark border border-netbirdLightBlue/50 rounded-lg"></div>
</div>
</div>
</div>
</section>
);
};
export default AboutSection;

View File

@ -0,0 +1,199 @@
"use client";
import { Button } from "@/components/ui/button";
import { Card } from "@/components/ui/card";
import { Mail, Phone, MapPin, Clock, ArrowRight, AlertCircle } from "lucide-react";
import { useState } from "react";
const ContactSection = () => {
const [formData, setFormData] = useState({
name: "",
email: "",
phone: "",
subject: "",
message: ""
});
const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>) => {
const { name, value } = e.target;
setFormData(prev => ({ ...prev, [name]: value }));
};
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
// Form submission logic would go here
console.log("Form submitted:", formData);
alert("Thanks for your message! We'll be in touch soon.");
setFormData({
name: "",
email: "",
phone: "",
subject: "",
message: ""
});
};
return (
<section id="contact" className="py-24 relative">
{/* Background Pattern */}
<div className="absolute inset-0 z-0 opacity-10">
<div
className="h-full w-full"
style={{
backgroundImage:
"linear-gradient(to right, rgba(255,255,255,0.1) 1px, transparent 1px), linear-gradient(to bottom, rgba(255,255,255,0.1) 1px, transparent 1px)",
backgroundSize: "50px 50px",
}}
/>
</div>
{/* Colored Background Elements */}
<div className="absolute inset-0 z-0">
<div className="absolute top-1/4 right-1/4 w-64 h-64 bg-netbirdOrange rounded-full blur-[100px] opacity-10" />
<div className="absolute bottom-1/3 left-1/4 w-64 h-64 bg-netbirdLightBlue rounded-full blur-[100px] opacity-5" />
</div>
<div className="container mx-auto relative z-10">
<div className="text-center mb-16">
<div className="flex items-center justify-center mb-6">
<div className="h-1 w-10 bg-netbirdOrange rounded-full mr-3"></div>
<span className="text-sm text-white/80 uppercase tracking-wider font-medium">
Get In Touch
</span>
<div className="h-1 w-10 bg-netbirdOrange rounded-full ml-3"></div>
</div>
<h2 className="text-3xl md:text-4xl font-bold text-white mb-4">
Let's Discuss Your <span className="gradient-text">Data Needs</span>
</h2>
<p className="text-white/70 max-w-2xl mx-auto">
Have questions about our services or want to discuss a project? Reach out to us and our team will get back to you as soon as possible.
</p>
</div>
<div className="max-w-3xl mx-auto">
{/* Contact Form */}
<Card className="bg-[#0d1324] border border-white/10 p-8 shadow-xl relative overflow-hidden">
<div className="absolute -top-20 -right-20 w-40 h-40 bg-netbirdOrange rounded-full blur-[60px] opacity-10"></div>
<h3 className="text-xl font-semibold text-white mb-6">Send Us a Message</h3>
<form onSubmit={handleSubmit} className="space-y-6">
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<label htmlFor="name" className="block text-white/90 mb-2 text-sm">
Your Name <span className="text-netbirdOrange">*</span>
</label>
<input
type="text"
id="name"
name="name"
value={formData.name}
onChange={handleChange}
required
className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg text-white focus:outline-none focus:border-netbirdOrange/50 focus:ring-1 focus:ring-netbirdOrange/50"
placeholder="John Doe"
/>
</div>
<div>
<label htmlFor="email" className="block text-white/90 mb-2 text-sm">
Email Address <span className="text-netbirdOrange">*</span>
</label>
<input
type="email"
id="email"
name="email"
value={formData.email}
onChange={handleChange}
required
className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg text-white focus:outline-none focus:border-netbirdOrange/50 focus:ring-1 focus:ring-netbirdOrange/50"
placeholder="john@example.com"
/>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<label htmlFor="phone" className="block text-white/90 mb-2 text-sm">
Phone Number
</label>
<input
type="tel"
id="phone"
name="phone"
value={formData.phone}
onChange={handleChange}
className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg text-white focus:outline-none focus:border-netbirdOrange/50 focus:ring-1 focus:ring-netbirdOrange/50"
placeholder="+1 (555) 123-4567"
/>
</div>
<div>
<label htmlFor="subject" className="block text-white/90 mb-2 text-sm">
Subject <span className="text-netbirdOrange">*</span>
</label>
<select
id="subject"
name="subject"
value={formData.subject}
onChange={handleChange}
required
className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg text-white focus:outline-none focus:border-netbirdOrange/50 focus:ring-1 focus:ring-netbirdOrange/50"
>
<option value="" disabled className="bg-netbirdDark">Select a subject</option>
<option value="Hardware Solutions" className="bg-netbirdDark">Hardware Solutions</option>
<option value="FOSS Support" className="bg-netbirdDark">FOSS Support</option>
<option value="Data Services" className="bg-netbirdDark">Data Services</option>
<option value="Custom Development" className="bg-netbirdDark">Custom Development</option>
<option value="Other" className="bg-netbirdDark">Other</option>
</select>
</div>
</div>
<div>
<label htmlFor="message" className="block text-white/90 mb-2 text-sm">
Your Message <span className="text-netbirdOrange">*</span>
</label>
<textarea
id="message"
name="message"
value={formData.message}
onChange={handleChange}
required
rows={5}
className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg text-white focus:outline-none focus:border-netbirdOrange/50 focus:ring-1 focus:ring-netbirdOrange/50 resize-none"
placeholder="Tell us about your project or inquiry..."
></textarea>
</div>
<div className="flex justify-end">
<Button type="submit" className="bg-netbirdOrange hover:bg-netbirdOrange/90 text-white px-8">
Send Message
<ArrowRight className="ml-2 h-4 w-4" />
</Button>
</div>
</form>
{/* Emergency Support Section - Moved to bottom of form */}
<div className="mt-8 p-4 bg-white/5 border border-white/10 rounded-lg">
<div className="flex items-start">
<AlertCircle className="h-5 w-5 text-netbirdOrange mr-3 mt-1 flex-shrink-0" />
<div>
<h4 className="text-white font-medium mb-2">Emergency Support</h4>
<p className="text-white/70 text-sm mb-3">
For urgent technical issues, our 24/7 emergency support team is available.
</p>
<Button variant="outline" className="border-netbirdOrange/50 text-netbirdOrange hover:bg-netbirdOrange/10">
Contact Emergency Support
</Button>
</div>
</div>
</div>
</Card>
</div>
</div>
</section>
);
};
export default ContactSection;

View File

@ -0,0 +1,168 @@
"use client";
import { Button } from "@/components/ui/button";
import { ArrowRight, Database, Server, Shield } from "lucide-react";
import Image from "next/image";
import { useEffect, useState } from "react";
const HeroSection = () => {
const [isVisible, setIsVisible] = useState(false);
useEffect(() => {
// Set isVisible to true after component mounts to trigger animations
setIsVisible(true);
}, []);
return (
<section className="relative overflow-hidden pt-32 pb-24 min-h-screen flex items-center">
{/* Background Pattern */}
<div className="absolute inset-0 z-0 opacity-20">
<div className="absolute -top-40 -right-40 w-80 h-80 bg-netbirdOrange rounded-full blur-[100px] animate-pulse-slow" />
<div className="absolute top-1/3 left-1/4 w-60 h-60 bg-netbirdLightBlue rounded-full blur-[100px] animate-pulse-slow" />
<div className="absolute bottom-0 right-1/3 w-60 h-60 bg-netbirdOrange/50 rounded-full blur-[100px] animate-pulse-slow" />
</div>
{/* Grid Pattern */}
<div className="absolute inset-0 z-0 opacity-10">
<div
className="h-full w-full animate-fade-in"
style={{
backgroundImage:
"linear-gradient(to right, rgba(255,255,255,0.1) 1px, transparent 1px), linear-gradient(to bottom, rgba(255,255,255,0.1) 1px, transparent 1px)",
backgroundSize: "50px 50px",
}}
/>
</div>
<div className="container mx-auto relative z-10">
{/* DWD Consultancy Header - Added this to make it more prominent */}
<div className="text-center mb-12">
<h2 className="text-3xl md:text-4xl font-bold gradient-text animate-gradient">
DWD Consultancy
</h2>
</div>
<div className="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<div>
<div className={`flex items-center mb-6 ${isVisible ? 'animate-slide-in-left' : 'opacity-0'}`}>
<div className="h-1 w-10 bg-netbirdOrange rounded-full mr-3"></div>
<span className="text-sm text-white/80 uppercase tracking-wider font-medium">
Data Consultancy
</span>
</div>
<h1 className={`text-4xl md:text-5xl lg:text-6xl font-bold mb-6 text-white leading-tight ${isVisible ? 'animate-fade-in delay-100' : 'opacity-0'}`}>
Keeping Your Data <span className="gradient-text animate-gradient">Resilient</span> and Secure
</h1>
<p className={`text-xl text-white/80 mb-8 max-w-lg ${isVisible ? 'animate-fade-in-up delay-200' : 'opacity-0'}`}>
We provide ready-to-use hardware solutions with pre-configured software,
guaranteeing full freedom and ownership without strings attached.
</p>
<div className={`flex flex-wrap gap-4 ${isVisible ? 'animate-fade-in-up delay-300' : 'opacity-0'}`}>
<Button className="bg-netbirdOrange hover:bg-netbirdOrange/90 text-white rounded-md px-8 py-6 text-lg btn-animated">
Get Started
<ArrowRight className="ml-2 h-5 w-5" />
</Button>
<Button variant="outline" className="border-white/20 text-white hover:bg-white/10 rounded-md px-8 py-6 text-lg">
Our Services
</Button>
</div>
{/* Trust Indicators */}
<div className={`flex flex-wrap gap-8 mt-12 stagger-animate ${isVisible ? 'opacity-100' : 'opacity-0'}`}>
<div className="flex items-center animate-fade-in-up delay-400">
<div className="mr-3 text-netbirdOrange">
<Shield className="h-6 w-6 animate-pulse-slow" />
</div>
<div>
<p className="text-white text-sm font-medium">Trusted by</p>
<p className="text-white/80 text-xs">100+ Companies</p>
</div>
</div>
<div className="flex items-center animate-fade-in-up delay-500">
<div className="mr-3 text-netbirdOrange">
<Server className="h-6 w-6 animate-pulse-slow" />
</div>
<div>
<p className="text-white text-sm font-medium">Custom Solutions</p>
<p className="text-white/80 text-xs">Tailored for You</p>
</div>
</div>
<div className="flex items-center animate-fade-in-up delay-600">
<div className="mr-3 text-netbirdOrange">
<Database className="h-6 w-6 animate-pulse-slow" />
</div>
<div>
<p className="text-white text-sm font-medium">Data Recovery</p>
<p className="text-white/80 text-xs">99.9% Success Rate</p>
</div>
</div>
</div>
</div>
<div className={`relative data-flow-animation ${isVisible ? 'animate-fade-in delay-300' : 'opacity-0'}`}>
<div className="bg-[#0d1324] border border-white/10 rounded-xl p-6 shadow-xl animate-float">
<div className="relative">
<div className="grid grid-cols-2 gap-8">
<div className="border border-white/10 bg-white/5 rounded-lg p-4 text-center service-card">
<div className="mx-auto w-16 h-16 bg-netbirdDark rounded-full flex items-center justify-center border border-netbirdOrange animate-glow">
<Server className="h-8 w-8 text-netbirdOrange" />
</div>
<p className="mt-3 text-white font-medium">Hardware</p>
<p className="text-white/60 text-sm">Pre-configured</p>
</div>
<div className="border border-white/10 bg-white/5 rounded-lg p-4 text-center service-card">
<div className="mx-auto w-16 h-16 bg-netbirdDark rounded-full flex items-center justify-center border border-netbirdLightBlue animate-glow">
<Shield className="h-8 w-8 text-netbirdLightBlue" />
</div>
<p className="mt-3 text-white font-medium">Data Security</p>
<p className="text-white/60 text-sm">Enterprise Grade</p>
</div>
<div className="border border-white/10 bg-white/5 rounded-lg p-4 text-center service-card">
<div className="mx-auto w-16 h-16 bg-netbirdDark rounded-full flex items-center justify-center border border-netbirdLightBlue animate-glow">
<Database className="h-8 w-8 text-netbirdLightBlue" />
</div>
<p className="mt-3 text-white font-medium">Archival</p>
<p className="text-white/60 text-sm">Long-term Storage</p>
</div>
<div className="border border-white/10 bg-white/5 rounded-lg p-4 text-center service-card">
<div className="mx-auto w-16 h-16 bg-netbirdDark rounded-full flex items-center justify-center border border-netbirdOrange animate-glow">
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
className="h-8 w-8 text-netbirdOrange"
>
<path d="m8 3 4 8 5-5 5 15H2L8 3z" />
</svg>
</div>
<p className="mt-3 text-white font-medium">Support</p>
<p className="text-white/60 text-sm">24/7 Assistance</p>
</div>
</div>
{/* Connection Lines */}
<div className="absolute inset-0 z-10 pointer-events-none">
<svg width="100%" height="100%" className="absolute inset-0">
<line x1="50%" y1="30%" x2="50%" y2="70%" stroke="#ff6b00" strokeWidth="2" strokeDasharray="5,5" className="network-lines" />
<line x1="25%" y1="50%" x2="75%" y2="50%" stroke="#64D0FF" strokeWidth="2" strokeDasharray="5,5" className="network-lines" />
</svg>
</div>
</div>
</div>
{/* Highlight Glow */}
<div className="absolute -bottom-10 -right-10 w-40 h-40 bg-netbirdOrange rounded-full blur-[60px] opacity-20 animate-pulse-slow"></div>
</div>
</div>
</div>
</section>
);
};
export default HeroSection;

View File

@ -0,0 +1,193 @@
"use client";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { HardDrive, GitMerge, Database, ArrowRight, Wrench, HelpCircle, Download, LucideIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import Link from "next/link";
const ServiceCard = ({
icon: Icon,
title,
description,
features,
href,
}: {
icon: LucideIcon;
title: string;
description: string;
features: string[];
href: string;
}) => {
return (
<Card className="bg-[#0d1324] border border-white/10 shadow-xl overflow-hidden group">
<div className="absolute -top-10 -right-10 w-20 h-20 bg-netbirdOrange/20 rounded-full blur-2xl group-hover:w-32 group-hover:h-32 transition-all duration-500"></div>
<CardHeader className="pb-2">
<div className="w-12 h-12 bg-[#1c2640] rounded-lg flex items-center justify-center mb-4">
<Icon className="h-6 w-6 text-netbirdOrange" />
</div>
<CardTitle className="text-white text-xl">{title}</CardTitle>
<CardDescription className="text-white/70">{description}</CardDescription>
</CardHeader>
<CardContent>
<ul className="space-y-2 mb-6">
{features.map((feature, index) => (
<li key={index} className="flex items-start">
<div className="mr-2 mt-1 text-netbirdOrange">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
<polyline points="20 6 9 17 4 12" />
</svg>
</div>
<span className="text-white/80 text-sm">{feature}</span>
</li>
))}
</ul>
<Link href={href}>
<Button variant="ghost" className="group px-0 text-white hover:text-netbirdOrange">
Learn more
<ArrowRight className="ml-2 h-4 w-4 transition-transform group-hover:translate-x-1" />
</Button>
</Link>
</CardContent>
</Card>
);
};
const ServicesSection = () => {
const services = [
{
icon: HardDrive,
title: "Hardware Solutions",
description: "Ready-to-use hardware with preset software",
href: "/services/hardware-solutions",
features: [
"Preconfigured systems tailored to your needs",
"Full freedom and ownership",
"No vendor lock-in or hidden costs",
"Enterprise-grade hardware with warranty"
]
},
{
icon: GitMerge,
title: "FOSS Support",
description: "Paid support for open source software",
href: "/services/foss-support",
features: [
"Professional support for free and open-source software",
"Customized development for your specific needs",
"Integration with existing systems",
"Regular maintenance and updates"
]
},
{
icon: Database,
title: "Data Services",
description: "Comprehensive data management solutions",
href: "/services/data-services",
features: [
"Secure data archival and backup solutions",
"Data migration between platforms",
"Recovery of lost or corrupted data",
"Long-term storage and retrieval systems"
]
}
];
return (
<section id="services" className="py-24 relative">
{/* Background Pattern */}
<div className="absolute inset-0 z-0 opacity-10">
<div
className="h-full w-full"
style={{
backgroundImage:
"linear-gradient(to right, rgba(255,255,255,0.1) 1px, transparent 1px), linear-gradient(to bottom, rgba(255,255,255,0.1) 1px, transparent 1px)",
backgroundSize: "50px 50px",
}}
/>
</div>
<div className="container mx-auto relative z-10">
<div className="text-center mb-16">
<div className="flex items-center justify-center mb-6">
<div className="h-1 w-10 bg-netbirdOrange rounded-full mr-3"></div>
<span className="text-sm text-white/80 uppercase tracking-wider font-medium">
Our Services
</span>
<div className="h-1 w-10 bg-netbirdOrange rounded-full ml-3"></div>
</div>
<h2 className="text-3xl md:text-4xl font-bold text-white mb-4">
Comprehensive <span className="gradient-text">Technology</span> Solutions
</h2>
<p className="text-white/70 max-w-2xl mx-auto">
We offer a range of services designed to keep your data secure, accessible, and resilient
against all types of failures and disruptions.
</p>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{services.map((service, index) => (
<ServiceCard
key={index}
icon={service.icon}
title={service.title}
description={service.description}
features={service.features}
href={service.href}
/>
))}
</div>
{/* Extra Features */}
<div className="mt-16 grid grid-cols-1 md:grid-cols-3 gap-8">
<div className="bg-[#0d1324] border border-white/10 p-6 rounded-xl flex items-start">
<div className="mr-4 p-3 bg-[#1c2640] rounded-lg">
<Wrench className="h-6 w-6 text-netbirdOrange" />
</div>
<div>
<h3 className="text-white font-semibold mb-2">Custom Development</h3>
<p className="text-white/70 text-sm">
Tailored software solutions built to your exact specifications and requirements.
</p>
</div>
</div>
<div className="bg-[#0d1324] border border-white/10 p-6 rounded-xl flex items-start">
<div className="mr-4 p-3 bg-[#1c2640] rounded-lg">
<HelpCircle className="h-6 w-6 text-netbirdOrange" />
</div>
<div>
<h3 className="text-white font-semibold mb-2">24/7 Support</h3>
<p className="text-white/70 text-sm">
Round-the-clock technical assistance from our team of experienced professionals.
</p>
</div>
</div>
<div className="bg-[#0d1324] border border-white/10 p-6 rounded-xl flex items-start">
<div className="mr-4 p-3 bg-[#1c2640] rounded-lg">
<Download className="h-6 w-6 text-netbirdOrange" />
</div>
<div>
<h3 className="text-white font-semibold mb-2">Seamless Integration</h3>
<p className="text-white/70 text-sm">
Effortless integration with your existing infrastructure and workflows.
</p>
</div>
</div>
</div>
</div>
</section>
);
};
export default ServicesSection;

View File

@ -0,0 +1,57 @@
import * as React from "react"
import { Slot } from "@radix-ui/react-slot"
import { cva, type VariantProps } from "class-variance-authority"
import { cn } from "@/lib/utils"
const buttonVariants = cva(
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
{
variants: {
variant: {
default:
"bg-primary text-primary-foreground shadow hover:bg-primary/90",
destructive:
"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
outline:
"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
secondary:
"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
ghost: "hover:bg-accent hover:text-accent-foreground",
link: "text-primary underline-offset-4 hover:underline",
},
size: {
default: "h-9 px-4 py-2",
sm: "h-8 rounded-md px-3 text-xs",
lg: "h-10 rounded-md px-8",
icon: "h-9 w-9",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
}
)
export interface ButtonProps
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
VariantProps<typeof buttonVariants> {
asChild?: boolean
}
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
({ className, variant, size, asChild = false, ...props }, ref) => {
const Comp = asChild ? Slot : "button"
return (
<Comp
className={cn(buttonVariants({ variant, size, className }))}
ref={ref}
{...props}
/>
)
}
)
Button.displayName = "Button"
export { Button, buttonVariants }

View File

@ -0,0 +1,76 @@
import * as React from "react"
import { cn } from "@/lib/utils"
const Card = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn(
"rounded-xl border bg-card text-card-foreground shadow",
className
)}
{...props}
/>
))
Card.displayName = "Card"
const CardHeader = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn("flex flex-col space-y-1.5 p-6", className)}
{...props}
/>
))
CardHeader.displayName = "CardHeader"
const CardTitle = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn("font-semibold leading-none tracking-tight", className)}
{...props}
/>
))
CardTitle.displayName = "CardTitle"
const CardDescription = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn("text-sm text-muted-foreground", className)}
{...props}
/>
))
CardDescription.displayName = "CardDescription"
const CardContent = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div ref={ref} className={cn("p-6 pt-0", className)} {...props} />
))
CardContent.displayName = "CardContent"
const CardFooter = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn("flex items-center p-6 pt-0", className)}
{...props}
/>
))
CardFooter.displayName = "CardFooter"
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }

View File

@ -0,0 +1,122 @@
"use client"
import * as React from "react"
import * as DialogPrimitive from "@radix-ui/react-dialog"
import { X } from "lucide-react"
import { cn } from "@/lib/utils"
const Dialog = DialogPrimitive.Root
const DialogTrigger = DialogPrimitive.Trigger
const DialogPortal = DialogPrimitive.Portal
const DialogClose = DialogPrimitive.Close
const DialogOverlay = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Overlay>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
>(({ className, ...props }, ref) => (
<DialogPrimitive.Overlay
ref={ref}
className={cn(
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
className
)}
{...props}
/>
))
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
const DialogContent = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>
>(({ className, children, ...props }, ref) => (
<DialogPortal>
<DialogOverlay />
<DialogPrimitive.Content
ref={ref}
className={cn(
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
className
)}
{...props}
>
{children}
<DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
<X className="h-4 w-4" />
<span className="sr-only">Close</span>
</DialogPrimitive.Close>
</DialogPrimitive.Content>
</DialogPortal>
))
DialogContent.displayName = DialogPrimitive.Content.displayName
const DialogHeader = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col space-y-1.5 text-center sm:text-left",
className
)}
{...props}
/>
)
DialogHeader.displayName = "DialogHeader"
const DialogFooter = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
className
)}
{...props}
/>
)
DialogFooter.displayName = "DialogFooter"
const DialogTitle = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Title>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>
>(({ className, ...props }, ref) => (
<DialogPrimitive.Title
ref={ref}
className={cn(
"text-lg font-semibold leading-none tracking-tight",
className
)}
{...props}
/>
))
DialogTitle.displayName = DialogPrimitive.Title.displayName
const DialogDescription = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Description>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>
>(({ className, ...props }, ref) => (
<DialogPrimitive.Description
ref={ref}
className={cn("text-sm text-muted-foreground", className)}
{...props}
/>
))
DialogDescription.displayName = DialogPrimitive.Description.displayName
export {
Dialog,
DialogPortal,
DialogOverlay,
DialogTrigger,
DialogClose,
DialogContent,
DialogHeader,
DialogFooter,
DialogTitle,
DialogDescription,
}

View File

@ -0,0 +1,120 @@
"use client";
import Link from "next/link";
import { Facebook, Twitter, Instagram, Linkedin, Mail, Phone, MapPin, Shield } from "lucide-react";
const Footer = () => {
const currentYear = new Date().getFullYear();
return (
<footer className="bg-[#0a101f] pt-16 pb-8 text-white/80">
<div className="container mx-auto">
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
{/* Company Info */}
<div>
<h3 className="text-2xl font-bold mb-6 text-white">
<span className="text-netbirdOrange">DWD</span> Consultancy
</h3>
<p className="mb-6">
Keeping your data resilient. We provide top-tier technology solutions with full freedom and ownership.
</p>
<div className="flex gap-4">
<Link href="#" className="text-white/70 hover:text-netbirdOrange transition-colors">
<Facebook size={20} />
</Link>
<Link href="#" className="text-white/70 hover:text-netbirdOrange transition-colors">
<Twitter size={20} />
</Link>
<Link href="#" className="text-white/70 hover:text-netbirdOrange transition-colors">
<Instagram size={20} />
</Link>
<Link href="#" className="text-white/70 hover:text-netbirdOrange transition-colors">
<Linkedin size={20} />
</Link>
</div>
</div>
{/* Quick Links */}
<div>
<h4 className="text-lg font-semibold mb-6 text-white">Quick Links</h4>
<ul className="space-y-3">
<li>
<Link href="/" className="text-white/70 hover:text-netbirdOrange transition-colors">Home</Link>
</li>
<li>
<Link href="/services" className="text-white/70 hover:text-netbirdOrange transition-colors">Services</Link>
</li>
<li>
<Link href="#about" className="text-white/70 hover:text-netbirdOrange transition-colors">About Us</Link>
</li>
<li>
<Link href="#testimonials" className="text-white/70 hover:text-netbirdOrange transition-colors">Testimonials</Link>
</li>
<li>
<Link href="#contact" className="text-white/70 hover:text-netbirdOrange transition-colors">Contact</Link>
</li>
</ul>
</div>
{/* Services */}
<div>
<h4 className="text-lg font-semibold mb-6 text-white">Our Services</h4>
<ul className="space-y-3">
<li>
<Link href="/services/hardware-solutions" className="text-white/70 hover:text-netbirdOrange transition-colors">Hardware Solutions</Link>
</li>
<li>
<Link href="/services/foss-support" className="text-white/70 hover:text-netbirdOrange transition-colors">FOSS Support</Link>
</li>
<li>
<Link href="/services" className="text-white/70 hover:text-netbirdOrange transition-colors">Custom Development</Link>
</li>
<li>
<Link href="/services/data-services" className="text-white/70 hover:text-netbirdOrange transition-colors">Data Archival</Link>
</li>
<li>
<Link href="/services/data-services" className="text-white/70 hover:text-netbirdOrange transition-colors">Data Recovery</Link>
</li>
</ul>
</div>
{/* Contact Info */}
<div>
<h4 className="text-lg font-semibold mb-6 text-white">Contact Us</h4>
<ul className="space-y-4">
<li className="flex items-start gap-3">
<MapPin size={20} className="text-netbirdOrange mt-1 flex-shrink-0" />
<span>123 Business Avenue, Tech District, City, Country</span>
</li>
<li className="flex items-center gap-3">
<Phone size={20} className="text-netbirdOrange flex-shrink-0" />
<span>+1 (555) 123-4567</span>
</li>
<li className="flex items-center gap-3">
<Mail size={20} className="text-netbirdOrange flex-shrink-0" />
<span>info@dwdconsultancy.com</span>
</li>
<li className="flex items-start gap-3 mt-4">
<Shield size={20} className="text-netbirdOrange mt-1 flex-shrink-0" />
<span className="text-sm">Your data is secure with our FOSS-based encryption</span>
</li>
</ul>
</div>
</div>
<div className="border-t border-white/10 mt-12 pt-8">
<div className="flex flex-col md:flex-row justify-between items-center">
<p>© {currentYear} DWD Consultancy. All rights reserved.</p>
<div className="flex gap-6 mt-4 md:mt-0">
<Link href="/privacy-policy" className="text-white/70 hover:text-netbirdOrange transition-colors text-sm">Privacy Policy</Link>
<Link href="/terms" className="text-white/70 hover:text-netbirdOrange transition-colors text-sm">Terms of Service</Link>
<Link href="/cookie-policy" className="text-white/70 hover:text-netbirdOrange transition-colors text-sm">Cookie Policy</Link>
</div>
</div>
</div>
</div>
</footer>
);
};
export default Footer;

View File

@ -0,0 +1,29 @@
"use client"
import * as React from "react"
import * as HoverCardPrimitive from "@radix-ui/react-hover-card"
import { cn } from "@/lib/utils"
const HoverCard = HoverCardPrimitive.Root
const HoverCardTrigger = HoverCardPrimitive.Trigger
const HoverCardContent = React.forwardRef<
React.ElementRef<typeof HoverCardPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>
>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
<HoverCardPrimitive.Content
ref={ref}
align={align}
sideOffset={sideOffset}
className={cn(
"z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-hover-card-content-transform-origin]",
className
)}
{...props}
/>
))
HoverCardContent.displayName = HoverCardPrimitive.Content.displayName
export { HoverCard, HoverCardTrigger, HoverCardContent }

View File

@ -0,0 +1,234 @@
"use client";
import React, { useState, useEffect } from "react";
import Link from "next/link";
import { Button } from "./button";
import { Sheet, SheetContent, SheetTrigger, SheetTitle } from "./sheet";
import { Menu, X, ChevronDown, Database } from "lucide-react";
import { HoverCard, HoverCardContent, HoverCardTrigger } from "./hover-card";
import { usePathname } from "next/navigation";
const NavBar = () => {
const [isScrolled, setIsScrolled] = useState(false);
const [isOpen, setIsOpen] = useState(false);
const pathname = usePathname();
useEffect(() => {
const handleScroll = () => {
setIsScrolled(window.scrollY > 10);
};
window.addEventListener("scroll", handleScroll);
return () => window.removeEventListener("scroll", handleScroll);
}, []);
// For static export, we need to manually add the mobile menu toggle functionality
useEffect(() => {
const toggleButton = document.querySelector('[aria-haspopup="dialog"]');
const sheet = document.querySelector('[role="dialog"]');
if (toggleButton && sheet) {
const handleToggle = () => {
setIsOpen(!isOpen);
};
toggleButton.addEventListener('click', handleToggle);
return () => {
toggleButton.removeEventListener('click', handleToggle);
};
}
}, [isOpen]);
const navLinks = [
{ label: "Home", href: "/" },
{
label: "Services",
href: "/services",
submenu: [
{ label: "Hardware Solutions", href: "/services/hardware-solutions" },
{ label: "FOSS Support", href: "/services/foss-support" },
{ label: "Data Services", href: "/services/data-services" },
]
},
{ label: "About", href: "#about" },
{ label: "Contact", href: "#contact" },
];
const isActive = (href: string) => {
if (href === '/') {
return pathname === href;
}
return pathname?.startsWith(href);
};
const handleMenuToggle = () => {
setIsOpen(!isOpen);
};
return (
<header
className={`fixed top-0 left-0 right-0 z-50 transition-all duration-300 ${
isScrolled
? "bg-netbirdDark/90 backdrop-blur-md py-3 shadow-md"
: "bg-transparent py-5"
}`}
>
<div className="container mx-auto flex items-center justify-between">
<Link href="/" className="flex items-center">
<span className="text-2xl font-bold text-white flex items-center">
<span className="text-netbirdOrange flex items-center">
<Database className="mr-2 h-6 w-6" />
DWD
</span>
<span className="ml-2">Data Consultancy</span>
</span>
</Link>
{/* Desktop Navigation */}
<nav className="hidden md:flex items-center gap-6">
{navLinks.map((link, index) => (
link.submenu ? (
<HoverCard key={index} openDelay={0} closeDelay={100}>
<HoverCardTrigger asChild>
<div className="relative group">
<Link
href={link.href}
className={`text-sm flex items-center gap-1 ${
isActive(link.href)
? "text-netbirdOrange"
: "text-white/80 hover:text-netbirdOrange transition-colors"
}`}
>
{link.label}
<ChevronDown className="h-4 w-4" />
</Link>
</div>
</HoverCardTrigger>
<HoverCardContent
className="w-64 bg-[#0d1324] border border-white/10 p-0 shadow-xl"
>
<div className="flex flex-col py-2">
{link.submenu.map((sublink, subIndex) => (
<Link
key={subIndex}
href={sublink.href}
className={`text-sm px-4 py-2 hover:bg-white/5 ${
isActive(sublink.href)
? "text-netbirdOrange"
: "text-white/80 hover:text-netbirdOrange"
}`}
>
{sublink.label}
</Link>
))}
</div>
</HoverCardContent>
</HoverCard>
) : (
<Link
key={index}
href={link.href}
className={`text-sm ${
isActive(link.href)
? "text-netbirdOrange"
: "text-white/80 hover:text-netbirdOrange transition-colors"
}`}
>
{link.label}
</Link>
)
))}
<Link href="/contact">
<Button className="bg-netbirdOrange hover:bg-netbirdOrange/90 text-white">
Get Started
</Button>
</Link>
</nav>
{/* Mobile Navigation */}
<Sheet open={isOpen} onOpenChange={setIsOpen}>
<SheetTrigger asChild className="md:hidden">
<Button
variant="ghost"
size="icon"
className="text-white"
onClick={handleMenuToggle}
>
<Menu className="h-6 w-6" />
<span className="sr-only">Toggle menu</span>
</Button>
</SheetTrigger>
<SheetContent
side="right"
className="w-[300px] sm:w-[350px] max-w-full bg-netbirdDark border-netbirdDark overflow-y-auto"
>
<SheetTitle className="sr-only">Navigation Menu</SheetTitle>
<div className="flex flex-col h-full">
<div className="flex justify-between items-center py-4">
<span className="text-xl font-bold text-white flex items-center">
<span className="text-netbirdOrange flex items-center">
<Database className="mr-1 h-5 w-5" />
DWD
</span>
<span className="ml-1 text-sm">Data Consultancy</span>
</span>
<Button
variant="ghost"
size="icon"
onClick={() => setIsOpen(false)}
>
<X className="h-6 w-6 text-white" />
</Button>
</div>
<nav className="flex flex-col gap-4 mt-8">
{navLinks.map((link, index) => (
<div key={index}>
<Link
href={link.href}
className={`text-lg ${
isActive(link.href)
? "text-netbirdOrange"
: "text-white/80 hover:text-netbirdOrange"
} py-2 transition-colors flex items-center justify-between`}
onClick={() => !link.submenu && setIsOpen(false)}
>
{link.label}
{link.submenu && <ChevronDown className="h-4 w-4" />}
</Link>
{link.submenu && (
<div className="pl-4 mt-2 border-l border-white/10 space-y-2">
{link.submenu.map((sublink, subIndex) => (
<Link
key={subIndex}
href={sublink.href}
className={`block text-base ${
isActive(sublink.href)
? "text-netbirdOrange"
: "text-white/70 hover:text-netbirdOrange"
} py-1 transition-colors`}
onClick={() => setIsOpen(false)}
>
{sublink.label}
</Link>
))}
</div>
)}
</div>
))}
<Link href="/contact" onClick={() => setIsOpen(false)}>
<Button className="bg-netbirdOrange hover:bg-netbirdOrange/90 text-white mt-4 w-full">
Get Started
</Button>
</Link>
</nav>
</div>
</SheetContent>
</Sheet>
</div>
</header>
);
};
export default NavBar;

View File

@ -0,0 +1,31 @@
"use client"
import * as React from "react"
import * as SeparatorPrimitive from "@radix-ui/react-separator"
import { cn } from "@/lib/utils"
const Separator = React.forwardRef<
React.ElementRef<typeof SeparatorPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>
>(
(
{ className, orientation = "horizontal", decorative = true, ...props },
ref
) => (
<SeparatorPrimitive.Root
ref={ref}
decorative={decorative}
orientation={orientation}
className={cn(
"shrink-0 bg-border",
orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
className
)}
{...props}
/>
)
)
Separator.displayName = SeparatorPrimitive.Root.displayName
export { Separator }

140
src/components/ui/sheet.tsx Normal file
View File

@ -0,0 +1,140 @@
"use client"
import * as React from "react"
import * as SheetPrimitive from "@radix-ui/react-dialog"
import { cva, type VariantProps } from "class-variance-authority"
import { X } from "lucide-react"
import { cn } from "@/lib/utils"
const Sheet = SheetPrimitive.Root
const SheetTrigger = SheetPrimitive.Trigger
const SheetClose = SheetPrimitive.Close
const SheetPortal = SheetPrimitive.Portal
const SheetOverlay = React.forwardRef<
React.ElementRef<typeof SheetPrimitive.Overlay>,
React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>
>(({ className, ...props }, ref) => (
<SheetPrimitive.Overlay
className={cn(
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
className
)}
{...props}
ref={ref}
/>
))
SheetOverlay.displayName = SheetPrimitive.Overlay.displayName
const sheetVariants = cva(
"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out overflow-y-auto overflow-x-hidden",
{
variants: {
side: {
top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
bottom:
"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
left: "inset-y-0 left-0 h-full w-3/4 max-w-xs border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left",
right:
"inset-y-0 right-0 h-full w-3/4 max-w-xs border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right",
},
},
defaultVariants: {
side: "right",
},
}
)
interface SheetContentProps
extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,
VariantProps<typeof sheetVariants> {}
const SheetContent = React.forwardRef<
React.ElementRef<typeof SheetPrimitive.Content>,
SheetContentProps
>(({ side = "right", className, children, ...props }, ref) => (
<SheetPortal>
<SheetOverlay />
<SheetPrimitive.Content
ref={ref}
className={cn(sheetVariants({ side }), className)}
{...props}
>
<SheetPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary">
<X className="h-4 w-4" />
<span className="sr-only">Close</span>
</SheetPrimitive.Close>
{children}
</SheetPrimitive.Content>
</SheetPortal>
))
SheetContent.displayName = SheetPrimitive.Content.displayName
const SheetHeader = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col space-y-2 text-center sm:text-left",
className
)}
{...props}
/>
)
SheetHeader.displayName = "SheetHeader"
const SheetFooter = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
className
)}
{...props}
/>
)
SheetFooter.displayName = "SheetFooter"
const SheetTitle = React.forwardRef<
React.ElementRef<typeof SheetPrimitive.Title>,
React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>
>(({ className, ...props }, ref) => (
<SheetPrimitive.Title
ref={ref}
className={cn("text-lg font-semibold text-foreground", className)}
{...props}
/>
))
SheetTitle.displayName = SheetPrimitive.Title.displayName
const SheetDescription = React.forwardRef<
React.ElementRef<typeof SheetPrimitive.Description>,
React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>
>(({ className, ...props }, ref) => (
<SheetPrimitive.Description
ref={ref}
className={cn("text-sm text-muted-foreground", className)}
{...props}
/>
))
SheetDescription.displayName = SheetPrimitive.Description.displayName
export {
Sheet,
SheetPortal,
SheetOverlay,
SheetTrigger,
SheetClose,
SheetContent,
SheetHeader,
SheetFooter,
SheetTitle,
SheetDescription,
}

6
src/lib/utils.ts Normal file
View File

@ -0,0 +1,6 @@
import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}

79
tailwind.config.js Normal file
View File

@ -0,0 +1,79 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
darkMode: ["class"],
content: [
'./pages/**/*.{js,ts,jsx,tsx,mdx}',
'./components/**/*.{js,ts,jsx,tsx,mdx}',
'./app/**/*.{js,ts,jsx,tsx,mdx}',
'./src/**/*.{js,ts,jsx,tsx,mdx}',
],
theme: {
container: {
center: true,
padding: "2rem",
screens: {
"2xl": "1400px",
},
},
extend: {
colors: {
border: "hsl(var(--border))",
input: "hsl(var(--input))",
ring: "hsl(var(--ring))",
background: "hsl(var(--background))",
foreground: "hsl(var(--foreground))",
primary: {
DEFAULT: "hsl(var(--primary))",
foreground: "hsl(var(--primary-foreground))",
},
secondary: {
DEFAULT: "hsl(var(--secondary))",
foreground: "hsl(var(--secondary-foreground))",
},
destructive: {
DEFAULT: "hsl(var(--destructive))",
foreground: "hsl(var(--destructive-foreground))",
},
muted: {
DEFAULT: "hsl(var(--muted))",
foreground: "hsl(var(--muted-foreground))",
},
accent: {
DEFAULT: "hsl(var(--accent))",
foreground: "hsl(var(--accent-foreground))",
},
popover: {
DEFAULT: "hsl(var(--popover))",
foreground: "hsl(var(--popover-foreground))",
},
card: {
DEFAULT: "hsl(var(--card))",
foreground: "hsl(var(--card-foreground))",
},
netbirdDark: "#0f1729", // Dark navy background like netbird
netbirdOrange: "#ff6b00", // Orange accent color
netbirdLightBlue: "#64D0FF", // Light blue accent
},
borderRadius: {
lg: "var(--radius)",
md: "calc(var(--radius) - 2px)",
sm: "calc(var(--radius) - 4px)",
},
keyframes: {
"accordion-down": {
from: { height: 0 },
to: { height: "var(--radix-accordion-content-height)" },
},
"accordion-up": {
from: { height: "var(--radix-accordion-content-height)" },
to: { height: 0 },
},
},
animation: {
"accordion-down": "accordion-down 0.2s ease-out",
"accordion-up": "accordion-up 0.2s ease-out",
},
},
},
plugins: [require("tailwindcss-animate")],
}

79
tailwind.config.ts Normal file
View File

@ -0,0 +1,79 @@
import type { Config } from "tailwindcss";
export default {
darkMode: ["class"],
content: [
"./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
"./src/components/**/*.{js,ts,jsx,tsx,mdx}",
"./src/app/**/*.{js,ts,jsx,tsx,mdx}",
],
theme: {
extend: {
colors: {
background: 'hsl(var(--background))',
foreground: 'hsl(var(--foreground))',
card: {
DEFAULT: 'hsl(var(--card))',
foreground: 'hsl(var(--card-foreground))'
},
popover: {
DEFAULT: 'hsl(var(--popover))',
foreground: 'hsl(var(--popover-foreground))'
},
primary: {
DEFAULT: 'hsl(var(--primary))',
foreground: 'hsl(var(--primary-foreground))'
},
secondary: {
DEFAULT: 'hsl(var(--secondary))',
foreground: 'hsl(var(--secondary-foreground))'
},
muted: {
DEFAULT: 'hsl(var(--muted))',
foreground: 'hsl(var(--muted-foreground))'
},
accent: {
DEFAULT: 'hsl(var(--accent))',
foreground: 'hsl(var(--accent-foreground))'
},
destructive: {
DEFAULT: 'hsl(var(--destructive))',
foreground: 'hsl(var(--destructive-foreground))'
},
border: 'hsl(var(--border))',
input: 'hsl(var(--input))',
ring: 'hsl(var(--ring))',
chart: {
'1': 'hsl(var(--chart-1))',
'2': 'hsl(var(--chart-2))',
'3': 'hsl(var(--chart-3))',
'4': 'hsl(var(--chart-4))',
'5': 'hsl(var(--chart-5))'
}
},
borderRadius: {
lg: 'var(--radius)',
md: 'calc(var(--radius) - 2px)',
sm: 'calc(var(--radius) - 4px)'
},
container: {
center: true,
padding: {
DEFAULT: '1rem',
sm: '2rem',
lg: '4rem',
xl: '5rem',
'2xl': '6rem',
},
screens: {
sm: '640px',
md: '768px',
lg: '1024px',
xl: '1280px',
'2xl': '1536px',
},
},
}
},
plugins: [require("tailwindcss-animate")],
} satisfies Config;

41
tsconfig.json Normal file
View File

@ -0,0 +1,41 @@
{
"compilerOptions": {
"target": "ES2017",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"plugins": [
{
"name": "next"
}
],
"paths": {
"@/*": [
"./src/*"
]
}
},
"include": [
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts",
"next-env.d.ts",
"build/types/**/*.ts"
],
"exclude": [
"node_modules"
]
}

3379
yarn.lock Normal file

File diff suppressed because it is too large Load Diff