@titas_mallick/wedding-site-gen 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/.eslintignore +20 -0
  2. package/.eslintrc.json +93 -0
  3. package/.recover +9 -0
  4. package/.vscode/settings.json +3 -0
  5. package/LICENSE +21 -0
  6. package/README.md +83 -0
  7. package/app/Neo-Lucentism/layout.tsx +7 -0
  8. package/app/Neo-Lucentism/page.tsx +259 -0
  9. package/app/couple/layout.tsx +7 -0
  10. package/app/couple/page.tsx +164 -0
  11. package/app/error.tsx +31 -0
  12. package/app/guestbook/page.tsx +470 -0
  13. package/app/invitation/[slug]/layout.tsx +36 -0
  14. package/app/invitation/[slug]/page.tsx +462 -0
  15. package/app/invitation/maker/auth.js +165 -0
  16. package/app/invitation/maker/dashboard.js +81 -0
  17. package/app/invitation/maker/guestAdder.js +204 -0
  18. package/app/invitation/maker/guestShower.js +287 -0
  19. package/app/invitation/maker/layout.tsx +11 -0
  20. package/app/invitation/maker/page.js +168 -0
  21. package/app/invitation/maker/rsvpViewer.js +122 -0
  22. package/app/layout.tsx +98 -0
  23. package/app/mark-the-dates/layout.tsx +7 -0
  24. package/app/mark-the-dates/page.tsx +196 -0
  25. package/app/memories/layout.tsx +7 -0
  26. package/app/memories/page.tsx +29 -0
  27. package/app/page.tsx +5 -0
  28. package/app/providers.tsx +33 -0
  29. package/app/sagun/layout.tsx +7 -0
  30. package/app/sagun/page.tsx +348 -0
  31. package/app/song-requests/page.tsx +354 -0
  32. package/app/sukanya/layout.tsx +7 -0
  33. package/app/sukanya/page.tsx +167 -0
  34. package/app/titas/layout.tsx +7 -0
  35. package/app/titas/page.tsx +175 -0
  36. package/app/travel-guide/page.tsx +400 -0
  37. package/app/updates/maker/page.js +323 -0
  38. package/app/updates/overlay/page.tsx +144 -0
  39. package/app/updates/page.js +207 -0
  40. package/cli.mjs +196 -0
  41. package/components/ConciergeBot.tsx +203 -0
  42. package/components/CountdownTimer.tsx +137 -0
  43. package/components/Gallery.tsx +372 -0
  44. package/components/LiveVideos.tsx +173 -0
  45. package/components/OurStory.tsx +160 -0
  46. package/components/certificate.jsx +300 -0
  47. package/components/counter.tsx +14 -0
  48. package/components/footer.tsx +89 -0
  49. package/components/hero.tsx +136 -0
  50. package/components/icons.tsx +283 -0
  51. package/components/importantNews.js +168 -0
  52. package/components/navbar.tsx +106 -0
  53. package/components/primitives.ts +53 -0
  54. package/components/sagun.js +22 -0
  55. package/components/theme-switch.tsx +81 -0
  56. package/components/updates.tsx +118 -0
  57. package/components/weddingcard.js +68 -0
  58. package/components/weddingcard2.js +58 -0
  59. package/config/firebase-admin.js +17 -0
  60. package/config/firebase.ts +36 -0
  61. package/config/fonts.ts +21 -0
  62. package/config/site.ts +74 -0
  63. package/next-env.d.ts +6 -0
  64. package/next.config.js +4 -0
  65. package/package.json +64 -0
  66. package/postcss.config.js +6 -0
  67. package/public/DCV.gif +0 -0
  68. package/public/DCV2.gif +0 -0
  69. package/public/DCV3.gif +0 -0
  70. package/public/Images/1.jpg +0 -0
  71. package/public/Images/11.jpg +0 -0
  72. package/public/Images/12.jpg +0 -0
  73. package/public/Images/13.jpg +0 -0
  74. package/public/Images/14.jpg +0 -0
  75. package/public/Images/15.jpg +0 -0
  76. package/public/Images/16.jpg +0 -0
  77. package/public/Images/17.jpg +0 -0
  78. package/public/Images/18.jpg +0 -0
  79. package/public/Images/19.jpg +0 -0
  80. package/public/Images/2.jpg +0 -0
  81. package/public/Images/20.jpg +0 -0
  82. package/public/Images/21.jpg +0 -0
  83. package/public/Images/22.jpg +0 -0
  84. package/public/Images/3.jpg +0 -0
  85. package/public/Images/4.jpg +0 -0
  86. package/public/Images/5.jpg +0 -0
  87. package/public/Images/6.jpg +0 -0
  88. package/public/Images/7.jpg +0 -0
  89. package/public/Images/8.jpg +0 -0
  90. package/public/Images/9.jpg +0 -0
  91. package/public/Images/9b.jpg +0 -0
  92. package/public/Images/Patipatra.jpeg +0 -0
  93. package/public/audio (1).mp3 +0 -0
  94. package/public/audio (2).mp3 +0 -0
  95. package/public/bride.jpg +0 -0
  96. package/public/corner1-01.svg +1 -0
  97. package/public/favicon.ico +0 -0
  98. package/public/groom.jpg +0 -0
  99. package/public/invite.png +0 -0
  100. package/public/love-birds.png +0 -0
  101. package/public/next.svg +1 -0
  102. package/public/pubqr.png +0 -0
  103. package/public/pw/001.jpg +0 -0
  104. package/public/pw/002.jpg +0 -0
  105. package/public/pw/003.jpg +0 -0
  106. package/public/pw/004.jpg +0 -0
  107. package/public/pw/005.jpg +0 -0
  108. package/public/pw/006.jpg +0 -0
  109. package/public/pw/007.jpg +0 -0
  110. package/public/pw/008.jpg +0 -0
  111. package/public/pw/009.jpg +0 -0
  112. package/public/pw/010.jpg +0 -0
  113. package/public/pw/011.jpg +0 -0
  114. package/public/pw/012.jpg +0 -0
  115. package/public/pw/013.jpg +0 -0
  116. package/public/pw/014.jpg +0 -0
  117. package/public/pw/015.jpg +0 -0
  118. package/public/pw/016.jpg +0 -0
  119. package/public/pw/017.jpg +0 -0
  120. package/public/pw/018.jpg +0 -0
  121. package/public/pw/019.jpg +0 -0
  122. package/public/pw/020.jpg +0 -0
  123. package/public/pw/021.jpg +0 -0
  124. package/public/pw/022.jpg +0 -0
  125. package/public/pw/023.jpg +0 -0
  126. package/public/pw/024.jpg +0 -0
  127. package/public/pw/025.jpg +0 -0
  128. package/public/pw/026.jpg +0 -0
  129. package/public/pw/027.jpg +0 -0
  130. package/public/pw/028.jpg +0 -0
  131. package/public/pw/029.jpg +0 -0
  132. package/public/pw/030.jpg +0 -0
  133. package/public/pw/031.jpg +0 -0
  134. package/public/pw/032.jpg +0 -0
  135. package/public/qr.png +0 -0
  136. package/public/vercel.svg +1 -0
  137. package/styles/globals.css +3 -0
  138. package/tailwind.config.js +51 -0
  139. package/tsconfig.json +45 -0
  140. package/tsconfig.tsbuildinfo +1 -0
  141. package/types/index.ts +5 -0
