feat: add UI component files and navigation structure

Added various UI components and navigation elements including:
- Section cards and selection components
- Social icon SVGs with horizontal/vertical text variants
- Table, tabs, and toggle components
- Site header and sidebar components
- Tooltip and unauthorized page
- Project configuration files (tsconfig.json)
- Route handlers for health checks
- Utility and hook functions for mobile responsiveness
This commit is contained in:
joshuasalcedo-dev 2025-04-03 10:31:23 +08:00
parent a620991529
commit f691f5d570
63 changed files with 7956 additions and 2854 deletions

View file

@ -0,0 +1,614 @@
[
{
"id": 1,
"header": "Cover page",
"type": "Cover page",
"status": "In Process",
"target": "18",
"limit": "5",
"reviewer": "Eddie Lake"
},
{
"id": 2,
"header": "Table of contents",
"type": "Table of contents",
"status": "Done",
"target": "29",
"limit": "24",
"reviewer": "Eddie Lake"
},
{
"id": 3,
"header": "Executive summary",
"type": "Narrative",
"status": "Done",
"target": "10",
"limit": "13",
"reviewer": "Eddie Lake"
},
{
"id": 4,
"header": "Technical approach",
"type": "Narrative",
"status": "Done",
"target": "27",
"limit": "23",
"reviewer": "Jamik Tashpulatov"
},
{
"id": 5,
"header": "Design",
"type": "Narrative",
"status": "In Process",
"target": "2",
"limit": "16",
"reviewer": "Jamik Tashpulatov"
},
{
"id": 6,
"header": "Capabilities",
"type": "Narrative",
"status": "In Process",
"target": "20",
"limit": "8",
"reviewer": "Jamik Tashpulatov"
},
{
"id": 7,
"header": "Integration with existing systems",
"type": "Narrative",
"status": "In Process",
"target": "19",
"limit": "21",
"reviewer": "Jamik Tashpulatov"
},
{
"id": 8,
"header": "Innovation and Advantages",
"type": "Narrative",
"status": "Done",
"target": "25",
"limit": "26",
"reviewer": "Assign reviewer"
},
{
"id": 9,
"header": "Overview of EMR's Innovative Solutions",
"type": "Technical content",
"status": "Done",
"target": "7",
"limit": "23",
"reviewer": "Assign reviewer"
},
{
"id": 10,
"header": "Advanced Algorithms and Machine Learning",
"type": "Narrative",
"status": "Done",
"target": "30",
"limit": "28",
"reviewer": "Assign reviewer"
},
{
"id": 11,
"header": "Adaptive Communication Protocols",
"type": "Narrative",
"status": "Done",
"target": "9",
"limit": "31",
"reviewer": "Assign reviewer"
},
{
"id": 12,
"header": "Advantages Over Current Technologies",
"type": "Narrative",
"status": "Done",
"target": "12",
"limit": "0",
"reviewer": "Assign reviewer"
},
{
"id": 13,
"header": "Past Performance",
"type": "Narrative",
"status": "Done",
"target": "22",
"limit": "33",
"reviewer": "Assign reviewer"
},
{
"id": 14,
"header": "Customer Feedback and Satisfaction Levels",
"type": "Narrative",
"status": "Done",
"target": "15",
"limit": "34",
"reviewer": "Assign reviewer"
},
{
"id": 15,
"header": "Implementation Challenges and Solutions",
"type": "Narrative",
"status": "Done",
"target": "3",
"limit": "35",
"reviewer": "Assign reviewer"
},
{
"id": 16,
"header": "Security Measures and Data Protection Policies",
"type": "Narrative",
"status": "In Process",
"target": "6",
"limit": "36",
"reviewer": "Assign reviewer"
},
{
"id": 17,
"header": "Scalability and Future Proofing",
"type": "Narrative",
"status": "Done",
"target": "4",
"limit": "37",
"reviewer": "Assign reviewer"
},
{
"id": 18,
"header": "Cost-Benefit Analysis",
"type": "Plain language",
"status": "Done",
"target": "14",
"limit": "38",
"reviewer": "Assign reviewer"
},
{
"id": 19,
"header": "User Training and Onboarding Experience",
"type": "Narrative",
"status": "Done",
"target": "17",
"limit": "39",
"reviewer": "Assign reviewer"
},
{
"id": 20,
"header": "Future Development Roadmap",
"type": "Narrative",
"status": "Done",
"target": "11",
"limit": "40",
"reviewer": "Assign reviewer"
},
{
"id": 21,
"header": "System Architecture Overview",
"type": "Technical content",
"status": "In Process",
"target": "24",
"limit": "18",
"reviewer": "Maya Johnson"
},
{
"id": 22,
"header": "Risk Management Plan",
"type": "Narrative",
"status": "Done",
"target": "15",
"limit": "22",
"reviewer": "Carlos Rodriguez"
},
{
"id": 23,
"header": "Compliance Documentation",
"type": "Legal",
"status": "In Process",
"target": "31",
"limit": "27",
"reviewer": "Sarah Chen"
},
{
"id": 24,
"header": "API Documentation",
"type": "Technical content",
"status": "Done",
"target": "8",
"limit": "12",
"reviewer": "Raj Patel"
},
{
"id": 25,
"header": "User Interface Mockups",
"type": "Visual",
"status": "In Process",
"target": "19",
"limit": "25",
"reviewer": "Leila Ahmadi"
},
{
"id": 26,
"header": "Database Schema",
"type": "Technical content",
"status": "Done",
"target": "22",
"limit": "20",
"reviewer": "Thomas Wilson"
},
{
"id": 27,
"header": "Testing Methodology",
"type": "Technical content",
"status": "In Process",
"target": "17",
"limit": "14",
"reviewer": "Assign reviewer"
},
{
"id": 28,
"header": "Deployment Strategy",
"type": "Narrative",
"status": "Done",
"target": "26",
"limit": "30",
"reviewer": "Eddie Lake"
},
{
"id": 29,
"header": "Budget Breakdown",
"type": "Financial",
"status": "In Process",
"target": "13",
"limit": "16",
"reviewer": "Jamik Tashpulatov"
},
{
"id": 30,
"header": "Market Analysis",
"type": "Research",
"status": "Done",
"target": "29",
"limit": "32",
"reviewer": "Sophia Martinez"
},
{
"id": 31,
"header": "Competitor Comparison",
"type": "Research",
"status": "In Process",
"target": "21",
"limit": "19",
"reviewer": "Assign reviewer"
},
{
"id": 32,
"header": "Maintenance Plan",
"type": "Technical content",
"status": "Done",
"target": "16",
"limit": "23",
"reviewer": "Alex Thompson"
},
{
"id": 33,
"header": "User Personas",
"type": "Research",
"status": "In Process",
"target": "27",
"limit": "24",
"reviewer": "Nina Patel"
},
{
"id": 34,
"header": "Accessibility Compliance",
"type": "Legal",
"status": "Done",
"target": "18",
"limit": "21",
"reviewer": "Assign reviewer"
},
{
"id": 35,
"header": "Performance Metrics",
"type": "Technical content",
"status": "In Process",
"target": "23",
"limit": "26",
"reviewer": "David Kim"
},
{
"id": 36,
"header": "Disaster Recovery Plan",
"type": "Technical content",
"status": "Done",
"target": "14",
"limit": "17",
"reviewer": "Jamik Tashpulatov"
},
{
"id": 37,
"header": "Third-party Integrations",
"type": "Technical content",
"status": "In Process",
"target": "25",
"limit": "28",
"reviewer": "Eddie Lake"
},
{
"id": 38,
"header": "User Feedback Summary",
"type": "Research",
"status": "Done",
"target": "20",
"limit": "15",
"reviewer": "Assign reviewer"
},
{
"id": 39,
"header": "Localization Strategy",
"type": "Narrative",
"status": "In Process",
"target": "12",
"limit": "19",
"reviewer": "Maria Garcia"
},
{
"id": 40,
"header": "Mobile Compatibility",
"type": "Technical content",
"status": "Done",
"target": "28",
"limit": "31",
"reviewer": "James Wilson"
},
{
"id": 41,
"header": "Data Migration Plan",
"type": "Technical content",
"status": "In Process",
"target": "19",
"limit": "22",
"reviewer": "Assign reviewer"
},
{
"id": 42,
"header": "Quality Assurance Protocols",
"type": "Technical content",
"status": "Done",
"target": "30",
"limit": "33",
"reviewer": "Priya Singh"
},
{
"id": 43,
"header": "Stakeholder Analysis",
"type": "Research",
"status": "In Process",
"target": "11",
"limit": "14",
"reviewer": "Eddie Lake"
},
{
"id": 44,
"header": "Environmental Impact Assessment",
"type": "Research",
"status": "Done",
"target": "24",
"limit": "27",
"reviewer": "Assign reviewer"
},
{
"id": 45,
"header": "Intellectual Property Rights",
"type": "Legal",
"status": "In Process",
"target": "17",
"limit": "20",
"reviewer": "Sarah Johnson"
},
{
"id": 46,
"header": "Customer Support Framework",
"type": "Narrative",
"status": "Done",
"target": "22",
"limit": "25",
"reviewer": "Jamik Tashpulatov"
},
{
"id": 47,
"header": "Version Control Strategy",
"type": "Technical content",
"status": "In Process",
"target": "15",
"limit": "18",
"reviewer": "Assign reviewer"
},
{
"id": 48,
"header": "Continuous Integration Pipeline",
"type": "Technical content",
"status": "Done",
"target": "26",
"limit": "29",
"reviewer": "Michael Chen"
},
{
"id": 49,
"header": "Regulatory Compliance",
"type": "Legal",
"status": "In Process",
"target": "13",
"limit": "16",
"reviewer": "Assign reviewer"
},
{
"id": 50,
"header": "User Authentication System",
"type": "Technical content",
"status": "Done",
"target": "28",
"limit": "31",
"reviewer": "Eddie Lake"
},
{
"id": 51,
"header": "Data Analytics Framework",
"type": "Technical content",
"status": "In Process",
"target": "21",
"limit": "24",
"reviewer": "Jamik Tashpulatov"
},
{
"id": 52,
"header": "Cloud Infrastructure",
"type": "Technical content",
"status": "Done",
"target": "16",
"limit": "19",
"reviewer": "Assign reviewer"
},
{
"id": 53,
"header": "Network Security Measures",
"type": "Technical content",
"status": "In Process",
"target": "29",
"limit": "32",
"reviewer": "Lisa Wong"
},
{
"id": 54,
"header": "Project Timeline",
"type": "Planning",
"status": "Done",
"target": "14",
"limit": "17",
"reviewer": "Eddie Lake"
},
{
"id": 55,
"header": "Resource Allocation",
"type": "Planning",
"status": "In Process",
"target": "27",
"limit": "30",
"reviewer": "Assign reviewer"
},
{
"id": 56,
"header": "Team Structure and Roles",
"type": "Planning",
"status": "Done",
"target": "20",
"limit": "23",
"reviewer": "Jamik Tashpulatov"
},
{
"id": 57,
"header": "Communication Protocols",
"type": "Planning",
"status": "In Process",
"target": "15",
"limit": "18",
"reviewer": "Assign reviewer"
},
{
"id": 58,
"header": "Success Metrics",
"type": "Planning",
"status": "Done",
"target": "30",
"limit": "33",
"reviewer": "Eddie Lake"
},
{
"id": 59,
"header": "Internationalization Support",
"type": "Technical content",
"status": "In Process",
"target": "23",
"limit": "26",
"reviewer": "Jamik Tashpulatov"
},
{
"id": 60,
"header": "Backup and Recovery Procedures",
"type": "Technical content",
"status": "Done",
"target": "18",
"limit": "21",
"reviewer": "Assign reviewer"
},
{
"id": 61,
"header": "Monitoring and Alerting System",
"type": "Technical content",
"status": "In Process",
"target": "25",
"limit": "28",
"reviewer": "Daniel Park"
},
{
"id": 62,
"header": "Code Review Guidelines",
"type": "Technical content",
"status": "Done",
"target": "12",
"limit": "15",
"reviewer": "Eddie Lake"
},
{
"id": 63,
"header": "Documentation Standards",
"type": "Technical content",
"status": "In Process",
"target": "27",
"limit": "30",
"reviewer": "Jamik Tashpulatov"
},
{
"id": 64,
"header": "Release Management Process",
"type": "Planning",
"status": "Done",
"target": "22",
"limit": "25",
"reviewer": "Assign reviewer"
},
{
"id": 65,
"header": "Feature Prioritization Matrix",
"type": "Planning",
"status": "In Process",
"target": "19",
"limit": "22",
"reviewer": "Emma Davis"
},
{
"id": 66,
"header": "Technical Debt Assessment",
"type": "Technical content",
"status": "Done",
"target": "24",
"limit": "27",
"reviewer": "Eddie Lake"
},
{
"id": 67,
"header": "Capacity Planning",
"type": "Planning",
"status": "In Process",
"target": "21",
"limit": "24",
"reviewer": "Jamik Tashpulatov"
},
{
"id": 68,
"header": "Service Level Agreements",
"type": "Legal",
"status": "Done",
"target": "26",
"limit": "29",
"reviewer": "Assign reviewer"
}
]

