<template>
|
|
<main>
|
|
<nav v-if="guests">
|
|
<img class="mark" :src="require(`@/assets/images/si_mark.svg`)" alt="">
|
|
<button
|
|
v-if="guests && guests.fields && guests.fields.Language"
|
|
class="btn btn--header"
|
|
@click="openPopup"
|
|
>
|
|
<span style="transform: scaleX(-1);">❧</span>
|
|
{{ guests.fields.Language == "en" ? "click here" : "klik hier" }}
|
|
<span>❧</span>
|
|
</button>
|
|
</nav>
|
|
<!-- <pre>
|
|
{{ guests }}
|
|
</pre> -->
|
|
<!-- <ul class="test-links">
|
|
<li v-for="guest in allGuests" :key="guest.code">
|
|
<nuxt-link :to="'/' + guest.code">{{
|
|
guest.names.join(" & ")
|
|
}}</nuxt-link>
|
|
</li>
|
|
</ul> -->
|
|
<!-- <div class="names">{{ guests.Names }}</div> -->
|
|
<!-- <img
|
|
class="img--bkg"
|
|
:src="require(`@/assets/images/bkgs/${this.$route.params.code}.gif`)"
|
|
alt="wrongo-and-peanut"
|
|
/> -->
|
|
<video
|
|
v-if="!!guests"
|
|
class="img--bkg"
|
|
playsinline
|
|
autoplay
|
|
loop
|
|
muted
|
|
id="bgvid"
|
|
:poster="require(`@/assets/images/bkgs/poster.png`)"
|
|
>
|
|
<!-- :poster="require(`@/assets/images/bkgs/poster.png`)" -->
|
|
<!-- <source src="polina.webm" type="video/webm"> -->
|
|
<source
|
|
v-if="!!guests"
|
|
:src="require(`@/assets/images/bkgs/${this.$route.params.code}.mp4`)"
|
|
type="video/mp4"
|
|
/>
|
|
</video>
|
|
|
|
<!-- :src="require(`@/assets/images/bkgs/${(guests && guests.fields && guests.fields.Code) ? guests.fields.Code + '.mp4' : 'pim.mp4'}`)" -->
|
|
|
|
<div class="empty" v-if="!guests">
|
|
What's the password?
|
|
</div>
|
|
|
|
<div v-if="isPopupVisible && this.$route.params.code" class="popup-wrapper">
|
|
<div class="popup">
|
|
<button class="x" @click="openPopup">
|
|
<svg
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
class="icon icon-tabler icon-tabler-x"
|
|
width="40"
|
|
height="40"
|
|
viewBox="0 0 24 24"
|
|
stroke-width="3"
|
|
stroke="var(--lightblue)"
|
|
fill="none"
|
|
stroke-linecap="round"
|
|
stroke-linejoin="round"
|
|
>
|
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
|
<line x1="18" y1="6" x2="6" y2="18" />
|
|
<line x1="6" y1="6" x2="18" y2="18" />
|
|
</svg>
|
|
</button>
|
|
<h1
|
|
v-if="
|
|
guests &&
|
|
guests.fields &&
|
|
guests.fields.Language &&
|
|
guests.fields.Language === 'en'
|
|
"
|
|
>
|
|
At long last, we have a date!
|
|
</h1>
|
|
<div
|
|
v-if="
|
|
guests &&
|
|
guests.fields &&
|
|
guests.fields.Language &&
|
|
guests.fields.Language === 'en'
|
|
"
|
|
>
|
|
<p>
|
|
<strong>It took a while, but we eventually decided to cross our fingers and
|
|
plan a transatlantic wedding.</strong>
|
|
</p>
|
|
<p>
|
|
My fellow Americans, <br><br>The Netherlands is on the other
|
|
side of the world, and air travel is no walk-in-the-park these days.
|
|
Nonetheless: you're reading this because you're extremely important to
|
|
me, and we would LOVE to share this beautiful little country with you, if only for a few days!
|
|
<br><br>
|
|
-S
|
|
</p>
|
|
<p>
|
|
Mark your calendars: <em>August 18th, 2022</em>. Stay tuned for lots more details.
|
|
</p>
|
|
</div>
|
|
<h1
|
|
v-if="
|
|
guests &&
|
|
guests.fields &&
|
|
guests.fields.Language &&
|
|
guests.fields.Language !== 'en'
|
|
"
|
|
>
|
|
Wij gaan de liefde vieren
|
|
</h1>
|
|
<div
|
|
v-if="
|
|
guests &&
|
|
guests.fields &&
|
|
guests.fields.Language &&
|
|
guests.fields.Language !== 'en'
|
|
"
|
|
>
|
|
<p
|
|
v-if="
|
|
guests &&
|
|
guests.fields &&
|
|
guests.fields.Names &&
|
|
guests.fields.Names.length > 1
|
|
"
|
|
>
|
|
Kunnen we met jullie proosten op onze bruiloft op 18 augustus 2022?
|
|
</p>
|
|
<p
|
|
v-if="
|
|
guests &&
|
|
guests.fields &&
|
|
guests.fields.Names &&
|
|
guests.fields.Names.length === 1
|
|
"
|
|
>
|
|
Kunnen we met jou proosten op onze bruiloft op 18 augustus 2022?
|
|
</p>
|
|
</div>
|
|
<div class="buttons">
|
|
<button
|
|
v-if="guests && guests.fields && guests.fields.Language"
|
|
@click="sayYes"
|
|
:class="[
|
|
'btn',
|
|
'btn--popup',
|
|
'btn--yes',
|
|
{ 'btn--selected': guests.fields.Status === 'Maybe' },
|
|
]"
|
|
>
|
|
<svg
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
class="icon icon-tabler icon-tabler-check"
|
|
width="40"
|
|
height="40"
|
|
viewBox="0 0 24 24"
|
|
stroke-width="3"
|
|
stroke="#ffffff"
|
|
fill="none"
|
|
stroke-linecap="round"
|
|
stroke-linejoin="round"
|
|
>
|
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
|
<path d="M5 12l5 5l10 -10" />
|
|
</svg>
|
|
{{ yesText(guests.fields.Language, guests.fields.Names.length) }}
|
|
</button>
|
|
<button
|
|
v-if="guests && guests.fields && guests.fields.Language"
|
|
@click="sayNo"
|
|
:class="[
|
|
'btn',
|
|
'btn--popup',
|
|
'btn--no',
|
|
{ 'btn--selected': guests.fields.Status === 'No' },
|
|
]"
|
|
>
|
|
<svg
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
class="icon icon-tabler icon-tabler-x"
|
|
width="40"
|
|
height="40"
|
|
viewBox="0 0 24 24"
|
|
stroke-width="3"
|
|
stroke="#ffffff"
|
|
fill="none"
|
|
stroke-linecap="round"
|
|
stroke-linejoin="round"
|
|
>
|
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
|
<line x1="18" y1="6" x2="6" y2="18" />
|
|
<line x1="6" y1="6" x2="18" y2="18" />
|
|
</svg>
|
|
{{ noText(guests.fields.Language, guests.fields.Names.length) }}
|
|
</button>
|
|
</div>
|
|
<small
|
|
v-if="
|
|
guests &&
|
|
guests.fields &&
|
|
guests.fields.Language &&
|
|
guests.fields.Language === 'en'
|
|
"> ~ official invitation to follow ~ </small>
|
|
<small
|
|
v-if="
|
|
guests &&
|
|
guests.fields &&
|
|
guests.fields.Language &&
|
|
guests.fields.Language !== 'en'
|
|
"> ~ de officiële uitnodiging volgt later ~ </small>
|
|
<img class="mark" :src="require(`@/assets/images/si_mark2.svg`)" alt="">
|
|
</div>
|
|
</div>
|
|
</main>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
data: () => ({
|
|
guests: null,
|
|
allGuests: [],
|
|
isPopupVisible: false,
|
|
fetchFields: [
|
|
'Names',
|
|
'Language',
|
|
'Status',
|
|
'Code'
|
|
]
|
|
}),
|
|
async fetch () {
|
|
if (this.$route.params.code) {
|
|
const res = await fetch(`https://api.airtable.com/v0/appR5dwqGUe1vBaa9/Guest?filterByFormula=(Code='${this.$route.params.code}')${this.fetchFieldsString}`, {
|
|
method: 'GET',
|
|
headers: {
|
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
Authorization: 'Bearer key8ZVBxVZJL2Wp7y'
|
|
}
|
|
})
|
|
|
|
const json = await res.json()
|
|
|
|
if (await json.records[0]) {
|
|
this.guests = { ...await json.records[0] }
|
|
console.log(this.guests)
|
|
}
|
|
}
|
|
|
|
// const res2 = await fetch('https://api.airtable.com/v0/appR5dwqGUe1vBaa9/Guest?filterByFormula=(IsActive=1)&sort[0][field]=Code&sort[0][direction]=asc', {
|
|
// method: 'GET',
|
|
// headers: {
|
|
// 'Content-Type': 'application/x-www-form-urlencoded',
|
|
// Authorization: 'Bearer key8ZVBxVZJL2Wp7y'
|
|
// }
|
|
// })
|
|
|
|
// const json2 = await res2.json()
|
|
// console.log(json2)
|
|
// const guestData = [...await json2 && json2.records]
|
|
// this.allGuests = await guestData.map((guest) => {
|
|
// return {
|
|
// code: guest.fields.Code,
|
|
// names: guest.fields.Names
|
|
// }
|
|
// })
|
|
},
|
|
methods: {
|
|
openPopup () {
|
|
this.isPopupVisible = !this.isPopupVisible
|
|
},
|
|
yesText (lang, count) {
|
|
if (lang === 'en') {
|
|
return (count > 1 ? 'We' : 'I') + ' will try to make it! 🥳'
|
|
} else {
|
|
return (count > 1 ? 'Wij zijn ' : 'Ik ben') + ' er (waarschijnlijk) bij! 🥳'
|
|
}
|
|
},
|
|
noText (lang, count) {
|
|
if (lang === 'en') {
|
|
return 'Sorry, ' + (count > 1 ? 'we' : 'I') + ' definitely can\'t make it. 😞'
|
|
} else {
|
|
return 'Helaas, ' + (count > 1 ? 'wij zijn' : 'ik ben') + ' er zeker weten niet bij. 😞'
|
|
}
|
|
},
|
|
async sayYes () {
|
|
const updates =
|
|
{
|
|
fields: {
|
|
Status: 'Maybe'
|
|
}
|
|
}
|
|
|
|
const res = await fetch(`https://api.airtable.com/v0/appR5dwqGUe1vBaa9/Guest/${this.guests.id}`, {
|
|
method: 'PATCH',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
Authorization: 'Bearer key8ZVBxVZJL2Wp7y'
|
|
},
|
|
body: JSON.stringify(updates)
|
|
})
|
|
|
|
const json = await res.json()
|
|
this.guests = { ...await json }
|
|
},
|
|
async sayNo () {
|
|
const updates =
|
|
{
|
|
fields: {
|
|
Status: 'No'
|
|
}
|
|
}
|
|
const res = await fetch(`https://api.airtable.com/v0/appR5dwqGUe1vBaa9/Guest/${this.guests.id}`, {
|
|
method: 'PATCH',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
Authorization: 'Bearer key8ZVBxVZJL2Wp7y'
|
|
},
|
|
body: JSON.stringify(updates)
|
|
})
|
|
|
|
const json = await res.json()
|
|
this.guests = { ...await json }
|
|
}
|
|
},
|
|
computed: {
|
|
fetchFieldsString () {
|
|
const vm = this
|
|
const array = vm.fetchFields.map((field) => {
|
|
return '&fields[]=' + field
|
|
})
|
|
return array.join('')
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style>
|
|
html {
|
|
font-size: max(2vmin, 12pt);
|
|
font-family: "Times New Roman", Times, serif;
|
|
color: var(--blue);
|
|
}
|
|
|
|
:root {
|
|
--b1: #648bc8;
|
|
--b2: #5b6ba6;
|
|
--blue: var(--b2);
|
|
--lightblue: #b2c6eb;
|
|
--bkg: #dfebfe;
|
|
}
|
|
|
|
@font-face {
|
|
font-family: "kingthings_petrockregular";
|
|
src: url("~assets/fonts/Kingthings_Petrock-webfont.woff") format("woff");
|
|
font-weight: normal;
|
|
font-style: normal;
|
|
}
|
|
|
|
body {
|
|
margin: 0;
|
|
}
|
|
|
|
main {
|
|
width: 100vw;
|
|
height: 100vh;
|
|
background: var(--bkg);
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
h1 {
|
|
font-size: 2.5rem;
|
|
font-family: "kingthings_petrockregular", "Times New Roman", Times, serif;
|
|
margin: 1rem 0 0 0;
|
|
text-align: center;
|
|
}
|
|
|
|
p {
|
|
font-size: 1rem;
|
|
}
|
|
|
|
.img--bkg {
|
|
width: 100vw;
|
|
object-fit: cover;
|
|
height: 100vh;
|
|
}
|
|
|
|
.empty {
|
|
width: 100vw;
|
|
height: 100vh;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
background: var(--bkg);
|
|
color: var(--blue);
|
|
position: absolute;
|
|
}
|
|
|
|
.names {
|
|
position: fixed;
|
|
padding: 2rem;
|
|
aspect-ratio: 1;
|
|
background: var(--bkg);
|
|
color: var(--blue);
|
|
font-size: 2rem;
|
|
border-radius: 999px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
.names::before {
|
|
content: "";
|
|
border: 5px dotted var(--blue);
|
|
position: absolute;
|
|
border-radius: 999px;
|
|
width: 90%;
|
|
aspect-ratio: 1;
|
|
}
|
|
|
|
.names::after {
|
|
content: "";
|
|
border: 5px dashed var(--blue);
|
|
position: absolute;
|
|
border-radius: 999px;
|
|
width: 80%;
|
|
aspect-ratio: 1;
|
|
}
|
|
|
|
.test-links {
|
|
position: fixed;
|
|
top: 1rem;
|
|
left: 1rem;
|
|
z-index: 2;
|
|
}
|
|
|
|
nav {
|
|
position: fixed;
|
|
left: 2rem;
|
|
right: 2rem;
|
|
top: 2rem;
|
|
display: flex;
|
|
gap: 1rem;
|
|
z-index: 2;
|
|
justify-content: space-between;
|
|
}
|
|
|
|
.popup-wrapper {
|
|
position: fixed;
|
|
z-index: 2;
|
|
width: 100vw;
|
|
height: 100vh;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: start;
|
|
overflow-y: auto;
|
|
overflow-x: hidden;
|
|
}
|
|
|
|
.popup-wrapper::after {
|
|
content: "";
|
|
position: absolute;
|
|
z-index: 3;
|
|
width: calc(100vw + 20px);
|
|
height: calc(100vh + 20px);
|
|
backdrop-filter: blur(10px);
|
|
pointer-events: none;
|
|
}
|
|
|
|
.popup {
|
|
background: linear-gradient(to right bottom, var(--bkg), var(--lightblue));
|
|
border-radius: 0.5rem;
|
|
position: relative;
|
|
padding: 1rem 3rem 3rem 3rem;
|
|
border: 1.5px solid var(--blue);
|
|
z-index: 4;
|
|
display: flex;
|
|
flex-direction: column;
|
|
max-width: 60ch;
|
|
align-items: center;
|
|
margin-top: 10vh;
|
|
}
|
|
|
|
small {
|
|
font-size: 1rem;
|
|
}
|
|
|
|
.popup::before {
|
|
content: "";
|
|
position: absolute;
|
|
border-radius: 0.5rem;
|
|
border: 2px dotted var(--blue);
|
|
top: calc(0.2em);
|
|
left: 0.2em;
|
|
bottom: calc(0.2em);
|
|
right: 0.2em;
|
|
pointer-events: none;
|
|
}
|
|
|
|
.btn--header {
|
|
background: linear-gradient(to right bottom, var(--bkg), var(--lightblue));
|
|
color: var(--blue);
|
|
padding: 0.5rem 1rem;
|
|
font-size: 1.5rem;
|
|
border-radius: 0.2em 1em 0.2em 1em;
|
|
font-family: "kingthings_petrockregular", "Times New Roman", Times, serif;
|
|
font-weight: 800;
|
|
border: 1.5px solid var(--blue);
|
|
transition: all 0.3s;
|
|
cursor: pointer;
|
|
position: relative;
|
|
text-transform: capitalize;
|
|
line-height: 1.4;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.25em;
|
|
}
|
|
|
|
.btn--header span {
|
|
font-size: 1.5rem;
|
|
font-family: 'Times New Roman', Times, serif;
|
|
}
|
|
|
|
.btn--header:hover {
|
|
background: linear-gradient(to right bottom, var(--bkg), var(--blue));
|
|
}
|
|
|
|
.btn--header::before {
|
|
content: "";
|
|
position: absolute;
|
|
border-radius: 0.2em 0.9em 0.2em 0.9em;
|
|
border: 2px dotted var(--blue);
|
|
top: calc(0.2em);
|
|
left: 0.2em;
|
|
bottom: calc(0.2em);
|
|
right: 0.2em;
|
|
}
|
|
|
|
.buttons {
|
|
margin: 2rem 0 2rem 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: stretch;
|
|
gap: 1rem;
|
|
}
|
|
|
|
/* .btn--popup {
|
|
padding: 0.5em 1em;
|
|
font-size: 1.5rem;
|
|
border-radius: 999rem;
|
|
border: none;
|
|
color: var(--bkg);
|
|
background: linear-gradient(to right bottom, var(--b1), var(--b2));
|
|
display: flex;
|
|
align-items: center;
|
|
font-family: "kingthings_petrockregular", "Times New Roman", Times, serif;
|
|
line-height: 1;
|
|
cursor: pointer;
|
|
} */
|
|
|
|
.btn--popup {
|
|
padding: 0.5em 1em;
|
|
font-size: 1.5rem;
|
|
border-radius: 999rem;
|
|
border: none;
|
|
color: var(--bkg);
|
|
background: linear-gradient(to right bottom, var(--b1), var(--b2));
|
|
display: flex;
|
|
align-items: center;
|
|
font-family: "kingthings_petrockregular", "Times New Roman", Times, serif;
|
|
line-height: 1;
|
|
cursor: pointer;
|
|
gap: 1rem;
|
|
text-align: left;
|
|
}
|
|
|
|
.btn--popup svg {
|
|
height: 2rem;
|
|
width: 2rem;
|
|
}
|
|
|
|
.btn--popup span:first-child {
|
|
display: inline-block;
|
|
margin-right: 0.8em;
|
|
}
|
|
|
|
.btn--popup span:last-child {
|
|
display: inline-block;
|
|
margin-left: 0.8em;
|
|
}
|
|
|
|
.btn--yes:hover {
|
|
background: green;
|
|
}
|
|
|
|
.btn--no:hover {
|
|
background: darkred;
|
|
}
|
|
|
|
.btn--selected.btn--yes {
|
|
background: green;
|
|
}
|
|
|
|
.btn--selected.btn--no {
|
|
background: darkred;
|
|
}
|
|
|
|
.x {
|
|
background: transparent;
|
|
border: 0;
|
|
color: var(--b1);
|
|
font-size: 2rem;
|
|
align-self: flex-end;
|
|
margin-right: -1.5rem;
|
|
transition: all 0.2s;
|
|
line-height: 0;
|
|
border-radius: 999px;
|
|
}
|
|
|
|
.x:hover {
|
|
color: var(--b2);
|
|
background: var(--b1);
|
|
}
|
|
|
|
ul {
|
|
display: flex;
|
|
gap: 0.25rem;
|
|
flex-flow: column wrap;
|
|
height: 90vh;
|
|
}
|
|
|
|
li {
|
|
display: inline-block;
|
|
list-style-type: none;
|
|
}
|
|
|
|
li a {
|
|
background: var(--bkg);
|
|
color: var(--blue);
|
|
padding: 0.25em 1em;
|
|
border-radius: 999px;
|
|
border: 0;
|
|
display: inline-block;
|
|
font-size: 0.75rem;
|
|
line-height: 1;
|
|
}
|
|
|
|
.mark {
|
|
height: 3rem;
|
|
width: 3rem;
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.popup .mark {
|
|
margin-top: 2rem;
|
|
opacity: 1;
|
|
}
|
|
</style>
|