All components

Feature Platform

Feature Platform is a React and Tailwind CSS form component from UI Layouts, licensed MIT. Copy it and paste it into your project.

UI Layouts MIT forms

What it is

Feature Platform is a React and Tailwind CSS form component from UI Layouts, licensed MIT. Copy it and paste it into your project.

How to use it

Open it in the catalogue, press copy, and paste it into your project. The prompt you copy carries the code and the rules that tell your agent to reproduce it without changing anything.

Open in the catalogue

Five free copies a month. No card.

Needs

npm i motion

Licence

This component comes from UI Layouts and is redistributed under the MIT licence, which permits commercial use. The copyright notice travels with the code.

Feature Platform

../../packages/blocks/src/feature-section/feature-platform.tsx
import React from 'react'
import {
  Diamond,
  Home,
  Wallet,
  TrendingUp,
  DollarSign,
  Package,
  BadgeCent,
} from 'lucide-react'
import { Button } from '@repo/shadcn'

export const FeaturePlatform = () => {
  return (
    <section className="py-32 px-6 bg-slate-50 font-dmSans min-h-screen">
      <div className="max-w-7xl mx-auto grid grid-cols-1 md:grid-cols-12 gap-6">
        {/* Title Cell */}
        <div className="md:col-span-3 flex flex-col justify-start">
          <h2 className="text-4xl font-bold text-slate-900 leading-tight text-balance">
            Our <br /> Platform
          </h2>
          <p className="text-slate-500 text-sm leading-relaxed text-pretty pt-4">
            Our platform provides you with the tools and resources you need to
            succeed.
          </p>
        </div>

        {/* Bento Grid Cells */}
        <div className="relative overflow-hidden md:col-span-4 bg-white p-10 rounded-3xl border border-slate-200 flex flex-col justify-between h-80">
          <img
            src="https://images.unsplash.com/photo-1763010156322-2fb80d48ea8b?q=80&w=1760&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
            alt=""
            className="absolute top-0 left-0 w-full h-full object-cover transition-opacity duration-300 ease-out"
          />
          <div className="flex justify-between items-start relative z-2">
            <h3 className="text-xl font-bold text-slate-900 tracking-tight">
              Exclusive
            </h3>
            <Package className="size-8 text-slate-900" />
          </div>
          <p className="text-slate-900 text-sm leading-relaxed text-pretty relative z-2">
            200 exclusive prospects pushed to your platform monthly.
          </p>
        </div>

        <div className="md:col-span-5 bg-white p-10 rounded-3xl border border-slate-200 flex flex-col justify-between h-80">
          <div className="flex justify-between items-start">
            <h3 className="text-xl font-bold text-slate-900 tracking-tight">
              In your backyard
            </h3>
            <Home className="size-8 text-slate-400" />
          </div>
          <p className="text-slate-700  text-sm leading-relaxed text-pretty">
            Radius based leads within 50-miles from you, prioritizing those
            closer to you.
          </p>
        </div>

        {/* Second Row */}
        <div className="md:col-span-4 bg-white p-10 rounded-3xl border border-slate-200 flex flex-col justify-between h-80">
          <div className="flex justify-between items-start">
            <h3 className="text-xl font-bold text-slate-900 tracking-tight">
              High net worth
            </h3>
            <BadgeCent className="size-8 text-slate-400" />
          </div>
          <p className="text-slate-700 text-sm leading-relaxed text-pretty">
            Average investable assets of $1.5 million.
          </p>
        </div>

        <div className="md:col-span-4 bg-white p-10 rounded-3xl border border-slate-200 flex flex-col justify-between h-80">
          <div className="flex justify-between items-start">
            <h3 className="text-xl font-bold text-slate-900 tracking-tight">
              High propensity
            </h3>
            <TrendingUp className="size-8 text-slate-400" />
          </div>
          <p className="text-slate-700 text-sm leading-relaxed text-pretty">
            Our combination of event-driven data, historical data, and
            behavioral results in the highest propensity prospects.
          </p>
        </div>

        <div className="md:col-span-4 bg-emerald-500 p-10 rounded-3xl flex flex-col justify-between h-80 relative overflow-hidden group">
          <div className="flex justify-between items-start">
            <h3 className="text-xl font-bold text-slate-900 tracking-tight">
              Pricing Prospective
            </h3>
            <Wallet className="size-8 text-black" />
          </div>
          <div className="absolute inset-0 grid grid-cols-4 gap-2 opacity-10 p-4 pointer-events-none">
            {Array.from({ length: 16 }).map((_, i) => (
              <DollarSign key={i} className="size-6 text-white" />
            ))}
          </div>
          <div className="relative z-10 flex flex-col h-full justify-end">
            <Button className="flex items-center gap-2 text-white font-bold text-lg hover:gap-4 bg-black transition-all">
              View pricing <span>→</span>
            </Button>
          </div>
        </div>
      </div>
    </section>
  )
}
./components/ui/timeline-animation.tsx
import type { Variants } from 'motion/react';
import { type HTMLMotionProps, motion, useInView } from 'motion/react';
import type React from 'react';

type TimelineContentProps<T extends keyof HTMLElementTagNameMap> = {
  children?: React.ReactNode;
  animationNum: number;
  className?: string;
  timelineRef: React.RefObject<HTMLElement | null>;
  as?: T;
  customVariants?: Variants;
  once?: boolean;
} & HTMLMotionProps<T>;

export const TimelineAnimation = <T extends keyof HTMLElementTagNameMap = 'div'>({
  children,
  animationNum,
  timelineRef,
  className,
  as,
  customVariants,
  once = true,
  ...props
}: TimelineContentProps<T>) => {
  const defaultSequenceVariants = {
    visible: (i: number) => ({
      filter: 'blur(0px)',
      y: 0,
      opacity: 1,
      transition: {
        delay: i * 0.5,
        duration: 0.5,
      },
    }),
    hidden: {
      filter: 'blur(20px)',
      y: 0,
      opacity: 0,
    },
  };

  const sequenceVariants = customVariants || defaultSequenceVariants;

  const isInView = useInView(timelineRef, {
    once,
  });

  const MotionComponent = motion[as || 'div'] as React.ElementType;

  return (
    <MotionComponent
      initial='hidden'
      animate={isInView ? 'visible' : 'hidden'}
      custom={animationNum}
      variants={sequenceVariants}
      className={className}
      {...props}
    >
      {children}
    </MotionComponent>
  );
};

Similar components