@titas_mallick/wedding-site-gen 2.0.1 → 2.0.3
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/README.md +87 -93
- package/app/invitation/[slug]/layout.tsx +9 -9
- package/app/layout.tsx +11 -13
- package/cli.mjs +6 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,51 +1,43 @@
|
|
|
1
1
|
# 💍 Wedding Website Generator v2.0 (AI-Powered)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> **The ultimate digital companion for your special day.** Scaffold, personalize, and deploy a feature-rich wedding application in minutes.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
## 🚀 Phase 1: Generation
|
|
7
|
+
## 🚀 Phase 1: Rapid Generation
|
|
8
8
|
|
|
9
|
-
###
|
|
10
|
-
Run the
|
|
9
|
+
### Initialize Your Project
|
|
10
|
+
Run the command below to start the interactive CLI:
|
|
11
11
|
```bash
|
|
12
12
|
npx @titas_mallick/wedding-site-gen
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
###
|
|
16
|
-
|
|
15
|
+
### CLI Prompt Reference
|
|
16
|
+
Answer the prompts to pre-configure your site's identity:
|
|
17
17
|
|
|
18
18
|
| Prompt | Example Input | Purpose |
|
|
19
19
|
| :--- | :--- | :--- |
|
|
20
|
-
| **Groom's
|
|
21
|
-
| **
|
|
22
|
-
| **
|
|
23
|
-
| **
|
|
24
|
-
| **
|
|
25
|
-
| **
|
|
26
|
-
| **
|
|
27
|
-
| **
|
|
28
|
-
| **Website URL** | `https://our-wedding.com` | Used for email links and SEO. |
|
|
29
|
-
| **Wedding Hashtag** | `#TitasWedsSukanya` | Displayed across the site. |
|
|
30
|
-
| **Visual Theme** | `1` (Pink & Gold) | Sets the primary color palette (Pink, Blue, Green, or Red). |
|
|
31
|
-
| **Target Directory** | `my-wedding` | The name of the folder where code will be saved. |
|
|
20
|
+
| **Groom's Names** | `Titas`, `Titas Mallick` | Sets URLs and bios. |
|
|
21
|
+
| **Bride's Names** | `Sukanya`, `Sukanya Saha` | Sets URLs and bios. |
|
|
22
|
+
| **Wedding Dates** | `January 23, 2026`, `2026-01-23` | Powers UI text and countdown logic. |
|
|
23
|
+
| **Admin Email** | `admin@wedding.com` | **Vital**: Log in with this email for admin tools. |
|
|
24
|
+
| **UPI ID** | `wedding@okaxis` | Generates the gift QR code. |
|
|
25
|
+
| **Website URL** | `https://our-wedding.com` | Used for SEO and email links. |
|
|
26
|
+
| **Wedding Hashtag** | `#TitasWedsSukanya` | Branding across the site. |
|
|
27
|
+
| **Visual Theme** | `1` (Pink & Gold) | Sets initial primary colors. |
|
|
32
28
|
|
|
33
29
|
---
|
|
34
30
|
|
|
35
|
-
## 🛠️ Phase 2: Infrastructure
|
|
31
|
+
## 🛠️ Phase 2: System Infrastructure
|
|
36
32
|
|
|
37
33
|
### 1. Firebase (Database & Auth)
|
|
38
|
-
1.
|
|
39
|
-
2. **
|
|
40
|
-
3. **
|
|
41
|
-
4. **
|
|
42
|
-
5. **Project Settings**:
|
|
43
|
-
- Click the **Web Icon (</>)** to register a web app. Copy the `firebaseConfig` keys for your `.env.local`.
|
|
44
|
-
- Go to **Service Accounts** > **Generate New Private Key**. This downloads a JSON file. Use these values for the `FIREBASE_ADMIN` variables.
|
|
34
|
+
1. Create a project at [Firebase Console](https://console.firebase.google.com/).
|
|
35
|
+
2. **Authentication**: Enable "Email/Password".
|
|
36
|
+
3. **Firestore**: Create a database in "Production Mode".
|
|
37
|
+
4. **Admin SDK**: Go to **Project Settings** > **Service Accounts** > **Generate New Private Key**. Use these values for `FIREBASE_ADMIN` env vars.
|
|
45
38
|
|
|
46
39
|
### 2. Firestore Security Rules
|
|
47
|
-
|
|
48
|
-
|
|
40
|
+
Deploy these rules in the Firebase console to ensure data integrity:
|
|
49
41
|
```javascript
|
|
50
42
|
rules_version = '2';
|
|
51
43
|
service cloud.firestore {
|
|
@@ -54,93 +46,95 @@ service cloud.firestore {
|
|
|
54
46
|
match /song_requests/{requestId} { allow read, write: if true; }
|
|
55
47
|
match /guestbook/{entryId} { allow read, write: if true; }
|
|
56
48
|
match /rsvps/{rsvpId} { allow read, write: if true; }
|
|
57
|
-
match /email-reminders/{reminderId} {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
49
|
+
match /email-reminders/{reminderId} { allow read: if true; allow write: if request.auth != null; }
|
|
50
|
+
match /{document=**} { allow read: if true; allow write: if request.auth != null; }
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 3. Media & Automation
|
|
56
|
+
- **Cloudinary**: Create an "Unsigned" upload preset named `wedding`.
|
|
57
|
+
- **Resend**: Generate an API key for automated email reminders.
|
|
58
|
+
- **Google Gemini**: Get an API key from [Google AI Studio](https://aistudio.google.com/).
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 🎨 Phase 3: Theming & Personalization
|
|
63
|
+
|
|
64
|
+
### 1. Visual Theming (Tailwind)
|
|
65
|
+
The site's colors are centralized in `tailwind.config.js`. You can change the primary wedding palette here:
|
|
66
|
+
```javascript
|
|
67
|
+
// tailwind.config.js
|
|
68
|
+
colors: {
|
|
69
|
+
wedding: {
|
|
70
|
+
pink: {
|
|
71
|
+
500: '#ec4899', // Change this to your primary color
|
|
72
|
+
},
|
|
73
|
+
gold: {
|
|
74
|
+
400: '#d99e43', // Change this to your accent color
|
|
64
75
|
}
|
|
65
76
|
}
|
|
66
77
|
}
|
|
67
78
|
```
|
|
68
79
|
|
|
69
|
-
###
|
|
70
|
-
|
|
71
|
-
2. In the **Dashboard**, copy your `Cloud Name`.
|
|
72
|
-
3. Go to **Settings** > **Upload** > **Upload Presets** and create a new preset named `wedding` with "Unsigned" signing mode.
|
|
80
|
+
### 2. Asset Mapping (`/public/`)
|
|
81
|
+
Replace placeholders with your own media. **Maintain exact filenames.**
|
|
73
82
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
83
|
+
| File | Context |
|
|
84
|
+
| :--- | :--- |
|
|
85
|
+
| `bride.jpg` | Main Bride portrait (used in /couple). |
|
|
86
|
+
| `groom.jpg` | Main Groom portrait (used in /couple). |
|
|
87
|
+
| `qr.png` | Your UPI QR code. |
|
|
88
|
+
| `/Images/19.jpg` - `22.jpg` | Specific timeline milestones. |
|
|
89
|
+
| `/Images/Patipatra.jpeg` | Date-fixing ceremony photo. |
|
|
90
|
+
| `/Images/*.jpg` | **Bulk Upload**: Any extra images here auto-populate the masonry gallery. |
|
|
77
91
|
|
|
78
92
|
---
|
|
79
93
|
|
|
80
|
-
##
|
|
94
|
+
## 💻 Phase 4: Code-Level Customization
|
|
81
95
|
|
|
82
|
-
|
|
96
|
+
### 1. Modifying the "Our Story" Section
|
|
97
|
+
The narrative is located in `components/OurStory.tsx`. It uses standard React/Tailwind. Edit the `<p>` tags to write your own journey.
|
|
83
98
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
NEXT_PUBLIC_STORAGEBUCKET=your-project.firebasestorage.app
|
|
90
|
-
NEXT_PUBLIC_SENDERID=...
|
|
91
|
-
NEXT_PUBLIC_APPID=...
|
|
92
|
-
NEXT_PUBLIC_RECAPTCHA_SITE_KEY=...
|
|
93
|
-
|
|
94
|
-
# --- Firebase Admin (Secrets) ---
|
|
95
|
-
FIREBASE_ADMIN_PROJECT_ID=your-project
|
|
96
|
-
FIREBASE_ADMIN_PRIVATE_KEY_ID=...
|
|
97
|
-
FIREBASE_ADMIN_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
|
|
98
|
-
FIREBASE_ADMIN_CLIENT_EMAIL=firebase-adminsdk-...
|
|
99
|
-
FIREBASE_ADMIN_CLIENT_ID=...
|
|
100
|
-
|
|
101
|
-
# --- AI & Content ---
|
|
102
|
-
NEXT_PUBLIC_GEMINI_API_KEY=AIza... # Get from Google AI Studio
|
|
103
|
-
NEXT_PUBLIC_ADMIN_EMAIL=your-email@gmail.com # Must match login for admin powers
|
|
104
|
-
|
|
105
|
-
# --- Media & Email ---
|
|
106
|
-
NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=...
|
|
107
|
-
NEXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET=wedding
|
|
108
|
-
RESEND_API_KEY=re_...
|
|
109
|
-
CRON_SECRET=a-secure-random-string
|
|
110
|
-
```
|
|
99
|
+
### 2. Adding/Removing Navigation Items
|
|
100
|
+
Update `config/site.ts` to add new routes or hide existing ones from the navbar and mobile menu.
|
|
101
|
+
|
|
102
|
+
### 3. Tweaking AI Bot Behavior
|
|
103
|
+
Go to `components/ConciergeBot.tsx` and find the `systemInstruction` variable. You can change the bot's "personality" or add more specific wedding facts.
|
|
111
104
|
|
|
112
105
|
---
|
|
113
106
|
|
|
114
|
-
##
|
|
107
|
+
## 🎮 Phase 5: Admin & Management
|
|
115
108
|
|
|
116
|
-
|
|
109
|
+
### Guest Management Dashboard (`/invitation/maker`)
|
|
110
|
+
Log in with your **Admin Email** to access:
|
|
111
|
+
- **Guest List**: Create unique invitation IDs.
|
|
112
|
+
- **Personalized Links**: Give every family a unique URL: `yoursite.com/invitation/[guest-id]`.
|
|
113
|
+
- **RSVP Tracking**: Live view of attendance and meal choices.
|
|
117
114
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
| `/public/Images/` | `19.jpg` - `22.jpg` | Milestone images for the "Mark the Dates" timeline. |
|
|
124
|
-
| `/public/Images/` | `Patipatra.jpeg` | Image for the traditional date-fixing milestone. |
|
|
125
|
-
| `/public/Images/` | `* (any name)` | All other images in this folder automatically populate the **Memories** gallery. |
|
|
115
|
+
### OBS Live Overlay (`/updates/overlay`)
|
|
116
|
+
Use this route as a "Browser Source" in OBS for your venue screens:
|
|
117
|
+
- **Real-time News**: Scroling updates posted via `/updates/maker`.
|
|
118
|
+
- **Clock**: Synchronized event time.
|
|
119
|
+
- **Background**: Chroma-key green for transparency.
|
|
126
120
|
|
|
127
121
|
---
|
|
128
122
|
|
|
129
|
-
## 🚀 Phase
|
|
123
|
+
## 🚀 Phase 6: Deployment
|
|
130
124
|
|
|
131
|
-
### Vercel
|
|
132
|
-
1.
|
|
133
|
-
2.
|
|
134
|
-
3.
|
|
125
|
+
### Vercel (Recommended)
|
|
126
|
+
1. Push your code to GitHub.
|
|
127
|
+
2. Import project to Vercel.
|
|
128
|
+
3. Add all variables from `.env.local` to Vercel **Environment Variables**.
|
|
135
129
|
|
|
136
|
-
### Automated Reminders
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
130
|
+
### Automated Guest Reminders
|
|
131
|
+
Set up a Cron Job (Vercel or GitHub Actions) to trigger:
|
|
132
|
+
- **URL**: `YOUR_SITE/api/email-reminders`
|
|
133
|
+
- **Method**: `GET`
|
|
134
|
+
- **Header**: `Authorization: Bearer YOUR_CRON_SECRET`
|
|
135
|
+
- **Cron**: `0 10 10-26 1 *` (10 AM daily during Jan).
|
|
142
136
|
|
|
143
137
|
---
|
|
144
138
|
|
|
145
139
|
## 📜 License
|
|
146
|
-
MIT License.
|
|
140
|
+
MIT License. Built with ❤️ for the community.
|
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
import { Metadata } from "next";
|
|
2
2
|
|
|
3
3
|
export const metadata: Metadata = {
|
|
4
|
-
title: "Wedding Invitation |
|
|
4
|
+
title: "Wedding Invitation | Groom & Bride",
|
|
5
5
|
description:
|
|
6
|
-
"We cordially invite you to celebrate the wedding of
|
|
6
|
+
"We cordially invite you to celebrate the wedding of the couple. Click to view your personalized invitation and event details.",
|
|
7
7
|
openGraph: {
|
|
8
|
-
title: "You're Invited! |
|
|
8
|
+
title: "You're Invited! | Wedding",
|
|
9
9
|
description:
|
|
10
10
|
"We would be honored to have you join us as we celebrate our wedding. View details for the ceremony and reception.",
|
|
11
|
-
url: "
|
|
12
|
-
siteName: "
|
|
11
|
+
url: "your-wedding-site.com/invitation",
|
|
12
|
+
siteName: "Groom & Bride",
|
|
13
13
|
locale: "en_US",
|
|
14
14
|
type: "website",
|
|
15
15
|
images: [
|
|
16
16
|
{
|
|
17
|
-
url: "
|
|
17
|
+
url: "your-wedding-site.com/invite.jpeg", // Updated to use absolute URL for WhatsApp
|
|
18
18
|
width: 1200,
|
|
19
19
|
height: 630,
|
|
20
|
-
alt: "
|
|
20
|
+
alt: "Wedding Invitation",
|
|
21
21
|
},
|
|
22
22
|
],
|
|
23
23
|
},
|
|
24
24
|
twitter: {
|
|
25
25
|
card: "summary_large_image",
|
|
26
|
-
title: "Wedding Invitation |
|
|
26
|
+
title: "Wedding Invitation | Groom & Bride",
|
|
27
27
|
description: "Join us in celebrating our special day.",
|
|
28
|
-
images: ["
|
|
28
|
+
images: ["your-wedding-site.com/invite.jpeg"], // Updated to use absolute URL for WhatsApp
|
|
29
29
|
},
|
|
30
30
|
};
|
|
31
31
|
|
package/app/layout.tsx
CHANGED
|
@@ -13,7 +13,7 @@ import ConciergeBot from "@/components/ConciergeBot";
|
|
|
13
13
|
import { SchemaMarkup } from "@/components/SchemaMarkup";
|
|
14
14
|
|
|
15
15
|
export const metadata: Metadata = {
|
|
16
|
-
metadataBase: new URL("
|
|
16
|
+
metadataBase: new URL("your-wedding-site.com"),
|
|
17
17
|
|
|
18
18
|
title: {
|
|
19
19
|
default: siteConfig.name,
|
|
@@ -22,21 +22,19 @@ export const metadata: Metadata = {
|
|
|
22
22
|
description: siteConfig.description,
|
|
23
23
|
keywords: [
|
|
24
24
|
"Wedding",
|
|
25
|
-
"
|
|
26
|
-
"
|
|
25
|
+
"Groom",
|
|
26
|
+
"Bride",
|
|
27
27
|
"Marriage",
|
|
28
28
|
"Celebration",
|
|
29
29
|
"Event",
|
|
30
|
-
"Serampore Wedding",
|
|
31
|
-
"Titas and Sukanya Wedding",
|
|
32
30
|
],
|
|
33
31
|
authors: [
|
|
34
32
|
{
|
|
35
|
-
name: "
|
|
36
|
-
url: "
|
|
33
|
+
name: "Groom Name",
|
|
34
|
+
url: "your-wedding-site.com",
|
|
37
35
|
},
|
|
38
36
|
],
|
|
39
|
-
creator: "
|
|
37
|
+
creator: "Groom Name",
|
|
40
38
|
icons: {
|
|
41
39
|
icon: "/love-birds.png",
|
|
42
40
|
shortcut: "/love-birds.png",
|
|
@@ -48,16 +46,16 @@ export const metadata: Metadata = {
|
|
|
48
46
|
openGraph: {
|
|
49
47
|
type: "website",
|
|
50
48
|
locale: "en_US",
|
|
51
|
-
url: "
|
|
49
|
+
url: "your-wedding-site.com",
|
|
52
50
|
title: siteConfig.name,
|
|
53
51
|
description: siteConfig.description,
|
|
54
52
|
siteName: siteConfig.name,
|
|
55
53
|
images: [
|
|
56
54
|
{
|
|
57
|
-
url: "
|
|
55
|
+
url: "your-wedding-site.com/invite.jpeg",
|
|
58
56
|
width: 1200,
|
|
59
57
|
height: 630,
|
|
60
|
-
alt: "
|
|
58
|
+
alt: "Wedding Invitation",
|
|
61
59
|
},
|
|
62
60
|
],
|
|
63
61
|
},
|
|
@@ -65,8 +63,8 @@ export const metadata: Metadata = {
|
|
|
65
63
|
card: "summary_large_image",
|
|
66
64
|
title: siteConfig.name,
|
|
67
65
|
description: siteConfig.description,
|
|
68
|
-
images: ["
|
|
69
|
-
creator: "@
|
|
66
|
+
images: ["your-wedding-site.com/invite.jpeg"],
|
|
67
|
+
creator: "@wedding",
|
|
70
68
|
},
|
|
71
69
|
robots: {
|
|
72
70
|
index: true,
|
package/cli.mjs
CHANGED
|
@@ -98,6 +98,12 @@ async function main() {
|
|
|
98
98
|
{ search: /2026-01-23/g, replace: config.weddingDateISO },
|
|
99
99
|
{ search: /admin@example.com/g, replace: config.adminEmail },
|
|
100
100
|
{ search: /your-upi-id@upi/g, replace: config.upiId },
|
|
101
|
+
{ search: /https:\/\/www.titas-sukanya-for.life/g, replace: config.siteUrl },
|
|
102
|
+
{ search: /your-wedding-site.com/g, replace: config.siteUrl.replace(/^https?:\/\//, '') },
|
|
103
|
+
{ search: /Wedding Invitation \| Groom & Bride/g, replace: `Wedding Invitation | ${config.groomName} & ${config.brideName}` },
|
|
104
|
+
{ search: /celebrate the wedding of the couple/g, replace: `celebrate the wedding of ${config.groomName} and ${config.brideName}` },
|
|
105
|
+
{ search: /Titas and Sukanya Wedding/g, replace: `${config.groomName} and ${config.brideName} Wedding` },
|
|
106
|
+
{ search: /Titas & Sukanya Wedding/g, replace: `${config.groomName} & ${config.brideName} Wedding` },
|
|
101
107
|
// Code-level replacements for exported components/functions
|
|
102
108
|
{ search: /TitasLayout/g, replace: `${config.groomName}Layout` },
|
|
103
109
|
{ search: /SukanyaLayout/g, replace: `${config.brideName}Layout` },
|