From de388e7e7a28f67d085874a4a33a95f7c37b827b Mon Sep 17 00:00:00 2001
From: Toromo7
Date: Sun, 29 Mar 2026 22:54:05 +0100
Subject: [PATCH 1/2] feat: implement reusable Button component with variants
and loading states
---
frontend/package-lock.json | 112 +++++++++++++-----
frontend/src/app/Faq/page.tsx | 2 +-
frontend/src/app/community-courses/page.tsx | 31 ++---
frontend/src/app/contact/page.tsx | 47 ++++----
frontend/src/app/docs/page.tsx | 18 +--
frontend/src/app/events/page.tsx | 22 ++--
frontend/src/app/externaltools/page.tsx | 4 +-
frontend/src/app/login/page.tsx | 6 +-
frontend/src/app/markets/page.tsx | 4 +-
.../profile/components/YourCoursesCard.tsx | 2 +-
frontend/src/app/signin/page.tsx | 6 +-
frontend/src/app/test-buttons/page.tsx | 28 +++++
frontend/src/component/CompetitionsJoined.tsx | 6 +-
.../src/component/CourseCompletionButton.tsx | 2 +-
.../src/component/CourseCompletionModal.tsx | 68 +++++------
frontend/src/component/Header.tsx | 6 +-
frontend/src/component/Homepage/Faq.tsx | 6 +-
.../src/component/Homepage/HeroSection.tsx | 18 +--
.../src/component/Homepage/Hero_section.tsx | 4 +-
.../src/component/Homepage/HowItWorks.tsx | 4 +-
frontend/src/component/QuickActions.tsx | 5 +-
frontend/src/component/RewardsWalletCard.tsx | 6 +-
frontend/src/component/coursenav.tsx | 32 ++---
frontend/src/component/dashboard-shell.tsx | 24 ++--
.../events/EventsCompetitionsHero.tsx | 4 +-
.../leaderboard/LeaderboardFilters.tsx | 6 +-
.../leaderboard/LeaderboardOverview.tsx | 6 +-
frontend/src/component/resources/Footer.tsx | 2 +-
frontend/src/component/resources/Header.tsx | 2 +-
.../component/rewards/RewardHistoryTable.tsx | 2 +-
.../src/component/rewards/RewardsOverview.tsx | 2 +-
frontend/src/component/trading/MarketRow.tsx | 4 +-
.../src/component/trading/MarketSearchBar.tsx | 4 +-
.../src/component/trading/TradingTabs.tsx | 2 +-
frontend/src/components/Button.tsx | 52 ++++++++
35 files changed, 338 insertions(+), 211 deletions(-)
create mode 100644 frontend/src/app/test-buttons/page.tsx
create mode 100644 frontend/src/components/Button.tsx
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 11ecc57c..4f5dd3ed 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -77,7 +77,6 @@
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
"integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@babel/code-frame": "^7.29.0",
"@babel/generator": "^7.29.0",
@@ -365,6 +364,7 @@
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
"integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
"license": "Apache-2.0",
+ "peer": true,
"dependencies": {
"@eslint/object-schema": "^2.1.7",
"debug": "^4.3.1",
@@ -379,6 +379,7 @@
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
"integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
"license": "Apache-2.0",
+ "peer": true,
"dependencies": {
"@eslint/core": "^0.17.0"
},
@@ -391,6 +392,7 @@
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
"integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
"license": "Apache-2.0",
+ "peer": true,
"dependencies": {
"@types/json-schema": "^7.0.15"
},
@@ -403,6 +405,7 @@
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz",
"integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"ajv": "^6.14.0",
"debug": "^4.3.2",
@@ -426,6 +429,7 @@
"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=18"
},
@@ -438,6 +442,7 @@
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz",
"integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -450,6 +455,7 @@
"resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
"integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
"license": "Apache-2.0",
+ "peer": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
@@ -459,6 +465,7 @@
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
"integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
"license": "Apache-2.0",
+ "peer": true,
"dependencies": {
"@eslint/core": "^0.17.0",
"levn": "^0.4.1"
@@ -545,6 +552,7 @@
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
"integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
"license": "Apache-2.0",
+ "peer": true,
"engines": {
"node": ">=18.18.0"
}
@@ -554,6 +562,7 @@
"resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
"integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
"license": "Apache-2.0",
+ "peer": true,
"dependencies": {
"@humanfs/core": "^0.19.1",
"@humanwhocodes/retry": "^0.4.0"
@@ -567,6 +576,7 @@
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
"license": "Apache-2.0",
+ "peer": true,
"engines": {
"node": ">=12.22"
},
@@ -580,6 +590,7 @@
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
"integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
"license": "Apache-2.0",
+ "peer": true,
"engines": {
"node": ">=18.18"
},
@@ -2257,13 +2268,15 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@types/json5": {
"version": "0.0.29",
@@ -2286,7 +2299,6 @@
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
"integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
"license": "MIT",
- "peer": true,
"dependencies": {
"csstype": "^3.2.2"
}
@@ -2297,7 +2309,6 @@
"integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
"devOptional": true,
"license": "MIT",
- "peer": true,
"peerDependencies": {
"@types/react": "^19.2.0"
}
@@ -2382,7 +2393,6 @@
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.2.tgz",
"integrity": "sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.57.2",
"@typescript-eslint/types": "8.57.2",
@@ -2895,6 +2905,7 @@
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"license": "MIT",
+ "peer": true,
"peerDependencies": {
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
@@ -2904,6 +2915,7 @@
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
"integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
@@ -2920,6 +2932,7 @@
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -2934,7 +2947,8 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "license": "Python-2.0"
+ "license": "Python-2.0",
+ "peer": true
},
"node_modules/aria-query": {
"version": "5.3.2",
@@ -3224,7 +3238,6 @@
}
],
"license": "MIT",
- "peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.9.0",
"caniuse-lite": "^1.0.30001759",
@@ -3315,6 +3328,7 @@
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=6"
}
@@ -3344,6 +3358,7 @@
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -3387,6 +3402,7 @@
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -3398,7 +3414,8 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/concat-map": {
"version": "0.0.1",
@@ -3417,6 +3434,7 @@
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -3510,7 +3528,8 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/define-data-property": {
"version": "1.1.4",
@@ -3792,6 +3811,7 @@
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=10"
},
@@ -3970,7 +3990,6 @@
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
"integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@rtsao/scc": "^1.1.0",
"array-includes": "^3.1.9",
@@ -4116,6 +4135,7 @@
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
"integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
"license": "BSD-2-Clause",
+ "peer": true,
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^5.2.0"
@@ -4132,6 +4152,7 @@
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"license": "Apache-2.0",
+ "peer": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -4144,6 +4165,7 @@
"resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
"integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
"license": "BSD-2-Clause",
+ "peer": true,
"dependencies": {
"acorn": "^8.15.0",
"acorn-jsx": "^5.3.2",
@@ -4161,6 +4183,7 @@
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
"integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
"license": "BSD-3-Clause",
+ "peer": true,
"dependencies": {
"estraverse": "^5.1.0"
},
@@ -4173,6 +4196,7 @@
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"license": "BSD-2-Clause",
+ "peer": true,
"dependencies": {
"estraverse": "^5.2.0"
},
@@ -4202,7 +4226,8 @@
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/fast-glob": {
"version": "3.3.1",
@@ -4236,13 +4261,15 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/fastq": {
"version": "1.20.1",
@@ -4265,6 +4292,7 @@
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
"integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"flat-cache": "^4.0.0"
},
@@ -4289,6 +4317,7 @@
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"locate-path": "^6.0.0",
"path-exists": "^4.0.0"
@@ -4305,6 +4334,7 @@
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
"integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"flatted": "^3.2.9",
"keyv": "^4.5.4"
@@ -4317,7 +4347,8 @@
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
"integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/for-each": {
"version": "0.3.5",
@@ -4488,6 +4519,7 @@
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"is-glob": "^4.0.3"
},
@@ -4559,6 +4591,7 @@
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=8"
}
@@ -4669,6 +4702,7 @@
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">= 4"
}
@@ -4678,6 +4712,7 @@
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
"integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
@@ -4694,6 +4729,7 @@
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=0.8.19"
}
@@ -5110,7 +5146,8 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/iterator.prototype": {
"version": "1.1.5",
@@ -5147,7 +5184,6 @@
"integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
"devOptional": true,
"license": "MIT",
- "peer": true,
"bin": {
"jiti": "lib/jiti-cli.mjs"
}
@@ -5163,6 +5199,7 @@
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
"integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"argparse": "^2.0.1"
},
@@ -5186,19 +5223,22 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
"integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/json5": {
"version": "2.2.3",
@@ -5232,6 +5272,7 @@
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
"integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"json-buffer": "3.0.1"
}
@@ -5259,6 +5300,7 @@
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
@@ -5533,6 +5575,7 @@
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"p-locate": "^5.0.0"
},
@@ -5547,7 +5590,8 @@
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/loose-envify": {
"version": "1.4.0",
@@ -5942,6 +5986,7 @@
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
"integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
@@ -5976,6 +6021,7 @@
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"yocto-queue": "^0.1.0"
},
@@ -5991,6 +6037,7 @@
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"p-limit": "^3.0.2"
},
@@ -6006,6 +6053,7 @@
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"callsites": "^3.0.0"
},
@@ -6018,6 +6066,7 @@
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=8"
}
@@ -6027,6 +6076,7 @@
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=8"
}
@@ -6098,6 +6148,7 @@
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">= 0.8.0"
}
@@ -6118,6 +6169,7 @@
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=6"
}
@@ -6147,7 +6199,6 @@
"resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
"integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -6157,7 +6208,6 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz",
"integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==",
"license": "MIT",
- "peer": true,
"dependencies": {
"scheduler": "^0.27.0"
},
@@ -6262,6 +6312,7 @@
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=4"
}
@@ -6484,6 +6535,7 @@
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"shebang-regex": "^3.0.0"
},
@@ -6496,6 +6548,7 @@
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=8"
}
@@ -6721,6 +6774,7 @@
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=8"
},
@@ -6756,6 +6810,7 @@
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -6825,8 +6880,7 @@
"version": "0.182.0",
"resolved": "https://registry.npmjs.org/three/-/three-0.182.0.tgz",
"integrity": "sha512-GbHabT+Irv+ihI1/f5kIIsZ+Ef9Sl5A1Y7imvS5RQjWgtTPfPnZ43JmlYI7NtCRDK9zir20lQpfg8/9Yd02OvQ==",
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/tinyglobby": {
"version": "0.2.15",
@@ -6866,7 +6920,6 @@
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
"integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=12"
},
@@ -6943,6 +6996,7 @@
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"prelude-ls": "^1.2.1"
},
@@ -7029,7 +7083,6 @@
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"license": "Apache-2.0",
- "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -7155,6 +7208,7 @@
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"license": "BSD-2-Clause",
+ "peer": true,
"dependencies": {
"punycode": "^2.1.0"
}
@@ -7173,6 +7227,7 @@
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"isexe": "^2.0.0"
},
@@ -7273,6 +7328,7 @@
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
"integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -7288,6 +7344,7 @@
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=10"
},
@@ -7300,7 +7357,6 @@
"resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
"integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==",
"license": "MIT",
- "peer": true,
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
diff --git a/frontend/src/app/Faq/page.tsx b/frontend/src/app/Faq/page.tsx
index 94f9089e..7e55e790 100644
--- a/frontend/src/app/Faq/page.tsx
+++ b/frontend/src/app/Faq/page.tsx
@@ -86,7 +86,7 @@ export default function CryptoFAQ() {
key={item.id}
className="overflow-hidden rounded-2xl border border-white/10 bg-[#0f172a]/90"
>
- toggleFAQ(item.id)}
diff --git a/frontend/src/app/community-courses/page.tsx b/frontend/src/app/community-courses/page.tsx
index f841398e..209167a4 100644
--- a/frontend/src/app/community-courses/page.tsx
+++ b/frontend/src/app/community-courses/page.tsx
@@ -1,4 +1,5 @@
"use client";
+import Button from '@/components/Button';
import { useState, useEffect } from "react";
import Coursenav from "@/component/coursenav";
import CommunityCard from "@/component/CommunityCard";
@@ -172,13 +173,7 @@ export default function CommunityCoursesPage() {
Explore Courses Created By The Community Or Share Your Own
-
- Create Course
-
+
{/* Search and Create Course */}
@@ -216,19 +211,15 @@ export default function CommunityCoursesPage() {
{ id: "top rated", label: "Top Rated" },
{ id: "new", label: "New" },
].map((filter) => (
- setSelectedTag(filter.id)}
- className={`px-4 py-2 rounded-full ${
- selectedTag === filter.id
- ? "bg-black text-white shadow-lg"
- : "bg-gray-400 bg-opacity-50 text-gray-200 hover:bg-opacity-70 hover:shadow"
- }`}
- >
- {filter.label}
-
+ setSelectedTag(filter.id)}
+ className="rounded-full px-4 py-2"
+ aria-pressed={selectedTag === filter.id}
+>
+ {filter.label}
+
))}
diff --git a/frontend/src/app/contact/page.tsx b/frontend/src/app/contact/page.tsx
index 97bb7830..98dc69cb 100644
--- a/frontend/src/app/contact/page.tsx
+++ b/frontend/src/app/contact/page.tsx
@@ -1,5 +1,5 @@
"use client";
-
+import Button from '@/components/Button';
import { useState } from "react";
import Link from "next/link";
import { ChevronLeft, Send, CheckCircle, AlertCircle, MessageSquare, Twitter, Github } from "lucide-react";
@@ -107,24 +107,25 @@ export default function ContactPage() {
Thanks for reaching out. We typically respond within 24–48 hours.
- setStatus("idle")}
- className="mt-2 rounded-xl bg-[#4FD1C5] px-6 py-2.5 text-sm font-semibold text-[#0f172a] transition hover:bg-[#38b2ac]"
- >
- Send another message
-
+ setStatus("idle")}
+>
+ Try again
+
) : status === "error" ? (
Something went wrong
Please try again or reach us directly via social media.
-
setStatus("idle")}
- className="mt-2 rounded-xl bg-red-500/20 px-6 py-2.5 text-sm font-semibold text-red-300 transition hover:bg-red-500/30"
- >
- Try again
-
+
setStatus("idle")}
+ className="mt-2"
+>
+ Try again
+
) : (
)}
diff --git a/frontend/src/app/docs/page.tsx b/frontend/src/app/docs/page.tsx
index a6477063..e2d5634a 100644
--- a/frontend/src/app/docs/page.tsx
+++ b/frontend/src/app/docs/page.tsx
@@ -1,5 +1,5 @@
"use client";
-
+import Button from '@/components/Button';
import React, { useState } from "react";
import Header from "@/component/Header";
import Footer from "@/component/Footer";
@@ -180,9 +180,9 @@ export default function DocsPage() {
{section.external ? : }
) : (
-
+
Coming Soon
-
+
)}
@@ -205,12 +205,12 @@ export default function DocsPage() {
New to prediction markets? Understand how prices reflect probability, how liquidity works, and why decentralized markets offer superior insight compared to traditional polling.
-
+
Start Learning
-
-
+
+
View All Guides
-
+
@@ -231,13 +231,13 @@ export default function DocsPage() {
key={idx}
className="border border-white/10 rounded-2xl bg-white/5 overflow-hidden transition-colors hover:border-white/20"
>
- setActiveFaq(activeFaq === idx ? null : idx)}
className="w-full flex items-center justify-between p-6 text-left"
>
{faq.question}
-
+
{activeFaq === idx && (
-
+
Browse Events
-
-
+
+
View Competitions
-
+
@@ -151,7 +151,7 @@ export default function EventsPage() {
{/* Tabs */}
{tabs.map((tab) => (
- setActiveTab(tab.id)}
className={`px-6 py-2 rounded-lg font-medium transition ${
@@ -161,20 +161,20 @@ export default function EventsPage() {
}`}
>
{tab.label}
-
+
))}
{/* Filter and Sort */}
-
+
Filter
-
-
+
+
Most Popular
-
+
diff --git a/frontend/src/app/externaltools/page.tsx b/frontend/src/app/externaltools/page.tsx
index 0a8e4ca7..67669ae9 100644
--- a/frontend/src/app/externaltools/page.tsx
+++ b/frontend/src/app/externaltools/page.tsx
@@ -103,7 +103,7 @@ const Resources = () => {
{item.description}
-
+
Learn More In Our Courses
diff --git a/frontend/src/app/login/page.tsx b/frontend/src/app/login/page.tsx
index b2a13a7b..c386bd76 100644
--- a/frontend/src/app/login/page.tsx
+++ b/frontend/src/app/login/page.tsx
@@ -53,7 +53,7 @@ const Login: NextPage = () => {
{/* OAuth Buttons */}
- {
/>
Google
- {
-
diff --git a/frontend/src/app/markets/page.tsx b/frontend/src/app/markets/page.tsx
index c8810b31..7b38f7bd 100644
--- a/frontend/src/app/markets/page.tsx
+++ b/frontend/src/app/markets/page.tsx
@@ -292,7 +292,7 @@ export default function MarketsPage() {
{filteredMarkets.map((market) => (
- setSelectedId(market.id)}
@@ -402,7 +402,7 @@ export default function MarketsPage() {
-
diff --git a/frontend/src/app/profile/components/YourCoursesCard.tsx b/frontend/src/app/profile/components/YourCoursesCard.tsx
index e3e67017..10485432 100644
--- a/frontend/src/app/profile/components/YourCoursesCard.tsx
+++ b/frontend/src/app/profile/components/YourCoursesCard.tsx
@@ -28,7 +28,7 @@ export default function YourCoursesCard({ courses }: { courses: Course[] }) {
{/* Tabs fuera del card principal */}
{tabs.map((tab) => (
-
setActiveTab(tab.value)}
diff --git a/frontend/src/app/signin/page.tsx b/frontend/src/app/signin/page.tsx
index 1c179de2..13972960 100644
--- a/frontend/src/app/signin/page.tsx
+++ b/frontend/src/app/signin/page.tsx
@@ -46,7 +46,7 @@ const SignUp: NextPage = () => {
{/* OAuth Buttons */}
-
{
Google
-
{
Must be at least 8 character Long
-
diff --git a/frontend/src/app/test-buttons/page.tsx b/frontend/src/app/test-buttons/page.tsx
new file mode 100644
index 00000000..def13ff3
--- /dev/null
+++ b/frontend/src/app/test-buttons/page.tsx
@@ -0,0 +1,28 @@
+import Button from '@/components/Button';
+
+export default function ButtonTestPage() {
+ return (
+
+
Button Variant Gallery
+
+
+
+
Primary (Orange)
+
Primary Action
+
+
+
Secondary (Teal)
+
Secondary Action
+
+
+
+
+
States & Loading
+
+ Saving Changes...
+ Locked Button
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/frontend/src/component/CompetitionsJoined.tsx b/frontend/src/component/CompetitionsJoined.tsx
index 3b20e530..a12023a6 100644
--- a/frontend/src/component/CompetitionsJoined.tsx
+++ b/frontend/src/component/CompetitionsJoined.tsx
@@ -1,5 +1,5 @@
"use client";
-
+import Button from '@/components/Button';
import { ChevronRight } from "lucide-react";
interface Competition {
@@ -53,10 +53,10 @@ export default function CompetitionsJoined() {
{/* Header */}
Competitions Joined
-
+
View All Competitions
-
+
{/* Competitions Grid */}
diff --git a/frontend/src/component/CourseCompletionButton.tsx b/frontend/src/component/CourseCompletionButton.tsx
index b125f6d6..93734fed 100644
--- a/frontend/src/component/CourseCompletionButton.tsx
+++ b/frontend/src/component/CourseCompletionButton.tsx
@@ -6,7 +6,7 @@ const CourseCompletionButton = () => {
return (
<>
- setIsModalOpen(true)}
className="px-4 py-2 bg-amber-500 hover:bg-amber-600 text-white rounded-lg font-medium transition-colors"
>
diff --git a/frontend/src/component/CourseCompletionModal.tsx b/frontend/src/component/CourseCompletionModal.tsx
index e33b1bf3..02bf1058 100644
--- a/frontend/src/component/CourseCompletionModal.tsx
+++ b/frontend/src/component/CourseCompletionModal.tsx
@@ -31,27 +31,27 @@ const CourseCompletionModal = ({ isOpen, onClose }: CourseCompletionModalProps)
}
};
- if (!isOpen) return null;
-
- return (
-
-
- {/* Header */}
-
-
- Stark Academy
-
-
+
+ {/* Header */}
+
+
+ Stark Academy
+
+
@@ -62,12 +62,12 @@ const CourseCompletionModal = ({ isOpen, onClose }: CourseCompletionModalProps)
{/* Content */}
-
-
+
+
CONGRATULATION ON FINISHING YOUR COURSE TIME TO CLAIM YOUR BADGE.
@@ -82,9 +82,9 @@ const CourseCompletionModal = ({ isOpen, onClose }: CourseCompletionModalProps)
{/* Action Buttons */}
-
-
@@ -124,4 +124,4 @@ const CourseCompletionModal = ({ isOpen, onClose }: CourseCompletionModalProps)
);
};
-export default CourseCompletionModal;
+export default CourseCompletionModal;
diff --git a/frontend/src/component/Header.tsx b/frontend/src/component/Header.tsx
index 34692307..2db10e26 100644
--- a/frontend/src/component/Header.tsx
+++ b/frontend/src/component/Header.tsx
@@ -1,5 +1,5 @@
"use client";
-
+import Button from '@/components/Button';
import Link from "next/link";
import { useEffect, useRef, useState } from "react";
import { usePathname } from "next/navigation";
@@ -137,9 +137,9 @@ export default function Header() {
☰
-
+
Connect Wallet
-
+
diff --git a/frontend/src/component/Homepage/Faq.tsx b/frontend/src/component/Homepage/Faq.tsx
index 9db9d660..01808a80 100644
--- a/frontend/src/component/Homepage/Faq.tsx
+++ b/frontend/src/component/Homepage/Faq.tsx
@@ -1,5 +1,5 @@
"use client";
-
+import Button from '@/components/Button';
import { useState } from "react";
import { ChevronDown } from "lucide-react";
import { motion, AnimatePresence } from "framer-motion";
@@ -67,7 +67,7 @@ export default function Faq() {
className="bg-gray-950/60 border border-[#1e2d45] rounded-lg"
>
{/* Question Row */}
-
toggle(index)}
className="w-full flex justify-between items-center px-6 py-5 text-left cursor-pointer"
aria-expanded={isOpen}
@@ -83,7 +83,7 @@ export default function Faq() {
}}
size={20}
/>
-
+
{/* Answer */}
diff --git a/frontend/src/component/Homepage/HeroSection.tsx b/frontend/src/component/Homepage/HeroSection.tsx
index 570e678a..4420e283 100644
--- a/frontend/src/component/Homepage/HeroSection.tsx
+++ b/frontend/src/component/Homepage/HeroSection.tsx
@@ -1,3 +1,4 @@
+import Button from '@/components/Button';
import Image from "next/image";
import UnifiedBackground from "./UnifiedBackground";
@@ -35,14 +36,15 @@ export default function HeroSection() {
-
-
- Explore Markets
-
-
- Read the Docs
-
-
+
+
+ Explore Markets
+
+
+
+ Read the Docs
+
+
diff --git a/frontend/src/component/Homepage/Hero_section.tsx b/frontend/src/component/Homepage/Hero_section.tsx
index a10f6686..043df6af 100644
--- a/frontend/src/component/Homepage/Hero_section.tsx
+++ b/frontend/src/component/Homepage/Hero_section.tsx
@@ -57,7 +57,7 @@ export default function Hero() {
{/* Buttons */}
-
+
-
+
-
+
Begin Your Journey
-
+
Watch Demo
diff --git a/frontend/src/component/QuickActions.tsx b/frontend/src/component/QuickActions.tsx
index ce7b7cbe..7c7133d9 100644
--- a/frontend/src/component/QuickActions.tsx
+++ b/frontend/src/component/QuickActions.tsx
@@ -1,3 +1,4 @@
+import Button from '@/components/Button';
import React from 'react';
// These icons are common in React projects.
// If they aren't installed, we can switch to simple emojis for now!
@@ -20,7 +21,7 @@ const QuickActions = () => {
{/* Requirement: Responsive Grid. 2 columns on mobile, 4 on tablet/desktop */}
{actions.map((item, index) => (
-
@@ -29,7 +30,7 @@ const QuickActions = () => {
{item.label}
-
+
))}
diff --git a/frontend/src/component/RewardsWalletCard.tsx b/frontend/src/component/RewardsWalletCard.tsx
index bb085d8e..c1934bd0 100644
--- a/frontend/src/component/RewardsWalletCard.tsx
+++ b/frontend/src/component/RewardsWalletCard.tsx
@@ -1,5 +1,5 @@
import { Wallet } from "lucide-react";
-
+import Button from '@/components/Button';
export default function RewardsWalletCard() {
return (
@@ -42,9 +42,9 @@ export default function RewardsWalletCard() {
{/* Button */}
-
+
Claim Rewards
-
+
);
}
diff --git a/frontend/src/component/coursenav.tsx b/frontend/src/component/coursenav.tsx
index 8f58b96d..3e901c48 100644
--- a/frontend/src/component/coursenav.tsx
+++ b/frontend/src/component/coursenav.tsx
@@ -31,7 +31,7 @@ const Navbar = () => {
{/* Course section */}
- {
{/* Trading section */}
-
{
{/* Airdrops */}
-
{
{/* Resources Section */}
- {
/>
)}
-
+
-
+
- {
{/* Mobile Hamburger */}
-
setMobileMenuOpen(true)}
@@ -156,13 +156,13 @@ const Navbar = () => {
Menu
- setMobileMenuOpen(false)}>
+ setMobileMenuOpen(false)}>
{/* Mobile menu items with consistent styling */}
-
{
@@ -181,7 +181,7 @@ const Navbar = () => {
Courses
-
{
Trading
-
{
Airdrops
-
{
@@ -231,13 +231,13 @@ const Navbar = () => {
-
+
-
+
-
0x71A4...9cF2
-
Disconnect
-
+
@@ -132,21 +132,21 @@ function TopNavigation() {
-
Make Prediction
-
-
+
Create Competition
-
+
@@ -177,14 +177,14 @@ export function DashboardShell({ children }: DashboardShellProps) {
- setMobileOpen(true)}
>
-
+
@@ -212,7 +212,7 @@ export function DashboardShell({ children }: DashboardShellProps) {
}`}
aria-hidden={!mobileOpen}
>
-
- setMobileOpen(false)}
>
-
+
setMobileOpen(false)} />
diff --git a/frontend/src/component/events/EventsCompetitionsHero.tsx b/frontend/src/component/events/EventsCompetitionsHero.tsx
index 15975220..de0a7cd0 100644
--- a/frontend/src/component/events/EventsCompetitionsHero.tsx
+++ b/frontend/src/component/events/EventsCompetitionsHero.tsx
@@ -57,7 +57,7 @@ export default function EventsCompetitionsHero() {
{tabs.map((tab) => (
- setActiveTab(tab)}
@@ -73,7 +73,7 @@ export default function EventsCompetitionsHero() {
activeTab === tab ? "opacity-100" : "opacity-0",
)}
/>
-
+
))}
diff --git a/frontend/src/component/leaderboard/LeaderboardFilters.tsx b/frontend/src/component/leaderboard/LeaderboardFilters.tsx
index c5c6da9e..30622b45 100644
--- a/frontend/src/component/leaderboard/LeaderboardFilters.tsx
+++ b/frontend/src/component/leaderboard/LeaderboardFilters.tsx
@@ -1,7 +1,7 @@
"use client";
import { useState } from "react";
-
+import Button from '@/components/Button';
export type TimeRange = "daily" | "weekly" | "monthly" | "all-time";
export type Category = "all" | "crypto" | "sports" | "politics" | "custom";
export type SortBy = "points" | "win-rate" | "predictions";
@@ -58,7 +58,7 @@ export default function LeaderboardFilters({ onChange }: LeaderboardFiltersProps
{/* Time range pill group */}
{TIME_RANGES.map(({ label, value }) => (
-
{label}
-
+
))}
diff --git a/frontend/src/component/leaderboard/LeaderboardOverview.tsx b/frontend/src/component/leaderboard/LeaderboardOverview.tsx
index 0f7104f6..793f4901 100644
--- a/frontend/src/component/leaderboard/LeaderboardOverview.tsx
+++ b/frontend/src/component/leaderboard/LeaderboardOverview.tsx
@@ -1,5 +1,5 @@
import StatCard, { StatCardProps } from "../rewards/StatCard";
-
+import Button from '@/components/Button';
function UsersIcon() {
return (
-
View Full Rankings
-
+
{/* Stat cards grid */}
diff --git a/frontend/src/component/resources/Footer.tsx b/frontend/src/component/resources/Footer.tsx
index 93eb9b50..40349e24 100644
--- a/frontend/src/component/resources/Footer.tsx
+++ b/frontend/src/component/resources/Footer.tsx
@@ -19,7 +19,7 @@ const Footer = () => {
-
+
Join Telegram Group
diff --git a/frontend/src/component/resources/Header.tsx b/frontend/src/component/resources/Header.tsx
index bcb33053..2ef1dc9f 100644
--- a/frontend/src/component/resources/Header.tsx
+++ b/frontend/src/component/resources/Header.tsx
@@ -41,7 +41,7 @@ const Header = () => {
-
+
PH
diff --git a/frontend/src/component/rewards/RewardHistoryTable.tsx b/frontend/src/component/rewards/RewardHistoryTable.tsx
index 0b3d749f..7fe2be57 100644
--- a/frontend/src/component/rewards/RewardHistoryTable.tsx
+++ b/frontend/src/component/rewards/RewardHistoryTable.tsx
@@ -114,7 +114,7 @@ export default function RewardHistoryTable({
{/* Load More */}
{(hasMore || entries.length > 0) && (
- = ({
{volume}
- = ({
>
- = ({ searchValue, onSearch
/>
-
= ({ searchValue, onSearch
All tokens
-
= ({ activeTab, onTabChange }) =>
return (
{tabs.map((tab) => (
-
{
+ variant?: 'primary' | 'secondary' | 'danger' | 'ghost';
+ size?: 'sm' | 'md' | 'lg';
+ isLoading?: boolean; // Add this line!
+}
+
+const Button: React.FC = ({
+ variant = 'primary',
+ size = 'md',
+ isLoading = false,
+ className = '',
+ children,
+ ...props
+}) => {
+
+ const baseStyles = "inline-flex items-center justify-center font-semibold transition-all duration-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed";
+
+ const variants = {
+ primary: "bg-[#f97316] text-white hover:bg-[#ea580c] focus:ring-orange-500", // Orange
+ secondary: "bg-[#4FD1C5] text-black hover:bg-[#38b2ac] focus:ring-teal-400", // Teal
+ ghost: "border border-gray-700 text-gray-300 hover:bg-gray-800 hover:text-white focus:ring-gray-500",
+ danger: "bg-red-600 text-white hover:bg-red-700 focus:ring-red-500",
+ };
+
+ const sizes = {
+ sm: "px-3 py-1.5 text-xs",
+ md: "px-5 py-2.5 text-sm",
+ lg: "px-8 py-3.5 text-base",
+ };
+
+ return (
+
+ {/* If isLoading is true, show the spinning circle */}
+ {isLoading && (
+
+ )}
+
+ {/* This is your button text */}
+ {children}
+
+ );
+};
+
+export default Button;
\ No newline at end of file
From 0d1df38c65712c41504abff272f47654152cbf05 Mon Sep 17 00:00:00 2001
From: Toromo7
Date: Mon, 30 Mar 2026 00:51:29 +0100
Subject: [PATCH 2/2] fix: import Button in YourCoursesCard and fix type errors
---
frontend/src/app/Faq/page.tsx | 4 +--
frontend/src/app/externaltools/page.tsx | 5 +--
frontend/src/app/login/page.tsx | 7 ++--
frontend/src/app/markets/page.tsx | 6 ++--
.../profile/components/YourCoursesCard.tsx | 3 +-
frontend/src/app/signin/page.tsx | 7 ++--
.../src/component/CourseCompletionButton.tsx | 3 +-
.../src/component/CourseCompletionModal.tsx | 7 ++--
.../src/component/Homepage/Hero_section.tsx | 5 +--
.../src/component/Homepage/HowItWorks.tsx | 5 +--
frontend/src/component/coursenav.tsx | 34 +++++++++----------
frontend/src/component/resources/Footer.tsx | 3 +-
frontend/src/component/resources/Header.tsx | 3 +-
.../component/rewards/RewardHistoryTable.tsx | 4 +--
.../src/component/rewards/RewardsOverview.tsx | 4 +--
frontend/src/component/trading/MarketRow.tsx | 5 +--
.../src/component/trading/MarketSearchBar.tsx | 6 ++--
.../src/component/trading/TradingTabs.tsx | 4 +--
18 files changed, 63 insertions(+), 52 deletions(-)
diff --git a/frontend/src/app/Faq/page.tsx b/frontend/src/app/Faq/page.tsx
index 7e55e790..33de49e1 100644
--- a/frontend/src/app/Faq/page.tsx
+++ b/frontend/src/app/Faq/page.tsx
@@ -1,5 +1,5 @@
"use client";
-
+import Button from '@/components/Button';
import Link from "next/link";
import { useState } from "react";
import { ChevronLeft, Plus, Minus } from "lucide-react";
@@ -101,7 +101,7 @@ export default function CryptoFAQ() {
)}
-
+
{item.isOpen && (
diff --git a/frontend/src/app/externaltools/page.tsx b/frontend/src/app/externaltools/page.tsx
index 67669ae9..7191c081 100644
--- a/frontend/src/app/externaltools/page.tsx
+++ b/frontend/src/app/externaltools/page.tsx
@@ -1,4 +1,5 @@
"use client";
+import Button from '@/components/Button';
import Header from "@/component/resources/Header";
import Footer from "@/component/resources/Footer";
import React, { useState } from "react";
@@ -112,7 +113,7 @@ const Resources = () => {
View {item.name}
-
+
))}
@@ -128,7 +129,7 @@ const Resources = () => {
Learn More In Our Courses
-
+
diff --git a/frontend/src/app/login/page.tsx b/frontend/src/app/login/page.tsx
index c386bd76..2970aa4f 100644
--- a/frontend/src/app/login/page.tsx
+++ b/frontend/src/app/login/page.tsx
@@ -1,4 +1,5 @@
"use client";
+import Button from '@/components/Button';
import { useState } from "react";
import type { NextPage } from "next";
import Head from "next/head";
@@ -64,7 +65,7 @@ const Login: NextPage = () => {
className="w-5 h-5 mr-2"
/>
Google
-
+
{
>
Git Hub
-
+
{/* Divider */}
@@ -135,7 +136,7 @@ const Login: NextPage = () => {
className="w-full py-3 px-4 bg-purple-700 hover:bg-purple-600 text-white font-medium rounded-md focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2 focus:ring-offset-gray-900 mt-6"
>
Login
-
+
diff --git a/frontend/src/app/markets/page.tsx b/frontend/src/app/markets/page.tsx
index 7b38f7bd..0ae3d953 100644
--- a/frontend/src/app/markets/page.tsx
+++ b/frontend/src/app/markets/page.tsx
@@ -1,5 +1,5 @@
"use client";
-
+import Button from '@/components/Button';
import { useEffect, useMemo, useState } from "react";
import {
ArrowUpRight,
@@ -355,7 +355,7 @@ export default function MarketsPage() {
{market.traders.toLocaleString()} traders
-
+
))}
@@ -408,7 +408,7 @@ export default function MarketsPage() {
>
View market details
-
+
) : null}
diff --git a/frontend/src/app/profile/components/YourCoursesCard.tsx b/frontend/src/app/profile/components/YourCoursesCard.tsx
index 10485432..7880b93e 100644
--- a/frontend/src/app/profile/components/YourCoursesCard.tsx
+++ b/frontend/src/app/profile/components/YourCoursesCard.tsx
@@ -1,3 +1,4 @@
+import Button from '@/components/Button';
import { useState } from "react";
import { Progress } from "@/component/ui/progress";
import { BookOpen } from "lucide-react";
@@ -34,7 +35,7 @@ export default function YourCoursesCard({ courses }: { courses: Course[] }) {
onClick={() => setActiveTab(tab.value)}
>
{tab.label}
-
+
))}
{/* Card principal */}
diff --git a/frontend/src/app/signin/page.tsx b/frontend/src/app/signin/page.tsx
index 13972960..ff17a2e1 100644
--- a/frontend/src/app/signin/page.tsx
+++ b/frontend/src/app/signin/page.tsx
@@ -1,4 +1,5 @@
"use client";
+import Button from '@/components/Button';
import { useState } from "react";
import type { NextPage } from "next";
import Head from "next/head";
@@ -53,7 +54,7 @@ const SignUp: NextPage = () => {
>
Google
-
+
{
>
GitHub
-
+
{/* Divider */}
@@ -151,7 +152,7 @@ const SignUp: NextPage = () => {
className="w-full py-3 px-4 bg-purple-700 hover:bg-purple-600 text-white font-medium rounded-md focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2 focus:ring-offset-gray-900 mt-6"
>
Sign Up
-
+
diff --git a/frontend/src/component/CourseCompletionButton.tsx b/frontend/src/component/CourseCompletionButton.tsx
index 93734fed..08a2d0b7 100644
--- a/frontend/src/component/CourseCompletionButton.tsx
+++ b/frontend/src/component/CourseCompletionButton.tsx
@@ -1,4 +1,5 @@
import React, { useState } from 'react';
+import Button from '@/components/Button';
import CourseCompletionModal from './CourseCompletionModal';
const CourseCompletionButton = () => {
@@ -11,7 +12,7 @@ const CourseCompletionButton = () => {
className="px-4 py-2 bg-amber-500 hover:bg-amber-600 text-white rounded-lg font-medium transition-colors"
>
View Course Completion
-
+
-
+
@@ -100,7 +101,7 @@ const CourseCompletionModal = ({ isOpen, onClose }: CourseCompletionModalProps)
{badgeClaimed ? 'Claimed' : 'Claim Badge'}
>
)}
-
+
)}
-
+
diff --git a/frontend/src/component/Homepage/Hero_section.tsx b/frontend/src/component/Homepage/Hero_section.tsx
index 043df6af..cdf30eca 100644
--- a/frontend/src/component/Homepage/Hero_section.tsx
+++ b/frontend/src/component/Homepage/Hero_section.tsx
@@ -1,4 +1,5 @@
"use client";
+import Button from '@/components/Button';
import { useState, useEffect } from "react";
import { FaGraduationCap, FaTrophy } from "react-icons/fa";
import { motion } from "framer-motion";
@@ -82,7 +83,7 @@ export default function Hero() {
Start Learning Free
-
+
@@ -103,7 +104,7 @@ export default function Hero() {
Join Live Tournament
-
+
{/* Stats */}
diff --git a/frontend/src/component/Homepage/HowItWorks.tsx b/frontend/src/component/Homepage/HowItWorks.tsx
index e9a8c2b2..6c4c8b37 100644
--- a/frontend/src/component/Homepage/HowItWorks.tsx
+++ b/frontend/src/component/Homepage/HowItWorks.tsx
@@ -1,4 +1,5 @@
import { Card, CardContent } from "@/component/ui/card"
+import Button from '@/components/Button';
import { Star, Shield, Trophy, Award, Users, BookOpen, Gift } from "lucide-react"
@@ -313,10 +314,10 @@ export default function HowItWorks() {
Begin Your Journey
-
+
Watch Demo
-
+
diff --git a/frontend/src/component/coursenav.tsx b/frontend/src/component/coursenav.tsx
index 3e901c48..8438b371 100644
--- a/frontend/src/component/coursenav.tsx
+++ b/frontend/src/component/coursenav.tsx
@@ -1,5 +1,5 @@
"use client";
-
+import Button from '@/components/Button';
import { useState } from "react";
import { Dialog } from "@headlessui/react";
import { Moon, Menu, X, Bell } from "lucide-react";
@@ -48,7 +48,7 @@ const Navbar = () => {
/>
Courses
-
+
{/* Modal positioned directly under the button */}
{isCoursesOpen && (
{
className="w-6 h-6"
/>
Trading
-
+
{/* Airdrops */}
{
className="w-6 h-6"
/>
Airdrops
-
+
{/* Resources Section */}
@@ -109,7 +109,7 @@ const Navbar = () => {
/>
Resources
-
+
{/* Modal positioned directly under the button */}
{isResourcesOpen && (
{
-
+
-
+
{
onClick={() => router.push("/profile")}
>
PH
-
+
{/* Mobile Hamburger */}
@@ -143,7 +143,7 @@ const Navbar = () => {
className="cursor-pointer"
>
-
+
{/* Mobile Menu Dialog */}
@@ -158,7 +158,7 @@ const Navbar = () => {
Menu
setMobileMenuOpen(false)}>
-
+
{/* Mobile menu items with consistent styling */}
@@ -179,7 +179,7 @@ const Navbar = () => {
className="w-6 h-6"
/>
Courses
-
+
{
className="w-6 h-6"
/>
Trading
-
+
{
className="w-6 h-6"
/>
Airdrops
-
+
{
className="w-6 h-6"
/>
Resources
-
+
-
+
-
+
{
onClick={() => router.push("/profile")}
>
PH
-
+
diff --git a/frontend/src/component/resources/Footer.tsx b/frontend/src/component/resources/Footer.tsx
index 40349e24..69809e35 100644
--- a/frontend/src/component/resources/Footer.tsx
+++ b/frontend/src/component/resources/Footer.tsx
@@ -1,4 +1,5 @@
import { Twitter, Instagram, Github } from "lucide-react";
+import Button from '@/components/Button';
const Footer = () => {
return (
diff --git a/frontend/src/component/resources/Header.tsx b/frontend/src/component/resources/Header.tsx
index 2ef1dc9f..d0a61466 100644
--- a/frontend/src/component/resources/Header.tsx
+++ b/frontend/src/component/resources/Header.tsx
@@ -1,4 +1,5 @@
"use client";
+import Button from '@/components/Button';
import React, { useState } from "react";
import { Book, ChartLine, Gift, ScrollText, BellDot, Moon } from "lucide-react";
import Link from "next/link";
@@ -43,7 +44,7 @@ const Header = () => {
PH
-
+
diff --git a/frontend/src/component/rewards/RewardHistoryTable.tsx b/frontend/src/component/rewards/RewardHistoryTable.tsx
index 7fe2be57..19904b9e 100644
--- a/frontend/src/component/rewards/RewardHistoryTable.tsx
+++ b/frontend/src/component/rewards/RewardHistoryTable.tsx
@@ -1,5 +1,5 @@
"use client";
-
+import Button from '@/components/Button';
import RewardStatusBadge, { RewardStatus } from "./RewardStatusBadge";
import RewardTypeBadge, { RewardType } from "./RewardTypeBadge";
@@ -122,7 +122,7 @@ export default function RewardHistoryTable({
disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:border-gray-600 disabled:hover:text-gray-300"
>
{isLoading ? "Loading..." : "Load More"}
-
+
)}
diff --git a/frontend/src/component/rewards/RewardsOverview.tsx b/frontend/src/component/rewards/RewardsOverview.tsx
index 7f78911e..599e4b5c 100644
--- a/frontend/src/component/rewards/RewardsOverview.tsx
+++ b/frontend/src/component/rewards/RewardsOverview.tsx
@@ -1,5 +1,5 @@
import StatCard, { StatCardProps } from "./StatCard";
-
+import Button from '@/components/Button';
// Icons
function DollarIcon() {
return (
@@ -95,7 +95,7 @@ export default function RewardsOverview({
hover:bg-[#38b2ac] transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
>
{claimLoading ? "Claiming..." : "Claim Rewards"}
-
+
{/* Stat cards grid */}
diff --git a/frontend/src/component/trading/MarketRow.tsx b/frontend/src/component/trading/MarketRow.tsx
index af78c47b..a04a44a9 100644
--- a/frontend/src/component/trading/MarketRow.tsx
+++ b/frontend/src/component/trading/MarketRow.tsx
@@ -1,3 +1,4 @@
+import Button from '@/components/Button';
import React from "react";
import Image from "next/image";
@@ -79,7 +80,7 @@ const MarketRow: React.FC = ({
aria-label={isFavorite ? `Remove ${name} from favorites` : `Add ${name} to favorites`}
>
-
+
= ({
aria-label={`Trade ${name}`}
>
Trade
-
+
);
diff --git a/frontend/src/component/trading/MarketSearchBar.tsx b/frontend/src/component/trading/MarketSearchBar.tsx
index 89ec1142..d0cd808d 100644
--- a/frontend/src/component/trading/MarketSearchBar.tsx
+++ b/frontend/src/component/trading/MarketSearchBar.tsx
@@ -1,5 +1,5 @@
import React from "react";
-
+import Button from '@/components/Button';
interface MarketSearchBarProps {
searchValue: string;
onSearchChange: (e: React.ChangeEvent) => void;
@@ -50,7 +50,7 @@ const MarketSearchBar: React.FC = ({ searchValue, onSearch
>
All tokens
-
+
= ({ searchValue, onSearch
style={{ background: '#9747FF9E', border: '1px solid #9747FF9E', minWidth: 0, width: 'auto', padding: '10px', gap: '10px' }}
>
Start Trading
-
+
);
diff --git a/frontend/src/component/trading/TradingTabs.tsx b/frontend/src/component/trading/TradingTabs.tsx
index e5f5fad7..da8ac518 100644
--- a/frontend/src/component/trading/TradingTabs.tsx
+++ b/frontend/src/component/trading/TradingTabs.tsx
@@ -1,5 +1,5 @@
import React from "react";
-
+import Button from '@/components/Button';
interface TradingTabsProps {
activeTab: string;
onTabChange: (tab: string) => void;
@@ -49,7 +49,7 @@ const TradingTabs: React.FC = ({ activeTab, onTabChange }) =>
onClick={() => onTabChange(tab)}
>
{tab}
-
+
))}
);