Astra Dental Template
Professional dental clinic website template built with Next.js 16, React 19, and Tailwind CSS v4.
Overview
Astra is designed for dental clinics and healthcare providers who need a professional web presence with appointment booking, service showcases, and content management.
Live Preview: View Demo
Tech Stack
| Technology | Version | Purpose |
|---|---|---|
| Next.js | 16.0.3 | React framework |
| React | 19.2.0 | UI library |
| TypeScript | 5.x | Type safety |
| Tailwind CSS | 4.x | Styling |
| Framer Motion | 12.x | Animations & transitions |
| next-mdx-remote | 5.x | MDX content rendering |
| Phosphor Icons | 1.4.x | Icon library |
Quick Start
cd astra-template
npm install
npm run dev
# Open http://localhost:3000Pages Included (12+)
| Page | Route | Description |
|---|---|---|
| Homepage | / | Hero, services, testimonials, CTA sections |
| About | /about | Company info, mission, values |
| Services | /services | Service listing grid |
| Service Detail | /services/[slug] | Individual service pages (MDX) |
| Team | /team | Team member profiles |
| Case Studies | /case-studies | Patient success stories listing |
| Case Study Detail | /case-studies/[slug] | Individual case studies (MDX) |
| Blog | /blog | Blog post listing |
| Blog Post | /blog/[slug] | Individual blog posts (MDX) |
| Pricing | /pricing | Service pricing tables |
| Testimonials | /testimonials | Client reviews page |
| FAQ | /faq | Accordion FAQ section |
| Contact | /contact | Contact form |
| Appointment | /appointment | Booking form |
| 404 | /404 | Custom not found page |
Project Structure
astra-template/
├── app/
│ ├── globals.css # Theme colors & global styles
│ ├── layout.tsx # Root layout
│ ├── not-found.tsx # 404 page
│ └── (marketing)/ # Route group
│ ├── layout.tsx # Marketing layout
│ ├── page.tsx # Homepage
│ ├── about/page.tsx
│ ├── appointment/page.tsx
│ ├── blog/
│ │ ├── page.tsx # Blog listing
│ │ └── [slug]/page.tsx # Blog post
│ ├── case-studies/
│ │ ├── page.tsx # Case studies listing
│ │ └── [slug]/page.tsx # Case study detail
│ ├── contact/page.tsx
│ ├── faq/page.tsx
│ ├── pricing/page.tsx
│ ├── services/
│ │ ├── page.tsx # Services listing
│ │ └── [slug]/page.tsx # Service detail
│ ├── team/page.tsx
│ └── testimonials/page.tsx
├── components/
│ ├── forms/
│ │ ├── BookingForm.tsx
│ │ ├── ContactForm.tsx
│ │ └── NewsletterForm.tsx
│ ├── layout/
│ │ ├── Header.tsx
│ │ └── Footer.tsx
│ ├── sections/
│ │ ├── home/ # Homepage sections
│ │ │ ├── Hero.tsx
│ │ │ ├── Services.tsx
│ │ │ ├── About.tsx
│ │ │ ├── BeforeAfter.tsx
│ │ │ ├── Testimonials.tsx
│ │ │ ├── Team.tsx
│ │ │ ├── Pricing.tsx
│ │ │ ├── Blog.tsx
│ │ │ ├── FAQ.tsx
│ │ │ ├── Booking.tsx
│ │ │ ├── CTA.tsx
│ │ │ └── Banner.tsx
│ │ ├── about/
│ │ ├── blog/
│ │ ├── case-studies/
│ │ ├── contact/
│ │ ├── faq/
│ │ ├── services/
│ │ ├── team/
│ │ └── testimonials/
│ ├── shared/
│ │ ├── PageHero.tsx
│ │ ├── PageTransition.tsx
│ │ ├── Breadcrumbs.tsx
│ │ ├── BlogCard.tsx
│ │ ├── ServiceCard.tsx
│ │ ├── CaseStudyCard.tsx
│ │ ├── TeamMemberCard.tsx
│ │ ├── TestimonialCard.tsx
│ │ ├── PricingCard.tsx
│ │ ├── CTACard.tsx
│ │ ├── ValueCard.tsx
│ │ ├── VideoCard.tsx
│ │ ├── Logo.tsx
│ │ ├── SocialLinks.tsx
│ │ └── TrustLogos.tsx
│ └── ui/
│ ├── Accordion.tsx
│ ├── Button.tsx
│ ├── Icon.tsx
│ ├── Input.tsx
│ ├── Select.tsx
│ └── Textarea.tsx
├── config/
│ ├── site.config.ts # Business info
│ ├── navigation.config.ts # Menu structure
│ └── seo.config.ts # SEO defaults
├── content/
│ ├── blog/ # MDX blog posts
│ │ ├── benefits-of-dental-implants.mdx
│ │ ├── child-first-dentist-visit.mdx
│ │ ├── invisalign-vs-braces.mdx
│ │ ├── oral-health-overall-wellness.mdx
│ │ ├── overcome-dental-anxiety.mdx
│ │ ├── teeth-whitening-guide.mdx
│ │ └── tips-for-healthy-teeth.mdx
│ ├── case-studies/ # MDX case studies
│ │ ├── overcoming-anxiety.mdx
│ │ ├── restoring-confidence.mdx
│ │ ├── smile-makeover.mdx
│ │ └── transforming-smiles.mdx
│ ├── services/ # MDX services
│ │ ├── cosmetic-dentistry.mdx
│ │ ├── dental-implants.mdx
│ │ ├── emergency-dental.mdx
│ │ ├── orthodontics.mdx
│ │ ├── preventive-care.mdx
│ │ └── teeth-whitening.mdx
│ ├── team.ts # Team members
│ ├── testimonials.ts # Reviews
│ ├── pricing.ts # Pricing plans
│ ├── faq.ts # FAQ items
│ ├── values.ts # Company values
│ ├── benefits.ts # Service benefits
│ ├── contact.ts # Contact info
│ └── partners.ts # Trust logos
├── lib/
│ ├── mdx.ts # MDX utilities
│ ├── mdx-components.tsx # Custom MDX components
│ ├── utils.ts # Helper functions
│ └── types/index.ts # TypeScript types
└── public/
└── images/Configuration
Site Config (config/site.config.ts)
export const siteConfig = {
name: "Astra Dental",
description: "Professional dental care for the whole family",
url: "https://yourdomain.com",
// Contact
phone: "(555) 123-4567",
email: "info@astradental.com",
address: "123 Dental Way, Suite 100, City, State 12345",
// Business hours
hours: {
weekdays: "8:00 AM - 6:00 PM",
saturday: "9:00 AM - 2:00 PM",
sunday: "Closed",
},
// Social links
social: {
facebook: "https://facebook.com/astradental",
instagram: "https://instagram.com/astradental",
twitter: "https://twitter.com/astradental",
linkedin: "https://linkedin.com/company/astradental",
},
};Navigation Config (config/navigation.config.ts)
export const navigationConfig = {
mainNav: [
{ label: "Home", href: "/" },
{ label: "Services", href: "/services" },
{ label: "About", href: "/about" },
{ label: "Team", href: "/team" },
{ label: "Blog", href: "/blog" },
{ label: "Contact", href: "/contact" },
],
ctaButton: {
label: "Book Appointment",
href: "/appointment",
},
};Content Management
MDX Content
Astra uses MDX for content that needs individual pages.
Blog Posts (content/blog/*.mdx)
---
title: "5 Tips for Healthy Teeth"
slug: "tips-for-healthy-teeth"
excerpt: "Simple daily habits for a healthier smile."
date: "2024-01-15"
author: "Dr. Jane Smith"
image: "/images/blog/healthy-teeth.jpg"
tags: ["dental care", "tips", "oral health"]
readTime: "5 min read"
---
Your blog content here...Required frontmatter:
| Field | Type | Description |
|---|---|---|
title | string | Post title |
slug | string | URL path |
excerpt | string | Short description |
date | string | Publication date (YYYY-MM-DD) |
author | string | Author name |
image | string | Featured image path |
Optional:
| Field | Type | Description |
|---|---|---|
tags | string[] | Post tags |
readTime | string | Estimated read time |
Services (content/services/*.mdx)
---
title: "Teeth Whitening"
slug: "teeth-whitening"
excerpt: "Professional whitening for a brighter smile."
icon: "Sparkle"
image: "/images/services/whitening.jpg"
price: "From $299"
duration: "1-2 hours"
featured: true
order: 1
---
Service description and details...Required frontmatter:
| Field | Type | Description |
|---|---|---|
title | string | Service name |
slug | string | URL path |
excerpt | string | Short description |
icon | string | Phosphor icon name |
image | string | Service image |
Optional:
| Field | Type | Description |
|---|---|---|
price | string | Starting price |
duration | string | Treatment time |
featured | boolean | Show on homepage |
order | number | Display order |
Case Studies (content/case-studies/*.mdx)
---
title: "Complete Smile Makeover"
slug: "smile-makeover"
excerpt: "Transforming Sarah's confidence with veneers."
patient: "Sarah M."
age: "34"
treatment: "Veneers & Whitening"
duration: "3 months"
beforeImage: "/images/cases/sarah-before.jpg"
afterImage: "/images/cases/sarah-after.jpg"
featured: true
---
Case study details...Required frontmatter:
| Field | Type | Description |
|---|---|---|
title | string | Case title |
slug | string | URL path |
excerpt | string | Brief description |
patient | string | Patient name/initials |
treatment | string | Treatment performed |
duration | string | Treatment duration |
beforeImage | string | Before photo |
afterImage | string | After photo |
TypeScript Content
Team (content/team.ts)
export interface TeamMember {
id: string;
name: string;
role: string;
bio: string;
image: string;
specialties?: string[];
education?: string[];
social?: {
linkedin?: string;
twitter?: string;
};
}
export const team: TeamMember[] = [
{
id: "dr-jane-smith",
name: "Dr. Jane Smith",
role: "Lead Dentist & Founder",
bio: "Dr. Smith has over 20 years of experience...",
image: "/images/team/jane-smith.jpg",
specialties: ["Cosmetic Dentistry", "Implants"],
education: ["DDS, UCLA", "Cosmetic Certification"],
},
];Testimonials (content/testimonials.ts)
export interface Testimonial {
id: string;
name: string;
content: string;
rating: number;
treatment?: string;
image?: string;
}
export const testimonials: Testimonial[] = [
{
id: "1",
name: "John D.",
content: "Amazing experience! The team was so professional...",
rating: 5,
treatment: "Dental Implants",
},
];Pricing (content/pricing.ts)
export interface PricingPlan {
id: string;
name: string;
description: string;
price: string;
features: string[];
highlighted?: boolean;
cta?: string;
}
export const pricing: PricingPlan[] = [
{
id: "cleaning",
name: "Basic Cleaning",
description: "Regular dental checkup",
price: "$99",
features: ["Exam", "Cleaning", "X-rays"],
},
];FAQ (content/faq.ts)
export interface FAQ {
id: string;
question: string;
answer: string;
category?: string;
}
export const faq: FAQ[] = [
{
id: "insurance",
question: "Do you accept insurance?",
answer: "Yes, we accept most major dental plans...",
category: "Insurance",
},
];Components
Forms
import { BookingForm, ContactForm, NewsletterForm } from "@/components/forms";
<BookingForm />
<ContactForm />
<NewsletterForm />UI Components
import { Button, Input, Select, Textarea, Accordion, Icon } from "@/components/ui";
// Buttons
<Button>Primary</Button>
<Button variant="secondary">Secondary</Button>
<Button variant="outline">Outline</Button>
// Icons (Phosphor)
<Icon name="Tooth" size={24} />
<Icon name="Phone" />
<Icon name="Calendar" />Shared Components
import {
PageHero,
PageTransition,
Breadcrumbs,
BlogCard,
ServiceCard,
TeamMemberCard,
TestimonialCard,
PricingCard,
CaseStudyCard,
} from "@/components/shared";Page Transitions
Astra includes smooth page transitions using Framer Motion:
import { PageTransition } from "@/components/shared";
export default function Page() {
return (
<PageTransition>
<YourPageContent />
</PageTransition>
);
}Icons
Astra uses Phosphor Icons. Browse available icons at phosphoricons.com .
import { Icon } from "@/components/ui";
// Usage
<Icon name="Tooth" />
<Icon name="Phone" />
<Icon name="MapPin" />
<Icon name="Calendar" />
<Icon name="Star" />
<Icon name="Heart" />Common icons used in Astra:
Tooth— Dental/servicesPhone— ContactMapPin— LocationCalendar— AppointmentsClock— Hours/durationStar— RatingsUser— Team/patientsChatCircle— Testimonials
Styling
Theme Colors (app/globals.css)
:root {
/* Primary brand color */
--primary: #0ea5e9;
--primary-dark: #0284c7;
/* Secondary accent */
--secondary: #8b5cf6;
/* Backgrounds */
--background: #ffffff;
--background-secondary: #f8fafc;
/* Text */
--foreground: #0f172a;
--foreground-muted: #64748b;
/* Functional */
--success: #22c55e;
--warning: #f59e0b;
--error: #ef4444;
}Customization Checklist
- ☐
config/site.config.ts— Business name, phone, email, address, hours - ☐
config/navigation.config.ts— Menu items - ☐
app/globals.css— Brand colors - ☐
content/team.ts— Your team members - ☐
content/services/*.mdx— Your services - ☐
content/pricing.ts— Your prices - ☐
content/testimonials.ts— Real reviews - ☐
content/faq.ts— Your FAQs - ☐
content/blog/*.mdx— Your blog posts - ☐
content/case-studies/*.mdx— Your case studies - ☐
public/images/— Replace all placeholder images
Deployment
Astra works with any Next.js hosting:
- Vercel — Recommended
- Netlify — Great alternative
- Self-hosted — Full control
npm run build
npm startSupport
- General Next.js help: Troubleshooting →
- Customization: Customization Guide →
- Astra-specific questions: support@capricorn.engineering
Quick Links:
Last updated on