@ticketboothapp/booking 0.1.19 → 0.1.22

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.
Files changed (106) hide show
  1. package/package.json +2 -1
  2. package/src/components/BookingWidget.tsx +282 -26
  3. package/src/components/ManageBookingView.tsx +75 -23
  4. package/src/components/PostBookingDependentAddOnUpsell.tsx +1 -1
  5. package/src/components/booking/BookingProductGrid.tsx +1 -1
  6. package/src/components/booking/Calendar.module.css +3 -3
  7. package/src/components/booking/CheckoutForm.tsx +1 -1
  8. package/src/components/booking/InfoTooltip.tsx +2 -13
  9. package/src/components/booking/PickupLocationSelector.tsx +2 -2
  10. package/src/components/booking/PriceBreakdown.tsx +11 -34
  11. package/src/index.ts +3 -1
  12. package/tsconfig.json +1 -1
  13. package/src/components/JobApplicationDialog.module.css +0 -440
  14. package/src/components/JobApplicationDialog.tsx +0 -620
  15. package/src/components/PickupLocationMap.tsx +0 -110
  16. package/src/components/accordion.css +0 -27
  17. package/src/components/accordion.tsx +0 -29
  18. package/src/components/analytics/AnalyticsConsentRestore.tsx +0 -19
  19. package/src/components/analytics/AnalyticsScripts.tsx +0 -106
  20. package/src/components/analytics/CookieConsentBanner.css +0 -86
  21. package/src/components/analytics/CookieConsentBanner.tsx +0 -102
  22. package/src/components/bottom-sheet.module.css +0 -78
  23. package/src/components/bottom-sheet.tsx +0 -60
  24. package/src/components/breadcrumb.module.css +0 -40
  25. package/src/components/breadcrumb.tsx +0 -36
  26. package/src/components/client-bottom-sheet.tsx +0 -14
  27. package/src/components/conditional-footer.tsx +0 -27
  28. package/src/components/contact-us.module.css +0 -147
  29. package/src/components/contact-us.tsx +0 -49
  30. package/src/components/email-signup.css +0 -151
  31. package/src/components/email-signup.tsx +0 -63
  32. package/src/components/faq-wrapper.module.css +0 -47
  33. package/src/components/faq-wrapper.tsx +0 -15
  34. package/src/components/footer.css +0 -187
  35. package/src/components/footer.tsx +0 -143
  36. package/src/components/global-simple-modal.tsx +0 -33
  37. package/src/components/google-review-summary.module.css +0 -77
  38. package/src/components/google-review-summary.tsx +0 -50
  39. package/src/components/hero-image.css +0 -13
  40. package/src/components/hero-image.tsx +0 -44
  41. package/src/components/language-aware-link.tsx +0 -72
  42. package/src/components/language-switcher.module.css +0 -124
  43. package/src/components/language-switcher.tsx +0 -75
  44. package/src/components/map-section.css +0 -59
  45. package/src/components/map-section.tsx +0 -63
  46. package/src/components/navbar.module.css +0 -152
  47. package/src/components/navbar.tsx +0 -125
  48. package/src/components/parallax-provider.tsx +0 -11
  49. package/src/components/product-theme-pages/best-option.module.css +0 -70
  50. package/src/components/product-theme-pages/best-option.tsx +0 -35
  51. package/src/components/product-theme-pages/extended-tour-options.module.css +0 -22
  52. package/src/components/product-theme-pages/extended-tour-options.tsx +0 -11
  53. package/src/components/product-theme-pages/photo-gallery.tsx +0 -90
  54. package/src/components/product-theme-pages/product-theme-page-layout.module.css +0 -13
  55. package/src/components/product-theme-pages/product-theme-page-layout.tsx +0 -67
  56. package/src/components/product-theme-pages/top-of-fold.module.css +0 -179
  57. package/src/components/product-theme-pages/top-of-fold.tsx +0 -80
  58. package/src/components/product-tile/image-only-product-tile-desktop.module.css +0 -106
  59. package/src/components/product-tile/image-only-product-tile-desktop.tsx +0 -56
  60. package/src/components/product-tile/image-only-product-tile-mobile.module.css +0 -122
  61. package/src/components/product-tile/image-only-product-tile-mobile.tsx +0 -89
  62. package/src/components/product-tile/image-only-product-tile.tsx +0 -44
  63. package/src/components/product-tile/product-tile-card.module.css +0 -84
  64. package/src/components/product-tile/product-tile-card.tsx +0 -61
  65. package/src/components/review-highlights-section.css +0 -85
  66. package/src/components/review-highlights-section.tsx +0 -127
  67. package/src/components/season-closure-overlay.module.css +0 -99
  68. package/src/components/season-closure-overlay.tsx +0 -98
  69. package/src/components/simple-modal.tsx +0 -69
  70. package/src/components/simple-top-of-fold.module.css +0 -76
  71. package/src/components/simple-top-of-fold.tsx +0 -34
  72. package/src/components/spacer.css +0 -41
  73. package/src/components/spacer.tsx +0 -23
  74. package/src/components/star-rating.module.css +0 -74
  75. package/src/components/star-rating.tsx +0 -48
  76. package/src/components/title-subtitle.module.css +0 -10
  77. package/src/components/title-subtitle.tsx +0 -30
  78. package/src/components/translatable-reviews.tsx +0 -75
  79. package/src/components/value-props.css +0 -185
  80. package/src/components/value-props.tsx +0 -88
  81. package/src/constants/booking-guide-quiz.ts +0 -64
  82. package/src/constants/contact-info.ts +0 -2
  83. package/src/constants/faq.ts +0 -44
  84. package/src/constants/json-ld/faq-json-ld.tsx +0 -170
  85. package/src/constants/json-ld/homepage-json-ld.tsx +0 -138
  86. package/src/constants/json-ld/job-posting-json-ld.tsx +0 -92
  87. package/src/constants/json-ld/organization-json-ld.tsx +0 -62
  88. package/src/constants/json-ld/page-json-ld.tsx +0 -6
  89. package/src/constants/json-ld/product-json-ld.tsx +0 -154
  90. package/src/constants/json-ld/review-json-ld.tsx +0 -377
  91. package/src/constants/navigation-links/footer-links.ts +0 -48
  92. package/src/constants/navigation-links/nav-bar-links.ts +0 -41
  93. package/src/constants/navigation-links/navigation-link.ts +0 -6
  94. package/src/constants/quiz-recommendations.ts +0 -506
  95. package/src/constants/reviews.ts +0 -75
  96. package/src/constants/staff.ts +0 -197
  97. package/src/constants/value-props.ts +0 -58
  98. package/src/hooks/use-bottom-sheet.tsx +0 -15
  99. package/src/hooks/use-simple-modal.tsx +0 -27
  100. package/src/hooks/useEmailSubscription.tsx +0 -103
  101. package/src/hooks/useEmbeddedInIframe.ts +0 -16
  102. package/src/hooks/useQuiz.tsx +0 -210
  103. package/src/providers/bottom-sheet-provider.tsx +0 -40
  104. package/src/types/fareharbor.d.ts +0 -12
  105. package/src/types/quiz.ts +0 -59
  106. /package/src/{app/photo-sessions → lib}/photo-packages.ts +0 -0
