diff --git a/assets/trusted/256px-Quinnipiac_University_logo_(2017).svg.webp b/assets/trusted/256px-Quinnipiac_University_logo_(2017).svg.webp new file mode 100644 index 0000000..ab044cb Binary files /dev/null and b/assets/trusted/256px-Quinnipiac_University_logo_(2017).svg.webp differ diff --git a/assets/trusted/512px-Subway_icon.svg.webp b/assets/trusted/512px-Subway_icon.svg.webp new file mode 100644 index 0000000..35d4519 Binary files /dev/null and b/assets/trusted/512px-Subway_icon.svg.webp differ diff --git a/assets/trusted/512px-University_of_New_Haven_logo.webp b/assets/trusted/512px-University_of_New_Haven_logo.webp new file mode 100644 index 0000000..e824a69 Binary files /dev/null and b/assets/trusted/512px-University_of_New_Haven_logo.webp differ diff --git a/assets/trusted/Mohegan-Sun-Logo.webp b/assets/trusted/Mohegan-Sun-Logo.webp new file mode 100644 index 0000000..64ce12c Binary files /dev/null and b/assets/trusted/Mohegan-Sun-Logo.webp differ diff --git a/assets/trusted/Planet_Fitness_(2).webp b/assets/trusted/Planet_Fitness_(2).webp new file mode 100644 index 0000000..714ef99 Binary files /dev/null and b/assets/trusted/Planet_Fitness_(2).webp differ diff --git a/assets/trusted/Post_university_of_conn_logo.webp b/assets/trusted/Post_university_of_conn_logo.webp new file mode 100644 index 0000000..81311c9 Binary files /dev/null and b/assets/trusted/Post_university_of_conn_logo.webp differ diff --git a/assets/trusted/Yale_press_logo.webp b/assets/trusted/Yale_press_logo.webp new file mode 100644 index 0000000..b8d6674 Binary files /dev/null and b/assets/trusted/Yale_press_logo.webp differ diff --git a/assets/trusted/amazon.webp b/assets/trusted/amazon.webp new file mode 100644 index 0000000..89ed63d Binary files /dev/null and b/assets/trusted/amazon.webp differ diff --git a/assets/trusted/lincoln-culinary.webp b/assets/trusted/lincoln-culinary.webp new file mode 100644 index 0000000..acffe8e Binary files /dev/null and b/assets/trusted/lincoln-culinary.webp differ diff --git a/assets/trusted/logo-full-color.webp b/assets/trusted/logo-full-color.webp new file mode 100644 index 0000000..9a70cb7 Binary files /dev/null and b/assets/trusted/logo-full-color.webp differ diff --git a/assets/trusted/sallys-apizza.webp b/assets/trusted/sallys-apizza.webp new file mode 100644 index 0000000..eab08ad Binary files /dev/null and b/assets/trusted/sallys-apizza.webp differ diff --git a/assets/trusted/woodwinds-2024-logo-white.webp b/assets/trusted/woodwinds-2024-logo-white.webp new file mode 100644 index 0000000..7091e8d Binary files /dev/null and b/assets/trusted/woodwinds-2024-logo-white.webp differ diff --git a/index.html b/index.html index 7825044..7e200c5 100644 --- a/index.html +++ b/index.html @@ -118,7 +118,87 @@

Saturday: 9:00 - 3:00

Sunday - Monday: Closed

- + + +
+
+
+

Google Reviews

+

See what clients are saying, or leave a review after your event.

+
+
+ +
+

Rated 5.0 on Google

+

Based on 100+ reviews

+
+
+
+

"Stunning balloon arch and super easy to work with. Our guests loved it!"

+

— Jordan M., Corporate Event

+
+
+

"Professional setup and gorgeous colors. Made our celebration unforgettable."

+

— Maria L., Birthday Party

+
+
+

"Fast, friendly, and beautiful designs. Will book again for our next event."

+

— Alex T., School Event

+
+
+ +
+
+ +
+
+
+

Trusted by

+

Brands and organizations we have had the joy of celebrating with.

