diff --git a/package-lock.json b/package-lock.json index 6a6edae9b..a3abd9ab5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,20 +21,24 @@ "@types/react-dom": "^18.3.0", "add-to-calendar-button-react": "^2.8.1", "axios": "^1.9.0", + "bootstrap": "^5.3.6", "clsx": "^2.1.1", "date-fns": "^4.1.0", "framer-motion": "^12.11.0", "google-map-react": "^2.2.1", "gsap": "^3.13.0", "lenis": "^1.3.1", + "lucide-react": "^0.511.0", "moment": "^2.30.1", "motion": "^12.12.1", "primeicons": "^7.0.0", "primereact": "^10.9.1", "react": "^18.3.1", + "react-bootstrap": "^2.10.10", "react-cookie-consent": "^9.0.0", "react-countdown": "^2.3.6", "react-dom": "^18.3.1", + "react-icons": "^5.5.0", "react-query": "^3.39.2", "react-router-dom": "^7.5.2", "react-use": "^17.6.0", @@ -60,6 +64,7 @@ "@typescript-eslint/parser": "^8.32.0", "@vitejs/plugin-react": "^4.4.1", "@vitest/coverage-v8": "^3.1.3", + "autoprefixer": "^10.4.21", "eslint": "^9.26.0", "eslint-import-resolver-typescript": "^4.3.4", "eslint-plugin-import": "^2.31.0", @@ -67,10 +72,13 @@ "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", "gh-pages": "^6.3.0", + "globals": "^16.2.0", "jsdom": "^26.1.0", + "postcss": "^8.5.3", "prettier": "^3.5.1", "react-ga": "^3.3.1", "react-test-renderer": "^18.3.1", + "tailwindcss": "^3.4.17", "vite": "^6.3.5", "vitest": "^3.1.3" } @@ -82,6 +90,19 @@ "dev": true, "license": "MIT" }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -385,6 +406,16 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", @@ -1908,6 +1939,85 @@ "node": ">=14" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.9.8", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.8.tgz", + "integrity": "sha512-lQDE/c9uTfBSDOjaZUJS8xP2jCKVk4zjQeIlCH90xaLhHDgbpCdns3xvFpJJujfj3nI4Ll9K7A+ONUBDCASOuw==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@restart/hooks": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", + "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@restart/ui": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.9.4.tgz", + "integrity": "sha512-N4C7haUc3vn4LTwVUPlkJN8Ach/+yIMvRuTVIhjilNHqegY60SGLrzud6errOMNJwSnmYFnt1J0H/k8FE3A4KA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@popperjs/core": "^2.11.8", + "@react-aria/ssr": "^3.5.0", + "@restart/hooks": "^0.5.0", + "@types/warning": "^3.0.3", + "dequal": "^2.0.3", + "dom-helpers": "^5.2.0", + "uncontrollable": "^8.0.4", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + } + }, + "node_modules/@restart/ui/node_modules/@restart/hooks": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.5.1.tgz", + "integrity": "sha512-EMoH04NHS1pbn07iLTjIjgttuqb7qu4+/EyhAx27MHpoENcB2ZdSsLTNxmKD+WEPnZigo62Qc8zjGnNxoSE/5Q==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@restart/ui/node_modules/uncontrollable": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", + "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.14.0" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.40.2", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", @@ -2353,6 +2463,15 @@ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "license": "MIT" }, + "node_modules/@swc/helpers": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, "node_modules/@testing-library/dom": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", @@ -2771,6 +2890,12 @@ "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", "license": "MIT" }, + "node_modules/@types/warning": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", + "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==", + "license": "MIT" + }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", @@ -4023,6 +4148,34 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -4248,6 +4401,44 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -4310,6 +4501,19 @@ "node": ">=0.6" } }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/body-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", @@ -4331,6 +4535,25 @@ "node": ">=18" } }, + "node_modules/bootstrap": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.6.tgz", + "integrity": "sha512-jX0GAcRzvdwISuvArXn3m7KZscWWFAf1MKBcnzaN02qWMb3jpMoUX4/qgeiGzqyIb4ojulRzs89UCUmGcFSzTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4490,6 +4713,16 @@ "node": ">=6" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/camelize": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", @@ -4563,6 +4796,31 @@ "node": ">= 16" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -4578,6 +4836,12 @@ "node": ">=8" } }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -4786,6 +5050,19 @@ "dev": true, "license": "MIT" }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/cssstyle": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.1.tgz", @@ -4992,7 +5269,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -5017,6 +5293,13 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT" }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -5039,6 +5322,13 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -6308,6 +6598,20 @@ "node": ">= 0.6" } }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/framer-motion": { "version": "12.12.1", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.12.1.tgz", @@ -6557,13 +6861,16 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", + "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -6931,6 +7238,15 @@ "node": ">= 0.4" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -6995,6 +7311,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-boolean-object": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", @@ -7659,8 +7988,6 @@ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -7882,6 +8209,26 @@ "node": ">= 0.8.0" } }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -7938,6 +8285,15 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-react": { + "version": "0.511.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.511.0.tgz", + "integrity": "sha512-VK5a2ydJ7xm8GvBeKLS9mu1pVK6ucef9780JVUjw6bAjJL/QXnd4Y0p7SPeOUMC27YhzNCZvm5d/QX0Tp3rc0w==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/lz-string": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", @@ -8173,6 +8529,18 @@ "dev": true, "license": "MIT" }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nano-css": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.6.2.tgz", @@ -8267,6 +8635,26 @@ "dev": true, "license": "MIT" }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/nwsapi": { "version": "2.2.20", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", @@ -8283,6 +8671,16 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -8670,6 +9068,26 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/pkce-challenge": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", @@ -8732,6 +9150,120 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", @@ -8839,6 +9371,19 @@ "react-is": "^16.13.1" } }, + "node_modules/prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "license": "MIT", + "dependencies": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -8944,6 +9489,37 @@ "node": ">=0.10.0" } }, + "node_modules/react-bootstrap": { + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.10.tgz", + "integrity": "sha512-gMckKUqn8aK/vCnfwoBpBVFUGT9SVQxwsYrp9yDHt0arXMamxALerliKBxr1TPbntirK/HGrUAHYbAeQTa9GHQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "@restart/hooks": "^0.4.9", + "@restart/ui": "^1.9.4", + "@types/prop-types": "^15.7.12", + "@types/react-transition-group": "^4.4.6", + "classnames": "^2.3.2", + "dom-helpers": "^5.2.1", + "invariant": "^2.2.4", + "prop-types": "^15.8.1", + "prop-types-extra": "^1.1.0", + "react-transition-group": "^4.4.5", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "@types/react": ">=16.14.8", + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-cookie-consent": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/react-cookie-consent/-/react-cookie-consent-9.0.0.tgz", @@ -9013,12 +9589,27 @@ "react": "^15.6.2 || ^16.0 || ^17 || ^18" } }, + "node_modules/react-icons": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", + "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "license": "MIT" + }, "node_modules/react-query": { "version": "3.39.3", "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", @@ -9171,6 +9762,29 @@ "react-dom": "*" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -10256,6 +10870,86 @@ "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", "license": "MIT" }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "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": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -10310,6 +11004,57 @@ "dev": true, "license": "MIT" }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/terser": { "version": "5.39.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", @@ -10340,6 +11085,29 @@ "optional": true, "peer": true }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/throttle-debounce": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", @@ -10564,6 +11332,13 @@ "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==", "license": "Unlicense" }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -10763,6 +11538,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" + } + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -10873,6 +11663,13 @@ "punycode": "^2.1.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -11143,6 +11940,15 @@ "node": ">=18" } }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/web-vitals": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", @@ -11405,8 +12211,6 @@ "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", "dev": true, "license": "ISC", - "optional": true, - "peer": true, "bin": { "yaml": "bin.mjs" }, diff --git a/package.json b/package.json index cf9dd5419..947177671 100644 --- a/package.json +++ b/package.json @@ -16,18 +16,22 @@ "axios": "^1.9.0", "clsx": "^2.1.1", "date-fns": "^4.1.0", + "bootstrap": "^5.3.6", "framer-motion": "^12.11.0", "google-map-react": "^2.2.1", "gsap": "^3.13.0", "lenis": "^1.3.1", + "lucide-react": "^0.511.0", "moment": "^2.30.1", "motion": "^12.12.1", "primeicons": "^7.0.0", "primereact": "^10.9.1", "react": "^18.3.1", + "react-bootstrap": "^2.10.10", "react-cookie-consent": "^9.0.0", "react-countdown": "^2.3.6", "react-dom": "^18.3.1", + "react-icons": "^5.5.0", "react-query": "^3.39.2", "react-router-dom": "^7.5.2", "react-use": "^17.6.0", @@ -77,6 +81,7 @@ "@typescript-eslint/parser": "^8.32.0", "@vitejs/plugin-react": "^4.4.1", "@vitest/coverage-v8": "^3.1.3", + "autoprefixer": "^10.4.21", "eslint": "^9.26.0", "eslint-import-resolver-typescript": "^4.3.4", "eslint-plugin-import": "^2.31.0", @@ -84,6 +89,9 @@ "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", "gh-pages": "^6.3.0", + "globals": "^16.2.0", + "postcss": "^8.5.3", + "tailwindcss": "^3.4.17", "jsdom": "^26.1.0", "prettier": "^3.5.1", "react-ga": "^3.3.1", diff --git a/postccs.config.js b/postccs.config.js new file mode 100644 index 000000000..2aa7205d4 --- /dev/null +++ b/postccs.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/src/App.tsx b/src/App.tsx index 405b58b0b..1a4edb5af 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -90,7 +90,6 @@ import Accommodation from "./views/Travel/Accommodation"; import Schedule from "./views/Schedule/Schedule"; import Diversity from "./views/Diversity/Diversity"; import LiveView from "./views/Talks/LiveView"; -import JobOffers from "./views/JobOffers/JobOffers"; import { HomeWrapper2024 } from "./2024/HomeWrapper2024"; import Speakers2024 from "./components/YearSpecific/Speakers/Speakers2024"; import Talks2024 from "./2024/Talks/Talks2024"; @@ -101,6 +100,7 @@ import Workshops from "./views/Workshops/Workshops"; import Schedule2024 from "./2024/Schedule/Schedule2024"; import JobOffers2024 from "./2024/JobOffers/JobOffers2024"; import MeetingDetailContainer2024 from "./2024/TalkDetail/MeetingDetailContainer2024"; +import JobOffersList from "@components/JobOffers/JobOffersList"; const StyledAppWrapper = styled.div` position: relative; @@ -209,7 +209,7 @@ const App: FC> = () => { path={ROUTE_JOB_OFFERS} element={ }> - + } /> diff --git a/src/components/JobOffers/CompanyCard.tsx b/src/components/JobOffers/CompanyCard.tsx new file mode 100644 index 000000000..98e0db635 --- /dev/null +++ b/src/components/JobOffers/CompanyCard.tsx @@ -0,0 +1,106 @@ +import React from "react"; +import { Button, Card, Col, Row } from "react-bootstrap"; +import { ExternalLink, Linkedin, Twitter } from "lucide-react"; +// @ts-expect-error some quirky +import { motion } from "framer-motion"; +// @ts-expect-error some quirky +import { Company } from "@types/jobOffers"; +import JobOfferCard from "@components/JobOffers/JobOfferCard"; + +interface CompanyCardProps { + company: Company; + index: number; +} + +const CompanyCard: React.FC = ({ company, index }) => { + const cardVariants = { + hidden: { opacity: 0, y: 50 }, + visible: (i: number) => ({ + opacity: 1, + y: 0, + transition: { + delay: i * 0.1, + duration: 0.5, + ease: "easeOut", + }, + }), + }; + + return ( + + + + + + + + +

