Skip to content

Commit 198eb01

Browse files
author
jacoknapp
committed
Merge pull request 'Switch to yaml as default, add RSVP capabilities' (#11) from dev into main
Reviewed-on: https://gitea.knapp/jacoknapp/EternalVows/pulls/11
2 parents c65567b + c9a9382 commit 198eb01

File tree

7 files changed

+303
-189
lines changed

7 files changed

+303
-189
lines changed

README.md

Lines changed: 132 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Eternal Vows -- Wedding Website
22

3-
Eternal Vows is a customizable, self‑hosted wedding website template for sharing all of your event information in one place. Configure names, date, location, story, schedule, venue details (with map), registry links, FAQs, and optional photo‑sharing links via a simple JSON file—no rebuild required. A lightweight Node + Express server powers a dynamic background slideshow that auto‑refreshes as you add images. Run locally with Node or deploy easily with Docker/Compose.
3+
Eternal Vows is a customizable, self‑hosted wedding website template for sharing all of your event information in one place. Configure names, date, location, story, schedule, venue details (with map), registry links, FAQs, and optional photo‑sharing links via a simple YAML file—no rebuild required. JSON is also supported. A lightweight Node + Express server powers a dynamic background slideshow that auto‑refreshes as you add images. Run locally with Node or deploy easily with Docker/Compose.
44

55
## Features
66
- Clean, modern single-page design with elegant typography
@@ -19,9 +19,9 @@ Below are screenshots of the default layout to help visualize the sections and s
1919
![Bottom of page](img/BottomOfPage.png)
2020

2121
## Project structure
22-
- `index.html` — UI, styling, and client JS (loads details from `config/config.json`)
22+
- `index.html` — UI, styling, and client JS (loads details from `config/config.yaml`)
2323
- `server.mjs` — Express server and `/api/photos` endpoint
24-
- `config/config.json` — Site content (names, date, venue(s), etc.)
24+
- `config/config.yaml` — Site content (names, date, venue(s), etc.)
2525
- `config/photos/` — Background slideshow images
2626
- `.github/workflows/docker.yml` — Optional CI to build/push a container image
2727

@@ -48,7 +48,10 @@ $env:PORT=8080; npm start
4848
```
4949

5050
## Configure content
51-
Edit `config/config.json`. All fields are optional; unset sections/buttons are hidden automatically.
51+
Edit `config/config.yaml`. All fields are optional; unset sections/buttons are hidden automatically.
52+
53+
Notes:
54+
- JSON is also supported at `config/config.json`. If both YAML and JSON exist, JSON takes precedence.
5255

5356
- `coupleNames`: Display names for the hero section
5457
- `dateDisplay`: Friendly wedding date string
@@ -61,6 +64,10 @@ Edit `config/config.json`. All fields are optional; unset sections/buttons are h
6164
- `venue`: Legacy single-venue (optional): `{ name, address, mapUrl, mapCta, notes }`
6265
- `photoUpload`: `{ url, label?, text? }` link to your shared album; `text` customizes the paragraph in the section (fallbacks to defaults if omitted)
6366
- `registry`: Array of `{ label, url }`
67+
- `rsvp`: Configure the RSVP section and button(s). Supports:
68+
- Object form: `{ url, label?, text?, buttons?: [{ label, url }, ...] }` — first button is primary; `text` customizes the paragraph.
69+
- Array form: `[ { label, url }, { label, url } ]` — multiple buttons.
70+
- Legacy flat keys (still supported): `rsvpUrl`, `rsvpLabel`, and optional `rsvpText`.
6471
- `faqs`: Array of `{ q, a }`
6572
- `slideshow`: `{ intervalMs, transitionMs, photoRefreshSeconds, dynamicPhotosUrl }` (defaults work out of the box)
6673
- `ui`: `{ monogram, footerNote, autoRefreshSeconds }`
@@ -74,86 +81,135 @@ Edit `config/config.json`. All fields are optional; unset sections/buttons are h
7481

7582
Example (default with multiple venues):
7683

77-
```json
78-
{
79-
"coupleNames": "Partner One & Partner Two",
80-
"dateDisplay": "Month 00, 20XX",
81-
"locationShort": "City, ST",
82-
"story": "Share a short story about how you met...",
83-
"schedule": [
84-
{ "time": "3:00 PM", "title": "Ceremony", "details": "Ceremony location details" },
85-
{ "time": "4:00 PM", "title": "Cocktail Hour", "details": "Cocktail hour location details" },
86-
{ "time": "5:30 PM", "title": "Reception", "details": "Reception location details" }
87-
],
88-
"venues": [
89-
{ "label": "Ceremony", "name": "St. Mary Church", "address": "1 Church Rd", "mapUrl": "https://maps.google.com/?q=church", "notes": "Street parking available." },
90-
{ "label": "Reception", "name": "The Grand Hall", "address": "999 Party Ave", "mapUrl": "https://maps.google.com/?q=hall", "notes": "Valet on site." }
91-
],
92-
"photoUpload": { "label": "Upload to Shared Album", "url": "https://example.com/album" },
93-
"registry": [
94-
{ "label": "Amazon", "url": "https://example.com/amazon" },
95-
{ "label": "Target", "url": "https://example.com/target" }
96-
],
97-
"faqs": [ { "q": "Dress code?", "a": "Semi-formal." } ],
98-
"slideshow": { "dynamicPhotosUrl": "/api/photos", "intervalMs": 6000, "transitionMs": 1200 },
99-
"ui": {
100-
"monogram": "You’re invited to the wedding of",
101-
"footerNote": "With love, ...",
102-
"colors": {
103-
"accent1": "#a3bcd6",
104-
"accent2": "#d7e5f3",
105-
"accent3": "#f7eddc",
106-
"text": "#ffffff",
107-
"ink": "#2b2a2a",
108-
"bgOverlay": "rgba(20,18,18,0.35)",
109-
"border": "rgba(255,255,255,0.12)",
110-
"card": "rgba(255,255,255,0.08)",
111-
"maxw": "1024px",
112-
"blur": "saturate(140%) blur(6px)"
113-
},
114-
"background": {
115-
"baseTop": "#2d2616",
116-
"baseBottom": "#1f1a10",
117-
"radial1": "rgba(234, 200, 94, 0.45)",
118-
"radial2": "rgba(255, 239, 189, 0.38)"
119-
}
120-
}
121-
}
84+
```yaml
85+
coupleNames: "Partner One & Partner Two"
86+
dateDisplay: "Month 00, 20XX"
87+
locationShort: "City, ST"
88+
story: "Share a short story about how you met..."
89+
schedule:
90+
- time: "3:00 PM"
91+
title: "Ceremony"
92+
details: "Ceremony location details"
93+
- time: "4:00 PM"
94+
title: "Cocktail Hour"
95+
details: "Cocktail hour location details"
96+
- time: "5:30 PM"
97+
title: "Reception"
98+
details: "Reception location details"
99+
venues:
100+
- label: "Ceremony"
101+
name: "St. Mary Church"
102+
address: "1 Church Rd"
103+
mapUrl: "https://maps.google.com/?q=church"
104+
notes: "Street parking available."
105+
- label: "Reception"
106+
name: "The Grand Hall"
107+
address: "999 Party Ave"
108+
mapUrl: "https://maps.google.com/?q=hall"
109+
notes: "Valet on site."
110+
photoUpload:
111+
label: "Upload to Shared Album"
112+
url: "https://example.com/album"
113+
rsvp:
114+
label: "RSVP Now"
115+
url: "https://example.com/rsvp"
116+
text: "Kindly respond by Sept 1st."
117+
registry:
118+
- label: "Amazon"
119+
url: "https://example.com/amazon"
120+
- label: "Target"
121+
url: "https://example.com/target"
122+
faqs:
123+
- q: "Dress code?"
124+
a: "Semi-formal."
125+
slideshow:
126+
dynamicPhotosUrl: "/api/photos"
127+
intervalMs: 6000
128+
transitionMs: 1200
129+
ui:
130+
monogram: "You’re invited to the wedding of"
131+
footerNote: "With love, ..."
132+
colors:
133+
accent1: "#a3bcd6"
134+
accent2: "#d7e5f3"
135+
accent3: "#f7eddc"
136+
text: "#ffffff"
137+
ink: "#2b2a2a"
138+
bgOverlay: "rgba(20,18,18,0.35)"
139+
border: "rgba(255,255,255,0.12)"
140+
card: "rgba(255,255,255,0.08)"
141+
maxw: "1024px"
142+
blur: "saturate(140%) blur(6px)"
143+
background:
144+
baseTop: "#2d2616"
145+
baseBottom: "#1f1a10"
146+
radial1: "rgba(234, 200, 94, 0.45)"
147+
radial2: "rgba(255, 239, 189, 0.38)"
148+
```
149+
150+
RSVP variations:
151+
152+
Single object with extra buttons and custom text:
153+
154+
```yaml
155+
rsvp:
156+
text: "Please let us know if you can join us."
157+
url: "https://example.com/rsvp"
158+
label: "RSVP Now"
159+
buttons:
160+
- label: "RSVP (English)"
161+
url: "https://example.com/rsvp-en"
162+
- label: "RSVP (Español)"
163+
url: "https://example.com/rsvp-es"
164+
```
165+
166+
Array form (multiple buttons, no extra text):
167+
168+
```yaml
169+
rsvp:
170+
- label: "RSVP Now"
171+
url: "https://example.com/rsvp"
172+
- label: "Add to Calendar"
173+
url: "https://example.com/calendar.ics"
174+
```
175+
176+
Legacy flat keys (still work):
177+
178+
```yaml
179+
rsvpUrl: "https://example.com/rsvp"
180+
rsvpLabel: "RSVP Now"
181+
rsvpText: "Kindly respond by Sept 1st."
122182
```
123183
124184
Alternative formats for venues:
125185
126186
Single Venue:
127187
128-
```json
129-
"venue": {
130-
"name": "Venue Name",
131-
"address": "123 Main St, City, ST 00000",
132-
"mapUrl": "https://maps.google.com",
133-
"mapCta": "Open Map",
134-
"notes": "Parking and arrival notes."
135-
}
188+
```yaml
189+
venue:
190+
name: "Venue Name"
191+
address: "123 Main St, City, ST 00000"
192+
mapUrl: "https://maps.google.com"
193+
mapCta: "Open Map"
194+
notes: "Parking and arrival notes."
136195
```
137196
138197
Multiple venues
139198
140-
```json
141-
"venues": {
142-
"Ceremony": {
143-
"name": "Ceremony Venue Name",
144-
"address": "123 Chapel St, City, ST 00000",
145-
"mapUrl": "https://maps.google.com/?q=Ceremony+Venue",
146-
"mapCta": "Open Map",
147-
"notes": "Arrive 15 minutes early. Street parking available."
148-
},
149-
"Reception": {
150-
"name": "Reception Venue Name",
151-
"address": "999 Grand Ave, City, ST 00000",
152-
"mapUrl": "https://maps.google.com/?q=Reception+Venue",
153-
"mapCta": "Open Map",
154-
"notes": "Valet available. Dinner served at 6:00 PM."
155-
}
156-
},
199+
```yaml
200+
venues:
201+
Ceremony:
202+
name: "Ceremony Venue Name"
203+
address: "123 Chapel St, City, ST 00000"
204+
mapUrl: "https://maps.google.com/?q=Ceremony+Venue"
205+
mapCta: "Open Map"
206+
notes: "Arrive 15 minutes early. Street parking available."
207+
Reception:
208+
name: "Reception Venue Name"
209+
address: "999 Grand Ave, City, ST 00000"
210+
mapUrl: "https://maps.google.com/?q=Reception+Venue"
211+
mapCta: "Open Map"
212+
notes: "Valet available. Dinner served at 6:00 PM."
157213
```
158214
159215
## Photos (background slideshow)
@@ -210,7 +266,7 @@ services:
210266
## Troubleshooting
211267
- Server exits immediately (code 1):
212268
- Run `npm install` first to ensure dependencies are present.
213-
- Check the terminal error message; ensure `config/config.json` is valid JSON.
269+
- Check the terminal error message; ensure `config/config.yaml` is valid YAML (or JSON if using JSON).
214270
- Ensure the `config/` and `config/photos/` folders exist and are readable.
215271
- Port already in use? Set a different `PORT` or stop the other process.
216272
- Photos don’t appear:
@@ -222,7 +278,7 @@ services:
222278
- Ensure Node 18+ and a stable internet connection during install.
223279

224280
## Privacy notes
225-
Keep private details out of version control. The provided `config/config.json` has placeholders—replace them locally or configure secrets in your deployment environment.
281+
Keep private details out of version control. The provided `config/config.yaml` has placeholders—replace them locally or configure secrets in your deployment environment. JSON is also supported if preferred.
226282

227283
## Favicons
228284
- All favicon assets live in `/favicon`.

config/config.json

Lines changed: 0 additions & 102 deletions
This file was deleted.

0 commit comments

Comments
 (0)