@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.
- package/.eslintignore +20 -0
- package/.eslintrc.json +93 -0
- package/.recover +9 -0
- package/.vscode/settings.json +3 -0
- package/LICENSE +21 -0
- package/README.md +83 -0
- package/app/Neo-Lucentism/layout.tsx +7 -0
- package/app/Neo-Lucentism/page.tsx +259 -0
- package/app/couple/layout.tsx +7 -0
- package/app/couple/page.tsx +164 -0
- package/app/error.tsx +31 -0
- package/app/guestbook/page.tsx +470 -0
- package/app/invitation/[slug]/layout.tsx +36 -0
- package/app/invitation/[slug]/page.tsx +462 -0
- package/app/invitation/maker/auth.js +165 -0
- package/app/invitation/maker/dashboard.js +81 -0
- package/app/invitation/maker/guestAdder.js +204 -0
- package/app/invitation/maker/guestShower.js +287 -0
- package/app/invitation/maker/layout.tsx +11 -0
- package/app/invitation/maker/page.js +168 -0
- package/app/invitation/maker/rsvpViewer.js +122 -0
- package/app/layout.tsx +98 -0
- package/app/mark-the-dates/layout.tsx +7 -0
- package/app/mark-the-dates/page.tsx +196 -0
- package/app/memories/layout.tsx +7 -0
- package/app/memories/page.tsx +29 -0
- package/app/page.tsx +5 -0
- package/app/providers.tsx +33 -0
- package/app/sagun/layout.tsx +7 -0
- package/app/sagun/page.tsx +348 -0
- package/app/song-requests/page.tsx +354 -0
- package/app/sukanya/layout.tsx +7 -0
- package/app/sukanya/page.tsx +167 -0
- package/app/titas/layout.tsx +7 -0
- package/app/titas/page.tsx +175 -0
- package/app/travel-guide/page.tsx +400 -0
- package/app/updates/maker/page.js +323 -0
- package/app/updates/overlay/page.tsx +144 -0
- package/app/updates/page.js +207 -0
- package/cli.mjs +196 -0
- package/components/ConciergeBot.tsx +203 -0
- package/components/CountdownTimer.tsx +137 -0
- package/components/Gallery.tsx +372 -0
- package/components/LiveVideos.tsx +173 -0
- package/components/OurStory.tsx +160 -0
- package/components/certificate.jsx +300 -0
- package/components/counter.tsx +14 -0
- package/components/footer.tsx +89 -0
- package/components/hero.tsx +136 -0
- package/components/icons.tsx +283 -0
- package/components/importantNews.js +168 -0
- package/components/navbar.tsx +106 -0
- package/components/primitives.ts +53 -0
- package/components/sagun.js +22 -0
- package/components/theme-switch.tsx +81 -0
- package/components/updates.tsx +118 -0
- package/components/weddingcard.js +68 -0
- package/components/weddingcard2.js +58 -0
- package/config/firebase-admin.js +17 -0
- package/config/firebase.ts +36 -0
- package/config/fonts.ts +21 -0
- package/config/site.ts +74 -0
- package/next-env.d.ts +6 -0
- package/next.config.js +4 -0
- package/package.json +64 -0
- package/postcss.config.js +6 -0
- package/public/DCV.gif +0 -0
- package/public/DCV2.gif +0 -0
- package/public/DCV3.gif +0 -0
- package/public/Images/1.jpg +0 -0
- package/public/Images/11.jpg +0 -0
- package/public/Images/12.jpg +0 -0
- package/public/Images/13.jpg +0 -0
- package/public/Images/14.jpg +0 -0
- package/public/Images/15.jpg +0 -0
- package/public/Images/16.jpg +0 -0
- package/public/Images/17.jpg +0 -0
- package/public/Images/18.jpg +0 -0
- package/public/Images/19.jpg +0 -0
- package/public/Images/2.jpg +0 -0
- package/public/Images/20.jpg +0 -0
- package/public/Images/21.jpg +0 -0
- package/public/Images/22.jpg +0 -0
- package/public/Images/3.jpg +0 -0
- package/public/Images/4.jpg +0 -0
- package/public/Images/5.jpg +0 -0
- package/public/Images/6.jpg +0 -0
- package/public/Images/7.jpg +0 -0
- package/public/Images/8.jpg +0 -0
- package/public/Images/9.jpg +0 -0
- package/public/Images/9b.jpg +0 -0
- package/public/Images/Patipatra.jpeg +0 -0
- package/public/audio (1).mp3 +0 -0
- package/public/audio (2).mp3 +0 -0
- package/public/bride.jpg +0 -0
- package/public/corner1-01.svg +1 -0
- package/public/favicon.ico +0 -0
- package/public/groom.jpg +0 -0
- package/public/invite.png +0 -0
- package/public/love-birds.png +0 -0
- package/public/next.svg +1 -0
- package/public/pubqr.png +0 -0
- package/public/pw/001.jpg +0 -0
- package/public/pw/002.jpg +0 -0
- package/public/pw/003.jpg +0 -0
- package/public/pw/004.jpg +0 -0
- package/public/pw/005.jpg +0 -0
- package/public/pw/006.jpg +0 -0
- package/public/pw/007.jpg +0 -0
- package/public/pw/008.jpg +0 -0
- package/public/pw/009.jpg +0 -0
- package/public/pw/010.jpg +0 -0
- package/public/pw/011.jpg +0 -0
- package/public/pw/012.jpg +0 -0
- package/public/pw/013.jpg +0 -0
- package/public/pw/014.jpg +0 -0
- package/public/pw/015.jpg +0 -0
- package/public/pw/016.jpg +0 -0
- package/public/pw/017.jpg +0 -0
- package/public/pw/018.jpg +0 -0
- package/public/pw/019.jpg +0 -0
- package/public/pw/020.jpg +0 -0
- package/public/pw/021.jpg +0 -0
- package/public/pw/022.jpg +0 -0
- package/public/pw/023.jpg +0 -0
- package/public/pw/024.jpg +0 -0
- package/public/pw/025.jpg +0 -0
- package/public/pw/026.jpg +0 -0
- package/public/pw/027.jpg +0 -0
- package/public/pw/028.jpg +0 -0
- package/public/pw/029.jpg +0 -0
- package/public/pw/030.jpg +0 -0
- package/public/pw/031.jpg +0 -0
- package/public/pw/032.jpg +0 -0
- package/public/qr.png +0 -0
- package/public/vercel.svg +1 -0
- package/styles/globals.css +3 -0
- package/tailwind.config.js +51 -0
- package/tsconfig.json +45 -0
- package/tsconfig.tsbuildinfo +1 -0
- 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
|
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,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
|
+
"We are lights in the void — brief, brilliant, and free."
|
|
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
|
+
"There is no plan. There is no judge. <br />
|
|
252
|
+
We are the brief awareness of the universe — and that is
|
|
253
|
+
enough."
|
|
254
|
+
</p>
|
|
255
|
+
</motion.div>
|
|
256
|
+
</footer>
|
|
257
|
+
</div>
|
|
258
|
+
);
|
|
259
|
+
}
|
|
@@ -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
|
+
"Grace in her smile, strength in her soul."
|
|
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
|
+
"Steady and kind, he leads with heart."
|
|
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
|
+
}
|