├── scripts ├── utils.ts ├── pushToSupabase.ts ├── enrichRelatedPersonalities.ts └── generateHomepageData.ts ├── .firebaserc ├── app ├── favicon.ico ├── search │ └── actions.ts ├── consts.ts ├── globals.css ├── layout.tsx └── all │ └── types.ts ├── public ├── placeholder.png ├── vercel.svg ├── window.svg ├── file.svg ├── globe.svg ├── next.svg └── generated │ └── timeline.json ├── postcss.config.mjs ├── firebase.json ├── lib ├── supabase.ts └── utils.ts ├── next-sitemap.config.js ├── next.config.ts ├── components ├── ui │ ├── skeleton.tsx │ ├── collapsible.tsx │ ├── textarea.tsx │ ├── label.tsx │ ├── input.tsx │ ├── separator.tsx │ ├── progress.tsx │ ├── checkbox.tsx │ ├── slider.tsx │ ├── badge.tsx │ ├── tooltip.tsx │ ├── alert.tsx │ ├── tabs.tsx │ ├── button.tsx │ ├── card.tsx │ └── select.tsx ├── Searchbar.tsx ├── layouts │ ├── Header.tsx │ └── Footer.tsx └── QuickStats.tsx ├── components.json ├── eslint.config.mjs ├── .gitignore ├── data └── personalities │ ├── teja-singh-samundri.json │ ├── baba-zorawar-singh-ji.json │ ├── baba-deep-singh.json │ ├── bhai-kanhaiya-ji.json │ ├── baba-gurditta-ji.json │ ├── baba-ajit-singh-ji.json │ ├── mai-bhago.json │ ├── baba-ram-singh.json │ ├── bhai-randhir-singh-ji.json │ ├── mewa-singh-lopoke.json │ ├── bhai-mani-singh.json │ ├── mata-khivi.json │ ├── kartar-singh-sarabha.json │ ├── bhai-sahib-singh-ji.json │ ├── bhai-himmat-singh-ji.json │ ├── mata-nanaki-ji.json │ ├── bhai-dharam-singh-ji.json │ ├── prithi-chand.json │ ├── baba-jujhar-singh-ji.json │ └── bhai-mohkam-singh-ji.json ├── content-collections.ts ├── .github └── workflows │ ├── build_app.yml │ ├── firebase-hosting-merge.yml │ └── firebase-hosting-pull-request.yml ├── tsconfig.json ├── package.json ├── tailwind.config.ts ├── CONTRIBUTING.md ├── docs └── structed_output.md └── README.md /scripts/utils.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "gurbani-76363" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hardeepsingh980/sikhsoorme/main/app/favicon.ico -------------------------------------------------------------------------------- /public/placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hardeepsingh980/sikhsoorme/main/public/placeholder.png -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "public": "out", 4 | "ignore": [ 5 | "firebase.json", 6 | "**/.*", 7 | "**/node_modules/**" 8 | ] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/supabase.ts: -------------------------------------------------------------------------------- 1 | import { createClient } from '@supabase/supabase-js' 2 | 3 | export const supabase = createClient( 4 | process.env.NEXT_PUBLIC_SUPABASE_URL!, 5 | process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY! 6 | ) -------------------------------------------------------------------------------- /next-sitemap.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next-sitemap').IConfig} */ 2 | const config = { 3 | siteUrl: 'https://sikhsoorme.com', 4 | generateRobotsTxt: true, 5 | sitemapSize: 7000, 6 | outDir: './out', 7 | }; 8 | 9 | export default config; 10 | -------------------------------------------------------------------------------- /next.config.ts: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | import type { NextConfig } from "next"; 3 | 4 | const nextConfig: NextConfig = { 5 | output: "export", 6 | images: { 7 | unoptimized: true, 8 | } 9 | }; 10 | 11 | export default nextConfig; 12 | -------------------------------------------------------------------------------- /components/ui/skeleton.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils" 2 | 3 | function Skeleton({ 4 | className, 5 | ...props 6 | }: React.HTMLAttributes) { 7 | return ( 8 |
12 | ) 13 | } 14 | 15 | export { Skeleton } 16 | -------------------------------------------------------------------------------- /public/window.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/file.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /components/ui/collapsible.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" 4 | 5 | const Collapsible = CollapsiblePrimitive.Root 6 | 7 | const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger 8 | 9 | const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent 10 | 11 | export { Collapsible, CollapsibleTrigger, CollapsibleContent } 12 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.ts", 8 | "css": "app/globals.css", 9 | "baseColor": "neutral", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | }, 20 | "iconLibrary": "lucide" 21 | } -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import { dirname } from "path"; 2 | import { fileURLToPath } from "url"; 3 | import { FlatCompat } from "@eslint/eslintrc"; 4 | 5 | const __filename = fileURLToPath(import.meta.url); 6 | const __dirname = dirname(__filename); 7 | 8 | const compat = new FlatCompat({ 9 | baseDirectory: __dirname, 10 | }); 11 | 12 | const eslintConfig = [ 13 | ...compat.extends("next/core-web-vitals", "next/typescript"), 14 | { 15 | rules: { 16 | "@typescript-eslint/no-explicit-any": "off", 17 | }, 18 | }, 19 | ]; 20 | 21 | export default eslintConfig; 22 | -------------------------------------------------------------------------------- /app/search/actions.ts: -------------------------------------------------------------------------------- 1 | import { supabase } from "@/lib/supabase"; 2 | 3 | export default async function search(query: string) { 4 | 5 | if (!query || query.trim().length < 2) { 6 | return { error: "Query must be at least 2 characters." }; 7 | } 8 | 9 | const { data, error } = await supabase 10 | .from("soorme_index") 11 | .select("name, slug, category, excerpt, image, birth, death, birthPlace, era") 12 | .ilike("name", `%${query}%`) 13 | .limit(10); 14 | 15 | if (error) { 16 | return { error: error.message }; 17 | } 18 | 19 | return data; 20 | } 21 | -------------------------------------------------------------------------------- /lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | 8 | 9 | export function formatDate(dateString: string | undefined): string | null { 10 | if (!dateString) return null; 11 | try { 12 | const date = new Date(dateString); 13 | return new Intl.DateTimeFormat("en-US", { 14 | year: "numeric", 15 | month: "long", 16 | day: "numeric" 17 | }).format(date); 18 | } catch { 19 | return dateString; // fallback 20 | } 21 | } -------------------------------------------------------------------------------- /app/consts.ts: -------------------------------------------------------------------------------- 1 | import { Crown, Shield, Sword, Heart, BookOpen, Globe, Users, MapPin, Star, Eye, BarChart3, Search } from "lucide-react" 2 | 3 | export const MAP_ICON: Record> = { 4 | "Crown": Crown, 5 | "Shield": Shield, 6 | "Sword": Sword, 7 | "Heart": Heart, 8 | "BookOpen": BookOpen, 9 | "Globe": Globe, 10 | "Users": Users, 11 | "MapPin": MapPin, 12 | "Star": Star, 13 | "Eye": Eye, 14 | "BarChart3": BarChart3, 15 | "Search": Search, 16 | } 17 | 18 | 19 | export const GITHUB_REPO = "https://github.com/hardeepsingh980/sikhsoorme" 20 | export const GITHUB_EDIT_URL = `${GITHUB_REPO}/blob/main/data/personalities/` 21 | export const GITHUB_HISTORY_URL = `${GITHUB_REPO}/commits/main/data/personalities/` -------------------------------------------------------------------------------- /components/ui/textarea.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | const Textarea = React.forwardRef< 6 | HTMLTextAreaElement, 7 | React.ComponentProps<"textarea"> 8 | >(({ className, ...props }, ref) => { 9 | return ( 10 |