{company.name}

+

{company.description}

+
+ {company.linkedin && ( + + + + )} + {company.twitter && ( + + + + )} +
+ + + + + + +
+
+
+ +
+ {company.offers.map((offer, offerIndex) => ( + + ))} +
+
+ ); +}; + +export default CompanyCard; diff --git a/src/components/JobOffers/CompanyOffers.tsx b/src/components/JobOffers/CompanyOffers.tsx index f67dfd8d7..32936fc80 100644 --- a/src/components/JobOffers/CompanyOffers.tsx +++ b/src/components/JobOffers/CompanyOffers.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { Color } from "../../styles/colors"; +import { Color } from "@styles/colors"; import LinkedinIcon from "../Icons/Linkedin"; import TwitterIcon from "../Icons/Twitter"; import { @@ -11,8 +11,9 @@ import { OfferLocation, OfferText, OfferTitle, -} from "../../styles/JobOffers/JobOffers.Style"; -import {CompanyProps} from "../../types/jobOffers"; +} from "@styles/JobOffers/JobOffers.Style"; +// @ts-expect-error some quirky +import { CompanyProps } from "@types/jobOffers"; const CompanyOffers: React.FC> = ({ company, diff --git a/src/components/JobOffers/JobFilters.tsx b/src/components/JobOffers/JobFilters.tsx new file mode 100644 index 000000000..698a50659 --- /dev/null +++ b/src/components/JobOffers/JobFilters.tsx @@ -0,0 +1,86 @@ +import React, { useState } from "react"; +import { Button, Col, Form, InputGroup, Row } from "react-bootstrap"; +import { Filter, MapPin, Search } from "lucide-react"; +// @ts-expect-error some quirky +import { motion } from "framer-motion"; + +interface JobFiltersProps { + onSearchChange: (value: string) => void; + onLocationChange: (value: string) => void; + onClearFilters: () => void; +} + +const JobFilters: React.FC = ({ + onSearchChange, + onLocationChange, + onClearFilters, +}) => { + const [searchTerm, setSearchTerm] = useState(""); + const [location, setLocation] = useState(""); + + const handleSearchChange = (e: React.ChangeEvent) => { + const value = e.target.value; + setSearchTerm(value); + onSearchChange(value); + }; + + const handleLocationChange = (e: React.ChangeEvent) => { + const value = e.target.value; + setLocation(value); + onLocationChange(value); + }; + + const handleClear = () => { + setSearchTerm(""); + setLocation(""); + onClearFilters(); + }; + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default JobFilters; diff --git a/src/components/JobOffers/JobOfferCard.tsx b/src/components/JobOffers/JobOfferCard.tsx new file mode 100644 index 000000000..5cbbef8c1 --- /dev/null +++ b/src/components/JobOffers/JobOfferCard.tsx @@ -0,0 +1,91 @@ +import React from "react"; +import { Badge, Button, Card, Col, Row } from "react-bootstrap"; +import { ExternalLink, MapPin } from "lucide-react"; +// @ts-expect-error some quirky +import { motion } from "framer-motion"; +// @ts-expect-error some quirky +import { Offer as JobOffer } from "@types/jobOffers"; + +interface JobOfferCardProps { + jobOffer: JobOffer; + companyName: string; + index: number; +} + +const JobOfferCard: React.FC = ({ + jobOffer, + companyName, + index, +}) => { + const cardVariants = { + hidden: { opacity: 0, y: 20 }, + visible: (i: number) => ({ + opacity: 1, + y: 0, + transition: { + delay: 0.1 + i * 0.08, + duration: 0.4, + ease: "easeOut", + }, + }), + }; + + const formatJobText = () => { + if (jobOffer.text.includes("
")) { + return
; + } + return

