diff --git a/eslint.config.js b/eslint.config.js index cee1e2c..d85484e 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -23,7 +23,7 @@ export default defineConfig([ }, }, rules: { - 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], + 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]|motion' }], }, }, ]) diff --git a/package-lock.json b/package-lock.json index 9f3aad0..600c0f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -91,6 +91,7 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -939,6 +940,7 @@ "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.14.8.tgz", "integrity": "sha512-WiE9uCGRLUnShdjb9iP20sA3ToWrBbNXr14/N5mow7Nls9dmKgfGaGX5cynLvrltxq2OrDLh1VDNaUgsnS/k/g==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", @@ -1005,6 +1007,7 @@ "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.5.8.tgz", "integrity": "sha512-4De6SUZ36zozl9kh5rZSxKWULpgty27rMzZ6x+xkoo7+NWyhWyFdsdvhFsWhTw/9GGj0wXIcbTjwHYCUIUuHyg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@firebase/app": "0.14.8", "@firebase/component": "0.7.0", @@ -1020,7 +1023,8 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz", "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/@firebase/auth-compat": { "version": "0.6.2", @@ -1471,6 +1475,7 @@ "integrity": "sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==", "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.1.0" }, @@ -2168,6 +2173,7 @@ "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -2215,6 +2221,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2457,6 +2464,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -2567,6 +2575,7 @@ "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", "license": "MIT", + "peer": true, "dependencies": { "@kurkle/color": "^0.3.0" }, @@ -2749,7 +2758,8 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/debug": { "version": "4.4.3", @@ -2947,6 +2957,7 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -3747,6 +3758,7 @@ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -4283,6 +4295,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -4512,6 +4525,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -4534,6 +4548,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -5114,6 +5129,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -5229,6 +5245,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, + "peer": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", diff --git a/src/components/Blog.jsx b/src/components/Blog.jsx index 80625ab..a110517 100644 --- a/src/components/Blog.jsx +++ b/src/components/Blog.jsx @@ -2,488 +2,7 @@ import React from "react"; import "./Blog.css"; import { useNavigate } from "react-router-dom"; import { motion } from "framer-motion"; - -// Import all images -import image1 from "../assets/1.png"; -import image2 from "../assets/2.png"; -import image3 from "../assets/3.png"; -import image4 from "../assets/4.png"; -import image5 from "../assets/5.png"; -import image6 from "../assets/6.png"; -import image7 from "../assets/7.png"; -import image8 from "../assets/8.png"; -import image9 from "../assets/9.png"; -import image10 from "../assets/10.png"; -import image11 from "../assets/11.png"; -import image12 from "../assets/12.png"; -import image13 from "../assets/13.png"; -import image14 from "../assets/14.png"; -import image15 from "../assets/15.png"; -import image16 from "../assets/16.png"; -import image17 from "../assets/17.png"; -import image18 from "../assets/18.png"; -import image19 from "../assets/19.png"; -import image20 from "../assets/20.png"; -import image21 from "../assets/21.png"; -import image22 from "../assets/22.png"; -import image23 from "../assets/23.png"; -import image24 from "../assets/24.png"; -import image25 from "../assets/25.png"; -import image26 from "../assets/26.png"; -import image27 from "../assets/27.png"; -import image29 from "../assets/29.png"; -import image30 from "../assets/30.png"; - -// Create array of imported images -const imageUrls = [ - image1, image2, image3, image4, image5, image6, image7, image8, image9, image10, - image11, image12, image13, image14, image15, image16, image17, image18, image19, image20, - image21, image22, image23, image24, image25, image26, image27, image29, image30,//image28 -]; - -// Categories and tags for variation -const categories = ["Vector", "Market Pulse", "Week On-chain", "Research", "Partner Reports", "Market Vectors", "On-chain Analysis", "Market Intelligence"]; -const tags = ["Premium", "Free", "Featured"]; -const badgeColors = ["#4559DC", "#22c55e", "#9d4edd", "#f59e0b"]; - -// Real Glassnode blog posts data -export const generateBlogPosts = () => { - return [ - { - id: 1, - title: "The Bitcoin Vector #37", - excerpt: "Bitcoin enters 2026 attempting to stabilise after its Q4 drawdown. The Vector models suggest a subtle shift in momentum as long-term holders resume accumulation.", - date: "Jan 10, 2026", - readTime: "12 min read", - image: image1, - category: "Vector", - tag: "Premium", - badgeColor: "#4559DC", - isFeatured: true, - gradient: "linear-gradient(135deg, #4559DC30, #22c55e20)", - content: { - toc: ["Market Overview", "On-chain Metrics", "Supply Dynamics", "Price Action Analysis", "Forward Outlook"], - sections: [ - { - heading: "Market Overview", - text: "Bitcoin enters the new year with cautious optimism as markets attempt to stabilize following the Q4 2025 drawdown. The Vector framework indicates subtle shifts in market structure that professional traders should monitor closely." - }, - { - heading: "On-chain Metrics", - text: "Long-term holder supply has resumed growth after a period of distribution, suggesting renewed conviction from Bitcoin's most steadfast investors. Exchange balances continue their multi-year decline, with only 11.5% of circulating supply remaining on exchanges." - }, - { - heading: "Supply Dynamics", - text: "The percentage of supply held in profit has recovered to 85%, indicating most holders remain in profit despite recent volatility. Realized capitalization growth suggests organic capital inflow rather than speculative trading." - } - ] - } - }, - { - id: 2, - title: "Week On-Chain #2 2026", - excerpt: "Bitcoin shows early signs of stabilization as exchange outflows accelerate. Network fundamentals remain strong despite price volatility.", - date: "Jan 9, 2026", - readTime: "8 min read", - image: image2, - category: "Week On-chain", - tag: "Free", - badgeColor: "#22c55e", - isFeatured: true, - gradient: "linear-gradient(135deg, #22c55e30, #9d4edd20)", - content: { - toc: ["Weekly Summary", "Exchange Flows", "Miner Activity", "Network Health", "Trading Volume"], - sections: [ - { - heading: "Weekly Summary", - text: "The second week of 2026 shows Bitcoin attempting to establish a new equilibrium. Exchange net outflows totaled 15,000 BTC this week, the highest since November 2025." - }, - { - heading: "Exchange Flows", - text: "Major exchanges recorded significant outflows, particularly from institutional custody solutions. This suggests accumulation by long-term investors despite uncertain price action." - } - ] - } - }, - { - id: 3, - title: "Market Pulse: January 2026", - excerpt: "Bitcoin volatility compresses as options markets signal uncertainty. Dealer gamma positioning suggests potential for explosive moves.", - date: "Jan 8, 2026", - readTime: "10 min read", - image: image3, - category: "Market Pulse", - tag: "Premium", - badgeColor: "#9d4edd", - isFeatured: true, - gradient: "linear-gradient(135deg, #9d4edd30, #f59e0b20)", - content: { - toc: ["Volatility Analysis", "Options Positioning", "Liquidity Conditions", "Market Sentiment", "Risk Assessment"], - sections: [ - { - heading: "Volatility Analysis", - text: "Bitcoin's 30-day realized volatility has compressed to 45%, approaching yearly lows. This compression often precedes significant directional moves." - }, - { - heading: "Options Positioning", - text: "Dealer gamma exposure is turning positive near current price levels, creating potential for accelerated moves should key technical levels break." - } - ] - } - }, - { - id: 4, - title: "Ethereum: The Merge Anniversary Report", - excerpt: "One year post-Merge: analyzing Ethereum's transition to proof-of-stake and its impact on supply dynamics, security, and network economics.", - date: "Jan 7, 2026", - readTime: "15 min read", - image: image4, - category: "Research", - tag: "Premium", - badgeColor: "#f59e0b", - isFeatured: false, - gradient: "linear-gradient(135deg, #f59e0b30, #4559DC20)" - }, - { - id: 5, - title: "Altcoin Vector #35: Layer 2 Ecosystem", - excerpt: "Deep dive into Ethereum Layer 2 scaling solutions: Arbitrum, Optimism, zkSync, and StarkNet adoption metrics and value capture analysis.", - date: "Jan 6, 2026", - readTime: "14 min read", - image: image5, - category: "Vector", - tag: "Premium", - badgeColor: "#4559DC", - isFeatured: false, - gradient: "linear-gradient(135deg, #4559DC30, #22c55e20)" - }, - { - id: 6, - title: "Bitcoin Mining Report: Q4 2025", - excerpt: "Analysis of Bitcoin mining industry post-halving: hash rate trends, miner revenue, and the transition to sustainable energy sources.", - date: "Jan 5, 2026", - readTime: "11 min read", - image: image6, - category: "Research", - tag: "Free", - badgeColor: "#22c55e", - isFeatured: false, - gradient: "linear-gradient(135deg, #22c55e30, #9d4edd20)" - }, - { - id: 7, - title: "DeFi Liquidity Dynamics 2026", - excerpt: "Comprehensive analysis of DeFi liquidity patterns across Ethereum, Solana, and emerging L2 ecosystems. TVL concentration and yield opportunities.", - date: "Jan 4, 2026", - readTime: "13 min read", - image: image7, - category: "Research", - tag: "Premium", - badgeColor: "#9d4edd", - isFeatured: false, - gradient: "linear-gradient(135deg, #9d4edd30, #f59e0b20)" - }, - { - id: 8, - title: "Institutional Adoption Tracker", - excerpt: "Monthly update on institutional Bitcoin and Ethereum investments: ETF flows, corporate treasuries, and regulated product growth.", - date: "Jan 3, 2026", - readTime: "9 min read", - image: image8, - category: "Market Intelligence", - tag: "Free", - badgeColor: "#f59e0b", - isFeatured: false, - gradient: "linear-gradient(135deg, #f59e0b30, #4559DC20)" - }, - { - id: 9, - title: "NFT Market Analysis: 2025 Review", - excerpt: "Year-end review of NFT market dynamics: trading volumes, collection performance, and the rise of utility-based NFTs.", - date: "Jan 2, 2026", - readTime: "10 min read", - image: image9, - category: "Research", - tag: "Free", - badgeColor: "#4559DC", - isFeatured: false, - gradient: "linear-gradient(135deg, #4559DC30, #22c55e20)" - }, - { - id: 10, - title: "Stablecoin Supply Analysis", - excerpt: "Tracking stablecoin supply changes as a proxy for liquidity conditions and capital rotation within crypto markets.", - date: "Jan 1, 2026", - readTime: "7 min read", - image: image10, - category: "Market Intelligence", - tag: "Free", - badgeColor: "#22c55e", - isFeatured: false, - gradient: "linear-gradient(135deg, #22c55e30, #9d4edd20)" - }, - { - id: 11, - title: "Bitcoin Macro Indicators", - excerpt: "Combining on-chain data with traditional macro indicators to forecast Bitcoin's performance in different economic regimes.", - date: "Dec 31, 2025", - readTime: "16 min read", - image: image11, - category: "Research", - tag: "Premium", - badgeColor: "#9d4edd", - isFeatured: false, - gradient: "linear-gradient(135deg, #9d4edd30, #f59e0b20)" - }, - { - id: 12, - title: "Lightning Network Growth Report", - excerpt: "Analysis of Bitcoin Lightning Network adoption: capacity growth, channel dynamics, and real-world payment usage.", - date: "Dec 30, 2025", - readTime: "12 min read", - image: image12, - category: "Research", - tag: "Free", - badgeColor: "#f59e0b", - isFeatured: false, - gradient: "linear-gradient(135deg, #f59e0b30, #4559DC20)" - }, - { - id: 13, - title: "Crypto Derivatives Landscape", - excerpt: "Comprehensive overview of crypto derivatives markets: futures, options, and perpetual swaps across major exchanges.", - date: "Dec 29, 2025", - readTime: "14 min read", - image: image13, - category: "Market Intelligence", - tag: "Premium", - badgeColor: "#4559DC", - isFeatured: false, - gradient: "linear-gradient(135deg, #4559DC30, #22c55e20)" - }, - { - id: 14, - title: "Ethereum Staking Economics", - excerpt: "Deep dive into Ethereum staking yields, validator economics, and the impact of restaking protocols on network security.", - date: "Dec 28, 2025", - readTime: "13 min read", - image: image14, - category: "Research", - tag: "Premium", - badgeColor: "#22c55e", - isFeatured: false, - gradient: "linear-gradient(135deg, #22c55e30, #9d4edd20)" - }, - { - id: 15, - title: "Cross-Chain Bridge Security", - excerpt: "Analysis of security practices and vulnerabilities in major cross-chain bridges following recent exploit incidents.", - date: "Dec 27, 2025", - readTime: "11 min read", - image: image15, - category: "Research", - tag: "Free", - badgeColor: "#9d4edd", - isFeatured: false, - gradient: "linear-gradient(135deg, #9d4edd30, #f59e0b20)" - }, - { - id: 16, - title: "Bitcoin Halving Impact Study", - excerpt: "Historical analysis of previous Bitcoin halvings and data-driven projections for the 2024 halving's market impact.", - date: "Dec 26, 2025", - readTime: "15 min read", - image: image16, - category: "Research", - tag: "Premium", - badgeColor: "#f59e0b", - isFeatured: false, - gradient: "linear-gradient(135deg, #f59e0b30, #4559DC20)" - }, - { - id: 17, - title: "Regulatory Developments Tracker", - excerpt: "Monthly update on global crypto regulatory developments and their potential market implications.", - date: "Dec 25, 2025", - readTime: "8 min read", - image: image17, - category: "Market Intelligence", - tag: "Free", - badgeColor: "#4559DC", - isFeatured: false, - gradient: "linear-gradient(135deg, #4559DC30, #22c55e20)" - }, - { - id: 18, - title: "Smart Contract Audit Trends", - excerpt: "Analysis of smart contract security audit findings and emerging best practices in Web3 development.", - date: "Dec 24, 2025", - readTime: "12 min read", - image: image18, - category: "Research", - tag: "Premium", - badgeColor: "#22c55e", - isFeatured: false, - gradient: "linear-gradient(135deg, #22c55e30, #9d4edd20)" - }, - { - id: 19, - title: "Crypto Venture Capital Report", - excerpt: "Q4 2025 analysis of venture capital flows into crypto and blockchain startups across different verticals.", - date: "Dec 23, 2025", - readTime: "10 min read", - image: image19, - category: "Market Intelligence", - tag: "Free", - badgeColor: "#9d4edd", - isFeatured: false, - gradient: "linear-gradient(135deg, #9d4edd30, #f59e0b20)" - }, - { - id: 20, - title: "MEV (Miner Extractable Value) Research", - excerpt: "Comprehensive study of MEV in Ethereum and other PoS networks: detection, quantification, and mitigation strategies.", - date: "Dec 22, 2025", - readTime: "16 min read", - image: image20, - category: "Research", - tag: "Premium", - badgeColor: "#f59e0b", - isFeatured: false, - gradient: "linear-gradient(135deg, #f59e0b30, #4559DC20)" - }, - { - id: 21, - title: "Bitcoin Adoption Metrics", - excerpt: "Tracking Bitcoin adoption through on-chain metrics: active addresses, new entities, and transaction patterns.", - date: "Dec 21, 2025", - readTime: "9 min read", - image: image21, - category: "Market Intelligence", - tag: "Free", - badgeColor: "#4559DC", - isFeatured: false, - gradient: "linear-gradient(135deg, #4559DC30, #22c55e20)" - }, - { - id: 22, - title: "Zero-Knowledge Proof Applications", - excerpt: "Exploring practical applications of ZK-proofs in blockchain scalability, privacy, and interoperability solutions.", - date: "Dec 20, 2025", - readTime: "14 min read", - image: image22, - category: "Research", - tag: "Premium", - badgeColor: "#22c55e", - isFeatured: false, - gradient: "linear-gradient(135deg, #22c55e30, #9d4edd20)" - }, - { - id: 23, - title: "Crypto Market Correlation Study", - excerpt: "Analysis of correlation patterns between crypto assets and traditional financial markets under different regimes.", - date: "Dec 19, 2025", - readTime: "11 min read", - image: image23, - category: "Research", - tag: "Free", - badgeColor: "#9d4edd", - isFeatured: false, - gradient: "linear-gradient(135deg, #9d4edd30, #f59e0b20)" - }, - { - id: 24, - title: "DAO Governance Analysis", - excerpt: "Study of DAO governance patterns: voter participation, proposal success rates, and treasury management practices.", - date: "Dec 18, 2025", - readTime: "13 min read", - image: image24, - category: "Research", - tag: "Premium", - badgeColor: "#f59e0b", - isFeatured: false, - gradient: "linear-gradient(135deg, #f59e0b30, #4559DC20)" - }, - { - id: 25, - title: "Crypto Tax Reporting Guide", - excerpt: "Comprehensive guide to crypto tax reporting requirements across major jurisdictions for 2025 tax year.", - date: "Dec 17, 2025", - readTime: "10 min read", - image: image25, - category: "Partner Reports", - tag: "Free", - badgeColor: "#4559DC", - isFeatured: false, - gradient: "linear-gradient(135deg, #4559DC30, #22c55e20)" - }, - { - id: 26, - title: "Bitcoin Technical Analysis", - excerpt: "Combining on-chain data with technical analysis to identify key support and resistance levels for Bitcoin.", - date: "Dec 16, 2025", - readTime: "8 min read", - image: image26, - category: "Market Vectors", - tag: "Premium", - badgeColor: "#22c55e", - isFeatured: false, - gradient: "linear-gradient(135deg, #22c55e30, #9d4edd20)" - }, - { - id: 27, - title: "Web3 Social Media Trends", - excerpt: "Analysis of emerging Web3 social media platforms and their token economic models compared to traditional social media.", - date: "Dec 15, 2025", - readTime: "12 min read", - image: image27, - category: "Research", - tag: "Free", - badgeColor: "#9d4edd", - isFeatured: false, - gradient: "linear-gradient(135deg, #9d4edd30, #f59e0b20)" - }, - { - id: 28, - title: "Crypto Insurance Market", - excerpt: "Overview of the growing crypto insurance market: coverage options, premium trends, and risk assessment methodologies.", - date: "Dec 14, 2025", - readTime: "11 min read", - image: image27, - category: "Market Intelligence", - tag: "Premium", - badgeColor: "#f59e0b", - isFeatured: false, - gradient: "linear-gradient(135deg, #f59e0b30, #4559DC20)" - }, - { - id: 29, - title: "Bitcoin Layer 2 Solutions", - excerpt: "Comparative analysis of Bitcoin Layer 2 scaling solutions: Lightning Network, Stacks, Rootstock, and emerging protocols.", - date: "Dec 13, 2025", - readTime: "14 min read", - image: image29, - category: "Research", - tag: "Free", - badgeColor: "#4559DC", - isFeatured: false, - gradient: "linear-gradient(135deg, #4559DC30, #22c55e20)" - }, - { - id: 30, - title: "Crypto Market Forecast 2026", - excerpt: "Data-driven forecast for crypto markets in 2026 based on historical patterns, on-chain indicators, and macro trends.", - date: "Dec 12, 2025", - readTime: "15 min read", - image: image30, - category: "Research", - tag: "Premium", - badgeColor: "#22c55e", - isFeatured: false, - gradient: "linear-gradient(135deg, #22c55e30, #9d4edd20)" - } - ]; -}; +import { generateBlogPosts } from "../data/blogData"; export default function Blog() { const navigate = useNavigate(); @@ -677,4 +196,4 @@ export default function Blog() { ); -} \ No newline at end of file +} diff --git a/src/components/BlogDetail.jsx b/src/components/BlogDetail.jsx index e1c4efc..9514405 100644 --- a/src/components/BlogDetail.jsx +++ b/src/components/BlogDetail.jsx @@ -11,7 +11,7 @@ import { FiExternalLink, } from "react-icons/fi"; import "./Blog.css"; -import { generateBlogPosts } from "./Blog"; +import { generateBlogPosts } from "../data/blogData"; const BlogDetail = () => { const { id, slug } = useParams(); diff --git a/src/components/Contributors.jsx b/src/components/Contributors.jsx index 729390c..9e5acf0 100644 --- a/src/components/Contributors.jsx +++ b/src/components/Contributors.jsx @@ -63,7 +63,7 @@ const getRankFromPoints = (points) => { const rankClassCache = new Map(); const getRankClass = (rank) => { if (rankClassCache.has(rank)) return rankClassCache.get(rank); - const cls = rank.toLowerCase().replace(/ /g, "-").replace(/[🥇🥈🥉]/g, "").replace(/-$/, ""); + const cls = rank.toLowerCase().replace(/ /g, "-").replace(/[🥇🥈🥉]/gu, "").replace(/-$/, ""); rankClassCache.set(rank, cls); return cls; }; @@ -279,6 +279,18 @@ const Contributors = () => { return result; }, [contributors, debouncedSearch, selectedRankFilter, sortBy]); + // Lock body scroll when modal is open + useEffect(() => { + if (showModal) { + document.body.style.overflow = 'hidden'; + } else { + document.body.style.overflow = 'unset'; + } + return () => { + document.body.style.overflow = 'unset'; + }; + }, [showModal]); + const handleOpenModal = useCallback((contributor) => { setSelectedContributor(contributor); setShowModal(true); diff --git a/src/components/Features.jsx b/src/components/Features.jsx index 336ef98..72fb933 100644 --- a/src/components/Features.jsx +++ b/src/components/Features.jsx @@ -1,7 +1,6 @@ import React, { useEffect, useState } from "react"; import { Line } from "react-chartjs-2"; import "./Features.css"; -// eslint-disable-next-line no-unused-vars import { motion } from "framer-motion"; import { diff --git a/src/components/Login.jsx b/src/components/Login.jsx index 2aca274..768b3f4 100644 --- a/src/components/Login.jsx +++ b/src/components/Login.jsx @@ -2,7 +2,6 @@ import React, { useState } from "react"; import { Link, useNavigate } from "react-router-dom"; import { useAuth } from "../context/AuthContext"; import "./Login.css"; -// eslint-disable-next-line no-unused-vars import { motion } from "framer-motion"; import { FiMail, FiLock, FiEye, FiEyeOff } from "react-icons/fi"; import { notifyError, notifySuccess } from "../utils/notify"; diff --git a/src/components/Navbar.css b/src/components/Navbar.css index c038df0..b12837f 100644 --- a/src/components/Navbar.css +++ b/src/components/Navbar.css @@ -1338,6 +1338,7 @@ padding: 0.875rem 1rem; font-size: 0.95rem; font-weight: 600; + display: block; } .mobile-auth .navbar-btn-login { diff --git a/src/components/Navbar.jsx b/src/components/Navbar.jsx index d4daea4..7eaf399 100644 --- a/src/components/Navbar.jsx +++ b/src/components/Navbar.jsx @@ -1,13 +1,11 @@ import React, { useState, useEffect, useCallback } from "react"; import { useAuth } from "../context/AuthContext"; -import { useTheme } from "../context/ThemeContext"; import { Link, useNavigate, useLocation } from "react-router-dom"; import { FiLock, FiUser, FiLogOut, FiMail } from "react-icons/fi"; import "./Navbar.css"; function Navbar() { const { currentUser, logout, isEmailProvider } = useAuth(); - const { theme } = useTheme(); const navigate = useNavigate(); const location = useLocation(); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); diff --git a/src/components/Pricing.jsx b/src/components/Pricing.jsx index 33fc65e..46af52f 100644 --- a/src/components/Pricing.jsx +++ b/src/components/Pricing.jsx @@ -15,7 +15,6 @@ export default function Pricing() { const navigate = useNavigate(); const [billingCycle, setBillingCycle] = useState("monthly"); const [openFaqIndex, setOpenFaqIndex] = useState(null); - const [hoveredPlan, setHoveredPlan] = useState(null); const [scrollProgress, setScrollProgress] = useState(0); // FIXED: Proper scroll handler with cleanup @@ -213,7 +212,7 @@ export default function Pricing() { >
{post.excerpt}
- -{section.text}
- - {/* Example chart/visualization placeholder */} -Figure {index + 1}: {section.heading} data visualization
-We're preparing the detailed analysis and visualizations for this report.
-