View file

@ -0,0 +1,24 @@
import { AppSidebar } from "@components/app-sidebar"
import { SidebarInset, SidebarProvider } from "@components/ui/sidebar"
import { SiteHeader } from "@components/site-header"
export default function ShowcaseLayout({ children }: { children: React.ReactNode }) {
return (
<SidebarProvider
style={
{
"--sidebar-width": "calc(var(--spacing) * 72)",
"--header-height": "calc(var(--spacing) * 12)",
} as React.CSSProperties
}
>
<AppSidebar variant="inset" />
<SidebarInset>
<SiteHeader />
<div className="flex flex-1 flex-col">
<div className="@container/main flex flex-1 flex-col gap-2">{children}</div>
</div>
</SidebarInset>
</SidebarProvider>
)
}

View file

@ -0,0 +1,19 @@
import { ChartAreaInteractive } from "@components/chart-area-interactive"
import { DataTable } from "@components/data-table"
import { SectionCards } from "@components/section-cards"
import { SiteHeader } from "@components/site-header"
import { SidebarInset, SidebarProvider } from "@components/ui/sidebar"
import data from "./data.json"
export default function Page() {
return (
<div className="flex flex-col gap-4 py-4 md:gap-6 md:py-6">
<SectionCards />
<div className="px-4 lg:px-6">
<ChartAreaInteractive />
</div>
<DataTable data={data} />
</div>
)
}

