From 15398b27bccec5e76ac97311a8584b8b38c61cff Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Tue, 27 May 2025 12:44:50 +0200 Subject: [PATCH 1/4] feat: add new dependencies including bootstrap, react-bootstrap, tailwindcss, and supporting libs --- package-lock.json | 822 +++++++++++++++++++- package.json | 8 + postccs.config.js | 6 + src/App.tsx | 4 +- src/components/JobOffers/CompanyCard.tsx | 110 +++ src/components/JobOffers/CompanyOffers.tsx | 7 +- src/components/JobOffers/JobFilters.tsx | 86 ++ src/components/JobOffers/JobOfferCard.tsx | 91 +++ src/components/JobOffers/JobOffersList.tsx | 138 ++++ src/components/Navigation/NavigationData.ts | 8 +- src/data/2025.json | 2 +- src/index.scss | 146 ++++ src/views/JobOffers/JobOffers.tsx | 22 +- src/views/JobOffers/JobsData.ts | 68 +- tailwind.config.js | 8 + vite.config.ts | 5 +- 16 files changed, 1499 insertions(+), 32 deletions(-) create mode 100644 postccs.config.js create mode 100644 src/components/JobOffers/CompanyCard.tsx create mode 100644 src/components/JobOffers/JobFilters.tsx create mode 100644 src/components/JobOffers/JobOfferCard.tsx create mode 100644 src/components/JobOffers/JobOffersList.tsx create mode 100644 tailwind.config.js 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..32809a13c --- /dev/null +++ b/src/components/JobOffers/CompanyCard.tsx @@ -0,0 +1,110 @@ +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 ( + + + + + + { + const target = e.target; + target.src = company.logo; + }} + /> + + +

{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..9498d9f60 --- /dev/null +++ b/src/components/JobOffers/JobOffersList.tsx @@ -0,0 +1,138 @@ +import React, { useEffect, useState } from "react"; +import { Alert, Col, Container, Row } from "react-bootstrap"; +import { motion } from "framer-motion"; +import { jobOffers } from "@views/JobOffers/JobsData"; +import CompanyCard from "./CompanyCard"; +import JobFilters from "./JobFilters"; +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..d47ae3b31 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/\n", + 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: "", + }, + { + 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/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"], + }, }; }); From 941cb2afd9162e1305f311904306af809ad3df16 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Tue, 27 May 2025 12:54:18 +0200 Subject: [PATCH 2/4] Update src/views/JobOffers/JobsData.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/views/JobOffers/JobsData.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/JobOffers/JobsData.ts b/src/views/JobOffers/JobsData.ts index d47ae3b31..6f56803aa 100644 --- a/src/views/JobOffers/JobsData.ts +++ b/src/views/JobOffers/JobsData.ts @@ -14,7 +14,7 @@ export const jobOffers: Company[] = [ offers: [ { id: "7bedcb50-4a71-43a2-abff-029961262952", - url: "https://caixabanktech.com/es/job/software-engineer-javapython/\n", + 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" + From 08e1e8ea1e47389170bf5b044c4b9bd60ed88b8b Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Tue, 27 May 2025 12:56:32 +0200 Subject: [PATCH 3/4] fix(job-offers): correct job data, remove redundant code, and fix typos --- src/components/JobOffers/CompanyCard.tsx | 4 ---- src/components/JobOffers/JobOffersList.tsx | 7 ++++--- src/views/JobOffers/JobsData.ts | 4 ++-- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/components/JobOffers/CompanyCard.tsx b/src/components/JobOffers/CompanyCard.tsx index 32809a13c..98e0db635 100644 --- a/src/components/JobOffers/CompanyCard.tsx +++ b/src/components/JobOffers/CompanyCard.tsx @@ -44,10 +44,6 @@ const CompanyCard: React.FC = ({ company, index }) => { src={company.logo} alt={`${company.name} logo`} className="company-logo" - onError={(e: { target: HTMLImageElement }) => { - const target = e.target; - target.src = company.logo; - }} /> diff --git a/src/components/JobOffers/JobOffersList.tsx b/src/components/JobOffers/JobOffersList.tsx index 9498d9f60..82ff43e13 100644 --- a/src/components/JobOffers/JobOffersList.tsx +++ b/src/components/JobOffers/JobOffersList.tsx @@ -1,9 +1,11 @@ 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 = () => { @@ -23,7 +25,7 @@ const JobOffersList: React.FC = () => { .map((company) => { const filteredOffers = company.offers.filter( (offer: Offer) => - offer.title.toLowerCase().includes(term) ?? + offer.title.toLowerCase().includes(term) || offer.text.toLowerCase().includes(term), ); @@ -115,9 +117,8 @@ const JobOffersList: React.FC = () => { onLocationChange={handleLocationChange} onClearFilters={handleClearFilters} /> - {noResults ? ( - + No job offers match your search criteria. Try adjusting your filters. ) : ( diff --git a/src/views/JobOffers/JobsData.ts b/src/views/JobOffers/JobsData.ts index 6f56803aa..326c679c0 100644 --- a/src/views/JobOffers/JobsData.ts +++ b/src/views/JobOffers/JobsData.ts @@ -44,7 +44,7 @@ export const jobOffers: Company[] = [ { id: "93c2f7fd-8718-4368-983e-2e8d28fdf06c", text: - "AS A PRODUCTION SOFTWARE ENGINEER AT SNOWFLAKE, YOU WILL:
" + + "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
" + @@ -53,7 +53,7 @@ export const jobOffers: Company[] = [ "* 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: "", + title: "PRODUCTION SOFTWARE ENGINEER", }, { id: "d17366a8-6ab1-4908-aa8c-1ccc3897f97c", From 50aea2c1eb2a4b301ff4b48bbfa751a23a8e1ac8 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Tue, 27 May 2025 13:00:59 +0200 Subject: [PATCH 4/4] refactor(sponsorship): remove unused isInView logic --- src/views/sponsorship/Sponsorship.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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> = () => {