diff --git a/frontend/src/app/for-lawyers/components/Flowchart.tsx b/frontend/src/app/for-lawyers/components/Flowchart.tsx index 889a95d..fe460ee 100644 --- a/frontend/src/app/for-lawyers/components/Flowchart.tsx +++ b/frontend/src/app/for-lawyers/components/Flowchart.tsx @@ -32,7 +32,7 @@ const FlowchartItem: React.FC = ({ "relative h-7 w-[100%-14px] bg-primary-blue", "flex items-center justify-center", //start-arrow - "before:absolute before:left-0 before:top-0 before:border-b-[14px] before:border-l-[14px] before:border-t-[14px]", + "before:absolute before:-left-[1px] before:top-0 before:border-b-[14px] before:border-l-[14px] before:border-t-[14px]", "before:border-b-transparent before:border-t-transparent", background === "primary" ? "before:border-l-background-1" @@ -60,7 +60,7 @@ interface IFlowchart { const Flowchart: React.FC = ({ items, background }) => { return ( -
+
{items.map((item) => ( ))} diff --git a/frontend/src/app/home/components/LearnPosts.tsx b/frontend/src/app/home/components/LearnPosts.tsx index 0a8b761..0846f9d 100644 --- a/frontend/src/app/home/components/LearnPosts.tsx +++ b/frontend/src/app/home/components/LearnPosts.tsx @@ -23,7 +23,7 @@ const LearnPosts: React.FC = async () => {
{cards.map(({ icon, title, subtitle, link }) => ( diff --git a/frontend/src/components/Cooperative/ReportSection/DropdownContainer.tsx b/frontend/src/components/Cooperative/ReportSection/DropdownContainer.tsx index 869d66a..767259f 100644 --- a/frontend/src/components/Cooperative/ReportSection/DropdownContainer.tsx +++ b/frontend/src/components/Cooperative/ReportSection/DropdownContainer.tsx @@ -10,14 +10,14 @@ import { Reports } from "./ReportCard"; interface IDropdownContainer extends Pick { reports: Reports; - setReportUrl: (url?: string) => void; + setSelectedReport: (report?: Reports[number]) => void; } type IProcessedReports = Record>; const DropdownContainer: React.FC = ({ reports, - setReportUrl, + setSelectedReport, yearDropdownLabel, monthDropdownLabel, }) => { @@ -75,8 +75,8 @@ const DropdownContainer: React.FC = ({ (report) => (isMonthInfo ? report.month === month : true) && report.year === year, ); - setReportUrl(selectedReport?.url); - }, [isMonthInfo, month, year, reports, setReportUrl]); + setSelectedReport(selectedReport); + }, [isMonthInfo, month, year, reports, setSelectedReport]); return (
= ({ monthDropdownLabel, downloadButtonText, }) => { - const [reportUrl, setReportUrl] = useState(); + const [selectedReport, setSelectedReport] = useState(); + + const handleDownload = () => { + if (!selectedReport || !selectedReport.file.url) return; + fetch(selectedReport.file.url) + .then((response) => response.blob()) + .then((blob) => { + const url = window.URL.createObjectURL(new Blob([blob])); + const link = document.createElement("a"); + link.href = url; + + const contentType = blob.type; + + const extension = contentType.split("/")[1] || "octet-stream"; + const fileExtension = extension === "json" ? "json" : extension; + + link.download = `${selectedReport.month ? selectedReport.month + "-" : ""}${selectedReport.year}.${fileExtension}`; + + document.body.appendChild(link); + + link.click(); + + document.body.removeChild(link); + window.URL.revokeObjectURL(url); + }) + .catch((error) => { + console.error("Error fetching the file:", error); + }); + }; return (
= ({ - - - +
= ({

{title}

-

{description}

+

+ {description} +

{typeof arrowLink !== "undefined" ? ( -
+
= ({ text, url, className }) => { return ( {text} = ({ heroData }) => { return ( -
+
-

{heroData.title}

-

{heroData.subtitle}

+

+ {heroData.title} +

+

{heroData.subtitle}

); diff --git a/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/Header.tsx b/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/Header.tsx index c13d322..16f4f58 100644 --- a/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/Header.tsx +++ b/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/Header.tsx @@ -10,11 +10,11 @@ interface IHeader { const Header: React.FC = ({ useCasesData }) => { return ( -
-

+
+

{useCasesData.useCaseTitle}

-

+

{useCasesData.useCaseDescription}

= ({ useCasesData }) => { return (
-

+

{useCasesData.keyChallenges.title}

-

+

{useCasesData.keyChallenges.description}

diff --git a/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/KeyChallenges/HowKlerosSolvesIt.tsx b/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/KeyChallenges/HowKlerosSolvesIt.tsx index 32f70c8..7ed4584 100644 --- a/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/KeyChallenges/HowKlerosSolvesIt.tsx +++ b/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/KeyChallenges/HowKlerosSolvesIt.tsx @@ -1,15 +1,8 @@ import React from "react"; -import clsx from "clsx"; -import Image from "next/image"; - -import CustomLink from "@/components/CustomLink"; -import Card from "@/components/Navbar/AppsDropdownContent/Card"; import { UseCasesQueryType } from "@/queries/for-builders/use-cases"; -const hoverEffect = clsx( - "hover:scale-[1.03] transform transition duration-100", -); +import SafeSnap from "./SafeSnap"; interface IHowKlerosSolvesIt { useCasesData: UseCasesQueryType["forBuildersPageUseCasesSection"]; @@ -18,45 +11,10 @@ interface IHowKlerosSolvesIt { const HowKlerosSolvesIt: React.FC = ({ useCasesData }) => { return (
-

+

{useCasesData.solutionSections.header}

-
-

{useCasesData.solutionSections.title}

-
- {useCasesData.solutionSections.description} -
-
- {useCasesData.solutionSections.solutionHeader} -
-
- -
-
- {useCasesData.solutionSections.partnersHeader} -
-
- {useCasesData.solutionSections.partners.map((partner) => ( - - {partner?.name} - - ))} -
-
+
); }; diff --git a/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/KeyChallenges/SafeSnap.tsx b/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/KeyChallenges/SafeSnap.tsx new file mode 100644 index 0000000..b728081 --- /dev/null +++ b/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/KeyChallenges/SafeSnap.tsx @@ -0,0 +1,67 @@ +import clsx from "clsx"; +import Image from "next/image"; + +import CustomLink from "@/components/CustomLink"; +import Card from "@/components/Navbar/AppsDropdownContent/Card"; +import { UseCasesQueryType } from "@/queries/for-builders/use-cases"; + +interface ISafeSnap { + useCasesData: UseCasesQueryType["forBuildersPageUseCasesSection"]; +} + +const SafeSnap: React.FC = ({ useCasesData }) => { + return ( +
+

+ {useCasesData.solutionSections.title} +

+
+ {useCasesData.solutionSections.description} +
+ +
+
+
+ {useCasesData.solutionSections.solutionHeader} +
+
+ +
+
+ +
+
+ {useCasesData.solutionSections.partnersHeader} +
+
+ {useCasesData.solutionSections.partners.map((partner) => ( + + {partner?.name} + + ))} +
+
+
+
+ ); +}; + +export default SafeSnap; diff --git a/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/LearnMore.tsx b/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/LearnMore.tsx deleted file mode 100644 index ab04e36..0000000 --- a/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/LearnMore.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import React from "react"; - -import Image from "next/image"; - -import LinkArrow from "@/assets/svgs/icons/link-arrow.svg"; -import CustomLink from "@/components/CustomLink"; -import { UseCasesQueryType } from "@/queries/for-builders/use-cases"; - -interface ILearnMore { - useCasesData: UseCasesQueryType["forBuildersPageUseCasesSection"]; -} - -const LearnMore: React.FC = ({ useCasesData }) => { - return ( - - - {useCasesData.arrowLink.text} - - Arrow link image - - ); -}; -export default LearnMore; diff --git a/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/index.tsx b/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/index.tsx index 04819c4..d6b4a0a 100644 --- a/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/index.tsx +++ b/frontend/src/components/ForBuilders/UseCasesSection/DAOSection/index.tsx @@ -1,10 +1,10 @@ import React from "react"; +import ExternalLink from "@/components/ExternalLink"; import { UseCasesQueryType } from "@/queries/for-builders/use-cases"; import Header from "./Header"; import KeyChallenges from "./KeyChallenges"; -import LearnMore from "./LearnMore"; interface IDAOSection { useCasesData: UseCasesQueryType["forBuildersPageUseCasesSection"]; @@ -15,7 +15,11 @@ const DAOSection: React.FC = ({ useCasesData }) => {
- +
); }; diff --git a/frontend/src/components/ForBuilders/UseCasesSection/index.tsx b/frontend/src/components/ForBuilders/UseCasesSection/index.tsx index db01e84..b6498f6 100644 --- a/frontend/src/components/ForBuilders/UseCasesSection/index.tsx +++ b/frontend/src/components/ForBuilders/UseCasesSection/index.tsx @@ -11,8 +11,8 @@ interface IUseCasesSection { const UseCasesSection: React.FC = ({ useCasesData }) => { return ( -
-

+
+

{useCasesData.sectionHeader}

diff --git a/frontend/src/components/IntegrateSection/LearnMore.tsx b/frontend/src/components/IntegrateSection/LearnMore.tsx deleted file mode 100644 index 096dc73..0000000 --- a/frontend/src/components/IntegrateSection/LearnMore.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React from "react"; - -import Image from "next/image"; - -import LinkArrow from "@/assets/svgs/icons/link-arrow.svg"; -import { IntegrateQueryType } from "@/queries/integrate"; - -import CustomLink from "../CustomLink"; - -interface ILearnMore { - integrateData: IntegrateQueryType["forBuildersPageIntegrateSection"]; -} - -const LearnMore: React.FC = ({ integrateData }) => { - return ( - - - {integrateData.arrowLink.text} - - Arrow link image - - ); -}; -export default LearnMore; diff --git a/frontend/src/components/IntegrateSection/index.tsx b/frontend/src/components/IntegrateSection/index.tsx index 1347151..210e07c 100644 --- a/frontend/src/components/IntegrateSection/index.tsx +++ b/frontend/src/components/IntegrateSection/index.tsx @@ -1,35 +1,37 @@ import React from "react"; -import CtaBox from "@/components/CtaBox"; import ExternalLink from "@/components/ExternalLink"; import AppsDropdownContent from "@/components/Navbar/AppsDropdownContent"; import { integrateQuery, IntegrateQueryType } from "@/queries/integrate"; import { request } from "@/utils/graphQLClient"; +import LearnMore from "../LearnMore"; + const IntegrateSection: React.FC = async () => { const integrateData = await request(integrateQuery).then( (res) => res.forBuildersPageIntegrateSection, ); return ( -
+

{integrateData.header}

-

+

{integrateData.title}

-

+

{integrateData.description}

- diff --git a/frontend/src/components/LearnMore.tsx b/frontend/src/components/LearnMore.tsx index 416147b..5aeb750 100644 --- a/frontend/src/components/LearnMore.tsx +++ b/frontend/src/components/LearnMore.tsx @@ -1,5 +1,6 @@ import React from "react"; +import clsx from "clsx"; import Image from "next/image"; import Button from "@/components/Button"; @@ -13,14 +14,21 @@ interface ILearnMore { background: { url: string; }; + className?: string; } -const LearnMore: React.FC = ({ title, button, background }) => { +const LearnMore: React.FC = ({ + title, + button, + background, + className, +}) => { return (

{title} diff --git a/frontend/src/components/Navbar/AppsDropdownContent/Card.tsx b/frontend/src/components/Navbar/AppsDropdownContent/Card.tsx index 79d5f80..3db3739 100644 --- a/frontend/src/components/Navbar/AppsDropdownContent/Card.tsx +++ b/frontend/src/components/Navbar/AppsDropdownContent/Card.tsx @@ -17,18 +17,26 @@ const descriptionTextStyle = clsx( interface CardProps { solution: Solution; variant: "large" | "medium" | "small"; + className?: string; } -const Card: React.FC = ({ solution, variant }) => { +const Card: React.FC = ({ solution, variant, className }) => { return ( = ({ variant="small" /> ))} - - {appsSection?.arrowLink.text} - Arrow link - +

); diff --git a/frontend/src/components/ResearchDevelopment/TabSection/FellowshipTabContent/Testimonials/TestimonialCard.tsx b/frontend/src/components/ResearchDevelopment/TabSection/FellowshipTabContent/Testimonials/TestimonialCard.tsx index 5f6c467..df3ade3 100644 --- a/frontend/src/components/ResearchDevelopment/TabSection/FellowshipTabContent/Testimonials/TestimonialCard.tsx +++ b/frontend/src/components/ResearchDevelopment/TabSection/FellowshipTabContent/Testimonials/TestimonialCard.tsx @@ -1,19 +1,16 @@ -import Image from "next/image"; - -import CustomLink from "@/components/CustomLink"; import { Testimonial } from "@/queries/research-development/tabs-data"; -const TestimonialCard: React.FC = ({ url, thumbnail }) => ( - -
- Thumbnail -
-
+const TestimonialCard: React.FC = ({ url }) => ( +
+ +
); export default TestimonialCard; diff --git a/frontend/src/components/ResearchDevelopment/TabSection/ResearchTabContent/KlerosBook.tsx b/frontend/src/components/ResearchDevelopment/TabSection/ResearchTabContent/KlerosBook.tsx index ee5d19a..745fba9 100644 --- a/frontend/src/components/ResearchDevelopment/TabSection/ResearchTabContent/KlerosBook.tsx +++ b/frontend/src/components/ResearchDevelopment/TabSection/ResearchTabContent/KlerosBook.tsx @@ -2,7 +2,6 @@ import clsx from "clsx"; import Image from "next/image"; import Button from "@/components/Button"; -import CustomLink from "@/components/CustomLink"; import { KlerosBook as IKlerosBook } from "@/queries/research-development/tabs-data"; const KlerosBook: React.FC = ({ @@ -11,6 +10,33 @@ const KlerosBook: React.FC = ({ bookTitle, downloadFormats, }) => { + const handleDownload = (url: string) => { + fetch(url) + .then((response) => response.blob()) + .then((blob) => { + const url = window.URL.createObjectURL(new Blob([blob])); + const link = document.createElement("a"); + link.href = url; + + const contentType = blob.type; + + const extension = contentType.split("/")[1] || "octet-stream"; + const fileExtension = extension === "json" ? "json" : extension; + + link.download = `KlerosBook.${fileExtension}`; + + document.body.appendChild(link); + + link.click(); + + document.body.removeChild(link); + window.URL.revokeObjectURL(url); + }) + .catch((error) => { + console.error("Error fetching the file:", error); + }); + }; + return (
= ({
{downloadFormats.map((format) => ( - - - + ))}
diff --git a/frontend/src/components/UseCasesCards.tsx b/frontend/src/components/UseCasesCards.tsx index 5e47757..a1f2314 100644 --- a/frontend/src/components/UseCasesCards.tsx +++ b/frontend/src/components/UseCasesCards.tsx @@ -18,7 +18,7 @@ const UseCasesCards: React.FC = async ({ selectedIndex }) => { const useCases = useCasesData.forBuildersPageUseCasesSection.useCases; return ( -
+
{useCases.map((useCase, index) => ( ; bookCover: { url: string; };