@@ -1,84 +0,0 @@
1
- .bestOptionCard {
2
- background-color: var(--accent-white);
3
- border-radius: 1rem;
4
- box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
5
- overflow: hidden;
6
- width: 100%;
7
- display: flex;
8
- flex-direction: column;
9
- height: 100%;
10
- color: inherit;
11
- }
12
-
13
- .bestOptionCardImage img { /* Target the actual image element */
14
- transition: transform 0.3s ease-in-out;
15
- will-change: transform; /* Optimize performance */
16
- }
17
-
18
- .bestOptionCardImageContainer {
19
- position: relative;
20
- display: flex;
21
- min-height: 250px; /* Minimum height for short content */
22
- }
23
-
24
- .bestOptionCardImage {
25
- width: 100%;
26
- height: 100%; /* Fill container height */
27
- object-fit: cover;
28
- position: absolute; /* Position behind pills */
29
- top: 0;
30
- left: 0;
31
- overflow: hidden;
32
- }
33
-
34
- .bestOptionCardTitle {
35
- font-weight: 700;
36
- font-size: 1.2rem;
37
- text-align: left;
38
- width: 100%;
39
- margin-bottom: 1rem;
40
- word-wrap: break-word;
41
- overflow-wrap: break-word;
42
- max-width: 100%;
43
- text-decoration: none;
44
- }
45
-
46
- .bestOptionCardContent {
47
- display: flex;
48
- flex-direction: column;
49
- align-items: center;
50
- width: 100%;
51
- padding: 1rem;
52
- flex: 1;
53
- justify-content: space-between;
54
- box-sizing: border-box;
55
- }
56
-
57
- .bestOptionCardButton {
58
- width: fit-content;
59
- margin-top: auto;
60
- }
61
-
62
- .productTilePillValuesView {
63
- position: relative;
64
- width: 100%;
65
- display: flex;
66
- flex-direction: row;
67
- flex-wrap: wrap;
68
- gap: 4px;
69
- align-content: flex-end;
70
- justify-content: flex-start;
71
- padding: 16px;
72
- z-index: 1;
73
- }
74
-
75
- /* Add hover effect for desktop */
76
- @media (min-width: 1024px) {
77
- .bestOptionCard:hover .productTilePillValuesView {
78
- opacity: 1;
79
- }
80
-
81
- .bestOptionCard:hover .bestOptionCardImage img {
82
- transform: scale(1.1); /* 10% zoom on hover */
83
- }
84
- }
@@ -1,61 +0,0 @@
1
- "use client";
2
-
3
- import { Product } from "@/constants/products";
4
- import ViaViaImage from "../image";
5
- import styles from "./product-tile-card.module.css";
6
- import Button, { ButtonHoverColor } from "../button";
7
- import defaultStrings from "@/strings";
8
- import ValuePill from "../value-pill";
9
- import { PillVariant } from "../value-pill";
10
- import { OPEN_BOOKING_FOR_PRODUCT } from "@/providers/booking-dialog-provider";
11
-
12
- export default function ProductTileCard({ product, strings = defaultStrings }: { product: Product; strings?: any }) {
13
- const handleClick = (e: React.MouseEvent) => {
14
- e.preventDefault();
15
- window.dispatchEvent(
16
- new CustomEvent(OPEN_BOOKING_FOR_PRODUCT, { detail: { productId: product.id } })
17
- );
18
- };
19
-
20
- return (
21
- <div onClick={handleClick} className={styles.bestOptionCard} style={{ cursor: 'pointer' }}>
22
- <div className={styles.bestOptionCardImageContainer}>
23
- <ViaViaImage
24
- imageId={product.images[0].id}
25
- alt={product.images[0].alt}
26
- context="GALLERY"
27
- className={styles.bestOptionCardImage}
28
- />
29
- <ProductTilePillValuesView product={product} />
30
- </div>
31
- <div className={styles.bestOptionCardContent}>
32
- <p className={styles.bestOptionCardTitle}>{product.name}</p>
33
- <Button
34
- variant="primary"
35
- className={styles.bestOptionCardButton}
36
- hoverColor={ButtonHoverColor.Turquoise}
37
- >
38
- {strings.common.moreInfo}
39
- </Button>
40
- </div>
41
- </div>
42
- );
43
- }
44
-
45
- function ProductTilePillValuesView({
46
- product
47
- }: {
48
- product: Product
49
- }) {
50
- return (
51
- <div className={styles.productTilePillValuesView}>
52
- {product.pillValues.map((pillValue, index) => (
53
- <ValuePill
54
- key={index}
55
- variant={PillVariant.overlay}
56
- pillValue={pillValue}
57
- />
58
- ))}
59
- </div>
60
- )
61
- }
@@ -1,85 +0,0 @@
1
- .review-highlights-section {
2
- background-color: var(--accent-turquoise-60);
3
- padding: var(--spacing-large) 0;
4
- }
5
-
6
- .review-highlights-container {
7
- overflow-x: auto;
8
- -ms-overflow-style: none;
9
- scrollbar-width: none;
10
- }
11
-
12
- .review-highlights-container::-webkit-scrollbar {
13
- display: none;
14
- }
15
-
16
- .review-highlights-row {
17
- display: flex;
18
- gap: 24px;
19
- min-width: min-content;
20
- }
21
-
22
- .review-highlights-title {
23
- color: var(--accent-white);
24
- padding: 0 var(--spacing-small);
25
- }
26
-
27
- .review-card {
28
- min-width: 300px;
29
- background: white;
30
- padding: 32px;
31
- border-radius: 40px;
32
- position: relative;
33
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
34
- margin-top: 50px;
35
- margin-right: 40px;
36
- display: flex;
37
- flex-direction: column;
38
- justify-content: space-between;
39
- }
40
-
41
- .author-avatar {
42
- width: 80px;
43
- height: 80px;
44
- border-radius: 50%;
45
- background: transparent;
46
- position: absolute;
47
- top: -40px;
48
- right: -40px;
49
- border: 4px solid white;
50
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
51
- }
52
-
53
- .review-author-name {
54
- text-align: right;
55
- padding-top: var(--spacing-small);
56
- }
57
-
58
- /* Desktop */
59
- @media (min-width: 1024px) {
60
- .review-quote {
61
- font-size: 14px;
62
- }
63
- }
64
-
65
- .expand-button {
66
- background: none;
67
- border: none;
68
- color: var(--accent-orange);
69
- cursor: pointer;
70
- font-weight: 600;
71
- font-family: 'Figtree', sans-serif;
72
- padding: 0;
73
- margin-left: 4px;
74
- text-decoration: underline;
75
- transition: color 0.2s ease;
76
- }
77
-
78
- .expand-button:hover {
79
- color: var(--accent-orange-dark);
80
- }
81
-
82
- .expand-button:focus {
83
- outline: none;
84
- color: var(--accent-orange-dark);
85
- }
@@ -1,127 +0,0 @@
1
- "use client";
2
-
3
- import { Parallax } from 'react-scroll-parallax';
4
- import './review-highlights-section.css';
5
- import ParallaxWrapper from '@/components/parallax-provider';
6
- import { REVIEWS, Review } from '@/constants/reviews';
7
- import Image from 'next/image';
8
- import StarRating from '@/components/star-rating';
9
- import { useState } from 'react';
10
- import TranslatableReviews from './translatable-reviews';
11
- import { usePathname } from 'next/navigation';
12
-
13
- function ReviewCard({
14
- review,
15
- originalReview,
16
- showOriginal,
17
- onToggleOriginal,
18
- language
19
- }: {
20
- review: typeof REVIEWS[0];
21
- originalReview?: typeof REVIEWS[0];
22
- showOriginal?: boolean;
23
- onToggleOriginal?: () => void;
24
- language: 'en' | 'es' | 'fr';
25
- }) {
26
- const [isExpanded, setIsExpanded] = useState(false);
27
-
28
- // Use original review if showing original, otherwise use the current review
29
- const displayReview = showOriginal && originalReview ? originalReview : review;
30
-
31
- // Truncate text to first 100 characters
32
- const truncatedText = displayReview.review.length > 500 ? displayReview.review.substring(0, 500) + '...' : displayReview.review;
33
- const shouldShowExpand = displayReview.review.length > 500;
34
-
35
- return (
36
- <div className="review-card">
37
- <p className="review-quote">
38
- <span dangerouslySetInnerHTML={{
39
- __html: isExpanded ? displayReview.review : truncatedText
40
- }} />
41
- {shouldShowExpand && (
42
- <button
43
- className="expand-button"
44
- onClick={() => setIsExpanded(!isExpanded)}
45
- >
46
- {isExpanded ? ' Show less' : ' Read more'}
47
- </button>
48
- )}
49
- </p>
50
- {(language === 'es' || language === 'fr') && originalReview && onToggleOriginal && (
51
- <div style={{ marginBottom: '1rem', textAlign: 'center' }}>
52
- <button
53
- onClick={onToggleOriginal}
54
- style={{
55
- background: 'none',
56
- border: 'none',
57
- color: 'var(--accent-orange)',
58
- cursor: 'pointer',
59
- fontWeight: '600',
60
- fontFamily: "'Figtree', sans-serif",
61
- padding: '0',
62
- textDecoration: 'underline',
63
- transition: 'color 0.2s ease'
64
- }}
65
- >
66
- {showOriginal ? (language === 'es' ? 'Ver traducido' : 'Voir traduit') : (language === 'es' ? 'Ver original' : 'Voir original')}
67
- </button>
68
- </div>
69
- )}
70
- <div className="review-author">
71
- <div className="author-avatar">
72
- <Image src={displayReview.profilePicture} alt={displayReview.author} width={80} height={80} />
73
- </div>
74
- </div>
75
- <div>
76
- <p className="review-author-name">{displayReview.author}</p>
77
- <StarRating rating={5} align="right" />
78
- </div>
79
- </div>
80
- );
81
- }
82
-
83
- export default function ReviewHighlightsSection({ className, strings }: { className: string; strings: any }) {
84
- const pathname = usePathname();
85
- const language = pathname?.startsWith('/es') ? 'es' : pathname?.startsWith('/fr') ? 'fr' : 'en';
86
- const [individualToggles, setIndividualToggles] = useState<Record<string, boolean>>({});
87
-
88
- const toggleIndividualOriginal = (reviewLink: string) => {
89
- setIndividualToggles(prev => ({
90
- ...prev,
91
- [reviewLink]: !prev[reviewLink]
92
- }));
93
- };
94
-
95
- return (
96
- <div id="reviews-section" className={`review-highlights-section ${className}`}>
97
- <ParallaxWrapper>
98
- <h2 className="review-highlights-title">{strings.home.reviewHighlights.title}</h2>
99
- <section className="review-highlights-container">
100
- <Parallax translateX={['100%', '-100%']}>
101
- <div className="review-highlights-row">
102
- <TranslatableReviews language={language}>
103
- {(reviews) =>
104
- reviews.map((review, index) => {
105
- const originalReview = REVIEWS[index];
106
- const showOriginal = individualToggles[review.link] || false;
107
-
108
- return (
109
- <ReviewCard
110
- key={review.link}
111
- review={review}
112
- originalReview={originalReview}
113
- showOriginal={showOriginal}
114
- onToggleOriginal={() => toggleIndividualOriginal(review.link)}
115
- language={language}
116
- />
117
- );
118
- })
119
- }
120
- </TranslatableReviews>
121
- </div>
122
- </Parallax>
123
- </section>
124
- </ParallaxWrapper>
125
- </div>
126
- );
127
- }
@@ -1,99 +0,0 @@
1
- .closureOverlayBackdrop {
2
- position: absolute;
3
- top: 0;
4
- left: 0;
5
- right: 0;
6
- bottom: 0;
7
- background: rgba(0, 0, 0, 0.5);
8
- backdrop-filter: blur(3px);
9
- z-index: 3;
10
- display: flex;
11
- align-items: center;
12
- justify-content: center;
13
- }
14
-
15
- .seasonClosureCallout {
16
- width: 90%;
17
- max-width: 500px;
18
- z-index: 4;
19
- display: flex;
20
- flex-direction: column;
21
- align-items: center;
22
- text-align: center;
23
- gap: 0.5rem;
24
- pointer-events: none;
25
- }
26
-
27
- .seasonClosureCallout * {
28
- pointer-events: auto;
29
- }
30
-
31
- .closureOverlayTop {
32
- display: flex;
33
- flex-direction: column;
34
- align-items: center;
35
- text-align: center;
36
- gap: 0.1rem;
37
- }
38
-
39
- .closureOverlayBottom {
40
- display: flex;
41
- flex-direction: column;
42
- align-items: center;
43
- text-align: center;
44
- }
45
-
46
- .closureTitle {
47
- font-size: 3rem;
48
- line-height: 0.7;
49
- font-weight: 900;
50
- color: #fff;
51
- text-shadow: 0 0 8px rgba(0,0,0,0.4);
52
- font-family: 'Snell Roundhand', sans-serif;
53
- text-transform: lowercase;
54
- text-align: center;
55
- margin-bottom: -0.2rem;
56
- }
57
-
58
- .closureSubtitle {
59
- font-size: 2rem;
60
- line-height: 1;
61
- font-weight: 400;
62
- color: #fff;
63
- text-shadow: 0 0 8px rgba(0,0,0,0.4);
64
- letter-spacing: 0.5px;
65
- font-family: 'Northlake', sans-serif;
66
- text-transform: lowercase;
67
- text-align: center;
68
- margin-top: 2rem;
69
- margin-bottom: 0.25rem;
70
- }
71
-
72
- .closureCountdownTime {
73
- font-size: 0.9rem;
74
- line-height: 1;
75
- font-weight: 400;
76
- color: rgba(255, 255, 255, 0.9);
77
- text-shadow: 0 0 6px rgba(0,0,0,0.3);
78
- letter-spacing: 0.1em;
79
- font-variant-numeric: tabular-nums;
80
- text-align: center;
81
- }
82
-
83
- .closureOpeningDate {
84
- font-size: 1.2rem;
85
- line-height: 1.1;
86
- font-weight: 400;
87
- color: #fff;
88
- text-shadow: 0 0 8px rgba(0,0,0,0.4);
89
- letter-spacing: 0.5px;
90
- font-family: 'Northlake', sans-serif;
91
- text-transform: lowercase;
92
- text-align: center;
93
- margin-top: 0.5rem;
94
- }
95
-
96
- .browseOurToursButton {
97
- margin-top: 1rem;
98
- background-color: var(--accent-turquoise);
99
- }
@@ -1,98 +0,0 @@
1
- "use client";
2
-
3
- import { useState, useEffect } from 'react';
4
- import { motion } from 'framer-motion';
5
- import EmailSignup from '@/components/email-signup';
6
- import styles from './season-closure-overlay.module.css';
7
- import Link from 'next/link';
8
- import Button, { PresetButtonActions } from './button';
9
-
10
- // Tomorrow at 8:00 AM MDT (MDT = UTC-6, so 8 AM MDT = 14:00 UTC)
11
- function getReopenDate(now: Date): Date {
12
- const denverDateStr = now.toLocaleDateString('en-CA', { timeZone: 'America/Denver' }); // YYYY-MM-DD
13
- const [y, m, d] = denverDateStr.split('-').map(Number);
14
- return new Date(Date.UTC(y, m - 1, d + 1, 14, 0, 0, 0));
15
- }
16
-
17
- function pad2(n: number): string {
18
- return String(n).padStart(2, '0');
19
- }
20
- function pad3(n: number): string {
21
- return String(n).padStart(3, '0');
22
- }
23
-
24
- function getCountdown(now: Date): { days: number; timeText: string } {
25
- const diff = getReopenDate(now).getTime() - now.getTime();
26
- if (diff <= 0) return { days: -1, timeText: "00:00:00.000" };
27
- const totalSeconds = Math.floor(diff / 1000);
28
- const days = Math.floor(totalSeconds / 86400);
29
- const hours = Math.floor((totalSeconds % 86400) / 3600);
30
- const minutes = Math.floor((totalSeconds % 3600) / 60);
31
- const seconds = totalSeconds % 60;
32
- const ms = Math.floor(diff % 1000);
33
- const timeText = `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}.${pad3(ms)}`;
34
- return { days, timeText };
35
- }
36
-
37
- interface SeasonClosureOverlayProps {
38
- strings: any;
39
- className?: string;
40
- showBackdrop?: boolean;
41
- }
42
-
43
- export default function SeasonClosureOverlay({ strings, className = "", showBackdrop = true }: SeasonClosureOverlayProps) {
44
- const [countdown, setCountdown] = useState(() => getCountdown(new Date()));
45
- const sc = strings.home.seasonClosure;
46
-
47
- useEffect(() => {
48
- const tick = () => setCountdown(getCountdown(new Date()));
49
- tick();
50
- // 50ms = 20 updates/sec. Smooth enough for ms display, much lighter than 10ms (100/sec).
51
- const id = setInterval(tick, 50);
52
- return () => clearInterval(id);
53
- }, []);
54
-
55
- const content = (
56
- <motion.div
57
- className={styles.seasonClosureCallout}
58
- initial={{ y: 20, opacity: 0, scale: 0.95 }}
59
- animate={{ y: 0, opacity: 1, scale: 1 }}
60
- transition={{
61
- duration: 0.6,
62
- delay: 0.3,
63
- type: "spring",
64
- }}
65
- >
66
- <div className={styles.closureOverlayTop} data-reopen-date="2026-03-11T15:00:00.000Z">
67
- <span className={styles.closureTitle}>{sc.title}</span>
68
- <span className={styles.closureSubtitle}>{sc.daysLine}</span>
69
- <span className={styles.closureCountdownTime}>{countdown.timeText}</span>
70
- <span className={styles.closureOpeningDate}><Link href="https://calendar.google.com/calendar/event?action=TEMPLATE&tmeid=NXU3aTNhaWQ3N2sxZ21lcWVscXZ1bjN0c2IgY184OTI4ZDA1OTdhMzIwZjdhMGVlNDcyNzM5YjFkMzBkMmQ1MTNiYjgwZGI4OTU3Y2M5MGJjNzViM2U2OGFlOTI5QGc&tmsrc=c_8928d0597a320f7a0ee472739b1d30d2d513bb80db8957cc90bc75b3e68ae929%40group.calendar.google.com" target="_blank">{sc.openingDate}</Link></span>
71
- </div>
72
- <div className={styles.closureOverlayBottom}>
73
- <EmailSignup strings={strings} source="hero-closure" />
74
- <Button
75
- action={PresetButtonActions.BOOK_ALL}
76
- className={styles.browseOurToursButton}
77
- isLarge={true}
78
- >
79
- {strings.home.seasonClosure.browseOurTours}
80
- </Button>
81
- </div>
82
- </motion.div>
83
- );
84
-
85
- if (showBackdrop) {
86
- return (
87
- <div className={`${styles.closureOverlayBackdrop} ${className}`}>
88
- {content}
89
- </div>
90
- );
91
- }
92
-
93
- return (
94
- <div className={className}>
95
- {content}
96
- </div>
97
- );
98
- }
@@ -1,69 +0,0 @@
1
- "use client";
2
-
3
- import EmailSignup from "./email-signup";
4
- import styles from './season-closure-overlay.module.css';
5
- import strings from '@/strings';
6
-
7
- interface SimpleModalProps {
8
- isOpen: boolean;
9
- onClose: () => void;
10
- }
11
-
12
- export default function SimpleModal({ isOpen, onClose }: SimpleModalProps) {
13
- if (!isOpen) return null;
14
-
15
- return (
16
- <div
17
- style={{
18
- position: 'fixed',
19
- top: 0,
20
- left: 0,
21
- right: 0,
22
- bottom: 0,
23
- background: 'rgba(0, 0, 0, 0.5)',
24
- display: 'flex',
25
- alignItems: 'center',
26
- justifyContent: 'center',
27
- zIndex: 9999,
28
- padding: '1rem'
29
- }}
30
- onClick={onClose}
31
- >
32
- <div
33
- style={{
34
- background: 'white',
35
- padding: '2rem',
36
- borderRadius: '8px',
37
- boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',
38
- maxWidth: '600px',
39
- width: '100%'
40
- }}
41
- onClick={(e) => e.stopPropagation()}
42
- >
43
- <div className={styles.closureOverlayTop}>
44
- <span className={styles.closureTitle} style={{ color: 'var(--accent-orange)', textShadow: 'none' }}>{strings.home.seasonClosure.title}</span>
45
- <span className={styles.closureSubtitle} style={{ color: 'var(--accent-orange)', textShadow: 'none' }}>{strings.home.seasonClosure.subtitle}</span>
46
- <span className={styles.closureSubSubtitle} style={{ color: 'var(--accent-orange)', textShadow: 'none' }}>{strings.home.seasonClosure.message}</span>
47
- </div>
48
-
49
- <p style={{
50
- fontFamily: 'Figtree, sans-serif',
51
- marginTop: '1.5rem',
52
- marginBottom: '1.5rem',
53
- lineHeight: '0.8rem',
54
- color: '#333',
55
- fontSize: '0.8rem',
56
- textAlign: 'center',
57
- }}>
58
- Moraine Lake Road is closed by Parks Canada every year for the winter season. ❄️<br></br> See you next summer!
59
- </p>
60
-
61
- <div className={styles.closureOverlayBottom}>
62
- <div className="email-signup-modal">
63
- <EmailSignup strings={strings} source="simple-modal" />
64
- </div>
65
- </div>
66
- </div>
67
- </div>
68
- );
69
- }
@@ -1,76 +0,0 @@
1
- .topOfFold {
2
- position: relative;
3
- width: 100vw;
4
- overflow: hidden;
5
- }
6
-
7
- .heroImageWrapper {
8
- position: absolute;
9
- top: 0;
10
- left: 0;
11
- right: 0;
12
- width: 100%;
13
- height: 100%;
14
- z-index: 2;
15
- }
16
-
17
- .heroImageWrapper :global(img) {
18
- width: 100%;
19
- height: 100%;
20
- object-fit: cover;
21
- }
22
-
23
- .heroOverlayContent {
24
- position: absolute;
25
- width: 100%;
26
- z-index: 2;
27
- display: flex;
28
- flex-direction: column;
29
- justify-content: center;
30
- align-items: center;
31
- margin-top: 14rem;
32
- }
33
-
34
- .heroTitle {
35
- color: var(--accent-white);
36
- font-size: 5rem;
37
- line-height: 1.2;
38
- text-align: center;
39
- text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
40
- text-transform: none;
41
- }
42
-
43
- .heroSubtitle {
44
- color: var(--accent-white);
45
- font-size: 2rem;
46
- text-align: center;
47
- text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
48
- }
49
-
50
- .heroSubsubtitle {
51
- color: var(--accent-white);
52
- font-size: 1.5rem;
53
- text-align: center;
54
- text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
55
- text-transform: uppercase;
56
- }
57
-
58
- @media (min-width: 1024px) {
59
- .topOfFold {
60
- height: calc(100vh - 98px);
61
- }
62
- }
63
-
64
- @media (max-width: 1023px) {
65
- .heroTitle {
66
- font-size: 3rem;
67
- }
68
-
69
- .heroSubtitle {
70
- font-size: 1.2rem;
71
- }
72
-
73
- .topOfFold {
74
- height: 100vh;
75
- }
76
- }