@ticketboothapp/booking 0.1.19 → 0.1.20

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 (154) hide show
  1. package/package.json +1 -1
  2. package/src/components/BookingWidget.tsx +282 -26
  3. package/src/components/ManageBookingView.tsx +75 -23
  4. package/src/components/booking/BookingProductGrid.tsx +1 -1
  5. package/src/components/booking/Calendar.module.css +3 -3
  6. package/src/components/booking/CheckoutForm.tsx +1 -1
  7. package/src/components/booking/InfoTooltip.tsx +2 -13
  8. package/src/components/booking/PickupLocationSelector.tsx +2 -2
  9. package/src/components/booking/PriceBreakdown.tsx +11 -34
  10. package/src/index.ts +3 -1
  11. package/src/app/photo-sessions/photo-packages.ts +0 -75
  12. package/src/assets/icons/minus.svg +0 -7
  13. package/src/assets/icons/partner-logos/getyourguide.svg +0 -8
  14. package/src/assets/icons/plus.svg +0 -3
  15. package/src/colours.css +0 -23
  16. package/src/components/BookingDetails.module.css +0 -1591
  17. package/src/components/BookingDetails.tsx +0 -2264
  18. package/src/components/JobApplicationDialog.module.css +0 -440
  19. package/src/components/JobApplicationDialog.tsx +0 -620
  20. package/src/components/PhoneInputWithCountry.module.css +0 -131
  21. package/src/components/PhoneInputWithCountry.tsx +0 -44
  22. package/src/components/PickupLocationDialog.module.css +0 -360
  23. package/src/components/PickupLocationDialog.tsx +0 -357
  24. package/src/components/PickupLocationMap.tsx +0 -110
  25. package/src/components/PostBookingDependentAddOnUpsell.module.css +0 -174
  26. package/src/components/PostBookingDependentAddOnUpsell.tsx +0 -407
  27. package/src/components/accordion.css +0 -27
  28. package/src/components/accordion.tsx +0 -29
  29. package/src/components/analytics/AnalyticsConsentRestore.tsx +0 -19
  30. package/src/components/analytics/AnalyticsScripts.tsx +0 -106
  31. package/src/components/analytics/CookieConsentBanner.css +0 -86
  32. package/src/components/analytics/CookieConsentBanner.tsx +0 -102
  33. package/src/components/bottom-sheet.module.css +0 -78
  34. package/src/components/bottom-sheet.tsx +0 -60
  35. package/src/components/breadcrumb.module.css +0 -40
  36. package/src/components/breadcrumb.tsx +0 -36
  37. package/src/components/button.css +0 -245
  38. package/src/components/button.tsx +0 -152
  39. package/src/components/client-bottom-sheet.tsx +0 -14
  40. package/src/components/colorable-svg.tsx +0 -29
  41. package/src/components/conditional-footer.tsx +0 -27
  42. package/src/components/contact-us.module.css +0 -147
  43. package/src/components/contact-us.tsx +0 -49
  44. package/src/components/email-signup.css +0 -151
  45. package/src/components/email-signup.tsx +0 -63
  46. package/src/components/faq-wrapper.module.css +0 -47
  47. package/src/components/faq-wrapper.tsx +0 -15
  48. package/src/components/footer.css +0 -187
  49. package/src/components/footer.tsx +0 -143
  50. package/src/components/global-simple-modal.tsx +0 -33
  51. package/src/components/google-review-summary.module.css +0 -77
  52. package/src/components/google-review-summary.tsx +0 -50
  53. package/src/components/hero-image.css +0 -13
  54. package/src/components/hero-image.tsx +0 -44
  55. package/src/components/image.css +0 -29
  56. package/src/components/image.tsx +0 -113
  57. package/src/components/language-aware-link.tsx +0 -72
  58. package/src/components/language-switcher.module.css +0 -124
  59. package/src/components/language-switcher.tsx +0 -75
  60. package/src/components/map-section.css +0 -59
  61. package/src/components/map-section.tsx +0 -63
  62. package/src/components/navbar.module.css +0 -152
  63. package/src/components/navbar.tsx +0 -125
  64. package/src/components/parallax-provider.tsx +0 -11
  65. package/src/components/product-tag.module.css +0 -30
  66. package/src/components/product-tag.tsx +0 -34
  67. package/src/components/product-theme-pages/best-option.module.css +0 -70
  68. package/src/components/product-theme-pages/best-option.tsx +0 -35
  69. package/src/components/product-theme-pages/extended-tour-options.module.css +0 -22
  70. package/src/components/product-theme-pages/extended-tour-options.tsx +0 -11
  71. package/src/components/product-theme-pages/image-modal.tsx +0 -248
  72. package/src/components/product-theme-pages/photo-gallery.module.css +0 -200
  73. package/src/components/product-theme-pages/photo-gallery.tsx +0 -90
  74. package/src/components/product-theme-pages/product-theme-page-layout.module.css +0 -13
  75. package/src/components/product-theme-pages/product-theme-page-layout.tsx +0 -67
  76. package/src/components/product-theme-pages/top-of-fold.module.css +0 -179
  77. package/src/components/product-theme-pages/top-of-fold.tsx +0 -80
  78. package/src/components/product-tile/image-only-product-tile-desktop.module.css +0 -106
  79. package/src/components/product-tile/image-only-product-tile-desktop.tsx +0 -56
  80. package/src/components/product-tile/image-only-product-tile-mobile.module.css +0 -122
  81. package/src/components/product-tile/image-only-product-tile-mobile.tsx +0 -89
  82. package/src/components/product-tile/image-only-product-tile.tsx +0 -44
  83. package/src/components/product-tile/product-tile-card.module.css +0 -84
  84. package/src/components/product-tile/product-tile-card.tsx +0 -61
  85. package/src/components/review-highlights-section.css +0 -85
  86. package/src/components/review-highlights-section.tsx +0 -127
  87. package/src/components/season-closure-overlay.module.css +0 -99
  88. package/src/components/season-closure-overlay.tsx +0 -98
  89. package/src/components/simple-modal.tsx +0 -69
  90. package/src/components/simple-top-of-fold.module.css +0 -76
  91. package/src/components/simple-top-of-fold.tsx +0 -34
  92. package/src/components/spacer.css +0 -41
  93. package/src/components/spacer.tsx +0 -23
  94. package/src/components/star-rating.module.css +0 -74
  95. package/src/components/star-rating.tsx +0 -48
  96. package/src/components/terms/TermsContent.tsx +0 -178
  97. package/src/components/title-subtitle.module.css +0 -10
  98. package/src/components/title-subtitle.tsx +0 -30
  99. package/src/components/translatable-reviews.tsx +0 -75
  100. package/src/components/value-pill.module.css +0 -59
  101. package/src/components/value-pill.tsx +0 -46
  102. package/src/components/value-props.css +0 -185
  103. package/src/components/value-props.tsx +0 -88
  104. package/src/constants/booking-guide-quiz.ts +0 -64
  105. package/src/constants/contact-info.ts +0 -2
  106. package/src/constants/faq.ts +0 -44
  107. package/src/constants/images.ts +0 -556
  108. package/src/constants/json-ld/faq-json-ld.tsx +0 -170
  109. package/src/constants/json-ld/homepage-json-ld.tsx +0 -138
  110. package/src/constants/json-ld/job-posting-json-ld.tsx +0 -92
  111. package/src/constants/json-ld/organization-json-ld.tsx +0 -62
  112. package/src/constants/json-ld/page-json-ld.tsx +0 -6
  113. package/src/constants/json-ld/product-json-ld.tsx +0 -154
  114. package/src/constants/json-ld/review-json-ld.tsx +0 -377
  115. package/src/constants/navigation-links/footer-links.ts +0 -48
  116. package/src/constants/navigation-links/nav-bar-links.ts +0 -41
  117. package/src/constants/navigation-links/navigation-link.ts +0 -6
  118. package/src/constants/pill-values.ts +0 -210
  119. package/src/constants/products.ts +0 -155
  120. package/src/constants/quiz-recommendations.ts +0 -506
  121. package/src/constants/reviews.ts +0 -75
  122. package/src/constants/staff.ts +0 -197
  123. package/src/constants/value-props.ts +0 -58
  124. package/src/data/dap-descriptions/session-couples-families-friends.en.json +0 -61
  125. package/src/data/dap-descriptions/session-elopements.en.json +0 -60
  126. package/src/data/dap-descriptions/session-proposals.en.json +0 -60
  127. package/src/data/product-descriptions/afternoon-delight.en.json +0 -35
  128. package/src/data/product-descriptions/emerald-lake-escape.en.json +0 -68
  129. package/src/data/product-descriptions/lake-louise-adventure.en.json +0 -74
  130. package/src/data/product-descriptions/moraine-lake-adventure.en.json +0 -78
  131. package/src/data/product-descriptions/moraine-lake-sunrise-lake-louise-golden-hour.en.json +0 -65
  132. package/src/data/product-descriptions/moraine-lake-sunrise.en.json +0 -64
  133. package/src/data/product-descriptions/private-tour.en.json +0 -80
  134. package/src/data/product-descriptions/two-lakes-combo.en.json +0 -65
  135. package/src/data/products-config.json +0 -101
  136. package/src/hooks/use-bottom-sheet.tsx +0 -15
  137. package/src/hooks/use-simple-modal.tsx +0 -27
  138. package/src/hooks/useBookingSourceMetadataFromLocation.ts +0 -21
  139. package/src/hooks/useEmailSubscription.tsx +0 -103
  140. package/src/hooks/useEmbeddedInIframe.ts +0 -16
  141. package/src/hooks/useIsBookingLaunchLive.ts +0 -49
  142. package/src/hooks/useQuiz.tsx +0 -210
  143. package/src/providers/bottom-sheet-provider.tsx +0 -40
  144. package/src/providers/dependent-add-on-dialog-provider.tsx +0 -105
  145. package/src/radius.css +0 -5
  146. package/src/spacing.css +0 -7
  147. package/src/strings/en.json +0 -1774
  148. package/src/strings/es.json +0 -1573
  149. package/src/strings/fr.json +0 -1573
  150. package/src/strings/index.js +0 -23
  151. package/src/text-style.css +0 -97
  152. package/src/types/fareharbor.d.ts +0 -12
  153. package/src/types/quiz.ts +0 -59
  154. package/src/utils/currency-converter.ts +0 -101
