maj
This commit is contained in:
Generated
+671
-1
@@ -8,11 +8,14 @@
|
|||||||
"name": "amado-redesign",
|
"name": "amado-redesign",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"framer-motion": "^12.34.3",
|
||||||
"react": "^19.2.0",
|
"react": "^19.2.0",
|
||||||
"react-dom": "^19.2.0"
|
"react-dom": "^19.2.0",
|
||||||
|
"react-icons": "^5.5.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/js": "^9.39.1",
|
"@eslint/js": "^9.39.1",
|
||||||
|
"@tailwindcss/postcss": "^4.2.1",
|
||||||
"@types/react": "^19.2.7",
|
"@types/react": "^19.2.7",
|
||||||
"@types/react-dom": "^19.2.3",
|
"@types/react-dom": "^19.2.3",
|
||||||
"@vitejs/plugin-react": "^5.1.1",
|
"@vitejs/plugin-react": "^5.1.1",
|
||||||
@@ -26,6 +29,19 @@
|
|||||||
"vite": "^7.3.1"
|
"vite": "^7.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"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/@babel/code-frame": {
|
"node_modules/@babel/code-frame": {
|
||||||
"version": "7.29.0",
|
"version": "7.29.0",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
|
||||||
@@ -1366,6 +1382,277 @@
|
|||||||
"win32"
|
"win32"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"node_modules/@tailwindcss/node": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@jridgewell/remapping": "^2.3.5",
|
||||||
|
"enhanced-resolve": "^5.19.0",
|
||||||
|
"jiti": "^2.6.1",
|
||||||
|
"lightningcss": "1.31.1",
|
||||||
|
"magic-string": "^0.30.21",
|
||||||
|
"source-map-js": "^1.2.1",
|
||||||
|
"tailwindcss": "4.2.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@tailwindcss/oxide": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@tailwindcss/oxide-android-arm64": "4.2.1",
|
||||||
|
"@tailwindcss/oxide-darwin-arm64": "4.2.1",
|
||||||
|
"@tailwindcss/oxide-darwin-x64": "4.2.1",
|
||||||
|
"@tailwindcss/oxide-freebsd-x64": "4.2.1",
|
||||||
|
"@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1",
|
||||||
|
"@tailwindcss/oxide-linux-arm64-gnu": "4.2.1",
|
||||||
|
"@tailwindcss/oxide-linux-arm64-musl": "4.2.1",
|
||||||
|
"@tailwindcss/oxide-linux-x64-gnu": "4.2.1",
|
||||||
|
"@tailwindcss/oxide-linux-x64-musl": "4.2.1",
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi": "4.2.1",
|
||||||
|
"@tailwindcss/oxide-win32-arm64-msvc": "4.2.1",
|
||||||
|
"@tailwindcss/oxide-win32-x64-msvc": "4.2.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@tailwindcss/oxide-android-arm64": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"android"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@tailwindcss/oxide-darwin-arm64": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@tailwindcss/oxide-darwin-x64": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@tailwindcss/oxide-freebsd-x64": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"freebsd"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==",
|
||||||
|
"cpu": [
|
||||||
|
"arm"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@tailwindcss/oxide-linux-arm64-musl": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@tailwindcss/oxide-linux-x64-musl": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@tailwindcss/oxide-wasm32-wasi": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==",
|
||||||
|
"bundleDependencies": [
|
||||||
|
"@napi-rs/wasm-runtime",
|
||||||
|
"@emnapi/core",
|
||||||
|
"@emnapi/runtime",
|
||||||
|
"@tybys/wasm-util",
|
||||||
|
"@emnapi/wasi-threads",
|
||||||
|
"tslib"
|
||||||
|
],
|
||||||
|
"cpu": [
|
||||||
|
"wasm32"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@emnapi/core": "^1.8.1",
|
||||||
|
"@emnapi/runtime": "^1.8.1",
|
||||||
|
"@emnapi/wasi-threads": "^1.1.0",
|
||||||
|
"@napi-rs/wasm-runtime": "^1.1.1",
|
||||||
|
"@tybys/wasm-util": "^0.10.1",
|
||||||
|
"tslib": "^2.8.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"win32"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@tailwindcss/oxide-win32-x64-msvc": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"win32"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@tailwindcss/postcss": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@alloc/quick-lru": "^5.2.0",
|
||||||
|
"@tailwindcss/node": "4.2.1",
|
||||||
|
"@tailwindcss/oxide": "4.2.1",
|
||||||
|
"postcss": "^8.5.6",
|
||||||
|
"tailwindcss": "4.2.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@types/babel__core": {
|
"node_modules/@types/babel__core": {
|
||||||
"version": "7.20.5",
|
"version": "7.20.5",
|
||||||
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
|
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
|
||||||
@@ -1760,6 +2047,16 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/detect-libc": {
|
||||||
|
"version": "2.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
|
||||||
|
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.5.302",
|
"version": "1.5.302",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz",
|
||||||
@@ -1767,6 +2064,20 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
|
"node_modules/enhanced-resolve": {
|
||||||
|
"version": "5.19.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz",
|
||||||
|
"integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"graceful-fs": "^4.2.4",
|
||||||
|
"tapable": "^2.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10.13.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/esbuild": {
|
"node_modules/esbuild": {
|
||||||
"version": "0.27.3",
|
"version": "0.27.3",
|
||||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz",
|
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz",
|
||||||
@@ -2120,6 +2431,33 @@
|
|||||||
"url": "https://github.com/sponsors/rawify"
|
"url": "https://github.com/sponsors/rawify"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/framer-motion": {
|
||||||
|
"version": "12.34.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.34.3.tgz",
|
||||||
|
"integrity": "sha512-v81ecyZKYO/DfpTwHivqkxSUBzvceOpoI+wLfgCgoUIKxlFKEXdg0oR9imxwXumT4SFy8vRk9xzJ5l3/Du/55Q==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"motion-dom": "^12.34.3",
|
||||||
|
"motion-utils": "^12.29.2",
|
||||||
|
"tslib": "^2.4.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@emotion/is-prop-valid": "*",
|
||||||
|
"react": "^18.0.0 || ^19.0.0",
|
||||||
|
"react-dom": "^18.0.0 || ^19.0.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@emotion/is-prop-valid": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"react": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"react-dom": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/fsevents": {
|
"node_modules/fsevents": {
|
||||||
"version": "2.3.3",
|
"version": "2.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
|
||||||
@@ -2171,6 +2509,13 @@
|
|||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/graceful-fs": {
|
||||||
|
"version": "4.2.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
||||||
|
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "ISC"
|
||||||
|
},
|
||||||
"node_modules/has-flag": {
|
"node_modules/has-flag": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
||||||
@@ -2265,6 +2610,16 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
|
"node_modules/jiti": {
|
||||||
|
"version": "2.6.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
|
||||||
|
"integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"bin": {
|
||||||
|
"jiti": "lib/jiti-cli.mjs"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/js-tokens": {
|
"node_modules/js-tokens": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
|
||||||
@@ -2356,6 +2711,267 @@
|
|||||||
"node": ">= 0.8.0"
|
"node": ">= 0.8.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/lightningcss": {
|
||||||
|
"version": "1.31.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz",
|
||||||
|
"integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MPL-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"detect-libc": "^2.0.3"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 12.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/parcel"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"lightningcss-android-arm64": "1.31.1",
|
||||||
|
"lightningcss-darwin-arm64": "1.31.1",
|
||||||
|
"lightningcss-darwin-x64": "1.31.1",
|
||||||
|
"lightningcss-freebsd-x64": "1.31.1",
|
||||||
|
"lightningcss-linux-arm-gnueabihf": "1.31.1",
|
||||||
|
"lightningcss-linux-arm64-gnu": "1.31.1",
|
||||||
|
"lightningcss-linux-arm64-musl": "1.31.1",
|
||||||
|
"lightningcss-linux-x64-gnu": "1.31.1",
|
||||||
|
"lightningcss-linux-x64-musl": "1.31.1",
|
||||||
|
"lightningcss-win32-arm64-msvc": "1.31.1",
|
||||||
|
"lightningcss-win32-x64-msvc": "1.31.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/lightningcss-android-arm64": {
|
||||||
|
"version": "1.31.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz",
|
||||||
|
"integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MPL-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"android"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 12.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/parcel"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/lightningcss-darwin-arm64": {
|
||||||
|
"version": "1.31.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz",
|
||||||
|
"integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MPL-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 12.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/parcel"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/lightningcss-darwin-x64": {
|
||||||
|
"version": "1.31.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz",
|
||||||
|
"integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MPL-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 12.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/parcel"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/lightningcss-freebsd-x64": {
|
||||||
|
"version": "1.31.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz",
|
||||||
|
"integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MPL-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"freebsd"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 12.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/parcel"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/lightningcss-linux-arm-gnueabihf": {
|
||||||
|
"version": "1.31.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz",
|
||||||
|
"integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==",
|
||||||
|
"cpu": [
|
||||||
|
"arm"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MPL-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 12.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/parcel"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/lightningcss-linux-arm64-gnu": {
|
||||||
|
"version": "1.31.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz",
|
||||||
|
"integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MPL-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 12.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/parcel"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/lightningcss-linux-arm64-musl": {
|
||||||
|
"version": "1.31.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz",
|
||||||
|
"integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MPL-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 12.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/parcel"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/lightningcss-linux-x64-gnu": {
|
||||||
|
"version": "1.31.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz",
|
||||||
|
"integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MPL-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 12.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/parcel"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/lightningcss-linux-x64-musl": {
|
||||||
|
"version": "1.31.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz",
|
||||||
|
"integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MPL-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 12.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/parcel"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/lightningcss-win32-arm64-msvc": {
|
||||||
|
"version": "1.31.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz",
|
||||||
|
"integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MPL-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"win32"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 12.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/parcel"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/lightningcss-win32-x64-msvc": {
|
||||||
|
"version": "1.31.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz",
|
||||||
|
"integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MPL-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"win32"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 12.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/parcel"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/locate-path": {
|
"node_modules/locate-path": {
|
||||||
"version": "6.0.0",
|
"version": "6.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
|
||||||
@@ -2389,6 +3005,16 @@
|
|||||||
"yallist": "^3.0.2"
|
"yallist": "^3.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/magic-string": {
|
||||||
|
"version": "0.30.21",
|
||||||
|
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
|
||||||
|
"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@jridgewell/sourcemap-codec": "^1.5.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/minimatch": {
|
"node_modules/minimatch": {
|
||||||
"version": "3.1.4",
|
"version": "3.1.4",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz",
|
||||||
@@ -2402,6 +3028,21 @@
|
|||||||
"node": "*"
|
"node": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/motion-dom": {
|
||||||
|
"version": "12.34.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.34.3.tgz",
|
||||||
|
"integrity": "sha512-sYgFe+pR9aIM7o4fhs2aXtOI+oqlUd33N9Yoxcgo1Fv7M20sRkHtCmzE/VRNIcq7uNJ+qio+Xubt1FXH3pQ+eQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"motion-utils": "^12.29.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/motion-utils": {
|
||||||
|
"version": "12.29.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.29.2.tgz",
|
||||||
|
"integrity": "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/ms": {
|
"node_modules/ms": {
|
||||||
"version": "2.1.3",
|
"version": "2.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
||||||
@@ -2622,6 +3263,15 @@
|
|||||||
"react": "^19.2.4"
|
"react": "^19.2.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"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-refresh": {
|
"node_modules/react-refresh": {
|
||||||
"version": "0.18.0",
|
"version": "0.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz",
|
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz",
|
||||||
@@ -2769,6 +3419,20 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/tapable": {
|
||||||
|
"version": "2.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
|
||||||
|
"integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/webpack"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/tinyglobby": {
|
"node_modules/tinyglobby": {
|
||||||
"version": "0.2.15",
|
"version": "0.2.15",
|
||||||
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
|
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
|
||||||
@@ -2786,6 +3450,12 @@
|
|||||||
"url": "https://github.com/sponsors/SuperchupuDev"
|
"url": "https://github.com/sponsors/SuperchupuDev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/tslib": {
|
||||||
|
"version": "2.8.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
||||||
|
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
|
||||||
|
"license": "0BSD"
|
||||||
|
},
|
||||||
"node_modules/type-check": {
|
"node_modules/type-check": {
|
||||||
"version": "0.4.0",
|
"version": "0.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
|
||||||
|
|||||||
+4
-1
@@ -10,11 +10,14 @@
|
|||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"framer-motion": "^12.34.3",
|
||||||
"react": "^19.2.0",
|
"react": "^19.2.0",
|
||||||
"react-dom": "^19.2.0"
|
"react-dom": "^19.2.0",
|
||||||
|
"react-icons": "^5.5.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/js": "^9.39.1",
|
"@eslint/js": "^9.39.1",
|
||||||
|
"@tailwindcss/postcss": "^4.2.1",
|
||||||
"@types/react": "^19.2.7",
|
"@types/react": "^19.2.7",
|
||||||
"@types/react-dom": "^19.2.3",
|
"@types/react-dom": "^19.2.3",
|
||||||
"@vitejs/plugin-react": "^5.1.1",
|
"@vitejs/plugin-react": "^5.1.1",
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
module.exports = {
|
||||||
|
plugins: {
|
||||||
|
'@tailwindcss/postcss': {},
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
|
}
|
||||||
+16
-30
@@ -1,35 +1,21 @@
|
|||||||
import { useState } from 'react'
|
import Navbar from './components/Navbar'
|
||||||
import reactLogo from './assets/react.svg'
|
import Hero from './components/Hero'
|
||||||
import viteLogo from '/vite.svg'
|
import ComparisonSection from './components/ComparisonSection'
|
||||||
import './App.css'
|
import Testimonials from './components/Testimonials'
|
||||||
|
import GuideSection from './components/GuideSection'
|
||||||
function App() {
|
import Footer from './components/Footer'
|
||||||
const [count, setCount] = useState(0)
|
|
||||||
|
|
||||||
|
export default function App() {
|
||||||
return (
|
return (
|
||||||
<>
|
<div className="min-h-screen bg-white">
|
||||||
<div>
|
<Navbar />
|
||||||
<a href="https://vite.dev" target="_blank">
|
<main>
|
||||||
<img src={viteLogo} className="logo" alt="Vite logo" />
|
<Hero />
|
||||||
</a>
|
<ComparisonSection />
|
||||||
<a href="https://react.dev" target="_blank">
|
<Testimonials />
|
||||||
<img src={reactLogo} className="logo react" alt="React logo" />
|
<GuideSection />
|
||||||
</a>
|
</main>
|
||||||
|
<Footer />
|
||||||
</div>
|
</div>
|
||||||
<h1>Vite + React</h1>
|
|
||||||
<div className="card">
|
|
||||||
<button onClick={() => setCount((count) => count + 1)}>
|
|
||||||
count is {count}
|
|
||||||
</button>
|
|
||||||
<p>
|
|
||||||
Edit <code>src/App.jsx</code> and save to test HMR
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<p className="read-the-docs">
|
|
||||||
Click on the Vite and React logos to learn more
|
|
||||||
</p>
|
|
||||||
</>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default App
|
|
||||||
|
|||||||
@@ -0,0 +1,143 @@
|
|||||||
|
import { motion } from 'framer-motion'
|
||||||
|
import { FiAward, FiArrowRight } from 'react-icons/fi'
|
||||||
|
import { mutuelles } from '../data/mutuelles'
|
||||||
|
import MutuelleCard from './MutuelleCard'
|
||||||
|
|
||||||
|
const medals = ['🏆', '🥈', '🥉']
|
||||||
|
|
||||||
|
function TopCard({ mutuelle, index }) {
|
||||||
|
const isFirst = index === 0
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={`relative flex flex-col rounded-3xl border-2 p-6 transition-all hover:shadow-xl hover:-translate-y-1 cursor-pointer ${
|
||||||
|
isFirst
|
||||||
|
? 'border-indigo-300 bg-gradient-to-b from-indigo-50 to-white shadow-lg shadow-indigo-100'
|
||||||
|
: 'border-slate-100 bg-white hover:border-slate-200 shadow-sm'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{/* Badge */}
|
||||||
|
{isFirst && (
|
||||||
|
<div className="absolute -top-3.5 left-1/2 -translate-x-1/2 bg-gradient-to-r from-indigo-600 to-indigo-700 text-white text-[11px] font-extrabold px-4 py-1.5 rounded-full shadow-md whitespace-nowrap">
|
||||||
|
⭐ Meilleur Choix 2026
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<div className="flex items-start justify-between mb-5 mt-1">
|
||||||
|
{/* Logo */}
|
||||||
|
<div
|
||||||
|
className="w-14 h-14 rounded-2xl flex items-center justify-center font-extrabold text-white text-lg shadow-md"
|
||||||
|
style={{ backgroundColor: mutuelle.primaryColor }}
|
||||||
|
>
|
||||||
|
{mutuelle.initials}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Medal + rank */}
|
||||||
|
<span className="text-2xl">{medals[index]}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="font-extrabold text-slate-900 text-base mb-0.5">{mutuelle.name}</div>
|
||||||
|
<div className="text-xs text-slate-500 mb-4">{mutuelle.tagline}</div>
|
||||||
|
|
||||||
|
{/* Tags */}
|
||||||
|
<div className="flex gap-1.5 flex-wrap mb-5">
|
||||||
|
{mutuelle.idealFor.map((tag) => (
|
||||||
|
<span
|
||||||
|
key={tag}
|
||||||
|
className="text-[11px] font-medium px-2 py-0.5 rounded-full"
|
||||||
|
style={{ backgroundColor: mutuelle.lightBg, color: mutuelle.primaryColor }}
|
||||||
|
>
|
||||||
|
{tag}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Promo */}
|
||||||
|
{mutuelle.offer && (
|
||||||
|
<div className="mb-4 bg-emerald-50 border border-emerald-200 text-emerald-700 text-xs font-bold text-center py-2 rounded-xl">
|
||||||
|
🎁 {mutuelle.offer}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* Score + CTA */}
|
||||||
|
<div className="flex items-end justify-between mt-auto pt-4 border-t border-slate-100">
|
||||||
|
<div>
|
||||||
|
<div className="text-3xl font-extrabold" style={{ color: mutuelle.primaryColor }}>
|
||||||
|
{mutuelle.score}
|
||||||
|
<span className="text-sm font-medium text-slate-400"> /10</span>
|
||||||
|
</div>
|
||||||
|
<div className="text-[10px] text-slate-400 font-medium mt-0.5">Score Mon Gaston</div>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
className="flex items-center gap-1.5 text-sm font-bold text-white px-4 py-2 rounded-xl hover:opacity-90 transition-opacity shadow-md"
|
||||||
|
style={{ backgroundColor: mutuelle.primaryColor }}
|
||||||
|
>
|
||||||
|
Voir l'offre <FiArrowRight size={13} />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function ComparisonSection() {
|
||||||
|
return (
|
||||||
|
<section id="classement" className="pt-10 pb-20 bg-white">
|
||||||
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||||
|
|
||||||
|
{/* Header */}
|
||||||
|
<div className="text-center mb-14">
|
||||||
|
<div className="inline-flex items-center gap-2 bg-amber-50 border border-amber-200 text-amber-700 text-xs font-bold px-3 py-1.5 rounded-full mb-5">
|
||||||
|
<FiAward size={13} />
|
||||||
|
Classement officiel 2026
|
||||||
|
</div>
|
||||||
|
<h2 className="text-4xl font-extrabold text-slate-900 tracking-tight mb-4">
|
||||||
|
Les meilleures mutuelles santé
|
||||||
|
</h2>
|
||||||
|
<p className="text-slate-500 max-w-xl mx-auto leading-relaxed">
|
||||||
|
Classement mis à jour chaque mois — basé sur les garanties, les tarifs
|
||||||
|
et les avis clients de plus de 186 mutuelles analysées.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Top 3 grid */}
|
||||||
|
<div className="grid md:grid-cols-3 gap-6 mb-14">
|
||||||
|
{mutuelles.slice(0, 3).map((m, i) => (
|
||||||
|
<motion.div
|
||||||
|
key={m.id}
|
||||||
|
initial={{ opacity: 0, y: 24 }}
|
||||||
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
|
transition={{ delay: i * 0.1, duration: 0.45 }}
|
||||||
|
>
|
||||||
|
<TopCard mutuelle={m} index={i} />
|
||||||
|
</motion.div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Divider */}
|
||||||
|
<div className="flex items-center gap-4 mb-8">
|
||||||
|
<div className="flex-1 h-px bg-slate-100" />
|
||||||
|
<span className="text-xs font-bold text-slate-400 uppercase tracking-widest">
|
||||||
|
Classement complet
|
||||||
|
</span>
|
||||||
|
<div className="flex-1 h-px bg-slate-100" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Full list */}
|
||||||
|
<div className="space-y-3">
|
||||||
|
{mutuelles.map((m, i) => (
|
||||||
|
<motion.div
|
||||||
|
key={m.id}
|
||||||
|
initial={{ opacity: 0, x: -16 }}
|
||||||
|
whileInView={{ opacity: 1, x: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
|
transition={{ delay: i * 0.06, duration: 0.4 }}
|
||||||
|
>
|
||||||
|
<MutuelleCard mutuelle={m} />
|
||||||
|
</motion.div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,157 @@
|
|||||||
|
import { MdPets } from 'react-icons/md'
|
||||||
|
import {
|
||||||
|
FiFacebook,
|
||||||
|
FiTwitter,
|
||||||
|
FiInstagram,
|
||||||
|
FiLinkedin,
|
||||||
|
FiYoutube,
|
||||||
|
FiArrowUpRight,
|
||||||
|
} from 'react-icons/fi'
|
||||||
|
|
||||||
|
const colResources = ['FAQ', 'Guides', 'Lexique', 'Documents']
|
||||||
|
|
||||||
|
const colDiscover = [
|
||||||
|
'À propos',
|
||||||
|
'Fonctionnement',
|
||||||
|
'Revue de presse',
|
||||||
|
'Nous rejoindre',
|
||||||
|
'Nos partenaires',
|
||||||
|
'Espace presse',
|
||||||
|
]
|
||||||
|
|
||||||
|
const colLegal = [
|
||||||
|
'Mentions légales',
|
||||||
|
'Politique de confidentialité',
|
||||||
|
'Gestion des cookies',
|
||||||
|
"Conditions générales d'utilisation",
|
||||||
|
]
|
||||||
|
|
||||||
|
const socials = [
|
||||||
|
{ Icon: FiFacebook, label: 'Facebook' },
|
||||||
|
{ Icon: FiTwitter, label: 'Twitter / X' },
|
||||||
|
{ Icon: FiInstagram, label: 'Instagram' },
|
||||||
|
{ Icon: FiLinkedin, label: 'LinkedIn' },
|
||||||
|
{ Icon: FiYoutube, label: 'YouTube' },
|
||||||
|
]
|
||||||
|
|
||||||
|
export default function Footer() {
|
||||||
|
return (
|
||||||
|
<footer className="bg-slate-900 text-slate-400">
|
||||||
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||||
|
|
||||||
|
{/* Main grid */}
|
||||||
|
<div className="grid sm:grid-cols-2 lg:grid-cols-4 gap-10 py-16">
|
||||||
|
|
||||||
|
{/* Brand */}
|
||||||
|
<div className="sm:col-span-2 lg:col-span-1">
|
||||||
|
<div className="flex items-center gap-2.5 mb-5">
|
||||||
|
<div className="w-9 h-9 bg-indigo-500 rounded-xl flex items-center justify-center shadow-md">
|
||||||
|
<MdPets className="text-white text-lg" />
|
||||||
|
</div>
|
||||||
|
<span className="font-extrabold text-xl text-white tracking-tight">
|
||||||
|
Mon <span className="text-indigo-400">Gaston</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<address className="not-italic text-sm text-slate-500 leading-relaxed mb-4">
|
||||||
|
Votre comparateur d'assurances<br />
|
||||||
|
33 avenue Roger Salengro<br />
|
||||||
|
59100 Roubaix, France
|
||||||
|
</address>
|
||||||
|
<a
|
||||||
|
href="mailto:[email protected]"
|
||||||
|
className="text-sm text-slate-500 hover:text-indigo-400 transition-colors"
|
||||||
|
>
|
||||||
|
contact@mongaston.com
|
||||||
|
</a>
|
||||||
|
<div className="mt-2">
|
||||||
|
<a
|
||||||
|
href="tel:+33180891030"
|
||||||
|
className="text-sm text-slate-500 hover:text-indigo-400 transition-colors"
|
||||||
|
>
|
||||||
|
01 80 89 10 30
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Resources */}
|
||||||
|
<div>
|
||||||
|
<h4 className="text-white font-bold text-sm uppercase tracking-widest mb-5">
|
||||||
|
Ressources
|
||||||
|
</h4>
|
||||||
|
<ul className="space-y-3">
|
||||||
|
{colResources.map((r) => (
|
||||||
|
<li key={r}>
|
||||||
|
<a
|
||||||
|
href="#"
|
||||||
|
className="text-sm text-slate-500 hover:text-white transition-colors flex items-center gap-1 group"
|
||||||
|
>
|
||||||
|
{r}
|
||||||
|
<FiArrowUpRight size={11} className="opacity-0 group-hover:opacity-100 transition-opacity" />
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Discover */}
|
||||||
|
<div>
|
||||||
|
<h4 className="text-white font-bold text-sm uppercase tracking-widest mb-5">
|
||||||
|
Nous découvrir
|
||||||
|
</h4>
|
||||||
|
<ul className="space-y-3">
|
||||||
|
{colDiscover.map((d) => (
|
||||||
|
<li key={d}>
|
||||||
|
<a
|
||||||
|
href="#"
|
||||||
|
className="text-sm text-slate-500 hover:text-white transition-colors flex items-center gap-1 group"
|
||||||
|
>
|
||||||
|
{d}
|
||||||
|
<FiArrowUpRight size={11} className="opacity-0 group-hover:opacity-100 transition-opacity" />
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Legal */}
|
||||||
|
<div>
|
||||||
|
<h4 className="text-white font-bold text-sm uppercase tracking-widest mb-5">
|
||||||
|
Informations légales
|
||||||
|
</h4>
|
||||||
|
<ul className="space-y-3">
|
||||||
|
{colLegal.map((l) => (
|
||||||
|
<li key={l}>
|
||||||
|
<a href="#" className="text-sm text-slate-500 hover:text-white transition-colors">
|
||||||
|
{l}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Bottom bar */}
|
||||||
|
<div className="border-t border-slate-800 py-6 flex flex-col sm:flex-row items-center justify-between gap-4">
|
||||||
|
<p className="text-xs text-slate-600 text-center sm:text-left">
|
||||||
|
© 2026 Mon Gaston — Tous droits réservés.
|
||||||
|
<span className="mx-2 text-slate-700">·</span>
|
||||||
|
Comparateur de mutuelles santé & assurances
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
{socials.map(({ Icon, label }) => (
|
||||||
|
<a
|
||||||
|
key={label}
|
||||||
|
href="#"
|
||||||
|
aria-label={label}
|
||||||
|
className="w-8 h-8 rounded-lg bg-slate-800 hover:bg-indigo-600 flex items-center justify-center transition-all hover:-translate-y-0.5"
|
||||||
|
>
|
||||||
|
<Icon size={14} className="text-slate-400 hover:text-white" />
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
import { useState } from 'react'
|
||||||
|
import { motion, AnimatePresence } from 'framer-motion'
|
||||||
|
import { FiChevronDown, FiBookOpen, FiChevronRight } from 'react-icons/fi'
|
||||||
|
import { faqs, guides } from '../data/mutuelles'
|
||||||
|
|
||||||
|
function FaqItem({ faq, index }) {
|
||||||
|
const [open, setOpen] = useState(index === 0)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="border border-slate-100 rounded-2xl overflow-hidden">
|
||||||
|
<button
|
||||||
|
onClick={() => setOpen((v) => !v)}
|
||||||
|
className="w-full flex items-start gap-4 px-6 py-5 text-left hover:bg-slate-50 transition-colors"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
className="flex-shrink-0 w-7 h-7 rounded-full flex items-center justify-center text-xs font-extrabold mt-0.5 text-white"
|
||||||
|
style={{ backgroundColor: open ? '#4F46E5' : '#CBD5E1' }}
|
||||||
|
>
|
||||||
|
{index + 1}
|
||||||
|
</span>
|
||||||
|
<span className="flex-1 font-bold text-slate-900 leading-snug">{faq.question}</span>
|
||||||
|
<motion.div
|
||||||
|
animate={{ rotate: open ? 180 : 0 }}
|
||||||
|
transition={{ duration: 0.2 }}
|
||||||
|
className="flex-shrink-0 mt-0.5"
|
||||||
|
>
|
||||||
|
<FiChevronDown className={`text-lg transition-colors ${open ? 'text-indigo-500' : 'text-slate-400'}`} />
|
||||||
|
</motion.div>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<AnimatePresence initial={false}>
|
||||||
|
{open && (
|
||||||
|
<motion.div
|
||||||
|
initial={{ height: 0, opacity: 0 }}
|
||||||
|
animate={{ height: 'auto', opacity: 1 }}
|
||||||
|
exit={{ height: 0, opacity: 0 }}
|
||||||
|
transition={{ duration: 0.25 }}
|
||||||
|
>
|
||||||
|
<div className="px-6 pb-6 space-y-3 border-t border-slate-100 pt-4">
|
||||||
|
{faq.content.map((para, i) => (
|
||||||
|
<p key={i} className="text-sm text-slate-500 leading-relaxed">
|
||||||
|
{para}
|
||||||
|
</p>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
)}
|
||||||
|
</AnimatePresence>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function GuideSection() {
|
||||||
|
return (
|
||||||
|
<section className="py-20 bg-white">
|
||||||
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||||
|
|
||||||
|
<div className="text-center mb-14">
|
||||||
|
<h2 className="text-4xl font-extrabold text-slate-900 tracking-tight mb-4">
|
||||||
|
Tout savoir sur la mutuelle santé
|
||||||
|
</h2>
|
||||||
|
<p className="text-slate-500 max-w-xl mx-auto">
|
||||||
|
Nos guides répondent à toutes vos questions pour faire le bon choix.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="grid lg:grid-cols-3 gap-12">
|
||||||
|
|
||||||
|
{/* FAQ accordéon */}
|
||||||
|
<div className="lg:col-span-2 space-y-3">
|
||||||
|
{faqs.map((faq, i) => (
|
||||||
|
<motion.div
|
||||||
|
key={i}
|
||||||
|
initial={{ opacity: 0, y: 12 }}
|
||||||
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
|
transition={{ delay: i * 0.07, duration: 0.4 }}
|
||||||
|
>
|
||||||
|
<FaqItem faq={faq} index={i} />
|
||||||
|
</motion.div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Sidebar */}
|
||||||
|
<div className="lg:col-span-1">
|
||||||
|
<div className="sticky top-24 space-y-4">
|
||||||
|
|
||||||
|
{/* Guides card */}
|
||||||
|
<div className="bg-slate-50 rounded-2xl border border-slate-100 p-6">
|
||||||
|
<div className="flex items-center gap-2 mb-5">
|
||||||
|
<div className="w-8 h-8 bg-indigo-100 rounded-xl flex items-center justify-center">
|
||||||
|
<FiBookOpen className="text-indigo-600 text-sm" />
|
||||||
|
</div>
|
||||||
|
<h3 className="font-bold text-slate-900">Tous nos guides</h3>
|
||||||
|
</div>
|
||||||
|
<ul className="space-y-1">
|
||||||
|
{guides.map((guide, i) => (
|
||||||
|
<li key={i}>
|
||||||
|
<a
|
||||||
|
href="#"
|
||||||
|
className="flex items-start gap-2 text-sm text-slate-600 hover:text-indigo-600 transition-colors py-2 group"
|
||||||
|
>
|
||||||
|
<FiChevronRight className="flex-shrink-0 mt-0.5 text-slate-300 group-hover:text-indigo-400 transition-colors" />
|
||||||
|
{guide}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* CTA card */}
|
||||||
|
<div className="bg-gradient-to-br from-indigo-600 to-indigo-700 rounded-2xl p-6 text-white">
|
||||||
|
<div className="font-extrabold text-lg mb-2">
|
||||||
|
Besoin d'un conseil personnalisé ?
|
||||||
|
</div>
|
||||||
|
<p className="text-indigo-200 text-sm mb-5 leading-relaxed">
|
||||||
|
Nos experts répondent à toutes vos questions gratuitement, sans engagement.
|
||||||
|
</p>
|
||||||
|
<a
|
||||||
|
href="tel:+33180891030"
|
||||||
|
className="flex items-center justify-center gap-2 bg-white text-indigo-700 font-bold text-sm py-3 rounded-xl hover:bg-indigo-50 transition-colors"
|
||||||
|
>
|
||||||
|
📞 01 80 89 10 30
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
import { motion } from 'framer-motion'
|
||||||
|
import { FiArrowRight, FiShield, FiStar, FiUsers, FiCheckCircle } from 'react-icons/fi'
|
||||||
|
|
||||||
|
const stats = [
|
||||||
|
{ value: '186', label: 'mutuelles analysées', icon: FiShield },
|
||||||
|
{ value: '4.9 / 5', label: 'note clients', icon: FiStar },
|
||||||
|
{ value: '250 000+', label: 'utilisateurs', icon: FiUsers },
|
||||||
|
]
|
||||||
|
|
||||||
|
export default function Hero() {
|
||||||
|
return (
|
||||||
|
<section className="relative overflow-hidden bg-gradient-to-br from-slate-50 via-indigo-50/40 to-white pt-14 pb-10">
|
||||||
|
{/* Decorative blobs */}
|
||||||
|
<div className="pointer-events-none absolute inset-0 overflow-hidden">
|
||||||
|
<div className="absolute -top-48 -right-48 w-[600px] h-[600px] rounded-full bg-indigo-100/50 blur-3xl" />
|
||||||
|
<div className="absolute bottom-0 -left-32 w-[400px] h-[400px] rounded-full bg-sky-100/40 blur-3xl" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 flex flex-col items-center text-center">
|
||||||
|
<motion.div
|
||||||
|
initial={{ opacity: 0, y: 24 }}
|
||||||
|
animate={{ opacity: 1, y: 0 }}
|
||||||
|
transition={{ duration: 0.55 }}
|
||||||
|
className="max-w-3xl"
|
||||||
|
>
|
||||||
|
<h1 className="text-5xl xl:text-6xl font-extrabold text-slate-900 leading-[1.08] tracking-tight mb-5">
|
||||||
|
Mutuelle santé{' '}
|
||||||
|
<span className="relative">
|
||||||
|
<span className="relative z-10 text-transparent bg-clip-text bg-gradient-to-r from-indigo-600 to-sky-500">
|
||||||
|
pour tous
|
||||||
|
</span>
|
||||||
|
<span className="absolute bottom-1 left-0 w-full h-3 bg-indigo-100/70 rounded-sm -z-0" />
|
||||||
|
</span>
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<p className="text-lg text-slate-500 leading-relaxed mb-8 max-w-lg mx-auto">
|
||||||
|
Jeune actif, parent, senior — comparez les garanties utiles et trouvez
|
||||||
|
la couverture parfaite au meilleur prix, sans engagement.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{/* Trust points */}
|
||||||
|
<ul className="flex flex-wrap justify-center gap-x-6 gap-y-1.5 mb-8">
|
||||||
|
{['Comparaison 100% gratuite', 'Sans engagement', 'Réponse en 2 min'].map((t) => (
|
||||||
|
<li key={t} className="flex items-center gap-1.5 text-sm text-slate-500">
|
||||||
|
<FiCheckCircle className="text-emerald-500 flex-shrink-0" />
|
||||||
|
{t}
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
{/* CTA */}
|
||||||
|
<div className="flex flex-wrap justify-center gap-3">
|
||||||
|
<motion.button
|
||||||
|
whileHover={{ scale: 1.025 }}
|
||||||
|
whileTap={{ scale: 0.97 }}
|
||||||
|
className="flex items-center gap-2 bg-gradient-to-r from-indigo-600 to-indigo-700 hover:from-indigo-700 hover:to-indigo-800 text-white font-bold text-base px-7 py-3.5 rounded-xl shadow-lg shadow-indigo-300/50 transition-all"
|
||||||
|
>
|
||||||
|
Comparer les mutuelles
|
||||||
|
<FiArrowRight />
|
||||||
|
</motion.button>
|
||||||
|
<button className="flex items-center gap-2 font-semibold text-slate-700 text-base px-7 py-3.5 rounded-xl border border-slate-200 bg-white hover:border-indigo-300 hover:text-indigo-600 transition-all">
|
||||||
|
Voir le classement
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
|
||||||
|
{/* Stats bar */}
|
||||||
|
<motion.div
|
||||||
|
initial={{ opacity: 0, y: 20 }}
|
||||||
|
animate={{ opacity: 1, y: 0 }}
|
||||||
|
transition={{ duration: 0.55, delay: 0.35 }}
|
||||||
|
className="mt-16 grid grid-cols-3 gap-6 max-w-2xl"
|
||||||
|
>
|
||||||
|
{stats.map(({ value, label, icon: Icon }) => (
|
||||||
|
<div key={label} className="flex flex-col items-center gap-1">
|
||||||
|
<Icon className="text-indigo-400 text-lg mb-0.5" />
|
||||||
|
<div className="text-2xl font-extrabold text-slate-900">{value}</div>
|
||||||
|
<div className="text-xs text-slate-400 font-medium">{label}</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</motion.div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
import { FiArrowRight, FiActivity, FiEye, FiSmile } from 'react-icons/fi'
|
||||||
|
import { MdLocalHospital } from 'react-icons/md'
|
||||||
|
|
||||||
|
const hospConfig = {
|
||||||
|
orange: {
|
||||||
|
bg: 'bg-orange-50',
|
||||||
|
text: 'text-orange-700',
|
||||||
|
border: 'border-orange-200',
|
||||||
|
},
|
||||||
|
green: {
|
||||||
|
bg: 'bg-emerald-50',
|
||||||
|
text: 'text-emerald-700',
|
||||||
|
border: 'border-emerald-200',
|
||||||
|
},
|
||||||
|
teal: {
|
||||||
|
bg: 'bg-teal-50',
|
||||||
|
text: 'text-teal-700',
|
||||||
|
border: 'border-teal-200',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
function FeatureDots({ count }) {
|
||||||
|
return (
|
||||||
|
<div className="flex gap-1">
|
||||||
|
{[1, 2, 3].map((i) => (
|
||||||
|
<div
|
||||||
|
key={i}
|
||||||
|
className={`w-2.5 h-2.5 rounded-full transition-colors ${
|
||||||
|
i <= count ? 'bg-indigo-500' : 'bg-slate-200'
|
||||||
|
}`}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function ScoreBar({ score, color }) {
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col items-center gap-1 min-w-[64px]">
|
||||||
|
<div className="text-xl font-extrabold" style={{ color }}>
|
||||||
|
{score}
|
||||||
|
</div>
|
||||||
|
<div className="w-14 h-1.5 bg-slate-100 rounded-full overflow-hidden">
|
||||||
|
<div
|
||||||
|
className="h-full rounded-full"
|
||||||
|
style={{ width: `${(score / 10) * 100}%`, backgroundColor: color }}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="text-[10px] text-slate-400 font-medium whitespace-nowrap">
|
||||||
|
Score Mon Gaston
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function MutuelleCard({ mutuelle }) {
|
||||||
|
const hosp = hospConfig[mutuelle.hospColor] || hospConfig.teal
|
||||||
|
const isFirst = mutuelle.rank === 1
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={`bg-white rounded-2xl border transition-all hover:shadow-lg hover:-translate-y-0.5 p-5 flex items-center gap-4 ${
|
||||||
|
isFirst
|
||||||
|
? 'border-indigo-200 shadow-md ring-1 ring-indigo-100'
|
||||||
|
: 'border-slate-100 hover:border-slate-200'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{/* Rank badge */}
|
||||||
|
<div
|
||||||
|
className={`w-8 h-8 rounded-xl flex items-center justify-center text-sm font-bold flex-shrink-0 ${
|
||||||
|
isFirst ? 'bg-indigo-600 text-white shadow-md shadow-indigo-300' : 'bg-slate-100 text-slate-500'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{mutuelle.rank}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Logo */}
|
||||||
|
<div
|
||||||
|
className="w-14 h-14 rounded-2xl flex items-center justify-center font-extrabold text-white text-sm flex-shrink-0 shadow-md"
|
||||||
|
style={{ backgroundColor: mutuelle.primaryColor }}
|
||||||
|
>
|
||||||
|
{mutuelle.initials}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Name + tags */}
|
||||||
|
<div className="flex-1 min-w-0">
|
||||||
|
<div className="flex items-center gap-2 flex-wrap mb-1">
|
||||||
|
<span className="font-bold text-slate-900 truncate">{mutuelle.name}</span>
|
||||||
|
{isFirst && (
|
||||||
|
<span className="bg-amber-50 text-amber-600 border border-amber-200 text-[10px] font-extrabold px-2 py-0.5 rounded-full whitespace-nowrap">
|
||||||
|
⭐ Meilleur Choix
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center gap-1.5 flex-wrap">
|
||||||
|
{mutuelle.idealFor.map((tag) => (
|
||||||
|
<span
|
||||||
|
key={tag}
|
||||||
|
className="text-[11px] font-medium bg-slate-100 text-slate-500 px-2 py-0.5 rounded-full"
|
||||||
|
>
|
||||||
|
{tag}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Features */}
|
||||||
|
<div className="hidden md:flex flex-col gap-2 flex-shrink-0">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<FiActivity className="text-slate-300 text-xs flex-shrink-0" />
|
||||||
|
<span className="text-[11px] text-slate-500 w-12">Soins</span>
|
||||||
|
<FeatureDots count={mutuelle.soins} />
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<FiSmile className="text-slate-300 text-xs flex-shrink-0" />
|
||||||
|
<span className="text-[11px] text-slate-500 w-12">Dentaire</span>
|
||||||
|
<FeatureDots count={mutuelle.dentaire} />
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<FiEye className="text-slate-300 text-xs flex-shrink-0" />
|
||||||
|
<span className="text-[11px] text-slate-500 w-12">Optique</span>
|
||||||
|
<FeatureDots count={mutuelle.optique} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
{/* Score */}
|
||||||
|
<div className="hidden lg:block flex-shrink-0">
|
||||||
|
<ScoreBar score={mutuelle.score} color={mutuelle.primaryColor} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* CTA */}
|
||||||
|
<button
|
||||||
|
className="flex items-center gap-2 text-white font-bold text-sm px-5 py-2.5 rounded-xl flex-shrink-0 hover:opacity-90 active:scale-95 transition-all shadow-md"
|
||||||
|
style={{ backgroundColor: mutuelle.primaryColor }}
|
||||||
|
>
|
||||||
|
Voir l'offre
|
||||||
|
<FiArrowRight />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
import { useState } from 'react'
|
||||||
|
import { motion, AnimatePresence } from 'framer-motion'
|
||||||
|
import { FiPhone, FiMenu, FiX } from 'react-icons/fi'
|
||||||
|
import { MdPets } from 'react-icons/md'
|
||||||
|
|
||||||
|
const navLinks = [
|
||||||
|
{ label: 'Mutuelle santé', href: '#' },
|
||||||
|
{ label: 'Assurance animaux', href: '#' },
|
||||||
|
{ label: 'Assurance auto', href: '#' },
|
||||||
|
{ label: 'Assurance habitation', href: '#' },
|
||||||
|
{ label: 'Assurance Emprunteur', href: '#' },
|
||||||
|
{ label: 'Contact', href: '#' },
|
||||||
|
]
|
||||||
|
|
||||||
|
export default function Navbar() {
|
||||||
|
const [open, setOpen] = useState(false)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<header className="sticky top-0 z-50 bg-white/95 backdrop-blur border-b border-slate-100 shadow-sm">
|
||||||
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||||
|
<div className="flex items-center justify-between h-16">
|
||||||
|
{/* Logo */}
|
||||||
|
<a href="#" className="flex items-center gap-2.5">
|
||||||
|
<div className="w-9 h-9 bg-gradient-to-br from-indigo-500 to-indigo-700 rounded-xl flex items-center justify-center shadow-md shadow-indigo-200">
|
||||||
|
<MdPets className="text-white text-lg" />
|
||||||
|
</div>
|
||||||
|
<span className="font-extrabold text-xl tracking-tight text-slate-900">
|
||||||
|
Mon <span className="text-indigo-600">Gaston</span>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
{/* Desktop nav */}
|
||||||
|
<nav className="hidden lg:flex items-center gap-1">
|
||||||
|
{navLinks.map((link) => (
|
||||||
|
<a
|
||||||
|
key={link.label}
|
||||||
|
href={link.href}
|
||||||
|
className="px-3 py-2 text-sm text-slate-600 hover:text-indigo-600 hover:bg-indigo-50 rounded-lg transition-all font-medium"
|
||||||
|
>
|
||||||
|
{link.label}
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
{/* Phone CTA */}
|
||||||
|
<div className="hidden lg:flex items-center gap-3">
|
||||||
|
<a
|
||||||
|
href="tel:+33180891030"
|
||||||
|
className="flex items-center gap-2 bg-indigo-600 hover:bg-indigo-700 active:bg-indigo-800 text-white text-sm font-bold px-4 py-2.5 rounded-xl transition-all shadow-md shadow-indigo-200"
|
||||||
|
>
|
||||||
|
<FiPhone className="text-base" />
|
||||||
|
01 80 89 10 30
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Mobile toggle */}
|
||||||
|
<button
|
||||||
|
className="lg:hidden p-2 rounded-lg text-slate-600 hover:bg-slate-100 transition-colors"
|
||||||
|
onClick={() => setOpen((v) => !v)}
|
||||||
|
aria-label="Menu"
|
||||||
|
>
|
||||||
|
{open ? <FiX size={22} /> : <FiMenu size={22} />}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Mobile menu */}
|
||||||
|
<AnimatePresence>
|
||||||
|
{open && (
|
||||||
|
<motion.div
|
||||||
|
initial={{ opacity: 0, y: -8 }}
|
||||||
|
animate={{ opacity: 1, y: 0 }}
|
||||||
|
exit={{ opacity: 0, y: -8 }}
|
||||||
|
transition={{ duration: 0.18 }}
|
||||||
|
className="lg:hidden border-t border-slate-100 bg-white px-4 pt-3 pb-5 space-y-1"
|
||||||
|
>
|
||||||
|
{navLinks.map((link) => (
|
||||||
|
<a
|
||||||
|
key={link.label}
|
||||||
|
href={link.href}
|
||||||
|
className="block px-3 py-2.5 text-sm text-slate-600 hover:text-indigo-600 hover:bg-indigo-50 rounded-lg font-medium transition-colors"
|
||||||
|
>
|
||||||
|
{link.label}
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
|
<a
|
||||||
|
href="tel:+33180891030"
|
||||||
|
className="mt-3 flex items-center justify-center gap-2 bg-indigo-600 text-white text-sm font-bold px-4 py-3 rounded-xl w-full"
|
||||||
|
>
|
||||||
|
<FiPhone />
|
||||||
|
01 80 89 10 30
|
||||||
|
</a>
|
||||||
|
</motion.div>
|
||||||
|
)}
|
||||||
|
</AnimatePresence>
|
||||||
|
</header>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
import { motion } from 'framer-motion'
|
||||||
|
import { FiStar } from 'react-icons/fi'
|
||||||
|
import { testimonials } from '../data/mutuelles'
|
||||||
|
|
||||||
|
function Stars({ rating }) {
|
||||||
|
return (
|
||||||
|
<div className="flex gap-0.5">
|
||||||
|
{[1, 2, 3, 4, 5].map((i) => (
|
||||||
|
<FiStar
|
||||||
|
key={i}
|
||||||
|
size={13}
|
||||||
|
className={i <= rating ? 'text-amber-400' : 'text-slate-200'}
|
||||||
|
style={i <= rating ? { fill: 'currentColor' } : {}}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function Testimonials() {
|
||||||
|
return (
|
||||||
|
<section className="py-20 bg-slate-50">
|
||||||
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||||
|
|
||||||
|
<div className="text-center mb-14">
|
||||||
|
<h2 className="text-4xl font-extrabold text-slate-900 tracking-tight mb-4">
|
||||||
|
Ce que nos clients disent de nous
|
||||||
|
</h2>
|
||||||
|
<p className="text-slate-500 max-w-xl mx-auto">
|
||||||
|
Découvrez les témoignages de clients satisfaits qui nous font confiance
|
||||||
|
pour leurs assurances santé.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="grid md:grid-cols-3 gap-6">
|
||||||
|
{testimonials.map((t, i) => (
|
||||||
|
<motion.div
|
||||||
|
key={t.id}
|
||||||
|
initial={{ opacity: 0, y: 24 }}
|
||||||
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
|
transition={{ delay: i * 0.12, duration: 0.45 }}
|
||||||
|
className="bg-white rounded-2xl border border-slate-100 p-6 shadow-sm hover:shadow-md hover:-translate-y-0.5 transition-all"
|
||||||
|
>
|
||||||
|
{/* Quote mark */}
|
||||||
|
<div className="text-4xl font-serif text-indigo-100 leading-none mb-2 select-none">
|
||||||
|
"
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p className="text-sm text-slate-600 leading-relaxed mb-5">
|
||||||
|
{t.text}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{/* Footer */}
|
||||||
|
<div className="flex items-center justify-between pt-4 border-t border-slate-100">
|
||||||
|
<div className="flex items-center gap-3">
|
||||||
|
<div
|
||||||
|
className="w-10 h-10 rounded-full flex items-center justify-center text-white font-bold text-sm shadow-sm flex-shrink-0"
|
||||||
|
style={{ backgroundColor: t.avatarColor }}
|
||||||
|
>
|
||||||
|
{t.avatar}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div className="font-bold text-sm text-slate-900">{t.name}</div>
|
||||||
|
<div className="text-xs text-slate-400">{t.role}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Stars rating={t.rating} />
|
||||||
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Trust bar */}
|
||||||
|
<motion.div
|
||||||
|
initial={{ opacity: 0, y: 16 }}
|
||||||
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
|
viewport={{ once: true }}
|
||||||
|
transition={{ duration: 0.45, delay: 0.3 }}
|
||||||
|
className="mt-12 flex flex-col sm:flex-row items-center justify-center gap-4 bg-white rounded-2xl border border-slate-100 shadow-sm px-8 py-5"
|
||||||
|
>
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<div className="flex -space-x-2">
|
||||||
|
{[
|
||||||
|
{ initials: 'AB', color: '#2563EB' },
|
||||||
|
{ initials: 'CL', color: '#DC2626' },
|
||||||
|
{ initials: 'MK', color: '#059669' },
|
||||||
|
{ initials: 'JD', color: '#7C3AED' },
|
||||||
|
].map((a) => (
|
||||||
|
<div
|
||||||
|
key={a.initials}
|
||||||
|
className="w-8 h-8 rounded-full border-2 border-white flex items-center justify-center text-white text-[10px] font-bold"
|
||||||
|
style={{ backgroundColor: a.color }}
|
||||||
|
>
|
||||||
|
{a.initials}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<span className="text-sm font-bold text-slate-900">250 000+</span>
|
||||||
|
<span className="text-sm text-slate-500">utilisateurs satisfaits</span>
|
||||||
|
</div>
|
||||||
|
<div className="hidden sm:block w-px h-6 bg-slate-200" />
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<div className="flex gap-0.5">
|
||||||
|
{[1,2,3,4,5].map((i) => (
|
||||||
|
<FiStar key={i} size={14} className="text-amber-400" style={{ fill: 'currentColor' }} />
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<span className="text-sm font-bold text-slate-900">4.9 / 5</span>
|
||||||
|
<span className="text-sm text-slate-500">note moyenne</span>
|
||||||
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,199 @@
|
|||||||
|
export const mutuelles = [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
rank: 1,
|
||||||
|
name: "Mon Santé",
|
||||||
|
initials: "MS",
|
||||||
|
tagline: "La référence 2026",
|
||||||
|
primaryColor: "#DC2626",
|
||||||
|
lightBg: "#FEF2F2",
|
||||||
|
badge: "Meilleur Choix 2026",
|
||||||
|
idealFor: ["Actifs", "Seniors"],
|
||||||
|
soins: 3,
|
||||||
|
dentaire: 2,
|
||||||
|
optique: 3,
|
||||||
|
hospitalization: "Élevée",
|
||||||
|
hospColor: "orange",
|
||||||
|
score: 9.8,
|
||||||
|
offer: null,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
rank: 2,
|
||||||
|
name: "Identités Mutuelle",
|
||||||
|
initials: "ID",
|
||||||
|
tagline: "Idéal pour les actifs",
|
||||||
|
primaryColor: "#2563EB",
|
||||||
|
lightBg: "#EFF6FF",
|
||||||
|
badge: null,
|
||||||
|
idealFor: ["Actifs"],
|
||||||
|
soins: 3,
|
||||||
|
dentaire: 2,
|
||||||
|
optique: 3,
|
||||||
|
hospitalization: "Élevée",
|
||||||
|
hospColor: "orange",
|
||||||
|
score: 9.5,
|
||||||
|
offer: null,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
rank: 3,
|
||||||
|
name: "Yeomi",
|
||||||
|
initials: "YE",
|
||||||
|
tagline: "Excellent rapport qualité-prix",
|
||||||
|
primaryColor: "#F97316",
|
||||||
|
lightBg: "#FFF7ED",
|
||||||
|
badge: null,
|
||||||
|
idealFor: ["Actifs", "Familles"],
|
||||||
|
soins: 3,
|
||||||
|
dentaire: 3,
|
||||||
|
optique: 2,
|
||||||
|
hospitalization: "Élevée",
|
||||||
|
hospColor: "orange",
|
||||||
|
score: 9.3,
|
||||||
|
offer: "3 MOIS OFFERTS",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 4,
|
||||||
|
rank: 4,
|
||||||
|
name: "Smatis",
|
||||||
|
initials: "SM",
|
||||||
|
tagline: "Excellence pour seniors",
|
||||||
|
primaryColor: "#7C3AED",
|
||||||
|
lightBg: "#F5F3FF",
|
||||||
|
badge: null,
|
||||||
|
idealFor: ["Seniors"],
|
||||||
|
soins: 3,
|
||||||
|
dentaire: 3,
|
||||||
|
optique: 3,
|
||||||
|
hospitalization: "Excellente",
|
||||||
|
hospColor: "green",
|
||||||
|
score: 9.1,
|
||||||
|
offer: null,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 5,
|
||||||
|
rank: 5,
|
||||||
|
name: "April",
|
||||||
|
initials: "AP",
|
||||||
|
tagline: "Flexibilité maximale",
|
||||||
|
primaryColor: "#0891B2",
|
||||||
|
lightBg: "#ECFEFF",
|
||||||
|
badge: null,
|
||||||
|
idealFor: ["Seniors", "Indépendants"],
|
||||||
|
soins: 2,
|
||||||
|
dentaire: 3,
|
||||||
|
optique: 3,
|
||||||
|
hospitalization: "Excellente",
|
||||||
|
hospColor: "green",
|
||||||
|
score: 8.9,
|
||||||
|
offer: null,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 6,
|
||||||
|
rank: 6,
|
||||||
|
name: "Helse",
|
||||||
|
initials: "HE",
|
||||||
|
tagline: "Rapport qualité-prix optimal",
|
||||||
|
primaryColor: "#059669",
|
||||||
|
lightBg: "#ECFDF5",
|
||||||
|
badge: null,
|
||||||
|
idealFor: ["Actifs", "Étudiants"],
|
||||||
|
soins: 2,
|
||||||
|
dentaire: 2,
|
||||||
|
optique: 3,
|
||||||
|
hospitalization: "Très bonne",
|
||||||
|
hospColor: "teal",
|
||||||
|
score: 8.7,
|
||||||
|
offer: null,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export const testimonials = [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
name: "Fabienne Delat",
|
||||||
|
role: "Retraitée, 67 ans",
|
||||||
|
avatar: "FD",
|
||||||
|
avatarColor: "#7C3AED",
|
||||||
|
rating: 5,
|
||||||
|
text: "Je suis ravie des économies que j'ai pu réaliser en changeant de mutuelle grâce à Mon Gaston. Le comparateur est simple et les conseils très utiles. Je recommande à tous !",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
name: "Nelly Skrzyniarz",
|
||||||
|
role: "Cadre, 41 ans",
|
||||||
|
avatar: "NS",
|
||||||
|
avatarColor: "#2563EB",
|
||||||
|
rating: 5,
|
||||||
|
text: "Mon conseiller était vraiment à l'écoute, sans pression. Il a pris le temps de comprendre mes besoins et m'a orienté vers la solution parfaite pour moi. Très satisfaite !",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
name: "Joëlle Viot",
|
||||||
|
role: "Infirmière, 34 ans",
|
||||||
|
avatar: "JV",
|
||||||
|
avatarColor: "#DC2626",
|
||||||
|
rating: 5,
|
||||||
|
text: "J'ai un diabète et j'avais besoin de bons remboursements sur mes soins spécialisés. Mon Gaston m'a trouvé exactement ce qu'il fallait, rapidement et sans tracas.",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export const guides = [
|
||||||
|
"Pourquoi souscrire à une mutuelle santé ?",
|
||||||
|
"Quels sont les avantages de souscrire à une mutuelle santé ?",
|
||||||
|
"Quels sont les types de complémentaires santé ?",
|
||||||
|
"Comment bien choisir une mutuelle santé ?",
|
||||||
|
"Comment résilier sa mutuelle santé ?",
|
||||||
|
"Pourquoi choisir une mutuelle santé via un comparateur en ligne ?",
|
||||||
|
]
|
||||||
|
|
||||||
|
export const faqs = [
|
||||||
|
{
|
||||||
|
question: "Pourquoi souscrire à une mutuelle santé ?",
|
||||||
|
content: [
|
||||||
|
"La première mission de la mutuelle santé est d'indemniser la valeur du ticket modérateur — la partie non remboursée par la Sécurité sociale. Il est possible de classer les soins en 3 catégories selon leur niveau de remboursement.",
|
||||||
|
"Soins remboursés à 80 % : il s'agit par exemple des honoraires médicaux en cas d'hospitalisation. Une mutuelle couvre le reste des 20 % à votre charge.",
|
||||||
|
"Soins pris en charge à 70 % : consultations chez un médecin généraliste ou un spécialiste. La consultation coûte 25 €, la Sécu rembourse 16,50 € — la mutuelle couvre le solde.",
|
||||||
|
"Soins remboursés à 60 % : soins infirmiers, kinésithérapie et certains actes effectués en laboratoire.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
question: "Quels sont les avantages de souscrire à une mutuelle santé ?",
|
||||||
|
content: [
|
||||||
|
"La seconde mission d'une assurance santé est de rembourser les soins qui ne bénéficient d'aucun remboursement de la Sécurité sociale (actes hors AMO) : frais d'hospitalisation, séances d'ostéopathie, phytothérapie, médecines douces...",
|
||||||
|
"Accéder au tiers payant : vous n'avancez plus les frais médicaux. Un avantage considérable pour gérer votre budget de santé sereinement.",
|
||||||
|
"Bénéficier de services d'assistance : prise en charge en cas de difficultés liées à la santé — aide-ménagère, soutien scolaire, garde d'animaux, accompagnement. C'est un contrat central pour connaître les conditions.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
question: "Quels sont les types de complémentaire santé ?",
|
||||||
|
content: [
|
||||||
|
"Depuis le 1er janvier 2016, chaque employeur doit proposer une complémentaire santé collective à ses salariés — avec une prise en charge minimale de 50 % de la cotisation.",
|
||||||
|
"Si vous êtes salarié mais pas satisfait, ou si vous travaillez à votre compte, vous devrez souscrire une assurance santé individuelle. Elle est plus chère mais s'adapte entièrement à votre situation.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
question: "Comment bien choisir une mutuelle santé ?",
|
||||||
|
content: [
|
||||||
|
"Analysez vos besoins réels en matière de santé et ceux de vos ayants droit. Sans cette étape, vous risquez de payer trop cher ou d'être sous-couvert par rapport à vos dépenses de santé habituelles.",
|
||||||
|
"Soyez attentif aux exclusions de garanties : certains contrats ne prennent pas en charge les lunettes, les frais funéraires, la chirurgie esthétique, ou certains actes après une tentative de suicide.",
|
||||||
|
"Adaptez votre couverture à votre budget — les contrats de mutuelle sont conçus pour s'adapter à tous les profils, y compris les plus serrés.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
question: "Comment résilier sa mutuelle santé ?",
|
||||||
|
content: [
|
||||||
|
"Depuis le 1er décembre 2020, tout assuré peut résilier sa mutuelle santé à tout moment, à condition de bénéficier d'un contrat depuis plus d'un an. Par exemple, signé le 1er mars 2021, vous pouvez résilier à partir du 1er mars 2022, sans justification.",
|
||||||
|
"Il suffit d'envoyer une lettre de résiliation en recommandé. Et si vous souscrivez une nouvelle mutuelle, celle-ci peut se charger des démarches de résiliation à votre place.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
question: "Pourquoi choisir une mutuelle santé via un comparateur en ligne ?",
|
||||||
|
content: [
|
||||||
|
"Mon Gaston facilite les démarches des demandeurs de mutuelles santé en France. Face à la complexité de l'offre, il est difficile de choisir une mutuelle parfaitement adaptée à ses besoins et à son budget sans aide.",
|
||||||
|
"Pour vous aider à faire le tri dans cet océan d'offres, notre comparateur en ligne recense les meilleures offres de mutuelles santé. Cela permet de comparer sereinement sans perdre des heures.",
|
||||||
|
"Découvrez les formules Mon Gaston adaptées à votre profil — tirez parti de la concurrence pour bénéficier du meilleur rapport qualité-prix proposé.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]
|
||||||
+9
-62
@@ -1,68 +1,15 @@
|
|||||||
:root {
|
@import "tailwindcss";
|
||||||
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
|
|
||||||
line-height: 1.5;
|
|
||||||
font-weight: 400;
|
|
||||||
|
|
||||||
color-scheme: light dark;
|
@layer base {
|
||||||
color: rgba(255, 255, 255, 0.87);
|
html {
|
||||||
background-color: #242424;
|
scroll-behavior: smooth;
|
||||||
|
}
|
||||||
font-synthesis: none;
|
body {
|
||||||
text-rendering: optimizeLegibility;
|
font-family: Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
}
|
}
|
||||||
|
* {
|
||||||
a {
|
box-sizing: border-box;
|
||||||
font-weight: 500;
|
|
||||||
color: #646cff;
|
|
||||||
text-decoration: inherit;
|
|
||||||
}
|
|
||||||
a:hover {
|
|
||||||
color: #535bf2;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
margin: 0;
|
|
||||||
display: flex;
|
|
||||||
place-items: center;
|
|
||||||
min-width: 320px;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: 3.2em;
|
|
||||||
line-height: 1.1;
|
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
|
||||||
border-radius: 8px;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
padding: 0.6em 1.2em;
|
|
||||||
font-size: 1em;
|
|
||||||
font-weight: 500;
|
|
||||||
font-family: inherit;
|
|
||||||
background-color: #1a1a1a;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: border-color 0.25s;
|
|
||||||
}
|
|
||||||
button:hover {
|
|
||||||
border-color: #646cff;
|
|
||||||
}
|
|
||||||
button:focus,
|
|
||||||
button:focus-visible {
|
|
||||||
outline: 4px auto -webkit-focus-ring-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: light) {
|
|
||||||
:root {
|
|
||||||
color: #213547;
|
|
||||||
background-color: #ffffff;
|
|
||||||
}
|
|
||||||
a:hover {
|
|
||||||
color: #747bff;
|
|
||||||
}
|
|
||||||
button {
|
|
||||||
background-color: #f9f9f9;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
module.exports = {
|
||||||
|
content: ['./index.html', './src/**/*.{js,jsx,ts,tsx}'],
|
||||||
|
theme: {
|
||||||
|
extend: {},
|
||||||
|
},
|
||||||
|
plugins: [],
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user