40
app/error.tsx Normal file
View file

@ -0,0 +1,40 @@
"use client" // Error boundaries must be Client Components
import { AlertCircle } from "lucide-react"
import { useEffect } from "react"
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"
interface ErrorProps {
title: string
description: string
}
function ErrorAlert(errorProps: ErrorProps) {
return (
<Alert variant="destructive">
<AlertCircle className="h-4 w-4" />
<AlertTitle>{errorProps.title}</AlertTitle>
<AlertDescription>{errorProps.description}</AlertDescription>
</Alert>
)
}
export default function Error({ error, reset }: { error: Error & { digest?: string }; reset: () => void }) {
useEffect(() => {
// Log the error to an error reporting service
console.error(error)
}, [error])
return (
<div className="flex min-h-[50vh] flex-col items-center justify-center space-y-4 p-4">
<ErrorAlert title="Something went wrong!" description={error.message || "An unexpected error occurred."} />
<button
className="bg-primary text-primary-foreground hover:bg-primary/90 rounded-md px-4 py-2 transition-colors"
onClick={() => reset()}
>
Try again
</button>
</div>
)
}

42
app/forbidden.tsx Normal file
View file

@ -0,0 +1,42 @@
"use client"
import { AlertCircle, ArrowLeft, ShieldX } from "lucide-react"
import Link from "next/link"
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"
import { Button } from "@/components/ui/button"
import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"
export default function Forbidden() {
return (
<div className="flex min-h-[80vh] items-center justify-center">
<Card className="border-destructive/50 max-w-md">
<CardHeader className="space-y-1">
<div className="flex items-center gap-2">
<ShieldX className="text-destructive h-6 w-6" />
<CardTitle className="text-2xl">Access Forbidden</CardTitle>
</div>
<CardDescription>You don't have permission to access this resource</CardDescription>
</CardHeader>
<CardContent>
<Alert variant="destructive">
<AlertCircle className="h-4 w-4" />
<AlertTitle>Error 403</AlertTitle>
<AlertDescription>
You lack the necessary permissions to view this page. If you believe this is an error, please contact your
administrator.
</AlertDescription>
</Alert>
</CardContent>
<CardFooter className="flex justify-between">
<Button variant="outline" onClick={() => window.history.back()}>
<ArrowLeft className="mr-2 h-4 w-4" />
Go Back
</Button>
<Button asChild>
<Link href="/">Return Home</Link>
</Button>
</CardFooter>
</Card>
</div>
)
}