@@ -1,72 +0,0 @@
1
- 'use client';
2
-
3
- import Link from 'next/link';
4
- import { usePathname } from 'next/navigation';
5
-
6
- interface LanguageAwareLinkProps {
7
- href: string;
8
- children: React.ReactNode;
9
- className?: string;
10
- target?: string;
11
- rel?: string;
12
- onClick?: () => void;
13
- }
14
-
15
- export default function LanguageAwareLink({
16
- href,
17
- children,
18
- className,
19
- target,
20
- rel,
21
- onClick
22
- }: LanguageAwareLinkProps) {
23
- const pathname = usePathname();
24
-
25
- // Check if we're currently on a non-English page
26
- const isSpanishPage = pathname?.startsWith('/es');
27
- const isFrenchPage = pathname?.startsWith('/fr');
28
-
29
- // Define which pages have translated versions (currently only the homepage)
30
- const translatedPages = ['/'];
31
-
32
- const getLocalizedHref = () => {
33
- // If we're on a Spanish page
34
- if (isSpanishPage && href.startsWith('/') && !href.startsWith('/es')) {
35
- // Only prepend /es if this page has a Spanish version
36
- if (translatedPages.includes(href)) {
37
- return `/es${href}`;
38
- }
39
- // Otherwise, go to the English version (remove any /es prefix if present)
40
- return href;
41
- }
42
-
43
- // If we're on a French page
44
- if (isFrenchPage && href.startsWith('/') && !href.startsWith('/fr')) {
45
- // Only prepend /fr if this page has a French version
46
- if (translatedPages.includes(href)) {
47
- return `/fr${href}`;
48
- }
49
- // Otherwise, go to the English version (remove any /fr prefix if present)
50
- return href;
51
- }
52
-
53
- // If we're on an English page, always go to English version
54
- if (!isSpanishPage && !isFrenchPage && (href.startsWith('/es') || href.startsWith('/fr'))) {
55
- return href.replace(/^\/(es|fr)/, '') || '/';
56
- }
57
-
58
- return href;
59
- };
60
-
61
- return (
62
- <Link
63
- href={getLocalizedHref()}
64
- className={className}
65
- target={target}
66
- rel={rel}
67
- onClick={onClick}
68
- >
69
- {children}
70
- </Link>
71
- );
72
- }
@@ -1,124 +0,0 @@
1
- .languageSwitcher {
2
- position: fixed;
3
- bottom: 20px;
4
- left: 20px;
5
- z-index: 1000;
6
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
7
- }
8
-
9
- .currentLanguage {
10
- display: flex;
11
- align-items: center;
12
- gap: 8px;
13
- padding: 8px 12px;
14
- background: rgba(255, 255, 255, 0.95);
15
- border: 1px solid rgba(0, 0, 0, 0.1);
16
- border-radius: var(--border-radius-pill);
17
- cursor: pointer;
18
- transition: all 0.2s ease;
19
- backdrop-filter: blur(10px);
20
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
21
- }
22
-
23
- .currentLanguage:hover {
24
- background: rgba(255, 255, 255, 1);
25
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
26
- transform: translateY(-1px);
27
- }
28
-
29
- .flag {
30
- font-size: 16px;
31
- line-height: 1;
32
- }
33
-
34
- .languageCode {
35
- font-size: 12px;
36
- font-weight: 600;
37
- color: #333;
38
- letter-spacing: 0.5px;
39
- }
40
-
41
- .languageDropdown {
42
- position: absolute;
43
- bottom: 100%;
44
- left: 0;
45
- margin-bottom: 8px;
46
- background: rgba(255, 255, 255, 0.95);
47
- border: 1px solid rgba(0, 0, 0, 0.1);
48
- border-radius: 8px;
49
- backdrop-filter: blur(10px);
50
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
51
- opacity: 0;
52
- visibility: hidden;
53
- transform: translateY(8px);
54
- transition: all 0.2s ease;
55
- min-width: 140px;
56
- }
57
-
58
- .languageDropdown.visible {
59
- opacity: 1;
60
- visibility: visible;
61
- transform: translateY(0);
62
- }
63
-
64
- .languageOption {
65
- display: flex;
66
- align-items: center;
67
- gap: 8px;
68
- padding: 10px 12px;
69
- text-decoration: none;
70
- color: #333;
71
- transition: background-color 0.15s ease;
72
- border-radius: 6px;
73
- margin: 4px;
74
- }
75
-
76
- .languageOption:hover {
77
- background: rgba(0, 0, 0, 0.05);
78
- }
79
-
80
- .languageOption.active {
81
- background: rgba(59, 130, 246, 0.1);
82
- color: #3b82f6;
83
- }
84
-
85
- .languageOption.active .flag {
86
- opacity: 0.8;
87
- }
88
-
89
- .languageName {
90
- font-size: 14px;
91
- font-weight: 500;
92
- }
93
-
94
- /* Mobile responsiveness */
95
- @media (max-width: 768px) {
96
- .languageSwitcher {
97
- bottom: 15px;
98
- left: 15px;
99
- }
100
-
101
- .currentLanguage {
102
- padding: 6px 10px;
103
- }
104
-
105
- .flag {
106
- font-size: 14px;
107
- }
108
-
109
- .languageCode {
110
- font-size: 11px;
111
- }
112
-
113
- .languageDropdown {
114
- min-width: 120px;
115
- }
116
-
117
- .languageOption {
118
- padding: 8px 10px;
119
- }
120
-
121
- .languageName {
122
- font-size: 13px;
123
- }
124
- }
@@ -1,75 +0,0 @@
1
- 'use client';
2
-
3
- import { useState, useEffect } from 'react';
4
- import { usePathname } from 'next/navigation';
5
- import Link from 'next/link';
6
- import styles from './language-switcher.module.css';
7
-
8
- interface Language {
9
- code: string;
10
- name: string;
11
- flag: string;
12
- }
13
-
14
- const languages: Language[] = [
15
- { code: 'en', name: 'english', flag: '🇨🇦' },
16
- { code: 'es', name: 'español', flag: '🇪🇸' },
17
- { code: 'fr', name: 'français', flag: '🇫🇷' },
18
- // Future languages
19
- // { code: 'nl', name: 'Nederlands', flag: '🇳🇱' },
20
- ];
21
-
22
- export default function LanguageSwitcher() {
23
- const [isHovered, setIsHovered] = useState(false);
24
- const pathname = usePathname();
25
-
26
- // Get current language from pathname
27
- const currentLanguage = pathname?.startsWith('/es') ? 'es' :
28
- pathname?.startsWith('/fr') ? 'fr' : 'en';
29
-
30
- const getLanguageUrl = (langCode: string) => {
31
- if (langCode === 'en') {
32
- // Go to English version (remove any language prefix)
33
- return pathname?.replace(/^\/(es|fr)/, '') || '/';
34
- } else if (langCode === 'es') {
35
- // Go to Spanish version (add /es prefix)
36
- const basePath = pathname?.replace(/^\/(es|fr)/, '') || '/';
37
- return `/es${basePath}`;
38
- } else if (langCode === 'fr') {
39
- // Go to French version (add /fr prefix)
40
- const basePath = pathname?.replace(/^\/(es|fr)/, '') || '/';
41
- return `/fr${basePath}`;
42
- }
43
- return '/';
44
- };
45
-
46
- const currentLang = languages.find(lang => lang.code === currentLanguage) || languages[0];
47
-
48
- return (
49
- <div
50
- className={styles.languageSwitcher}
51
- onMouseEnter={() => setIsHovered(true)}
52
- onMouseLeave={() => setIsHovered(false)}
53
- >
54
- <div className={styles.currentLanguage}>
55
- <span className={styles.flag}>{currentLang.flag}</span>
56
- <span className={styles.languageCode}>{currentLang.code.toUpperCase()}</span>
57
- </div>
58
-
59
- <div className={`${styles.languageDropdown} ${isHovered ? styles.visible : ''}`}>
60
- {languages.map((language) => (
61
- <Link
62
- key={language.code}
63
- href={getLanguageUrl(language.code)}
64
- className={`${styles.languageOption} ${
65
- language.code === currentLanguage ? styles.active : ''
66
- }`}
67
- >
68
- <span className={styles.flag}>{language.flag}</span>
69
- <span className={styles.languageName}>{language.name}</span>
70
- </Link>
71
- ))}
72
- </div>
73
- </div>
74
- );
75
- }
@@ -1,59 +0,0 @@
1
- .map-section-wrapper {
2
- width: 100%;
3
- background-color: var(--light-orange-background);
4
- overflow: hidden;
5
- padding-top: var(--spacing-medium);
6
- }
7
-
8
- .map-section-container {
9
- display: flex;
10
- flex-direction: column;
11
- align-items: center;
12
- justify-content: center;
13
- width: fit-content;
14
- min-height: 100px;
15
- padding: 2rem 4rem;
16
- background-color: var(--accent-map-green);
17
- margin: 0 auto;
18
- border-radius: 20px 20px 0px 0px;
19
- }
20
-
21
- .map-section-image {
22
- width: 100%;
23
- min-height: fit-content;
24
- object-fit: fit;
25
- overflow: hidden;
26
- }
27
-
28
- .via-via-map {
29
- width: 100%;
30
- height: auto;
31
- display: block;
32
- }
33
-
34
- @media (max-width: 1023px) {
35
- .map-section-container {
36
- width: 90%;
37
- padding: 2rem 0.5rem; /* Reduce padding on mobile */
38
- }
39
-
40
- .via-via-map {
41
- width: 100%;
42
- }
43
- }
44
-
45
- @media (min-width: 1024px) {
46
- .map-section-container {
47
- width: 70%;
48
- }
49
-
50
- .map-section-image {
51
- width: 100%;
52
- margin-top: 1rem;
53
- }
54
-
55
- .via-via-map {
56
- width: 60%;
57
- margin: 0 auto;
58
- }
59
- }
@@ -1,63 +0,0 @@
1
- "use client";
2
-
3
- import * as React from "react";
4
- import ViaViaImage from "@/components/image";
5
- import { IMAGES } from "@/constants/images";
6
- import "./map-section.css";
7
- import { motion } from "motion/react";
8
- import { useState } from "react";
9
-
10
- interface MapSectionProps {
11
- title: string;
12
- }
13
-
14
- const variants = {
15
- hidden: { x: 0, y: 200 },
16
- visible: { x: 0, y: 0 }
17
- };
18
-
19
- export default function MapSection(
20
- { title }: MapSectionProps
21
- ) {
22
- const [hasAnimated, setHasAnimated] = useState(false);
23
-
24
- const handleViewportEnter = (entry: IntersectionObserverEntry | null) => {
25
- if (!hasAnimated) {
26
- setHasAnimated(true);
27
- }
28
- };
29
-
30
- const handleViewportLeave = (entry: IntersectionObserverEntry | null) => {
31
- if (entry?.boundingClientRect.top! > 0) {
32
- setHasAnimated(false);
33
- }
34
- };
35
-
36
- return (
37
- <div className="map-section-wrapper">
38
- <motion.div className="map-section-container"
39
- variants={variants}
40
- initial="hidden"
41
- animate={hasAnimated ? "visible" : "hidden"}
42
- transition={{
43
- type: "spring",
44
- bounce: 0.1,
45
- duration: 1,
46
- }}
47
- viewport={{ once: false }}
48
- onViewportEnter={handleViewportEnter}
49
- onViewportLeave={handleViewportLeave}
50
- >
51
- <h2>{title}</h2>
52
- <div className="map-section-image">
53
- <ViaViaImage
54
- imageId={IMAGES.VIA_VIA_OPERATIONS_MAP.id}
55
- alt={IMAGES.VIA_VIA_OPERATIONS_MAP.alt}
56
- context="GALLERY"
57
- maintainAspectRatio={true}
58
- />
59
- </div>
60
- </motion.div>
61
- </div>
62
- );
63
- }
@@ -1,152 +0,0 @@
1
- .hideAndSlideNavbar {
2
- position: fixed;
3
- top: -150px; /* Start hidden above the viewport */
4
- transition: transform 0.5s ease;
5
- }
6
-
7
- .showAndSlideNavbar {
8
- transform: translateY(150px); /* Slide down to become visible */
9
- }
10
-
11
- .navbarContainer {
12
- left: 0;
13
- right: 0;
14
- z-index: 100;
15
- }
16
-
17
- .navbarContent {
18
- width: 100%;
19
- height: 100%;
20
- display: flex;
21
- flex-direction: column;
22
- }
23
-
24
- .navbarRow {
25
- display: flex;
26
- flex-direction: row;
27
- justify-content: space-between;
28
- align-items: center;
29
- }
30
-
31
- /* Desktop Navbar */
32
- @media (min-width: 1024px) {
33
- .navbarContainer {
34
- background-color: rgba(255, 238, 232, 0.7);
35
- backdrop-filter: blur(8px);
36
- padding: 1rem;
37
- }
38
-
39
- .navigationBarIcon {
40
- width: 60px;
41
- height: 60px;
42
- }
43
-
44
- .navbarContent {
45
- max-width: 95%;
46
- margin: 0 auto;
47
- }
48
-
49
- .mobileNavbarContent {
50
- display: none;
51
- }
52
-
53
- .mobileNavbarLinks {
54
- display: none;
55
- }
56
-
57
- .desktopNavbarContent {
58
- display: flex;
59
- flex-direction: row;
60
- justify-content: space-between;
61
- align-items: center;
62
- width: 100%;
63
- }
64
-
65
- .navbarLinks {
66
- display: flex;
67
- flex-direction: row;
68
- justify-content: space-between;
69
- align-items: center;
70
- padding: 0 2rem;
71
- width: 100%;
72
- text-align: center;
73
- }
74
-
75
- .bookNowButton {
76
- min-width: 160px;
77
- }
78
-
79
- .showAndStickyOrMobileOverlapNavbar {
80
- position: sticky;
81
- top: 0;
82
- }
83
-
84
- .showAndStickyNavbar {
85
- position: sticky;
86
- top: 0;
87
- }
88
- }
89
-
90
- /* Mobile Navbar */
91
- @media (max-width: 1023px) {
92
- .navbarContainer {
93
- border-color: var(--accent-orange);
94
- border-width: 2px;
95
- border-style: solid;
96
- border-radius: 40px;
97
- margin: 0.5rem;
98
- overflow: hidden;
99
- padding: 1rem;
100
- background-color: var(--light-orange-background);
101
- }
102
-
103
- .navigationBarIcon {
104
- width: 32px;
105
- height: 32px;
106
- }
107
-
108
- .desktopNavbarContent {
109
- display: none;
110
- }
111
-
112
- .navbarLinks {
113
- display: flex;
114
- flex-direction: column;
115
- align-items: center;
116
- height: 100%;
117
- justify-content: space-between;
118
- }
119
-
120
- .showAndStickyOrMobileOverlapNavbar {
121
- position: fixed;
122
- top: 0.5rem;
123
- }
124
-
125
- .showAndStickyNavbar {
126
- position: sticky;
127
- top: 0.5rem;
128
- }
129
- }
130
-
131
- .navbarLinks a {
132
- text-decoration: none;
133
- color: var(--accent-orange);
134
- font-size: 1.5rem;
135
- font-weight: 800;
136
- font-family: 'Poppins', sans-serif;
137
- text-transform: lowercase;
138
- padding: 0 var(--spacing-small);
139
- }
140
- .nonCurrentLink:hover {
141
- text-decoration: underline;
142
- }
143
-
144
- .mobileNavbarLinks {
145
- height: 0;
146
- overflow: hidden;
147
- transition: height 0.5s ease;
148
- }
149
-
150
- .mobileNavbarLinks.open {
151
- height: 300px;
152
- }
@@ -1,125 +0,0 @@
1
- 'use client';
2
-
3
- import styles from './navbar.module.css';
4
- import { usePathname } from 'next/navigation';
5
- import { useEffect, useState } from 'react';
6
- import Link from 'next/link';
7
- import LanguageAwareLink from './language-aware-link';
8
- import Button, { MenuButton, PresetButtonActions } from '@/components/button';
9
- import Image from 'next/image';
10
- import defaultStrings from '@/strings';
11
- import { getProducts } from '@/constants/products';
12
-
13
- export default function Navbar(
14
- {
15
- stickyMode,
16
- strings = defaultStrings,
17
- }: {
18
- stickyMode: string | "hideAndSlide" | "showAndStickyOrMobileOverlap" | "showAndSticky",
19
- strings?: any,
20
- }
21
- ) {
22
- const pathname = usePathname() || '/';
23
- const [isMenuOpen, setIsMenuOpen] = useState(false);
24
- const [isVisible, setIsVisible] = useState(false);
25
-
26
- if (stickyMode == "hideAndSlide") {
27
- useEffect(() => {
28
- const handleScroll = () => {
29
- const scrollPosition = window.scrollY;
30
-
31
- // Show navbar when scrolled past yHeightForSlide
32
- setIsVisible(scrollPosition > 50);
33
- };
34
-
35
- window.addEventListener('scroll', handleScroll);
36
- return () => window.removeEventListener('scroll', handleScroll);
37
- }, []);
38
- }
39
-
40
- return (
41
- <nav className={`${styles.navbarContainer} ${stickyMode == "hideAndSlide" ? styles.hideAndSlideNavbar : ''} ${isVisible && stickyMode == "hideAndSlide" ? styles.showAndSlideNavbar : ''} ${stickyMode == "showAndStickyOrMobileOverlap" ? styles.showAndStickyOrMobileOverlapNavbar : ''} ${stickyMode == "showAndSticky" ? styles.showAndStickyNavbar : ''}`}>
42
- <div className={styles.navbarContent}>
43
- <div className={styles.navbarRow}>
44
- <LanguageAwareLink href="/">
45
- <Image
46
- src="logo192.png"
47
- alt="Via Via Moraine Lake Shuttle Logo"
48
- className={styles.navigationBarIcon}
49
- width={60}
50
- height={60}
51
- />
52
- </LanguageAwareLink>
53
- <div className={styles.desktopNavbarContent}>
54
- <NavbarLinks setIsMenuOpen={setIsMenuOpen} currentPath={pathname} strings={strings} />
55
- <Button isLarge={true} className={styles.bookNowButton} action={PresetButtonActions.BOOK_ALL}>{strings.common.bookNow}</Button>
56
- </div>
57
- <div className={styles.mobileNavbarContent}>
58
- <MenuButton onClick={() => setIsMenuOpen(!isMenuOpen)} isOpen={isMenuOpen} strings={strings} />
59
- </div>
60
- </div>
61
- <div className={`${styles.mobileNavbarLinks} ${isMenuOpen ? styles.open : ''}`}>
62
- <NavbarLinks setIsMenuOpen={setIsMenuOpen} currentPath={pathname} strings={strings} />
63
- </div>
64
- </div>
65
- </nav>
66
- );
67
- }
68
-
69
- function NavbarLinks({ setIsMenuOpen, currentPath, strings }: {
70
- setIsMenuOpen: (open: boolean) => void,
71
- currentPath: string,
72
- strings: any
73
- }) {
74
-
75
- const products = getProducts(strings);
76
- const navbarLinks = [
77
- {
78
- name: strings.navigationLinks.home,
79
- path: '/',
80
- },
81
- {
82
- name: strings.navigationLinks.sunriseTours,
83
- path: products.MORAINE_LAKE_SUNRISE.path,
84
- },
85
- {
86
- name: strings.navigationLinks.moraineLake,
87
- path: products.MORAINE_LAKE_ADVENTURE.path,
88
- },
89
- {
90
- name: strings.navigationLinks.lakeLouise,
91
- path: products.LAKE_LOUISE_ADVENTURE.path,
92
- },
93
- {
94
- name: strings.navigationLinks.emeraldLake,
95
- path: products.EMERALD_LAKE_ESCAPE.path,
96
- },
97
- {
98
- name: strings.navigationLinks.privateTours,
99
- path: products.PRIVATE_TOUR.path,
100
- },
101
- {
102
- name: strings.navigationLinks.photoSessions,
103
- path: '/photo-sessions',
104
- },
105
- {
106
- name: strings.navigationLinks.faq,
107
- path: '/faq',
108
- },
109
- ];
110
-
111
- return (
112
- <div className={styles.navbarLinks}>
113
- {navbarLinks.map((link) => (
114
- <LanguageAwareLink
115
- onClick={() => setIsMenuOpen(false)}
116
- className={link.path == '/' && currentPath == '/' || link.path == '/' && currentPath == '/es' || link.path === currentPath.replace(/\/$/, '') ? styles.currentLink : styles.nonCurrentLink}
117
- key={link.name}
118
- href={link.path}
119
- >
120
- {link.name}
121
- </LanguageAwareLink>
122
- ))}
123
- </div>
124
- );
125
- }
@@ -1,11 +0,0 @@
1
- 'use client';
2
-
3
- import { ParallaxProvider } from 'react-scroll-parallax';
4
-
5
- export default function ParallaxWrapper({ children }: { children: React.ReactNode }) {
6
- return (
7
- <ParallaxProvider>
8
- {children}
9
- </ParallaxProvider>
10
- );
11
- }
@@ -1,30 +0,0 @@
1
- .tag {
2
- display: inline-flex;
3
- align-items: center;
4
- justify-content: center;
5
- padding: 0.4rem 0.8rem;
6
- font-size: 0.75rem;
7
- font-weight: 700;
8
- text-transform: uppercase;
9
- letter-spacing: 0.5px;
10
- z-index: 4;
11
- text-align: center;
12
- line-height: 1.2;
13
- border-radius: 4px;
14
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
15
- margin-bottom: 8px;
16
- white-space: nowrap;
17
- overflow: hidden;
18
- text-overflow: ellipsis;
19
- }
20
-
21
- /* Style variants */
22
- .most_popular {
23
- background-color: var(--accent-orange);
24
- color: white;
25
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
26
- }
27
-
28
- .custom {
29
- /* Custom styles will be applied via inline styles */
30
- }