package/.eslintignore ADDED
@@ -0,0 +1,20 @@
1
+ .now/*
2
+ *.css
3
+ .changeset
4
+ dist
5
+ esm/*
6
+ public/*
7
+ tests/*
8
+ scripts/*
9
+ *.config.js
10
+ .DS_Store
11
+ node_modules
12
+ coverage
13
+ .next
14
+ build
15
+ !.commitlintrc.cjs
16
+ !.lintstagedrc.cjs
17
+ !jest.config.js
18
+ !plopfile.js
19
+ !react-shim.js
20
+ !tsup.config.ts
package/.eslintrc.json ADDED
@@ -0,0 +1,93 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/eslintrc.json",
3
+ "env": {
4
+ "browser": false,
5
+ "es2021": true,
6
+ "node": true
7
+ },
8
+ "extends": [
9
+ "plugin:react/recommended",
10
+ "plugin:prettier/recommended",
11
+ "plugin:react-hooks/recommended",
12
+ "plugin:jsx-a11y/recommended",
13
+ "plugin:@next/next/recommended"
14
+ ],
15
+ "plugins": ["react", "unused-imports", "import", "@typescript-eslint", "jsx-a11y", "prettier"],
16
+ "parser": "@typescript-eslint/parser",
17
+ "parserOptions": {
18
+ "ecmaFeatures": {
19
+ "jsx": true
20
+ },
21
+ "ecmaVersion": 12,
22
+ "sourceType": "module"
23
+ },
24
+ "settings": {
25
+ "react": {
26
+ "version": "detect"
27
+ }
28
+ },
29
+ "rules": {
30
+ "no-console": "warn",
31
+ "react/prop-types": "off",
32
+ "react/jsx-uses-react": "off",
33
+ "react/react-in-jsx-scope": "off",
34
+ "react-hooks/exhaustive-deps": "off",
35
+ "jsx-a11y/click-events-have-key-events": "warn",
36
+ "jsx-a11y/interactive-supports-focus": "warn",
37
+ "prettier/prettier": "warn",
38
+ "no-unused-vars": "off",
39
+ "unused-imports/no-unused-vars": "off",
40
+ "unused-imports/no-unused-imports": "warn",
41
+ "@typescript-eslint/no-unused-vars": [
42
+ "warn",
43
+ {
44
+ "args": "after-used",
45
+ "ignoreRestSiblings": false,
46
+ "argsIgnorePattern": "^_.*?$"
47
+ }
48
+ ],
49
+ "import/order": [
50
+ "warn",
51
+ {
52
+ "groups": [
53
+ "type",
54
+ "builtin",
55
+ "object",
56
+ "external",
57
+ "internal",
58
+ "parent",
59
+ "sibling",
60
+ "index"
61
+ ],
62
+ "pathGroups": [
63
+ {
64
+ "pattern": "~/**",
65
+ "group": "external",
66
+ "position": "after"
67
+ }
68
+ ],
69
+ "newlines-between": "always"
70
+ }
71
+ ],
72
+ "react/self-closing-comp": "warn",
73
+ "react/jsx-sort-props": [
74
+ "warn",
75
+ {
76
+ "callbacksLast": true,
77
+ "shorthandFirst": true,
78
+ "noSortAlphabetically": false,
79
+ "reservedFirst": true
80
+ }
81
+ ],
82
+ "padding-line-between-statements": [
83
+ "warn",
84
+ {"blankLine": "always", "prev": "*", "next": "return"},
85
+ {"blankLine": "always", "prev": ["const", "let", "var"], "next": "*"},
86
+ {
87
+ "blankLine": "any",
88
+ "prev": ["const", "let", "var"],
89
+ "next": ["const", "let", "var"]
90
+ }
91
+ ]
92
+ }
93
+ }
package/.recover ADDED
@@ -0,0 +1,9 @@
1
+ NEXT_PUBLIC_PROJECTID=wedding-forever-titas-sukanya
2
+ NEXT_PUBLIC_STORAGEBUCKET=wedding-forever-titas-sukanya.firebasestorage.app
3
+ NEXT_PUBLIC_SENDERID=167546706421
4
+ NEXT_PUBLIC_APPID=1:167546706421:web:3d30acd2d93399e38a28bc
5
+ NEXT_PUBLIC_MEASUREMENTID=G-85Y3N7H008
6
+ NEXT_PUBLIC_RECAPTCHA_SITE_KEY=3030842520057Cg*
7
+ NEXT_PUBLIC_APIKEY=AIzaSyBdy2511gv-oTpNdxgTj6KBWVwzHCLsMs8
8
+ NEXT_PUBLIC_AUTHDOMAIN=wedding-forever-titas-sukanya.firebaseapp.com
9
+ NEXT_PUBLIC_GEMINI_API_KEY=AIzaSyD07qoS5JyslAJLKZ0xKZKCiuj5H5d_oSw
@@ -0,0 +1,3 @@
1
+ {
2
+ "typescript.tsdk": "node_modules/typescript/lib"
3
+ }
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 Next UI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # Titas & Sukanya's Wedding: A Modern AI-Powered Platform
2
+
3
+ A comprehensive, interactive, and intelligent web application built for the wedding of Titas and Sukanya. This platform serves as a digital invitation hub, a real-time event assistant, and a collaborative memory wall.
4
+
5
+ ## ✨ Core Features
6
+
7
+ ### 🤖 AI-Powered Intelligence
8
+ - **Wedding Concierge (Gemini 2.5-flash)**: A sitewide floating chatbot that answers guest queries about venues, schedules, and the couple's 10-year journey.
9
+ - **Smart Bengali Translation**: Instantly translates invitation details into elegant, formal Bengali script for guests.
10
+ - **AI Content Refinement**: An admin tool to polish rough updates into poetic, wedding-appropriate announcements.
11
+ - **Sentiment Wall**: Automatically summarizes guest wishes into a beautiful "Collective Blessing" using AI analysis.
12
+
13
+ ### 📸 Interactive Guest Experience
14
+ - **Digital Guestbook**: Allows guests to upload photos directly from their devices. Features client-side compression/resizing and an immersive lightbox gallery.
15
+ - **Reception Playlist**: A real-time queue where guests can request songs for the reception party.
16
+ - **Live RSVP System**: Secure confirm-attendance form with food preferences and guest counts.
17
+ - **Travel & Stay Guide**: Dynamic, venue-aware guide with heritage highlights, hotel recommendations, and "Bengali 101."
18
+
19
+ ### 🎥 Broadcast & Display
20
+ - **OBS Broadcast Overlay**: A dedicated `/updates/overlay` route designed for venue video walls. Features a real-time clock, QR codes, and a chroma-key ready green background.
21
+ - **Live Countdown**: High-impact, animated timer counting down to the wedding on January 23, 2026.
22
+
23
+ ## 🚀 Tech Stack
24
+
25
+ - **Framework**: Next.js (App Router)
26
+ - **UI Components**: HeroUI (formerly NextUI)
27
+ - **Animations**: Framer Motion
28
+ - **Database & Auth**: Firebase (Firestore & Authentication)
29
+ - **AI Model**: Google Gemini 2.5-flash
30
+ - **Image Hosting**: Cloudinary (Unsigned Uploads)
31
+ - **Analytics**: Vercel Analytics
32
+
33
+ ## 🛠️ Setup & Maintenance
34
+
35
+ ### 1. Environment Variables
36
+ Create a `.env.local` file with the following keys:
37
+
38
+ ```bash
39
+ # Firebase Client Config
40
+ NEXT_PUBLIC_APIKEY=
41
+ NEXT_PUBLIC_AUTHDOMAIN=
42
+ NEXT_PUBLIC_PROJECTID=
43
+ NEXT_PUBLIC_STORAGEBUCKET=
44
+ NEXT_PUBLIC_SENDERID=
45
+ NEXT_PUBLIC_APPID=
46
+ NEXT_PUBLIC_MEASUREMENTID=
47
+ NEXT_PUBLIC_RECAPTCHA_SITE_KEY=
48
+
49
+ # Google Gemini AI
50
+ NEXT_PUBLIC_GEMINI_API_KEY=
51
+
52
+ # Cloudinary Config
53
+ NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=
54
+ NEXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET= # Should be an 'Unsigned' preset
55
+ ```
56
+
57
+ ### 2. Admin Access
58
+ The email **`titas@titas.titas`** is hardcoded as the primary administrator. When logged in with this account:
59
+ - **Guestbook**: A delete button appears on all guest photos.
60
+ - **Song Requests**: "Mark as Played" and "Delete" controls are enabled in the queue.
61
+ - **Updates**: Ability to post and refine messages via AI.
62
+
63
+ ### 3. Cloudinary Configuration
64
+ To enable guest uploads:
65
+ 1. Create a Cloudinary account.
66
+ 2. Go to **Settings > Upload**.
67
+ 3. Create an **Unsigned Upload Preset** named `wedding`.
68
+ 4. Update the `NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME` in `.env.local`.
69
+
70
+ ### 4. OBS Overlay Setup
71
+ - **URL**: `https://your-domain.com/updates/overlay`
72
+ - **Recommended Res**: 1920x1080
73
+ - **Filter**: Add a **Chroma Key** filter in OBS and select **Green** to remove the background.
74
+
75
+ ## 📁 Project Structure Highlights
76
+ - `/app/invitation/[slug]`: The core personalized guest experience.
77
+ - `/app/updates/maker`: Admin dashboard for news and announcements.
78
+ - `/app/song-requests`: Consolidated guest form and admin queue.
79
+ - `/app/guestbook`: Real-time masonry gallery with Cloudinary integration.
80
+ - `/components/ConciergeBot.tsx`: The sitewide AI assistant component.
81
+
82
+ ## 📜 License
83
+ This project is private and intended for the wedding of Titas Mallick & Sukanya Saha.
@@ -0,0 +1,7 @@
1
+ export default function NeoLucentismLayout({
2
+ children,
3
+ }: {
4
+ children: React.ReactNode;
5
+ }) {
6
+ return <div className="w-full">{children}</div>;
7
+ }
@@ -0,0 +1,259 @@
1
+ "use client";
2
+
3
+ import { motion } from "framer-motion";
4
+ import { Card, CardBody, Divider } from "@heroui/react";
5
+
6
+ import { fontCursive, fontSans, fontMono } from "@/config/fonts";
7
+ import {
8
+ HeartFilledIcon,
9
+ SunFilledIcon,
10
+ MoonFilledIcon,
11
+ } from "@/components/icons";
12
+
13
+ const fadeInUp = {
14
+ initial: { opacity: 0, y: 20 },
15
+ whileInView: { opacity: 1, y: 0 },
16
+ viewport: { once: true },
17
+ transition: { duration: 0.8 },
18
+ };
19
+
20
+ const tenets = [
21
+ {
22
+ title: "Light in the Void",
23
+ desc: "The universe is silent and indifferent — this is freedom. Meaning is ours to create.",
24
+ icon: <SunFilledIcon className="text-wedding-gold-500 w-6 h-6" />,
25
+ },
26
+ {
27
+ title: "Presence Over Promise",
28
+ desc: "There is no afterlife. The present moment is sacred enough.",
29
+ icon: <MoonFilledIcon className="text-indigo-400 w-6 h-6" />,
30
+ },
31
+ {
32
+ title: "Compassion Without Karma",
33
+ desc: "Kindness is not transactional. It is our natural responsibility.",
34
+ icon: <HeartFilledIcon className="text-wedding-pink-500 w-6 h-6" />,
35
+ },
36
+ {
37
+ title: "Mindfulness Without Myth",
38
+ desc: "We seek awareness, not awakening. Lucidity is the goal, not enlightenment.",
39
+ icon: <div className="w-6 h-6 rounded-full border-2 border-default-400" />,
40
+ },
41
+ {
42
+ title: "Reason with Reverence",
43
+ desc: "Science and logic illuminate reality — but so do stillness and art.",
44
+ icon: (
45
+ <div className="w-6 h-6 rotate-45 border-2 border-wedding-gold-400" />
46
+ ),
47
+ },
48
+ {
49
+ title: "Impermanence as Inspiration",
50
+ desc: "Nothing lasts — and that makes everything matter more.",
51
+ icon: <div className="w-6 h-6 border-b-2 border-default-500" />,
52
+ },
53
+ ];
54
+
55
+ export default function NeoLucentismPage() {
56
+ return (
57
+ <div className="w-full min-h-screen pb-20 overflow-hidden">
58
+ {/* Hero Section */}
59
+ <section className="relative py-24 md:py-32 px-4 flex flex-col items-center text-center">
60
+ {/* Celestial background elements */}
61
+ <div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[800px] h-[800px] bg-indigo-500/10 dark:bg-indigo-900/10 rounded-full blur-[120px] pointer-events-none" />
62
+ <div className="absolute top-40 left-1/4 w-2 h-2 bg-wedding-gold-400 rounded-full animate-pulse" />
63
+ <div className="absolute bottom-40 right-1/4 w-1.5 h-1.5 bg-wedding-pink-400 rounded-full animate-pulse delay-700" />
64
+
65
+ <motion.div {...fadeInUp} className="relative z-10">
66
+ <h1
67
+ className={`${fontCursive.className} text-6xl md:text-8xl lg:text-9xl bg-gradient-to-r from-indigo-500 via-purple-500 to-wedding-gold-500 bg-clip-text text-transparent mb-8 py-4 leading-normal`}
68
+ >
69
+ Neo-Lucentism
70
+ </h1>
71
+ <p className="text-default-500 dark:text-default-400 text-xl md:text-2xl italic max-w-2xl mx-auto font-light">
72
+ &quot;We are lights in the void — brief, brilliant, and free.&quot;
73
+ </p>
74
+ </motion.div>
75
+ </section>
76
+
77
+ {/* Intro Text */}
78
+ <section className="container mx-auto max-w-4xl px-6 mb-24">
79
+ <motion.div
80
+ {...fadeInUp}
81
+ className={`${fontSans.className} text-lg md:text-xl leading-relaxed text-default-800 dark:text-white text-center border-y border-default-100 dark:border-white/10 py-12`}
82
+ >
83
+ Neo-Lucentism is a secular spiritual philosophy that embraces the
84
+ absence of divine purpose as an invitation to create beauty, kindness,
85
+ and meaning in the fleeting space between birth and death. It draws
86
+ from humanism, secular Buddhism, and optimistic nihilism.
87
+ </motion.div>
88
+ </section>
89
+
90
+ {/* Tenets Grid */}
91
+ <section className="container mx-auto max-w-6xl px-4 mb-32">
92
+ <h2
93
+ className={`${fontMono.className} text-center text-3xl mb-16 uppercase tracking-widest text-default-400`}
94
+ >
95
+ The Core Tenets
96
+ </h2>
97
+ <div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
98
+ {tenets.map((tenet, idx) => (
99
+ <motion.div
100
+ key={idx}
101
+ initial={{ opacity: 0, y: 20 }}
102
+ transition={{ delay: idx * 0.1 }}
103
+ viewport={{ once: true }}
104
+ whileInView={{ opacity: 1, y: 0 }}
105
+ >
106
+ <Card className="h-full bg-white/50 dark:bg-white/5 backdrop-blur-md border border-default-100 dark:border-white/10 hover:-translate-y-2 transition-transform duration-500 shadow-xl">
107
+ <CardBody className="p-8 flex flex-col items-center text-center">
108
+ <div className="mb-6 p-4 rounded-full bg-default-50 dark:bg-white/5 shadow-inner">
109
+ {tenet.icon}
110
+ </div>
111
+ <h3
112
+ className={`${fontSans.className} text-xl font-bold mb-4 text-default-900 dark:text-white`}
113
+ >
114
+ {idx + 1}. {tenet.title}
115
+ </h3>
116
+ <p className="text-default-600 dark:text-gray-300">
117
+ {tenet.desc}
118
+ </p>
119
+ </CardBody>
120
+ </Card>
121
+ </motion.div>
122
+ ))}
123
+ </div>
124
+ </section>
125
+
126
+ {/* Practices & Ethics */}
127
+ <section className="bg-default-50 dark:bg-white/5 py-24 px-4 relative">
128
+ <div className="container mx-auto max-w-5xl grid md:grid-cols-2 gap-16">
129
+ <motion.div {...fadeInUp}>
130
+ <h2
131
+ className={`${fontSans.className} text-3xl font-bold mb-8 text-indigo-600 dark:text-indigo-400`}
132
+ >
133
+ Lucent Practices
134
+ </h2>
135
+ <ul className="space-y-6">
136
+ {[
137
+ "Begin your day with 2 minutes of silence or intentional breath.",
138
+ "Reflect on impermanence — everything you experience is passing.",
139
+ "Read or engage with one meaningful idea per day.",
140
+ "Speak with clarity and compassion, even in disagreement.",
141
+ "Offer kindness without needing a reason or reward.",
142
+ "Create something — even a thought, a poem, a gesture.",
143
+ ].map((item, i) => (
144
+ <li
145
+ key={i}
146
+ className="flex gap-4 items-start text-default-700 dark:text-white text-lg"
147
+ >
148
+ <span className="w-6 h-6 rounded-full bg-indigo-100 dark:bg-indigo-900/30 text-indigo-600 flex-shrink-0 flex items-center justify-center text-xs font-bold mt-1">
149
+ {i + 1}
150
+ </span>
151
+ {item}
152
+ </li>
153
+ ))}
154
+ </ul>
155
+ </motion.div>
156
+
157
+ <motion.div {...fadeInUp} transition={{ delay: 0.2 }}>
158
+ <h2
159
+ className={`${fontSans.className} text-3xl font-bold mb-8 text-wedding-pink-600 dark:text-wedding-pink-400`}
160
+ >
161
+ Ethical Code
162
+ </h2>
163
+ <div className="space-y-10">
164
+ <div>
165
+ <h3 className="uppercase tracking-widest text-xs font-bold text-default-400 mb-4">
166
+ What to Do
167
+ </h3>
168
+ <ul className="space-y-4">
169
+ {[
170
+ "Act with empathy, not ego.",
171
+ "Be present with your sensations, emotions, and thoughts.",
172
+ "Question beliefs — including your own — with kindness.",
173
+ "Respect the silence between things. Practice mindful pauses.",
174
+ "Use reason and evidence while staying humble in knowledge.",
175
+ ].map((item, i) => (
176
+ <li
177
+ key={i}
178
+ className="flex gap-3 items-center text-default-700 dark:text-white"
179
+ >
180
+ <div className="w-1.5 h-1.5 rounded-full bg-green-500" />
181
+ {item}
182
+ </li>
183
+ ))}
184
+ </ul>
185
+ </div>
186
+ <Divider className="opacity-50" />
187
+ <div>
188
+ <h3 className="uppercase tracking-widest text-xs font-bold text-default-400 mb-4">
189
+ What Not to Do
190
+ </h3>
191
+ <ul className="space-y-4">
192
+ {[
193
+ "Do not claim certainty over the unknowable.",
194
+ "Do not seek salvation, judgment, or cosmic reward.",
195
+ "Do not harm in the name of truth, logic, or freedom.",
196
+ "Do not use Lucentism to divide or dominate.",
197
+ ].map((item, i) => (
198
+ <li
199
+ key={i}
200
+ className="flex gap-3 items-center text-default-700 dark:text-white"
201
+ >
202
+ <div className="w-1.5 h-1.5 rounded-full bg-red-500" />
203
+ {item}
204
+ </li>
205
+ ))}
206
+ </ul>
207
+ </div>
208
+ </div>
209
+ </motion.div>
210
+ </div>
211
+ </section>
212
+
213
+ {/* How to Follow */}
214
+ <section className="container mx-auto max-w-4xl px-6 py-32 text-center">
215
+ <motion.div {...fadeInUp}>
216
+ <h2
217
+ className={`${fontSans.className} text-4xl font-bold mb-8 text-default-900 dark:text-white`}
218
+ >
219
+ Following the Light
220
+ </h2>
221
+ <p className="text-default-600 dark:text-gray-300 text-lg mb-12">
222
+ You do not need rituals, temples, or dogma. To follow Lucentism is
223
+ to live with awareness, compassion, and clarity. Connect with others
224
+ not as followers, but as fellow lights in the void.
225
+ </p>
226
+ <div className="inline-flex flex-wrap justify-center gap-4">
227
+ <div className="px-6 py-3 rounded-full bg-white dark:bg-white/5 border border-default-200 dark:border-white/10 text-default-700 dark:text-white font-medium">
228
+ Daily Awareness
229
+ </div>
230
+ <div className="px-6 py-3 rounded-full bg-white dark:bg-white/5 border border-default-200 dark:border-white/10 text-default-700 dark:text-white font-medium">
231
+ Radical Kindness
232
+ </div>
233
+ <div className="px-6 py-3 rounded-full bg-white dark:bg-white/5 border border-default-200 dark:border-white/10 text-default-700 dark:text-white font-medium">
234
+ Lucid Creation
235
+ </div>
236
+ </div>
237
+ </motion.div>
238
+ </section>
239
+
240
+ {/* Closing Creed */}
241
+ <footer className="container mx-auto max-w-4xl px-6 py-20 border-t border-default-100 dark:border-white/10">
242
+ <motion.div
243
+ className="text-center"
244
+ initial={{ opacity: 0 }}
245
+ transition={{ duration: 1.5 }}
246
+ whileInView={{ opacity: 1 }}
247
+ >
248
+ <p
249
+ className={`${fontCursive.className} text-3xl md:text-4xl lg:text-5xl text-default-800 dark:text-white italic leading-relaxed`}
250
+ >
251
+ &quot;There is no plan. There is no judge. <br />
252
+ We are the brief awareness of the universe — and that is
253
+ enough.&quot;
254
+ </p>
255
+ </motion.div>
256
+ </footer>
257
+ </div>
258
+ );
259
+ }
@@ -0,0 +1,7 @@
1
+ export default function CoupleLayout({
2
+ children,
3
+ }: {
4
+ children: React.ReactNode;
5
+ }) {
6
+ return <div className="w-full">{children}</div>;
7
+ }
@@ -0,0 +1,164 @@
1
+ "use client";
2
+
3
+ import { motion } from "framer-motion";
4
+ import { Card, CardBody, CardFooter, Image, Button } from "@heroui/react";
5
+ import { Link } from "@heroui/link";
6
+
7
+ import { fontCursive } from "@/config/fonts";
8
+ import OurStorySection from "@/components/OurStory";
9
+ import { HeartFilledIcon } from "@/components/icons";
10
+
11
+ export default function CouplePage() {
12
+ return (
13
+ <div className="min-h-screen pb-20">
14
+ {/* Header */}
15
+ <section className="relative py-20 text-center px-4 overflow-hidden">
16
+ <div className="absolute top-0 left-1/2 -translate-x-1/2 w-[600px] h-[600px] bg-wedding-pink-100/40 dark:bg-wedding-pink-900/10 rounded-full blur-[120px] pointer-events-none" />
17
+
18
+ <motion.div
19
+ animate={{ opacity: 1, y: 0 }}
20
+ className="relative z-10"
21
+ initial={{ opacity: 0, y: 20 }}
22
+ transition={{ duration: 0.8 }}
23
+ >
24
+ <h1
25
+ className={`${fontCursive.className} text-6xl md:text-8xl bg-gradient-to-r from-wedding-pink-600 to-wedding-gold-600 bg-clip-text text-transparent mb-6 py-4 leading-normal`}
26
+ >
27
+ The Couple
28
+ </h1>
29
+ <p className="text-default-500 dark:text-default-400 text-lg uppercase tracking-widest">
30
+ Two Souls, One Heart
31
+ </p>
32
+ </motion.div>
33
+ </section>
34
+
35
+ {/* Profile Cards */}
36
+ <section className="container mx-auto px-4 max-w-6xl mb-20">
37
+ <div className="grid md:grid-cols-2 gap-8 md:gap-16">
38
+ {/* Bride Profile */}
39
+ <motion.div
40
+ className="flex flex-col items-center"
41
+ initial={{ opacity: 0, x: -50 }}
42
+ transition={{ duration: 0.8 }}
43
+ viewport={{ once: true }}
44
+ whileInView={{ opacity: 1, x: 0 }}
45
+ >
46
+ <Card className="w-full aspect-[3/4] max-w-md border-none shadow-2xl overflow-visible group">
47
+ <CardBody className="p-0 overflow-hidden rounded-2xl relative">
48
+ <div className="absolute inset-0 bg-gradient-to-b from-transparent via-transparent to-black/60 z-10 opacity-80 group-hover:opacity-100 transition-opacity" />
49
+ <Image
50
+ removeWrapper
51
+ alt="Sukanya"
52
+ className="z-0 w-full h-full object-cover transform group-hover:scale-105 transition-transform duration-700"
53
+ src="/bride.jpg"
54
+ />
55
+ <div className="absolute bottom-0 left-0 right-0 p-6 z-20 text-white">
56
+ <h3 className={`${fontCursive.className} text-4xl mb-1`}>
57
+ Sukanya
58
+ </h3>
59
+ <p className="text-white/80 font-medium">The Bride</p>
60
+ </div>
61
+ </CardBody>
62
+ <CardFooter className="flex-col items-start pt-6 px-4 pb-4">
63
+ <p className="italic text-default-500 mb-4">
64
+ &quot;Grace in her smile, strength in her soul.&quot;
65
+ </p>
66
+ <div className="w-full flex justify-between items-center">
67
+ <p className="text-sm font-semibold text-wedding-pink-600 dark:text-wedding-pink-400">
68
+ Biology Teacher
69
+ </p>
70
+ <Button
71
+ as={Link}
72
+ className="font-medium"
73
+ color="danger"
74
+ href="/sukanya"
75
+ size="sm"
76
+ variant="light"
77
+ >
78
+ Know More
79
+ </Button>
80
+ </div>
81
+ </CardFooter>
82
+ </Card>
83
+ </motion.div>
84
+
85
+ {/* Groom Profile */}
86
+ <motion.div
87
+ className="flex flex-col items-center"
88
+ initial={{ opacity: 0, x: 50 }}
89
+ transition={{ duration: 0.8 }}
90
+ viewport={{ once: true }}
91
+ whileInView={{ opacity: 1, x: 0 }}
92
+ >
93
+ <Card className="w-full aspect-[3/4] max-w-md border-none shadow-2xl overflow-visible group">
94
+ <CardBody className="p-0 overflow-hidden rounded-2xl relative">
95
+ <div className="absolute inset-0 bg-gradient-to-b from-transparent via-transparent to-black/60 z-10 opacity-80 group-hover:opacity-100 transition-opacity" />
96
+ <Image
97
+ removeWrapper
98
+ alt="Titas"
99
+ className="z-0 w-full h-full object-cover transform group-hover:scale-105 transition-transform duration-700"
100
+ src="/groom.jpg"
101
+ />
102
+ <div className="absolute bottom-0 left-0 right-0 p-6 z-20 text-white">
103
+ <h3 className={`${fontCursive.className} text-4xl mb-1`}>
104
+ Titas
105
+ </h3>
106
+ <p className="text-white/80 font-medium">The Groom</p>
107
+ </div>
108
+ </CardBody>
109
+ <CardFooter className="flex-col items-start pt-6 px-4 pb-4">
110
+ <p className="italic text-default-500 mb-4">
111
+ &quot;Steady and kind, he leads with heart.&quot;
112
+ </p>
113
+ <div className="w-full flex justify-between items-center">
114
+ <p className="text-sm font-semibold text-wedding-pink-600 dark:text-wedding-pink-400">
115
+ Biology Teacher
116
+ </p>
117
+ <Button
118
+ as={Link}
119
+ className="font-medium"
120
+ color="danger"
121
+ href="/titas"
122
+ size="sm"
123
+ variant="light"
124
+ >
125
+ Know More
126
+ </Button>
127
+ </div>
128
+ </CardFooter>
129
+ </Card>
130
+ </motion.div>
131
+ </div>
132
+ </section>
133
+
134
+ {/* Our Story Section */}
135
+ <section className="relative">
136
+ <div className="absolute inset-0 bg-wedding-pink-50/50 dark:bg-wedding-pink-900/5 skew-y-3 transform origin-top-left -z-10" />
137
+ <OurStorySection />
138
+ </section>
139
+
140
+ {/* Navigation Links */}
141
+ <section className="container mx-auto px-4 mt-16 text-center">
142
+ <div className="flex flex-wrap justify-center gap-4">
143
+ <Button
144
+ as={Link}
145
+ className="bg-wedding-pink-100 text-wedding-pink-700 font-semibold shadow-md hover:bg-wedding-pink-200 dark:bg-wedding-pink-900/40 dark:text-wedding-pink-200"
146
+ href="/memories"
147
+ size="lg"
148
+ startContent={<HeartFilledIcon className="text-wedding-pink-500" />}
149
+ >
150
+ Our Memories
151
+ </Button>
152
+ <Button
153
+ as={Link}
154
+ className="bg-wedding-gold-100 text-wedding-gold-800 font-semibold shadow-md hover:bg-wedding-gold-200 dark:bg-wedding-gold-500 dark:text-black dark:hover:bg-wedding-gold-400"
155
+ href="/mark-the-dates"
156
+ size="lg"
157
+ >
158
+ Mark the Dates
159
+ </Button>
160
+ </div>
161
+ </section>
162
+ </div>
163
+ );
164
+ }