6
app/icon.svg Normal file
View file

@ -0,0 +1,6 @@
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="64" height="64" rx="12" fill="#09090B"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.2093 54.5027C16.1303 54.6684 17.0643 54.7512 18 54.75C20.9574 54.754 23.8557 53.9216 26.3603 52.349C28.1663 52.7737 30.0563 53 32 53C44.418 53 54.75 43.7367 54.75 32C54.75 20.2633 44.418 11 32 11C19.582 11 9.25 20.2633 9.25 32C9.25 37.621 11.6417 42.703 15.4893 46.448C16.0307 46.9753 16.1357 47.4467 16.082 47.715C15.7936 49.1665 15.1399 50.5205 14.1827 51.649C13.9839 51.8836 13.8505 52.1664 13.7959 52.469C13.7412 52.7716 13.7672 53.0832 13.8713 53.3725C13.9754 53.6618 14.1539 53.9186 14.3888 54.117C14.6237 54.3154 14.9067 54.4484 15.2093 54.5027ZM23.25 29.375C22.5538 29.375 21.8861 29.6516 21.3938 30.1438C20.9016 30.6361 20.625 31.3038 20.625 32C20.625 32.6962 20.9016 33.3639 21.3938 33.8562C21.8861 34.3484 22.5538 34.625 23.25 34.625C23.9462 34.625 24.6139 34.3484 25.1062 33.8562C25.5984 33.3639 25.875 32.6962 25.875 32C25.875 31.3038 25.5984 30.6361 25.1062 30.1438C24.6139 29.6516 23.9462 29.375 23.25 29.375ZM29.375 32C29.375 31.3038 29.6516 30.6361 30.1438 30.1438C30.6361 29.6516 31.3038 29.375 32 29.375C32.6962 29.375 33.3639 29.6516 33.8562 30.1438C34.3484 30.6361 34.625 31.3038 34.625 32C34.625 32.6962 34.3484 33.3639 33.8562 33.8562C33.3639 34.3484 32.6962 34.625 32 34.625C31.3038 34.625 30.6361 34.3484 30.1438 33.8562C29.6516 33.3639 29.375 32.6962 29.375 32ZM40.75 29.375C40.0538 29.375 39.3861 29.6516 38.8938 30.1438C38.4016 30.6361 38.125 31.3038 38.125 32C38.125 32.6962 38.4016 33.3639 38.8938 33.8562C39.3861 34.3484 40.0538 34.625 40.75 34.625C41.4462 34.625 42.1139 34.3484 42.6062 33.8562C43.0984 33.3639 43.375 32.6962 43.375 32C43.375 31.3038 43.0984 30.6361 42.6062 30.1438C42.1139 29.6516 41.4462 29.375 40.75 29.375Z" fill="#EFF6FF"/>
<rect x="41" y="9" width="14" height="14" rx="7" fill="#00AEEF"/>
<rect x="41" y="9" width="14" height="14" rx="7" stroke="#09090B" stroke-width="2"/>
</svg>

