"use client"; import { motion } from "motion/react"; import React, { useState } from "react"; import { cn } from "@/lib/utils"; const defaultFeatures = [ { number: "01", title: "Instant Implementation", description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et", image: "https://deifkwefumgah.cloudfront.net/shadcnblocks/block/guri3/img11.jpeg", imageOrder: "order-1", contentOrder: "order-2", }, { number: "02", title: "One time payment", description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et", image: "https://deifkwefumgah.cloudfront.net/shadcnblocks/block/guri3/img12.jpeg", imageOrder: "order-2", contentOrder: "order-1", }, { number: "03", title: "Developer Friendly", description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et", image: "https://deifkwefumgah.cloudfront.net/shadcnblocks/block/guri3/img14.jpeg", imageOrder: "order-1", contentOrder: "order-2", }, ]; interface Feature270Item { number: string; title: string; description: string; image: string; imageOrder: string; contentOrder: string; } interface Feature270Props { className?: string; heading?: string; features?: Feature270Item[]; headingAlign?: "left" | "right" | "center"; contentAlign?: "left" | "center" | "right"; showNumbers?: boolean; /** وقتی false باشد، دکمه/لینک «Learn More» روی کارت‌ها نمایش داده نمی‌شود. */ showLearnMore?: boolean; } const Feature270 = ({ className, heading = "Why Choose Shadcn Blocks?", features = defaultFeatures, headingAlign = "left", contentAlign = "left", showNumbers = true, showLearnMore = true, }: Feature270Props) => { const headingClass = { left: "text-left", right: "text-right", center: "text-center", }[headingAlign]; const contentClass = { left: "text-left", center: "text-center", right: "text-right", }[contentAlign]; return (

{heading}

{features.map((feature, index) => { const cardContent = (
thumbnail
{showNumbers && (

{feature.number}

)}

{feature.title}

{feature.description}

); const cardClassName = "w-full h-full min-h-[28rem] rounded-3xl !bg-muted/70 p-4 flex flex-col"; return ( {cardContent} ); })}
); }; export { Feature270 }; // Below is the modified component from Aceternity UI // Original source: npx shadcn@latest add https://ui.aceternity.com/registry/3d-pin.json // Modified to follow our coding standards and design system // We respect copyright and attribution to the original creators export const PinContainer = ({ children, title, href, className, containerClassName, showPerspective = true, }: { children: React.ReactNode; title?: string; href?: string; className?: string; containerClassName?: string; /** وقتی false باشد، دکمه/برچسب «Learn More» روی هاور نمایش داده نمی‌شود. افکت سه‌بعدی هاور حفظ می‌شود. */ showPerspective?: boolean; }) => { const [transform, setTransform] = useState( "translate(-50%,-50%) rotateX(0deg)", ); const onMouseEnter = () => { setTransform("translate(-50%,-50%) rotateX(40deg) scale(0.8)"); }; const onMouseLeave = () => { setTransform("translate(-50%,-50%) rotateX(0deg) scale(1)"); }; const wrapperClassName = cn( "group/pin relative z-10", href ? "cursor-pointer" : "cursor-default", containerClassName, ); const outerTransform = showPerspective ? "rotateX(70deg) translateZ(0deg)" : "rotateX(0deg) translateZ(0deg)"; const content = showPerspective ? ( <>
{children}
{title != null && } ) : (
{children}
); if (href) { return ( {content} ); } return (
{content}
); }; export const PinPerspective = ({ title, }: { title?: string; href?: string; }) => { return (
{title}
<>
<>
); };