+
+
+ + + + + + + + + + + + +
+
+
+ + diff --git a/reviews-data.js b/reviews-data.js new file mode 100644 index 0000000..7f2988c --- /dev/null +++ b/reviews-data.js @@ -0,0 +1,20 @@ +window.REVIEW_ROTATION_RATING = '4.9'; +window.REVIEW_ROTATION_COUNT = '185 reviews'; +window.REVIEW_ROTATION_DATA = [ + { + author: 'Jessica W.', + text: 'If I could give Beach Party Balloons more than five stars, I would! They were super easy to talk to over the phone, worked within my small budget, and provided design suggestions. The balloons were the least stressful part of my event, but they were the highlight!' + }, + { + author: 'Wildwolf', + text: 'Amazing service, super nice and patient people. Tons of options for balloon styles and arrangements. The staff showed us examples and explained everything. Balloons arrived on time and looked incredible.' + }, + { + author: 'Karla R.-P.', + text: 'My balloon columns for my baby shower were beautiful. They’re still intact almost a month later. You’re paying for beauty and expertise. I’ll return for all my balloon needs.' + }, + { + author: 'Valeska', + text: 'They squeezed in a last-minute request and delivered a balloon arch within a week. The decor made the event feel special. Responsive team, timely setup and take-down.' + } +]; diff --git a/reviews.js b/reviews.js new file mode 100644 index 0000000..a13f666 --- /dev/null +++ b/reviews.js @@ -0,0 +1,83 @@ +document.addEventListener('DOMContentLoaded', () => { + const grid = document.getElementById('reviewsGrid'); + const ratingEl = document.getElementById('reviewsRatingValue'); + const countEl = document.getElementById('reviewsCountValue'); + const reviews = Array.isArray(window.REVIEW_ROTATION_DATA) + ? window.REVIEW_ROTATION_DATA.filter(item => item && item.text) + : []; + + if (!grid || reviews.length === 0) { + return; + } + + const buildCard = (review) => { + const article = document.createElement('article'); + article.className = 'review-card'; + const text = document.createElement('p'); + text.textContent = `"${review.text}"`; + const author = document.createElement('p'); + author.className = 'review-author'; + author.textContent = `— ${review.author || 'Happy Client'}`; + article.appendChild(text); + article.appendChild(author); + return article; + }; + + const fadeSwap = (cards) => { + grid.classList.add('is-fading'); + setTimeout(() => { + grid.innerHTML = ''; + cards.forEach(card => grid.appendChild(card)); + requestAnimationFrame(() => { + grid.classList.remove('is-fading'); + }); + }, 350); + }; + + const startRotation = () => { + let index = 0; + let expandedCard = null; + let rotationTimer = null; + const rotationIntervalMs = 8000; + const expandedHoldMs = 15000; + + const showNext = () => { + const slice = reviews.slice(index, index + 3); + const display = slice.length < 3 + ? slice.concat(reviews.slice(0, Math.max(0, 3 - slice.length))) + : slice; + fadeSwap(display.map(buildCard)); + index = (index + 3) % reviews.length; + }; + + const scheduleNext = (delay) => { + if (rotationTimer) { + clearTimeout(rotationTimer); + } + rotationTimer = setTimeout(showNext, delay); + }; + + grid.addEventListener('click', (event) => { + const card = event.target.closest('.review-card'); + if (!card) return; + if (expandedCard && expandedCard !== card) { + expandedCard.classList.remove('is-expanded'); + } + card.classList.toggle('is-expanded'); + expandedCard = card.classList.contains('is-expanded') ? card : null; + scheduleNext(expandedCard ? expandedHoldMs : rotationIntervalMs); + }); + + showNext(); + scheduleNext(rotationIntervalMs); + }; + + if (ratingEl && window.REVIEW_ROTATION_RATING) { + ratingEl.textContent = window.REVIEW_ROTATION_RATING; + } + if (countEl && window.REVIEW_ROTATION_COUNT) { + countEl.textContent = window.REVIEW_ROTATION_COUNT; + } + + startRotation(); +}); diff --git a/style.css b/style.css index 0de22e9..a38fa73 100644 --- a/style.css +++ b/style.css @@ -199,6 +199,122 @@ form{ margin-bottom: 1rem;; } +.reviews-section { + background: transparent; + border-top: none; + border-bottom: none; +} + +.reviews-section h2, +.reviews-section .is-size-3 { + color: #7585ff !important; +} + +.reviews-summary { + display: grid; + gap: 0.5rem; + justify-items: center; +} + +.reviews-stars { + font-size: 1.4rem; + color: #f2b01e; + letter-spacing: 0.1rem; +} + +.reviews-grid { + display: grid; + gap: 1rem; + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + transition: opacity 0.35s ease; +} + +.reviews-grid.is-fading { + opacity: 0; +} + +.review-card { + background: #fff; + border: 1px solid #e6dfc8; + border-radius: 14px; + padding: 1.1rem 1.25rem; + box-shadow: 0 10px 22px rgba(24, 40, 72, 0.08); + text-align: left; + min-height: 150px; + cursor: pointer; +} + +.review-card p { + margin-bottom: 0.5rem; + display: -webkit-box; + -webkit-line-clamp: 4; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.review-author { + color: #6b6b6b; + font-size: 0.9rem; +} + +.review-card.is-expanded { + min-height: 0; +} + +.review-card.is-expanded p { + display: block; + -webkit-line-clamp: unset; + overflow: visible; +} + +.trusted-section { + background: transparent; +} + +.trusted-section h2, +.trusted-section .is-size-3 { + color: #7585ff !important; +} + +.section-divider { + border: none; + border-top: 2px solid rgba(117, 133, 255, 0.35); + margin: 2rem auto 0; + max-width: 920px; +} + + +.trusted-logos { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); + gap: 1.25rem; + align-items: center; +} + +.trusted-logo { + display: flex; + align-items: center; + justify-content: center; + height: 96px; + padding: 0.85rem 1rem; + background: #fff; + border-radius: 14px; + box-shadow: 0 10px 22px rgba(24, 40, 72, 0.08); + border: 1px solid #e6dfc8; +} + +.trusted-logo img { + height: 52px; + width: 100%; + max-width: 150px; + object-fit: contain; +} + +.trusted-logo--dark { + background: #1b1b1b; + border-color: #1b1b1b; +} + .gallery-hero { background: linear-gradient(135deg, #12b7ad, #1078c2); color: #fff;