Staaarter

Personal Trainer Profile

Trainer showcase with photo, certifications, rating, and client stats in a floating card. Perfect for personal training services and fitness coaching pages.

By Staaarter Team
Fitness
Docs
Live preview

Docs

Installation

A real shadcn registry command, not a copy-paste stand-in: it fetches this block plus its button, badge, media-slot dependencies and any missing npm packages, and installs them straight into your project.

npx shadcn add https://staaarter.com/r/personal-trainer-profile.json

Prefer not to use the CLI? Copy the source from the Code toggle above into src/components/blocks/fitness/fitness1.tsx instead.

Usage

The file also exports fitness1Demo, the exact props behind the preview above. Spread it to get a working section in one line, then replace it with your own data.

import { Fitness1, fitness1Demo } from "@/components/blocks/fitness/fitness1";

export default function Page() {
  return <Fitness1 {...fitness1Demo} />;
}

Props

PropTypeDefaultDescription
badge{ label: string; variant?: BadgeVariant }nonePill above the name; only rendered when badge is truthy.
namestringnoneTrainer's full name.
titlestringnoneTrainer's role or specialty, shown under the name.
biostringnoneShort paragraph describing the trainer's approach.
photo{ src: string; alt: string }undefinedTrainer headshot; falls back to MediaSlot's placeholder gradient when omitted.
ratingnumbernoneStar rating out of 5; rounded to the nearest whole star for the filled-star display.
reviewCountnumbernoneNumber of reviews shown next to the rating.
certificationsCertificationItem[][]Certification badges below the bio.
statsStatItem[][]Floating stat tiles overlaid on the photo's bottom edge.
buttonsButtonItem[][]CTA buttons below the certifications.
classNamestringnoneExtra classes for the outer section element.

Types

type CertificationItem = { label: string };

type StatItem = { label: string; value: string };

type ButtonItem = {
  label: string;
  href?: string;
  variant?: "default" | "secondary" | "outline" | "ghost" | "link" | "destructive";
};

Behavior notes

  • The floating stats card is absolutely positioned over the bottom edge of the photo and only renders when stats has at least one entry.
  • rating renders as 5 Star icons, filled up to Math.round(rating); it does not render half-filled stars for fractional ratings like 4.5.
  • certifications and buttons each collapse cleanly (no empty wrapper) when their array is empty.
  • photo is optional; when omitted, MediaSlot renders its own decorative placeholder gradient with a centered image icon rather than leaving a blank box.
  • Book a session and View programs buttons are static links (render={<Link/>}) with no booking logic behind them; wiring a real booking flow is left to the consumer.