{jobOffer.text}

; + }; + + return ( + + + + + +

{jobOffer.title}

+
+ + {jobOffer.location} + + at {companyName} +
+
{formatJobText()}
+ + + + + + + Opens in a new tab + + +
+
+
+
+ ); +}; + +export default JobOfferCard; diff --git a/src/components/JobOffers/JobOffersList.tsx b/src/components/JobOffers/JobOffersList.tsx new file mode 100644 index 000000000..82ff43e13 --- /dev/null +++ b/src/components/JobOffers/JobOffersList.tsx @@ -0,0 +1,139 @@ +import React, { useEffect, useState } from "react"; +import { Alert, Col, Container, Row } from "react-bootstrap"; +// @ts-expect-error some quirky +import { motion } from "framer-motion"; +import { jobOffers } from "@views/JobOffers/JobsData"; +import CompanyCard from "./CompanyCard"; +import JobFilters from "./JobFilters"; +// @ts-expect-error some quirky +import { Company, Offer } from "@types/jobOffers"; + +const JobOffersList: React.FC = () => { + const [filteredCompanies, setFilteredCompanies] = + useState(jobOffers); + const [searchTerm, setSearchTerm] = useState(""); + const [selectedLocation, setSelectedLocation] = useState(""); + const [noResults, setNoResults] = useState(false); + + useEffect(() => { + let results = [...jobOffers]; + + if (searchTerm.trim() !== "") { + const term = searchTerm.toLowerCase().trim(); + + results = results + .map((company) => { + const filteredOffers = company.offers.filter( + (offer: Offer) => + offer.title.toLowerCase().includes(term) || + offer.text.toLowerCase().includes(term), + ); + + if ( + filteredOffers.length > 0 || + company.name.toLowerCase().includes(term) + ) { + return { + ...company, + offers: + filteredOffers.length > 0 ? filteredOffers : company.offers, + }; + } + + return null; + }) + .filter(Boolean) as Company[]; + } + + if (selectedLocation.trim() !== "") { + results = results + .map((company) => { + const filteredOffers = company.offers.filter( + (offer: { location: string }) => + offer.location === selectedLocation, + ); + + if (filteredOffers.length > 0) { + return { + ...company, + offers: filteredOffers, + }; + } + + return null; + }) + .filter(Boolean) as Company[]; + } + + setFilteredCompanies(results); + setNoResults(results.length === 0); + }, [searchTerm, selectedLocation]); + + const handleSearchChange = (value: string) => { + setSearchTerm(value); + }; + + const handleLocationChange = (value: string) => { + setSelectedLocation(value); + }; + + const handleClearFilters = () => { + setSearchTerm(""); + setSelectedLocation(""); + setFilteredCompanies(jobOffers); + setNoResults(false); + }; + + const containerVariants = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.1, + delayChildren: 0.3, + }, + }, + }; + + return ( + + + + +