After

Width:  |  Height:  |  Size: 2 KiB

View file

@ -1,5 +1,19 @@
import "styles/tailwind.css"
// app/layout.tsx
export const metadata = {
openGraph: {
images: [
{
url: "/social-icon.svg", // Place it in public folder
width: 800,
height: 600,
alt: "Social share image",
},
],
},
}
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">

41
app/loading.tsx Normal file
View file

@ -0,0 +1,41 @@
import { Card, CardContent, CardFooter, CardHeader } from "@/components/ui/card"
import { Skeleton } from "@/components/ui/skeleton"
export default function Loading() {
return (
<div className="space-y-4 py-4">
<div className="flex items-center justify-between">
<Skeleton className="h-8 w-48" />
<Skeleton className="h-8 w-24" />
</div>
{/* Skeleton cards - repeat for multiple items */}
{Array(3)
.fill(0)
.map((_, index) => (
<Card key={index} className="mx-auto max-w-3xl">
<CardHeader className="gap-2">
<div className="flex items-center space-x-4">
<Skeleton className="h-12 w-12 rounded-full" />
<div className="space-y-2">
<Skeleton className="h-4 w-32" />
<Skeleton className="h-3 w-24" />
</div>
</div>
</CardHeader>
<CardContent className="space-y-2">
<Skeleton className="h-4 w-full" />
<Skeleton className="h-4 w-full" />
<Skeleton className="h-4 w-3/4" />
</CardContent>
<CardFooter>
<div className="flex w-full justify-between">
<Skeleton className="h-9 w-20" />
<Skeleton className="h-9 w-20" />
</div>
</CardFooter>
</Card>
))}
</div>
)
}

37
app/not-found.tsx Normal file
View file

