mirror of
https://github.com/XRPLF/xrpl-dev-portal.git
synced 2025-11-28 07:35:50 +00:00
Update payments and tokenization pages with new components and layout adjustments
- Changed the payments page to use `index.page.tsx` instead of `index.md` for better component integration. - Added `AdvantagesSection` and `ProjectCards` components to both payments and tokenization pages to enhance content presentation. - Adjusted CSS styles for improved responsiveness and layout consistency across different screen sizes. - Removed outdated security card implementation in tokenization page and replaced it with a more streamlined advantages section.
This commit is contained in:
99
shared/components/advantages-section.tsx
Normal file
99
shared/components/advantages-section.tsx
Normal file
@@ -0,0 +1,99 @@
|
||||
import React from "react";
|
||||
import { useThemeHooks } from '@redocly/theme/core/hooks';
|
||||
import { Link } from "@redocly/theme/components/Link/Link";
|
||||
|
||||
interface AdvantageContent {
|
||||
href?: string;
|
||||
subtitle: string;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
interface Advantage {
|
||||
id: string;
|
||||
title: string;
|
||||
contents: AdvantageContent[];
|
||||
}
|
||||
|
||||
interface AdvantagesSectionProps {
|
||||
title: string;
|
||||
description?: string;
|
||||
advantages: Advantage[];
|
||||
className?: string;
|
||||
useLinks?: boolean; // New prop to control whether to use links or bullet points
|
||||
}
|
||||
|
||||
const AdvantageCard = (advantageContents: AdvantageContent[], useLinks: boolean = true) => {
|
||||
const { useTranslate } = useThemeHooks();
|
||||
const { translate } = useTranslate();
|
||||
|
||||
if (useLinks) {
|
||||
// Original tokenization style with links
|
||||
return advantageContents.map((content) => (
|
||||
<div key={content.subtitle}>
|
||||
<Link to={content.href}><h5 className="card-subhead">{translate(content.subtitle)}:</h5></Link>
|
||||
<div className="card-text">
|
||||
{translate(content?.description || "")}
|
||||
</div>
|
||||
</div>
|
||||
))
|
||||
} else {
|
||||
// Payments style with bullet points
|
||||
return (
|
||||
<ul className="advantages-list">
|
||||
{advantageContents.map((content) => (
|
||||
<li key={content.subtitle} className="advantage-item">
|
||||
<strong>{translate(content.subtitle)}</strong>
|
||||
{content.description && (
|
||||
<span className="advantage-description">{translate(content.description)}</span>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export const AdvantagesSection: React.FC<AdvantagesSectionProps> = ({
|
||||
title,
|
||||
description,
|
||||
advantages,
|
||||
className = "",
|
||||
useLinks = true
|
||||
}) => {
|
||||
const { useTranslate } = useThemeHooks();
|
||||
const { translate } = useTranslate();
|
||||
|
||||
// Dynamic grid class based on number of advantages
|
||||
const getGridClass = () => {
|
||||
const count = advantages.length;
|
||||
if (count === 3) return "security-card-grid-3";
|
||||
if (count === 4) return "security-card-grid-4";
|
||||
return "security-card-grid"; // fallback to original
|
||||
};
|
||||
|
||||
const headerSpacingClass = useLinks ? "mb-16" : "mb-8"; // 32px for bullet version, 64px for links
|
||||
|
||||
return (
|
||||
<section className={`advantages-section container-new py-20 ${className}`}>
|
||||
<div className="d-flex flex-column-reverse">
|
||||
<p className={headerSpacingClass}>
|
||||
{translate(description)}
|
||||
</p>
|
||||
<h4 className="eyebrow mb-8">{translate(title)}</h4>
|
||||
</div>
|
||||
<div
|
||||
className={`${getGridClass()} nav card-grid`}
|
||||
id="security-features"
|
||||
>
|
||||
{advantages.map((advantage) => (
|
||||
<div className="security-card" key={advantage.id}>
|
||||
<div className="card-body p-6">
|
||||
<h4 className="card-title h6">{translate(advantage.title)}</h4>
|
||||
{AdvantageCard(advantage.contents, useLinks)}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
148
shared/components/project-cards.tsx
Normal file
148
shared/components/project-cards.tsx
Normal file
@@ -0,0 +1,148 @@
|
||||
import React, { useState } from "react";
|
||||
import { useThemeHooks } from '@redocly/theme/core/hooks';
|
||||
|
||||
interface Project {
|
||||
id: string;
|
||||
label: string;
|
||||
url: string;
|
||||
description?: string; // New optional field for payments page
|
||||
}
|
||||
|
||||
interface ProjectCardsProps {
|
||||
title: string;
|
||||
projects: Project[];
|
||||
showCarousel?: boolean; // true for tokenization (carousel), false for payments (grid)
|
||||
className?: string;
|
||||
}
|
||||
|
||||
const ProjectCard = ({ project, index, showCarousel = true }: {
|
||||
project: Project;
|
||||
index: number;
|
||||
showCarousel?: boolean;
|
||||
}) => {
|
||||
const { useTranslate } = useThemeHooks();
|
||||
const { translate } = useTranslate();
|
||||
|
||||
return (
|
||||
<a
|
||||
className={`col card float-up-on-hover ${
|
||||
showCarousel
|
||||
? (index % 2 === 0 ? "even" : "odd")
|
||||
: `payments-project-card ${index % 2 === 0 ? "odd" : "even"}`
|
||||
}`}
|
||||
target="_blank"
|
||||
href={project.url}
|
||||
>
|
||||
<div className="project-logo d-flex justify-content-center align-items-center">
|
||||
<img className={project.id} alt={project.label} />
|
||||
</div>
|
||||
{!showCarousel && project.description && (
|
||||
<div className="project-description">
|
||||
{(() => {
|
||||
const words = project.description.split(' ');
|
||||
const firstWord = words[0];
|
||||
const restOfText = words.slice(1).join(' ');
|
||||
return (
|
||||
<>
|
||||
<strong className="first-word">{firstWord}</strong>
|
||||
{restOfText && <span className="rest-text"> {restOfText}</span>}
|
||||
</>
|
||||
);
|
||||
})()}
|
||||
</div>
|
||||
)}
|
||||
</a>
|
||||
);
|
||||
};
|
||||
|
||||
const FeaturedProjectsCarousel = ({ projects }: { projects: Project[] }) => {
|
||||
const [currentIndex, setCurrentIndex] = useState(0);
|
||||
|
||||
const handlePrev = () => {
|
||||
if (currentIndex > 0) {
|
||||
setCurrentIndex(currentIndex - 1);
|
||||
}
|
||||
};
|
||||
|
||||
const handleNext = () => {
|
||||
if (currentIndex < projects.length - 3) {
|
||||
setCurrentIndex(currentIndex + 1);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="featured-projects">
|
||||
<div className="project-cards-container card-grid card-grid-3xN">
|
||||
<ProjectCard project={projects[currentIndex]} index={currentIndex} />
|
||||
<ProjectCard
|
||||
project={projects[currentIndex + 1]}
|
||||
index={currentIndex + 1}
|
||||
/>
|
||||
<ProjectCard
|
||||
project={projects[currentIndex + 2]}
|
||||
index={currentIndex + 2}
|
||||
/>
|
||||
</div>
|
||||
<div className="arrow-wrapper d-flex justify-content-center mt-16">
|
||||
<button
|
||||
className={`arrow-button prev ${
|
||||
currentIndex > 0 ? "hover-color" : ""
|
||||
}`}
|
||||
onClick={handlePrev}
|
||||
>
|
||||
<img alt="left arrow" />
|
||||
</button>
|
||||
<button
|
||||
className={`arrow-button next ${
|
||||
currentIndex < projects.length - 3 ? "hover-color" : ""
|
||||
}`}
|
||||
onClick={handleNext}
|
||||
>
|
||||
<img alt="right arrow" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
const ProjectsGrid = ({ projects }: { projects: Project[] }) => {
|
||||
return (
|
||||
<div className="payments-projects-grid card-grid">
|
||||
{projects.map((project, index) => (
|
||||
<ProjectCard
|
||||
key={project.id}
|
||||
project={project}
|
||||
index={index}
|
||||
showCarousel={false}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export const ProjectCards: React.FC<ProjectCardsProps> = ({
|
||||
title,
|
||||
projects,
|
||||
showCarousel = true,
|
||||
className = ""
|
||||
}) => {
|
||||
const { useTranslate } = useThemeHooks();
|
||||
const { translate } = useTranslate();
|
||||
|
||||
return (
|
||||
<section className={`container-new py-20 ${className}`}>
|
||||
<div className="d-flex flex-column-reverse">
|
||||
<h4 className="eyebrow mb-16">
|
||||
{translate(title)}
|
||||
</h4>
|
||||
</div>
|
||||
<div className="project-cards">
|
||||
{showCarousel ? (
|
||||
<FeaturedProjectsCarousel projects={projects} />
|
||||
) : (
|
||||
<ProjectsGrid projects={projects} />
|
||||
)}
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user