Find Your Next Opportunity

+

+ Discover top tech jobs from these leading companies sponsoring us +

+ +
+
+ + + {noResults ? ( + + No job offers match your search criteria. Try adjusting your filters. + + ) : ( + + {filteredCompanies.map((company, index) => ( + + ))} + + )} +
+ ); +}; + +export default JobOffersList; diff --git a/src/components/Navigation/NavigationData.ts b/src/components/Navigation/NavigationData.ts index 12064a6d3..8d501cc83 100644 --- a/src/components/Navigation/NavigationData.ts +++ b/src/components/Navigation/NavigationData.ts @@ -3,11 +3,13 @@ import { ROUTE_CFP, ROUTE_CODE_OF_CONDUCT, ROUTE_HOME, + ROUTE_JOB_OFFERS, ROUTE_SPEAKERS, ROUTE_SPONSORSHIP, ROUTE_TALKS, - ROUTE_TRAVEL, ROUTE_WORKSHOPS, -} from "../../constants/routes"; + ROUTE_TRAVEL, + ROUTE_WORKSHOPS, +} from "@constants/routes"; export interface NavigationItem { id: string; @@ -21,7 +23,7 @@ export const navigationItems2025: NavigationItem[] = [ //{ id: "SCHEDULE", link: ROUTE_SCHEDULE }, { id: "Talks", link: ROUTE_TALKS }, { id: "Workshops", link: ROUTE_WORKSHOPS }, - //{ id: "JOB OFFERS", link: ROUTE_JOB_OFFERS }, + { id: "JOB OFFERS", link: ROUTE_JOB_OFFERS }, //{ id: "Communities", link: ROUTE_COMMUNITIES }, { id: "Speakers", link: ROUTE_SPEAKERS }, { id: "About Us", link: ROUTE_ABOUT_US }, diff --git a/src/data/2025.json b/src/data/2025.json index 02e7382d8..e4d44c58a 100644 --- a/src/data/2025.json +++ b/src/data/2025.json @@ -18,7 +18,7 @@ "hideSpeakers": false, "hideTalks": false, "jobOffers": { - "enabled": false + "enabled": true }, "linkedin": "https://www.linkedin.com/company/devbcn", "schedule": { diff --git a/src/index.scss b/src/index.scss index 542ce75ed..88405818a 100644 --- a/src/index.scss +++ b/src/index.scss @@ -1,6 +1,7 @@ @import '/src/styles/colors.scss'; @import "sessionize-colors"; @import "2024.scss"; +@import 'bootstrap/dist/css/bootstrap.min.css'; root { scroll-padding-top: 240px; @@ -64,4 +65,149 @@ p { .sz-session--service .sz-session__card { color: #8ec9ee; +} + +/* job Offers */ + +.card { + border: none; + border-radius: 12px; + box-shadow: var(--shadow-md); + transition: transform 0.3s ease, box-shadow 0.3s ease; + overflow: hidden; +} + +.card:hover { + transform: translateY(-5px); + box-shadow: var(--shadow-lg); +} + +.company-logo { + max-height: 80px; + object-fit: contain; +} + +.location-badge { + border-radius: 20px; + padding: 0.25rem 0.75rem; + font-size: 0.875rem; + font-weight: 500; + background-color: rgba(4, 150, 255, 0.1); + color: var(--primary); +} + +.job-title { + color: var(--secondary); + font-weight: 600; + font-size: 1.25rem; + margin-bottom: 0.5rem; +} + +.company-name { + color: var(--primary); + font-weight: 700; + font-size: 1.75rem; +} + +.section-title { + position: relative; + display: inline-block; + margin-bottom: 2rem; + margin-top: 4rem; + color: var(--secondary); + font-weight: 700; +} + +.section-title::after { + content: ''; + position: absolute; + bottom: -10px; + left: 0; + width: 60px; + height: 4px; + background-color: var(--primary); + border-radius: 2px; +} + +.job-description { + text-align: justify; +} + +.job-text { + white-space: pre-line; + text-align: left; +} + +.apply-btn { + background-color: var(--accent); + border-color: var(--accent); + color: white; + font-weight: 500; +} + +.apply-btn:hover { + background-color: var(--success); + border-color: var(--success); +} + +.social-icon { + color: var(--primary); + font-size: 1.5rem; + margin-right: 1rem; + transition: color 0.2s ease, transform 0.2s ease; +} + +.social-icon:hover { + color: var(--secondary); + transform: scale(1.1); +} + +/* Animation classes */ +.fade-in { + opacity: 0; + transform: translateY(20px); + transition: opacity 0.5s ease, transform 0.5s ease; +} + +.fade-in.active { + opacity: 1; + transform: translateY(0); +} + +/* Header styling */ +.header { + background-color: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(5px); + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); + position: sticky; + top: 0; + z-index: 1000; + padding: 1rem 0; +} + +/* Filters */ +.filters { + margin-bottom: 2rem; + padding: 1rem; + border-radius: 12px; + background-color: #f8f9fa; +} + +/* Responsive adjustments */ +@media (max-width: 768px) { + .company-logo { + max-height: 60px; + } + + .section-title { + font-size: 1.5rem; + } + + .job-title { + font-size: 1.1rem; + } + + .company-name { + font-size: 1.5rem; + } } \ No newline at end of file diff --git a/src/views/JobOffers/JobOffers.tsx b/src/views/JobOffers/JobOffers.tsx index a8aa1b7b9..8c7bd9609 100644 --- a/src/views/JobOffers/JobOffers.tsx +++ b/src/views/JobOffers/JobOffers.tsx @@ -1,23 +1,23 @@ -import { MOBILE_BREAKPOINT } from "../../constants/BreakPoints"; -import { Color } from "../../styles/colors"; +import { MOBILE_BREAKPOINT } from "@constants/BreakPoints"; +import { Color } from "@styles/colors"; import { jobOffers } from "./JobsData"; import React, { FC } from "react"; -import LessThanBlueIcon from "../../assets/images/LessThanBlueIcon.svg"; -import MoreThanBlueIcon from "../../assets/images/MoreThanBlueIcon.svg"; -import SectionWrapper from "../../components/SectionWrapper/SectionWrapper"; -import TitleSection from "../../components/SectionTitle/TitleSection"; +import LessThanBlueIcon from "@assets/images/LessThanBlueIcon.svg"; +import MoreThanBlueIcon from "@assets/images/MoreThanBlueIcon.svg"; +import SectionWrapper from "@components/SectionWrapper/SectionWrapper"; +import TitleSection from "@components/SectionTitle/TitleSection"; import { useWindowSize } from "react-use"; -import data from "../../data/2024.json"; +import data from "@data/2024.json"; import { Companies, CompanyNameLink, StyledLessIcon, StyledMoreIcon, StyledTitleContainer, -} from "../../styles/JobOffers/JobOffers.Style"; -import CompanyOffers from "../../components/JobOffers/CompanyOffers"; -import { useDocumentTitleUpdater } from "../../hooks/useDocumentTitleUpdate"; +} from "@styles/JobOffers/JobOffers.Style"; +import CompanyOffers from "@components/JobOffers/CompanyOffers"; +import { useDocumentTitleUpdater } from "@hooks/useDocumentTitleUpdate"; const NoOffersAvailable = () => (

No job offers available yet

@@ -45,7 +45,7 @@ const JobOffers: FC> = () => { color={Color.BLACK_BLUE} /> - {width > MOBILE_BREAKPOINT && } + {width > MOBILE_BREAKPOINT && } {data.jobOffers.enabled ? (
diff --git a/src/views/JobOffers/JobsData.ts b/src/views/JobOffers/JobsData.ts index c2f12940a..326c679c0 100644 --- a/src/views/JobOffers/JobsData.ts +++ b/src/views/JobOffers/JobsData.ts @@ -1,3 +1,67 @@ -import { Company } from "../../types/jobOffers"; +// @ts-expect-error some quirky +import { Company } from "@types/jobOffers"; -export const jobOffers: Company[] = []; +export const jobOffers: Company[] = [ + { + id: "7bedcb50-4a71-43a2-abff-029961262952", + description: + "Somos el motor de la transformación tecnológica del grupo CaixaBank. Desarrollamos soluciones financieras end to end con un claro objetivo: reinventar las reglas de juego a nivel tecnológico de una forma inteligente, flexible y con un impacto real en la sociedad", + linkedin: "", + twitter: "", + name: "CAIXABANK TECH", + logo: "images/sponsors/caixabank-tech.png", + url: "https://caixabanktech.com/es/", + offers: [ + { + id: "7bedcb50-4a71-43a2-abff-029961262952", + url: "https://caixabanktech.com/es/job/software-engineer-javapython/", // Removed newline + title: "Software Engineer Java+Python", + text: + "Programación y desarrollo de productos, proyectos y soluciones en el sector financiero\n" + + "Trabajo en modo Lab, con equipo multidisciplinar en metodología Agile\n" + + "Desarrollo integral de software comprendiendo todo el ciclo de vida: revisión de requerimientos, análisis de la solución, programación y pruebas, revisión del incidental y evolución", + location: "Hybrid", + }, + ], + }, + { + id: "cec41b8a-e8d9-447e-83e7-099680c76181", + url: "https://www.snowflake.com/en/uk/\n", + name: "Snowflake", + logo: "/images/sponsors/logo-snowflake.png", + description: + "Snowflake makes enterprise AI easy, efficient and trusted. More than 11,000 companies around the globe, including hundreds of the world’s largest, use Snowflake’s AI Data Cloud to share data, build applications, and power their business with AI. The era of enterprise AI is here. \n", + twitter: "https://twitter.com/SnowflakeDB", + linkedin: "https://www.linkedin.com/company/snowflake-computing", + offers: [ + { + id: "c50b1d5f-113a-4ef7-8dc5-20717ac93bc0", + text: "We’re searching for a talented Senior (Staff) Software Engineer to join us for our efforts building out the Snowflake platform with cognitive capabilities. Our team at Snowflake has responsibility for moving boundaries of NLP space to SOTA levels and coming up with new solutions in cognitive space. As our team is growing rapidly to keep up with this key responsibility alongside Snowflake’s immense growth, we need additional talent to help lead the change.\n", + title: "Senior Software Engineer for AI Poland", + location: "Hybrid", + url: "https://careers.snowflake.com/us/en/job/SNCOUSDAD8F5157E7341298158AD41DE813A7CEXTERNALENUS768DA4518F124A419487D786ECFC578C/Senior-Software-Engineer-for-AI-Poland\n", + }, + { + id: "93c2f7fd-8718-4368-983e-2e8d28fdf06c", + text: + "as a Production Software Engineer at Snowflake, you will:
" + + "* Design, lead and own significant projects with an impact felt far beyond your team.
" + + "* Contribute to the design and operation of our highly reliable, secure, scalable, and performant infrastructure
" + + "* Develop the software to grow our fleet of services and deployments
" + + "* Participate in our on-call rotation and ensure uptime of services
" + + "* Use your deep experience and problem solving skills to help investigate and fix production issues, and drive blameless incident post-mortems to document learnings and prevent recurrences
" + + "* Plan and lead complex technical projects while partnering with a wide variety of teams within the company", + url: "https://careers.snowflake.com/us/en/job/SNCOUS1B155129FA6D439B9893A51A1E6AFCA8EXTERNALENUS8C40EA83A7D34DF691A7CCB73954E02D/Production-Software-Engineer", + location: "Hybrid", + title: "PRODUCTION SOFTWARE ENGINEER", + }, + { + id: "d17366a8-6ab1-4908-aa8c-1ccc3897f97c", + title: "Engineering Manager - Query Execution Platform", + location: "Hybrid", + text: "We’re looking for an exceptional and experienced Engineering Manager to manage and grow the Snowflake query processing team in Berlin, Germany. The team is critical to Snowflake's success, responsible for building new SQL features and customer-facing functionality, developing novel query optimization and query execution techniques for industry-leading performance, and building a database system that's highly parallel, efficient and fault-tolerant.\n", + url: "https://careers.snowflake.com/us/en/job/SNCOUS3C3A05E2D0904E3BAC0402E338567595EXTERNALENUS247840B3433245CE9ADE0424A0F27290/Engineering-Manager-Query-Execution-Platform", + }, + ], + }, +]; diff --git a/src/views/sponsorship/Sponsorship.tsx b/src/views/sponsorship/Sponsorship.tsx index 2bee91a91..75385f307 100644 --- a/src/views/sponsorship/Sponsorship.tsx +++ b/src/views/sponsorship/Sponsorship.tsx @@ -23,7 +23,7 @@ import "@egjs/react-flicking/dist/flicking.css"; import Button from "@components/UI/Button"; import { gaEventTracker } from "@components/analytics/Analytics"; import { useDocumentTitleUpdater } from "@hooks/useDocumentTitleUpdate"; -import { AnimatePresence, motion, useInView } from "framer-motion"; +import { AnimatePresence, motion } from "framer-motion"; const StyledWaveContainer = styled.div` background: ${Color.DARK_BLUE}; @@ -100,7 +100,6 @@ const Sponsorship: FC> = () => { new AutoPlay({ duration: 2000, direction: "NEXT", stopOnHover: false }), ]; const sectionRef = useRef(null); - const isInView = useInView(sectionRef, { once: true, amount: 0.3 }); const listVariants = { hidden: { opacity: 0 }, visible: { @@ -268,7 +267,7 @@ const Sponsorship: FC> = () => { diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 000000000..4eb09245d --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,8 @@ +/** @type {import("tailwindcss").Config} */ +export default { + content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], + theme: { + extend: {}, + }, + plugins: [], +}; diff --git a/vite.config.ts b/vite.config.ts index 0c7ed5c39..f4029dd1a 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -49,7 +49,7 @@ export default defineConfig(({ mode }) => { server: { port: 3000, // Match CRA's default port }, - base: "/", // Set the base path for your application + base: "/", test: { globals: true, environment: "jsdom", @@ -60,5 +60,8 @@ export default defineConfig(({ mode }) => { reporter: ["text", "json", "html"], }, }, + optimizeDeps: { + exclude: ["lucide-react"], + }, }; });