@ -0,0 +1,37 @@
"use client"
import { ArrowLeft, FileQuestion, Home } from "lucide-react"
import Link from "next/link"
import { Button } from "@/components/ui/button"
import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"
export default function NotFound() {
return (
<div className="flex min-h-[80vh] items-center justify-center">
<Card className="max-w-md">
<CardHeader>
<div className="flex items-center gap-2">
<FileQuestion className="text-muted-foreground h-6 w-6" />
<CardTitle className="text-2xl">Page Not Found</CardTitle>
</div>
<CardDescription>We couldn't find the page you were looking for</CardDescription>
</CardHeader>
<CardContent className="text-muted-foreground">
<p>The page you requested doesn't exist or may have been moved.</p>
<div className="border-muted-foreground/20 mt-4 border-l-4 pl-4 text-sm italic">Error 404</div>
</CardContent>
<CardFooter className="flex justify-between">
<Button variant="outline" onClick={() => window.history.back()}>
<ArrowLeft className="mr-2 h-4 w-4" />
Go Back
</Button>
<Button asChild>
<Link href="/">
<Home className="mr-2 h-4 w-4" />
Return Home
</Link>
</Button>
</CardFooter>
</Card>
</div>
)
}

25
app/unauthorized.tsx Normal file
View file

@ -0,0 +1,25 @@
import { Lock } from "lucide-react"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
export default function Unauthorized() {
return (
<div className="flex min-h-[80vh] items-center justify-center">
<Card className="w-full max-w-md">
<CardHeader className="space-y-1">
<div className="flex items-center gap-2">
<Lock className="h-6 w-6 text-amber-500" />
<CardTitle className="text-2xl">Unauthorized Access</CardTitle>
</div>
<CardDescription>Please log in to access this page</CardDescription>
</CardHeader>
<CardContent className="space-y-4">
<div className="text-muted-foreground border-b pb-4 text-sm">
<p>You need to be authenticated to view the requested resource.</p>
<p className="mt-2 font-semibold">Error 401</p>
</div>
</CardContent>
</Card>
</div>
)
}

View file

@ -0,0 +1,77 @@
import { ArrowRight, Construction, MessageCircle, Send, Share2 } from "lucide-react"
import Image from "next/image"
import Link from "next/link"
import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"
import { Separator } from "@/components/ui/separator"
export default function UnderDevelopment() {
return (
<div className="bg-muted/40 flex min-h-screen items-center justify-center p-4">
<Card className="mx-auto w-full max-w-2xl">
<div className="flex justify-center pt-8">
<Image
src="/social-icon-with-horizontal-text-horizontal.svg"
alt="Chat Guide Logo"
width={320}
height={100}
priority
className="mb-2"
/>
</div>
<CardHeader className="space-y-2 px-8">
<div className="flex items-center justify-between">
<div className="flex items-center gap-2">
<MessageCircle className="h-7 w-7 text-pink-500" />
<CardTitle className="text-3xl">Chat Guide Coming Soon</CardTitle>
</div>
<Badge variant="outline" className="border-pink-200 bg-pink-100/50 px-4 py-1 text-base text-pink-500">
Soon
</Badge>
</div>
<CardDescription className="mt-2 text-lg">
I'm creating a blog to share my chat techniques, tips, and personal experiences from OnlyFans
</CardDescription>
</CardHeader>
<Separator />
<CardContent className="px-8 pt-8 pb-6">
<div className="space-y-6">
<div className="flex items-start gap-4">
<Share2 className="text-muted-foreground mt-0.5 h-6 w-6" />
<div>
<p className="text-lg font-medium">My blog is almost ready!</p>
<p className="text-muted-foreground mt-2">
I'm putting together my best chat strategies, engagement tips, and stories from my personal experience
to help other creators connect better with their fans.
</p>
</div>
</div>
<div className="bg-muted rounded-lg p-6 text-base">
<p className="mb-3 text-lg font-semibold">What I'll be sharing:</p>
<ul className="text-muted-foreground list-disc space-y-2 pl-6">
<li>Chat techniques that increase engagement</li>
<li>How to build genuine connections</li>
<li>Tips for managing conversations</li>
<li>Real examples from my experience</li>
</ul>
</div>
</div>
</CardContent>
<CardFooter className="flex justify-between px-8 pb-8">
<Button variant="outline" size="lg" asChild>
<Link href="mailto:contact@subscribers.chat">Email me</Link>
</Button>
<Button size="lg" asChild className="bg-[#0088cc] hover:bg-[#0077b5]">
<Link href="https://t.me/onated2" target="_blank" rel="noopener noreferrer">
<Send className="mr-2 h-5 w-5" />
Telegram
</Link>
</Button>
</CardFooter>
</Card>
</div>
)
}