From 46b5a26b26de96936f1f739a0bd3e9696f5e7aa3 Mon Sep 17 00:00:00 2001 From: Eric Windmill Date: Fri, 27 Sep 2024 18:49:27 -0400 Subject: [PATCH] Compass app (#2446) --- compass_app/README.md | 59 + compass_app/app/.gitignore | 46 + compass_app/app/.metadata | 45 + compass_app/app/analysis_options.yaml | 5 + compass_app/app/android/.gitignore | 13 + compass_app/app/android/app/build.gradle | 44 + .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 45 + .../com/example/compass_app/MainActivity.kt | 5 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 12 + .../app/src/main/res/values/styles.xml | 12 + .../app/src/profile/AndroidManifest.xml | 7 + compass_app/app/android/build.gradle | 18 + compass_app/app/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + compass_app/app/android/settings.gradle | 25 + compass_app/app/assets/activities.json | 32678 ++++++++++++++++ compass_app/app/assets/destinations.json | 1235 + compass_app/app/assets/logo.svg | 10 + compass_app/app/assets/user.jpg | Bin 0 -> 41922 bytes compass_app/app/devtools_options.yaml | 3 + .../integration_test/app_local_data_test.dart | 145 + .../app_server_data_test.dart | 208 + compass_app/app/ios/.gitignore | 34 + .../app/ios/Flutter/AppFrameworkInfo.plist | 26 + compass_app/app/ios/Flutter/Debug.xcconfig | 2 + compass_app/app/ios/Flutter/Release.xcconfig | 2 + compass_app/app/ios/Podfile | 44 + .../app/ios/Runner.xcodeproj/project.pbxproj | 616 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + compass_app/app/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1418 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../app/ios/Runner/Base.lproj/Main.storyboard | 26 + compass_app/app/ios/Runner/Info.plist | 49 + .../app/ios/Runner/Runner-Bridging-Header.h | 1 + .../app/ios/RunnerTests/RunnerTests.swift | 12 + compass_app/app/lib/config/assets.dart | 8 + compass_app/app/lib/config/dependencies.dart | 144 + .../activity/activity_repository.dart | 12 + .../activity/activity_repository_local.dart | 31 + .../activity/activity_repository_remote.dart | 36 + .../repositories/auth/auth_repository.dart | 22 + .../auth/auth_repository_dev.dart | 27 + .../auth/auth_repository_remote.dart | 112 + .../booking/booking_repository.dart | 21 + .../booking/booking_repository_local.dart | 97 + .../booking/booking_repository_remote.dart | 118 + .../continent/continent_repository.dart | 12 + .../continent/continent_repository_local.dart | 22 + .../continent_repository_remote.dart | 37 + .../destination/destination_repository.dart | 12 + .../destination_repository_local.dart | 28 + .../destination_repository_remote.dart | 37 + .../itinerary_config_repository.dart | 17 + .../itinerary_config_repository_memory.dart | 27 + .../repositories/user/user_repository.dart | 12 + .../user/user_repository_local.dart | 21 + .../user/user_repository_remote.dart | 39 + .../app/lib/data/services/api/api_client.dart | 210 + .../data/services/api/auth_api_client.dart | 43 + .../api/model/booking/booking_api_model.dart | 35 + .../booking/booking_api_model.freezed.dart | 317 + .../model/booking/booking_api_model.g.dart | 31 + .../model/login_request/login_request.dart | 24 + .../login_request/login_request.freezed.dart | 192 + .../model/login_request/login_request.g.dart | 19 + .../model/login_response/login_response.dart | 24 + .../login_response.freezed.dart | 191 + .../login_response/login_response.g.dart | 19 + .../api/model/user/user_api_model.dart | 28 + .../model/user/user_api_model.freezed.dart | 241 + .../api/model/user/user_api_model.g.dart | 23 + .../services/local/local_data_service.dart | 71 + .../services/shared_preferences_service.dart | 41 + .../lib/domain/models/activity/activity.dart | 56 + .../models/activity/activity.freezed.dart | 425 + .../domain/models/activity/activity.g.dart | 43 + .../lib/domain/models/booking/booking.dart | 35 + .../models/booking/booking.freezed.dart | 300 + .../lib/domain/models/booking/booking.g.dart | 28 + .../models/booking/booking_summary.dart | 34 + .../booking/booking_summary.freezed.dart | 243 + .../models/booking/booking_summary.g.dart | 24 + .../domain/models/continent/continent.dart | 23 + .../models/continent/continent.freezed.dart | 191 + .../domain/models/continent/continent.g.dart | 19 + .../models/destination/destination.dart | 38 + .../destination/destination.freezed.dart | 339 + .../models/destination/destination.g.dart | 29 + .../itinerary_config/itinerary_config.dart | 35 + .../itinerary_config.freezed.dart | 316 + .../itinerary_config/itinerary_config.g.dart | 36 + .../app/lib/domain/models/user/user.dart | 21 + .../lib/domain/models/user/user.freezed.dart | 185 + .../app/lib/domain/models/user/user.g.dart | 18 + .../booking/booking_create_use_case.dart | 106 + .../booking/booking_share_use_case.dart | 46 + compass_app/app/lib/main.dart | 40 + compass_app/app/lib/main_development.dart | 24 + compass_app/app/lib/main_staging.dart | 24 + compass_app/app/lib/routing/router.dart | 154 + compass_app/app/lib/routing/routes.dart | 17 + .../view_models/activities_viewmodel.dart | 142 + .../activities/widgets/activities_header.dart | 48 + .../activities/widgets/activities_list.dart | 61 + .../activities/widgets/activities_screen.dart | 188 + .../activities/widgets/activities_title.dart | 43 + .../ui/activities/widgets/activity_entry.dart | 68 + .../widgets/activity_time_of_day.dart | 5 + .../login/view_models/login_viewmodel.dart | 34 + .../ui/auth/login/widgets/login_screen.dart | 113 + .../ui/auth/login/widgets/tilted_cards.dart | 97 + .../logout/view_models/logout_viewmodel.dart | 34 + .../ui/auth/logout/widgets/logout_button.dart | 88 + .../view_models/booking_viewmodel.dart | 89 + .../lib/ui/booking/widgets/booking_body.dart | 104 + .../ui/booking/widgets/booking_header.dart | 191 + .../ui/booking/widgets/booking_screen.dart | 115 + .../ui/core/localization/applocalization.dart | 121 + .../app/lib/ui/core/themes/colors.dart | 41 + .../app/lib/ui/core/themes/dimens.dart | 65 + compass_app/app/lib/ui/core/themes/theme.dart | 84 + .../app/lib/ui/core/ui/back_button.dart | 63 + .../app/lib/ui/core/ui/blur_filter.dart | 7 + .../app/lib/ui/core/ui/custom_checkbox.dart | 50 + .../lib/ui/core/ui/date_format_start_end.dart | 24 + .../app/lib/ui/core/ui/error_indicator.dart | 63 + .../app/lib/ui/core/ui/home_button.dart | 60 + .../app/lib/ui/core/ui/scroll_behavior.dart | 17 + .../app/lib/ui/core/ui/search_bar.dart | 111 + compass_app/app/lib/ui/core/ui/tag_chip.dart | 144 + .../ui/home/view_models/home_viewmodel.dart | 95 + .../app/lib/ui/home/widgets/home_screen.dart | 198 + .../app/lib/ui/home/widgets/home_title.dart | 89 + .../view_models/results_viewmodel.dart | 111 + .../lib/ui/results/widgets/result_card.dart | 89 + .../ui/results/widgets/results_screen.dart | 180 + .../view_models/search_form_viewmodel.dart | 162 + .../widgets/search_form_continent.dart | 168 + .../search_form/widgets/search_form_date.dart | 82 + .../widgets/search_form_guests.dart | 105 + .../widgets/search_form_screen.dart | 65 + .../widgets/search_form_submit.dart | 100 + compass_app/app/lib/utils/command.dart | 97 + .../app/lib/utils/image_error_listener.dart | 11 + compass_app/app/lib/utils/result.dart | 54 + compass_app/app/linux/.gitignore | 1 + compass_app/app/linux/CMakeLists.txt | 145 + compass_app/app/linux/flutter/CMakeLists.txt | 88 + .../flutter/generated_plugin_registrant.cc | 15 + .../flutter/generated_plugin_registrant.h | 15 + .../app/linux/flutter/generated_plugins.cmake | 24 + compass_app/app/linux/main.cc | 6 + compass_app/app/linux/my_application.cc | 124 + compass_app/app/linux/my_application.h | 18 + compass_app/app/macos/.gitignore | 7 + .../app/macos/Flutter/Flutter-Debug.xcconfig | 2 + .../macos/Flutter/Flutter-Release.xcconfig | 2 + .../Flutter/GeneratedPluginRegistrant.swift | 18 + compass_app/app/macos/Podfile | 43 + .../macos/Runner.xcodeproj/project.pbxproj | 801 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../app/macos/Runner/AppDelegate.swift | 9 + .../AppIcon.appiconset/Contents.json | 68 + .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 102994 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 5680 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 520 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 14142 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1066 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 36406 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 2218 bytes .../app/macos/Runner/Base.lproj/MainMenu.xib | 343 + .../app/macos/Runner/Configs/AppInfo.xcconfig | 14 + .../app/macos/Runner/Configs/Debug.xcconfig | 2 + .../app/macos/Runner/Configs/Release.xcconfig | 2 + .../macos/Runner/Configs/Warnings.xcconfig | 13 + .../macos/Runner/DebugProfile.entitlements | 14 + compass_app/app/macos/Runner/Info.plist | 32 + .../app/macos/Runner/MainFlutterWindow.swift | 15 + .../app/macos/Runner/Release.entitlements | 8 + .../app/macos/RunnerTests/RunnerTests.swift | 12 + compass_app/app/pubspec.yaml | 45 + .../activity_repository_local_test.dart | 30 + .../activity_repository_remote_test.dart | 49 + .../auth/auth_repository_remote_test.dart | 102 + .../booking_repository_remote_test.dart | 60 + .../continent_repository_remote_test.dart | 49 + .../destination_repository_local_test.dart | 33 + .../destination_repository_remote_test.dart | 49 + .../data/services/api/api_client_test.dart | 83 + .../services/api/auth_api_client_test.dart | 41 + .../booking/booking_create_use_case_test.dart | 37 + .../booking/booking_share_use_case_test.dart | 35 + .../ui/activities/activities_screen_test.dart | 83 + .../app/test/ui/auth/login_screen_test.dart | 63 + .../app/test/ui/auth/logout_button_test.dart | 78 + .../test/ui/booking/booking_screen_test.dart | 113 + .../ui/home/widgets/home_screen_test.dart | 131 + .../test/ui/results/results_screen_test.dart | 80 + .../ui/results/results_viewmodel_test.dart | 32 + .../search_form_viewmodel_test.dart | 73 + .../widgets/search_form_continent_test.dart | 39 + .../widgets/search_form_date_test.dart | 61 + .../widgets/search_form_guests_test.dart | 68 + .../widgets/search_form_screen_test.dart | 74 + .../widgets/search_form_submit_test.dart | 62 + compass_app/app/test/utils/command_test.dart | 102 + compass_app/app/testing/app.dart | 40 + .../fake_activities_repository.dart | 23 + .../repositories/fake_auth_repository.dart | 30 + .../repositories/fake_booking_repository.dart | 50 + .../fake_continent_repository.dart | 19 + .../fake_destination_repository.dart | 17 + .../fake_itinerary_config_repository.dart | 26 + .../repositories/fake_user_repository.dart | 16 + .../fakes/services/fake_api_client.dart | 120 + .../fakes/services/fake_auth_api_client.dart | 18 + .../fake_shared_preferences_service.dart | 21 + compass_app/app/testing/mocks.dart | 58 + compass_app/app/testing/models/activity.dart | 18 + compass_app/app/testing/models/booking.dart | 33 + .../app/testing/models/destination.dart | 25 + compass_app/app/testing/models/user.dart | 18 + compass_app/app/web/favicon.png | Bin 0 -> 917 bytes compass_app/app/web/icons/Icon-192.png | Bin 0 -> 5292 bytes compass_app/app/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../app/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../app/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes compass_app/app/web/index.html | 38 + compass_app/app/web/manifest.json | 35 + compass_app/app/windows/.gitignore | 17 + compass_app/app/windows/CMakeLists.txt | 108 + .../app/windows/flutter/CMakeLists.txt | 109 + .../flutter/generated_plugin_registrant.cc | 17 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 25 + compass_app/app/windows/runner/CMakeLists.txt | 40 + compass_app/app/windows/runner/Runner.rc | 121 + .../app/windows/runner/flutter_window.cpp | 71 + .../app/windows/runner/flutter_window.h | 33 + compass_app/app/windows/runner/main.cpp | 43 + compass_app/app/windows/runner/resource.h | 16 + .../app/windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../app/windows/runner/runner.exe.manifest | 20 + compass_app/app/windows/runner/utils.cpp | 65 + compass_app/app/windows/runner/utils.h | 19 + .../app/windows/runner/win32_window.cpp | 288 + compass_app/app/windows/runner/win32_window.h | 102 + compass_app/docs/Global — Splash.png | Bin 0 -> 343623 bytes compass_app/docs/Legacy — Activities.png | Bin 0 -> 93753 bytes compass_app/docs/Legacy — Book.png | Bin 0 -> 384480 bytes compass_app/docs/Legacy — Home.png | Bin 0 -> 38494 bytes compass_app/server/.gitignore | 3 + compass_app/server/analysis_options.yaml | 30 + compass_app/server/bin/compass_server.dart | 39 + compass_app/server/lib/config/assets.dart | 23 + compass_app/server/lib/config/constants.dart | 34 + compass_app/server/lib/middleware/auth.dart | 30 + .../server/lib/model/activity/activity.dart | 56 + .../lib/model/activity/activity.freezed.dart | 425 + .../server/lib/model/activity/activity.g.dart | 43 + .../server/lib/model/booking/booking.dart | 35 + .../lib/model/booking/booking.freezed.dart | 312 + .../server/lib/model/booking/booking.g.dart | 29 + .../server/lib/model/continent/continent.dart | 23 + .../model/continent/continent.freezed.dart | 191 + .../lib/model/continent/continent.g.dart | 19 + .../lib/model/destination/destination.dart | 38 + .../destination/destination.freezed.dart | 339 + .../lib/model/destination/destination.g.dart | 29 + .../model/login_request/login_request.dart | 24 + .../login_request/login_request.freezed.dart | 192 + .../model/login_request/login_request.g.dart | 19 + .../model/login_response/login_response.dart | 24 + .../login_response.freezed.dart | 191 + .../login_response/login_response.g.dart | 19 + compass_app/server/lib/model/user/user.dart | 27 + .../server/lib/model/user/user.freezed.dart | 236 + compass_app/server/lib/model/user/user.g.dart | 22 + compass_app/server/lib/routes/booking.dart | 116 + compass_app/server/lib/routes/continent.dart | 44 + .../server/lib/routes/destination.dart | 35 + compass_app/server/lib/routes/login.dart | 50 + compass_app/server/lib/routes/user.dart | 27 + compass_app/server/pubspec.yaml | 23 + compass_app/server/test/server_test.dart | 230 + tool/flutter_ci_script_beta.sh | 3 + tool/flutter_ci_script_master.sh | 3 + tool/flutter_ci_script_stable.sh | 2 + 326 files changed, 53272 insertions(+) create mode 100644 compass_app/README.md create mode 100644 compass_app/app/.gitignore create mode 100644 compass_app/app/.metadata create mode 100644 compass_app/app/analysis_options.yaml create mode 100644 compass_app/app/android/.gitignore create mode 100644 compass_app/app/android/app/build.gradle create mode 100644 compass_app/app/android/app/src/debug/AndroidManifest.xml create mode 100644 compass_app/app/android/app/src/main/AndroidManifest.xml create mode 100644 compass_app/app/android/app/src/main/kotlin/com/example/compass_app/MainActivity.kt create mode 100644 compass_app/app/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 compass_app/app/android/app/src/main/res/drawable/launch_background.xml create mode 100644 compass_app/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 compass_app/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 compass_app/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 compass_app/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 compass_app/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 compass_app/app/android/app/src/main/res/values-night/styles.xml create mode 100644 compass_app/app/android/app/src/main/res/values/styles.xml create mode 100644 compass_app/app/android/app/src/profile/AndroidManifest.xml create mode 100644 compass_app/app/android/build.gradle create mode 100644 compass_app/app/android/gradle.properties create mode 100644 compass_app/app/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 compass_app/app/android/settings.gradle create mode 100644 compass_app/app/assets/activities.json create mode 100644 compass_app/app/assets/destinations.json create mode 100644 compass_app/app/assets/logo.svg create mode 100644 compass_app/app/assets/user.jpg create mode 100644 compass_app/app/devtools_options.yaml create mode 100644 compass_app/app/integration_test/app_local_data_test.dart create mode 100644 compass_app/app/integration_test/app_server_data_test.dart create mode 100644 compass_app/app/ios/.gitignore create mode 100644 compass_app/app/ios/Flutter/AppFrameworkInfo.plist create mode 100644 compass_app/app/ios/Flutter/Debug.xcconfig create mode 100644 compass_app/app/ios/Flutter/Release.xcconfig create mode 100644 compass_app/app/ios/Podfile create mode 100644 compass_app/app/ios/Runner.xcodeproj/project.pbxproj create mode 100644 compass_app/app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 compass_app/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 compass_app/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 compass_app/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 compass_app/app/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 compass_app/app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 compass_app/app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 compass_app/app/ios/Runner/AppDelegate.swift create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 compass_app/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 compass_app/app/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 compass_app/app/ios/Runner/Base.lproj/Main.storyboard create mode 100644 compass_app/app/ios/Runner/Info.plist create mode 100644 compass_app/app/ios/Runner/Runner-Bridging-Header.h create mode 100644 compass_app/app/ios/RunnerTests/RunnerTests.swift create mode 100644 compass_app/app/lib/config/assets.dart create mode 100644 compass_app/app/lib/config/dependencies.dart create mode 100644 compass_app/app/lib/data/repositories/activity/activity_repository.dart create mode 100644 compass_app/app/lib/data/repositories/activity/activity_repository_local.dart create mode 100644 compass_app/app/lib/data/repositories/activity/activity_repository_remote.dart create mode 100644 compass_app/app/lib/data/repositories/auth/auth_repository.dart create mode 100644 compass_app/app/lib/data/repositories/auth/auth_repository_dev.dart create mode 100644 compass_app/app/lib/data/repositories/auth/auth_repository_remote.dart create mode 100644 compass_app/app/lib/data/repositories/booking/booking_repository.dart create mode 100644 compass_app/app/lib/data/repositories/booking/booking_repository_local.dart create mode 100644 compass_app/app/lib/data/repositories/booking/booking_repository_remote.dart create mode 100644 compass_app/app/lib/data/repositories/continent/continent_repository.dart create mode 100644 compass_app/app/lib/data/repositories/continent/continent_repository_local.dart create mode 100644 compass_app/app/lib/data/repositories/continent/continent_repository_remote.dart create mode 100644 compass_app/app/lib/data/repositories/destination/destination_repository.dart create mode 100644 compass_app/app/lib/data/repositories/destination/destination_repository_local.dart create mode 100644 compass_app/app/lib/data/repositories/destination/destination_repository_remote.dart create mode 100644 compass_app/app/lib/data/repositories/itinerary_config/itinerary_config_repository.dart create mode 100644 compass_app/app/lib/data/repositories/itinerary_config/itinerary_config_repository_memory.dart create mode 100644 compass_app/app/lib/data/repositories/user/user_repository.dart create mode 100644 compass_app/app/lib/data/repositories/user/user_repository_local.dart create mode 100644 compass_app/app/lib/data/repositories/user/user_repository_remote.dart create mode 100644 compass_app/app/lib/data/services/api/api_client.dart create mode 100644 compass_app/app/lib/data/services/api/auth_api_client.dart create mode 100644 compass_app/app/lib/data/services/api/model/booking/booking_api_model.dart create mode 100644 compass_app/app/lib/data/services/api/model/booking/booking_api_model.freezed.dart create mode 100644 compass_app/app/lib/data/services/api/model/booking/booking_api_model.g.dart create mode 100644 compass_app/app/lib/data/services/api/model/login_request/login_request.dart create mode 100644 compass_app/app/lib/data/services/api/model/login_request/login_request.freezed.dart create mode 100644 compass_app/app/lib/data/services/api/model/login_request/login_request.g.dart create mode 100644 compass_app/app/lib/data/services/api/model/login_response/login_response.dart create mode 100644 compass_app/app/lib/data/services/api/model/login_response/login_response.freezed.dart create mode 100644 compass_app/app/lib/data/services/api/model/login_response/login_response.g.dart create mode 100644 compass_app/app/lib/data/services/api/model/user/user_api_model.dart create mode 100644 compass_app/app/lib/data/services/api/model/user/user_api_model.freezed.dart create mode 100644 compass_app/app/lib/data/services/api/model/user/user_api_model.g.dart create mode 100644 compass_app/app/lib/data/services/local/local_data_service.dart create mode 100644 compass_app/app/lib/data/services/shared_preferences_service.dart create mode 100644 compass_app/app/lib/domain/models/activity/activity.dart create mode 100644 compass_app/app/lib/domain/models/activity/activity.freezed.dart create mode 100644 compass_app/app/lib/domain/models/activity/activity.g.dart create mode 100644 compass_app/app/lib/domain/models/booking/booking.dart create mode 100644 compass_app/app/lib/domain/models/booking/booking.freezed.dart create mode 100644 compass_app/app/lib/domain/models/booking/booking.g.dart create mode 100644 compass_app/app/lib/domain/models/booking/booking_summary.dart create mode 100644 compass_app/app/lib/domain/models/booking/booking_summary.freezed.dart create mode 100644 compass_app/app/lib/domain/models/booking/booking_summary.g.dart create mode 100644 compass_app/app/lib/domain/models/continent/continent.dart create mode 100644 compass_app/app/lib/domain/models/continent/continent.freezed.dart create mode 100644 compass_app/app/lib/domain/models/continent/continent.g.dart create mode 100644 compass_app/app/lib/domain/models/destination/destination.dart create mode 100644 compass_app/app/lib/domain/models/destination/destination.freezed.dart create mode 100644 compass_app/app/lib/domain/models/destination/destination.g.dart create mode 100644 compass_app/app/lib/domain/models/itinerary_config/itinerary_config.dart create mode 100644 compass_app/app/lib/domain/models/itinerary_config/itinerary_config.freezed.dart create mode 100644 compass_app/app/lib/domain/models/itinerary_config/itinerary_config.g.dart create mode 100644 compass_app/app/lib/domain/models/user/user.dart create mode 100644 compass_app/app/lib/domain/models/user/user.freezed.dart create mode 100644 compass_app/app/lib/domain/models/user/user.g.dart create mode 100644 compass_app/app/lib/domain/use_cases/booking/booking_create_use_case.dart create mode 100644 compass_app/app/lib/domain/use_cases/booking/booking_share_use_case.dart create mode 100644 compass_app/app/lib/main.dart create mode 100644 compass_app/app/lib/main_development.dart create mode 100644 compass_app/app/lib/main_staging.dart create mode 100644 compass_app/app/lib/routing/router.dart create mode 100644 compass_app/app/lib/routing/routes.dart create mode 100644 compass_app/app/lib/ui/activities/view_models/activities_viewmodel.dart create mode 100644 compass_app/app/lib/ui/activities/widgets/activities_header.dart create mode 100644 compass_app/app/lib/ui/activities/widgets/activities_list.dart create mode 100644 compass_app/app/lib/ui/activities/widgets/activities_screen.dart create mode 100644 compass_app/app/lib/ui/activities/widgets/activities_title.dart create mode 100644 compass_app/app/lib/ui/activities/widgets/activity_entry.dart create mode 100644 compass_app/app/lib/ui/activities/widgets/activity_time_of_day.dart create mode 100644 compass_app/app/lib/ui/auth/login/view_models/login_viewmodel.dart create mode 100644 compass_app/app/lib/ui/auth/login/widgets/login_screen.dart create mode 100644 compass_app/app/lib/ui/auth/login/widgets/tilted_cards.dart create mode 100644 compass_app/app/lib/ui/auth/logout/view_models/logout_viewmodel.dart create mode 100644 compass_app/app/lib/ui/auth/logout/widgets/logout_button.dart create mode 100644 compass_app/app/lib/ui/booking/view_models/booking_viewmodel.dart create mode 100644 compass_app/app/lib/ui/booking/widgets/booking_body.dart create mode 100644 compass_app/app/lib/ui/booking/widgets/booking_header.dart create mode 100644 compass_app/app/lib/ui/booking/widgets/booking_screen.dart create mode 100644 compass_app/app/lib/ui/core/localization/applocalization.dart create mode 100644 compass_app/app/lib/ui/core/themes/colors.dart create mode 100644 compass_app/app/lib/ui/core/themes/dimens.dart create mode 100644 compass_app/app/lib/ui/core/themes/theme.dart create mode 100644 compass_app/app/lib/ui/core/ui/back_button.dart create mode 100644 compass_app/app/lib/ui/core/ui/blur_filter.dart create mode 100644 compass_app/app/lib/ui/core/ui/custom_checkbox.dart create mode 100644 compass_app/app/lib/ui/core/ui/date_format_start_end.dart create mode 100644 compass_app/app/lib/ui/core/ui/error_indicator.dart create mode 100644 compass_app/app/lib/ui/core/ui/home_button.dart create mode 100644 compass_app/app/lib/ui/core/ui/scroll_behavior.dart create mode 100644 compass_app/app/lib/ui/core/ui/search_bar.dart create mode 100644 compass_app/app/lib/ui/core/ui/tag_chip.dart create mode 100644 compass_app/app/lib/ui/home/view_models/home_viewmodel.dart create mode 100644 compass_app/app/lib/ui/home/widgets/home_screen.dart create mode 100644 compass_app/app/lib/ui/home/widgets/home_title.dart create mode 100644 compass_app/app/lib/ui/results/view_models/results_viewmodel.dart create mode 100644 compass_app/app/lib/ui/results/widgets/result_card.dart create mode 100644 compass_app/app/lib/ui/results/widgets/results_screen.dart create mode 100644 compass_app/app/lib/ui/search_form/view_models/search_form_viewmodel.dart create mode 100644 compass_app/app/lib/ui/search_form/widgets/search_form_continent.dart create mode 100644 compass_app/app/lib/ui/search_form/widgets/search_form_date.dart create mode 100644 compass_app/app/lib/ui/search_form/widgets/search_form_guests.dart create mode 100644 compass_app/app/lib/ui/search_form/widgets/search_form_screen.dart create mode 100644 compass_app/app/lib/ui/search_form/widgets/search_form_submit.dart create mode 100644 compass_app/app/lib/utils/command.dart create mode 100644 compass_app/app/lib/utils/image_error_listener.dart create mode 100644 compass_app/app/lib/utils/result.dart create mode 100644 compass_app/app/linux/.gitignore create mode 100644 compass_app/app/linux/CMakeLists.txt create mode 100644 compass_app/app/linux/flutter/CMakeLists.txt create mode 100644 compass_app/app/linux/flutter/generated_plugin_registrant.cc create mode 100644 compass_app/app/linux/flutter/generated_plugin_registrant.h create mode 100644 compass_app/app/linux/flutter/generated_plugins.cmake create mode 100644 compass_app/app/linux/main.cc create mode 100644 compass_app/app/linux/my_application.cc create mode 100644 compass_app/app/linux/my_application.h create mode 100644 compass_app/app/macos/.gitignore create mode 100644 compass_app/app/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 compass_app/app/macos/Flutter/Flutter-Release.xcconfig create mode 100644 compass_app/app/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 compass_app/app/macos/Podfile create mode 100644 compass_app/app/macos/Runner.xcodeproj/project.pbxproj create mode 100644 compass_app/app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 compass_app/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 compass_app/app/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 compass_app/app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 compass_app/app/macos/Runner/AppDelegate.swift create mode 100644 compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 compass_app/app/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 compass_app/app/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 compass_app/app/macos/Runner/Configs/Debug.xcconfig create mode 100644 compass_app/app/macos/Runner/Configs/Release.xcconfig create mode 100644 compass_app/app/macos/Runner/Configs/Warnings.xcconfig create mode 100644 compass_app/app/macos/Runner/DebugProfile.entitlements create mode 100644 compass_app/app/macos/Runner/Info.plist create mode 100644 compass_app/app/macos/Runner/MainFlutterWindow.swift create mode 100644 compass_app/app/macos/Runner/Release.entitlements create mode 100644 compass_app/app/macos/RunnerTests/RunnerTests.swift create mode 100644 compass_app/app/pubspec.yaml create mode 100644 compass_app/app/test/data/repositories/activity/activity_repository_local_test.dart create mode 100644 compass_app/app/test/data/repositories/activity/activity_repository_remote_test.dart create mode 100644 compass_app/app/test/data/repositories/auth/auth_repository_remote_test.dart create mode 100644 compass_app/app/test/data/repositories/booking/booking_repository_remote_test.dart create mode 100644 compass_app/app/test/data/repositories/continent/continent_repository_remote_test.dart create mode 100644 compass_app/app/test/data/repositories/destination/destination_repository_local_test.dart create mode 100644 compass_app/app/test/data/repositories/destination/destination_repository_remote_test.dart create mode 100644 compass_app/app/test/data/services/api/api_client_test.dart create mode 100644 compass_app/app/test/data/services/api/auth_api_client_test.dart create mode 100644 compass_app/app/test/domain/use_cases/booking/booking_create_use_case_test.dart create mode 100644 compass_app/app/test/domain/use_cases/booking/booking_share_use_case_test.dart create mode 100644 compass_app/app/test/ui/activities/activities_screen_test.dart create mode 100644 compass_app/app/test/ui/auth/login_screen_test.dart create mode 100644 compass_app/app/test/ui/auth/logout_button_test.dart create mode 100644 compass_app/app/test/ui/booking/booking_screen_test.dart create mode 100644 compass_app/app/test/ui/home/widgets/home_screen_test.dart create mode 100644 compass_app/app/test/ui/results/results_screen_test.dart create mode 100644 compass_app/app/test/ui/results/results_viewmodel_test.dart create mode 100644 compass_app/app/test/ui/search_form/view_models/search_form_viewmodel_test.dart create mode 100644 compass_app/app/test/ui/search_form/widgets/search_form_continent_test.dart create mode 100644 compass_app/app/test/ui/search_form/widgets/search_form_date_test.dart create mode 100644 compass_app/app/test/ui/search_form/widgets/search_form_guests_test.dart create mode 100644 compass_app/app/test/ui/search_form/widgets/search_form_screen_test.dart create mode 100644 compass_app/app/test/ui/search_form/widgets/search_form_submit_test.dart create mode 100644 compass_app/app/test/utils/command_test.dart create mode 100644 compass_app/app/testing/app.dart create mode 100644 compass_app/app/testing/fakes/repositories/fake_activities_repository.dart create mode 100644 compass_app/app/testing/fakes/repositories/fake_auth_repository.dart create mode 100644 compass_app/app/testing/fakes/repositories/fake_booking_repository.dart create mode 100644 compass_app/app/testing/fakes/repositories/fake_continent_repository.dart create mode 100644 compass_app/app/testing/fakes/repositories/fake_destination_repository.dart create mode 100644 compass_app/app/testing/fakes/repositories/fake_itinerary_config_repository.dart create mode 100644 compass_app/app/testing/fakes/repositories/fake_user_repository.dart create mode 100644 compass_app/app/testing/fakes/services/fake_api_client.dart create mode 100644 compass_app/app/testing/fakes/services/fake_auth_api_client.dart create mode 100644 compass_app/app/testing/fakes/services/fake_shared_preferences_service.dart create mode 100644 compass_app/app/testing/mocks.dart create mode 100644 compass_app/app/testing/models/activity.dart create mode 100644 compass_app/app/testing/models/booking.dart create mode 100644 compass_app/app/testing/models/destination.dart create mode 100644 compass_app/app/testing/models/user.dart create mode 100644 compass_app/app/web/favicon.png create mode 100644 compass_app/app/web/icons/Icon-192.png create mode 100644 compass_app/app/web/icons/Icon-512.png create mode 100644 compass_app/app/web/icons/Icon-maskable-192.png create mode 100644 compass_app/app/web/icons/Icon-maskable-512.png create mode 100644 compass_app/app/web/index.html create mode 100644 compass_app/app/web/manifest.json create mode 100644 compass_app/app/windows/.gitignore create mode 100644 compass_app/app/windows/CMakeLists.txt create mode 100644 compass_app/app/windows/flutter/CMakeLists.txt create mode 100644 compass_app/app/windows/flutter/generated_plugin_registrant.cc create mode 100644 compass_app/app/windows/flutter/generated_plugin_registrant.h create mode 100644 compass_app/app/windows/flutter/generated_plugins.cmake create mode 100644 compass_app/app/windows/runner/CMakeLists.txt create mode 100644 compass_app/app/windows/runner/Runner.rc create mode 100644 compass_app/app/windows/runner/flutter_window.cpp create mode 100644 compass_app/app/windows/runner/flutter_window.h create mode 100644 compass_app/app/windows/runner/main.cpp create mode 100644 compass_app/app/windows/runner/resource.h create mode 100644 compass_app/app/windows/runner/resources/app_icon.ico create mode 100644 compass_app/app/windows/runner/runner.exe.manifest create mode 100644 compass_app/app/windows/runner/utils.cpp create mode 100644 compass_app/app/windows/runner/utils.h create mode 100644 compass_app/app/windows/runner/win32_window.cpp create mode 100644 compass_app/app/windows/runner/win32_window.h create mode 100644 compass_app/docs/Global — Splash.png create mode 100644 compass_app/docs/Legacy — Activities.png create mode 100644 compass_app/docs/Legacy — Book.png create mode 100644 compass_app/docs/Legacy — Home.png create mode 100644 compass_app/server/.gitignore create mode 100644 compass_app/server/analysis_options.yaml create mode 100644 compass_app/server/bin/compass_server.dart create mode 100644 compass_app/server/lib/config/assets.dart create mode 100644 compass_app/server/lib/config/constants.dart create mode 100644 compass_app/server/lib/middleware/auth.dart create mode 100644 compass_app/server/lib/model/activity/activity.dart create mode 100644 compass_app/server/lib/model/activity/activity.freezed.dart create mode 100644 compass_app/server/lib/model/activity/activity.g.dart create mode 100644 compass_app/server/lib/model/booking/booking.dart create mode 100644 compass_app/server/lib/model/booking/booking.freezed.dart create mode 100644 compass_app/server/lib/model/booking/booking.g.dart create mode 100644 compass_app/server/lib/model/continent/continent.dart create mode 100644 compass_app/server/lib/model/continent/continent.freezed.dart create mode 100644 compass_app/server/lib/model/continent/continent.g.dart create mode 100644 compass_app/server/lib/model/destination/destination.dart create mode 100644 compass_app/server/lib/model/destination/destination.freezed.dart create mode 100644 compass_app/server/lib/model/destination/destination.g.dart create mode 100644 compass_app/server/lib/model/login_request/login_request.dart create mode 100644 compass_app/server/lib/model/login_request/login_request.freezed.dart create mode 100644 compass_app/server/lib/model/login_request/login_request.g.dart create mode 100644 compass_app/server/lib/model/login_response/login_response.dart create mode 100644 compass_app/server/lib/model/login_response/login_response.freezed.dart create mode 100644 compass_app/server/lib/model/login_response/login_response.g.dart create mode 100644 compass_app/server/lib/model/user/user.dart create mode 100644 compass_app/server/lib/model/user/user.freezed.dart create mode 100644 compass_app/server/lib/model/user/user.g.dart create mode 100644 compass_app/server/lib/routes/booking.dart create mode 100644 compass_app/server/lib/routes/continent.dart create mode 100644 compass_app/server/lib/routes/destination.dart create mode 100644 compass_app/server/lib/routes/login.dart create mode 100644 compass_app/server/lib/routes/user.dart create mode 100644 compass_app/server/pubspec.yaml create mode 100644 compass_app/server/test/server_test.dart diff --git a/compass_app/README.md b/compass_app/README.md new file mode 100644 index 000000000..05ed7670a --- /dev/null +++ b/compass_app/README.md @@ -0,0 +1,59 @@ +# compass_app + +The Compass sample application is an app that helps users build and book +itineraries for trips. It’s a robust sample application with many features, routes, and screens. The app communicates +with an HTTP server, has development and production environments, brand-specific styling, and high test coverage. In +these ways and more, it simulates a real-world, feature rich Flutter application. + +The code in this application is used for explaining architecture in a Flutter application. + +![compass app splash screen](./docs/Global%20—%20Splash.png) +![compass app activities screen](./docs/Legacy%20—%20Activities.png) +![compass app home screen](./docs/Legacy%20—%20Home.png) +![compass app booking screen](./docs/Legacy%20—%20Book.png) + +The Compass app was originally [designed and built by the Firebase GenKit team](https://developers.googleblog.com/en/how-firebase-genkit-helped-add-ai-to-our-compass-app/). + +## Running the app + +This app contains multiple environments. + +* Development environment - This environment uses data from a JSON file, which is stored in the `assets` directory, and simulates developing locally. + +```bash +$ cd app +$ flutter run --target lib/main_development.dart +``` + +* Staging environment - This environment uses an HTTP server to get data, simulating a real app experience. This is a "dummy" server, that has endpoints that simply return fake data. The server can be found in the `compass_app/server` directory. You need to run the server locally before running the Flutter application. + +```bash +$ cd server +$ dart run +# => Server listening on port 8080 + +$ cd ../compass_app/app +$ flutter run --target lib/main_staging.dart +``` + +## Integration Tests + +Integration tests must be run from the `app` directory. + +**Integration tests with local data** + +```bash +cd app +$ flutter test integration_test/app_local_data_test.dart +``` + +**Integration tests with background server and remote data** + +```bash +cd app +$ flutter test integration_test/app_server_data_test.dart +``` + +Running the tests together with `flutter test integration_test` will fail. +See: https://github.com/flutter/flutter/issues/101031 + diff --git a/compass_app/app/.gitignore b/compass_app/app/.gitignore new file mode 100644 index 000000000..285c53d1a --- /dev/null +++ b/compass_app/app/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release + +# Coverage test report +coverage/ diff --git a/compass_app/app/.metadata b/compass_app/app/.metadata new file mode 100644 index 000000000..925b67f88 --- /dev/null +++ b/compass_app/app/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "ee624bc4fd41413cbb89099b0701a42287643d9a" + channel: "beta" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: ee624bc4fd41413cbb89099b0701a42287643d9a + base_revision: ee624bc4fd41413cbb89099b0701a42287643d9a + - platform: android + create_revision: ee624bc4fd41413cbb89099b0701a42287643d9a + base_revision: ee624bc4fd41413cbb89099b0701a42287643d9a + - platform: ios + create_revision: ee624bc4fd41413cbb89099b0701a42287643d9a + base_revision: ee624bc4fd41413cbb89099b0701a42287643d9a + - platform: linux + create_revision: ee624bc4fd41413cbb89099b0701a42287643d9a + base_revision: ee624bc4fd41413cbb89099b0701a42287643d9a + - platform: macos + create_revision: ee624bc4fd41413cbb89099b0701a42287643d9a + base_revision: ee624bc4fd41413cbb89099b0701a42287643d9a + - platform: web + create_revision: ee624bc4fd41413cbb89099b0701a42287643d9a + base_revision: ee624bc4fd41413cbb89099b0701a42287643d9a + - platform: windows + create_revision: ee624bc4fd41413cbb89099b0701a42287643d9a + base_revision: ee624bc4fd41413cbb89099b0701a42287643d9a + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/compass_app/app/analysis_options.yaml b/compass_app/app/analysis_options.yaml new file mode 100644 index 000000000..59af2e887 --- /dev/null +++ b/compass_app/app/analysis_options.yaml @@ -0,0 +1,5 @@ +include: package:flutter_lints/flutter.yaml + +linter: + rules: + - prefer_relative_imports diff --git a/compass_app/app/android/.gitignore b/compass_app/app/android/.gitignore new file mode 100644 index 000000000..55afd919c --- /dev/null +++ b/compass_app/app/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/compass_app/app/android/app/build.gradle b/compass_app/app/android/app/build.gradle new file mode 100644 index 000000000..fb8c978b6 --- /dev/null +++ b/compass_app/app/android/app/build.gradle @@ -0,0 +1,44 @@ +plugins { + id "com.android.application" + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" +} + +android { + namespace = "com.example.compass_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8 + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.compass_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.debug + } + } +} + +flutter { + source = "../.." +} diff --git a/compass_app/app/android/app/src/debug/AndroidManifest.xml b/compass_app/app/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 000000000..399f6981d --- /dev/null +++ b/compass_app/app/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/compass_app/app/android/app/src/main/AndroidManifest.xml b/compass_app/app/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..7d5151bd8 --- /dev/null +++ b/compass_app/app/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/compass_app/app/android/app/src/main/kotlin/com/example/compass_app/MainActivity.kt b/compass_app/app/android/app/src/main/kotlin/com/example/compass_app/MainActivity.kt new file mode 100644 index 000000000..aab96a478 --- /dev/null +++ b/compass_app/app/android/app/src/main/kotlin/com/example/compass_app/MainActivity.kt @@ -0,0 +1,5 @@ +package com.example.compass_app + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() diff --git a/compass_app/app/android/app/src/main/res/drawable-v21/launch_background.xml b/compass_app/app/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 000000000..f74085f3f --- /dev/null +++ b/compass_app/app/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/compass_app/app/android/app/src/main/res/drawable/launch_background.xml b/compass_app/app/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 000000000..304732f88 --- /dev/null +++ b/compass_app/app/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/compass_app/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/compass_app/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/compass_app/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/compass_app/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/compass_app/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/compass_app/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/compass_app/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/compass_app/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/compass_app/app/android/app/src/main/res/values-night/styles.xml b/compass_app/app/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 000000000..4732e853e --- /dev/null +++ b/compass_app/app/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/compass_app/app/android/app/src/main/res/values/styles.xml b/compass_app/app/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..ce8badf37 --- /dev/null +++ b/compass_app/app/android/app/src/main/res/values/styles.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/compass_app/app/android/app/src/profile/AndroidManifest.xml b/compass_app/app/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 000000000..399f6981d --- /dev/null +++ b/compass_app/app/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/compass_app/app/android/build.gradle b/compass_app/app/android/build.gradle new file mode 100644 index 000000000..d2ffbffa4 --- /dev/null +++ b/compass_app/app/android/build.gradle @@ -0,0 +1,18 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = "../build" +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/compass_app/app/android/gradle.properties b/compass_app/app/android/gradle.properties new file mode 100644 index 000000000..259717082 --- /dev/null +++ b/compass_app/app/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true diff --git a/compass_app/app/android/gradle/wrapper/gradle-wrapper.properties b/compass_app/app/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..5e6b54271 --- /dev/null +++ b/compass_app/app/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip diff --git a/compass_app/app/android/settings.gradle b/compass_app/app/android/settings.gradle new file mode 100644 index 000000000..b9e43bd37 --- /dev/null +++ b/compass_app/app/android/settings.gradle @@ -0,0 +1,25 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.1.0" apply false + id "org.jetbrains.kotlin.android" version "1.8.22" apply false +} + +include ":app" diff --git a/compass_app/app/assets/activities.json b/compass_app/app/assets/activities.json new file mode 100644 index 000000000..136e04876 --- /dev/null +++ b/compass_app/app/assets/activities.json @@ -0,0 +1,32678 @@ +[ + { + "name": "Glacier Trekking and Ice Climbing", + "description": "Embark on a thrilling adventure exploring the awe-inspiring glaciers of Alaska. Hike across the icy terrain, marvel at the deep blue crevasses, and even try your hand at ice climbing for an unforgettable experience.", + "locationName": "Matanuska Glacier or Mendenhall Glacier", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "alaska", + "ref": "glacier-trekking-and-ice-climbing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_glacier-trekking-and-ice-climbing.jpg" + }, + { + "name": "Wildlife Viewing Cruise", + "description": "Set sail on a scenic cruise through Alaska's pristine waters and witness the abundance of wildlife in their natural habitat. Keep an eye out for majestic whales, playful sea otters, and soaring bald eagles.", + "locationName": "Kenai Fjords National Park or Glacier Bay National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "alaska", + "ref": "wildlife-viewing-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_wildlife-viewing-cruise.jpg" + }, + { + "name": "Dog Sledding Experience", + "description": "Immerse yourself in Alaska's rich sled dog culture with an exhilarating dog sledding tour. Feel the rush as a team of huskies pulls you across the snowy landscape, offering a unique and unforgettable way to explore the Alaskan wilderness.", + "locationName": "Various locations throughout Alaska", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "alaska", + "ref": "dog-sledding-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_dog-sledding-experience.jpg" + }, + { + "name": "Hiking in Denali National Park", + "description": "Lace up your hiking boots and embark on a scenic trek through Denali National Park, home to North America's highest peak. Explore diverse trails, surrounded by breathtaking mountain vistas, glaciers, and abundant wildlife.", + "locationName": "Denali National Park", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "alaska", + "ref": "hiking-in-denali-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_hiking-in-denali-national-park.jpg" + }, + { + "name": "Visit the Alaska Native Heritage Center", + "description": "Immerse yourself in the rich culture and traditions of Alaska's indigenous people at the Alaska Native Heritage Center. Explore exhibits, watch traditional dances, and learn about the history and way of life of Alaska's native communities.", + "locationName": "Anchorage", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "alaska", + "ref": "visit-the-alaska-native-heritage-center", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_visit-the-alaska-native-heritage-center.jpg" + }, + { + "name": "Northern Lights Viewing", + "description": "Witness the mesmerizing spectacle of the Aurora Borealis dancing across the night sky. Venture outside Fairbanks or Anchorage during the winter months for the best views, and be captivated by the vibrant hues of green, purple, and pink.", + "locationName": "Fairbanks or Anchorage", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "alaska", + "ref": "northern-lights-viewing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_northern-lights-viewing.jpg" + }, + { + "name": "Kenai Fjords National Park Cruise", + "description": "Embark on a scenic cruise through the stunning Kenai Fjords National Park. Marvel at towering glaciers, rugged coastlines, and abundant marine life, including whales, seals, and puffins.", + "locationName": "Kenai Fjords National Park", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "alaska", + "ref": "kenai-fjords-national-park-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_kenai-fjords-national-park-cruise.jpg" + }, + { + "name": "Flightseeing over Denali", + "description": "Soar above North America's highest peak, Denali, on a breathtaking flightseeing tour. Enjoy panoramic views of the snow-capped mountains, glaciers, and vast wilderness below, offering a unique perspective of the Alaskan landscape.", + "locationName": "Denali National Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "alaska", + "ref": "flightseeing-over-denali", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_flightseeing-over-denali.jpg" + }, + { + "name": "Gold Panning in Fairbanks", + "description": "Step back in time and experience the thrill of the Alaskan Gold Rush. Visit a gold panning site in Fairbanks and try your luck at finding precious nuggets, learning about the region's rich mining history.", + "locationName": "Fairbanks", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "alaska", + "ref": "gold-panning-in-fairbanks", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_gold-panning-in-fairbanks.jpg" + }, + { + "name": "Fishing for Salmon", + "description": "Cast your line into Alaska's pristine rivers and lakes for an unforgettable fishing experience. Whether you're a seasoned angler or a beginner, enjoy the thrill of catching wild salmon amidst the stunning natural beauty.", + "locationName": "Kenai River, Russian River, or Kasilof River", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "alaska", + "ref": "fishing-for-salmon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_fishing-for-salmon.jpg" + }, + { + "name": "Kayaking in the Kenai Fjords National Park", + "description": "Paddle through the pristine waters of Kenai Fjords National Park, surrounded by towering glaciers, dramatic cliffs, and abundant marine life. Witness harbor seals basking on icebergs, sea otters playing in kelp forests, and perhaps even catch a glimpse of whales breaching the surface. This unforgettable kayaking experience offers a unique perspective on Alaska's stunning coastal landscapes.", + "locationName": "Kenai Fjords National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "alaska", + "ref": "kayaking-in-the-kenai-fjords-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_kayaking-in-the-kenai-fjords-national-park.jpg" + }, + { + "name": "Visit the Alaska SeaLife Center", + "description": "Discover the wonders of Alaska's marine ecosystem at the Alaska SeaLife Center, a renowned research and rehabilitation facility. Get up close to fascinating creatures like puffins, octopus, sea lions, and harbor seals. Learn about ongoing conservation efforts and gain a deeper appreciation for the delicate balance of life in Alaska's oceans.", + "locationName": "Seward", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "alaska", + "ref": "visit-the-alaska-sealife-center", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_visit-the-alaska-sealife-center.jpg" + }, + { + "name": "Ride the White Pass & Yukon Route Railway", + "description": "Embark on a nostalgic journey aboard the historic White Pass & Yukon Route Railway, a narrow-gauge railroad that winds through breathtaking mountain scenery. Travel along the same tracks used during the Klondike Gold Rush and marvel at the engineering feats that made this railway possible. Enjoy panoramic views of glaciers, waterfalls, and historic mining towns.", + "locationName": "Skagway", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "alaska", + "ref": "ride-the-white-pass-yukon-route-railway", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_ride-the-white-pass-yukon-route-railway.jpg" + }, + { + "name": "Explore the Mendenhall Glacier", + "description": "Witness the awe-inspiring beauty of the Mendenhall Glacier, a massive ice formation just outside of Juneau. Hike to the glacier's edge, explore ice caves, or take a thrilling helicopter tour for a bird's-eye view. Learn about the glacier's formation, its impact on the surrounding ecosystem, and the effects of climate change.", + "locationName": "Juneau", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "alaska", + "ref": "explore-the-mendenhall-glacier", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_explore-the-mendenhall-glacier.jpg" + }, + { + "name": "Soak in Chena Hot Springs", + "description": "Relax and rejuvenate in the natural mineral waters of Chena Hot Springs, a geothermal oasis nestled in the Alaskan wilderness. Immerse yourself in the therapeutic pools, surrounded by snow-capped mountains and boreal forests. Enhance your experience with a spa treatment or explore the Aurora Ice Museum, a unique attraction carved entirely from ice.", + "locationName": "Fairbanks", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "alaska", + "ref": "soak-in-chena-hot-springs", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_soak-in-chena-hot-springs.jpg" + }, + { + "name": "Bear Viewing at Katmai National Park", + "description": "Embark on an unforgettable adventure to Katmai National Park, renowned as the \"bear viewing capital of the world.\" Witness majestic brown bears in their natural habitat as they fish for salmon in Brooks Falls. Observe their incredible power and agility up close, capturing breathtaking photos and creating lasting memories. This experience offers a unique opportunity to connect with Alaska's raw wilderness and its iconic wildlife.", + "locationName": "Katmai National Park", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "alaska", + "ref": "bear-viewing-at-katmai-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_bear-viewing-at-katmai-national-park.jpg" + }, + { + "name": "Whale Watching in Juneau", + "description": "Embark on a thrilling whale-watching excursion in the waters surrounding Juneau. Marvel at the awe-inspiring sight of humpback whales breaching and tail-slapping as they migrate through these nutrient-rich waters. Keep an eye out for other marine life such as orcas, seals, and porpoises, and enjoy the stunning coastal scenery of Southeast Alaska. This activity is perfect for nature enthusiasts and wildlife lovers of all ages.", + "locationName": "Juneau", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "alaska", + "ref": "whale-watching-in-juneau", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_whale-watching-in-juneau.jpg" + }, + { + "name": "Scenic Drive on the Seward Highway", + "description": "Embark on a breathtaking road trip along the Seward Highway, one of the most scenic routes in North America. Wind through towering mountains, alongside glaciers, and past sparkling turquoise lakes. Stop at viewpoints to capture panoramic vistas and explore charming coastal towns like Seward and Girdwood. This journey offers a perfect blend of stunning landscapes, wildlife encounters, and opportunities for outdoor adventures.", + "locationName": "Seward Highway", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "alaska", + "ref": "scenic-drive-on-the-seward-highway", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_scenic-drive-on-the-seward-highway.jpg" + }, + { + "name": "Visit the Anchorage Museum", + "description": "Immerse yourself in the rich history and culture of Alaska at the Anchorage Museum. Explore exhibits showcasing Alaska Native art, artifacts, and history, as well as contemporary art and science displays. Discover the stories of Alaska's people, its diverse ecosystems, and its unique place in the world. This museum offers a fascinating experience for visitors of all ages and interests.", + "locationName": "Anchorage", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "alaska", + "ref": "visit-the-anchorage-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_visit-the-anchorage-museum.jpg" + }, + { + "name": "Experience the Alaska Railroad", + "description": "Embark on a scenic journey through Alaska's wilderness aboard the historic Alaska Railroad. Choose from various routes that wind through mountains, forests, and along the coast, offering breathtaking views of glaciers, rivers, and wildlife. Relax in comfortable carriages and enjoy onboard dining while experiencing the beauty and vastness of Alaska's landscapes.", + "locationName": "Various routes throughout Alaska", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "alaska", + "ref": "experience-the-alaska-railroad", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/alaska_experience-the-alaska-railroad.jpg" + }, + { + "name": "Scenic Boat Tour", + "description": "Embark on a mesmerizing boat tour along the Amalfi Coast, taking in the stunning views of dramatic cliffs, hidden coves, and charming villages perched on the hillsides. Capture unforgettable photos and enjoy swimming in the crystal-clear turquoise waters.", + "locationName": "Amalfi Coast", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "amalfi-coast", + "ref": "scenic-boat-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_scenic-boat-tour.jpg" + }, + { + "name": "Path of the Gods Hike", + "description": "Challenge yourself with a hike along the legendary Path of the Gods, a scenic trail offering breathtaking panoramic views of the coastline, terraced vineyards, and charming villages. Immerse yourself in the beauty of nature and experience the thrill of adventure.", + "locationName": "Agerola to Positano", + "duration": 5, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 2, + "destinationRef": "amalfi-coast", + "ref": "path-of-the-gods-hike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_path-of-the-gods-hike.jpg" + }, + { + "name": "Positano Shopping Spree", + "description": "Wander through the charming streets of Positano, browsing through boutiques filled with colorful ceramics, handmade sandals, and stylish fashion. Discover unique souvenirs and indulge in the vibrant atmosphere of this picturesque town.", + "locationName": "Positano", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 4, + "destinationRef": "amalfi-coast", + "ref": "positano-shopping-spree", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_positano-shopping-spree.jpg" + }, + { + "name": "Romantic Dinner with a View", + "description": "Treat yourself to a romantic dinner at a restaurant with breathtaking views of the Amalfi Coast. Savor delicious Italian cuisine, sip on local wine, and enjoy the enchanting ambiance as the sun sets over the horizon.", + "locationName": "Ravello or Positano", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "amalfi-coast", + "ref": "romantic-dinner-with-a-view", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_romantic-dinner-with-a-view.jpg" + }, + { + "name": "Cooking Class and Wine Tasting", + "description": "Immerse yourself in Italian culture by participating in a cooking class. Learn how to prepare traditional dishes like fresh pasta and regional specialties, and pair your culinary creations with local wines for a delightful foodie experience.", + "locationName": "Local villages or towns", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "amalfi-coast", + "ref": "cooking-class-and-wine-tasting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_cooking-class-and-wine-tasting.jpg" + }, + { + "name": "Kayaking Adventure in the Grotta dello Smeraldo", + "description": "Embark on a mesmerizing kayaking journey to the Grotta dello Smeraldo, a hidden sea cave renowned for its emerald-green waters. Paddle through the crystal-clear waters, marvel at the unique rock formations, and discover the enchanting play of light within the cave. This unforgettable experience offers a different perspective of the Amalfi Coast's natural beauty.", + "locationName": "Grotta dello Smeraldo", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "amalfi-coast", + "ref": "kayaking-adventure-in-the-grotta-dello-smeraldo", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_kayaking-adventure-in-the-grotta-dello-smeraldo.jpg" + }, + { + "name": "Vespa Tour through the Hills", + "description": "Experience the thrill of zipping through the scenic hills of the Amalfi Coast on a classic Vespa scooter. Enjoy the freedom of the open road as you wind your way through charming villages, stopping at panoramic viewpoints to capture breathtaking vistas. This adventurous tour allows you to explore hidden gems and soak up the authentic Italian atmosphere.", + "locationName": "Amalfi Coast hills", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "amalfi-coast", + "ref": "vespa-tour-through-the-hills", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_vespa-tour-through-the-hills.jpg" + }, + { + "name": "Limoncello Tasting and Workshop", + "description": "Discover the secrets behind the iconic limoncello liqueur with a visit to a local limoncello producer. Learn about the traditional methods of production, from harvesting the lemons to the infusion process. Indulge in a tasting session of various limoncello flavors and even try your hand at creating your own unique blend.", + "locationName": "Local limoncello producer", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "amalfi-coast", + "ref": "limoncello-tasting-and-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_limoncello-tasting-and-workshop.jpg" + }, + { + "name": "Sunset Cruise with Swimming and Prosecco", + "description": "Set sail on a romantic sunset cruise along the Amalfi Coast. Admire the stunning coastline bathed in golden light, enjoy a refreshing swim in the turquoise waters, and sip on chilled Prosecco as you witness the breathtaking spectacle of the sun setting over the horizon. This magical experience is perfect for couples or anyone seeking a memorable evening.", + "locationName": "Amalfi Coast", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "amalfi-coast", + "ref": "sunset-cruise-with-swimming-and-prosecco", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_sunset-cruise-with-swimming-and-prosecco.jpg" + }, + { + "name": "Live Music at a Local Trattoria", + "description": "Immerse yourself in the vibrant atmosphere of a local trattoria and enjoy an evening of live music. Savor authentic Italian dishes while listening to talented musicians playing traditional and contemporary tunes. This experience offers a taste of the local culture and a chance to connect with the community.", + "locationName": "Local trattoria", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "amalfi-coast", + "ref": "live-music-at-a-local-trattoria", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_live-music-at-a-local-trattoria.jpg" + }, + { + "name": "Private Boat Trip to Capri", + "description": "Embark on a luxurious private boat trip to the stunning island of Capri. Explore the iconic Blue Grotto, swim in secluded coves, and admire the Faraglioni Rocks. Enjoy a delicious lunch onboard and soak up the Mediterranean sun.", + "locationName": "Capri", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "amalfi-coast", + "ref": "private-boat-trip-to-capri", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_private-boat-trip-to-capri.jpg" + }, + { + "name": "Hike the Sentiero degli Dei", + "description": "Challenge yourself with a hike along the Sentiero degli Dei, also known as the Path of the Gods. This scenic trail offers breathtaking panoramic views of the coastline, charming villages, and the Tyrrhenian Sea.", + "locationName": "Agerola to Nocelle", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 2, + "destinationRef": "amalfi-coast", + "ref": "hike-the-sentiero-degli-dei", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_hike-the-sentiero-degli-dei.jpg" + }, + { + "name": "Explore the Ruins of Pompeii", + "description": "Step back in time with a visit to the ancient ruins of Pompeii, a UNESCO World Heritage Site. Witness the remarkably preserved remains of this Roman city, frozen in time by the eruption of Mount Vesuvius in 79 AD.", + "locationName": "Pompeii", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "amalfi-coast", + "ref": "explore-the-ruins-of-pompeii", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_explore-the-ruins-of-pompeii.jpg" + }, + { + "name": "Relax at a Beach Club", + "description": "Indulge in a day of relaxation at one of the many exclusive beach clubs along the Amalfi Coast. Enjoy comfortable sunbeds, refreshing cocktails, and stunning views of the sea. Some beach clubs offer water sports activities and swimming pools.", + "locationName": "Various locations along the coast", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "amalfi-coast", + "ref": "relax-at-a-beach-club", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_relax-at-a-beach-club.jpg" + }, + { + "name": "Visit the Duomo di Amalfi", + "description": "Immerse yourself in the rich history and culture of Amalfi by visiting the Duomo di Amalfi. This magnificent cathedral boasts stunning architecture, intricate mosaics, and a peaceful cloister.", + "locationName": "Amalfi", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "amalfi-coast", + "ref": "visit-the-duomo-di-amalfi", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_visit-the-duomo-di-amalfi.jpg" + }, + { + "name": "Private Yacht Excursion to Hidden Coves and Grottoes", + "description": "Embark on a luxurious private yacht excursion to discover secluded coves and hidden grottoes along the Amalfi Coast. Dive into crystal-clear waters for a refreshing swim, snorkel amidst vibrant marine life, and enjoy a gourmet lunch on board while soaking in the breathtaking coastal views. This exclusive experience promises a day of unparalleled beauty and relaxation.", + "locationName": "Amalfi Coast", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "amalfi-coast", + "ref": "private-yacht-excursion-to-hidden-coves-and-grottoes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_private-yacht-excursion-to-hidden-coves-and-grottoes.jpg" + }, + { + "name": "Ceramic Workshop in Vietri sul Mare", + "description": "Immerse yourself in the artistic heritage of the Amalfi Coast with a ceramic workshop in the charming town of Vietri sul Mare. Learn the traditional techniques of hand-painting and pottery from local artisans, and create your own unique ceramic masterpiece to take home as a souvenir. This cultural experience offers a glimpse into the region's rich artistic traditions.", + "locationName": "Vietri sul Mare", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "amalfi-coast", + "ref": "ceramic-workshop-in-vietri-sul-mare", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_ceramic-workshop-in-vietri-sul-mare.jpg" + }, + { + "name": "Wine Tasting Tour in the Hills of Tramonti", + "description": "Escape the bustling coast and venture into the tranquil hills of Tramonti for a delightful wine tasting tour. Visit family-run vineyards, learn about the unique grape varieties grown in the region, and savor a selection of exquisite local wines paired with regional cheeses and cured meats. Enjoy panoramic views of the coastline and experience the authentic charm of rural life on the Amalfi Coast.", + "locationName": "Tramonti", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "amalfi-coast", + "ref": "wine-tasting-tour-in-the-hills-of-tramonti", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_wine-tasting-tour-in-the-hills-of-tramonti.jpg" + }, + { + "name": "Guided Hike to the Torre dello Ziro Watchtower", + "description": "Embark on a scenic guided hike to the historic Torre dello Ziro watchtower, perched high above the village of Amalfi. Enjoy panoramic views of the coastline and surrounding mountains as you learn about the tower's fascinating history and its role in defending the region from invaders. This moderately challenging hike rewards you with breathtaking vistas and a sense of accomplishment.", + "locationName": "Amalfi", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "amalfi-coast", + "ref": "guided-hike-to-the-torre-dello-ziro-watchtower", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_guided-hike-to-the-torre-dello-ziro-watchtower.jpg" + }, + { + "name": "Live Like a Local: Market Visit and Home-Cooked Meal", + "description": "Experience the authentic flavors of the Amalfi Coast with a market visit and home-cooked meal. Join a local host at a vibrant market to select fresh, seasonal ingredients, and then learn to prepare traditional dishes in their home kitchen. This immersive culinary experience offers a glimpse into the daily life and culinary traditions of the region.", + "locationName": "Local villages", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "amalfi-coast", + "ref": "live-like-a-local-market-visit-and-home-cooked-meal", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amalfi-coast_live-like-a-local-market-visit-and-home-cooked-meal.jpg" + }, + { + "name": "Amazon River Boat Tour", + "description": "Embark on a captivating journey down the mighty Amazon River, the lifeblood of the rainforest. Witness the vibrant ecosystem unfold before your eyes as you glide past lush vegetation, observe exotic wildlife like pink river dolphins and caimans, and encounter local communities along the riverbanks. Choose from various boat tour options, including day trips, overnight expeditions, or even multi-day cruises, to tailor your experience to your preferences.", + "locationName": "Amazon River", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "amazon-rainforest", + "ref": "amazon-river-boat-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_amazon-river-boat-tour.jpg" + }, + { + "name": "Jungle Trekking and Wildlife Spotting", + "description": "Venture deep into the heart of the Amazon rainforest on a guided jungle trek. Follow experienced local guides along winding trails, immersing yourself in the sights and sounds of the jungle. Learn about medicinal plants, spot elusive wildlife like monkeys, sloths, and colorful birds, and discover the secrets of this incredible ecosystem. Choose from various trek lengths and difficulty levels to match your fitness and adventurous spirit.", + "locationName": "Various jungle trails", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "amazon-rainforest", + "ref": "jungle-trekking-and-wildlife-spotting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_jungle-trekking-and-wildlife-spotting.jpg" + }, + { + "name": "Canopy Ziplining Adventure", + "description": "Experience the rainforest from a thrilling perspective with a canopy zipline adventure. Soar through the treetops on a network of ziplines, enjoying breathtaking views of the jungle canopy and the surrounding landscape. Feel the adrenaline rush as you glide from platform to platform, surrounded by the lush greenery and the sounds of nature. This exhilarating activity is perfect for adventure seekers and those looking for a unique way to explore the rainforest.", + "locationName": "Various zipline locations", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "amazon-rainforest", + "ref": "canopy-ziplining-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_canopy-ziplining-adventure.jpg" + }, + { + "name": "Indigenous Cultural Experience", + "description": "Immerse yourself in the rich cultural heritage of the Amazon's indigenous communities. Visit a local village and interact with the residents, learning about their traditional way of life, customs, and beliefs. Participate in cultural activities such as craft making, storytelling, or traditional dances. This enriching experience provides a unique opportunity to connect with the people who have called the Amazon home for centuries.", + "locationName": "Indigenous villages", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "amazon-rainforest", + "ref": "indigenous-cultural-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_indigenous-cultural-experience.jpg" + }, + { + "name": "Nighttime Wildlife Safari", + "description": "Embark on a thrilling nighttime safari to discover the nocturnal creatures of the Amazon rainforest. Accompanied by experienced guides, venture into the jungle after dark, using spotlights to search for elusive animals such as caimans, snakes, owls, and other nocturnal species. Learn about their unique adaptations and behaviors while experiencing the magic of the rainforest at night.", + "locationName": "Jungle trails", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "amazon-rainforest", + "ref": "nighttime-wildlife-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_nighttime-wildlife-safari.jpg" + }, + { + "name": "Piranha Fishing Excursion", + "description": "Embark on a thrilling fishing expedition in the Amazon River tributaries, where you'll try your hand at catching the infamous piranhas. Learn local fishing techniques and experience the excitement of reeling in these feisty fish. Knowledgeable guides will share insights about the piranhas' role in the ecosystem and their fascinating behaviors.", + "locationName": "Amazon River tributaries", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "amazon-rainforest", + "ref": "piranha-fishing-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_piranha-fishing-excursion.jpg" + }, + { + "name": "Medicinal Plants and Traditional Healing Workshop", + "description": "Delve into the rich world of traditional Amazonian medicine with a guided workshop led by indigenous healers. Discover the healing properties of native plants, learn about their uses in traditional remedies, and participate in hands-on activities like preparing herbal teas and natural ointments. Gain insights into the cultural significance of these practices and their connection to the rainforest ecosystem.", + "locationName": "Indigenous community", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "amazon-rainforest", + "ref": "medicinal-plants-and-traditional-healing-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_medicinal-plants-and-traditional-healing-workshop.jpg" + }, + { + "name": "Kayaking through Amazonian Waterways", + "description": "Paddle through the tranquil waterways of the Amazon in a kayak, immersing yourself in the sights and sounds of the rainforest. Explore hidden creeks, observe diverse wildlife from a unique perspective, and enjoy the serenity of the surrounding nature. This peaceful adventure allows you to connect with the Amazon's ecosystem at your own pace.", + "locationName": "Amazon River tributaries and flooded forests", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "amazon-rainforest", + "ref": "kayaking-through-amazonian-waterways", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_kayaking-through-amazonian-waterways.jpg" + }, + { + "name": "Birdwatching in the Rainforest Canopy", + "description": "Rise early to experience the symphony of birdsong in the Amazon rainforest canopy. Accompanied by expert birdwatching guides, embark on a hike or boat trip to prime birdwatching locations. Observe vibrant macaws, toucans, hummingbirds, and numerous other species in their natural habitat. Learn about their unique characteristics, calls, and the crucial role they play in the ecosystem.", + "locationName": "Various locations within the rainforest", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "amazon-rainforest", + "ref": "birdwatching-in-the-rainforest-canopy", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_birdwatching-in-the-rainforest-canopy.jpg" + }, + { + "name": "Sunset Cruise on the Amazon River", + "description": "Embark on a magical sunset cruise along the Amazon River, soaking in the breathtaking views as the sky transforms into a canvas of vibrant colors. Enjoy the tranquil atmosphere, observe wildlife along the riverbanks, and capture stunning photographs of the unforgettable scenery. This relaxing experience provides a perfect end to a day of exploration.", + "locationName": "Amazon River", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "amazon-rainforest", + "ref": "sunset-cruise-on-the-amazon-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_sunset-cruise-on-the-amazon-river.jpg" + }, + { + "name": "Amazon River Dolphin Watching", + "description": "Embark on a magical journey to witness the playful pink river dolphins in their natural habitat. Cruise along the Amazon River tributaries, keeping an eye out for these intelligent and friendly creatures. Learn about their unique characteristics and conservation efforts while enjoying the stunning scenery of the rainforest.", + "locationName": "Amazon River tributaries", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "amazon-rainforest", + "ref": "amazon-river-dolphin-watching", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_amazon-river-dolphin-watching.jpg" + }, + { + "name": "Stargazing in the Amazon Night", + "description": "Escape the city lights and immerse yourself in the breathtaking night sky of the Amazon. Join a guided stargazing experience, where you'll learn about constellations, planets, and the Milky Way. With minimal light pollution, the Amazon offers an unforgettable opportunity to witness the celestial wonders of the Southern Hemisphere.", + "locationName": "Amazon Rainforest lodges with open clearings", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "amazon-rainforest", + "ref": "stargazing-in-the-amazon-night", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_stargazing-in-the-amazon-night.jpg" + }, + { + "name": "Amazonian Cooking Class", + "description": "Delve into the culinary traditions of the Amazon with a hands-on cooking class. Learn to prepare authentic dishes using fresh, local ingredients, such as exotic fruits, vegetables, and fish. Discover the unique flavors and techniques of Amazonian cuisine while enjoying a cultural and gastronomic adventure.", + "locationName": "Local communities or lodges", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "amazon-rainforest", + "ref": "amazonian-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_amazonian-cooking-class.jpg" + }, + { + "name": "Survival Skills Workshop", + "description": "Test your wilderness skills and learn essential survival techniques from experienced guides. Discover how to build shelters, identify edible plants, purify water, and navigate through the dense rainforest. This immersive experience will connect you with the raw beauty of the Amazon and equip you with valuable knowledge.", + "locationName": "Remote jungle locations", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "amazon-rainforest", + "ref": "survival-skills-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_survival-skills-workshop.jpg" + }, + { + "name": "Visit a Sustainable Eco-lodge", + "description": "Experience the Amazon responsibly by staying at a sustainable eco-lodge. These lodges prioritize environmental conservation and community development. Enjoy comfortable accommodations, learn about eco-friendly practices, and support local initiatives while immersing yourself in the rainforest's wonders.", + "locationName": "Various locations throughout the Amazon", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "amazon-rainforest", + "ref": "visit-a-sustainable-eco-lodge", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_visit-a-sustainable-eco-lodge.jpg" + }, + { + "name": "Caving Exploration in Gruta do Janelão", + "description": "Embark on a thrilling journey into the depths of Gruta do Janelão, one of the largest cave systems in Brazil. Marvel at the stunning geological formations, including stalactites, stalagmites, and underground rivers, and learn about the unique cave ecosystem. Experienced guides will lead you through the caverns, ensuring a safe and unforgettable adventure.", + "locationName": "Gruta do Janelão, Presidente Figueiredo", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "amazon-rainforest", + "ref": "caving-exploration-in-gruta-do-janel-o", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_caving-exploration-in-gruta-do-janel-o.jpg" + }, + { + "name": "Anavilhanas Archipelago Exploration", + "description": "Discover the Anavilhanas Archipelago, the world's largest freshwater archipelago, comprised of over 400 islands. Explore the flooded forests by boat, kayak, or canoe, and encounter diverse wildlife, including pink river dolphins, monkeys, sloths, and a variety of birds. Hike on some of the islands, swim in the clear waters, and experience the unique ecosystem of this natural wonder.", + "locationName": "Anavilhanas National Park", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "amazon-rainforest", + "ref": "anavilhanas-archipelago-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_anavilhanas-archipelago-exploration.jpg" + }, + { + "name": "Amazonian Fruit Farm Tour and Tasting", + "description": "Indulge your taste buds in the exotic flavors of the Amazon on a fruit farm tour. Explore a local farm, learn about the cultivation of various Amazonian fruits, and sample a wide variety of fresh and delicious fruits, including acai, cupuaçu, guaraná, and many more. Discover the unique flavors and cultural significance of these fruits in the Amazonian way of life.", + "locationName": "Local fruit farms near Manaus or other Amazonian cities", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "amazon-rainforest", + "ref": "amazonian-fruit-farm-tour-and-tasting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_amazonian-fruit-farm-tour-and-tasting.jpg" + }, + { + "name": "Amazon Photography Expedition", + "description": "Capture the stunning beauty of the Amazon rainforest on a photography expedition. Join a professional photographer and guide as you explore diverse ecosystems, from the dense jungle to the riverbanks and flooded forests. Learn about wildlife photography techniques and capture breathtaking images of exotic animals, vibrant flora, and the unique landscapes of the Amazon.", + "locationName": "Various locations within the Amazon rainforest", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "amazon-rainforest", + "ref": "amazon-photography-expedition", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/amazon-rainforest_amazon-photography-expedition.jpg" + }, + { + "name": "Trek to Machu Picchu", + "description": "Embark on an unforgettable journey through the ancient Inca Trail, culminating in a breathtaking arrival at the legendary Machu Picchu. Hike through stunning mountain scenery, explore Inca ruins along the way, and witness the sunrise over the iconic lost city.", + "locationName": "Machu Picchu, Peru", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "andes-mountains", + "ref": "trek-to-machu-picchu", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_trek-to-machu-picchu.jpg" + }, + { + "name": "Explore the Salt Flats of Salar de Uyuni", + "description": "Witness the surreal beauty of the world's largest salt flats, Salar de Uyuni in Bolivia. Take a jeep tour across the vast expanse of salt, capture mind-bending perspective photos, and visit unique islands dotted with cacti.", + "locationName": "Salar de Uyuni, Bolivia", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "andes-mountains", + "ref": "explore-the-salt-flats-of-salar-de-uyuni", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_explore-the-salt-flats-of-salar-de-uyuni.jpg" + }, + { + "name": "Visit the Glaciers of Patagonia", + "description": "Venture into the southern reaches of the Andes to discover the awe-inspiring glaciers of Patagonia. Take a boat tour to witness towering icebergs calving into turquoise lakes, go trekking on a glacier, or embark on a kayaking adventure.", + "locationName": "Patagonia, Argentina/Chile", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "andes-mountains", + "ref": "visit-the-glaciers-of-patagonia", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_visit-the-glaciers-of-patagonia.jpg" + }, + { + "name": "Skiing in the Andes", + "description": "Hit the slopes at world-class ski resorts nestled within the Andes Mountains. Experience thrilling downhill runs, enjoy après-ski activities, and soak in the breathtaking mountain vistas.", + "locationName": "Various ski resorts in Chile and Argentina", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "andes-mountains", + "ref": "skiing-in-the-andes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_skiing-in-the-andes.jpg" + }, + { + "name": "Cultural Encounters with Indigenous Communities", + "description": "Immerse yourself in the rich cultural heritage of the Andes by visiting indigenous communities. Learn about their traditions, crafts, and way of life, and gain a deeper appreciation for the region's history and people.", + "locationName": "Various locations throughout the Andes", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "andes-mountains", + "ref": "cultural-encounters-with-indigenous-communities", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_cultural-encounters-with-indigenous-communities.jpg" + }, + { + "name": "White Water Rafting on the Rio Apurimac", + "description": "Embark on an exhilarating white water rafting adventure on the Rio Apurimac, one of the headwaters of the Amazon River. Navigate through stunning canyons, experience the thrill of rapids, and enjoy the breathtaking scenery of the Andes Mountains.", + "locationName": "Rio Apurimac, Peru", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "andes-mountains", + "ref": "white-water-rafting-on-the-rio-apurimac", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_white-water-rafting-on-the-rio-apurimac.jpg" + }, + { + "name": "Horseback Riding in the Andean Highlands", + "description": "Explore the Andean highlands on horseback, traversing scenic trails with panoramic views of snow-capped peaks, verdant valleys, and traditional villages. Connect with nature and experience the local way of life at a relaxed pace.", + "locationName": "Andean Highlands, Ecuador", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "andes-mountains", + "ref": "horseback-riding-in-the-andean-highlands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_horseback-riding-in-the-andean-highlands.jpg" + }, + { + "name": "Stargazing in the Atacama Desert", + "description": "Venture into the Atacama Desert, one of the driest places on Earth, for an unforgettable stargazing experience. Marvel at the clarity of the night sky, observe constellations, and learn about the celestial wonders with expert guides.", + "locationName": "Atacama Desert, Chile", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "andes-mountains", + "ref": "stargazing-in-the-atacama-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_stargazing-in-the-atacama-desert.jpg" + }, + { + "name": "Mountain Biking in the Sacred Valley", + "description": "Challenge yourself with a thrilling mountain biking adventure in the Sacred Valley of Peru. Pedal through ancient Inca trails, past picturesque villages, and alongside agricultural terraces, enjoying breathtaking views of the surrounding mountains.", + "locationName": "Sacred Valley, Peru", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "andes-mountains", + "ref": "mountain-biking-in-the-sacred-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_mountain-biking-in-the-sacred-valley.jpg" + }, + { + "name": "Birdwatching in the Cloud Forests", + "description": "Immerse yourself in the biodiversity of the Andean cloud forests, home to a wide variety of bird species. Join a guided birdwatching tour and spot colorful hummingbirds, tanagers, toucans, and other fascinating avian creatures.", + "locationName": "Cloud Forests, Ecuador", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "andes-mountains", + "ref": "birdwatching-in-the-cloud-forests", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_birdwatching-in-the-cloud-forests.jpg" + }, + { + "name": "Rock Climbing in the Cordillera Blanca", + "description": "Challenge yourself with thrilling rock climbing experiences in the Cordillera Blanca, a stunning range within the Andes known for its towering granite peaks and glaciers. Whether you're a beginner or an experienced climber, there are routes for all levels, offering breathtaking views and a sense of accomplishment.", + "locationName": "Cordillera Blanca, Peru", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "andes-mountains", + "ref": "rock-climbing-in-the-cordillera-blanca", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_rock-climbing-in-the-cordillera-blanca.jpg" + }, + { + "name": "Caving in the Marble Caves", + "description": "Embark on a unique adventure exploring the Marble Caves, a series of sculpted caverns formed by waves crashing against calcium carbonate. Take a boat tour through the mesmerizing turquoise waters and marvel at the intricate patterns and formations carved into the rock over millennia.", + "locationName": "General Carrera Lake, Chile", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "andes-mountains", + "ref": "caving-in-the-marble-caves", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_caving-in-the-marble-caves.jpg" + }, + { + "name": "Soak in Natural Hot Springs", + "description": "Relax and rejuvenate in the numerous natural hot springs scattered throughout the Andes. Immerse yourself in the warm, mineral-rich waters surrounded by stunning mountain scenery. Many hot springs offer additional spa treatments and wellness activities for a truly pampering experience.", + "locationName": "Various locations throughout the Andes", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "andes-mountains", + "ref": "soak-in-natural-hot-springs", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_soak-in-natural-hot-springs.jpg" + }, + { + "name": "Wine Tasting in Mendoza", + "description": "Indulge in the world-renowned wines of Mendoza, Argentina, nestled at the foothills of the Andes. Visit local vineyards, tour the cellars, and savor a variety of Malbecs and other varietals while enjoying the picturesque landscapes and charming atmosphere.", + "locationName": "Mendoza, Argentina", + "duration": 6, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "andes-mountains", + "ref": "wine-tasting-in-mendoza", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_wine-tasting-in-mendoza.jpg" + }, + { + "name": "Paragliding over the Sacred Valley", + "description": "Experience the thrill of paragliding over the breathtaking Sacred Valley of the Incas in Peru. Soar through the air and enjoy panoramic views of ancient ruins, verdant fields, and snow-capped mountains. This unforgettable adventure offers a unique perspective on the region's beauty.", + "locationName": "Sacred Valley, Peru", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "andes-mountains", + "ref": "paragliding-over-the-sacred-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_paragliding-over-the-sacred-valley.jpg" + }, + { + "name": "Scenic Train Journey Through the Andes", + "description": "Embark on a breathtaking train journey through the heart of the Andes, winding past snow-capped peaks, dramatic valleys, and charming Andean villages. Enjoy panoramic views from comfortable carriages, with options for luxury experiences or budget-friendly travel. This is a perfect way to appreciate the vastness and beauty of the Andes without strenuous physical activity.", + "locationName": "Various routes throughout the Andes", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "andes-mountains", + "ref": "scenic-train-journey-through-the-andes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_scenic-train-journey-through-the-andes.jpg" + }, + { + "name": "Zip-lining in the Cloud Forest", + "description": "Experience the thrill of soaring through the lush canopy of the cloud forest on a zip-lining adventure. Enjoy breathtaking views of the surrounding mountains and valleys as you glide from platform to platform, surrounded by diverse flora and fauna. This exhilarating activity is perfect for adventure seekers and nature enthusiasts.", + "locationName": "Cloud forests in Ecuador, Peru, or Colombia", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "andes-mountains", + "ref": "zip-lining-in-the-cloud-forest", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_zip-lining-in-the-cloud-forest.jpg" + }, + { + "name": "Exploring Colonial Towns and Cities", + "description": "Step back in time and immerse yourself in the rich history and culture of the Andes by exploring charming colonial towns and cities. Visit Cusco, the ancient Inca capital, or Quito, with its well-preserved colonial center. Discover architectural gems, vibrant markets, and museums showcasing the region's fascinating past.", + "locationName": "Cusco, Quito, and other colonial towns", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "andes-mountains", + "ref": "exploring-colonial-towns-and-cities", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_exploring-colonial-towns-and-cities.jpg" + }, + { + "name": "Indulge in Andean Gastronomy", + "description": "Embark on a culinary journey through the Andes, savoring the unique flavors and dishes of the region. Try traditional delicacies like ceviche, empanadas, and lomo saltado. Explore local markets for fresh produce and spices, or participate in a cooking class to learn the secrets of Andean cuisine.", + "locationName": "Restaurants and markets throughout the Andes", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "andes-mountains", + "ref": "indulge-in-andean-gastronomy", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_indulge-in-andean-gastronomy.jpg" + }, + { + "name": "Relaxing at Thermal Baths", + "description": "Unwind and rejuvenate in the natural thermal baths scattered throughout the Andes. Immerse yourself in the soothing mineral-rich waters, surrounded by stunning mountain scenery. Many locations offer spa treatments and wellness programs for a complete relaxation experience.", + "locationName": "Various locations in the Andes, including Banos in Ecuador and Aguas Calientes in Peru", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "andes-mountains", + "ref": "relaxing-at-thermal-baths", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/andes-mountains_relaxing-at-thermal-baths.jpg" + }, + { + "name": "Sunrise at Angkor Wat", + "description": "Witness the breathtaking spectacle of sunrise over the iconic Angkor Wat temple. Arrive early to secure a prime spot near the reflecting pool and capture unforgettable photos as the sun bathes the temple in golden light.", + "locationName": "Angkor Wat", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "angkor-wat", + "ref": "sunrise-at-angkor-wat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_sunrise-at-angkor-wat.jpg" + }, + { + "name": "Explore Angkor Thom", + "description": "Embark on a journey through the ancient walled city of Angkor Thom, home to magnificent temples such as Bayon, with its enigmatic smiling faces, and the Terrace of the Elephants. Discover hidden passages, marvel at intricate carvings, and delve into the history of the Khmer Empire.", + "locationName": "Angkor Thom", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "angkor-wat", + "ref": "explore-angkor-thom", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_explore-angkor-thom.jpg" + }, + { + "name": "Ta Prohm Temple and the Jungle's Embrace", + "description": "Venture into the atmospheric Ta Prohm temple, where ancient ruins are intertwined with massive tree roots. Explore the mystical atmosphere of this iconic location, featured in the film 'Tomb Raider', and imagine the power of nature reclaiming the land.", + "locationName": "Ta Prohm", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "angkor-wat", + "ref": "ta-prohm-temple-and-the-jungle-s-embrace", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_ta-prohm-temple-and-the-jungle-s-embrace.jpg" + }, + { + "name": "Angkor National Museum", + "description": "Delve deeper into the history and culture of the Khmer Empire at the Angkor National Museum. Explore exhibits showcasing artifacts, sculptures, and ancient relics, providing insights into the fascinating stories behind Angkor's temples.", + "locationName": "Angkor National Museum", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "angkor-wat", + "ref": "angkor-national-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_angkor-national-museum.jpg" + }, + { + "name": "Cambodian Cooking Class", + "description": "Immerse yourself in Cambodian culinary traditions with a hands-on cooking class. Learn to prepare authentic dishes like fish amok and Khmer curry, using fresh local ingredients and traditional techniques. Savor the flavors of your creations and gain a deeper appreciation for Cambodian cuisine.", + "locationName": "Various locations in Siem Reap", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "angkor-wat", + "ref": "cambodian-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_cambodian-cooking-class.jpg" + }, + { + "name": "Banteay Srei Temple Excursion", + "description": "Embark on a journey to the enchanting Banteay Srei, known as the 'Citadel of Women.' Marvel at its intricate pink sandstone carvings and delicate details, often considered the finest example of Khmer art. Explore the temple's unique history and feminine symbolism, surrounded by a serene jungle setting.", + "locationName": "Banteay Srei Temple", + "duration": 2.5, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "angkor-wat", + "ref": "banteay-srei-temple-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_banteay-srei-temple-excursion.jpg" + }, + { + "name": "Quad Bike Adventure through the Countryside", + "description": "Experience the thrill of an off-road adventure on a quad bike tour through the picturesque Cambodian countryside. Traverse dirt paths, rice paddies, and local villages, immersing yourself in the rural landscapes and daily life beyond the temples. This exciting excursion offers a unique perspective of the region and its natural beauty.", + "locationName": "Angkor Wat Surrounding Countryside", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 4, + "destinationRef": "angkor-wat", + "ref": "quad-bike-adventure-through-the-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_quad-bike-adventure-through-the-countryside.jpg" + }, + { + "name": "Sunset Cruise on Tonle Sap Lake", + "description": "Set sail on a tranquil sunset cruise across the vast Tonle Sap Lake, the largest freshwater lake in Southeast Asia. Witness breathtaking views as the sky transforms with vibrant colors, reflecting on the water. Observe the unique floating villages and witness the daily life of local communities who call the lake home.", + "locationName": "Tonle Sap Lake", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "angkor-wat", + "ref": "sunset-cruise-on-tonle-sap-lake", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_sunset-cruise-on-tonle-sap-lake.jpg" + }, + { + "name": "Apsara Dance Performance with Dinner", + "description": "Immerse yourself in Cambodian culture with a mesmerizing Apsara dance performance. Enjoy a traditional buffet dinner while witnessing the graceful movements and elaborate costumes of the dancers, depicting ancient myths and legends. This captivating experience offers a glimpse into the rich artistic heritage of Cambodia.", + "locationName": "Various restaurants and cultural venues in Siem Reap", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 4, + "destinationRef": "angkor-wat", + "ref": "apsara-dance-performance-with-dinner", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_apsara-dance-performance-with-dinner.jpg" + }, + { + "name": "Phare Circus Show: A Cambodian Spectacle", + "description": "Experience the magic of Phare Circus, a captivating performance that combines acrobatics, theater, music, and storytelling. Witness the incredible talents of young Cambodian artists as they share their stories and cultural heritage through this unique and inspiring show.", + "locationName": "Phare Circus, Siem Reap", + "duration": 1.5, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "angkor-wat", + "ref": "phare-circus-show-a-cambodian-spectacle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_phare-circus-show-a-cambodian-spectacle.jpg" + }, + { + "name": "Explore the Floating Villages of Kampong Phluk", + "description": "Embark on a captivating boat journey to Kampong Phluk, a unique floating village on Tonle Sap Lake. Witness the stilted houses, vibrant local life, and flooded forests, experiencing the daily rhythms of this fascinating community. Interact with villagers, learn about their fishing traditions, and savor a delicious meal at a floating restaurant.", + "locationName": "Kampong Phluk", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "angkor-wat", + "ref": "explore-the-floating-villages-of-kampong-phluk", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_explore-the-floating-villages-of-kampong-phluk.jpg" + }, + { + "name": "Biking Through the Cambodian Countryside", + "description": "Escape the bustling city and embark on a scenic bike tour through the picturesque Cambodian countryside. Pedal along quiet paths, passing by lush rice paddies, traditional villages, and ancient temples. Immerse yourself in the rural landscapes, interact with friendly locals, and discover hidden gems off the beaten path. This active adventure allows you to experience the authentic charm of Cambodia.", + "locationName": "Cambodian Countryside", + "duration": 5, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "angkor-wat", + "ref": "biking-through-the-cambodian-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_biking-through-the-cambodian-countryside.jpg" + }, + { + "name": "Indulge in a Traditional Khmer Massage", + "description": "Treat yourself to a rejuvenating Khmer massage, a centuries-old practice known for its therapeutic benefits. Skilled therapists use gentle stretching, acupressure, and aromatic oils to relieve tension, improve circulation, and restore balance. Choose from a variety of massage styles and durations, and let the expert hands transport you to a state of deep relaxation.", + "locationName": "Various spas and wellness centers", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "angkor-wat", + "ref": "indulge-in-a-traditional-khmer-massage", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_indulge-in-a-traditional-khmer-massage.jpg" + }, + { + "name": "Phnom Kulen National Park: Waterfall and 1000 Lingas", + "description": "Embark on a day trip to Phnom Kulen National Park, a sacred mountain with stunning natural landscapes. Hike to the Kulen Waterfall, take a refreshing dip in the cool waters, and marvel at the intricate carvings of the 1000 Lingas on the riverbed. Discover hidden temples, enjoy panoramic views, and immerse yourself in the spiritual atmosphere of this natural sanctuary.", + "locationName": "Phnom Kulen National Park", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "angkor-wat", + "ref": "phnom-kulen-national-park-waterfall-and-1000-lingas", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_phnom-kulen-national-park-waterfall-and-1000-lingas.jpg" + }, + { + "name": "Pub Street: Nightlife and Culinary Delights", + "description": "As the sun sets, head to Pub Street, the vibrant heart of Siem Reap's nightlife. Explore the lively bars, restaurants, and shops, and soak up the energetic atmosphere. Sample delicious street food, enjoy live music performances, and mingle with fellow travelers. From local beers to international cocktails, Pub Street offers a diverse range of options to suit every taste.", + "locationName": "Pub Street", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "angkor-wat", + "ref": "pub-street-nightlife-and-culinary-delights", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_pub-street-nightlife-and-culinary-delights.jpg" + }, + { + "name": "Kbal Spean: The River of a Thousand Lingas", + "description": "Embark on a jungle trek to Kbal Spean, an archaeological site known as the \"River of a Thousand Lingas.\" Discover intricate carvings of Hindu deities and symbols etched into the riverbed and waterfalls, offering a unique blend of nature and cultural heritage.", + "locationName": "Kbal Spean", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "angkor-wat", + "ref": "kbal-spean-the-river-of-a-thousand-lingas", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_kbal-spean-the-river-of-a-thousand-lingas.jpg" + }, + { + "name": "Beng Mealea: The Lost Temple", + "description": "Venture off the beaten path to Beng Mealea, a sprawling temple complex enveloped by the jungle. Explore its mysterious ruins, climb over moss-covered stones, and experience the thrill of discovery in this Indiana Jones-esque adventure.", + "locationName": "Beng Mealea", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "angkor-wat", + "ref": "beng-mealea-the-lost-temple", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_beng-mealea-the-lost-temple.jpg" + }, + { + "name": "Koh Ker: The Ancient Khmer Capital", + "description": "Take a day trip to Koh Ker, a remote archaeological site that once served as the capital of the Khmer Empire. Explore the impressive Prasat Thom pyramid temple, wander through the ruins of ancient palaces, and witness the remnants of a bygone era.", + "locationName": "Koh Ker", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "angkor-wat", + "ref": "koh-ker-the-ancient-khmer-capital", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_koh-ker-the-ancient-khmer-capital.jpg" + }, + { + "name": "Hot Air Balloon Ride over Angkor Wat", + "description": "Soar above the temples of Angkor in a hot air balloon and witness the breathtaking sunrise or sunset views. Capture panoramic vistas of the sprawling complex, the surrounding countryside, and the distant Kulen Mountains.", + "locationName": "Angkor Archaeological Park", + "duration": 1.5, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "angkor-wat", + "ref": "hot-air-balloon-ride-over-angkor-wat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_hot-air-balloon-ride-over-angkor-wat.jpg" + }, + { + "name": "Siem Reap Art & Culture", + "description": "Immerse yourself in the vibrant art and culture scene of Siem Reap. Visit the Angkor National Museum to delve deeper into Khmer history, explore local art galleries showcasing contemporary Cambodian artists, and attend a traditional Apsara dance performance.", + "locationName": "Siem Reap", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "angkor-wat", + "ref": "siem-reap-art-culture", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/angkor-wat_siem-reap-art-culture.jpg" + }, + { + "name": "Guided Tour of Upper Antelope Canyon", + "description": "Embark on a mesmerizing journey through the Upper Antelope Canyon with a Navajo guide. Witness the interplay of light and shadow as sunlight filters through the narrow sandstone walls, creating breathtaking photographic opportunities. Learn about the canyon's formation, Navajo culture, and the significance of this sacred site.", + "locationName": "Upper Antelope Canyon", + "duration": 1.5, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "antelope-canyon", + "ref": "guided-tour-of-upper-antelope-canyon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_guided-tour-of-upper-antelope-canyon.jpg" + }, + { + "name": "Photography Tour of Lower Antelope Canyon", + "description": "Capture the ethereal beauty of Lower Antelope Canyon on a specialized photography tour. Accompanied by a professional photographer and Navajo guide, learn advanced techniques for photographing slot canyons and make the most of the unique lighting conditions. This tour is perfect for photography enthusiasts seeking to create stunning images.", + "locationName": "Lower Antelope Canyon", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "antelope-canyon", + "ref": "photography-tour-of-lower-antelope-canyon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_photography-tour-of-lower-antelope-canyon.jpg" + }, + { + "name": "Scenic Drive on Highway 98", + "description": "Embark on a scenic drive along Highway 98, which winds through the Navajo Nation and offers stunning views of the surrounding landscape. Stop at viewpoints to admire the vast desert vistas, towering mesas, and distant rock formations. This drive is a great way to experience the natural beauty of the region at your own pace.", + "locationName": "Highway 98", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "antelope-canyon", + "ref": "scenic-drive-on-highway-98", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_scenic-drive-on-highway-98.jpg" + }, + { + "name": "Visit Horseshoe Bend", + "description": "Take a short hike to Horseshoe Bend, a dramatic incised meander of the Colorado River. Marvel at the sheer cliffs and the emerald-green water flowing below. Capture panoramic photos of this iconic landmark and enjoy the breathtaking views of the surrounding landscape.", + "locationName": "Horseshoe Bend", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "antelope-canyon", + "ref": "visit-horseshoe-bend", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_visit-horseshoe-bend.jpg" + }, + { + "name": "Explore the Navajo Nation", + "description": "Immerse yourself in the rich culture and history of the Navajo Nation. Visit the Navajo Nation Museum to learn about their traditions, art, and way of life. Explore local trading posts to find authentic Navajo crafts, jewelry, and artwork. Consider attending a traditional Navajo ceremony or cultural event for a deeper understanding of their heritage.", + "locationName": "Navajo Nation", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "antelope-canyon", + "ref": "explore-the-navajo-nation", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_explore-the-navajo-nation.jpg" + }, + { + "name": "Stargazing in the Desert", + "description": "Experience the magic of the desert night sky with a stargazing tour. Away from city lights, Antelope Canyon offers breathtaking views of the Milky Way and constellations. Learn about Navajo astronomy and storytelling while marveling at the celestial wonders.", + "locationName": "Antelope Canyon or surrounding desert areas", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "antelope-canyon", + "ref": "stargazing-in-the-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_stargazing-in-the-desert.jpg" + }, + { + "name": "Rafting on the Colorado River", + "description": "Embark on a thrilling rafting adventure on the Colorado River, near Antelope Canyon. Navigate through scenic canyons and rapids, enjoying the stunning desert landscape from a unique perspective. Choose from various tour options depending on your desired level of intensity and duration.", + "locationName": "Colorado River", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "antelope-canyon", + "ref": "rafting-on-the-colorado-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_rafting-on-the-colorado-river.jpg" + }, + { + "name": "Glamping Under the Stars", + "description": "Indulge in a unique glamping experience near Antelope Canyon. Enjoy the comfort of a luxury tent or yurt while immersing yourself in the beauty of the desert landscape. Relax by the campfire, gaze at the starlit sky, and create unforgettable memories.", + "locationName": "Glamping sites near Antelope Canyon", + "duration": 12, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "antelope-canyon", + "ref": "glamping-under-the-stars", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_glamping-under-the-stars.jpg" + }, + { + "name": "Hiking in Horseshoe Bend", + "description": "Embark on a scenic hike to Horseshoe Bend, a horseshoe-shaped incised meander of the Colorado River. Witness breathtaking panoramic views of the canyon and capture stunning photographs. This moderate hike offers a rewarding experience for nature enthusiasts.", + "locationName": "Horseshoe Bend", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "antelope-canyon", + "ref": "hiking-in-horseshoe-bend", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_hiking-in-horseshoe-bend.jpg" + }, + { + "name": "Exploring the Navajo Nation", + "description": "Immerse yourself in the rich culture and heritage of the Navajo Nation. Visit local artisans, experience traditional ceremonies, and learn about their history, traditions, and deep connection to the land. Respectful cultural tourism supports the Navajo community and provides a unique learning experience.", + "locationName": "Navajo Nation", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "antelope-canyon", + "ref": "exploring-the-navajo-nation", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_exploring-the-navajo-nation.jpg" + }, + { + "name": "Mountain Biking Adventure", + "description": "Embark on an exhilarating mountain biking journey through the rugged terrain surrounding Antelope Canyon. Explore scenic trails that wind through canyons, mesas, and desert landscapes, offering breathtaking views and a thrilling off-road experience.", + "locationName": "Navajo Nation Lands", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "antelope-canyon", + "ref": "mountain-biking-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_mountain-biking-adventure.jpg" + }, + { + "name": "Cultural Immersion at the Navajo Village", + "description": "Immerse yourself in the rich culture and traditions of the Navajo Nation by visiting a nearby Navajo village. Engage with local artisans, learn about their history and way of life, and witness traditional demonstrations of weaving, jewelry making, and storytelling.", + "locationName": "Navajo Village", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "antelope-canyon", + "ref": "cultural-immersion-at-the-navajo-village", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_cultural-immersion-at-the-navajo-village.jpg" + }, + { + "name": "Jeep Tour to Secret Canyon", + "description": "Venture beyond the well-trodden paths and discover the hidden gem of Secret Canyon. Embark on a thrilling jeep tour that takes you through rugged backcountry, revealing a secluded slot canyon adorned with stunning rock formations and unique light displays.", + "locationName": "Secret Canyon", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "antelope-canyon", + "ref": "jeep-tour-to-secret-canyon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_jeep-tour-to-secret-canyon.jpg" + }, + { + "name": "Sunset Photography at Horseshoe Bend", + "description": "Capture the mesmerizing beauty of Horseshoe Bend at sunset with a photography tour led by a professional photographer. Learn advanced techniques for capturing the perfect shot as the golden light paints the landscape, creating a breathtaking spectacle.", + "locationName": "Horseshoe Bend", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "antelope-canyon", + "ref": "sunset-photography-at-horseshoe-bend", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_sunset-photography-at-horseshoe-bend.jpg" + }, + { + "name": "Stargazing and Astronomy Session", + "description": "Experience the magic of the desert night sky with a stargazing and astronomy session. Join a knowledgeable guide who will unveil the wonders of the cosmos, pointing out constellations, planets, and celestial phenomena, all under the blanket of a star-studded sky.", + "locationName": "Desert Surroundings", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "antelope-canyon", + "ref": "stargazing-and-astronomy-session", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_stargazing-and-astronomy-session.jpg" + }, + { + "name": "Helicopter Tour over Antelope Canyon", + "description": "Soar above the breathtaking landscapes of Antelope Canyon on an exhilarating helicopter tour. Witness the canyon's intricate formations, the vast desert expanse, and the meandering Colorado River from a unique aerial perspective. Capture panoramic photos and create unforgettable memories.", + "locationName": "Antelope Canyon and surrounding area", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "antelope-canyon", + "ref": "helicopter-tour-over-antelope-canyon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_helicopter-tour-over-antelope-canyon.jpg" + }, + { + "name": "Visit Glen Canyon Dam and Lake Powell", + "description": "Embark on a scenic drive to Glen Canyon Dam, a marvel of engineering, and explore the picturesque Lake Powell. Take a boat tour on the lake's crystal-clear waters, surrounded by towering red rock cliffs. Enjoy swimming, fishing, or simply relaxing by the lakeshore.", + "locationName": "Glen Canyon Dam and Lake Powell", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "antelope-canyon", + "ref": "visit-glen-canyon-dam-and-lake-powell", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_visit-glen-canyon-dam-and-lake-powell.jpg" + }, + { + "name": "Explore the Vermillion Cliffs National Monument", + "description": "Discover the rugged beauty of the Vermillion Cliffs National Monument, a sprawling landscape of towering cliffs, canyons, and desert plains. Hike through scenic trails, go wildlife watching, and marvel at the unique geological formations. Keep an eye out for California condors soaring through the sky.", + "locationName": "Vermillion Cliffs National Monument", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "antelope-canyon", + "ref": "explore-the-vermillion-cliffs-national-monument", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_explore-the-vermillion-cliffs-national-monument.jpg" + }, + { + "name": "Experience Navajo Culture at a Traditional Hogan", + "description": "Immerse yourself in the rich culture of the Navajo people by visiting a traditional hogan. Learn about their history, traditions, and way of life from local guides. Participate in activities such as weaving demonstrations, storytelling sessions, and traditional food tastings.", + "locationName": "Navajo Nation", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "antelope-canyon", + "ref": "experience-navajo-culture-at-a-traditional-hogan", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_experience-navajo-culture-at-a-traditional-hogan.jpg" + }, + { + "name": "Off-Roading Adventure in the Desert", + "description": "Get your adrenaline pumping with an off-roading adventure through the rugged desert terrain. Ride in a 4x4 vehicle and explore hidden canyons, sand dunes, and scenic viewpoints. This thrilling experience offers a unique way to discover the beauty of the desert landscape.", + "locationName": "Desert surrounding Antelope Canyon", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "antelope-canyon", + "ref": "off-roading-adventure-in-the-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/antelope-canyon_off-roading-adventure-in-the-desert.jpg" + }, + { + "name": "Scuba Diving Adventure", + "description": "Embark on an underwater exploration of Aruba's vibrant marine life and captivating shipwrecks. Dive into crystal-clear turquoise waters and discover a world of colorful coral reefs, tropical fish, and fascinating underwater landscapes. Experienced divers can explore the depths of the Antilla shipwreck, while beginners can enjoy shallower reefs teeming with marine life.", + "locationName": "Various dive sites around the island", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "aruba", + "ref": "scuba-diving-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_scuba-diving-adventure.jpg" + }, + { + "name": "Beach Bliss at Eagle Beach", + "description": "Relax and soak up the sun on the pristine white sands of Eagle Beach, renowned for its calm turquoise waters and breathtaking sunsets. Rent a beach umbrella and lounge chair, take a refreshing dip in the ocean, or simply unwind with a good book while enjoying the gentle sea breeze.", + "locationName": "Eagle Beach", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "aruba", + "ref": "beach-bliss-at-eagle-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_beach-bliss-at-eagle-beach.jpg" + }, + { + "name": "Island Exploration Tour", + "description": "Embark on a thrilling off-road adventure to discover Aruba's hidden gems. Explore the rugged terrain of Arikok National Park, visit the Natural Pool, and marvel at the dramatic coastline with its crashing waves and natural bridges. This tour offers a unique perspective of Aruba's diverse landscapes.", + "locationName": "Arikok National Park and other island landmarks", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "aruba", + "ref": "island-exploration-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_island-exploration-tour.jpg" + }, + { + "name": "Sunset Sail with Cocktails", + "description": "Set sail on a romantic catamaran cruise and witness the breathtaking beauty of an Aruban sunset. Sip on tropical cocktails, enjoy the gentle sea breeze, and marvel at the vibrant colors painting the sky as the sun dips below the horizon. This experience is perfect for couples or anyone seeking a memorable evening.", + "locationName": "Departs from various locations on the island", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 3, + "destinationRef": "aruba", + "ref": "sunset-sail-with-cocktails", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_sunset-sail-with-cocktails.jpg" + }, + { + "name": "Oranjestad Cultural Exploration", + "description": "Immerse yourself in the vibrant culture of Aruba's capital city, Oranjestad. Explore the colorful Dutch colonial architecture, visit historical landmarks like Fort Zoutman, and browse the shops and art galleries for unique souvenirs. Enjoy the lively atmosphere of the local markets and indulge in delicious Caribbean cuisine.", + "locationName": "Oranjestad", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "aruba", + "ref": "oranjestad-cultural-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_oranjestad-cultural-exploration.jpg" + }, + { + "name": "Arikok National Park Adventure", + "description": "Embark on a thrilling off-road adventure through Arikok National Park, covering nearly 20% of the island. Discover hidden gems like the Natural Pool, Quadirikiri Caves, and Dos Playa. Witness stunning landscapes, diverse flora and fauna, and historical sites, making it a perfect blend of nature, culture, and adventure.", + "locationName": "Arikok National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "aruba", + "ref": "arikok-national-park-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_arikok-national-park-adventure.jpg" + }, + { + "name": "Windsurfing and Kitesurfing at Fisherman's Huts", + "description": "Experience the thrill of riding the waves at Fisherman's Huts, a renowned spot for windsurfing and kitesurfing. Whether you're a beginner or a seasoned pro, the consistent trade winds and calm waters provide the perfect conditions for an exhilarating adventure on the water. Lessons and rentals are available for all levels.", + "locationName": "Fisherman's Huts", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "aruba", + "ref": "windsurfing-and-kitesurfing-at-fisherman-s-huts", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_windsurfing-and-kitesurfing-at-fisherman-s-huts.jpg" + }, + { + "name": "Foodie Delights at San Nicolas", + "description": "Embark on a culinary journey through the vibrant streets of San Nicolas, known for its artistic charm and diverse food scene. Explore local restaurants and food trucks, savoring authentic Aruban dishes like Keshi Yena and Pastechi. Don't miss the chance to indulge in fresh seafood and Caribbean-inspired cuisine, a treat for your taste buds.", + "locationName": "San Nicolas", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "aruba", + "ref": "foodie-delights-at-san-nicolas", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_foodie-delights-at-san-nicolas.jpg" + }, + { + "name": "Stargazing in the Arid Landscape", + "description": "Escape the city lights and venture into the Arikok National Park or the California Lighthouse area for an unforgettable stargazing experience. With minimal light pollution, Aruba offers breathtaking views of the night sky. Join a guided tour or find a secluded spot to marvel at the constellations and the Milky Way, a truly magical and romantic experience.", + "locationName": "Arikok National Park or California Lighthouse area", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "aruba", + "ref": "stargazing-in-the-arid-landscape", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_stargazing-in-the-arid-landscape.jpg" + }, + { + "name": "Sunset Horseback Riding on the Beach", + "description": "Create unforgettable memories with a romantic horseback ride along the pristine shores of Aruba. As the sun begins its descent, enjoy the breathtaking views of the Caribbean Sea and the colorful sky. This tranquil experience is perfect for couples or anyone seeking a peaceful connection with nature and the island's beauty.", + "locationName": "Beaches of Aruba", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 3, + "destinationRef": "aruba", + "ref": "sunset-horseback-riding-on-the-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_sunset-horseback-riding-on-the-beach.jpg" + }, + { + "name": "Kayaking the Mangrove Lagoons", + "description": "Embark on a serene kayaking adventure through the lush mangrove lagoons of Mangel Halto or Spanish Lagoon. Paddle through tranquil waters, observe the unique ecosystem, and spot colorful fish and birds. This eco-friendly activity is perfect for nature enthusiasts and offers a peaceful escape from the bustling beaches.", + "locationName": "Mangel Halto or Spanish Lagoon", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "aruba", + "ref": "kayaking-the-mangrove-lagoons", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_kayaking-the-mangrove-lagoons.jpg" + }, + { + "name": "Off-Roading through Arikok National Park", + "description": "Get your adrenaline pumping with an exhilarating off-roading tour through the rugged landscapes of Arikok National Park. Explore hidden caves, natural pools, and dramatic coastlines, while learning about the island's unique geology and history. This adventurous activity is perfect for thrill-seekers and nature lovers.", + "locationName": "Arikok National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "aruba", + "ref": "off-roading-through-arikok-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_off-roading-through-arikok-national-park.jpg" + }, + { + "name": "California Lighthouse Climb and Sunset Views", + "description": "Ascend the historic California Lighthouse for breathtaking panoramic views of the island. Witness the stunning coastline, turquoise waters, and the vibrant capital of Oranjestad. Time your visit for sunset to capture magical golden hues and create unforgettable memories.", + "locationName": "California Lighthouse", + "duration": 1, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "aruba", + "ref": "california-lighthouse-climb-and-sunset-views", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_california-lighthouse-climb-and-sunset-views.jpg" + }, + { + "name": "Local Flavors Food Tour", + "description": "Embark on a culinary journey and tantalize your taste buds with a local flavors food tour. Discover hidden gems and authentic eateries, savoring traditional Aruban dishes like Keshi Yena, Pastechi, and fresh seafood. This immersive experience is perfect for foodies and cultural explorers.", + "locationName": "Various locations in Oranjestad or San Nicolas", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "aruba", + "ref": "local-flavors-food-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_local-flavors-food-tour.jpg" + }, + { + "name": "Relaxing Spa Day and Wellness Retreat", + "description": "Escape the stresses of everyday life and indulge in a rejuvenating spa day or wellness retreat. Pamper yourself with soothing massages, revitalizing body treatments, and peaceful yoga sessions. Aruba offers a variety of luxurious spas and wellness centers where you can unwind and recharge.", + "locationName": "Various spas and wellness centers throughout the island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "aruba", + "ref": "relaxing-spa-day-and-wellness-retreat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_relaxing-spa-day-and-wellness-retreat.jpg" + }, + { + "name": "Snorkeling at Mangel Halto Reef", + "description": "Explore the vibrant underwater world of Mangel Halto Reef, a secluded haven renowned for its calm, shallow waters and abundant marine life. Swim among colorful fish, graceful sea turtles, and intricate coral formations. This accessible reef is perfect for families and snorkelers of all levels.", + "locationName": "Mangel Halto Reef", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "aruba", + "ref": "snorkeling-at-mangel-halto-reef", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_snorkeling-at-mangel-halto-reef.jpg" + }, + { + "name": "Alto Vista Chapel and Noord Coast Hike", + "description": "Embark on a scenic hike along Aruba's rugged northern coast. Start at the historic Alto Vista Chapel, a peaceful landmark with panoramic ocean views. Follow the trail as it winds past dramatic cliffs, hidden coves, and natural bridges, offering breathtaking vistas at every turn. This moderate hike is perfect for nature enthusiasts and photographers.", + "locationName": "Alto Vista Chapel and Noord Coast", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "aruba", + "ref": "alto-vista-chapel-and-noord-coast-hike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_alto-vista-chapel-and-noord-coast-hike.jpg" + }, + { + "name": "Sunset Catamaran Cruise with Dinner", + "description": "Set sail on a romantic catamaran cruise as the sun dips below the horizon. Enjoy breathtaking views of the coastline, sip on refreshing cocktails, and savor a delicious dinner prepared on board. Dance the night away under the stars as you create unforgettable memories with your loved one.", + "locationName": "Aruba's coastline", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "aruba", + "ref": "sunset-catamaran-cruise-with-dinner", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_sunset-catamaran-cruise-with-dinner.jpg" + }, + { + "name": "Aruba Aloe Factory and Museum Tour", + "description": "Discover the secrets of Aruba's aloe vera industry with a visit to the Aruba Aloe Factory and Museum. Learn about the history of aloe cultivation on the island, witness the production process, and explore the museum's exhibits to understand the plant's medicinal properties. Don't forget to shop for aloe-infused products to take home a piece of Aruba's natural wellness.", + "locationName": "Aruba Aloe Factory and Museum", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "aruba", + "ref": "aruba-aloe-factory-and-museum-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_aruba-aloe-factory-and-museum-tour.jpg" + }, + { + "name": "Casibari Rock Formations Exploration", + "description": "Embark on a unique adventure to the Casibari Rock Formations, a collection of giant boulders with mysterious origins. Climb to the top for panoramic views of the island, explore hidden caves and tunnels, and discover ancient pictographs left by the island's indigenous people. This natural wonder offers a glimpse into Aruba's geological past and provides a fun and educational experience for all ages.", + "locationName": "Casibari Rock Formations", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "aruba", + "ref": "casibari-rock-formations-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/aruba_casibari-rock-formations-exploration.jpg" + }, + { + "name": "Explore the Biltmore Estate", + "description": "Step back in time at the Biltmore Estate, the largest privately-owned house in the United States. Explore the opulent rooms, stroll through the manicured gardens, and learn about the Vanderbilt family's legacy. You can also enjoy wine tasting at the Biltmore Winery or indulge in a farm-to-table meal at one of the estate's restaurants.", + "locationName": "Biltmore Estate", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "asheville", + "ref": "explore-the-biltmore-estate", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_explore-the-biltmore-estate.jpg" + }, + { + "name": "Hike to Breathtaking Waterfalls", + "description": "Embark on a scenic hike to one of the many stunning waterfalls surrounding Asheville. Popular choices include Looking Glass Falls, Catawba Falls, and Rainbow Falls. Immerse yourself in the beauty of the Blue Ridge Mountains and enjoy a refreshing dip in the cool mountain waters.", + "locationName": "Blue Ridge Mountains", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "asheville", + "ref": "hike-to-breathtaking-waterfalls", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_hike-to-breathtaking-waterfalls.jpg" + }, + { + "name": "Discover Asheville's Craft Beer Scene", + "description": "Asheville is renowned for its thriving craft beer scene. Embark on a brewery hopping adventure and sample a wide variety of local brews. Take a guided tour to learn about the brewing process, or simply relax and enjoy a flight of beers at one of the many taprooms.", + "locationName": "Downtown Asheville and River Arts District", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 2, + "destinationRef": "asheville", + "ref": "discover-asheville-s-craft-beer-scene", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_discover-asheville-s-craft-beer-scene.jpg" + }, + { + "name": "Immerse Yourself in Art and Culture", + "description": "Explore Asheville's vibrant arts scene. Visit the River Arts District, where you can browse through galleries and studios showcasing the works of local artists. Catch a live performance at the Asheville Community Theatre or the Diana Wortham Theatre. Don't miss the Asheville Art Museum, featuring a diverse collection of American art.", + "locationName": "River Arts District and Downtown Asheville", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "asheville", + "ref": "immerse-yourself-in-art-and-culture", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_immerse-yourself-in-art-and-culture.jpg" + }, + { + "name": "Indulge in Farm-to-Table Delights", + "description": "Experience Asheville's thriving culinary scene. The city is known for its farm-to-table restaurants, offering fresh and locally sourced ingredients. Savor delicious dishes at renowned establishments like Curate, Rhubarb, or Posana. Explore the Asheville City Market for local produce, artisanal goods, and food trucks.", + "locationName": "Downtown Asheville and surrounding areas", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "asheville", + "ref": "indulge-in-farm-to-table-delights", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_indulge-in-farm-to-table-delights.jpg" + }, + { + "name": "Whitewater Rafting on the French Broad River", + "description": "Experience the thrill of navigating the rapids of the French Broad River, surrounded by stunning mountain scenery. Several local outfitters offer guided whitewater rafting trips for all skill levels, from gentle family floats to adrenaline-pumping adventures.", + "locationName": "French Broad River", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "asheville", + "ref": "whitewater-rafting-on-the-french-broad-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_whitewater-rafting-on-the-french-broad-river.jpg" + }, + { + "name": "Scenic Drive on the Blue Ridge Parkway", + "description": "Embark on a breathtaking journey along the Blue Ridge Parkway, renowned for its panoramic views of the Appalachian Mountains. Stop at overlooks, hiking trails, and charming towns along the way, immersing yourself in the natural beauty of the region.", + "locationName": "Blue Ridge Parkway", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "asheville", + "ref": "scenic-drive-on-the-blue-ridge-parkway", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_scenic-drive-on-the-blue-ridge-parkway.jpg" + }, + { + "name": "Explore the River Arts District", + "description": "Wander through the vibrant River Arts District, home to a diverse community of artists and studios. Discover unique galleries, witness artists at work, and find one-of-a-kind pieces to take home as a souvenir of your trip.", + "locationName": "River Arts District", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "asheville", + "ref": "explore-the-river-arts-district", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_explore-the-river-arts-district.jpg" + }, + { + "name": "Visit the Asheville Botanical Gardens", + "description": "Escape the hustle and bustle of the city at the Asheville Botanical Gardens, a tranquil oasis showcasing the native flora of the Southern Appalachians. Stroll through themed gardens, admire colorful blooms, and learn about the region's unique plant life.", + "locationName": "Asheville Botanical Gardens", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "asheville", + "ref": "visit-the-asheville-botanical-gardens", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_visit-the-asheville-botanical-gardens.jpg" + }, + { + "name": "Catch a Live Music Performance", + "description": "Experience Asheville's thriving music scene by attending a live performance at one of the city's many venues. From intimate jazz clubs to outdoor amphitheaters, there's something for every musical taste, offering a taste of the local culture and talent.", + "locationName": "Various venues throughout Asheville", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "asheville", + "ref": "catch-a-live-music-performance", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_catch-a-live-music-performance.jpg" + }, + { + "name": "Zipline Through the Forest Canopy", + "description": "Experience the thrill of soaring through the treetops on a zipline adventure. Several companies around Asheville offer exhilarating courses with varying levels of difficulty, allowing you to choose the perfect experience for your adrenaline level. Enjoy breathtaking views of the mountains and forests as you zip from platform to platform.", + "locationName": "Various locations around Asheville", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "asheville", + "ref": "zipline-through-the-forest-canopy", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_zipline-through-the-forest-canopy.jpg" + }, + { + "name": "Visit the WNC Nature Center", + "description": "Get up close and personal with the diverse wildlife of the Southern Appalachians at the Western North Carolina Nature Center. This family-friendly attraction houses animals native to the region, including black bears, red wolves, otters, and birds of prey. Learn about conservation efforts and the importance of protecting these fascinating creatures.", + "locationName": "Western North Carolina Nature Center", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "asheville", + "ref": "visit-the-wnc-nature-center", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_visit-the-wnc-nature-center.jpg" + }, + { + "name": "Explore the Grove Arcade", + "description": "Step back in time and wander through the historic Grove Arcade, a beautifully restored 1920s shopping center. Admire the stunning architecture, browse unique boutiques and art galleries, and enjoy a delicious meal at one of the many restaurants.", + "locationName": "Grove Arcade", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "asheville", + "ref": "explore-the-grove-arcade", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_explore-the-grove-arcade.jpg" + }, + { + "name": "Take a Ghost Tour", + "description": "Discover the spooky side of Asheville with a spine-tingling ghost tour. Learn about the city's haunted history as you visit historic sites and hear tales of paranormal activity. Several companies offer a variety of tours, from family-friendly options to more intense experiences for thrill-seekers.", + "locationName": "Various locations in downtown Asheville", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "asheville", + "ref": "take-a-ghost-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_take-a-ghost-tour.jpg" + }, + { + "name": "Enjoy a Relaxing Spa Day", + "description": "Unwind and rejuvenate with a luxurious spa day at one of Asheville's many wellness retreats. Indulge in a massage, facial, or body treatment, and let the stresses of everyday life melt away. Several spas offer packages that include access to saunas, steam rooms, and other amenities.", + "locationName": "Various spas and wellness centers throughout Asheville", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "asheville", + "ref": "enjoy-a-relaxing-spa-day", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_enjoy-a-relaxing-spa-day.jpg" + }, + { + "name": "Go Mountain Biking on World-Class Trails", + "description": "Experience the thrill of mountain biking on some of the best trails in the East Coast. From beginner-friendly paths to challenging single-tracks, Asheville offers a variety of options for all skill levels. Rent a bike or join a guided tour to explore the scenic beauty of the Blue Ridge Mountains.", + "locationName": "Bent Creek Experimental Forest, Tsali Recreation Area", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "asheville", + "ref": "go-mountain-biking-on-world-class-trails", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_go-mountain-biking-on-world-class-trails.jpg" + }, + { + "name": "Take a Hot Air Balloon Ride at Sunrise", + "description": "Soar above the stunning landscapes of Asheville in a hot air balloon and witness the breathtaking colors of sunrise over the Blue Ridge Mountains. Enjoy a peaceful and unforgettable experience as you float gently through the sky.", + "locationName": "Asheville Hot Air Balloons", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "asheville", + "ref": "take-a-hot-air-balloon-ride-at-sunrise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_take-a-hot-air-balloon-ride-at-sunrise.jpg" + }, + { + "name": "Visit the Folk Art Center", + "description": "Discover the rich traditions of Appalachian craft and folk art at the Folk Art Center. Explore a diverse collection of handmade crafts, including pottery, textiles, woodcarvings, and more. You can also watch demonstrations, attend workshops, and find unique souvenirs.", + "locationName": "Folk Art Center", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "asheville", + "ref": "visit-the-folk-art-center", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_visit-the-folk-art-center.jpg" + }, + { + "name": "Embark on a Culinary Adventure", + "description": "Indulge in Asheville's thriving culinary scene with a food tour or cooking class. Explore the city's diverse restaurants, from farm-to-table bistros to ethnic eateries. Learn about the local food culture and savor delicious dishes made with fresh, seasonal ingredients.", + "locationName": "Asheville Food Tours, The Asheville Kitchen", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 3, + "destinationRef": "asheville", + "ref": "embark-on-a-culinary-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_embark-on-a-culinary-adventure.jpg" + }, + { + "name": "Go Stargazing in the Mountains", + "description": "Escape the city lights and experience the magic of stargazing in the pristine night sky of the Blue Ridge Mountains. Join a guided astronomy tour or find a secluded spot to marvel at the constellations and celestial wonders.", + "locationName": "Blue Ridge Observatory, Mount Mitchell State Park", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "asheville", + "ref": "go-stargazing-in-the-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/asheville_go-stargazing-in-the-mountains.jpg" + }, + { + "name": "Hike to the Crater Lakes of Sete Cidades", + "description": "Embark on a scenic hike to the iconic Sete Cidades Massif, home to twin crater lakes - one green, one blue. Witness breathtaking panoramic views of the volcanic caldera and surrounding landscapes. The trail offers varying difficulty levels, catering to both casual walkers and experienced hikers.", + "locationName": "Sete Cidades", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "azores", + "ref": "hike-to-the-crater-lakes-of-sete-cidades", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_hike-to-the-crater-lakes-of-sete-cidades.jpg" + }, + { + "name": "Whale and Dolphin Watching Excursion", + "description": "Set sail on an unforgettable boat tour to witness the majestic marine life of the Azores. Encounter various whale species, playful dolphins, and other fascinating creatures in their natural habitat. Knowledgeable guides provide insights into the region's rich biodiversity.", + "locationName": "Various locations", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "azores", + "ref": "whale-and-dolphin-watching-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_whale-and-dolphin-watching-excursion.jpg" + }, + { + "name": "Explore the Historic City of Angra do Heroísmo", + "description": "Wander through the charming streets of Angra do Heroísmo, a UNESCO World Heritage Site. Admire the colorful colonial architecture, visit historic forts and churches, and soak up the vibrant atmosphere of this cultural hub. Discover local shops, cafes, and restaurants offering Azorean specialties.", + "locationName": "Angra do Heroísmo", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "azores", + "ref": "explore-the-historic-city-of-angra-do-hero-smo", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_explore-the-historic-city-of-angra-do-hero-smo.jpg" + }, + { + "name": "Relax in the Terra Nostra Park and Thermal Baths", + "description": "Immerse yourself in the lush beauty of Terra Nostra Park, renowned for its diverse botanical collection and serene ambiance. Take a dip in the iron-rich thermal waters of the park's historic pool, known for their therapeutic properties. Enjoy the tranquility of nature and unwind in this idyllic setting.", + "locationName": "Furnas", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "azores", + "ref": "relax-in-the-terra-nostra-park-and-thermal-baths", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_relax-in-the-terra-nostra-park-and-thermal-baths.jpg" + }, + { + "name": "Canyoning Adventure in Ribeira dos Caldeirões", + "description": "Experience an adrenaline-pumping canyoning adventure in the stunning Ribeira dos Caldeirões Natural Park. Descend cascading waterfalls, rappel down rocky cliffs, and swim through crystal-clear pools. This thrilling activity is perfect for adventure seekers and nature enthusiasts.", + "locationName": "Ribeira dos Caldeirões Natural Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "azores", + "ref": "canyoning-adventure-in-ribeira-dos-caldeir-es", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_canyoning-adventure-in-ribeira-dos-caldeir-es.jpg" + }, + { + "name": "Go spelunking in the Algar do Carvão lava cave", + "description": "Embark on an underground adventure by exploring the Algar do Carvão, a unique lava cave formed thousands of years ago. Descend into the depths of the earth and marvel at the geological formations, including stalactites, stalagmites, and a crystal-clear lake.", + "locationName": "Terceira Island", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "azores", + "ref": "go-spelunking-in-the-algar-do-carv-o-lava-cave", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_go-spelunking-in-the-algar-do-carv-o-lava-cave.jpg" + }, + { + "name": "Take a boat tour to Vila Franca do Campo Islet", + "description": "Escape to a picturesque islet off the coast of São Miguel. Take a boat tour to Vila Franca do Campo Islet, a volcanic crater turned natural swimming pool. Relax on the small beach, swim in the turquoise waters, or go snorkeling to discover the vibrant marine life.", + "locationName": "São Miguel Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "azores", + "ref": "take-a-boat-tour-to-vila-franca-do-campo-islet", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_take-a-boat-tour-to-vila-franca-do-campo-islet.jpg" + }, + { + "name": "Savor the local flavors on a food tour", + "description": "Indulge in the Azores' unique gastronomy with a guided food tour. Sample regional specialties like cozido das Furnas (a stew cooked in volcanic steam), fresh seafood, and locally produced cheeses and wines. Discover the islands' culinary heritage and savor the authentic flavors.", + "locationName": "Various Islands", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "azores", + "ref": "savor-the-local-flavors-on-a-food-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_savor-the-local-flavors-on-a-food-tour.jpg" + }, + { + "name": "Go horseback riding through scenic landscapes", + "description": "Explore the Azores' stunning landscapes on horseback. Ride through rolling hills, lush forests, and alongside dramatic coastlines. Enjoy the tranquility of nature and experience the islands from a different perspective. This activity is suitable for all skill levels.", + "locationName": "Various Islands", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "azores", + "ref": "go-horseback-riding-through-scenic-landscapes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_go-horseback-riding-through-scenic-landscapes.jpg" + }, + { + "name": "Tee off at a world-class golf course", + "description": "Challenge yourself on one of the Azores' renowned golf courses. Enjoy breathtaking ocean views and lush green landscapes as you perfect your swing. Several islands offer championship-level courses designed by famous architects, providing an unforgettable golfing experience.", + "locationName": "São Miguel Island and Terceira Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "azores", + "ref": "tee-off-at-a-world-class-golf-course", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_tee-off-at-a-world-class-golf-course.jpg" + }, + { + "name": "Kayaking Along the Coast", + "description": "Embark on a serene kayaking adventure along the stunning Azorean coastline. Paddle through crystal-clear waters, explore hidden coves and sea caves, and witness the dramatic cliffs and volcanic formations from a unique perspective. Keep an eye out for playful dolphins and other marine life that call these waters home. This activity is suitable for various skill levels and offers a peaceful way to connect with nature.", + "locationName": "Various coastal locations", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "azores", + "ref": "kayaking-along-the-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_kayaking-along-the-coast.jpg" + }, + { + "name": "Birdwatching in the Azores", + "description": "The Azores are a paradise for birdwatchers, with a diverse range of endemic and migratory species. Join a guided tour or venture out on your own to spot unique birds like the Azores bullfinch, Monteiro's storm petrel, and the Cory's shearwater. Explore the islands' varied habitats, from lush forests to volcanic peaks, and witness the incredible avian diversity of this archipelago.", + "locationName": "Various locations across the islands", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "azores", + "ref": "birdwatching-in-the-azores", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_birdwatching-in-the-azores.jpg" + }, + { + "name": "Stargazing on a Volcanic Peak", + "description": "Escape the city lights and experience the magic of stargazing on one of the Azores' volcanic peaks. The remote location and minimal light pollution offer breathtaking views of the night sky. Join a guided astronomy tour or simply lay back and marvel at the constellations, planets, and the Milky Way stretching across the darkness.", + "locationName": "Mount Pico or other volcanic peaks", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "azores", + "ref": "stargazing-on-a-volcanic-peak", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_stargazing-on-a-volcanic-peak.jpg" + }, + { + "name": "Scuba Diving or Snorkeling in Underwater Volcanic Landscapes", + "description": "Dive into the underwater world of the Azores and discover a mesmerizing volcanic landscape beneath the waves. Explore unique rock formations, swim through underwater arches, and encounter a variety of marine life, including colorful fish, octopuses, and sea turtles. Whether you choose scuba diving or snorkeling, this experience offers an unforgettable glimpse into the archipelago's hidden depths.", + "locationName": "Various dive sites around the islands", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "azores", + "ref": "scuba-diving-or-snorkeling-in-underwater-volcanic-landscapes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_scuba-diving-or-snorkeling-in-underwater-volcanic-landscapes.jpg" + }, + { + "name": "Explore the Vineyards and Wineries", + "description": "Embark on a delightful journey through the Azores' unique wine culture. Visit local vineyards, learn about the distinctive grape varieties grown in the volcanic soil, and indulge in wine tastings at charming wineries. Discover the secrets behind the islands' renowned Verdelho wines and savor the flavors of this special terroir.", + "locationName": "Pico Island or other islands with vineyards", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "azores", + "ref": "explore-the-vineyards-and-wineries", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_explore-the-vineyards-and-wineries.jpg" + }, + { + "name": "Swim with Wild Dolphins", + "description": "Embark on an unforgettable adventure swimming alongside wild dolphins in their natural habitat. Experienced guides will lead you to the best spots for encountering these playful creatures, allowing you to witness their incredible agility and grace firsthand. This eco-friendly activity ensures responsible interaction with the dolphins, creating a truly magical and respectful experience.", + "locationName": "Atlantic Ocean surrounding the Azores", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "azores", + "ref": "swim-with-wild-dolphins", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_swim-with-wild-dolphins.jpg" + }, + { + "name": "Jeep Tour to Lagoa do Fogo", + "description": "Embark on a thrilling off-road adventure in a 4x4 jeep to reach the breathtaking Lagoa do Fogo, a stunning crater lake nestled within the Água de Pau Massif stratovolcano. Traverse rugged terrains and lush landscapes, enjoying panoramic views along the way. Once at the lake, take a refreshing dip in its crystal-clear waters or hike to a nearby viewpoint for breathtaking vistas of the surrounding volcanic caldera.", + "locationName": "Lagoa do Fogo", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "azores", + "ref": "jeep-tour-to-lagoa-do-fogo", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_jeep-tour-to-lagoa-do-fogo.jpg" + }, + { + "name": "Explore the Gruta do Natal", + "description": "Embark on a captivating journey through the Gruta do Natal, a lava cave formed thousands of years ago by volcanic activity. Discover a subterranean world adorned with unique rock formations, stalactites, and stalagmites as you delve into the depths of the Earth. Learn about the geological history and formation of the cave from knowledgeable guides, making this a fascinating and educational experience.", + "locationName": "Gruta do Natal", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "azores", + "ref": "explore-the-gruta-do-natal", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_explore-the-gruta-do-natal.jpg" + }, + { + "name": "Indulge in Azorean Gastronomy at a Local Restaurant", + "description": "Immerse yourself in the rich culinary traditions of the Azores by dining at a local restaurant. Savor the flavors of fresh seafood, locally sourced meats, and regional specialties like Cozido das Furnas, a stew slow-cooked in volcanic steam. Pair your meal with a glass of Azorean wine, known for its unique volcanic terroir, and enjoy the warm hospitality of the local people.", + "locationName": "Various restaurants throughout the Azores", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "azores", + "ref": "indulge-in-azorean-gastronomy-at-a-local-restaurant", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_indulge-in-azorean-gastronomy-at-a-local-restaurant.jpg" + }, + { + "name": "Take a Surfing Lesson", + "description": "Catch some waves and experience the thrill of surfing in the Atlantic Ocean. Whether you're a beginner or an experienced surfer, the Azores offers a variety of surf breaks suitable for all skill levels. Take a lesson from a qualified instructor who will guide you through the basics or help you refine your technique. Enjoy the exhilaration of riding the waves while surrounded by the stunning coastal scenery.", + "locationName": "Various beaches throughout the Azores", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "azores", + "ref": "take-a-surfing-lesson", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/azores_take-a-surfing-lesson.jpg" + }, + { + "name": "Sunrise Hike at Mount Batur", + "description": "Embark on an unforgettable adventure with an early morning trek up Mount Batur, an active volcano. Witness the breathtaking sunrise over the island, painting the sky with vibrant hues while enjoying panoramic views of the surrounding landscape. This challenging yet rewarding experience is perfect for adventure enthusiasts and nature lovers.", + "locationName": "Mount Batur", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "bali", + "ref": "sunrise-hike-at-mount-batur", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_sunrise-hike-at-mount-batur.jpg" + }, + { + "name": "Ubud Monkey Forest", + "description": "Immerse yourself in the lush greenery of the Ubud Monkey Forest, a sanctuary home to hundreds of playful monkeys. Observe these fascinating creatures in their natural habitat, swinging through the trees and interacting with visitors. Explore the ancient temples within the forest, adding a touch of cultural exploration to your wildlife encounter.", + "locationName": "Ubud Monkey Forest", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "bali", + "ref": "ubud-monkey-forest", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_ubud-monkey-forest.jpg" + }, + { + "name": "Tanah Lot Temple at Sunset", + "description": "Witness the iconic Tanah Lot Temple, perched on a rocky outcrop overlooking the ocean. Visit during the golden hours of sunset for a truly magical experience as the sky transforms into a canvas of warm colors, creating a mesmerizing backdrop for this sacred landmark.", + "locationName": "Tanah Lot Temple", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "bali", + "ref": "tanah-lot-temple-at-sunset", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_tanah-lot-temple-at-sunset.jpg" + }, + { + "name": "Traditional Balinese Cooking Class", + "description": "Delve into the rich culinary heritage of Bali by joining a traditional cooking class. Learn the secrets of preparing authentic Balinese dishes, from fragrant spices to fresh local ingredients. Master the art of creating flavorful classics like Nasi Goreng and Satay, and bring home newfound skills to impress your friends and family.", + "locationName": "Various locations in Ubud and other towns", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "bali", + "ref": "traditional-balinese-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_traditional-balinese-cooking-class.jpg" + }, + { + "name": "Relaxing Spa Day", + "description": "Indulge in a day of pampering and rejuvenation at one of Bali's many luxurious spas. Choose from a wide range of treatments, including traditional Balinese massages, body scrubs, and flower baths. Unwind amidst tranquil surroundings, allowing the expert therapists to melt away your stress and leave you feeling refreshed and revitalized.", + "locationName": "Various spas throughout Bali", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "bali", + "ref": "relaxing-spa-day", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_relaxing-spa-day.jpg" + }, + { + "name": "Tegallalang Rice Terraces", + "description": "Immerse yourself in the emerald landscapes of the Tegallalang Rice Terraces. Wander through the iconic, tiered rice paddies, capture stunning photos, and witness the traditional Subak irrigation system in action. Explore local craft shops and art stalls for unique souvenirs.", + "locationName": "Tegallalang", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "bali", + "ref": "tegallalang-rice-terraces", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_tegallalang-rice-terraces.jpg" + }, + { + "name": "Waterfall Adventure", + "description": "Embark on a refreshing journey to one of Bali's breathtaking waterfalls. Hike through lush rainforests, swim in natural pools beneath cascading falls, and enjoy the tranquility of nature. Popular choices include Sekumpul Waterfall, Gitgit Waterfall, and Tegenungan Waterfall.", + "locationName": "Various locations across Bali", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "bali", + "ref": "waterfall-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_waterfall-adventure.jpg" + }, + { + "name": "Uluwatu Cliffside Kecak Dance", + "description": "Witness the captivating Kecak dance performance at Uluwatu Temple. As the sun sets over the Indian Ocean, be mesmerized by the rhythmic chanting and intricate movements of the dancers, telling the story of the Ramayana against a dramatic clifftop backdrop.", + "locationName": "Uluwatu Temple", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "bali", + "ref": "uluwatu-cliffside-kecak-dance", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_uluwatu-cliffside-kecak-dance.jpg" + }, + { + "name": "Nusa Islands Day Trip", + "description": "Escape to the idyllic Nusa Islands, just a short boat ride away from mainland Bali. Explore the pristine beaches of Nusa Lembongan, Nusa Ceningan, and Nusa Penida. Go snorkeling or diving among vibrant coral reefs, relax on white sand shores, and discover hidden coves and dramatic cliffs.", + "locationName": "Nusa Islands", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "bali", + "ref": "nusa-islands-day-trip", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_nusa-islands-day-trip.jpg" + }, + { + "name": "Seminyak Shopping and Nightlife", + "description": "Indulge in a vibrant evening in Seminyak. Explore the trendy boutiques and designer stores for fashion, art, and homeware. Savor delicious cuisine at world-class restaurants and experience the lively nightlife scene with beach clubs, bars, and live music venues.", + "locationName": "Seminyak", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 4, + "destinationRef": "bali", + "ref": "seminyak-shopping-and-nightlife", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_seminyak-shopping-and-nightlife.jpg" + }, + { + "name": "White Water Rafting on the Ayung River", + "description": "Embark on an exhilarating adventure through Bali's lush landscapes with a white water rafting experience on the Ayung River. Navigate thrilling rapids, surrounded by stunning scenery, and feel the rush of adrenaline as you paddle through the cascading waters. This activity is perfect for adventure seekers and nature enthusiasts.", + "locationName": "Ayung River", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "bali", + "ref": "white-water-rafting-on-the-ayung-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_white-water-rafting-on-the-ayung-river.jpg" + }, + { + "name": "Cycling Through Rural Villages", + "description": "Escape the tourist crowds and immerse yourself in the authentic charm of Bali's countryside with a leisurely bike ride through rural villages. Pedal past verdant rice paddies, traditional houses, and friendly locals, experiencing the island's peaceful way of life. This activity offers a unique perspective on Balinese culture and is suitable for all ages.", + "locationName": "Jatiluwih or Sidemen", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "bali", + "ref": "cycling-through-rural-villages", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_cycling-through-rural-villages.jpg" + }, + { + "name": "Dolphin Watching Tour in Lovina", + "description": "Witness the playful beauty of dolphins in their natural habitat with a dolphin watching tour in Lovina. Embark on an early morning boat ride and marvel as these intelligent creatures leap and frolic in the waves. Capture unforgettable memories and enjoy the stunning coastal scenery of northern Bali.", + "locationName": "Lovina Beach", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "bali", + "ref": "dolphin-watching-tour-in-lovina", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_dolphin-watching-tour-in-lovina.jpg" + }, + { + "name": "Sunset Cruise with Dinner", + "description": "Indulge in a romantic and unforgettable evening with a sunset cruise along Bali's coastline. Sail across the glistening waters, enjoying breathtaking views of the setting sun as it paints the sky with vibrant colors. Savor a delicious dinner on board and create lasting memories with your loved ones.", + "locationName": "Benoa Harbor", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "bali", + "ref": "sunset-cruise-with-dinner", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_sunset-cruise-with-dinner.jpg" + }, + { + "name": "Traditional Balinese Dance Performance", + "description": "Immerse yourself in the rich cultural heritage of Bali by attending a traditional Balinese dance performance. Be mesmerized by the graceful movements, vibrant costumes, and captivating storytelling of dances like Legong, Barong, or Kecak. This experience offers a deeper understanding of Balinese art and traditions.", + "locationName": "Ubud Palace or Uluwatu Temple", + "duration": 1.5, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "bali", + "ref": "traditional-balinese-dance-performance", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_traditional-balinese-dance-performance.jpg" + }, + { + "name": "Snorkeling or Diving at Menjangan Island", + "description": "Explore the underwater paradise of Menjangan Island, known for its pristine coral reefs and diverse marine life. Snorkel or dive amidst colorful fish, turtles, and even reef sharks, discovering the vibrant ecosystem of the Bali Barat National Park.", + "locationName": "Menjangan Island", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "bali", + "ref": "snorkeling-or-diving-at-menjangan-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_snorkeling-or-diving-at-menjangan-island.jpg" + }, + { + "name": "Sunrise Trek to Mount Agung", + "description": "Embark on a challenging yet rewarding trek to the summit of Mount Agung, Bali's highest volcano. Witness a breathtaking sunrise over the island, with panoramic views stretching across the landscape to the ocean.", + "locationName": "Mount Agung", + "duration": 8, + "timeOfDay": "night", + "familyFriendly": false, + "price": 4, + "destinationRef": "bali", + "ref": "sunrise-trek-to-mount-agung", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_sunrise-trek-to-mount-agung.jpg" + }, + { + "name": "Spiritual Cleansing at Tirta Empul Temple", + "description": "Immerse yourself in Balinese Hindu culture with a spiritual cleansing ritual at Tirta Empul Temple. Bathe in the holy spring water, believed to possess healing properties, and participate in traditional prayer ceremonies for a unique cultural experience.", + "locationName": "Tirta Empul Temple", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "bali", + "ref": "spiritual-cleansing-at-tirta-empul-temple", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_spiritual-cleansing-at-tirta-empul-temple.jpg" + }, + { + "name": "Authentic Market Experience at Ubud Art Market", + "description": "Wander through the bustling Ubud Art Market, a treasure trove of Balinese handicrafts, textiles, and souvenirs. Practice your bargaining skills, discover unique local crafts, and find the perfect memento to remember your trip.", + "locationName": "Ubud Art Market", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "bali", + "ref": "authentic-market-experience-at-ubud-art-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_authentic-market-experience-at-ubud-art-market.jpg" + }, + { + "name": "Romantic Dinner with Sunset Views at Jimbaran Bay", + "description": "Indulge in a romantic dinner on the beach at Jimbaran Bay. Savor fresh seafood barbeque as you watch the sun dip below the horizon, painting the sky with vibrant colors. Enjoy live music and the sound of waves crashing for an unforgettable evening.", + "locationName": "Jimbaran Bay", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "bali", + "ref": "romantic-dinner-with-sunset-views-at-jimbaran-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bali_romantic-dinner-with-sunset-views-at-jimbaran-bay.jpg" + }, + { + "name": "Lake Louise and Moraine Lake", + "description": "Embark on a scenic journey to the iconic Lake Louise and Moraine Lake. Marvel at the turquoise waters reflecting the surrounding mountains and glaciers. Enjoy a leisurely stroll along the lakeshore, rent a canoe for a peaceful paddle, or challenge yourself with a hike to a panoramic viewpoint. Don't miss the chance to capture breathtaking photos of these natural wonders.", + "locationName": "Lake Louise and Moraine Lake", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "banff-national-park", + "ref": "lake-louise-and-moraine-lake", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_lake-louise-and-moraine-lake.jpg" + }, + { + "name": "Banff Gondola and Sulphur Mountain", + "description": "Ascend Sulphur Mountain in the Banff Gondola for awe-inspiring views of the surrounding peaks and valleys. At the summit, explore the interpretive center, enjoy a meal with a view at the restaurant, or hike the boardwalk to Sanson's Peak for an even more expansive panorama. Keep an eye out for wildlife, such as bighorn sheep and marmots.", + "locationName": "Sulphur Mountain", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "banff-national-park", + "ref": "banff-gondola-and-sulphur-mountain", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_banff-gondola-and-sulphur-mountain.jpg" + }, + { + "name": "Johnston Canyon Hike", + "description": "Embark on a moderate hike through Johnston Canyon, following a series of catwalks and bridges alongside cascading waterfalls and crystal-clear pools. Admire the Lower Falls and continue to the Upper Falls for an even more impressive display. This family-friendly trail offers a refreshing escape into nature.", + "locationName": "Johnston Canyon", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "banff-national-park", + "ref": "johnston-canyon-hike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_johnston-canyon-hike.jpg" + }, + { + "name": "Banff Upper Hot Springs", + "description": "Relax and rejuvenate in the soothing mineral waters of the Banff Upper Hot Springs. Surrounded by stunning mountain scenery, these natural hot springs offer a therapeutic experience. Enjoy the warm waters and let your cares melt away while taking in the fresh mountain air.", + "locationName": "Banff Upper Hot Springs", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "banff-national-park", + "ref": "banff-upper-hot-springs", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_banff-upper-hot-springs.jpg" + }, + { + "name": "Wildlife Watching Tour", + "description": "Join a guided wildlife watching tour to increase your chances of spotting Banff's diverse wildlife. Look for elk, deer, bighorn sheep, bears, and other animals in their natural habitat. Learn about the park's ecosystem and conservation efforts from knowledgeable guides.", + "locationName": "Various locations within Banff National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "banff-national-park", + "ref": "wildlife-watching-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_wildlife-watching-tour.jpg" + }, + { + "name": "Scenic Drive on the Icefields Parkway", + "description": "Embark on a breathtaking journey along the Icefields Parkway, renowned as one of the world's most scenic drives. Marvel at the majestic glaciers, cascading waterfalls, and towering mountains that adorn the landscape. Keep an eye out for wildlife like bears, elk, and bighorn sheep along the way. Make stops at iconic viewpoints such as Bow Lake and Peyto Lake for unforgettable photo opportunities.", + "locationName": "Icefields Parkway", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "banff-national-park", + "ref": "scenic-drive-on-the-icefields-parkway", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_scenic-drive-on-the-icefields-parkway.jpg" + }, + { + "name": "Whitewater Rafting on the Kicking Horse River", + "description": "Experience the thrill of whitewater rafting on the Kicking Horse River, known for its exhilarating rapids and stunning canyon scenery. Join a guided tour and navigate through the rushing waters, surrounded by the beauty of the Canadian Rockies. Choose from various trip lengths and intensity levels to suit your adventurous spirit.", + "locationName": "Kicking Horse River", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "banff-national-park", + "ref": "whitewater-rafting-on-the-kicking-horse-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_whitewater-rafting-on-the-kicking-horse-river.jpg" + }, + { + "name": "Explore the Cave and Basin National Historic Site", + "description": "Delve into the history of Banff National Park at the Cave and Basin National Historic Site, where Canada's first national park was established. Explore the natural hot springs that were discovered in the late 19th century, learn about the area's indigenous heritage, and visit the interactive exhibits that showcase the park's ecological and cultural significance.", + "locationName": "Cave and Basin National Historic Site", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "banff-national-park", + "ref": "explore-the-cave-and-basin-national-historic-site", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_explore-the-cave-and-basin-national-historic-site.jpg" + }, + { + "name": "Indulge in a Relaxing Spa Day", + "description": "Unwind and rejuvenate with a luxurious spa day at one of Banff's renowned wellness retreats. Treat yourself to a massage, facial, or body treatment, and soak in the soothing mineral pools surrounded by breathtaking mountain views. Many spas offer a range of packages and services to suit your preferences, ensuring a truly blissful experience.", + "locationName": "Various spas in Banff", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "banff-national-park", + "ref": "indulge-in-a-relaxing-spa-day", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_indulge-in-a-relaxing-spa-day.jpg" + }, + { + "name": "Discover the Charm of Banff Avenue", + "description": "Stroll along Banff Avenue, the heart of the town, and immerse yourself in its vibrant atmosphere. Browse through unique boutiques, art galleries, and souvenir shops, or indulge in a delicious meal at one of the many restaurants offering diverse cuisines. Enjoy live music performances, street entertainment, and the lively ambiance of this charming mountain town.", + "locationName": "Banff Avenue", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "banff-national-park", + "ref": "discover-the-charm-of-banff-avenue", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_discover-the-charm-of-banff-avenue.jpg" + }, + { + "name": "Stargazing in the Dark Sky Preserve", + "description": "Experience the awe-inspiring beauty of the night sky in Banff National Park, a designated Dark Sky Preserve. Join a guided stargazing tour or venture out on your own to marvel at the constellations, planets, and Milky Way, away from the light pollution of the town.", + "locationName": "Various locations within Banff National Park", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "banff-national-park", + "ref": "stargazing-in-the-dark-sky-preserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_stargazing-in-the-dark-sky-preserve.jpg" + }, + { + "name": "Horseback Riding through the Mountains", + "description": "Embark on a horseback riding adventure through the stunning landscapes of Banff National Park. Several outfitters offer guided tours for all skill levels, allowing you to explore scenic trails, meadows, and forests while enjoying the fresh mountain air and breathtaking views.", + "locationName": "Various locations within Banff National Park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "banff-national-park", + "ref": "horseback-riding-through-the-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_horseback-riding-through-the-mountains.jpg" + }, + { + "name": "Canoeing or Kayaking on Lake Minnewanka", + "description": "Rent a canoe or kayak and explore the pristine waters of Lake Minnewanka, the largest lake in Banff National Park. Paddle along the shoreline, surrounded by towering mountains, and keep an eye out for wildlife such as bald eagles, ospreys, and bighorn sheep.", + "locationName": "Lake Minnewanka", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "banff-national-park", + "ref": "canoeing-or-kayaking-on-lake-minnewanka", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_canoeing-or-kayaking-on-lake-minnewanka.jpg" + }, + { + "name": "Scenic Helicopter Tour over the Rockies", + "description": "Take to the skies for a breathtaking helicopter tour over the Canadian Rockies. Soar above glaciers, turquoise lakes, and snow-capped peaks, enjoying panoramic views of Banff National Park and the surrounding wilderness. This unforgettable experience offers a unique perspective on the vastness and beauty of the region.", + "locationName": "Various helicopter tour operators in Banff", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "banff-national-park", + "ref": "scenic-helicopter-tour-over-the-rockies", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_scenic-helicopter-tour-over-the-rockies.jpg" + }, + { + "name": "Explore the Town of Banff", + "description": "Wander through the charming town of Banff, with its unique shops, art galleries, and museums. Discover local crafts and souvenirs, enjoy delicious cuisine at one of the many restaurants, or visit the Whyte Museum of the Canadian Rockies to delve into the region's history and culture.", + "locationName": "Town of Banff", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "banff-national-park", + "ref": "explore-the-town-of-banff", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_explore-the-town-of-banff.jpg" + }, + { + "name": "Via Ferrata Climb", + "description": "Experience the thrill of climbing the Rocky Mountains on a guided Via Ferrata excursion. With iron rungs, suspension bridges, and breathtaking views, this adventure offers a unique perspective of the park's stunning landscapes. Choose from various routes catering to different skill levels, making it an exciting option for adventurous travelers.", + "locationName": "Mount Norquay", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "banff-national-park", + "ref": "via-ferrata-climb", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_via-ferrata-climb.jpg" + }, + { + "name": "Columbia Icefield Adventure", + "description": "Embark on a once-in-a-lifetime journey to the Columbia Icefield, where you can walk on the Athabasca Glacier and learn about its fascinating history and geology. Explore the Icefields Parkway, stopping at stunning viewpoints like Peyto Lake, and experience the Glacier Skywalk, a glass-floored platform offering panoramic mountain vistas.", + "locationName": "Columbia Icefield", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "banff-national-park", + "ref": "columbia-icefield-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_columbia-icefield-adventure.jpg" + }, + { + "name": "Lake Minnewanka Boat Cruise", + "description": "Discover the beauty of Lake Minnewanka on a scenic boat cruise. Learn about the lake's history, legends, and geological formations while enjoying breathtaking views of the surrounding mountains and forests. Keep an eye out for wildlife such as bighorn sheep, elk, and bald eagles.", + "locationName": "Lake Minnewanka", + "duration": 1.5, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "banff-national-park", + "ref": "lake-minnewanka-boat-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_lake-minnewanka-boat-cruise.jpg" + }, + { + "name": "Banff Gondola and Sky Bistro Dining Experience", + "description": "Ascend Sulphur Mountain on the Banff Gondola and savor a delectable meal at the Sky Bistro. Enjoy panoramic views of the surrounding peaks, valleys, and the town of Banff while indulging in a culinary experience that combines local ingredients with breathtaking scenery.", + "locationName": "Sulphur Mountain", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "banff-national-park", + "ref": "banff-gondola-and-sky-bistro-dining-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_banff-gondola-and-sky-bistro-dining-experience.jpg" + }, + { + "name": "Johnston Canyon Icewalk", + "description": "Embark on a winter wonderland adventure with a guided icewalk through Johnston Canyon. Discover frozen waterfalls, ice caves, and stunning ice formations while learning about the canyon's geology and winter ecology. This unique experience offers a magical perspective of the park's winter landscape.", + "locationName": "Johnston Canyon", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "banff-national-park", + "ref": "johnston-canyon-icewalk", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/banff-national-park_johnston-canyon-icewalk.jpg" + }, + { + "name": "Scuba Diving in the Great Blue Hole", + "description": "Embark on an unforgettable underwater adventure by diving into the iconic Great Blue Hole, a massive underwater sinkhole renowned for its crystal-clear waters and diverse marine life. Explore the unique geological formations and encounter various species of sharks, tropical fish, and colorful coral reefs.", + "locationName": "Great Blue Hole", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "belize", + "ref": "scuba-diving-in-the-great-blue-hole", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_scuba-diving-in-the-great-blue-hole.jpg" + }, + { + "name": "Exploring Ancient Maya Ruins", + "description": "Step back in time and discover the mysteries of the ancient Maya civilization by visiting the impressive archaeological sites of Caracol and Xunantunich. Climb towering temples, explore intricate carvings, and learn about the fascinating history and culture of this once-thriving civilization.", + "locationName": "Caracol or Xunantunich", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "belize", + "ref": "exploring-ancient-maya-ruins", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_exploring-ancient-maya-ruins.jpg" + }, + { + "name": "Cave Tubing Adventure", + "description": "Embark on a thrilling cave tubing adventure through the lush Belizean rainforest. Float along underground rivers, marvel at stunning stalactites and stalagmites, and experience the unique ecosystem of these hidden caves.", + "locationName": " Caves Branch River", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "belize", + "ref": "cave-tubing-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_cave-tubing-adventure.jpg" + }, + { + "name": "Wildlife Watching in the Jungle", + "description": "Immerse yourself in the vibrant biodiversity of the Belizean jungle. Embark on a guided wildlife tour and encounter fascinating creatures like howler monkeys, toucans, jaguars, and tapirs. Learn about the delicate ecosystem and conservation efforts in place to protect these incredible animals.", + "locationName": "Cockscomb Basin Wildlife Sanctuary", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "belize", + "ref": "wildlife-watching-in-the-jungle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_wildlife-watching-in-the-jungle.jpg" + }, + { + "name": "Relaxing on the Beaches", + "description": "Unwind and soak up the sun on the pristine beaches of Belize. Choose from secluded coves, lively stretches of sand, or private islands. Enjoy swimming, snorkeling, kayaking, or simply relaxing with a refreshing drink and enjoying the breathtaking ocean views.", + "locationName": "Ambergris Caye or Caye Caulker", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "belize", + "ref": "relaxing-on-the-beaches", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_relaxing-on-the-beaches.jpg" + }, + { + "name": "Horseback Riding through the Jungle", + "description": "Embark on a thrilling horseback riding adventure through the lush jungles of Belize. Traverse scenic trails, encounter exotic wildlife, and discover hidden waterfalls. This unique experience offers a different perspective of the Belizean rainforest, allowing you to connect with nature in a memorable way.", + "locationName": "Mayan Mountains or Mountain Pine Ridge Forest Reserve", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "belize", + "ref": "horseback-riding-through-the-jungle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_horseback-riding-through-the-jungle.jpg" + }, + { + "name": "Kayaking on the Belize River", + "description": "Paddle your way through the heart of Belize on a scenic kayaking tour down the Belize River. Witness diverse birdlife, lush vegetation, and perhaps even crocodiles sunning on the banks. This relaxing yet adventurous activity is perfect for nature enthusiasts and offers a glimpse into the country's natural beauty.", + "locationName": "Belize River", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "belize", + "ref": "kayaking-on-the-belize-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_kayaking-on-the-belize-river.jpg" + }, + { + "name": "Sunset Sailing and Snorkeling", + "description": "Experience the magic of a Belizean sunset while sailing along the Caribbean Sea. As the sky transforms into a canvas of vibrant colors, enjoy snorkeling amidst colorful coral reefs and tropical fish. This romantic and unforgettable activity combines relaxation, adventure, and breathtaking natural beauty.", + "locationName": "Ambergris Caye or Caye Caulker", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "belize", + "ref": "sunset-sailing-and-snorkeling", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_sunset-sailing-and-snorkeling.jpg" + }, + { + "name": "Culinary Tour and Cooking Class", + "description": "Delve into the vibrant flavors of Belizean cuisine with a culinary tour and cooking class. Visit local markets to discover fresh ingredients, learn traditional cooking techniques from experienced chefs, and savor the delicious dishes you create. This immersive experience is perfect for food enthusiasts and offers a taste of Belizean culture.", + "locationName": "San Ignacio or Placencia", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "belize", + "ref": "culinary-tour-and-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_culinary-tour-and-cooking-class.jpg" + }, + { + "name": "Ziplining through the Rainforest Canopy", + "description": "Soar through the Belizean rainforest canopy on an exhilarating ziplining adventure. Experience breathtaking views, feel the adrenaline rush, and witness the jungle from a unique perspective. This thrilling activity is perfect for adventure seekers and offers an unforgettable experience.", + "locationName": "Mayflower Bocawina National Park or Calico Jack's Village", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "belize", + "ref": "ziplining-through-the-rainforest-canopy", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_ziplining-through-the-rainforest-canopy.jpg" + }, + { + "name": "Birding in Crooked Tree Wildlife Sanctuary", + "description": "Embark on a serene journey through the Crooked Tree Wildlife Sanctuary, a haven for bird enthusiasts. With over 300 species of birds, including Jabiru storks, egrets, and ospreys, this sanctuary offers exceptional birdwatching opportunities. Explore the lagoons, creeks, and savannas by boat or kayak, immersing yourself in the sights and sounds of Belize's avian wonders.", + "locationName": "Crooked Tree Wildlife Sanctuary", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "belize", + "ref": "birding-in-crooked-tree-wildlife-sanctuary", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_birding-in-crooked-tree-wildlife-sanctuary.jpg" + }, + { + "name": "ATM Cave Spelunking", + "description": "Embark on an exhilarating adventure through Actun Tunichil Muknal (ATM) Cave, a sacred Maya archaeological site. Hike through the jungle, swim through underground rivers, and marvel at ancient artifacts, including skeletal remains and pottery, while learning about Maya rituals and beliefs.", + "locationName": "Actun Tunichil Muknal (ATM) Cave", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "belize", + "ref": "atm-cave-spelunking", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_atm-cave-spelunking.jpg" + }, + { + "name": "Chocolate Making Workshop", + "description": "Indulge your senses in the rich history and flavors of Belizean chocolate at a chocolate-making workshop. Learn about the ancient Maya cacao traditions, participate in the bean-to-bar process, and create your own delicious chocolate treats to savor.", + "locationName": "Various locations in Belize", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "belize", + "ref": "chocolate-making-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_chocolate-making-workshop.jpg" + }, + { + "name": "Garifuna Cultural Experience", + "description": "Immerse yourself in the vibrant Garifuna culture on the southern coast of Belize. Visit Hopkins or Dangriga to witness traditional drumming and dance performances, savor authentic Garifuna cuisine, and learn about their unique history, language, and customs.", + "locationName": "Hopkins or Dangriga", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "belize", + "ref": "garifuna-cultural-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_garifuna-cultural-experience.jpg" + }, + { + "name": "Cockscomb Basin Wildlife Sanctuary Hiking", + "description": "Embark on a thrilling hiking expedition through the Cockscomb Basin Wildlife Sanctuary, the world's first jaguar preserve. Explore diverse trails, encounter exotic wildlife such as monkeys, tapirs, and birds, and immerse yourself in the beauty of the Belizean rainforest.", + "locationName": "Cockscomb Basin Wildlife Sanctuary", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "belize", + "ref": "cockscomb-basin-wildlife-sanctuary-hiking", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_cockscomb-basin-wildlife-sanctuary-hiking.jpg" + }, + { + "name": "Island Hopping and Snorkeling Adventure", + "description": "Embark on a boat tour to explore the stunning islands of Belize. Discover the vibrant coral reefs and diverse marine life while snorkeling in crystal-clear turquoise waters. Visit idyllic islands like Ambergris Caye and Caye Caulker, soaking up the sun and enjoying the laid-back island vibes.", + "locationName": "Belize Barrier Reef and Islands", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "belize", + "ref": "island-hopping-and-snorkeling-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_island-hopping-and-snorkeling-adventure.jpg" + }, + { + "name": "Fishing in the Caribbean Sea", + "description": "Cast your line and experience the thrill of deep-sea fishing in the Caribbean Sea. Target a variety of fish species, including marlin, tuna, and dorado. Enjoy the scenic beauty of the open water and the challenge of reeling in your catch.", + "locationName": "Caribbean Sea", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "belize", + "ref": "fishing-in-the-caribbean-sea", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_fishing-in-the-caribbean-sea.jpg" + }, + { + "name": "Stand-Up Paddleboarding on Placencia Lagoon", + "description": "Glide along the calm waters of Placencia Lagoon on a stand-up paddleboard. Enjoy the peaceful surroundings and observe the local wildlife, including mangroves, birds, and marine life. This relaxing activity is suitable for all skill levels.", + "locationName": "Placencia Lagoon", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "belize", + "ref": "stand-up-paddleboarding-on-placencia-lagoon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_stand-up-paddleboarding-on-placencia-lagoon.jpg" + }, + { + "name": "Mayan Cooking Class and Cultural Immersion", + "description": "Delve into the rich culinary traditions of Belize with a Mayan cooking class. Learn to prepare traditional dishes using local ingredients and ancient cooking techniques. Immerse yourself in the Mayan culture and gain insights into their history and way of life.", + "locationName": "San Antonio Village", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "belize", + "ref": "mayan-cooking-class-and-cultural-immersion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_mayan-cooking-class-and-cultural-immersion.jpg" + }, + { + "name": "Nighttime Bioluminescence Tour", + "description": "Experience the magical phenomenon of bioluminescence on a nighttime boat tour. Witness the water come alive with sparkling blue light as you paddle through the lagoon. Learn about the organisms that create this natural wonder and enjoy the enchanting atmosphere.", + "locationName": "Anderson Lagoon", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "belize", + "ref": "nighttime-bioluminescence-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/belize_nighttime-bioluminescence-tour.jpg" + }, + { + "name": "Hike to Tiger's Nest Monastery", + "description": "Embark on a breathtaking hike through pine forests and rhododendron blooms to reach the iconic Tiger's Nest Monastery, clinging precariously to a cliffside. Witness panoramic views of the Paro Valley and immerse yourself in the spiritual aura of this sacred site.", + "locationName": "Paro Valley", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "bhutan", + "ref": "hike-to-tiger-s-nest-monastery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_hike-to-tiger-s-nest-monastery.jpg" + }, + { + "name": "Explore the Punakha Dzong", + "description": "Step into the architectural wonder of Punakha Dzong, a majestic fortress at the confluence of two rivers. Marvel at its intricate woodwork, vibrant murals, and serene courtyards. Learn about its historical significance as the former seat of the Bhutanese government.", + "locationName": "Punakha", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "bhutan", + "ref": "explore-the-punakha-dzong", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_explore-the-punakha-dzong.jpg" + }, + { + "name": "Attend a Tsechu Festival", + "description": "Immerse yourself in the vibrant cultural spectacle of a Tsechu festival, where masked dancers perform traditional folk dances and religious ceremonies. Witness the colorful costumes, lively music, and the deep-rooted spirituality of the Bhutanese people.", + "locationName": "Various locations throughout Bhutan", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "bhutan", + "ref": "attend-a-tsechu-festival", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_attend-a-tsechu-festival.jpg" + }, + { + "name": "Visit the National Museum of Bhutan", + "description": "Delve into the rich history and cultural heritage of Bhutan at the National Museum. Explore exhibits showcasing ancient artifacts, traditional costumes, religious relics, and contemporary art. Gain insights into the unique way of life in this Himalayan kingdom.", + "locationName": "Paro", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "bhutan", + "ref": "visit-the-national-museum-of-bhutan", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_visit-the-national-museum-of-bhutan.jpg" + }, + { + "name": "Meditate at a Buddhist Monastery", + "description": "Find inner peace and serenity with a meditation session at a serene Buddhist monastery. Learn about Buddhist philosophy, practice mindfulness techniques, and soak in the tranquil atmosphere of these spiritual sanctuaries.", + "locationName": "Various monasteries throughout Bhutan", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 1, + "destinationRef": "bhutan", + "ref": "meditate-at-a-buddhist-monastery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_meditate-at-a-buddhist-monastery.jpg" + }, + { + "name": "White Water Rafting on the Mo Chhu River", + "description": "Experience the thrill of white water rafting down the Mo Chhu River, surrounded by stunning Himalayan scenery. Navigate through rapids with experienced guides, enjoying the adrenaline rush and breathtaking views. This activity is perfect for adventure seekers and nature lovers.", + "locationName": "Punakha Valley", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "bhutan", + "ref": "white-water-rafting-on-the-mo-chhu-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_white-water-rafting-on-the-mo-chhu-river.jpg" + }, + { + "name": "Soak in a Traditional Hot Stone Bath", + "description": "Indulge in a relaxing and therapeutic hot stone bath, a unique Bhutanese tradition. Immerse yourself in a wooden tub filled with mineral-rich water and heated stones, believed to have healing properties. This experience is perfect for unwinding after a day of exploring.", + "locationName": "Paro Valley", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "bhutan", + "ref": "soak-in-a-traditional-hot-stone-bath", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_soak-in-a-traditional-hot-stone-bath.jpg" + }, + { + "name": "Attend a Local Archery Tournament", + "description": "Witness the national sport of Bhutan, archery, at a local tournament. Observe the skilled archers compete in this traditional and vibrant event, where you can experience the excitement and cultural significance of the sport.", + "locationName": "Thimphu", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "bhutan", + "ref": "attend-a-local-archery-tournament", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_attend-a-local-archery-tournament.jpg" + }, + { + "name": "Hike to the Khamsum Yulley Namgyal Chorten", + "description": "Embark on a scenic hike to the Khamsum Yulley Namgyal Chorten, a stunning temple perched on a ridge overlooking the Punakha Valley. Enjoy panoramic views of the surrounding landscapes and explore the intricate architecture and spiritual significance of the chorten.", + "locationName": "Punakha Valley", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "bhutan", + "ref": "hike-to-the-khamsum-yulley-namgyal-chorten", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_hike-to-the-khamsum-yulley-namgyal-chorten.jpg" + }, + { + "name": "Learn the Art of Bhutanese Cuisine", + "description": "Delve into the flavors of Bhutanese cuisine by participating in a cooking class. Learn to prepare traditional dishes like ema datshi (chili and cheese) and momos (dumplings), using local ingredients and techniques. This experience is perfect for food enthusiasts and those seeking a cultural immersion.", + "locationName": "Thimphu or Paro", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "bhutan", + "ref": "learn-the-art-of-bhutanese-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_learn-the-art-of-bhutanese-cuisine.jpg" + }, + { + "name": "Witness the Paro Tshechu", + "description": "Immerse yourself in the vibrant spectacle of the Paro Tshechu, a religious festival featuring masked dances, colorful costumes, and traditional music. Witness the unique Cham dances performed by monks, believed to ward off evil spirits and bring blessings.", + "locationName": "Paro Dzong", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "bhutan", + "ref": "witness-the-paro-tshechu", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_witness-the-paro-tshechu.jpg" + }, + { + "name": "Birdwatching in Phobjikha Valley", + "description": "Embark on a serene birdwatching expedition in the picturesque Phobjikha Valley, home to the endangered black-necked cranes. Witness these majestic birds in their natural habitat, along with other Himalayan species, surrounded by breathtaking mountain scenery.", + "locationName": "Phobjikha Valley", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "bhutan", + "ref": "birdwatching-in-phobjikha-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_birdwatching-in-phobjikha-valley.jpg" + }, + { + "name": "Shop for Handicrafts in Thimphu", + "description": "Discover the unique craftsmanship of Bhutan at the bustling Thimphu market. Browse through a variety of handmade textiles, thangkas (Buddhist paintings), woodcarvings, and other souvenirs. Find the perfect memento to take home and support local artisans.", + "locationName": "Thimphu Market", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "bhutan", + "ref": "shop-for-handicrafts-in-thimphu", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_shop-for-handicrafts-in-thimphu.jpg" + }, + { + "name": "Experience Farm Life in a Rural Homestay", + "description": "Escape the city and immerse yourself in the tranquility of rural Bhutan with a homestay experience. Participate in daily farm activities, learn about traditional agricultural practices, and savor authentic Bhutanese cuisine prepared with fresh, local ingredients.", + "locationName": "Rural villages near Paro or Punakha", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "bhutan", + "ref": "experience-farm-life-in-a-rural-homestay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_experience-farm-life-in-a-rural-homestay.jpg" + }, + { + "name": "Hike to Tango Monastery", + "description": "Embark on a scenic hike to the Tango Monastery, perched on a cliffside overlooking the Thimphu Valley. Enjoy panoramic views of the surrounding mountains and visit the monastery, a significant center for Buddhist studies.", + "locationName": "Tango Monastery", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 2, + "destinationRef": "bhutan", + "ref": "hike-to-tango-monastery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_hike-to-tango-monastery.jpg" + }, + { + "name": "Paragliding over the Himalayas", + "description": "Soar like a bird and witness breathtaking panoramic views of the Himalayas, verdant valleys, and ancient monasteries. Experience the thrill of paragliding with experienced pilots, offering tandem flights for all skill levels.", + "locationName": "Paro Valley", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "bhutan", + "ref": "paragliding-over-the-himalayas", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_paragliding-over-the-himalayas.jpg" + }, + { + "name": "Mountain Biking through Scenic Trails", + "description": "Embark on an exhilarating mountain biking adventure through Bhutan's rugged terrains and picturesque landscapes. Explore remote villages, pedal past terraced fields, and challenge yourself with thrilling downhill descents.", + "locationName": "Punakha Valley", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "bhutan", + "ref": "mountain-biking-through-scenic-trails", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_mountain-biking-through-scenic-trails.jpg" + }, + { + "name": "Wildlife Safari in Royal Manas National Park", + "description": "Discover the rich biodiversity of Bhutan's oldest national park, Royal Manas. Embark on a wildlife safari to spot endangered species like Bengal tigers, Asian elephants, one-horned rhinoceros, and various bird species in their natural habitat.", + "locationName": "Royal Manas National Park", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "bhutan", + "ref": "wildlife-safari-in-royal-manas-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_wildlife-safari-in-royal-manas-national-park.jpg" + }, + { + "name": "Camping under the Starry Sky", + "description": "Escape the city lights and immerse yourself in the tranquility of Bhutan's pristine wilderness. Set up camp amidst stunning mountain scenery, enjoy bonfires under the starry sky, and wake up to the sounds of nature.", + "locationName": "Bumthang Valley", + "duration": 12, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "bhutan", + "ref": "camping-under-the-starry-sky", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_camping-under-the-starry-sky.jpg" + }, + { + "name": "Discover the Art of Thangka Painting", + "description": "Delve into the intricate world of Bhutanese art by learning the traditional Thangka painting technique. Join a workshop led by skilled artisans and create your own masterpiece, gaining insights into Buddhist symbolism and artistic expression.", + "locationName": "Thimphu", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "bhutan", + "ref": "discover-the-art-of-thangka-painting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bhutan_discover-the-art-of-thangka-painting.jpg" + }, + { + "name": "Explore Hawaii Volcanoes National Park", + "description": "Embark on a journey through volcanic landscapes at Hawaii Volcanoes National Park. Witness the awe-inspiring Kilauea volcano, hike through lava tubes, and learn about the fascinating geological history of the island. Don't miss the Thurston Lava Tube and the Kilauea Iki Crater Overlook for breathtaking views.", + "locationName": "Hawaii Volcanoes National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "big-island-hawaii", + "ref": "explore-hawaii-volcanoes-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_explore-hawaii-volcanoes-national-park.jpg" + }, + { + "name": "Snorkel with Manta Rays at Night", + "description": "Experience the magic of swimming alongside gentle manta rays at night. Join a guided tour to Manta Ray Night Snorkel spot, where these graceful creatures gather to feed on plankton. Witness their impressive size and graceful movements as they glide through the illuminated waters.", + "locationName": "Manta Ray Night Snorkel", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 4, + "destinationRef": "big-island-hawaii", + "ref": "snorkel-with-manta-rays-at-night", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_snorkel-with-manta-rays-at-night.jpg" + }, + { + "name": "Hike to the Top of Mauna Kea for Stargazing", + "description": "Embark on a memorable adventure to the summit of Mauna Kea, a dormant volcano and one of the best stargazing locations on Earth. Join a guided tour or drive yourself to the visitor center, then marvel at the breathtaking panoramic views and the celestial wonders above.", + "locationName": "Mauna Kea", + "duration": 5, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "big-island-hawaii", + "ref": "hike-to-the-top-of-mauna-kea-for-stargazing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_hike-to-the-top-of-mauna-kea-for-stargazing.jpg" + }, + { + "name": "Relax on Black Sand Beaches", + "description": "Indulge in the unique beauty of Punalu'u Black Sand Beach, where volcanic activity has created a stunning contrast of black sand and turquoise waters. Relax on the beach, watch for sea turtles, and take a refreshing dip in the ocean.", + "locationName": "Punalu'u Black Sand Beach", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "big-island-hawaii", + "ref": "relax-on-black-sand-beaches", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_relax-on-black-sand-beaches.jpg" + }, + { + "name": "Visit Akaka Falls State Park", + "description": "Immerse yourself in the lush rainforest scenery of Akaka Falls State Park. Hike through the park's trails, surrounded by vibrant vegetation and cascading waterfalls. Witness the impressive 442-foot Akaka Falls, a true natural wonder.", + "locationName": "Akaka Falls State Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "big-island-hawaii", + "ref": "visit-akaka-falls-state-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_visit-akaka-falls-state-park.jpg" + }, + { + "name": "Horseback Riding Adventure", + "description": "Embark on a thrilling horseback riding adventure through the scenic landscapes of the Big Island. Explore lush rainforests, volcanic trails, and panoramic ocean views as you connect with nature and experience the island's beauty from a unique perspective. This activity is suitable for all skill levels, offering a memorable experience for both novice and experienced riders.", + "locationName": "Various ranches and stables across the island", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "big-island-hawaii", + "ref": "horseback-riding-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_horseback-riding-adventure.jpg" + }, + { + "name": "Waipio Valley Expedition", + "description": "Journey into the heart of the Big Island's dramatic Waipio Valley, often referred to as the 'Valley of the Kings.' Embark on a 4x4 tour or hike down the steep valley walls to discover cascading waterfalls, black sand beaches, and ancient Hawaiian taro fields. Immerse yourself in the rich history and breathtaking scenery of this secluded paradise.", + "locationName": "Waipio Valley", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "big-island-hawaii", + "ref": "waipio-valley-expedition", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_waipio-valley-expedition.jpg" + }, + { + "name": "Coffee Farm Tour and Tasting", + "description": "Delve into the world of Kona coffee with a captivating tour of a local coffee farm. Learn about the bean-to-cup process, from cultivation and harvesting to roasting and brewing. Indulge in a delightful tasting session, savoring the unique flavors and aromas of freshly brewed Kona coffee.", + "locationName": "Kona coffee belt", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "big-island-hawaii", + "ref": "coffee-farm-tour-and-tasting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_coffee-farm-tour-and-tasting.jpg" + }, + { + "name": "Sunset Sail along the Kona Coast", + "description": "Set sail on a romantic sunset cruise along the picturesque Kona Coast. As the sun dips below the horizon, casting a golden glow over the Pacific Ocean, enjoy breathtaking views of the coastline, volcanic peaks, and marine life. Savor delicious appetizers and cocktails while creating unforgettable memories.", + "locationName": "Kona Coast", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "big-island-hawaii", + "ref": "sunset-sail-along-the-kona-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_sunset-sail-along-the-kona-coast.jpg" + }, + { + "name": "Hawaii Tropical Botanical Garden", + "description": "Escape into a world of tropical wonder at the Hawaii Tropical Botanical Garden. Wander through lush pathways, discovering a diverse collection of over 2,000 exotic plant species. Admire cascading waterfalls, vibrant flowers, and towering trees, immersing yourself in the beauty and tranquility of this natural oasis.", + "locationName": "Onomea Bay", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "big-island-hawaii", + "ref": "hawaii-tropical-botanical-garden", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_hawaii-tropical-botanical-garden.jpg" + }, + { + "name": "Kayaking and Dolphin Watching at Kealakekua Bay", + "description": "Embark on a serene kayaking adventure in the crystal-clear waters of Kealakekua Bay, a marine sanctuary teeming with life. Paddle along the scenic coastline, explore hidden coves, and encounter playful spinner dolphins in their natural habitat. This eco-friendly activity offers breathtaking views and a chance to connect with nature's wonders.", + "locationName": "Kealakekua Bay", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "big-island-hawaii", + "ref": "kayaking-and-dolphin-watching-at-kealakekua-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_kayaking-and-dolphin-watching-at-kealakekua-bay.jpg" + }, + { + "name": "Swim with Sea Turtles at Punalu'u Black Sand Beach", + "description": "Experience the unique beauty of Punalu'u Black Sand Beach, where endangered Hawaiian green sea turtles bask on the volcanic shoreline. Take a refreshing dip in the ocean and snorkel alongside these gentle giants. Witnessing these majestic creatures up close is an unforgettable experience.", + "locationName": "Punalu'u Black Sand Beach", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "big-island-hawaii", + "ref": "swim-with-sea-turtles-at-punalu-u-black-sand-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_swim-with-sea-turtles-at-punalu-u-black-sand-beach.jpg" + }, + { + "name": "Zipline Through the Rainforest Canopy", + "description": "Embark on an exhilarating zipline adventure through the lush rainforest canopy. Soar above the trees, enjoying panoramic views of the island's diverse landscapes. With multiple zipline courses available, ranging from beginner to advanced, this activity is perfect for thrill-seekers and nature enthusiasts alike.", + "locationName": "Hilo or Kapoho", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "big-island-hawaii", + "ref": "zipline-through-the-rainforest-canopy", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_zipline-through-the-rainforest-canopy.jpg" + }, + { + "name": "Explore the Thurston Lava Tube", + "description": "Venture into the depths of the earth and explore the Thurston Lava Tube, a natural volcanic cave formed centuries ago. Walk through the dimly lit tunnel, marvel at the unique geological formations, and learn about the island's volcanic history. This fascinating adventure offers a glimpse into the powerful forces that shaped the Big Island.", + "locationName": "Hawaii Volcanoes National Park", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "big-island-hawaii", + "ref": "explore-the-thurston-lava-tube", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_explore-the-thurston-lava-tube.jpg" + }, + { + "name": "Attend a Traditional Hawaiian Luau", + "description": "Immerse yourself in Hawaiian culture at a traditional luau. Feast on a delicious buffet of local cuisine, enjoy live music and hula performances, and learn about the island's rich history and traditions. This vibrant and festive experience is a perfect way to celebrate your Hawaiian vacation.", + "locationName": "Various locations throughout the island", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "big-island-hawaii", + "ref": "attend-a-traditional-hawaiian-luau", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_attend-a-traditional-hawaiian-luau.jpg" + }, + { + "name": "Helicopter Tour Over Volcanoes", + "description": "Experience the breathtaking beauty and raw power of the Big Island's volcanic landscapes from a unique perspective on a thrilling helicopter tour. Soar above active craters, witness lava flows cascading into the ocean, and marvel at the dramatic contrast between volcanic rock and lush rainforests.", + "locationName": "Various helicopter tour operators on the Big Island", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "big-island-hawaii", + "ref": "helicopter-tour-over-volcanoes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_helicopter-tour-over-volcanoes.jpg" + }, + { + "name": "Stargazing at Mauna Kea Observatories", + "description": "Embark on a celestial journey to the summit of Mauna Kea, home to some of the world's most advanced astronomical observatories. Join a guided stargazing tour and peer through powerful telescopes to witness the wonders of the night sky, from distant galaxies to the rings of Saturn.", + "locationName": "Mauna Kea Observatories", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "big-island-hawaii", + "ref": "stargazing-at-mauna-kea-observatories", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_stargazing-at-mauna-kea-observatories.jpg" + }, + { + "name": "Scuba Diving in Kealakekua Bay", + "description": "Dive into the crystal-clear waters of Kealakekua Bay, a marine sanctuary teeming with colorful coral reefs, tropical fish, and playful dolphins. Explore underwater lava tubes, encounter majestic sea turtles, and discover the vibrant marine ecosystem that makes this bay a renowned diving destination.", + "locationName": "Kealakekua Bay", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "big-island-hawaii", + "ref": "scuba-diving-in-kealakekua-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_scuba-diving-in-kealakekua-bay.jpg" + }, + { + "name": "Road Trip Along the Hamakua Coast", + "description": "Embark on a scenic road trip along the Hamakua Coast, a stretch of dramatic coastline dotted with cascading waterfalls, lush rainforests, and charming towns. Stop at Akaka Falls State Park, explore the Hawaii Tropical Botanical Garden, and savor the local flavors at roadside fruit stands and cafes.", + "locationName": "Hamakua Coast", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "big-island-hawaii", + "ref": "road-trip-along-the-hamakua-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_road-trip-along-the-hamakua-coast.jpg" + }, + { + "name": "Visit the Pu'uhonua o Honaunau National Historical Park", + "description": "Step back in time at Pu'uhonua o Honaunau National Historical Park, a sacred place of refuge in ancient Hawaii. Explore the restored temples, learn about Hawaiian history and culture, and enjoy the serene beauty of this coastal park.", + "locationName": "Pu'uhonua o Honaunau National Historical Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "big-island-hawaii", + "ref": "visit-the-pu-uhonua-o-honaunau-national-historical-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-island-hawaii_visit-the-pu-uhonua-o-honaunau-national-historical-park.jpg" + }, + { + "name": "Hiking in Pfeiffer Big Sur State Park", + "description": "Explore the redwood groves and waterfalls of Pfeiffer Big Sur State Park on a network of scenic trails. Hike to Pfeiffer Falls, Valley View Trail, or the challenging Mount Manuel Trail for panoramic vistas.", + "locationName": "Pfeiffer Big Sur State Park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "big-sur", + "ref": "hiking-in-pfeiffer-big-sur-state-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_hiking-in-pfeiffer-big-sur-state-park.jpg" + }, + { + "name": "Scenic Drive along Pacific Coast Highway", + "description": "Embark on an unforgettable road trip along the Pacific Coast Highway, stopping at iconic viewpoints like Bixby Creek Bridge, McWay Falls, and Pfeiffer Beach. Enjoy the dramatic cliffs, ocean views, and charming coastal towns.", + "locationName": "Pacific Coast Highway", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "big-sur", + "ref": "scenic-drive-along-pacific-coast-highway", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_scenic-drive-along-pacific-coast-highway.jpg" + }, + { + "name": "Camping under the Redwoods", + "description": "Immerse yourself in nature by camping at one of the campgrounds in Big Sur. Pfeiffer Big Sur State Park, Julia Pfeiffer Burns State Park, and Plaskett Creek Campground offer stunning redwood forest settings and access to hiking trails.", + "locationName": "Pfeiffer Big Sur State Park, Julia Pfeiffer Burns State Park, Plaskett Creek Campground", + "duration": 12, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "big-sur", + "ref": "camping-under-the-redwoods", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_camping-under-the-redwoods.jpg" + }, + { + "name": "Whale Watching Tour", + "description": "Embark on a whale-watching tour from Monterey or Moss Landing to witness the majestic gray whales migrating along the Big Sur coast. Spot other marine life like dolphins, sea lions, and sea otters.", + "locationName": "Monterey or Moss Landing", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "big-sur", + "ref": "whale-watching-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_whale-watching-tour.jpg" + }, + { + "name": "Relaxation and Wellness Retreat", + "description": "Indulge in a rejuvenating experience at a wellness retreat in Big Sur. Enjoy yoga classes, spa treatments, meditation sessions, and breathtaking views of the natural surroundings.", + "locationName": "Esalen Institute, Post Ranch Inn", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "big-sur", + "ref": "relaxation-and-wellness-retreat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_relaxation-and-wellness-retreat.jpg" + }, + { + "name": "Explore Point Lobos State Natural Reserve", + "description": "Embark on a mesmerizing journey through Point Lobos State Natural Reserve, often referred to as the 'crown jewel' of California's state park system. Hike along scenic trails that wind through dramatic cliffs, hidden coves, and serene forests, offering breathtaking views of the Pacific Ocean. Discover diverse marine life at Whalers Cove and witness the playful antics of sea otters frolicking in the kelp forests.", + "locationName": "Point Lobos State Natural Reserve", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "big-sur", + "ref": "explore-point-lobos-state-natural-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_explore-point-lobos-state-natural-reserve.jpg" + }, + { + "name": "Indulge in a Romantic Getaway at Post Ranch Inn", + "description": "Escape to the luxurious embrace of Post Ranch Inn, a secluded cliffside retreat renowned for its breathtaking ocean views and unparalleled service. Indulge in a romantic getaway with your loved one, enjoying private clifftop accommodations, rejuvenating spa treatments, and gourmet dining experiences. Unwind by the infinity pool overlooking the vast Pacific or explore the surrounding natural wonders.", + "locationName": "Post Ranch Inn", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "big-sur", + "ref": "indulge-in-a-romantic-getaway-at-post-ranch-inn", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_indulge-in-a-romantic-getaway-at-post-ranch-inn.jpg" + }, + { + "name": "Kayaking Adventure at Pfeiffer Beach", + "description": "Embark on an unforgettable kayaking adventure at Pfeiffer Beach, renowned for its iconic rock formations and dramatic coastline. Paddle through turquoise waters, exploring hidden coves and sea caves while marveling at the majestic cliffs and the unique purple sand beach. Witness the power of the ocean as waves crash against the rocks, creating a truly awe-inspiring experience.", + "locationName": "Pfeiffer Beach", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "big-sur", + "ref": "kayaking-adventure-at-pfeiffer-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_kayaking-adventure-at-pfeiffer-beach.jpg" + }, + { + "name": "Art and Inspiration at the Henry Miller Memorial Library", + "description": "Delve into the world of renowned author Henry Miller at the Henry Miller Memorial Library. This unique cultural haven offers a glimpse into Miller's life and works, with a collection of his books, letters, and personal belongings. Attend literary events, art exhibitions, or simply relax in the tranquil garden setting, surrounded by the inspiring beauty of Big Sur.", + "locationName": "Henry Miller Memorial Library", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "big-sur", + "ref": "art-and-inspiration-at-the-henry-miller-memorial-library", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_art-and-inspiration-at-the-henry-miller-memorial-library.jpg" + }, + { + "name": "Horseback Riding through Redwoods", + "description": "Embark on an unforgettable horseback riding adventure through the majestic redwood forests of Big Sur. Several local ranches offer guided tours suitable for all skill levels, allowing you to immerse yourself in the serene beauty of these ancient giants.", + "locationName": "Glendeven Ranch or Molera Horseback Tours", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "big-sur", + "ref": "horseback-riding-through-redwoods", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_horseback-riding-through-redwoods.jpg" + }, + { + "name": "Stargazing at Pfeiffer Big Sur State Park", + "description": "Escape the city lights and experience the magic of stargazing in Big Sur. The clear night skies offer incredible views of constellations, planets, and even the Milky Way. Pfeiffer Big Sur State Park provides an ideal setting for this celestial wonder.", + "locationName": "Pfeiffer Big Sur State Park", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "big-sur", + "ref": "stargazing-at-pfeiffer-big-sur-state-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_stargazing-at-pfeiffer-big-sur-state-park.jpg" + }, + { + "name": "Bixby Creek Bridge Photography", + "description": "Capture the iconic Bixby Creek Bridge, an architectural marvel and one of the most photographed bridges in California. Visit at sunrise or sunset for breathtaking golden hour shots, or explore different angles and perspectives to create your own unique composition.", + "locationName": "Bixby Creek Bridge", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "big-sur", + "ref": "bixby-creek-bridge-photography", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_bixby-creek-bridge-photography.jpg" + }, + { + "name": "Explore the Point Sur Lightstation", + "description": "Step back in time with a tour of the historic Point Sur Lightstation. This beautifully preserved lighthouse offers stunning coastal views and a glimpse into the lives of lighthouse keepers. Guided tours provide fascinating insights into the maritime history and technology of the area.", + "locationName": "Point Sur Lightstation", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "big-sur", + "ref": "explore-the-point-sur-lightstation", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_explore-the-point-sur-lightstation.jpg" + }, + { + "name": "Wine Tasting at a Local Vineyard", + "description": "Indulge in the flavors of the Central Coast with a visit to a local vineyard. Several wineries in the Big Sur region offer tasting experiences, allowing you to sample a variety of wines while enjoying the picturesque vineyard landscapes. ", + "locationName": "Big Sur Vineyards or De Tierra Vineyards", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "big-sur", + "ref": "wine-tasting-at-a-local-vineyard", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_wine-tasting-at-a-local-vineyard.jpg" + }, + { + "name": "Surf's Up at Sand Dollar Beach", + "description": "Catch some waves and experience the thrill of surfing at Sand Dollar Beach, known for its consistent swells and stunning coastal views. Whether you're a seasoned surfer or a beginner eager to learn, local surf schools offer lessons and equipment rentals to get you started on your surfing adventure.", + "locationName": "Sand Dollar Beach", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "big-sur", + "ref": "surf-s-up-at-sand-dollar-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_surf-s-up-at-sand-dollar-beach.jpg" + }, + { + "name": "Explore the Underwater World with a Scuba Diving Excursion", + "description": "Dive into the depths of the Pacific Ocean and discover the vibrant marine life that thrives beneath the surface. Join a guided scuba diving excursion to explore kelp forests, encounter colorful fish, and witness the wonders of the underwater ecosystem.", + "locationName": "Monterey Bay", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "big-sur", + "ref": "explore-the-underwater-world-with-a-scuba-diving-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_explore-the-underwater-world-with-a-scuba-diving-excursion.jpg" + }, + { + "name": "Biking the Big Sur Coastline", + "description": "Embark on a scenic bike ride along the Pacific Coast Highway, pedaling past breathtaking ocean vistas, towering cliffs, and charming coastal towns. Rent a bike and explore at your own pace, or join a guided cycling tour for a more informative and social experience.", + "locationName": "Pacific Coast Highway", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "big-sur", + "ref": "biking-the-big-sur-coastline", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_biking-the-big-sur-coastline.jpg" + }, + { + "name": "Indulge in a Gourmet Food Tour", + "description": "Tantalize your taste buds with a culinary journey through Big Sur's renowned restaurants and local eateries. Embark on a guided food tour to sample fresh seafood, farm-to-table cuisine, and other regional delicacies, while learning about the area's culinary scene and cultural influences.", + "locationName": "Various locations in Big Sur", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 4, + "destinationRef": "big-sur", + "ref": "indulge-in-a-gourmet-food-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_indulge-in-a-gourmet-food-tour.jpg" + }, + { + "name": "Soar Through the Skies on a Helicopter Tour", + "description": "Experience the awe-inspiring beauty of Big Sur from a whole new perspective with a thrilling helicopter tour. Soar above the rugged coastline, redwood forests, and cascading waterfalls, capturing breathtaking aerial views and creating unforgettable memories.", + "locationName": "Monterey Regional Airport", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "big-sur", + "ref": "soar-through-the-skies-on-a-helicopter-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/big-sur_soar-through-the-skies-on-a-helicopter-tour.jpg" + }, + { + "name": "Overwater Bungalow Luxury", + "description": "Indulge in the quintessential Bora Bora experience by staying in an overwater bungalow. Wake up to breathtaking views of the turquoise lagoon, step directly into the crystal-clear waters from your private deck, and enjoy unparalleled privacy and tranquility. Many bungalows feature glass floors for observing marine life below, and some offer private plunge pools or direct access to the lagoon for snorkeling or kayaking.", + "locationName": "Luxury resorts around Bora Bora", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "bora-bora", + "ref": "overwater-bungalow-luxury", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_overwater-bungalow-luxury.jpg" + }, + { + "name": "Snorkeling in Coral Gardens", + "description": "Explore the vibrant underwater world of Bora Bora's coral reefs. Numerous snorkeling spots around the island offer opportunities to encounter colorful fish, graceful manta rays, and even gentle sharks. Popular locations include the Coral Gardens, where shallow waters teem with marine life, and the Lagoonarium, a natural aquarium with a diverse array of species.", + "locationName": "Coral Gardens, Lagoonarium", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "bora-bora", + "ref": "snorkeling-in-coral-gardens", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_snorkeling-in-coral-gardens.jpg" + }, + { + "name": "Mount Otemanu Hike", + "description": "Embark on a challenging yet rewarding hike to the summit of Mount Otemanu, Bora Bora's iconic extinct volcano. The panoramic views from the top are simply breathtaking, offering a 360-degree perspective of the island, lagoon, and surrounding motus. This hike is best suited for experienced individuals due to its steep and rugged terrain.", + "locationName": "Mount Otemanu", + "duration": 5, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "bora-bora", + "ref": "mount-otemanu-hike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_mount-otemanu-hike.jpg" + }, + { + "name": "Sunset Cruise and Polynesian Dinner", + "description": "Set sail on a romantic sunset cruise around the lagoon, enjoying the vibrant colors painting the sky as the sun dips below the horizon. Many cruises include a delicious Polynesian dinner featuring local delicacies and traditional entertainment, such as fire dancers and live music. This experience offers a perfect blend of relaxation, stunning scenery, and cultural immersion.", + "locationName": "Bora Bora Lagoon", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "bora-bora", + "ref": "sunset-cruise-and-polynesian-dinner", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_sunset-cruise-and-polynesian-dinner.jpg" + }, + { + "name": "Island Jeep Safari", + "description": "Explore the interior of Bora Bora on an adventurous jeep safari. Traverse rugged terrain, visit historical sites like ancient temples and WWII remnants, and discover hidden viewpoints offering panoramic vistas. Learn about the island's flora, fauna, and Polynesian culture from knowledgeable guides as you venture off the beaten path.", + "locationName": "Bora Bora interior", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "bora-bora", + "ref": "island-jeep-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_island-jeep-safari.jpg" + }, + { + "name": "Lagoonarium de Bora Bora", + "description": "Embark on an unforgettable underwater adventure at the Lagoonarium de Bora Bora, a natural aquarium nestled within the lagoon. This eco-friendly sanctuary allows you to swim alongside stingrays, blacktip reef sharks, turtles, and a kaleidoscope of tropical fish in their natural habitat. Knowledgeable guides provide insights into the marine ecosystem, making it a fun and educational experience for all ages.", + "locationName": "Lagoonarium de Bora Bora", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "bora-bora", + "ref": "lagoonarium-de-bora-bora", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_lagoonarium-de-bora-bora.jpg" + }, + { + "name": "Bora Bora Turtle Center", + "description": "Visit the Bora Bora Turtle Center at Le Méridien Bora Bora resort and witness the incredible conservation efforts dedicated to protecting sea turtles. Observe these gentle creatures up close, learn about their life cycle, and even participate in feeding them. This heartwarming experience is perfect for families and those passionate about marine life.", + "locationName": "Le Méridien Bora Bora", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "bora-bora", + "ref": "bora-bora-turtle-center", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_bora-bora-turtle-center.jpg" + }, + { + "name": "Romantic Private Motu Picnic", + "description": "Indulge in a secluded and romantic experience with a private motu picnic. Escape to your own tiny islet surrounded by turquoise waters and enjoy a gourmet picnic basket filled with delectable treats. Bask in the sun, swim in the crystal-clear lagoon, and create unforgettable memories with your loved one.", + "locationName": "Various motu (islets) around Bora Bora", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "bora-bora", + "ref": "romantic-private-motu-picnic", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_romantic-private-motu-picnic.jpg" + }, + { + "name": "Vaitape Village Exploration", + "description": "Immerse yourself in the local culture with a visit to Vaitape, Bora Bora's main village. Explore the charming streets lined with shops selling Polynesian crafts, pearls, and souvenirs. Visit the local church, sample delicious Polynesian cuisine at family-run restaurants, and interact with friendly locals to get a glimpse into their way of life.", + "locationName": "Vaitape Village", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "bora-bora", + "ref": "vaitape-village-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_vaitape-village-exploration.jpg" + }, + { + "name": "Sunset Paddleboarding or Kayaking", + "description": "Experience the magic of a Bora Bora sunset from a unique perspective with a paddleboarding or kayaking excursion. Glide across the calm lagoon waters as the sky transforms into a canvas of vibrant colors. Witness the silhouette of Mount Otemanu against the setting sun, creating a truly breathtaking and unforgettable moment.", + "locationName": "Various locations around the lagoon", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "bora-bora", + "ref": "sunset-paddleboarding-or-kayaking", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_sunset-paddleboarding-or-kayaking.jpg" + }, + { + "name": "Parasailing Over the Lagoon", + "description": "Soar high above the crystal-clear waters of Bora Bora's lagoon and take in breathtaking panoramic views of the island and surrounding motus. Feel the wind in your hair as you glide through the air, enjoying a unique perspective of this tropical paradise.", + "locationName": "Bora Bora Lagoon", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "bora-bora", + "ref": "parasailing-over-the-lagoon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_parasailing-over-the-lagoon.jpg" + }, + { + "name": "Jet Ski Adventure to Hidden Coves", + "description": "Embark on an exhilarating jet ski tour around the island, discovering secluded coves and hidden beaches inaccessible by foot. Zip through the turquoise waters, feeling the spray of the ocean and the thrill of adventure.", + "locationName": "Various locations around Bora Bora", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "bora-bora", + "ref": "jet-ski-adventure-to-hidden-coves", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_jet-ski-adventure-to-hidden-coves.jpg" + }, + { + "name": "Deep-Sea Fishing Excursion", + "description": "Test your angling skills on a deep-sea fishing adventure, departing from Bora Bora's shores. Cast your line and try your luck at catching marlin, tuna, mahi-mahi, and other prized fish. Enjoy the thrill of the chase and the satisfaction of reeling in your catch.", + "locationName": "Pacific Ocean surrounding Bora Bora", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "bora-bora", + "ref": "deep-sea-fishing-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_deep-sea-fishing-excursion.jpg" + }, + { + "name": " Polynesian Dance Performance and Fire Show", + "description": "Immerse yourself in the vibrant Polynesian culture with a captivating dance performance and fire show. Witness the graceful movements of the dancers, the rhythmic beats of the drums, and the mesmerizing fire displays, experiencing the true essence of the islands.", + "locationName": "Various resorts and cultural venues", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "bora-bora", + "ref": "-polynesian-dance-performance-and-fire-show", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_-polynesian-dance-performance-and-fire-show.jpg" + }, + { + "name": "Private Island Hopping by Boat", + "description": "Charter a private boat and embark on a personalized island-hopping adventure around the Bora Bora lagoon. Explore secluded motus, snorkel in pristine coral gardens, and enjoy a picnic lunch on a deserted beach, relishing the freedom and exclusivity of your own island escape.", + "locationName": "Bora Bora Lagoon and surrounding motus", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "bora-bora", + "ref": "private-island-hopping-by-boat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_private-island-hopping-by-boat.jpg" + }, + { + "name": "Bora Bora Lagoonarium Eco-Tour", + "description": "Embark on a unique and educational journey to the Lagoonarium, a natural aquarium located within the Bora Bora lagoon. Snorkel alongside an array of marine life, including stingrays, sharks, turtles, and colorful fish. Learn about the delicate ecosystem of the lagoon and the importance of conservation efforts from knowledgeable guides.", + "locationName": "Lagoonarium de Bora Bora", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "bora-bora", + "ref": "bora-bora-lagoonarium-eco-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_bora-bora-lagoonarium-eco-tour.jpg" + }, + { + "name": "Matira Beach Relaxation and Watersports", + "description": "Indulge in the ultimate beach day at Matira Beach, renowned for its powdery white sand and crystal-clear waters. Unwind under the shade of palm trees, swim in the refreshing lagoon, or try exciting watersports such as stand-up paddleboarding, kayaking, or windsurfing. Beachside cafes and restaurants offer delicious refreshments and local cuisine.", + "locationName": "Matira Beach", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "bora-bora", + "ref": "matira-beach-relaxation-and-watersports", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_matira-beach-relaxation-and-watersports.jpg" + }, + { + "name": "Mount Pahia Hiking Adventure", + "description": "Challenge yourself with a hike to the summit of Mount Pahia, the highest point on Bora Bora. Enjoy breathtaking panoramic views of the lagoon, motus, and surrounding islands. This moderately strenuous hike takes you through lush rainforests and rewards you with unforgettable vistas at the top.", + "locationName": "Mount Pahia", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 2, + "destinationRef": "bora-bora", + "ref": "mount-pahia-hiking-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_mount-pahia-hiking-adventure.jpg" + }, + { + "name": "Polynesian Cooking Class and Cultural Immersion", + "description": "Delve into the heart of Polynesian culture with a hands-on cooking class. Learn to prepare traditional dishes using fresh local ingredients, such as poisson cru (marinated fish), taro root, and breadfruit. Discover the secrets of Polynesian cuisine and enjoy a delicious feast of your own creations.", + "locationName": "Local village or resort", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "bora-bora", + "ref": "polynesian-cooking-class-and-cultural-immersion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_polynesian-cooking-class-and-cultural-immersion.jpg" + }, + { + "name": "Stargazing on a Secluded Motu", + "description": "Escape the city lights and embark on a magical stargazing experience on a private motu. With minimal light pollution, the night sky above Bora Bora comes alive with countless stars and constellations. Learn about Polynesian navigation techniques and celestial legends from a local guide.", + "locationName": "Private motu", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 4, + "destinationRef": "bora-bora", + "ref": "stargazing-on-a-secluded-motu", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bora-bora_stargazing-on-a-secluded-motu.jpg" + }, + { + "name": "Mokoro Safari Excursion", + "description": "Embark on a tranquil mokoro (traditional dugout canoe) safari through the serene waterways of the Okavango Delta. Glide past lush vegetation, encountering elephants, hippos, crocodiles, and a myriad of bird species in their natural habitat. Your experienced guide will share insights into the delta's ecosystem and the fascinating wildlife that call it home.", + "locationName": "Okavango Delta waterways", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "botswana", + "ref": "mokoro-safari-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_mokoro-safari-excursion.jpg" + }, + { + "name": "Wildlife Safari Game Drive", + "description": "Venture into the heart of the Okavango Delta on an exhilarating 4x4 game drive. Led by expert guides, you'll track lions, leopards, elephants, buffalo, and other iconic African animals. Witness the drama of the wild unfold before your eyes, capturing incredible photographs and creating unforgettable memories.", + "locationName": "Moremi Game Reserve or private concessions", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "botswana", + "ref": "wildlife-safari-game-drive", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_wildlife-safari-game-drive.jpg" + }, + { + "name": "Scenic Helicopter Flight", + "description": "Take to the skies on a breathtaking helicopter flight over the Okavango Delta. Marvel at the vastness of the delta, its intricate network of waterways, and the abundance of wildlife from a unique aerial perspective. This unforgettable experience offers a true appreciation for the scale and beauty of this natural wonder.", + "locationName": "Various departure points within the delta", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "botswana", + "ref": "scenic-helicopter-flight", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_scenic-helicopter-flight.jpg" + }, + { + "name": "Bushwalk with San Bushmen", + "description": "Immerse yourself in the ancient culture of the San Bushmen, the indigenous people of the Kalahari Desert. Join them on a guided bushwalk, learning about their traditional hunting techniques, survival skills, and deep connection with the natural world. This cultural experience offers a unique perspective on the history and heritage of the region.", + "locationName": "Specific cultural villages or camps", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "botswana", + "ref": "bushwalk-with-san-bushmen", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_bushwalk-with-san-bushmen.jpg" + }, + { + "name": "Stargazing Experience", + "description": "Escape the city lights and immerse yourself in the dazzling night sky of the Okavango Delta. With minimal light pollution, the stars shine with exceptional brilliance. Join a guided stargazing session to learn about constellations, planets, and the wonders of the universe.", + "locationName": "Open areas within lodges or camps", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "botswana", + "ref": "stargazing-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_stargazing-experience.jpg" + }, + { + "name": "Horseback Safari", + "description": "Embark on a unique and exhilarating horseback safari, traversing the diverse landscapes of the delta. Experienced guides will lead you through floodplains, grasslands, and woodlands, allowing you to get up close to wildlife like giraffes, zebras, and antelopes. This eco-friendly activity offers a different perspective on the delta's beauty and allows you to connect with nature in a special way.", + "locationName": "Okavango Delta Horse Safaris", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "botswana", + "ref": "horseback-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_horseback-safari.jpg" + }, + { + "name": "Bird Watching Excursion", + "description": "The Okavango Delta is a birdwatcher's paradise, home to over 400 species of birds. Join a guided bird watching excursion led by expert ornithologists who will help you spot and identify a variety of feathered wonders, from the majestic African fish eagle to the colorful lilac-breasted roller. Learn about their unique behaviors, habitats, and the importance of bird conservation in the delta.", + "locationName": "Okavango Panhandle", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "botswana", + "ref": "bird-watching-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_bird-watching-excursion.jpg" + }, + { + "name": "Fishing Expedition", + "description": "Cast your line and experience the thrill of fishing in the pristine waters of the Okavango Delta. Target species like tigerfish, bream, and catfish, known for their fighting spirit and delicious taste. Whether you're a seasoned angler or a novice, local guides will provide the necessary equipment and expertise to ensure a memorable fishing adventure.", + "locationName": "Okavango River", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "botswana", + "ref": "fishing-expedition", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_fishing-expedition.jpg" + }, + { + "name": "Cultural Village Visit", + "description": "Immerse yourself in the rich cultural heritage of the local communities living in the Okavango Delta region. Visit a traditional village and interact with the friendly people, learning about their customs, traditions, and way of life. Enjoy traditional music and dance performances, sample local cuisine, and gain a deeper appreciation for the cultural diversity of Botswana.", + "locationName": "Local Villages", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "botswana", + "ref": "cultural-village-visit", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_cultural-village-visit.jpg" + }, + { + "name": "Sunset Cruise with Traditional Dinner", + "description": "Experience the magic of the Okavango Delta at sunset with a leisurely cruise along its serene waterways. As the sun dips below the horizon, painting the sky with vibrant hues, savor a delicious traditional dinner prepared with local ingredients. Enjoy the tranquil atmosphere, observe nocturnal wildlife, and create unforgettable memories under the African night sky.", + "locationName": "Okavango Delta waterways", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "botswana", + "ref": "sunset-cruise-with-traditional-dinner", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_sunset-cruise-with-traditional-dinner.jpg" + }, + { + "name": "Quad Biking Adventure", + "description": "Embark on an adrenaline-pumping quad biking adventure through the rugged terrains of the Okavango Delta. Traverse sand dunes, navigate through bush trails, and experience the thrill of off-road exploration while taking in the breathtaking scenery.", + "locationName": "Okavango Delta", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "botswana", + "ref": "quad-biking-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_quad-biking-adventure.jpg" + }, + { + "name": "Hot Air Balloon Safari", + "description": "Soar above the Okavango Delta in a hot air balloon and witness the majesty of the landscape from a unique perspective. Drift silently over the floodplains, savannas, and waterways, observing wildlife and enjoying panoramic views as the sun rises or sets.", + "locationName": "Okavango Delta", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "botswana", + "ref": "hot-air-balloon-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_hot-air-balloon-safari.jpg" + }, + { + "name": "Photographic Safari", + "description": "Join a specialized photographic safari designed for capturing the incredible wildlife and landscapes of the Okavango Delta. Learn from experienced guides and photographers, receiving expert tips and guidance on capturing stunning images of elephants, lions, birds, and more.", + "locationName": "Okavango Delta", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "botswana", + "ref": "photographic-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_photographic-safari.jpg" + }, + { + "name": "Scenic Helicopter Flight", + "description": "Take to the skies on a scenic helicopter flight over the Okavango Delta, offering unparalleled aerial views of the intricate waterways, islands, and wildlife. Marvel at the vastness of the delta and capture breathtaking photographs from above.", + "locationName": "Okavango Delta", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "botswana", + "ref": "scenic-helicopter-flight", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_scenic-helicopter-flight.jpg" + }, + { + "name": "Traditional Makoro Excursion", + "description": "Glide through the serene waterways of the Okavango Delta in a traditional makoro (dugout canoe) and experience the tranquility of the delta up close. Observe the abundant birdlife, encounter hippos and crocodiles, and learn about the unique ecosystem from local guides.", + "locationName": "Okavango Delta", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "botswana", + "ref": "traditional-makoro-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_traditional-makoro-excursion.jpg" + }, + { + "name": "Elephant Interaction Experience", + "description": "Get up close and personal with orphaned elephants at a sanctuary dedicated to their rehabilitation and conservation. Learn about their behavior, biology, and the challenges they face in the wild. You might even have the opportunity to feed and interact with these gentle giants, creating unforgettable memories.", + "locationName": "Elephant sanctuary within the Okavango Delta", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "botswana", + "ref": "elephant-interaction-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_elephant-interaction-experience.jpg" + }, + { + "name": "Sleep-Out Under the Stars", + "description": "Embark on an overnight adventure to a secluded platform nestled deep within the delta. Enjoy a delicious bush dinner cooked over an open fire, share stories under the starry sky, and drift off to sleep surrounded by the sounds of the African wilderness. Wake up to breathtaking sunrise views and the chance to spot wildlife as they begin their day.", + "locationName": "Remote location within the Okavango Delta", + "duration": 24, + "timeOfDay": "night", + "familyFriendly": false, + "price": 4, + "destinationRef": "botswana", + "ref": "sleep-out-under-the-stars", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_sleep-out-under-the-stars.jpg" + }, + { + "name": "Guided Nature Walk", + "description": "Join a knowledgeable local guide on a walking safari through the diverse ecosystems of the delta. Discover hidden trails, learn about medicinal plants and their uses, track animal footprints, and gain a deeper understanding of the intricate web of life that exists within this unique environment.", + "locationName": "Various locations within the Okavango Delta", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "botswana", + "ref": "guided-nature-walk", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_guided-nature-walk.jpg" + }, + { + "name": "Traditional Fishing with Locals", + "description": "Immerse yourself in the local culture by joining villagers on a traditional fishing trip. Learn ancient techniques passed down through generations, using hand-crafted equipment and natural bait. Experience the thrill of the catch and gain insight into the sustainable fishing practices that have sustained the communities of the delta for centuries.", + "locationName": "Local village near the Okavango Delta", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "botswana", + "ref": "traditional-fishing-with-locals", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_traditional-fishing-with-locals.jpg" + }, + { + "name": "Bushcraft and Survival Skills Workshop", + "description": "Develop essential wilderness skills with a hands-on bushcraft and survival workshop. Learn how to build a fire, identify edible plants, navigate using natural landmarks, and construct basic shelters. This immersive experience will connect you with the natural world and equip you with valuable knowledge for future adventures.", + "locationName": "Wilderness area within the Okavango Delta", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "botswana", + "ref": "bushcraft-and-survival-skills-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/botswana_bushcraft-and-survival-skills-workshop.jpg" + }, + { + "name": "Canal Boat Tour", + "description": "Embark on a serene boat tour through Bruges' enchanting canals, often referred to as the 'Venice of the North.' Glide under picturesque bridges, past charming medieval houses, and soak in the city's unique atmosphere from a different perspective. Learn about Bruges' rich history and architecture from your guide as you admire the beauty of this UNESCO World Heritage Site.", + "locationName": "Bruges canals", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "bruges", + "ref": "canal-boat-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_canal-boat-tour.jpg" + }, + { + "name": "Markt Square Exploration", + "description": "Step into the heart of Bruges at the Markt, the historic main square. Marvel at the colorful guildhalls, the imposing Belfry tower, and the Provincial Court. Enjoy the lively atmosphere, browse the shops for souvenirs, or relax at a cafe and soak up the vibrant ambiance. Don't miss the chance to climb the Belfry for panoramic views of the city.", + "locationName": "Markt Square", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "bruges", + "ref": "markt-square-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_markt-square-exploration.jpg" + }, + { + "name": "Chocolate Tasting and Workshop", + "description": "Indulge your sweet tooth with a delightful chocolate tasting experience. Bruges is renowned for its exquisite Belgian chocolate, and numerous shops offer tastings and workshops. Learn about the history of chocolate making, discover the different types of chocolate, and even try your hand at creating your own delicious treats.", + "locationName": "Various chocolate shops", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "bruges", + "ref": "chocolate-tasting-and-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_chocolate-tasting-and-workshop.jpg" + }, + { + "name": "Groeningemuseum Visit", + "description": "Immerse yourself in the world of Flemish art at the Groeningemuseum. Explore a rich collection of paintings by renowned artists, including Jan van Eyck, Hans Memling, and Hieronymus Bosch. Admire masterpieces from the Flemish Primitives and learn about the evolution of art in the region. The museum offers a fascinating journey through Bruges' artistic heritage.", + "locationName": "Groeningemuseum", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "bruges", + "ref": "groeningemuseum-visit", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_groeningemuseum-visit.jpg" + }, + { + "name": "Horse-Drawn Carriage Ride", + "description": "Experience Bruges in a truly romantic way with a horse-drawn carriage ride. Snuggle up with your loved one as you travel through the cobbled streets and admire the city's charming architecture. This leisurely ride offers a unique perspective of Bruges and allows you to relax and enjoy the magical atmosphere.", + "locationName": "Markt Square and surrounding streets", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "bruges", + "ref": "horse-drawn-carriage-ride", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_horse-drawn-carriage-ride.jpg" + }, + { + "name": "Belgium Pierogi & Beer Pairing Experience", + "description": "Embark on a delectable journey for your taste buds with a unique pierogi and beer pairing experience. Sample a variety of traditional and modern pierogi, each expertly matched with a complementary Belgian beer, highlighting the diverse flavors of the region. Discover the art of pairing, learn about the brewing process, and enjoy a convivial atmosphere perfect for socializing and indulging in culinary delights.", + "locationName": "Local brewery or restaurant", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 3, + "destinationRef": "bruges", + "ref": "belgium-pierogi-beer-pairing-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_belgium-pierogi-beer-pairing-experience.jpg" + }, + { + "name": "Flemish Gastronomy Cooking Class", + "description": "Immerse yourself in the rich culinary traditions of Flanders with a hands-on cooking class. Learn to prepare classic Flemish dishes such as waterzooi, carbonnade flamande, or stoofvlees, under the guidance of a local chef. Discover the secrets of Flemish cuisine, from selecting fresh ingredients to mastering traditional cooking techniques. Enjoy the fruits of your labor with a delicious meal paired with local beers or wines.", + "locationName": "Cooking school or local home", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 4, + "destinationRef": "bruges", + "ref": "flemish-gastronomy-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_flemish-gastronomy-cooking-class.jpg" + }, + { + "name": "Minnewater Lake and Lover's Bridge Stroll", + "description": "Escape the bustling city center and enjoy a romantic stroll around the serene Minnewater Lake, also known as the 'Lake of Love'. Amble across the charming Lover's Bridge, shrouded in local legends and folklore, and soak in the picturesque scenery of the surrounding park. This tranquil setting is perfect for a leisurely walk, a picnic by the water, or simply enjoying a quiet moment with a loved one.", + "locationName": "Minnewater Park", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "bruges", + "ref": "minnewater-lake-and-lover-s-bridge-stroll", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_minnewater-lake-and-lover-s-bridge-stroll.jpg" + }, + { + "name": "Lacemaking Demonstration and Workshop", + "description": "Delve into the intricate world of Bruges' renowned lacemaking tradition with a visit to a local lace workshop. Witness skilled artisans demonstrating the delicate art of bobbin lacemaking, a centuries-old craft passed down through generations. Learn about the history and significance of lace in Bruges, and even try your hand at creating your own lace masterpiece with a hands-on workshop.", + "locationName": "Kantcentrum (Lace Centre)", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "bruges", + "ref": "lacemaking-demonstration-and-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_lacemaking-demonstration-and-workshop.jpg" + }, + { + "name": "Bike Tour through the Countryside", + "description": "Venture beyond the city walls and explore the idyllic Flemish countryside on a leisurely bike tour. Pedal along scenic paths, passing picturesque villages, verdant fields, and charming windmills. Discover hidden gems off the beaten path, breathe in the fresh air, and experience the tranquility of rural Flanders. Bike tours can be tailored to different fitness levels and interests, offering a unique perspective on the region's natural beauty.", + "locationName": "Bruges and surrounding countryside", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "bruges", + "ref": "bike-tour-through-the-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_bike-tour-through-the-countryside.jpg" + }, + { + "name": "Climb the Belfry of Bruges for Panoramic Views", + "description": "Ascend the 366 steps of the iconic Belfry of Bruges, a medieval bell tower that offers breathtaking panoramic views of the city and surrounding countryside. Learn about the history and significance of the bell tower while enjoying a unique perspective of Bruges' charming canals, cobblestone streets, and historic buildings.", + "locationName": "Markt Square", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "bruges", + "ref": "climb-the-belfry-of-bruges-for-panoramic-views", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_climb-the-belfry-of-bruges-for-panoramic-views.jpg" + }, + { + "name": "Indulge in a Belgian Beer Tasting Experience", + "description": "Immerse yourself in Belgium's renowned beer culture with a guided tasting experience at a local brewery or pub. Sample a variety of traditional Belgian beers, from Trappist ales to lambics, and learn about the brewing process, history, and unique flavors of each style. This activity is perfect for beer enthusiasts and those looking to discover the local flavors.", + "locationName": "Various breweries and pubs", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "bruges", + "ref": "indulge-in-a-belgian-beer-tasting-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_indulge-in-a-belgian-beer-tasting-experience.jpg" + }, + { + "name": "Explore the Historic Beguinage", + "description": "Step into the serene and historic Beguinage, a UNESCO World Heritage site that was once home to a community of religious women. Wander through the peaceful courtyard, admire the white-washed houses, and learn about the unique history and traditions of the Beguines. This tranquil oasis offers a respite from the bustling city and a glimpse into Bruges' past.", + "locationName": "Beguinage", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "bruges", + "ref": "explore-the-historic-beguinage", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_explore-the-historic-beguinage.jpg" + }, + { + "name": "Enjoy a Romantic Evening Canal Cruise", + "description": "Experience the enchanting beauty of Bruges at dusk with a romantic evening canal cruise. Glide along the illuminated waterways, admiring the city's historic buildings and bridges bathed in soft light. Enjoy the peaceful ambiance, learn about the city's history from your guide, and create lasting memories with your loved one.", + "locationName": "Bruges canals", + "duration": 1.5, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "bruges", + "ref": "enjoy-a-romantic-evening-canal-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_enjoy-a-romantic-evening-canal-cruise.jpg" + }, + { + "name": "Day Trip to Ghent", + "description": "Embark on a delightful day trip to the nearby city of Ghent, another historical gem in Flanders. Explore the Gravensteen castle, a medieval fortress dating back to the 12th century, and admire the Ghent Altarpiece in St. Bavo's Cathedral. Wander along the Graslei, a picturesque waterfront lined with guildhalls, and soak up the vibrant atmosphere of this charming city.", + "locationName": "Ghent", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "bruges", + "ref": "day-trip-to-ghent", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_day-trip-to-ghent.jpg" + }, + { + "name": "Concert at the Concertgebouw", + "description": "Experience the magic of live music at the Concertgebouw, a renowned concert hall known for its exceptional acoustics and diverse program. Choose from classical concerts, jazz performances, world music, or contemporary shows, and immerse yourself in the cultural richness of Bruges.", + "locationName": "Concertgebouw", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "bruges", + "ref": "concert-at-the-concertgebouw", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_concert-at-the-concertgebouw.jpg" + }, + { + "name": "Frites and Beer Pairing", + "description": "Indulge in a quintessential Belgian experience with a frites and beer pairing. Sample a variety of crispy, golden fries from a local frituur, accompanied by a selection of craft beers from renowned Belgian breweries. Discover the perfect combinations of flavors and textures, and savor the authentic taste of Bruges.", + "locationName": "Local frituur and brewery", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "bruges", + "ref": "frites-and-beer-pairing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_frites-and-beer-pairing.jpg" + }, + { + "name": "Explore the Frietmuseum", + "description": "Delve into the fascinating history of the humble potato fry at the Frietmuseum, the world's only museum dedicated to fries. Learn about the origins of this beloved dish, its cultural significance, and the various ways it is prepared around the world. Enjoy interactive exhibits and, of course, a tasting of delicious Belgian fries.", + "locationName": "Frietmuseum", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "bruges", + "ref": "explore-the-frietmuseum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_explore-the-frietmuseum.jpg" + }, + { + "name": "Hot Air Balloon Ride over Bruges", + "description": "Soar above the enchanting city of Bruges in a hot air balloon and witness breathtaking panoramic views of its medieval rooftops, winding canals, and picturesque countryside. Enjoy a unique perspective of this historic city as you drift peacefully through the sky, creating an unforgettable memory.", + "locationName": "Bruges Countryside", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "bruges", + "ref": "hot-air-balloon-ride-over-bruges", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/bruges_hot-air-balloon-ride-over-bruges.jpg" + }, + { + "name": "Immerse Yourself in the Water Village of Kampong Ayer", + "description": "Embark on a boat tour through the fascinating water village of Kampong Ayer, often called the \"Venice of the East.\" Explore the intricate network of stilt houses, witness the daily life of the locals, and visit museums and shops showcasing traditional crafts.", + "locationName": "Kampong Ayer", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "brunei", + "ref": "immerse-yourself-in-the-water-village-of-kampong-ayer", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_immerse-yourself-in-the-water-village-of-kampong-ayer.jpg" + }, + { + "name": "Marvel at the Majesty of Sultan Omar Ali Saifuddin Mosque", + "description": "Visit the iconic Sultan Omar Ali Saifuddin Mosque, an architectural masterpiece with a golden dome and intricate mosaics. Explore the serene interior, admire the stunning views of the Brunei River, and learn about the significance of this religious landmark.", + "locationName": "Sultan Omar Ali Saifuddin Mosque", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "brunei", + "ref": "marvel-at-the-majesty-of-sultan-omar-ali-saifuddin-mosque", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_marvel-at-the-majesty-of-sultan-omar-ali-saifuddin-mosque.jpg" + }, + { + "name": "Venture into the Ulu Temburong National Park", + "description": "Embark on a thrilling adventure into the heart of the Borneo rainforest at Ulu Temburong National Park. Hike through lush trails, discover hidden waterfalls, climb the canopy walkway for breathtaking views, and encounter diverse wildlife.", + "locationName": "Ulu Temburong National Park", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "brunei", + "ref": "venture-into-the-ulu-temburong-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_venture-into-the-ulu-temburong-national-park.jpg" + }, + { + "name": "Delve into Brunei's Royal Heritage at the Royal Regalia Museum", + "description": "Explore the Royal Regalia Museum, home to a vast collection of treasures and artifacts showcasing the history and grandeur of the Brunei Sultanate. Admire the Sultan's coronation chariot, jeweled weaponry, and exquisite gifts from dignitaries around the world.", + "locationName": "Royal Regalia Museum", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "brunei", + "ref": "delve-into-brunei-s-royal-heritage-at-the-royal-regalia-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_delve-into-brunei-s-royal-heritage-at-the-royal-regalia-museum.jpg" + }, + { + "name": "Experience Tranquility at the Istana Nurul Iman", + "description": "While entry inside is limited to special occasions, admiring the Istana Nurul Iman from the outside is an experience in itself. Capture the grandeur of the world's largest residential palace, a symbol of Brunei's royal heritage and architectural splendor.", + "locationName": "Istana Nurul Iman", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "brunei", + "ref": "experience-tranquility-at-the-istana-nurul-iman", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_experience-tranquility-at-the-istana-nurul-iman.jpg" + }, + { + "name": "Proboscis Monkey River Safari", + "description": "Embark on a captivating river cruise through the mangrove forests of Brunei, keeping an eye out for the iconic proboscis monkeys with their distinctive noses. Witness these fascinating primates in their natural habitat and observe other wildlife, like crocodiles and various bird species.", + "locationName": "Brunei River or Temburong River", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "brunei", + "ref": "proboscis-monkey-river-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_proboscis-monkey-river-safari.jpg" + }, + { + "name": "Gadong Night Market", + "description": "Experience the vibrant atmosphere of the Gadong Night Market, a bustling hub of local life. Browse through an array of stalls offering delicious street food, fresh produce, clothing, souvenirs, and more. This is a great place to immerse yourself in the local culture and indulge in authentic Bruneian flavors.", + "locationName": "Gadong", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "brunei", + "ref": "gadong-night-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_gadong-night-market.jpg" + }, + { + "name": "Tasek Lama Recreational Park", + "description": "Escape the city bustle and enjoy the tranquility of Tasek Lama Recreational Park. Hike or bike through the lush rainforest trails, discover hidden waterfalls, and visit the serene Tasek Lama Lake. The park also features picnic areas, playgrounds, and a swimming pool, making it perfect for a family outing.", + "locationName": "Tasek Lama Recreational Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "brunei", + "ref": "tasek-lama-recreational-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_tasek-lama-recreational-park.jpg" + }, + { + "name": "Jerudong Park Playground", + "description": "Spend a fun-filled day at Jerudong Park Playground, Brunei's largest and most popular amusement park. Enjoy thrilling rides, entertaining shows, and various attractions suitable for all ages. The park also features beautifully landscaped gardens and a musical fountain, providing a delightful experience for the whole family.", + "locationName": "Jerudong Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "brunei", + "ref": "jerudong-park-playground", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_jerudong-park-playground.jpg" + }, + { + "name": "Ulu Temburong National Park Canopy Walk", + "description": "Embark on an exhilarating canopy walk adventure in the heart of Ulu Temburong National Park. Ascend to the rainforest canopy via a series of suspended walkways and bridges, offering breathtaking panoramic views of the pristine rainforest and its diverse flora and fauna.", + "locationName": "Ulu Temburong National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "brunei", + "ref": "ulu-temburong-national-park-canopy-walk", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_ulu-temburong-national-park-canopy-walk.jpg" + }, + { + "name": "Explore the Seria Energy Lab", + "description": "Dive into the world of energy at the Seria Energy Lab, an interactive museum showcasing Brunei's oil and gas industry. Learn about the science behind energy production, the history of Brunei's oil reserves, and the future of sustainable energy solutions.", + "locationName": "Seria", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "brunei", + "ref": "explore-the-seria-energy-lab", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_explore-the-seria-energy-lab.jpg" + }, + { + "name": "Go Birdwatching in the Mangrove Forests", + "description": "Embark on a guided tour through the lush mangrove forests of Brunei, a haven for diverse bird species. Spot colorful kingfishers, majestic eagles, and playful monkeys while learning about the importance of these ecosystems.", + "locationName": "Mangrove forests around Brunei Bay", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "brunei", + "ref": "go-birdwatching-in-the-mangrove-forests", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_go-birdwatching-in-the-mangrove-forests.jpg" + }, + { + "name": "Discover Local Crafts at the Arts and Handicrafts Training Center", + "description": "Immerse yourself in Brunei's artistic heritage at the Arts and Handicrafts Training Center. Witness skilled artisans crafting traditional textiles, silverware, and wood carvings. You can even purchase unique souvenirs to support local craftsmanship.", + "locationName": "Bandar Seri Begawan", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "brunei", + "ref": "discover-local-crafts-at-the-arts-and-handicrafts-training-center", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_discover-local-crafts-at-the-arts-and-handicrafts-training-center.jpg" + }, + { + "name": "Relax on the Pristine Beaches of Tutong", + "description": "Escape the bustle and unwind on the tranquil beaches of Tutong. Sunbathe on the golden sands, take a refreshing dip in the turquoise waters, or simply enjoy a peaceful stroll along the coastline. The serene atmosphere is perfect for relaxation and rejuvenation.", + "locationName": "Tutong District", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "brunei", + "ref": "relax-on-the-pristine-beaches-of-tutong", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_relax-on-the-pristine-beaches-of-tutong.jpg" + }, + { + "name": "Indulge in a Culinary Journey", + "description": "Embark on a gastronomic adventure through Brunei's diverse culinary scene. Sample local delicacies like Ambuyat, Nasi Katok, and Satay at bustling markets or charming restaurants. Don't miss the chance to try unique flavors influenced by Malay, Chinese, and Indian cuisines.", + "locationName": "Various locations throughout Brunei", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "brunei", + "ref": "indulge-in-a-culinary-journey", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_indulge-in-a-culinary-journey.jpg" + }, + { + "name": "Go spelunking in the Gomantong Caves", + "description": "Embark on an adventurous journey into the depths of the Gomantong Caves, a renowned cave system famed for its swiftlet nests and diverse bat population. Witness the unique ecosystem within the caves and observe the fascinating interactions between these creatures and their environment. Opt for a guided tour to navigate the caves safely and learn about their geological significance and cultural importance.", + "locationName": "Gomantong Caves", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "brunei", + "ref": "go-spelunking-in-the-gomantong-caves", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_go-spelunking-in-the-gomantong-caves.jpg" + }, + { + "name": "Dive into the Shipwrecks of Brunei Bay", + "description": "Explore the underwater world of Brunei Bay, where several shipwrecks from World War II lie beneath the surface. Discover the historical significance of these wrecks as you encounter diverse marine life and coral reefs. Whether you're a seasoned diver or a beginner, numerous dive operators offer guided excursions suitable for various skill levels.", + "locationName": "Brunei Bay", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "brunei", + "ref": "dive-into-the-shipwrecks-of-brunei-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_dive-into-the-shipwrecks-of-brunei-bay.jpg" + }, + { + "name": "Shop for Unique Souvenirs at Tamu Kianggeh", + "description": "Immerse yourself in the vibrant atmosphere of Tamu Kianggeh, a bustling open-air market along the Brunei River. Discover a treasure trove of local handicrafts, fresh produce, and unique souvenirs. Engage with friendly vendors, sample traditional delicacies, and experience the authentic Bruneian way of life.", + "locationName": "Tamu Kianggeh", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "brunei", + "ref": "shop-for-unique-souvenirs-at-tamu-kianggeh", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_shop-for-unique-souvenirs-at-tamu-kianggeh.jpg" + }, + { + "name": "Take a Boat Trip to Pulau Selirong", + "description": "Escape to the tranquil island of Pulau Selirong, located off the coast of Brunei. Enjoy a scenic boat ride through the Brunei Bay, surrounded by lush mangroves and sparkling waters. Explore the island's pristine beaches, discover hidden coves, and relax amidst the serene natural beauty.", + "locationName": "Pulau Selirong", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "brunei", + "ref": "take-a-boat-trip-to-pulau-selirong", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_take-a-boat-trip-to-pulau-selirong.jpg" + }, + { + "name": "Tee off at the Empire Hotel and Country Club", + "description": "Indulge in a luxurious golfing experience at the Empire Hotel and Country Club, boasting a world-class 18-hole golf course designed by Jack Nicklaus. Enjoy the stunning coastal views as you navigate the challenging course, and afterward, unwind at the opulent hotel facilities.", + "locationName": "Empire Hotel and Country Club", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "brunei", + "ref": "tee-off-at-the-empire-hotel-and-country-club", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/brunei_tee-off-at-the-empire-hotel-and-country-club.jpg" + }, + { + "name": "Soak in the Szechenyi Thermal Baths", + "description": "Experience the ultimate relaxation at the iconic Szechenyi Thermal Baths, one of Europe's largest and most beautiful spa complexes. Immerse yourself in the warm, mineral-rich waters, enjoy a traditional massage, and admire the stunning neo-Baroque architecture.", + "locationName": "Szechenyi Thermal Baths", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "budapest", + "ref": "soak-in-the-szechenyi-thermal-baths", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_soak-in-the-szechenyi-thermal-baths.jpg" + }, + { + "name": "Explore Buda Castle and Fisherman's Bastion", + "description": "Step back in time with a visit to Buda Castle, a historic palace complex offering panoramic views of the city. Wander through the charming medieval streets, admire the Matthias Church, and capture breathtaking photos from the Fisherman's Bastion.", + "locationName": "Buda Castle District", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "budapest", + "ref": "explore-buda-castle-and-fisherman-s-bastion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_explore-buda-castle-and-fisherman-s-bastion.jpg" + }, + { + "name": "Cruise the Danube River at Sunset", + "description": "Embark on a romantic evening cruise along the Danube River and witness the city illuminate as the sun sets. Admire iconic landmarks like the Hungarian Parliament Building and Chain Bridge, while enjoying live music and a delicious dinner on board.", + "locationName": "Danube River", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "budapest", + "ref": "cruise-the-danube-river-at-sunset", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_cruise-the-danube-river-at-sunset.jpg" + }, + { + "name": "Discover Hungarian Cuisine on a Food Tour", + "description": "Embark on a culinary adventure through Budapest's vibrant food scene. Sample traditional Hungarian dishes like goulash, lángos, and chimney cake, and learn about the city's rich culinary history and local favorites.", + "locationName": "Various locations", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "budapest", + "ref": "discover-hungarian-cuisine-on-a-food-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_discover-hungarian-cuisine-on-a-food-tour.jpg" + }, + { + "name": "Visit the Hungarian Parliament Building", + "description": "Marvel at the architectural masterpiece that is the Hungarian Parliament Building, a stunning example of Gothic Revival style. Take a guided tour to learn about its history and admire the intricate details of its interior, including the Grand Staircase and the Hungarian Crown Jewels.", + "locationName": "Hungarian Parliament Building", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "budapest", + "ref": "visit-the-hungarian-parliament-building", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_visit-the-hungarian-parliament-building.jpg" + }, + { + "name": "Stroll Down Andrássy Avenue", + "description": "Take a leisurely walk down Andrássy Avenue, a UNESCO World Heritage Site, and admire the elegant architecture, luxury boutiques, and charming cafes. This grand boulevard, often compared to the Champs-Élysées, offers a glimpse into Budapest's opulent past and vibrant present.", + "locationName": "Andrássy Avenue", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "budapest", + "ref": "stroll-down-andr-ssy-avenue", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_stroll-down-andr-ssy-avenue.jpg" + }, + { + "name": "Visit the House of Terror", + "description": "Delve into Hungary's complex 20th-century history at the House of Terror museum. This thought-provoking museum housed in a former secret police headquarters documents the fascist and communist regimes, offering a powerful and moving experience.", + "locationName": "House of Terror", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "budapest", + "ref": "visit-the-house-of-terror", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_visit-the-house-of-terror.jpg" + }, + { + "name": "Enjoy Ruin Bars in the Jewish Quarter", + "description": "Experience Budapest's unique nightlife scene by exploring the ruin bars in the historic Jewish Quarter. These trendy bars, housed in abandoned buildings, offer a quirky and eclectic atmosphere with live music, art installations, and a vibrant crowd.", + "locationName": "Jewish Quarter", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "budapest", + "ref": "enjoy-ruin-bars-in-the-jewish-quarter", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_enjoy-ruin-bars-in-the-jewish-quarter.jpg" + }, + { + "name": "Explore Margaret Island", + "description": "Escape the city bustle and find tranquility on Margaret Island, a green oasis in the heart of the Danube. Rent a bike, enjoy a picnic, visit the Japanese Garden, or simply relax by the musical fountain.", + "locationName": "Margaret Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "budapest", + "ref": "explore-margaret-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_explore-margaret-island.jpg" + }, + { + "name": "Shop at the Great Market Hall", + "description": "Immerse yourself in the local culture at the Great Market Hall, a bustling marketplace offering a wide array of Hungarian products. Find fresh produce, local crafts, souvenirs, and traditional food specialties under its impressive roof.", + "locationName": "Great Market Hall", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "budapest", + "ref": "shop-at-the-great-market-hall", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_shop-at-the-great-market-hall.jpg" + }, + { + "name": "Take a Day Trip to Szentendre", + "description": "Escape the city bustle and journey to the charming town of Szentendre, a haven for artists and art enthusiasts. Wander through cobblestone streets lined with colorful houses, explore numerous art galleries and studios, and discover unique handcrafted souvenirs. Enjoy a leisurely lunch at a riverside restaurant, soaking in the idyllic atmosphere.", + "locationName": "Szentendre", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "budapest", + "ref": "take-a-day-trip-to-szentendre", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_take-a-day-trip-to-szentendre.jpg" + }, + { + "name": "Go Caving Beneath Buda Castle", + "description": "Embark on an underground adventure through the Pálvölgyi-Mátyáshegyi cave system, one of Europe's largest. Discover a hidden world of stalactites, stalagmites, and unique rock formations, while learning about the geological history of the area. This guided tour offers an exciting and educational experience for all ages.", + "locationName": "Pálvölgyi-Mátyáshegyi Caves", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "budapest", + "ref": "go-caving-beneath-buda-castle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_go-caving-beneath-buda-castle.jpg" + }, + { + "name": "Attend a Performance at the Hungarian State Opera House", + "description": "Experience the grandeur of the Hungarian State Opera House, a masterpiece of Neo-Renaissance architecture. Dress up for a special evening and enjoy a world-class opera or ballet performance in a breathtaking setting. Immerse yourself in the rich cultural heritage of Hungary through this unforgettable artistic experience.", + "locationName": "Hungarian State Opera House", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "budapest", + "ref": "attend-a-performance-at-the-hungarian-state-opera-house", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_attend-a-performance-at-the-hungarian-state-opera-house.jpg" + }, + { + "name": "Go Kayaking on the Danube", + "description": "See Budapest from a different perspective with a kayaking tour on the Danube River. Paddle past iconic landmarks like the Parliament Building and Buda Castle, while enjoying the fresh air and scenic views. This active experience is perfect for those seeking a unique and adventurous way to explore the city.", + "locationName": "Danube River", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "budapest", + "ref": "go-kayaking-on-the-danube", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_go-kayaking-on-the-danube.jpg" + }, + { + "name": "Delve into Hungarian History at the National Museum", + "description": "Embark on a captivating journey through Hungarian history at the Hungarian National Museum. Explore exhibits spanning from the Paleolithic era to the present day, showcasing archaeological artifacts, medieval weaponry, and captivating artwork. Gain insights into the country's rich cultural heritage and significant historical events.", + "locationName": "Hungarian National Museum", + "duration": 2.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "budapest", + "ref": "delve-into-hungarian-history-at-the-national-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_delve-into-hungarian-history-at-the-national-museum.jpg" + }, + { + "name": "Experience the Thrill of a Hungarian Folklore Show", + "description": "Immerse yourself in the vibrant energy of Hungarian folk culture with a captivating folklore show. Witness talented dancers and musicians showcasing traditional dances, music, and costumes, accompanied by the rhythmic sounds of the cimbalom. Enjoy an unforgettable evening of entertainment that celebrates the country's cultural heritage.", + "locationName": "Various venues throughout the city", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "budapest", + "ref": "experience-the-thrill-of-a-hungarian-folklore-show", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_experience-the-thrill-of-a-hungarian-folklore-show.jpg" + }, + { + "name": "Unwind in the Tranquil Buda Hills", + "description": "Escape the bustling city and venture into the serene Buda Hills. Hike or bike through scenic trails, breathe in the fresh air, and enjoy breathtaking panoramic views of Budapest. Discover hidden historical sites, charming cafes, and the iconic Elizabeth Lookout Tower.", + "locationName": "Buda Hills", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "budapest", + "ref": "unwind-in-the-tranquil-buda-hills", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_unwind-in-the-tranquil-buda-hills.jpg" + }, + { + "name": "Indulge in a Hungarian Wine Tasting Experience", + "description": "Embark on a sensory journey through Hungary's renowned wine regions. Visit a local winery or wine bar and savor a selection of exquisite Hungarian wines, from full-bodied reds to crisp whites. Learn about the unique characteristics of each region and the art of winemaking, while enjoying the company of fellow wine enthusiasts.", + "locationName": "Various wineries and wine bars", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "budapest", + "ref": "indulge-in-a-hungarian-wine-tasting-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_indulge-in-a-hungarian-wine-tasting-experience.jpg" + }, + { + "name": "Take a Day Trip to the Picturesque Town of Gödöllő", + "description": "Escape the city and journey to the charming town of Gödöllő, home to the magnificent Royal Palace of Gödöllő. Explore the opulent rooms and sprawling gardens of the palace, once a favorite summer residence of Empress Elisabeth of Austria. Discover the town's rich history and enjoy a leisurely stroll through its quaint streets.", + "locationName": "Gödöllő", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "budapest", + "ref": "take-a-day-trip-to-the-picturesque-town-of-g-d-ll-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/budapest_take-a-day-trip-to-the-picturesque-town-of-g-d-ll-.jpg" + }, + { + "name": "Wine Tasting Tour in Côte de Nuits", + "description": "Embark on a sensory journey through the prestigious Côte de Nuits wine region. Visit renowned vineyards, learn about the winemaking process from passionate vintners, and indulge in tastings of exceptional Pinot Noir and Chardonnay wines. Discover the unique terroir and the secrets behind Burgundy's world-class wines.", + "locationName": "Côte de Nuits vineyards", + "duration": 6, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "burgundy", + "ref": "wine-tasting-tour-in-c-te-de-nuits", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_wine-tasting-tour-in-c-te-de-nuits.jpg" + }, + { + "name": "Explore the Historic City of Dijon", + "description": "Wander through the charming streets of Dijon, the historic capital of Burgundy. Visit the Palace of the Dukes of Burgundy, a magnificent medieval complex, and admire the Gothic architecture of Dijon Cathedral. Explore the vibrant markets, sample local delicacies like Dijon mustard, and soak up the city's rich cultural heritage.", + "locationName": "Dijon", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "burgundy", + "ref": "explore-the-historic-city-of-dijon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_explore-the-historic-city-of-dijon.jpg" + }, + { + "name": "Cycling through the Vineyards", + "description": "Experience the beauty of the Burgundian countryside on a leisurely bike ride through rolling vineyards. Cycle along quiet roads, passing picturesque villages and charming wineries. Stop for picnics amidst the vines and enjoy breathtaking views of the landscape.", + "locationName": "Burgundian countryside", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "burgundy", + "ref": "cycling-through-the-vineyards", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_cycling-through-the-vineyards.jpg" + }, + { + "name": "Canal Cruise on the Canal de Bourgogne", + "description": "Relax and enjoy the scenic beauty of Burgundy on a leisurely canal cruise. Glide along the tranquil waters of the Canal de Bourgogne, passing through charming villages, lush vineyards, and historic sites. Savor delicious meals on board and admire the peaceful landscapes.", + "locationName": "Canal de Bourgogne", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "burgundy", + "ref": "canal-cruise-on-the-canal-de-bourgogne", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_canal-cruise-on-the-canal-de-bourgogne.jpg" + }, + { + "name": "Visit the Château de La Rochepot", + "description": "Step back in time at the Château de La Rochepot, a stunning medieval castle perched on a hilltop. Explore the castle's ramparts, towers, and dungeons, and admire the panoramic views of the surrounding countryside. Learn about the castle's fascinating history and immerse yourself in the medieval atmosphere.", + "locationName": "Château de La Rochepot", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "burgundy", + "ref": "visit-the-ch-teau-de-la-rochepot", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_visit-the-ch-teau-de-la-rochepot.jpg" + }, + { + "name": "Hot Air Balloon Ride over the Vineyards", + "description": "Soar above the picturesque vineyards of Burgundy in a hot air balloon, enjoying breathtaking panoramic views of rolling hills, charming villages, and sprawling estates. This unforgettable experience offers a unique perspective of the region's beauty and is perfect for a romantic occasion or a special celebration.", + "locationName": "Various locations in Burgundy", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "burgundy", + "ref": "hot-air-balloon-ride-over-the-vineyards", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_hot-air-balloon-ride-over-the-vineyards.jpg" + }, + { + "name": "Truffle Hunting Experience", + "description": "Embark on a guided truffle hunting adventure in the forests of Burgundy, accompanied by expert truffle hunters and their trained dogs. Learn about the fascinating world of truffles, from their growth and harvesting to their culinary uses. This immersive experience is a must for food enthusiasts and nature lovers alike.", + "locationName": "Côte-d'Or or Yonne", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "burgundy", + "ref": "truffle-hunting-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_truffle-hunting-experience.jpg" + }, + { + "name": "Kayaking on the Saône River", + "description": "Paddle along the scenic Saône River, enjoying the tranquility of the water and the beauty of the surrounding landscapes. Observe local wildlife, pass by charming villages, and stop for a picnic lunch on the riverbank. Kayaking is a fantastic way to explore Burgundy at your own pace and enjoy the outdoors.", + "locationName": "Saône River", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "burgundy", + "ref": "kayaking-on-the-sa-ne-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_kayaking-on-the-sa-ne-river.jpg" + }, + { + "name": "Cooking Class with a Local Chef", + "description": "Immerse yourself in the culinary traditions of Burgundy by participating in a cooking class led by a local chef. Learn the secrets of regional dishes, from classic Boeuf Bourguignon to delicate pastries. This hands-on experience is a delightful way to discover the flavors of Burgundy and enhance your culinary skills.", + "locationName": "Various locations in Burgundy", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "burgundy", + "ref": "cooking-class-with-a-local-chef", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_cooking-class-with-a-local-chef.jpg" + }, + { + "name": "Stargazing in the Burgundy Countryside", + "description": "Escape the city lights and experience the magic of stargazing in the pristine countryside of Burgundy. Join a guided stargazing tour or find a secluded spot to marvel at the constellations and planets. The clear night skies of Burgundy offer an unforgettable astronomical experience.", + "locationName": "Rural areas of Burgundy", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "burgundy", + "ref": "stargazing-in-the-burgundy-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_stargazing-in-the-burgundy-countryside.jpg" + }, + { + "name": "Hiking in the Morvan Regional Natural Park", + "description": "Escape the vineyards and immerse yourself in the natural beauty of the Morvan Regional Natural Park. Hike through lush forests, past sparkling lakes, and up to panoramic viewpoints. Keep an eye out for diverse wildlife, including deer, foxes, and birds of prey. This is a perfect way to experience the region's tranquil side and enjoy some fresh air.", + "locationName": "Morvan Regional Natural Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "burgundy", + "ref": "hiking-in-the-morvan-regional-natural-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_hiking-in-the-morvan-regional-natural-park.jpg" + }, + { + "name": "Explore the Hospices de Beaune", + "description": "Step back in time at the Hospices de Beaune, a magnificent 15th-century hospital complex. Admire the colorful glazed tile roofs, wander through the historic wards, and discover the fascinating history of this charitable institution. Don't miss the annual wine auction, a renowned event that supports the hospital's ongoing work.", + "locationName": "Beaune", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "burgundy", + "ref": "explore-the-hospices-de-beaune", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_explore-the-hospices-de-beaune.jpg" + }, + { + "name": "Visit the Abbaye de Fontenay", + "description": "Journey to the serene Abbaye de Fontenay, a UNESCO World Heritage Site and a masterpiece of Cistercian architecture. Explore the abbey church, cloister, dormitory, and gardens, and experience the peaceful atmosphere of this historic monastic community.", + "locationName": "Marmagne", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "burgundy", + "ref": "visit-the-abbaye-de-fontenay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_visit-the-abbaye-de-fontenay.jpg" + }, + { + "name": "Indulge in Gourmet Delights", + "description": "Embark on a culinary adventure and savor the rich gastronomy of Burgundy. From Michelin-starred restaurants to charming bistros, the region offers a diverse array of dining experiences. Sample regional specialties such as boeuf bourguignon, coq au vin, and escargots, paired with local wines for an unforgettable feast.", + "locationName": "Various locations throughout Burgundy", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "burgundy", + "ref": "indulge-in-gourmet-delights", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_indulge-in-gourmet-delights.jpg" + }, + { + "name": "Discover the Art and History of Dijon", + "description": "Delve into the cultural heart of Burgundy in Dijon, a vibrant city with a rich artistic and historical legacy. Explore the Palace of the Dukes of Burgundy, admire the Gothic architecture of Notre Dame Church, and wander through the charming streets lined with half-timbered houses. Don't miss the Museum of Fine Arts, home to an impressive collection of European paintings and sculptures.", + "locationName": "Dijon", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "burgundy", + "ref": "discover-the-art-and-history-of-dijon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_discover-the-art-and-history-of-dijon.jpg" + }, + { + "name": "Horseback Riding through the Vineyards", + "description": "Embark on a scenic horseback riding adventure through the picturesque vineyards of Burgundy. Explore the rolling hills, charming villages, and renowned wine estates from a unique perspective. Enjoy the fresh air, stunning landscapes, and the gentle rhythm of horseback riding, creating a memorable and relaxing experience.", + "locationName": "Côte de Beaune or Côte de Nuits", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "burgundy", + "ref": "horseback-riding-through-the-vineyards", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_horseback-riding-through-the-vineyards.jpg" + }, + { + "name": "Visit the Medieval Town of Semur-en-Auxois", + "description": "Step back in time with a visit to the charming medieval town of Semur-en-Auxois. Explore its well-preserved ramparts, cobblestone streets, and half-timbered houses. Discover the impressive Collegiate Church of Notre-Dame and the historic Château de Semur-en-Auxois, offering panoramic views of the surrounding countryside.", + "locationName": "Semur-en-Auxois", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "burgundy", + "ref": "visit-the-medieval-town-of-semur-en-auxois", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_visit-the-medieval-town-of-semur-en-auxois.jpg" + }, + { + "name": "Go Antiquing in Beaune", + "description": "Embark on a treasure hunt through the antique shops and markets of Beaune. Discover unique furniture, vintage jewelry, and other hidden gems that reflect the region's rich history and culture. Enjoy the thrill of the hunt and the satisfaction of finding one-of-a-kind souvenirs to bring home.", + "locationName": "Beaune", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "burgundy", + "ref": "go-antiquing-in-beaune", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_go-antiquing-in-beaune.jpg" + }, + { + "name": "Sample Local Cheeses at a Fromagerie", + "description": "Indulge in the rich flavors of Burgundy's artisanal cheeses at a local fromagerie. Learn about the cheesemaking process, discover different varieties such as Époisses and Soumaintrain, and savor the unique textures and tastes. Pair your cheese with a glass of local wine for a truly delightful experience.", + "locationName": "Various fromageries throughout Burgundy", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "burgundy", + "ref": "sample-local-cheeses-at-a-fromagerie", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_sample-local-cheeses-at-a-fromagerie.jpg" + }, + { + "name": "Enjoy a Picnic in the Countryside", + "description": "Escape the hustle and bustle with a relaxing picnic amidst the idyllic landscapes of Burgundy. Gather fresh bread, local cheeses, cured meats, and a bottle of wine, and find a scenic spot among the vineyards or along a tranquil riverbank. Savor the delicious food, soak up the sunshine, and enjoy the peaceful ambiance.", + "locationName": "Various locations throughout Burgundy", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "burgundy", + "ref": "enjoy-a-picnic-in-the-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/burgundy_enjoy-a-picnic-in-the-countryside.jpg" + }, + { + "name": "Explore the Temples of Angkor", + "description": "Embark on a journey through time as you explore the magnificent temples of Angkor, a UNESCO World Heritage Site. Marvel at the intricate carvings of Angkor Wat, the world's largest religious monument, and discover the enigmatic faces of Bayon Temple. Wander through the jungle-clad Ta Prohm, where ancient ruins intertwine with nature, and witness the breathtaking sunrise over Angkor Wat.", + "locationName": "Angkor Archaeological Park", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "cambodia", + "ref": "explore-the-temples-of-angkor", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_explore-the-temples-of-angkor.jpg" + }, + { + "name": "Relax on the Beaches of Sihanoukville", + "description": "Escape to the pristine beaches of Sihanoukville, where turquoise waters meet golden sands. Bask in the sun, swim in the crystal-clear sea, or indulge in water sports like snorkeling and diving. Explore the vibrant beach bars and restaurants, or simply unwind with a refreshing cocktail as you soak up the tropical atmosphere.", + "locationName": "Sihanoukville", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "cambodia", + "ref": "relax-on-the-beaches-of-sihanoukville", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_relax-on-the-beaches-of-sihanoukville.jpg" + }, + { + "name": "Cruise the Mekong River", + "description": "Embark on a scenic cruise along the mighty Mekong River, the lifeblood of Southeast Asia. Witness the daily life of local communities, observe floating villages and vibrant markets, and immerse yourself in the lush landscapes. Opt for a sunset cruise to enjoy breathtaking views as the sky transforms into a canvas of colors.", + "locationName": "Mekong River", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "cambodia", + "ref": "cruise-the-mekong-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_cruise-the-mekong-river.jpg" + }, + { + "name": "Discover the Royal Palace in Phnom Penh", + "description": "Immerse yourself in the grandeur of the Royal Palace in Phnom Penh, a symbol of Cambodia's rich heritage. Explore the Silver Pagoda, adorned with thousands of silver tiles, and marvel at the Khmer architecture of the Throne Hall. Wander through the manicured gardens and witness the changing of the guards ceremony for a glimpse into royal traditions.", + "locationName": "Phnom Penh", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "cambodia", + "ref": "discover-the-royal-palace-in-phnom-penh", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_discover-the-royal-palace-in-phnom-penh.jpg" + }, + { + "name": "Learn About Cambodian History at the Tuol Sleng Genocide Museum", + "description": "Gain a deeper understanding of Cambodia's turbulent past at the Tuol Sleng Genocide Museum, a former prison that stands as a stark reminder of the Khmer Rouge regime. Explore the exhibits and learn about the atrocities committed during this dark period, paying respects to the victims and reflecting on the importance of human rights.", + "locationName": "Phnom Penh", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 1, + "destinationRef": "cambodia", + "ref": "learn-about-cambodian-history-at-the-tuol-sleng-genocide-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_learn-about-cambodian-history-at-the-tuol-sleng-genocide-museum.jpg" + }, + { + "name": "Hike Through the Cardamom Mountains", + "description": "Embark on an adventurous trek through the lush Cardamom Mountains, home to diverse wildlife, cascading waterfalls, and remote villages. Explore jungle trails, encounter exotic flora and fauna, and discover hidden gems like the Tatai Waterfall or the Aural District.", + "locationName": "Cardamom Mountains", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "cambodia", + "ref": "hike-through-the-cardamom-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_hike-through-the-cardamom-mountains.jpg" + }, + { + "name": "Go Birdwatching in Prek Toal Bird Sanctuary", + "description": "Immerse yourself in the natural wonders of the Prek Toal Bird Sanctuary, a haven for bird enthusiasts. Embark on a boat trip through the flooded forests and witness a spectacular array of bird species, including the endangered Greater Adjutant and the Painted Stork.", + "locationName": "Prek Toal Bird Sanctuary", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "cambodia", + "ref": "go-birdwatching-in-prek-toal-bird-sanctuary", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_go-birdwatching-in-prek-toal-bird-sanctuary.jpg" + }, + { + "name": "Experience Local Life at a Homestay", + "description": "Delve into authentic Cambodian culture by staying in a local homestay. Immerse yourself in the daily life of a Cambodian family, learn about their traditions, participate in activities like farming or fishing, and savor home-cooked meals.", + "locationName": "Various rural villages", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "cambodia", + "ref": "experience-local-life-at-a-homestay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_experience-local-life-at-a-homestay.jpg" + }, + { + "name": "Sample Street Food in Phnom Penh", + "description": "Embark on a culinary adventure through the vibrant streets of Phnom Penh. Sample a variety of delicious and affordable street food options, such as Khmer noodles, grilled meats, fresh spring rolls, and sweet treats like sticky rice with mango.", + "locationName": "Phnom Penh", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "cambodia", + "ref": "sample-street-food-in-phnom-penh", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_sample-street-food-in-phnom-penh.jpg" + }, + { + "name": "Learn to Cook Khmer Cuisine", + "description": "Discover the secrets of Khmer cuisine by taking a cooking class. Learn to prepare traditional dishes like fish amok, Khmer curry, and green mango salad, using fresh local ingredients and authentic cooking techniques.", + "locationName": "Various cooking schools", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "cambodia", + "ref": "learn-to-cook-khmer-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_learn-to-cook-khmer-cuisine.jpg" + }, + { + "name": "Visit Koh Rong", + "description": "Escape to the idyllic island of Koh Rong and immerse yourself in its pristine beauty. Relax on white-sand beaches, swim in crystal-clear waters, and explore the vibrant coral reefs through snorkeling or diving. Enjoy the laid-back island atmosphere, indulge in fresh seafood, and witness breathtaking sunsets over the Gulf of Thailand.", + "locationName": "Koh Rong Island", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "cambodia", + "ref": "visit-koh-rong", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_visit-koh-rong.jpg" + }, + { + "name": "Go Kayaking on the Kampot River", + "description": "Embark on a serene kayaking adventure along the Kampot River, surrounded by lush mangroves and stunning natural landscapes. Paddle through tranquil waters, observe local wildlife, and discover hidden coves and caves. Witness the captivating beauty of the Cambodian countryside and enjoy a peaceful escape into nature.", + "locationName": "Kampot River", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "cambodia", + "ref": "go-kayaking-on-the-kampot-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_go-kayaking-on-the-kampot-river.jpg" + }, + { + "name": "Explore the Bokor National Park", + "description": "Venture into the Bokor National Park and discover its enchanting beauty and historical remnants. Visit the abandoned Bokor Hill Station, a French colonial resort with stunning views, and explore the Popokvil Waterfall, a cascading wonder amidst the lush rainforest. Hike through scenic trails, encounter diverse wildlife, and immerse yourself in the park's mystical atmosphere.", + "locationName": "Bokor National Park", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "cambodia", + "ref": "explore-the-bokor-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_explore-the-bokor-national-park.jpg" + }, + { + "name": "Shop at the Russian Market in Phnom Penh", + "description": "Immerse yourself in the vibrant atmosphere of the Russian Market, a bustling marketplace in Phnom Penh. Browse through a wide array of goods, including souvenirs, handicrafts, clothing, and local produce. Experience the energetic hustle and bustle of Cambodian commerce and discover unique treasures to take home.", + "locationName": "Russian Market", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "cambodia", + "ref": "shop-at-the-russian-market-in-phnom-penh", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_shop-at-the-russian-market-in-phnom-penh.jpg" + }, + { + "name": "Enjoy Phare Circus Show in Siem Reap", + "description": "Experience the magic of Phare Circus, a captivating performance that combines acrobatics, theater, and Cambodian storytelling. Be amazed by the talented young artists who showcase their skills and share their stories through this unique art form. Enjoy an evening of entertainment and cultural immersion.", + "locationName": "Siem Reap", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 4, + "destinationRef": "cambodia", + "ref": "enjoy-phare-circus-show-in-siem-reap", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_enjoy-phare-circus-show-in-siem-reap.jpg" + }, + { + "name": "Dive into the Underwater World of Koh Tang", + "description": "Embark on an unforgettable scuba diving or snorkeling adventure to Koh Tang, a remote island paradise renowned for its pristine coral reefs and diverse marine life. Explore vibrant underwater landscapes, encounter colorful fish, and discover hidden coves, making memories that will last a lifetime.", + "locationName": "Koh Tang", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "cambodia", + "ref": "dive-into-the-underwater-world-of-koh-tang", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_dive-into-the-underwater-world-of-koh-tang.jpg" + }, + { + "name": "Witness the Serenity of Phnom Kulen National Park", + "description": "Escape the hustle and bustle of city life and immerse yourself in the tranquil beauty of Phnom Kulen National Park. Hike to the cascading Kulen Waterfall, discover ancient temples hidden within the lush jungle, and take a refreshing dip in the sacred River of a Thousand Lingas, experiencing the spiritual heart of Cambodia.", + "locationName": "Phnom Kulen National Park", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "cambodia", + "ref": "witness-the-serenity-of-phnom-kulen-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_witness-the-serenity-of-phnom-kulen-national-park.jpg" + }, + { + "name": "Delve into Rural Life in Battambang", + "description": "Venture beyond the tourist trail and experience authentic Cambodian life in the charming province of Battambang. Take a ride on the iconic Bamboo Train, explore traditional villages, visit ancient temples, and witness the breathtaking sunset over rice paddies, gaining a deeper understanding of the local culture and way of life.", + "locationName": "Battambang", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "cambodia", + "ref": "delve-into-rural-life-in-battambang", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_delve-into-rural-life-in-battambang.jpg" + }, + { + "name": "Unwind in Kep's Coastal Charm", + "description": "Discover the laid-back coastal town of Kep, known for its fresh seafood, serene beaches, and colonial architecture. Relax on the white sand, indulge in a delicious crab market feast, and explore nearby Rabbit Island for a dose of tranquility and stunning ocean views.", + "locationName": "Kep", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "cambodia", + "ref": "unwind-in-kep-s-coastal-charm", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_unwind-in-kep-s-coastal-charm.jpg" + }, + { + "name": "Step Back in Time at Koh Ker Temple Complex", + "description": "Embark on an archaeological adventure to the Koh Ker Temple Complex, a remote and enigmatic site that once served as the capital of the Khmer Empire. Explore towering temples, intricate carvings, and hidden chambers, feeling the aura of mystery and grandeur that surrounds this ancient wonder.", + "locationName": "Koh Ker Temple Complex", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "cambodia", + "ref": "step-back-in-time-at-koh-ker-temple-complex", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cambodia_step-back-in-time-at-koh-ker-temple-complex.jpg" + }, + { + "name": "Hiking in Banff National Park", + "description": "Explore the breathtaking trails of Banff National Park, from easy lakeside strolls to challenging mountain climbs. Discover iconic spots like Lake Louise, Moraine Lake, and Johnston Canyon, and be rewarded with stunning vistas of turquoise waters, glaciers, and snow-capped peaks. Keep an eye out for wildlife such as elk, deer, and bighorn sheep.", + "locationName": "Banff National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "canadian-rockies", + "ref": "hiking-in-banff-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_hiking-in-banff-national-park.jpg" + }, + { + "name": "Skiing or Snowboarding in Lake Louise", + "description": "Hit the slopes at Lake Louise Ski Resort, renowned for its world-class skiing and snowboarding terrain. With over 4,200 acres of skiable area, there's something for all levels, from gentle beginner runs to thrilling black diamond slopes. Enjoy the incredible views of the surrounding mountains and the frozen lake while carving down the powder.", + "locationName": "Lake Louise Ski Resort", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "canadian-rockies", + "ref": "skiing-or-snowboarding-in-lake-louise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_skiing-or-snowboarding-in-lake-louise.jpg" + }, + { + "name": "Scenic Drive on the Icefields Parkway", + "description": "Embark on a breathtaking road trip along the Icefields Parkway, considered one of the most scenic drives in the world. Marvel at the towering mountains, glaciers, waterfalls, and turquoise lakes that line the route. Stop at iconic viewpoints like Bow Lake, Peyto Lake, and the Columbia Icefield, and take in the awe-inspiring beauty of the Canadian Rockies.", + "locationName": "Icefields Parkway", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "canadian-rockies", + "ref": "scenic-drive-on-the-icefields-parkway", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_scenic-drive-on-the-icefields-parkway.jpg" + }, + { + "name": "Wildlife Watching Tour", + "description": "Join a guided wildlife watching tour to increase your chances of spotting iconic Canadian Rockies animals such as grizzly bears, black bears, elk, moose, bighorn sheep, and mountain goats. Learn about their behavior, habitats, and conservation efforts from experienced guides, and capture unforgettable photos of these majestic creatures in their natural environment.", + "locationName": "Banff National Park or Jasper National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "canadian-rockies", + "ref": "wildlife-watching-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_wildlife-watching-tour.jpg" + }, + { + "name": "Relaxing at Banff Upper Hot Springs", + "description": "After a day of outdoor adventures, unwind and rejuvenate at the Banff Upper Hot Springs. Immerse yourself in the soothing mineral-rich waters, surrounded by stunning mountain scenery. Enjoy the therapeutic benefits of the hot springs while taking in the fresh mountain air and breathtaking views.", + "locationName": "Banff Upper Hot Springs", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "canadian-rockies", + "ref": "relaxing-at-banff-upper-hot-springs", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_relaxing-at-banff-upper-hot-springs.jpg" + }, + { + "name": "Whitewater Rafting on the Kicking Horse River", + "description": "Experience the thrill of whitewater rafting on the Kicking Horse River, known for its exhilarating rapids and stunning scenery. Choose from various trip lengths and intensities to suit your adventure level, and enjoy a day of splashing through rapids, surrounded by the beauty of the Canadian Rockies. #Adventure #Summer #Family-friendly", + "locationName": "Kicking Horse River", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "canadian-rockies", + "ref": "whitewater-rafting-on-the-kicking-horse-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_whitewater-rafting-on-the-kicking-horse-river.jpg" + }, + { + "name": "Gondola Ride to the Top of Sulphur Mountain", + "description": "Take a scenic gondola ride to the summit of Sulphur Mountain for breathtaking panoramic views of the surrounding mountains, valleys, and the town of Banff. Enjoy the interpretive exhibits at the top, dine at the mountaintop restaurant, or simply soak in the awe-inspiring vistas. #Sightseeing #Mountain #Family-friendly", + "locationName": "Sulphur Mountain", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "canadian-rockies", + "ref": "gondola-ride-to-the-top-of-sulphur-mountain", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_gondola-ride-to-the-top-of-sulphur-mountain.jpg" + }, + { + "name": "Explore the Charming Town of Banff", + "description": "Wander through the charming streets of Banff, a picturesque mountain town with a vibrant atmosphere. Discover unique shops, art galleries, and museums, or relax at a cozy café and enjoy the mountain views. #Shopping #Cultural #Relaxing", + "locationName": "Banff", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "canadian-rockies", + "ref": "explore-the-charming-town-of-banff", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_explore-the-charming-town-of-banff.jpg" + }, + { + "name": "Visit the Cave and Basin National Historic Site", + "description": "Delve into the history of Banff National Park at the Cave and Basin National Historic Site, where Canada's first national park was established. Explore the natural hot springs, learn about the area's unique geology and ecology, and discover the cultural significance of this landmark site. #Historic #Cultural #Family-friendly", + "locationName": "Cave and Basin National Historic Site", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "canadian-rockies", + "ref": "visit-the-cave-and-basin-national-historic-site", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_visit-the-cave-and-basin-national-historic-site.jpg" + }, + { + "name": "Stargazing in the Dark Sky Preserves", + "description": "Escape the city lights and experience the magic of stargazing in the Canadian Rockies' Dark Sky Preserves. Join a guided astronomy tour or simply find a secluded spot to marvel at the constellations and the Milky Way. #Nightlife #Secluded #Romantic", + "locationName": "Jasper National Park or Banff National Park", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "canadian-rockies", + "ref": "stargazing-in-the-dark-sky-preserves", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_stargazing-in-the-dark-sky-preserves.jpg" + }, + { + "name": "Dog Sledding Adventure", + "description": "Experience the thrill of gliding through the snowy landscapes of the Canadian Rockies on a dog sledding tour. Feel the crisp mountain air as a team of huskies pulls you across frozen lakes and through pristine forests. Learn about the history of dog sledding and the incredible bond between mushers and their canine companions.", + "locationName": "Banff or Canmore", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "canadian-rockies", + "ref": "dog-sledding-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_dog-sledding-adventure.jpg" + }, + { + "name": "Ice Skating on Lake Louise", + "description": "Lace up your skates and glide across the frozen surface of the iconic Lake Louise. Surrounded by towering mountains and the majestic Victoria Glacier, this is a truly unforgettable experience. Enjoy the fresh air and stunning scenery as you create lasting memories on the ice.", + "locationName": "Lake Louise", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "canadian-rockies", + "ref": "ice-skating-on-lake-louise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_ice-skating-on-lake-louise.jpg" + }, + { + "name": "Snowshoeing in Yoho National Park", + "description": "Embark on a peaceful snowshoeing adventure through the winter wonderland of Yoho National Park. Explore snow-covered trails, admire frozen waterfalls, and discover hidden alpine meadows. This is a great way to experience the serenity of the mountains at your own pace.", + "locationName": "Yoho National Park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "canadian-rockies", + "ref": "snowshoeing-in-yoho-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_snowshoeing-in-yoho-national-park.jpg" + }, + { + "name": "Johnston Canyon Icewalk", + "description": "Venture into the depths of Johnston Canyon and marvel at the frozen waterfalls and ice formations that cling to the canyon walls. Guided tours provide insights into the geology and ecology of the area, making this a unique and educational experience.", + "locationName": "Johnston Canyon", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "canadian-rockies", + "ref": "johnston-canyon-icewalk", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_johnston-canyon-icewalk.jpg" + }, + { + "name": "Indigenous Cultural Experiences", + "description": "Learn about the rich history and culture of the Indigenous peoples who have called the Canadian Rockies home for centuries. Visit cultural centers, participate in traditional storytelling sessions, or try your hand at crafting authentic Indigenous art.", + "locationName": "Various locations", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "canadian-rockies", + "ref": "indigenous-cultural-experiences", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_indigenous-cultural-experiences.jpg" + }, + { + "name": "Mountain Biking Adventure", + "description": "Embark on an exhilarating mountain biking adventure along scenic trails with breathtaking views of the surrounding peaks and valleys. Numerous trails cater to all skill levels, from leisurely paths to challenging single tracks, offering an unforgettable experience for outdoor enthusiasts.", + "locationName": "Various locations throughout the Canadian Rockies", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "canadian-rockies", + "ref": "mountain-biking-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_mountain-biking-adventure.jpg" + }, + { + "name": "Rock Climbing Excursion", + "description": "Challenge yourself with a thrilling rock climbing excursion on the iconic cliffs and rock faces of the Canadian Rockies. Whether you're a seasoned climber or a beginner, experienced guides will lead you on an unforgettable adventure, providing instruction and ensuring your safety as you ascend to new heights.", + "locationName": "Popular climbing areas like Yamnuska and Grassi Lakes", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "canadian-rockies", + "ref": "rock-climbing-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_rock-climbing-excursion.jpg" + }, + { + "name": "Wildlife Photography Safari", + "description": "Embark on a wildlife photography safari to capture stunning images of the diverse fauna that inhabits the Canadian Rockies. Accompanied by expert guides, you'll have the opportunity to spot elusive creatures like grizzly bears, elk, moose, and bighorn sheep in their natural habitat.", + "locationName": "National parks and wildlife reserves", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "canadian-rockies", + "ref": "wildlife-photography-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_wildlife-photography-safari.jpg" + }, + { + "name": "Scenic Helicopter Tour", + "description": "Soar above the majestic peaks and turquoise lakes of the Canadian Rockies on a scenic helicopter tour. Witness the breathtaking beauty of the landscape from a unique perspective, capturing panoramic views of glaciers, waterfalls, and alpine meadows.", + "locationName": "Helicopter tour operators in Banff or Canmore", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "canadian-rockies", + "ref": "scenic-helicopter-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_scenic-helicopter-tour.jpg" + }, + { + "name": "Relaxing Spa Day", + "description": "Indulge in a day of relaxation and rejuvenation at a luxurious spa nestled amidst the stunning scenery of the Canadian Rockies. Treat yourself to a variety of treatments, including massages, facials, and body wraps, while enjoying the serene ambiance and breathtaking views.", + "locationName": "Spas in Banff, Lake Louise, or Jasper", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "canadian-rockies", + "ref": "relaxing-spa-day", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canadian-rockies_relaxing-spa-day.jpg" + }, + { + "name": "Hike Mount Teide", + "description": "Embark on a challenging but rewarding hike to the summit of Mount Teide, Spain's highest peak and a dormant volcano. Witness breathtaking panoramic views of the island and surrounding archipelago from above. You can choose to hike or take a cable car to the top.", + "locationName": "Teide National Park, Tenerife", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "canary-islands", + "ref": "hike-mount-teide", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_hike-mount-teide.jpg" + }, + { + "name": "Relax on the Beaches of Gran Canaria", + "description": "Soak up the sun and enjoy the golden sands of Gran Canaria's famous beaches. From the lively Playa del Inglés to the secluded coves of Güi Güi beach, there's a perfect spot for everyone to unwind and enjoy the crystal-clear waters.", + "locationName": "Gran Canaria", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "canary-islands", + "ref": "relax-on-the-beaches-of-gran-canaria", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_relax-on-the-beaches-of-gran-canaria.jpg" + }, + { + "name": "Stargazing in La Palma", + "description": "Experience the magic of the night sky in La Palma, a designated Starlight Reserve. Join a guided stargazing tour and marvel at the constellations, planets, and distant galaxies with minimal light pollution.", + "locationName": "Roque de los Muchachos Observatory, La Palma", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "canary-islands", + "ref": "stargazing-in-la-palma", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_stargazing-in-la-palma.jpg" + }, + { + "name": "Explore the Timanfaya National Park", + "description": "Discover the otherworldly landscapes of Timanfaya National Park in Lanzarote. Witness volcanic craters, lava fields, and geothermal demonstrations, and enjoy a unique camel ride through this Martian-like environment.", + "locationName": "Timanfaya National Park, Lanzarote", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "canary-islands", + "ref": "explore-the-timanfaya-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_explore-the-timanfaya-national-park.jpg" + }, + { + "name": "Go Surfing in Fuerteventura", + "description": "Catch some waves in Fuerteventura, a renowned surfing destination. With consistent winds and diverse breaks, the island offers opportunities for surfers of all levels, from beginners to experienced riders.", + "locationName": "Corralejo or El Cotillo, Fuerteventura", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "canary-islands", + "ref": "go-surfing-in-fuerteventura", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_go-surfing-in-fuerteventura.jpg" + }, + { + "name": "Caving in Cueva de los Verdes", + "description": "Embark on a subterranean adventure by exploring the Cueva de los Verdes, a unique lava tube formed by volcanic eruptions thousands of years ago. Marvel at the impressive geological formations, hidden chambers, and the natural auditorium with its exceptional acoustics, where concerts are occasionally held. This otherworldly experience is a must for curious minds and adventure seekers.", + "locationName": "Lanzarote", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "canary-islands", + "ref": "caving-in-cueva-de-los-verdes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_caving-in-cueva-de-los-verdes.jpg" + }, + { + "name": "Whale and Dolphin Watching", + "description": "Set sail on a boat tour from Tenerife or Gran Canaria and witness the incredible marine life that inhabits the waters surrounding the Canary Islands. Keep an eye out for playful dolphins, majestic whales, and other fascinating creatures like sea turtles and flying fish. This eco-friendly activity is perfect for nature lovers and families with children.", + "locationName": "Tenerife or Gran Canaria", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "canary-islands", + "ref": "whale-and-dolphin-watching", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_whale-and-dolphin-watching.jpg" + }, + { + "name": "Explore the Historic Town of La Laguna", + "description": "Step back in time by visiting the charming town of La Laguna in Tenerife, a UNESCO World Heritage Site. Wander through its cobblestone streets lined with colorful colonial architecture, historical churches, and lively plazas. Discover the local culture, indulge in delicious Canarian cuisine, and soak up the vibrant atmosphere of this historic gem.", + "locationName": "Tenerife", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "canary-islands", + "ref": "explore-the-historic-town-of-la-laguna", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_explore-the-historic-town-of-la-laguna.jpg" + }, + { + "name": "Scuba Diving or Snorkeling Adventure", + "description": "Dive into the crystal-clear waters of the Canary Islands and discover a vibrant underwater world teeming with marine life. Explore volcanic reefs, underwater caves, and shipwrecks while encountering colorful fish, graceful rays, and other fascinating creatures. Whether you are an experienced diver or a beginner snorkeler, the Canary Islands offer unforgettable underwater experiences.", + "locationName": "Various islands", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "canary-islands", + "ref": "scuba-diving-or-snorkeling-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_scuba-diving-or-snorkeling-adventure.jpg" + }, + { + "name": "Indulge in Canarian Cuisine", + "description": "Embark on a culinary journey through the Canary Islands by savoring its unique and flavorful cuisine. Sample local delicacies like papas arrugadas (wrinkled potatoes) with mojo sauce, fresh seafood dishes, hearty stews, and sweet treats like bienmesabe (almond dessert). Explore traditional restaurants, tapas bars, and local markets to experience the rich gastronomy of the islands.", + "locationName": "Various islands", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "canary-islands", + "ref": "indulge-in-canarian-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_indulge-in-canarian-cuisine.jpg" + }, + { + "name": "Kayaking and Cliff Jumping in Los Gigantes", + "description": "Embark on a thrilling kayaking adventure along the towering cliffs of Los Gigantes. Paddle through crystal-clear waters, explore hidden caves, and if you dare, experience the exhilaration of cliff jumping into the refreshing ocean.", + "locationName": "Los Gigantes, Tenerife", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "canary-islands", + "ref": "kayaking-and-cliff-jumping-in-los-gigantes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_kayaking-and-cliff-jumping-in-los-gigantes.jpg" + }, + { + "name": "Sunset Cruise with Dolphin Watching", + "description": "Set sail on a magical sunset cruise along the coast. As the sun dips below the horizon, painting the sky with vibrant hues, keep an eye out for playful dolphins dancing in the waves. Enjoy breathtaking views and create unforgettable memories.", + "locationName": "Various locations across the islands", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "canary-islands", + "ref": "sunset-cruise-with-dolphin-watching", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_sunset-cruise-with-dolphin-watching.jpg" + }, + { + "name": "Jeep Safari Adventure in the Dunes of Maspalomas", + "description": "Embark on an adventurous jeep safari through the mesmerizing dunes of Maspalomas. Traverse the vast desert landscape, feeling the thrill of the ride as you conquer challenging terrains. Discover hidden oases and enjoy panoramic views.", + "locationName": "Maspalomas Dunes, Gran Canaria", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "canary-islands", + "ref": "jeep-safari-adventure-in-the-dunes-of-maspalomas", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_jeep-safari-adventure-in-the-dunes-of-maspalomas.jpg" + }, + { + "name": "Wine Tasting Tour in Lanzarote's La Geria", + "description": "Indulge in the unique flavors of Canarian wines with a delightful wine tasting tour in La Geria. Explore the volcanic vineyards, learn about the island's distinctive winemaking techniques, and savor a variety of local wines amidst breathtaking scenery.", + "locationName": "La Geria, Lanzarote", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 2, + "destinationRef": "canary-islands", + "ref": "wine-tasting-tour-in-lanzarote-s-la-geria", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_wine-tasting-tour-in-lanzarote-s-la-geria.jpg" + }, + { + "name": "Paragliding over Tenerife's Coastline", + "description": "Soar through the skies and witness the beauty of Tenerife's coastline from a bird's-eye view with a thrilling paragliding experience. Take off from the mountains and glide over stunning beaches, dramatic cliffs, and charming villages, creating memories that will last a lifetime.", + "locationName": "Various locations in Tenerife", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "canary-islands", + "ref": "paragliding-over-tenerife-s-coastline", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_paragliding-over-tenerife-s-coastline.jpg" + }, + { + "name": "Visit the Palmitos Park", + "description": "Immerse yourself in the wonders of nature at Palmitos Park, a botanical garden and zoo nestled in Gran Canaria. Encounter exotic birds, playful dolphins, colorful fish, and fascinating reptiles. Enjoy captivating shows featuring birds of prey and dolphins, and explore lush gardens showcasing diverse plant life.", + "locationName": "Palmitos Park, Gran Canaria", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "canary-islands", + "ref": "visit-the-palmitos-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_visit-the-palmitos-park.jpg" + }, + { + "name": "Explore the Charming Villages", + "description": "Step back in time as you wander through the charming villages scattered across the Canary Islands. Visit Teror in Gran Canaria with its traditional Canarian architecture and balconies, or the picturesque village of Betancuria in Fuerteventura, known for its historical significance and whitewashed houses. Discover local crafts, enjoy traditional cuisine, and experience the authentic island life.", + "locationName": "Various villages across the islands", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "canary-islands", + "ref": "explore-the-charming-villages", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_explore-the-charming-villages.jpg" + }, + { + "name": "Take a Catamaran Trip to La Graciosa", + "description": "Embark on a relaxing catamaran trip to La Graciosa, a small, unspoiled island off the coast of Lanzarote. Enjoy the scenic journey, soak up the sun on pristine beaches, and swim in crystal-clear turquoise waters. Explore the island's charming village, Caleta de Sebo, and discover its peaceful atmosphere.", + "locationName": "La Graciosa Island", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "canary-islands", + "ref": "take-a-catamaran-trip-to-la-graciosa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_take-a-catamaran-trip-to-la-graciosa.jpg" + }, + { + "name": "Go Windsurfing or Kitesurfing", + "description": "Experience the thrill of windsurfing or kitesurfing in the Canary Islands, renowned for their ideal wind conditions. Head to Fuerteventura or Tenerife, known as hotspots for these water sports. Whether you're a beginner or an experienced rider, you'll find perfect spots to catch the wind and ride the waves.", + "locationName": "Fuerteventura or Tenerife", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "canary-islands", + "ref": "go-windsurfing-or-kitesurfing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_go-windsurfing-or-kitesurfing.jpg" + }, + { + "name": "Enjoy the Nightlife", + "description": "Experience the vibrant nightlife scene in the Canary Islands, particularly in Tenerife and Gran Canaria. Dance the night away at lively clubs, enjoy live music at bars, or sip cocktails at beachfront lounges. Discover a diverse range of entertainment options, from traditional Canarian music to international DJs.", + "locationName": "Tenerife or Gran Canaria", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "canary-islands", + "ref": "enjoy-the-nightlife", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/canary-islands_enjoy-the-nightlife.jpg" + }, + { + "name": "Hot Air Balloon Ride Over Cappadocia", + "description": "Embark on a magical hot air balloon ride at sunrise and witness the breathtaking landscape of Cappadocia from above. Drift over the fairy chimneys, valleys, and rock formations as the golden light paints the scenery. This unforgettable experience offers stunning panoramic views and a unique perspective of the region's geological wonders.", + "locationName": "Goreme", + "duration": 1.5, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "cappadocia", + "ref": "hot-air-balloon-ride-over-cappadocia", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_hot-air-balloon-ride-over-cappadocia.jpg" + }, + { + "name": "Explore the Kaymakli Underground City", + "description": "Descend into the depths of Kaymakli Underground City, an intricate network of tunnels and chambers carved into the soft rock. Discover the fascinating history and ingenuity of the ancient inhabitants as you explore living quarters, stables, kitchens, and ventilation shafts. This subterranean adventure offers a glimpse into a unique way of life.", + "locationName": "Kaymakli", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "cappadocia", + "ref": "explore-the-kaymakli-underground-city", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_explore-the-kaymakli-underground-city.jpg" + }, + { + "name": "Hike through the Valley of Love", + "description": "Embark on a scenic hike through the Valley of Love, known for its phallic-shaped rock formations and panoramic views. The trail winds through vineyards, orchards, and fairy chimneys, offering opportunities for stunning photos and a connection with nature. Enjoy a picnic lunch amidst the unique landscape and soak in the tranquility of the valley.", + "locationName": "Goreme National Park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "cappadocia", + "ref": "hike-through-the-valley-of-love", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_hike-through-the-valley-of-love.jpg" + }, + { + "name": "Visit the Goreme Open-Air Museum", + "description": "Step back in time at the Goreme Open-Air Museum, a UNESCO World Heritage site showcasing a complex of rock-cut churches and monasteries dating back to the Byzantine era. Admire the well-preserved frescoes depicting biblical scenes and learn about the history of early Christian communities in Cappadocia.", + "locationName": "Goreme", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "cappadocia", + "ref": "visit-the-goreme-open-air-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_visit-the-goreme-open-air-museum.jpg" + }, + { + "name": "Indulge in a Turkish Cooking Class", + "description": "Immerse yourself in the culinary culture of Turkey by participating in a hands-on cooking class. Learn to prepare traditional dishes such as manti (Turkish dumplings), dolma (stuffed vegetables), and baklava under the guidance of a local chef. Enjoy the fruits of your labor with a delicious meal and gain valuable insights into Turkish cuisine.", + "locationName": "Goreme or Uchisar", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "cappadocia", + "ref": "indulge-in-a-turkish-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_indulge-in-a-turkish-cooking-class.jpg" + }, + { + "name": "Horseback Riding through the Valleys", + "description": "Embark on a horseback riding adventure through the captivating valleys of Cappadocia. Traverse the unique landscape, passing by fairy chimneys and hidden cave dwellings, while enjoying the tranquility and fresh air. This activity is suitable for all skill levels, offering a unique perspective of the region's beauty.", + "locationName": "Various valleys in Cappadocia", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "cappadocia", + "ref": "horseback-riding-through-the-valleys", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_horseback-riding-through-the-valleys.jpg" + }, + { + "name": "Pottery Workshop in Avanos", + "description": "Immerse yourself in the artistic heritage of Cappadocia by participating in a pottery workshop in Avanos, a town renowned for its ceramics. Learn about the traditional techniques from local artisans and create your own unique piece of pottery to take home as a souvenir. This hands-on experience is perfect for those seeking a creative and cultural activity.", + "locationName": "Avanos", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "cappadocia", + "ref": "pottery-workshop-in-avanos", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_pottery-workshop-in-avanos.jpg" + }, + { + "name": "Sunset ATV Tour", + "description": "Experience the thrill of an ATV adventure through the valleys of Cappadocia as the sun sets, casting a golden glow over the fairy chimneys. Navigate the rugged terrain and enjoy breathtaking panoramic views of the landscape. This exhilarating activity is perfect for adventure seekers and photography enthusiasts.", + "locationName": "Various valleys in Cappadocia", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "cappadocia", + "ref": "sunset-atv-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_sunset-atv-tour.jpg" + }, + { + "name": "Whirling Dervishes Ceremony", + "description": "Witness the mesmerizing Sema ceremony, a spiritual Sufi tradition performed by the Whirling Dervishes. Be captivated by the rhythmic movements and enchanting music as the dervishes spin in a symbolic representation of their journey to divine love. This cultural experience offers a glimpse into the rich history and spirituality of the region.", + "locationName": "Various cultural centers in Cappadocia", + "duration": 1, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "cappadocia", + "ref": "whirling-dervishes-ceremony", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_whirling-dervishes-ceremony.jpg" + }, + { + "name": "Turkish Night with Dinner and Folk Dances", + "description": "Immerse yourself in Turkish culture with a lively evening of traditional food, music, and dance. Enjoy a delicious dinner featuring local specialties while being entertained by folk dancers performing vibrant routines. This experience offers a taste of Turkish hospitality and is a great way to socialize with other travelers.", + "locationName": "Various restaurants and cultural centers in Cappadocia", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "cappadocia", + "ref": "turkish-night-with-dinner-and-folk-dances", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_turkish-night-with-dinner-and-folk-dances.jpg" + }, + { + "name": "Sunrise Photography Tour", + "description": "Capture the breathtaking beauty of Cappadocia's landscape bathed in the golden hues of sunrise. Join a photography tour led by a local expert who will guide you to the best vantage points for stunning photos of the fairy chimneys, valleys, and hot air balloons dotting the sky. Learn tips and tricks to enhance your photography skills while witnessing a magical start to the day. Great for photography, Instagrammable", + "locationName": "Various locations throughout Cappadocia", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "cappadocia", + "ref": "sunrise-photography-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_sunrise-photography-tour.jpg" + }, + { + "name": "Hike to the Ihlara Valley", + "description": "Embark on a scenic hike through the Ihlara Valley, a lush oasis carved by the Melendiz River. Explore hidden rock-cut churches adorned with Byzantine frescoes, marvel at the towering cliffs, and enjoy a peaceful escape into nature. This moderate hike is suitable for various fitness levels and offers a refreshing break from the bustling tourist sites. Hiking, Secluded, Off-the-beaten-path", + "locationName": "Ihlara Valley", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "cappadocia", + "ref": "hike-to-the-ihlara-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_hike-to-the-ihlara-valley.jpg" + }, + { + "name": "Visit the Guray Ceramic Museum", + "description": "Delve into the world of Turkish ceramics at the Guray Ceramic Museum in Avanos. Admire a vast collection of traditional pottery, learn about the history and techniques of this ancient craft, and even try your hand at creating your own ceramic masterpiece during a workshop. This immersive experience offers a unique glimpse into Cappadocia's artistic heritage. Cultural experiences, Family-friendly", + "locationName": "Guray Ceramic Museum, Avanos", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "cappadocia", + "ref": "visit-the-guray-ceramic-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_visit-the-guray-ceramic-museum.jpg" + }, + { + "name": "Wine Tasting in Urgup", + "description": "Indulge in the rich flavors of Cappadocia's wine region with a visit to a local winery in Urgup. Sample a variety of unique wines made from indigenous grapes, learn about the winemaking process, and savor delicious pairings with regional cheeses and snacks. Wine tasting, Cultural experiences, Foodie", + "locationName": "Wineries in Urgup", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "cappadocia", + "ref": "wine-tasting-in-urgup", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_wine-tasting-in-urgup.jpg" + }, + { + "name": "Relax at a Traditional Turkish Bath (Hammam)", + "description": "Unwind and rejuvenate with a traditional Turkish bath experience. Immerse yourself in the steamy atmosphere, enjoy a relaxing scrub and massage, and emerge feeling refreshed and revitalized. This cultural tradition offers a unique way to pamper yourself and experience authentic Turkish hospitality. Wellness retreats, Relaxing", + "locationName": "Various hammams throughout Cappadocia", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "cappadocia", + "ref": "relax-at-a-traditional-turkish-bath-hammam-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_relax-at-a-traditional-turkish-bath-hammam-.jpg" + }, + { + "name": "Rock Climbing and Rappelling Adventure", + "description": "Experience the thrill of rock climbing and rappelling amidst the unique rock formations of Cappadocia. Professional guides will lead you on an unforgettable adventure, suitable for both beginners and experienced climbers, as you ascend the volcanic cliffs and rappel down into hidden canyons. Enjoy breathtaking views and a sense of accomplishment as you conquer the challenges of the Cappadocian landscape.", + "locationName": "Uchisar Valley", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "cappadocia", + "ref": "rock-climbing-and-rappelling-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_rock-climbing-and-rappelling-adventure.jpg" + }, + { + "name": "Jeep Safari through the Valleys", + "description": "Embark on an exhilarating jeep safari through the rugged valleys of Cappadocia. Discover hidden gems and off-the-beaten-path locations, including ancient cave churches, abandoned villages, and panoramic viewpoints. Your knowledgeable guide will share fascinating insights into the region's history and geology, making this a thrilling and educational experience.", + "locationName": "Soganli Valley", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "cappadocia", + "ref": "jeep-safari-through-the-valleys", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_jeep-safari-through-the-valleys.jpg" + }, + { + "name": "Stargazing in the Dark Sky Reserve", + "description": "Escape the city lights and immerse yourself in the celestial wonders of Cappadocia. Join a guided stargazing tour in the Goreme National Park, a designated Dark Sky Reserve. With the help of powerful telescopes and expert astronomers, witness the Milky Way, constellations, and distant planets in all their glory.", + "locationName": "Goreme National Park", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "cappadocia", + "ref": "stargazing-in-the-dark-sky-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_stargazing-in-the-dark-sky-reserve.jpg" + }, + { + "name": "Visit the Zelve Open Air Museum", + "description": "Explore the fascinating Zelve Open Air Museum, a unique historical site showcasing cave dwellings, churches, and monasteries carved into the volcanic rock. Learn about the lives of early Christians and the region's rich cultural heritage as you wander through this ancient settlement. Discover hidden passages, rock-cut mills, and breathtaking views of the surrounding valleys.", + "locationName": "Zelve Open Air Museum", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "cappadocia", + "ref": "visit-the-zelve-open-air-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_visit-the-zelve-open-air-museum.jpg" + }, + { + "name": "Soak in a Natural Hot Spring", + "description": "Relax and rejuvenate in the therapeutic waters of a natural hot spring. Cappadocia boasts several thermal springs known for their healing properties. Pamper yourself with a traditional Turkish bath experience or simply enjoy the soothing warmth of the mineral-rich waters while surrounded by the stunning Cappadocian landscape.", + "locationName": "Bayramhacili", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "cappadocia", + "ref": "soak-in-a-natural-hot-spring", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cappadocia_soak-in-a-natural-hot-spring.jpg" + }, + { + "name": "Hike in Vicente Pérez Rosales National Park", + "description": "Immerse yourself in the stunning landscapes of Vicente Pérez Rosales National Park, home to Petrohué Waterfalls, Osorno Volcano, and Todos los Santos Lake. Hike through ancient forests, witness cascading waterfalls, and be captivated by panoramic views of snow-capped peaks.", + "locationName": "Vicente Pérez Rosales National Park", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "chilean-lake-district", + "ref": "hike-in-vicente-p-rez-rosales-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_hike-in-vicente-p-rez-rosales-national-park.jpg" + }, + { + "name": "Kayak on Lake Llanquihue", + "description": "Embark on a kayaking adventure on the pristine waters of Lake Llanquihue, the second largest lake in Chile. Paddle along the shoreline, surrounded by breathtaking mountain vistas and lush greenery. Keep an eye out for diverse birdlife and enjoy the tranquility of the lake.", + "locationName": "Lake Llanquihue", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "chilean-lake-district", + "ref": "kayak-on-lake-llanquihue", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_kayak-on-lake-llanquihue.jpg" + }, + { + "name": "Explore the German heritage of Frutillar", + "description": "Step back in time and discover the charming town of Frutillar, known for its German colonial architecture and cultural heritage. Visit the German Colonial Museum, admire the traditional wooden houses, and indulge in delicious German pastries and kuchen.", + "locationName": "Frutillar", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "chilean-lake-district", + "ref": "explore-the-german-heritage-of-frutillar", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_explore-the-german-heritage-of-frutillar.jpg" + }, + { + "name": "Relax in the Termas Geometricas Hot Springs", + "description": "Unwind and rejuvenate in the natural hot springs of Termas Geometricas. Immerse yourself in the therapeutic mineral-rich waters, surrounded by a unique architectural design of wooden walkways and lush vegetation. Experience ultimate relaxation amidst the serene natural beauty.", + "locationName": "Termas Geometricas", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "chilean-lake-district", + "ref": "relax-in-the-termas-geometricas-hot-springs", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_relax-in-the-termas-geometricas-hot-springs.jpg" + }, + { + "name": "Go white-water rafting on the Petrohué River", + "description": "Experience an adrenaline-pumping adventure with white-water rafting on the Petrohué River. Navigate through thrilling rapids, surrounded by breathtaking scenery of volcanic landscapes and lush forests. This activity is perfect for adventure seekers looking for an unforgettable experience.", + "locationName": "Petrohué River", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "chilean-lake-district", + "ref": "go-white-water-rafting-on-the-petrohu-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_go-white-water-rafting-on-the-petrohu-river.jpg" + }, + { + "name": "Conquer Volcano Osorno", + "description": "Embark on an exhilarating climb to the summit of the majestic Osorno Volcano. Hike through volcanic landscapes, witness breathtaking panoramic views of the surrounding lakes and Andes Mountains, and feel the thrill of standing atop an active volcano.", + "locationName": "Osorno Volcano", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "chilean-lake-district", + "ref": "conquer-volcano-osorno", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_conquer-volcano-osorno.jpg" + }, + { + "name": "Horseback Riding Adventure", + "description": "Saddle up for an unforgettable horseback riding adventure through the scenic landscapes of the Lake District. Explore hidden trails, traverse rolling hills, and immerse yourself in the region's natural beauty.", + "locationName": "Various locations", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "chilean-lake-district", + "ref": "horseback-riding-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_horseback-riding-adventure.jpg" + }, + { + "name": "Sail Away on Lake Todos los Santos", + "description": "Embark on a scenic boat tour across the emerald waters of Lake Todos los Santos. Admire the snow-capped peaks of the Osorno and Puntiagudo volcanoes, discover hidden waterfalls, and enjoy the tranquility of the surrounding nature.", + "locationName": "Lake Todos los Santos", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "chilean-lake-district", + "ref": "sail-away-on-lake-todos-los-santos", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_sail-away-on-lake-todos-los-santos.jpg" + }, + { + "name": "Indulge in Chilean Cuisine", + "description": "Embark on a culinary journey through the Chilean Lake District. Sample traditional dishes such as curanto (a seafood and meat stew cooked in a pit), cazuela (a hearty Chilean soup), and empanadas, and savor the flavors of the region.", + "locationName": "Various restaurants", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "chilean-lake-district", + "ref": "indulge-in-chilean-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_indulge-in-chilean-cuisine.jpg" + }, + { + "name": "Stargazing in the Andes", + "description": "Escape the city lights and immerse yourself in the wonders of the night sky. Join a stargazing tour and marvel at the Milky Way, constellations, and celestial objects visible in the clear, unpolluted skies of the Andes Mountains.", + "locationName": "Various locations", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "chilean-lake-district", + "ref": "stargazing-in-the-andes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_stargazing-in-the-andes.jpg" + }, + { + "name": "Bike the Cruce Andino", + "description": "Embark on a thrilling cycling adventure through the Andes Mountains, crossing the border between Chile and Argentina. This challenging route offers stunning scenery, including lakes, forests, and snow-capped peaks. You can choose from various tour options, ranging from self-guided to fully supported, depending on your experience and preferences.", + "locationName": "Andes Mountains", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "chilean-lake-district", + "ref": "bike-the-cruce-andino", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_bike-the-cruce-andino.jpg" + }, + { + "name": "Visit Chiloé Island", + "description": "Explore the enchanting Chiloé Island, known for its unique culture, stilt houses, and wooden churches. Discover the island's rich history and folklore, visit the colorful markets, and enjoy fresh seafood. You can also take a boat trip to see penguins and other marine life.", + "locationName": "Chiloé Island", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "chilean-lake-district", + "ref": "visit-chilo-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_visit-chilo-island.jpg" + }, + { + "name": "Go Fly Fishing", + "description": "Cast your line in the pristine rivers and lakes of the Chilean Lake District, renowned for its excellent fly fishing. Experienced guides can help you land brown trout, rainbow trout, and salmon. Enjoy the peaceful surroundings and the thrill of the catch.", + "locationName": "Petrohué River, Lake Llanquihue", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "chilean-lake-district", + "ref": "go-fly-fishing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_go-fly-fishing.jpg" + }, + { + "name": "Skiing and Snowboarding at Antillanca", + "description": "Hit the slopes of Antillanca, a popular ski resort with breathtaking views of Volcano Casablanca. Enjoy a variety of runs for all skill levels, from gentle slopes to challenging black diamonds. The resort also offers snowboarding, snowshoeing, and other winter activities.", + "locationName": "Antillanca Ski Resort", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "chilean-lake-district", + "ref": "skiing-and-snowboarding-at-antillanca", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_skiing-and-snowboarding-at-antillanca.jpg" + }, + { + "name": "Birdwatching in Alerce Andino National Park", + "description": "Discover the diverse birdlife of Alerce Andino National Park, home to numerous species, including the Magellanic woodpecker, chucao tapaculo, and torrent duck. Hike through ancient alerce forests and keep an eye out for these feathered wonders in their natural habitat.", + "locationName": "Alerce Andino National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "chilean-lake-district", + "ref": "birdwatching-in-alerce-andino-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_birdwatching-in-alerce-andino-national-park.jpg" + }, + { + "name": "Scenic Cruise on Lake Todos Los Santos", + "description": "Embark on a breathtaking boat tour across the crystal-clear waters of Lake Todos Los Santos, surrounded by majestic mountains and lush greenery. Capture stunning photographs of the picturesque landscapes, including the iconic Osorno Volcano. Keep an eye out for diverse birdlife and soak in the tranquility of this pristine natural environment.", + "locationName": "Lake Todos Los Santos", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "chilean-lake-district", + "ref": "scenic-cruise-on-lake-todos-los-santos", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_scenic-cruise-on-lake-todos-los-santos.jpg" + }, + { + "name": "Visit Petrohué Waterfalls", + "description": "Witness the cascading beauty of Petrohué Waterfalls, where turquoise glacial waters plunge over volcanic rock formations. Take a leisurely walk along the well-maintained trails, enjoying the refreshing mist and the surrounding rainforest scenery. Capture memorable photos of this natural wonder and learn about the geological forces that shaped it.", + "locationName": "Petrohué Waterfalls", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "chilean-lake-district", + "ref": "visit-petrohu-waterfalls", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_visit-petrohu-waterfalls.jpg" + }, + { + "name": "Explore the Charming Town of Puerto Varas", + "description": "Wander through the charming streets of Puerto Varas, a lakeside town with German-inspired architecture and a relaxed atmosphere. Discover local shops, indulge in delicious pastries at traditional cafes, and admire the colorful houses along the waterfront. Visit the Sacred Heart of Jesus Church for panoramic views of the lake and Osorno Volcano.", + "locationName": "Puerto Varas", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "chilean-lake-district", + "ref": "explore-the-charming-town-of-puerto-varas", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_explore-the-charming-town-of-puerto-varas.jpg" + }, + { + "name": "Unwind at a Lakeside Lodge", + "description": "Escape to a cozy lakeside lodge and immerse yourself in the tranquility of the Chilean Lake District. Enjoy breathtaking views of the water and mountains from your private balcony, unwind by the fireplace, or indulge in spa treatments. Many lodges offer outdoor activities like kayaking, fishing, or horseback riding.", + "locationName": "Various lakeside locations", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "chilean-lake-district", + "ref": "unwind-at-a-lakeside-lodge", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_unwind-at-a-lakeside-lodge.jpg" + }, + { + "name": "Sample Craft Beer at a Local Brewery", + "description": "Discover the burgeoning craft beer scene in the Chilean Lake District. Visit a local brewery and sample a variety of unique and flavorful beers, often made with regional ingredients. Learn about the brewing process, enjoy the friendly atmosphere, and perhaps find your new favorite brew.", + "locationName": "Various towns and cities", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 2, + "destinationRef": "chilean-lake-district", + "ref": "sample-craft-beer-at-a-local-brewery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/chilean-lake-district_sample-craft-beer-at-a-local-brewery.jpg" + }, + { + "name": "Hike the Sentiero Azzurro", + "description": "Embark on a breathtaking coastal hike along the Sentiero Azzurro, connecting the five villages of Cinque Terre. Enjoy panoramic views of the Ligurian Sea, terraced vineyards, and charming villages. Choose from various trail sections, catering to different fitness levels, and immerse yourself in the beauty of the Italian Riviera.", + "locationName": "Cinque Terre National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "cinque-terre", + "ref": "hike-the-sentiero-azzurro", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_hike-the-sentiero-azzurro.jpg" + }, + { + "name": "Explore the Village of Vernazza", + "description": "Wander through the charming village of Vernazza, with its colorful houses, narrow streets, and picturesque harbor. Visit the Doria Castle for stunning views, relax on the beach, or enjoy a delicious seafood meal at a local trattoria.", + "locationName": "Vernazza", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "cinque-terre", + "ref": "explore-the-village-of-vernazza", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_explore-the-village-of-vernazza.jpg" + }, + { + "name": "Take a Boat Tour", + "description": "Experience the beauty of Cinque Terre from a different perspective with a boat tour. Admire the villages from the sea, explore hidden coves, and swim in crystal-clear waters. Choose from various tour options, including sunset cruises and private boat rentals.", + "locationName": "Cinque Terre coastline", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "cinque-terre", + "ref": "take-a-boat-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_take-a-boat-tour.jpg" + }, + { + "name": "Indulge in Local Cuisine", + "description": "Savor the flavors of Ligurian cuisine at one of the many restaurants or trattorias in Cinque Terre. Try fresh seafood dishes, pesto pasta, focaccia bread, and local wines. Don't miss the chance to enjoy a gelato while strolling through the villages.", + "locationName": "Various restaurants and trattorias", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "cinque-terre", + "ref": "indulge-in-local-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_indulge-in-local-cuisine.jpg" + }, + { + "name": "Visit the Cinque Terre Vineyards", + "description": "Discover the local winemaking traditions of Cinque Terre with a visit to a vineyard. Learn about the unique grape varieties grown on the terraced hillsides and enjoy a wine tasting with stunning views of the coastline. Some vineyards also offer tours and food pairings.", + "locationName": "Cinque Terre vineyards", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "cinque-terre", + "ref": "visit-the-cinque-terre-vineyards", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_visit-the-cinque-terre-vineyards.jpg" + }, + { + "name": "Kayaking in the Cinque Terre Marine Protected Area", + "description": "Embark on a sea kayaking adventure to explore the hidden coves, grottos, and marine life of the Cinque Terre Marine Protected Area. Paddle through crystal-clear waters, witness diverse ecosystems, and enjoy breathtaking views of the coastline from a unique perspective.", + "locationName": "Cinque Terre Marine Protected Area", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "cinque-terre", + "ref": "kayaking-in-the-cinque-terre-marine-protected-area", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_kayaking-in-the-cinque-terre-marine-protected-area.jpg" + }, + { + "name": "Swimming and Sunbathing at Monterosso Beach", + "description": "Relax and soak up the sun at Monterosso Beach, the largest and sandiest beach in Cinque Terre. Enjoy a refreshing swim in the turquoise waters, build sandcastles with the kids, or simply unwind on a beach chair with a good book.", + "locationName": "Monterosso Beach", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "cinque-terre", + "ref": "swimming-and-sunbathing-at-monterosso-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_swimming-and-sunbathing-at-monterosso-beach.jpg" + }, + { + "name": "Sunset Watching at Manarola", + "description": "Experience the magic of a Cinque Terre sunset from the charming village of Manarola. Find a scenic spot on the rocks or at a waterfront café and watch the sky transform into a canvas of vibrant colors as the sun dips below the horizon.", + "locationName": "Manarola", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "cinque-terre", + "ref": "sunset-watching-at-manarola", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_sunset-watching-at-manarola.jpg" + }, + { + "name": "Take a Cooking Class", + "description": "Delve into the culinary traditions of Liguria with a hands-on cooking class. Learn to prepare regional specialties like pesto, focaccia, and fresh seafood dishes under the guidance of a local chef. Savor the fruits of your labor with a delicious meal and newfound culinary skills.", + "locationName": "Various locations in Cinque Terre", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "cinque-terre", + "ref": "take-a-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_take-a-cooking-class.jpg" + }, + { + "name": "Explore the Castle of Riomaggiore", + "description": "Step back in time with a visit to the historic Castle of Riomaggiore. Explore the ruins of this 13th-century fortress, learn about its role in protecting the village from pirates, and enjoy panoramic views of the coastline and surrounding hills.", + "locationName": "Riomaggiore", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "cinque-terre", + "ref": "explore-the-castle-of-riomaggiore", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_explore-the-castle-of-riomaggiore.jpg" + }, + { + "name": "Cliff Jumping at Manarola", + "description": "For the adventurous souls, take a thrilling leap from the rocky cliffs into the crystal-clear waters of the Ligurian Sea. Manarola offers several jumping points with varying heights, providing an adrenaline rush and breathtaking views.", + "locationName": "Manarola", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "cinque-terre", + "ref": "cliff-jumping-at-manarola", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_cliff-jumping-at-manarola.jpg" + }, + { + "name": "Explore the Sanctuary of Nostra Signora di Montenero", + "description": "Embark on a spiritual and scenic journey to the Sanctuary of Nostra Signora di Montenero, perched high above Riomaggiore. Enjoy panoramic views of the coastline and surrounding villages while experiencing the tranquility of this religious site.", + "locationName": "Riomaggiore", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "cinque-terre", + "ref": "explore-the-sanctuary-of-nostra-signora-di-montenero", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_explore-the-sanctuary-of-nostra-signora-di-montenero.jpg" + }, + { + "name": "Go on a Pesto Making Workshop", + "description": "Delve into the culinary traditions of Liguria with a hands-on pesto making workshop. Learn the secrets of preparing this iconic sauce using fresh, local ingredients, and savor the fruits of your labor with a delicious pasta dish.", + "locationName": "Various locations", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "cinque-terre", + "ref": "go-on-a-pesto-making-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_go-on-a-pesto-making-workshop.jpg" + }, + { + "name": "Take a Day Trip to Portovenere", + "description": "Venture beyond the Cinque Terre and explore the charming coastal town of Portovenere. Discover its historic Church of St. Peter, Doria Castle, and Byron's Grotto, and enjoy a leisurely stroll along the picturesque harbor.", + "locationName": "Portovenere", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "cinque-terre", + "ref": "take-a-day-trip-to-portovenere", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_take-a-day-trip-to-portovenere.jpg" + }, + { + "name": "Relax with a Beachside Yoga Session", + "description": "Unwind and reconnect with nature through a rejuvenating yoga session on the beach. Several studios and instructors offer classes with stunning views of the Mediterranean Sea, providing a perfect blend of relaxation and exercise.", + "locationName": "Monterosso al Mare", + "duration": 1.5, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 2, + "destinationRef": "cinque-terre", + "ref": "relax-with-a-beachside-yoga-session", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_relax-with-a-beachside-yoga-session.jpg" + }, + { + "name": "Scuba Dive the Cinque Terre Coast", + "description": "Embark on an underwater adventure and discover the vibrant marine life of the Cinque Terre National Park. Explore hidden coves, underwater rock formations, and a diverse ecosystem teeming with colorful fish, octopus, and even dolphins. Several dive centers in the area cater to all levels, from beginners to experienced divers, offering guided dives and PADI certification courses.", + "locationName": "Cinque Terre National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "cinque-terre", + "ref": "scuba-dive-the-cinque-terre-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_scuba-dive-the-cinque-terre-coast.jpg" + }, + { + "name": "Take a Romantic Train Ride", + "description": "Experience the charm of the Cinque Terre by train, enjoying breathtaking coastal views from the comfort of your seat. The train connects all five villages, offering a convenient and scenic way to hop between towns. Share a bottle of local wine as you watch the sun set over the Mediterranean Sea, creating a truly unforgettable moment.", + "locationName": "Cinque Terre Train Line", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "cinque-terre", + "ref": "take-a-romantic-train-ride", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_take-a-romantic-train-ride.jpg" + }, + { + "name": "Enjoy a Traditional Ligurian Dinner", + "description": "Immerse yourself in the local culture with an authentic Ligurian dinner at a family-run trattoria. Savor fresh seafood dishes like trofie al pesto, a regional pasta specialty, or Ligurian fish stew. Pair your meal with a glass of Cinque Terre DOC wine for a true taste of the region's culinary delights.", + "locationName": "Local Trattorias in Cinque Terre Villages", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "cinque-terre", + "ref": "enjoy-a-traditional-ligurian-dinner", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_enjoy-a-traditional-ligurian-dinner.jpg" + }, + { + "name": "Go Stargazing", + "description": "Escape the village lights and venture to a secluded spot along the coast for a magical stargazing experience. The lack of light pollution in the Cinque Terre offers stunning views of the night sky, allowing you to marvel at the constellations and the Milky Way. Pack a blanket, some snacks, and enjoy a romantic evening under the stars.", + "locationName": "Secluded spots along the Cinque Terre Coast", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "cinque-terre", + "ref": "go-stargazing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_go-stargazing.jpg" + }, + { + "name": "Attend a Local Festival", + "description": "Experience the vibrant cultural traditions of the Cinque Terre by attending one of the many local festivals held throughout the year. From religious celebrations like the Feast of San Lorenzo in Manarola to the Grape Harvest Festival in September, these events offer a glimpse into the region's rich heritage and provide a chance to mingle with locals.", + "locationName": "Various locations throughout Cinque Terre", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "cinque-terre", + "ref": "attend-a-local-festival", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/cinque-terre_attend-a-local-festival.jpg" + }, + { + "name": "Explore the Walled City of Cartagena", + "description": "Step back in time and wander through the enchanting streets of Cartagena's historic Walled City, a UNESCO World Heritage Site. Admire the colorful colonial architecture, visit ancient forts and plazas, and soak up the vibrant atmosphere. Explore the Palace of the Inquisition, shop for local handicrafts at Las Bóvedas, and enjoy a romantic horse-drawn carriage ride at sunset.", + "locationName": "Cartagena", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "colombia", + "ref": "explore-the-walled-city-of-cartagena", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_explore-the-walled-city-of-cartagena.jpg" + }, + { + "name": "Hike in the Cocora Valley", + "description": "Embark on a breathtaking hike through the Cocora Valley, home to the world's tallest palm trees. Marvel at the towering wax palms that reach up to 60 meters tall, surrounded by lush cloud forests and rolling hills. Keep an eye out for unique wildlife, including the Andean condor, and enjoy a picnic lunch amidst the stunning scenery. This hike is suitable for various fitness levels, with options for shorter or longer trails.", + "locationName": "Cocora Valley", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "colombia", + "ref": "hike-in-the-cocora-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_hike-in-the-cocora-valley.jpg" + }, + { + "name": "Discover the Coffee Region", + "description": "Immerse yourself in the world of Colombian coffee with a visit to the Coffee Triangle. Take a tour of a coffee farm, learn about the bean-to-cup process, and participate in a coffee tasting experience. Enjoy the scenic landscapes of rolling hills covered in coffee plantations, and visit charming towns like Salento and Filandia. Learn about the cultural heritage of the region and the importance of coffee to the Colombian economy.", + "locationName": "Coffee Triangle", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "colombia", + "ref": "discover-the-coffee-region", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_discover-the-coffee-region.jpg" + }, + { + "name": "Experience Medellín's Nightlife", + "description": "Dance the night away in Medellín, known for its vibrant nightlife and energetic atmosphere. Explore the trendy El Poblado neighborhood, where you'll find a variety of bars, clubs, and live music venues. Enjoy salsa dancing, reggaeton beats, or electronic music, and experience the warmth and hospitality of the Paisa people. Don't miss the chance to try Aguardiente, the national liquor of Colombia.", + "locationName": "Medellín", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "colombia", + "ref": "experience-medell-n-s-nightlife", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_experience-medell-n-s-nightlife.jpg" + }, + { + "name": "Visit the Gold Museum in Bogotá", + "description": "Delve into Colombia's rich history and cultural heritage at the Gold Museum in Bogotá. Discover the largest collection of pre-Columbian gold artifacts in the world, showcasing the craftsmanship and artistry of indigenous cultures. Learn about the symbolism and significance of gold in these societies, and admire the intricate designs and exquisite pieces on display. The museum also offers exhibits on other materials, such as ceramics and textiles, providing a comprehensive overview of Colombian history.", + "locationName": "Bogotá", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "colombia", + "ref": "visit-the-gold-museum-in-bogot-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_visit-the-gold-museum-in-bogot-.jpg" + }, + { + "name": "Sail the Rosario Islands", + "description": "Embark on a boat trip from Cartagena to the Rosario Islands, a stunning archipelago in the Caribbean Sea. Relax on pristine white-sand beaches, snorkel amidst vibrant coral reefs, and enjoy fresh seafood lunches on secluded islands. This is a perfect escape for a day of sun, sea, and serenity.", + "locationName": "Rosario Islands", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "colombia", + "ref": "sail-the-rosario-islands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_sail-the-rosario-islands.jpg" + }, + { + "name": "Go Whale Watching in the Pacific", + "description": "Witness the awe-inspiring spectacle of humpback whales migrating along the Pacific coast of Colombia. Between June and October, these majestic creatures visit the warm waters to breed and give birth. Join a responsible whale watching tour from Nuquí or Bahía Solano for an unforgettable wildlife encounter.", + "locationName": "Nuquí or Bahía Solano", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "colombia", + "ref": "go-whale-watching-in-the-pacific", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_go-whale-watching-in-the-pacific.jpg" + }, + { + "name": "Explore the Lost City (Ciudad Perdida)", + "description": "Embark on a challenging but rewarding multi-day trek through the jungle to reach the Lost City, an ancient archaeological site built by the Tayrona civilization centuries ago. This adventure involves hiking through diverse ecosystems, crossing rivers, and immersing yourself in the natural beauty and cultural history of the region.", + "locationName": "Sierra Nevada de Santa Marta", + "duration": 48, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "colombia", + "ref": "explore-the-lost-city-ciudad-perdida-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_explore-the-lost-city-ciudad-perdida-.jpg" + }, + { + "name": "Learn to Salsa Dance in Cali", + "description": "Cali, known as the 'Salsa Capital of the World,' is the perfect place to immerse yourself in the vibrant dance culture. Take salsa lessons, join a dance social, or watch professionals showcase their skills at a local club. Whether you're a beginner or an experienced dancer, Cali's infectious energy will have you moving to the rhythm.", + "locationName": "Cali", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "colombia", + "ref": "learn-to-salsa-dance-in-cali", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_learn-to-salsa-dance-in-cali.jpg" + }, + { + "name": "Whitewater Rafting on the Rio Suarez", + "description": "Experience an adrenaline-pumping adventure with a whitewater rafting trip on the Rio Suarez, one of Colombia's most renowned rivers for rafting. Navigate through thrilling rapids surrounded by stunning canyon scenery. This activity is perfect for adventure seekers and nature lovers.", + "locationName": "Rio Suarez", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "colombia", + "ref": "whitewater-rafting-on-the-rio-suarez", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_whitewater-rafting-on-the-rio-suarez.jpg" + }, + { + "name": "Birdwatching in the Amazon Rainforest", + "description": "Embark on an unforgettable journey into the heart of the Amazon Rainforest, a paradise for birdwatchers. With over 1,800 species of birds, including vibrant toucans, majestic harpy eagles, and colorful macaws, you'll be mesmerized by the diversity and beauty of avian life. Join a guided tour with expert naturalists who will lead you through the lush jungle, pointing out hidden birds and sharing their knowledge about the ecosystem.", + "locationName": "Amazon Rainforest", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "colombia", + "ref": "birdwatching-in-the-amazon-rainforest", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_birdwatching-in-the-amazon-rainforest.jpg" + }, + { + "name": "Scuba Diving in San Andrés and Providencia", + "description": "Dive into the crystal-clear waters of the Caribbean Sea and discover a vibrant underwater world surrounding the islands of San Andrés and Providencia. Explore colorful coral reefs teeming with marine life, swim alongside tropical fish, and encounter majestic sea turtles. Whether you're a seasoned diver or a beginner, there are dive sites suitable for all levels of experience.", + "locationName": "San Andrés and Providencia", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "colombia", + "ref": "scuba-diving-in-san-andr-s-and-providencia", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_scuba-diving-in-san-andr-s-and-providencia.jpg" + }, + { + "name": "Explore the Tatacoa Desert", + "description": "Venture into the otherworldly landscape of the Tatacoa Desert, a unique and awe-inspiring destination in Colombia. Hike through canyons and valleys carved by erosion, marvel at the red and grey rock formations, and visit the observatory for stargazing opportunities under the clear desert sky. The Tatacoa Desert offers a stark contrast to the lush landscapes found elsewhere in Colombia, making it a truly unforgettable experience.", + "locationName": "Tatacoa Desert", + "duration": 6, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "colombia", + "ref": "explore-the-tatacoa-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_explore-the-tatacoa-desert.jpg" + }, + { + "name": "Visit Guatapé and El Peñol", + "description": "Escape the city and take a day trip to the charming town of Guatapé and the iconic El Peñol rock. Climb the 740 steps to the top of El Peñol for breathtaking panoramic views of the surrounding lakes and islands. Afterward, explore the colorful streets of Guatapé, admire the vibrant houses with their unique zocalos (baseboards), and enjoy a relaxing boat ride on the reservoir.", + "locationName": "Guatapé and El Peñol", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "colombia", + "ref": "visit-guatap-and-el-pe-ol", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_visit-guatap-and-el-pe-ol.jpg" + }, + { + "name": "Relax in the Hot Springs of Santa Rosa de Cabal", + "description": "Indulge in a rejuvenating experience at the natural hot springs of Santa Rosa de Cabal. Immerse yourself in the therapeutic mineral-rich waters, surrounded by lush greenery and breathtaking mountain scenery. Several spa resorts in the area offer a variety of treatments and massages, providing the ultimate relaxation and wellness retreat.", + "locationName": "Santa Rosa de Cabal", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "colombia", + "ref": "relax-in-the-hot-springs-of-santa-rosa-de-cabal", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_relax-in-the-hot-springs-of-santa-rosa-de-cabal.jpg" + }, + { + "name": "Paragliding over Medellín", + "description": "Soar above the sprawling cityscape of Medellín and the surrounding Aburrá Valley on a thrilling paragliding adventure. Experience breathtaking panoramic views of the mountains, lush greenery, and the urban landscape below. This activity offers a unique perspective of the city and an adrenaline rush for adventure seekers.", + "locationName": "Medellín", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "colombia", + "ref": "paragliding-over-medell-n", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_paragliding-over-medell-n.jpg" + }, + { + "name": "Explore the Amazon Rainforest", + "description": "Embark on a multi-day expedition into the depths of the Amazon Rainforest, the world's largest tropical rainforest. Discover the incredible biodiversity of the region, including exotic plants, animals, and indigenous communities. Go on jungle treks, boat rides along the Amazon River, and experience the magic of this unique ecosystem.", + "locationName": "Amazon Rainforest", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "colombia", + "ref": "explore-the-amazon-rainforest", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_explore-the-amazon-rainforest.jpg" + }, + { + "name": "Visit the Salt Cathedral of Zipaquirá", + "description": "Descend into the depths of a former salt mine and marvel at the architectural wonder of the Salt Cathedral of Zipaquirá. Explore the subterranean tunnels and chambers adorned with intricate salt sculptures and religious iconography. This unique underground cathedral is a testament to human ingenuity and a must-see cultural attraction.", + "locationName": "Zipaquirá", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "colombia", + "ref": "visit-the-salt-cathedral-of-zipaquir-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_visit-the-salt-cathedral-of-zipaquir-.jpg" + }, + { + "name": "Learn to Play Tejo", + "description": "Immerse yourself in Colombian culture by learning to play Tejo, the country's national sport. This traditional game involves throwing metal discs at gunpowder targets, creating small explosions upon impact. Join locals at a Tejo court and experience the friendly competition and festive atmosphere.", + "locationName": "Various locations", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "colombia", + "ref": "learn-to-play-tejo", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_learn-to-play-tejo.jpg" + }, + { + "name": "Take a Street Food Tour", + "description": "Embark on a culinary adventure through the streets of Colombia's cities and towns. Sample a variety of local delicacies, from empanadas and arepas to exotic fruits and traditional desserts. Learn about the cultural significance of different dishes and experience the vibrant street food scene.", + "locationName": "Various cities and towns", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "colombia", + "ref": "take-a-street-food-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/colombia_take-a-street-food-tour.jpg" + }, + { + "name": "Hike the GR20 Trail", + "description": "Embark on an epic adventure through Corsica's rugged interior on the renowned GR20 trail. This challenging long-distance hike offers breathtaking views of towering mountains, pristine lakes, and dense forests. Suitable for experienced hikers, the trail is divided into stages, allowing you to customize your itinerary based on your fitness level and time constraints.", + "locationName": "GR20 Trail", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "corsica", + "ref": "hike-the-gr20-trail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_hike-the-gr20-trail.jpg" + }, + { + "name": "Relax on Palombaggia Beach", + "description": "Unwind on the soft sands of Palombaggia Beach, renowned for its turquoise waters, powdery sand, and stunning views of the Cerbicale Islands. Soak up the Mediterranean sun, swim in the crystal-clear sea, or indulge in water sports such as kayaking and paddleboarding. The beach offers a range of amenities, including beach bars, restaurants, and equipment rentals, ensuring a comfortable and enjoyable experience.", + "locationName": "Palombaggia Beach", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "corsica", + "ref": "relax-on-palombaggia-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_relax-on-palombaggia-beach.jpg" + }, + { + "name": "Explore the Citadel of Bonifacio", + "description": "Step back in time at the historic Citadel of Bonifacio, perched dramatically on white limestone cliffs overlooking the Mediterranean Sea. Wander through the narrow streets, admire the medieval architecture, and visit the Bastion de l'Etendard for panoramic views. Delve into the citadel's rich history at the Bonifacio History Museum, or simply soak up the atmosphere at a charming cafe.", + "locationName": "Citadel of Bonifacio", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "corsica", + "ref": "explore-the-citadel-of-bonifacio", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_explore-the-citadel-of-bonifacio.jpg" + }, + { + "name": "Discover the Scandola Nature Reserve", + "description": "Embark on a boat tour to the Scandola Nature Reserve, a UNESCO World Heritage Site renowned for its dramatic red cliffs, hidden coves, and diverse marine life. Observe rare seabirds, such as the osprey and the Corsican shearwater, and keep an eye out for dolphins playing in the waves. Snorkeling and diving enthusiasts can explore the underwater world, teeming with colorful fish and vibrant coral reefs.", + "locationName": "Scandola Nature Reserve", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "corsica", + "ref": "discover-the-scandola-nature-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_discover-the-scandola-nature-reserve.jpg" + }, + { + "name": "Indulge in Corsican Cuisine", + "description": "Savor the unique flavors of Corsican cuisine, influenced by French and Italian traditions. Sample local specialties such as wild boar stew, chestnut polenta, and brocciu cheese. Pair your meal with a glass of Corsican wine, known for its bold and distinctive character. For a truly immersive experience, visit a traditional agriturismo, where you can enjoy farm-to-table dining amidst the island's scenic landscapes.", + "locationName": "Various restaurants and agriturismos", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "corsica", + "ref": "indulge-in-corsican-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_indulge-in-corsican-cuisine.jpg" + }, + { + "name": "Go Canyoning in the Bavella Needles", + "description": "Embark on an exhilarating canyoning adventure amidst the stunning Bavella Needles. Rappel down waterfalls, slide through natural rock formations, and swim in crystal-clear pools. This activity is perfect for thrill-seekers and nature lovers.", + "locationName": "Bavella Needles", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "corsica", + "ref": "go-canyoning-in-the-bavella-needles", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_go-canyoning-in-the-bavella-needles.jpg" + }, + { + "name": "Sail Along the Coast", + "description": "Experience the beauty of Corsica's coastline from a different perspective with a sailing excursion. Cruise along the turquoise waters, visit hidden coves and beaches, and enjoy breathtaking views of the island's rugged cliffs and charming villages.", + "locationName": "Corsican Coast", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "corsica", + "ref": "sail-along-the-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_sail-along-the-coast.jpg" + }, + { + "name": "Discover Prehistoric Sites", + "description": "Step back in time and explore Corsica's rich history by visiting its fascinating prehistoric sites. Discover ancient megaliths, menhirs, and dolmens, and learn about the island's early inhabitants.", + "locationName": "Filitosa or Filitosa", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "corsica", + "ref": "discover-prehistoric-sites", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_discover-prehistoric-sites.jpg" + }, + { + "name": "Sample Local Wines", + "description": "Indulge in the flavors of Corsica with a wine tasting tour. Visit local vineyards, learn about the island's unique grape varieties, and savor delicious Corsican wines.", + "locationName": "Patrimonio or Ajaccio regions", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "corsica", + "ref": "sample-local-wines", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_sample-local-wines.jpg" + }, + { + "name": "Kayak in the Lavezzi Islands", + "description": "Explore the stunning Lavezzi Islands by kayak. Paddle through crystal-clear waters, discover hidden coves, and enjoy the tranquility of this protected nature reserve.", + "locationName": "Lavezzi Islands", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "corsica", + "ref": "kayak-in-the-lavezzi-islands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_kayak-in-the-lavezzi-islands.jpg" + }, + { + "name": "Horseback Riding in the Corsican Mountains", + "description": "Embark on a scenic horseback riding adventure through the rugged mountains of Corsica. Traverse ancient trails, breathe in the fresh mountain air, and soak in panoramic views of the island's breathtaking landscapes. This experience is perfect for nature lovers and adventure seekers looking for a unique way to explore the island's interior.", + "locationName": "Corsican Mountains", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "corsica", + "ref": "horseback-riding-in-the-corsican-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_horseback-riding-in-the-corsican-mountains.jpg" + }, + { + "name": "Stargazing in the Remote Villages", + "description": "Escape the city lights and venture into the remote villages of Corsica for an unforgettable stargazing experience. With minimal light pollution, the island's night sky comes alive with a dazzling display of stars and constellations. Join a local astronomy tour or simply find a secluded spot to marvel at the celestial wonders above.", + "locationName": "Remote villages", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "corsica", + "ref": "stargazing-in-the-remote-villages", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_stargazing-in-the-remote-villages.jpg" + }, + { + "name": "Explore the Calanques de Piana by Boat", + "description": "Discover the stunning Calanques de Piana, a series of dramatic red granite cliffs and hidden coves, on a scenic boat tour. Cruise along the turquoise waters, marvel at the towering rock formations, and explore secluded beaches accessible only by water. This is a perfect way to experience the coastal beauty of Corsica from a unique perspective.", + "locationName": "Calanques de Piana", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "corsica", + "ref": "explore-the-calanques-de-piana-by-boat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_explore-the-calanques-de-piana-by-boat.jpg" + }, + { + "name": "Visit the Filitosa Archaeological Site", + "description": "Step back in time at the Filitosa archaeological site, home to mysterious prehistoric statues and megalithic structures dating back thousands of years. Explore the ancient settlements, learn about Corsica's rich history, and marvel at the enigmatic figures carved by early inhabitants of the island.", + "locationName": "Filitosa", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "corsica", + "ref": "visit-the-filitosa-archaeological-site", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_visit-the-filitosa-archaeological-site.jpg" + }, + { + "name": "Attend a Polyphonic Singing Concert", + "description": "Immerse yourself in Corsican culture by attending a traditional polyphonic singing concert. Experience the unique vocal harmonies of this ancient singing style, passed down through generations. These captivating performances offer a glimpse into the island's rich heritage and musical traditions.", + "locationName": "Various locations", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "corsica", + "ref": "attend-a-polyphonic-singing-concert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_attend-a-polyphonic-singing-concert.jpg" + }, + { + "name": "Scuba Diving in the Cerbicales Islands", + "description": "Embark on an underwater adventure to the Cerbicales Islands, a protected marine reserve off the southern coast of Corsica. Discover a vibrant world of colorful fish, coral reefs, and ancient shipwrecks, making it a paradise for both beginner and experienced divers.", + "locationName": "Cerbicales Islands", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "corsica", + "ref": "scuba-diving-in-the-cerbicales-islands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_scuba-diving-in-the-cerbicales-islands.jpg" + }, + { + "name": "Mountain Biking Through the Desert des Agriates", + "description": "Experience the rugged beauty of the Desert des Agriates on a thrilling mountain bike adventure. Navigate through rocky trails, sandy paths, and hidden coves, enjoying breathtaking views of the coastline and the Mediterranean Sea.", + "locationName": "Desert des Agriates", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "corsica", + "ref": "mountain-biking-through-the-desert-des-agriates", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_mountain-biking-through-the-desert-des-agriates.jpg" + }, + { + "name": "Wine Tasting Tour in Patrimonio", + "description": "Indulge in the rich flavors of Corsican wines with a delightful wine tasting tour in the Patrimonio region. Visit charming vineyards, meet passionate winemakers, and savor a variety of local grape varietals, accompanied by stunning vineyard landscapes.", + "locationName": "Patrimonio", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "corsica", + "ref": "wine-tasting-tour-in-patrimonio", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_wine-tasting-tour-in-patrimonio.jpg" + }, + { + "name": "Explore the Cap Corse by Car", + "description": "Embark on a scenic road trip along the Cap Corse, the northernmost peninsula of Corsica. Discover picturesque villages, Genoese towers, hidden beaches, and breathtaking coastal views, stopping at charming cafes and local shops along the way.", + "locationName": "Cap Corse", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "corsica", + "ref": "explore-the-cap-corse-by-car", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_explore-the-cap-corse-by-car.jpg" + }, + { + "name": "Visit the Ajaccio Market", + "description": "Immerse yourself in the vibrant atmosphere of the Ajaccio Market, a bustling hub of local life. Explore stalls overflowing with fresh produce, artisan cheeses, cured meats, and handcrafted souvenirs, experiencing the authentic flavors and culture of Corsica.", + "locationName": "Ajaccio", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "corsica", + "ref": "visit-the-ajaccio-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/corsica_visit-the-ajaccio-market.jpg" + }, + { + "name": "Corcovado National Park Hike", + "description": "Embark on a guided trek through the heart of Corcovado National Park, known as one of the most biodiverse places on Earth. Encounter an abundance of wildlife, including monkeys, sloths, tapirs, scarlet macaws, and perhaps even the elusive jaguar.", + "locationName": "Corcovado National Park", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "costa-rica", + "ref": "corcovado-national-park-hike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_corcovado-national-park-hike.jpg" + }, + { + "name": "Kayaking in Drake Bay", + "description": "Paddle through the calm waters of Drake Bay, surrounded by lush mangroves and rainforest-covered islands. Keep an eye out for dolphins, sea turtles, and a variety of colorful fish. This is a perfect activity for a relaxing afternoon immersed in nature.", + "locationName": "Drake Bay", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "costa-rica", + "ref": "kayaking-in-drake-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_kayaking-in-drake-bay.jpg" + }, + { + "name": "Nighttime Wildlife Tour", + "description": "Venture into the rainforest at night, when nocturnal creatures come alive. With the help of a guide and a flashlight, spot fascinating animals like kinkajous, olingos, frogs, and owls. This unique experience offers a glimpse into the hidden world of the jungle after dark.", + "locationName": "Various locations throughout the peninsula", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "costa-rica", + "ref": "nighttime-wildlife-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_nighttime-wildlife-tour.jpg" + }, + { + "name": "Surfing at Matapalo", + "description": "Catch some waves at Matapalo, a secluded beach known for its consistent surf breaks. Whether you're a beginner or an experienced surfer, you'll find suitable waves to enjoy the thrill of riding the Pacific Ocean.", + "locationName": "Matapalo Beach", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "costa-rica", + "ref": "surfing-at-matapalo", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_surfing-at-matapalo.jpg" + }, + { + "name": "Birdwatching Excursion", + "description": "Join a guided birdwatching tour to discover the incredible avian diversity of the Osa Peninsula. With over 450 bird species recorded in the area, you'll have the opportunity to see toucans, hummingbirds, parrots, and many other colorful and exotic birds.", + "locationName": "Various locations throughout the peninsula", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "costa-rica", + "ref": "birdwatching-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_birdwatching-excursion.jpg" + }, + { + "name": "Horseback Riding Adventure", + "description": "Embark on a scenic horseback riding tour through the lush rainforests and pristine beaches of the Osa Peninsula. Traverse jungle trails, ford rivers, and discover hidden waterfalls, all while enjoying the company of these gentle creatures. This is a unique way to experience the beauty and tranquility of the Osa Peninsula.", + "locationName": "Various locations throughout the peninsula", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "costa-rica", + "ref": "horseback-riding-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_horseback-riding-adventure.jpg" + }, + { + "name": "Dolphin and Whale Watching Tour", + "description": "Set sail on a thrilling boat tour in search of majestic marine life. The Osa Peninsula's waters are home to dolphins, whales, and other fascinating creatures. Watch in awe as they breach and play in their natural habitat, creating unforgettable memories.", + "locationName": "Drake Bay or Golfo Dulce", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "costa-rica", + "ref": "dolphin-and-whale-watching-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_dolphin-and-whale-watching-tour.jpg" + }, + { + "name": "Scuba Diving or Snorkeling in Caño Island Biological Reserve", + "description": "Explore the vibrant underwater world of Caño Island Biological Reserve, a renowned diving and snorkeling destination. Discover colorful coral reefs teeming with tropical fish, sea turtles, and other marine life. Whether you're a seasoned diver or a beginner snorkeler, this is an experience not to be missed.", + "locationName": "Caño Island Biological Reserve", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "costa-rica", + "ref": "scuba-diving-or-snorkeling-in-ca-o-island-biological-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_scuba-diving-or-snorkeling-in-ca-o-island-biological-reserve.jpg" + }, + { + "name": "Indigenous Cultural Experience", + "description": "Immerse yourself in the rich culture and traditions of the indigenous communities that call the Osa Peninsula home. Visit a local village, learn about their way of life, and participate in traditional activities such as handicraft making or cooking classes. This is a meaningful way to connect with the local people and gain a deeper understanding of their heritage.", + "locationName": "Indigenous villages within the peninsula", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "costa-rica", + "ref": "indigenous-cultural-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_indigenous-cultural-experience.jpg" + }, + { + "name": "Sunset Cruise with Bioluminescence", + "description": "Embark on a magical sunset cruise along the coast of the Osa Peninsula. As the sun dips below the horizon, witness the breathtaking colors of the sky and the ocean. As darkness falls, be amazed by the bioluminescent plankton illuminating the water with their ethereal glow. This is a truly unforgettable experience.", + "locationName": "Drake Bay or Golfo Dulce", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "costa-rica", + "ref": "sunset-cruise-with-bioluminescence", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_sunset-cruise-with-bioluminescence.jpg" + }, + { + "name": "Mangrove Kayaking Tour", + "description": "Explore the intricate network of mangrove forests in the Sierpe River wetlands by kayak. Glide through the calm waters, observe the fascinating ecosystem, and encounter various bird species, reptiles, and even crocodiles in their natural habitat.", + "locationName": "Sierpe River", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "costa-rica", + "ref": "mangrove-kayaking-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_mangrove-kayaking-tour.jpg" + }, + { + "name": "Waterfall Hike and Swim", + "description": "Embark on a refreshing hike through the rainforest to discover hidden waterfalls cascading into crystal-clear pools. Take a dip in the cool water, surrounded by lush vegetation and the sounds of nature.", + "locationName": "Various locations throughout the Osa Peninsula", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "costa-rica", + "ref": "waterfall-hike-and-swim", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_waterfall-hike-and-swim.jpg" + }, + { + "name": "Night Walk in the Rainforest", + "description": "Experience the magic of the rainforest after dark with a guided night walk. Witness the nocturnal creatures come alive, listen to the symphony of insects, and marvel at the bioluminescent fungi that illuminate the forest floor.", + "locationName": "Various locations throughout the Osa Peninsula", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "costa-rica", + "ref": "night-walk-in-the-rainforest", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_night-walk-in-the-rainforest.jpg" + }, + { + "name": "Sustainable Chocolate Farm Tour", + "description": "Delve into the world of chocolate making with a visit to a sustainable cacao farm. Learn about the bean-to-bar process, from harvesting to production, and indulge in delicious chocolate tastings.", + "locationName": "Various locations throughout the Osa Peninsula", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "costa-rica", + "ref": "sustainable-chocolate-farm-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_sustainable-chocolate-farm-tour.jpg" + }, + { + "name": "Relaxation at a Jungle Spa", + "description": "Unwind and rejuvenate with a spa treatment amidst the tranquility of the rainforest. Choose from a variety of massages, body wraps, and other wellness therapies inspired by local ingredients and traditions.", + "locationName": "Various eco-lodges and resorts", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "costa-rica", + "ref": "relaxation-at-a-jungle-spa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_relaxation-at-a-jungle-spa.jpg" + }, + { + "name": "Sport Fishing Adventure", + "description": "Embark on an exhilarating sport fishing expedition in the Pacific Ocean waters surrounding the Osa Peninsula. Experienced local guides will lead you to the best fishing spots, where you can try your hand at catching marlin, sailfish, tuna, and other prized game fish. Whether you're a seasoned angler or a beginner, this adventure promises excitement and the chance to reel in a trophy catch.", + "locationName": "Pacific Ocean", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "costa-rica", + "ref": "sport-fishing-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_sport-fishing-adventure.jpg" + }, + { + "name": "Canopy Zipline Tour", + "description": "Soar through the rainforest canopy on an exhilarating zipline adventure. Experience the thrill of flying between platforms high above the jungle floor, enjoying breathtaking views of the surrounding landscape. This activity offers a unique perspective of the Osa Peninsula's biodiversity and is perfect for adrenaline seekers.", + "locationName": "Rainforest canopy", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "costa-rica", + "ref": "canopy-zipline-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_canopy-zipline-tour.jpg" + }, + { + "name": "Stargazing Experience", + "description": "Escape the city lights and immerse yourself in the wonders of the night sky. Join a guided stargazing tour led by an expert astronomer who will unveil the secrets of the cosmos. Learn about constellations, planets, and galaxies while marveling at the brilliance of the Milky Way.", + "locationName": "Remote location away from light pollution", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "costa-rica", + "ref": "stargazing-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_stargazing-experience.jpg" + }, + { + "name": "Culinary Journey: Traditional Costa Rican Cooking Class", + "description": "Delve into the vibrant flavors of Costa Rican cuisine by participating in a hands-on cooking class. Learn the secrets of preparing authentic dishes like gallo pinto, casado, and ceviche under the guidance of a local chef. This immersive experience will tantalize your taste buds and provide you with culinary skills to recreate these delicious recipes back home.", + "locationName": "Local cooking school or restaurant", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "costa-rica", + "ref": "culinary-journey-traditional-costa-rican-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_culinary-journey-traditional-costa-rican-cooking-class.jpg" + }, + { + "name": "Off-Road ATV Excursion", + "description": "Embark on an adrenaline-pumping off-road adventure through the rugged terrain of the Osa Peninsula. Navigate muddy trails, cross rivers, and conquer challenging hills on a thrilling ATV ride. This exhilarating experience will take you deep into the jungle, offering a unique perspective of the peninsula's diverse landscapes.", + "locationName": "Off-road trails", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "costa-rica", + "ref": "off-road-atv-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/costa-rica_off-road-atv-excursion.jpg" + }, + { + "name": "Ascend the Burj Khalifa", + "description": "Experience breathtaking panoramic views of Dubai's skyline from the observation deck of the Burj Khalifa, the world's tallest building. Marvel at the city's iconic landmarks, including the Palm Jumeirah and the Dubai Fountain, from a unique perspective.", + "locationName": "Burj Khalifa", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "dubai", + "ref": "ascend-the-burj-khalifa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_ascend-the-burj-khalifa.jpg" + }, + { + "name": "Explore the Dubai Mall", + "description": "Indulge in a shopping extravaganza at the Dubai Mall, one of the world's largest shopping destinations. Discover a vast array of luxury brands, high-street fashion, and unique boutiques, along with an indoor theme park, an ice rink, and a stunning aquarium.", + "locationName": "Dubai Mall", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "dubai", + "ref": "explore-the-dubai-mall", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_explore-the-dubai-mall.jpg" + }, + { + "name": "Embark on a Desert Safari", + "description": "Escape the city and venture into the golden sands of the Arabian Desert on an exhilarating desert safari. Experience dune bashing, sandboarding, camel riding, and a traditional Bedouin camp with cultural performances and a delicious barbecue dinner.", + "locationName": "Dubai Desert Conservation Reserve", + "duration": 6, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "dubai", + "ref": "embark-on-a-desert-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_embark-on-a-desert-safari.jpg" + }, + { + "name": "Discover the Dubai Fountain Show", + "description": "Witness the captivating spectacle of the Dubai Fountain Show, a mesmerizing display of water, music, and light. Set on the Burj Khalifa Lake, the fountain dances to a variety of melodies, creating a truly unforgettable experience.", + "locationName": "Burj Khalifa Lake", + "duration": 1, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "dubai", + "ref": "discover-the-dubai-fountain-show", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_discover-the-dubai-fountain-show.jpg" + }, + { + "name": "Visit the Jumeirah Mosque", + "description": "Immerse yourself in Islamic culture with a visit to the Jumeirah Mosque, a stunning example of modern Islamic architecture. Take a guided tour to learn about the mosque's history and significance, and admire its intricate details and serene atmosphere.", + "locationName": "Jumeirah Mosque", + "duration": 1, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "dubai", + "ref": "visit-the-jumeirah-mosque", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_visit-the-jumeirah-mosque.jpg" + }, + { + "name": "Hot Air Balloon Ride over the Desert", + "description": "Experience the breathtaking beauty of the Dubai desert from a unique perspective with a hot air balloon ride. Ascend at sunrise for panoramic views of the golden dunes, watch falcons soar through the sky, and enjoy a sense of tranquility as you float above the landscape. This unforgettable experience is perfect for capturing stunning photos and creating lasting memories.", + "locationName": "Dubai Desert Conservation Reserve", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "dubai", + "ref": "hot-air-balloon-ride-over-the-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_hot-air-balloon-ride-over-the-desert.jpg" + }, + { + "name": "Explore the Al Fahidi Historical Neighbourhood", + "description": "Step back in time and immerse yourself in Dubai's rich history at the Al Fahidi Historical Neighbourhood. Wander through the narrow alleyways, admire the traditional wind towers, and visit the Dubai Museum to learn about the city's evolution. This cultural experience offers a glimpse into Dubai's past and provides a stark contrast to its modern skyscrapers.", + "locationName": "Al Fahidi Historical Neighbourhood", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "dubai", + "ref": "explore-the-al-fahidi-historical-neighbourhood", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_explore-the-al-fahidi-historical-neighbourhood.jpg" + }, + { + "name": "Indulge in a Relaxing Spa Day", + "description": "Escape the hustle and bustle of the city and rejuvenate your mind and body with a luxurious spa day. Dubai offers a wide range of world-class spas, each with unique treatments and amenities. Indulge in a traditional hammam experience, enjoy a massage, or simply unwind in a serene environment. This is the perfect way to de-stress and pamper yourself during your vacation.", + "locationName": "Various spas throughout Dubai", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "dubai", + "ref": "indulge-in-a-relaxing-spa-day", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_indulge-in-a-relaxing-spa-day.jpg" + }, + { + "name": "Cruise along Dubai Creek on a Traditional Dhow", + "description": "Experience the charm of old Dubai with a traditional dhow cruise along Dubai Creek. Admire the city's skyline from the water, enjoy a delicious dinner on board, and soak up the vibrant atmosphere. This is a great way to see a different side of Dubai and learn about its maritime heritage.", + "locationName": "Dubai Creek", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "dubai", + "ref": "cruise-along-dubai-creek-on-a-traditional-dhow", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_cruise-along-dubai-creek-on-a-traditional-dhow.jpg" + }, + { + "name": "Visit the Dubai Miracle Garden", + "description": "Immerse yourself in a world of floral wonder at the Dubai Miracle Garden. Marvel at the intricate displays of millions of flowers, arranged in stunning sculptures and patterns. This unique attraction is a feast for the senses and a perfect spot for photography enthusiasts.", + "locationName": "Dubai Miracle Garden", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "dubai", + "ref": "visit-the-dubai-miracle-garden", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_visit-the-dubai-miracle-garden.jpg" + }, + { + "name": "Kite Beach", + "description": "Soak up the sun and enjoy the vibrant atmosphere of Kite Beach. This popular spot offers stunning views of the Burj Al Arab and a wide range of activities such as swimming, sunbathing, kite surfing, and beach volleyball. The beach also features a variety of cafes and restaurants, making it the perfect place to spend a relaxing day by the sea.", + "locationName": "Kite Beach", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "dubai", + "ref": "kite-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_kite-beach.jpg" + }, + { + "name": "Ski Dubai", + "description": "Experience the thrill of skiing and snowboarding in the heart of the desert at Ski Dubai, an indoor ski resort located within the Mall of the Emirates. With five slopes of varying difficulty, a snow park, and even penguin encounters, Ski Dubai offers a unique and unforgettable winter wonderland experience.", + "locationName": "Mall of the Emirates", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "dubai", + "ref": "ski-dubai", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_ski-dubai.jpg" + }, + { + "name": "Dubai Opera", + "description": "Immerse yourself in the world of performing arts at the iconic Dubai Opera. This architectural masterpiece hosts a diverse range of shows, including opera, ballet, theatre, and concerts. Enjoy a memorable evening of entertainment and culture in a truly stunning setting.", + "locationName": "Dubai Opera", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "dubai", + "ref": "dubai-opera", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_dubai-opera.jpg" + }, + { + "name": "IMG Worlds of Adventure", + "description": "Embark on an exhilarating adventure at IMG Worlds of Adventure, one of the largest indoor theme parks in the world. With four themed zones featuring rides, attractions, and experiences based on popular characters and franchises, IMG Worlds of Adventure offers endless fun for all ages.", + "locationName": "IMG Worlds of Adventure", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "dubai", + "ref": "img-worlds-of-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_img-worlds-of-adventure.jpg" + }, + { + "name": "Dubai Frame", + "description": "Capture breathtaking panoramic views of Dubai from the Dubai Frame, a unique architectural landmark that resembles a giant picture frame. Experience the contrast between Old and New Dubai as you gaze out at the city's iconic skyline and historic neighborhoods from a 150-meter-high sky deck.", + "locationName": "Zabeel Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "dubai", + "ref": "dubai-frame", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_dubai-frame.jpg" + }, + { + "name": "Jet Ski Adventure on the Arabian Gulf", + "description": "Experience the thrill of gliding across the turquoise waters of the Arabian Gulf on a jet ski. Feel the wind in your hair as you zoom past iconic landmarks like the Burj Al Arab and Palm Jumeirah. Whether you're a seasoned rider or a first-timer, this exhilarating adventure is sure to get your adrenaline pumping.", + "locationName": "Jumeirah Beach Residence (JBR) Beach", + "duration": 1.5, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "dubai", + "ref": "jet-ski-adventure-on-the-arabian-gulf", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_jet-ski-adventure-on-the-arabian-gulf.jpg" + }, + { + "name": "Immerse Yourself in Art and Culture at Alserkal Avenue", + "description": "Escape the glitz and glamour and delve into Dubai's thriving art scene at Alserkal Avenue. Explore contemporary art galleries showcasing works by local and international artists, attend thought-provoking exhibitions, and discover hidden gems in this vibrant cultural hub. With its trendy cafes and unique shops, Alserkal Avenue offers a refreshing and inspiring experience.", + "locationName": "Al Quoz Industrial Area", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "dubai", + "ref": "immerse-yourself-in-art-and-culture-at-alserkal-avenue", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_immerse-yourself-in-art-and-culture-at-alserkal-avenue.jpg" + }, + { + "name": "Savor Authentic Emirati Cuisine at Al Fanar Restaurant", + "description": "Embark on a culinary journey through Emirati heritage at Al Fanar Restaurant. Step into a traditional setting and indulge in authentic dishes like machboos, thereed, and luqaimat. With its warm hospitality and rich flavors, Al Fanar offers a cultural and gastronomic experience that will transport you to the heart of Emirati traditions.", + "locationName": "Al Seef", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "dubai", + "ref": "savor-authentic-emirati-cuisine-at-al-fanar-restaurant", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_savor-authentic-emirati-cuisine-at-al-fanar-restaurant.jpg" + }, + { + "name": "Witness the Magic of La Perle", + "description": "Prepare to be mesmerized by La Perle, a breathtaking aqua-based show that combines acrobatics, aquatic stunts, and stunning visuals. Watch in awe as talented performers dive, fly, and dance through the air, creating a spectacle that will leave you speechless.", + "locationName": "Al Habtoor City", + "duration": 1.5, + "timeOfDay": "night", + "familyFriendly": true, + "price": 4, + "destinationRef": "dubai", + "ref": "witness-the-magic-of-la-perle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_witness-the-magic-of-la-perle.jpg" + }, + { + "name": "Shop for Unique Souvenirs at the Spice Souk and Gold Souk", + "description": "Immerse yourself in the vibrant atmosphere of Dubai's traditional markets. Wander through the aromatic Spice Souk, where you can find exotic spices, herbs, and teas from around the world. Then, head to the dazzling Gold Souk, where you can marvel at exquisite gold jewelry and handcrafted pieces.", + "locationName": "Deira", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "dubai", + "ref": "shop-for-unique-souvenirs-at-the-spice-souk-and-gold-souk", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubai_shop-for-unique-souvenirs-at-the-spice-souk-and-gold-souk.jpg" + }, + { + "name": "Walk the Ancient City Walls", + "description": "Embark on a journey through time as you walk along the magnificent city walls of Dubrovnik, a UNESCO World Heritage Site. Take in breathtaking panoramic views of the Adriatic Sea, the terracotta rooftops of the Old Town, and the surrounding islands. Explore historical forts and towers, and immerse yourself in the rich history of this ancient city.", + "locationName": "Dubrovnik City Walls", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "dubrovnik", + "ref": "walk-the-ancient-city-walls", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_walk-the-ancient-city-walls.jpg" + }, + { + "name": "Explore the Old Town", + "description": "Step into a labyrinth of narrow cobblestone streets and discover the charm of Dubrovnik's Old Town. Admire the stunning architecture, from the Renaissance Rector's Palace to the Baroque St. Blaise Church. Visit the Franciscan Monastery with its tranquil cloister and ancient pharmacy, or explore the Sponza Palace, a masterpiece of Gothic and Renaissance styles. Don't forget to enjoy a coffee or a delicious meal at one of the many cafes and restaurants.", + "locationName": "Dubrovnik Old Town", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "dubrovnik", + "ref": "explore-the-old-town", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_explore-the-old-town.jpg" + }, + { + "name": "Kayaking and Snorkeling Adventure", + "description": "Embark on a sea kayaking adventure along the Dubrovnik coastline. Paddle through crystal-clear waters, explore hidden caves and secluded beaches, and discover the underwater world with snorkeling gear. This is a fantastic way to experience the natural beauty of the Adriatic Sea while enjoying some physical activity.", + "locationName": "Dubrovnik Coastline", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "dubrovnik", + "ref": "kayaking-and-snorkeling-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_kayaking-and-snorkeling-adventure.jpg" + }, + { + "name": "Game of Thrones Tour", + "description": "Calling all Game of Thrones fans! Immerse yourselves in the world of Westeros with a guided tour of Dubrovnik's iconic filming locations. Relive memorable scenes, learn behind-the-scenes secrets, and discover why Dubrovnik was chosen as the perfect setting for King's Landing.", + "locationName": "Various locations in Dubrovnik", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "dubrovnik", + "ref": "game-of-thrones-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_game-of-thrones-tour.jpg" + }, + { + "name": "Cable Car Ride to Mount Srđ", + "description": "Take a scenic cable car ride to the top of Mount Srđ and enjoy breathtaking panoramic views of Dubrovnik and the surrounding islands. Visit the Imperial Fort, a historical landmark offering stunning vistas, and explore the Homeland War Museum to learn about the city's recent history. For a romantic experience, enjoy a memorable sunset dinner at the Panorama Restaurant.", + "locationName": "Mount Srđ", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "dubrovnik", + "ref": "cable-car-ride-to-mount-sr-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_cable-car-ride-to-mount-sr-.jpg" + }, + { + "name": "Island Hopping Adventure", + "description": "Embark on a boat tour to the Elafiti Islands, a cluster of idyllic islands just off the coast of Dubrovnik. Explore hidden coves, relax on pristine beaches, and enjoy swimming in the crystal-clear waters. Some tours offer lunch stops at local restaurants on the islands, allowing you to savor fresh seafood and traditional Croatian cuisine.", + "locationName": "Elafiti Islands", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "dubrovnik", + "ref": "island-hopping-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_island-hopping-adventure.jpg" + }, + { + "name": "Sea Kayaking along the Coast", + "description": "Experience Dubrovnik's stunning coastline from a different perspective with a sea kayaking adventure. Paddle along the city walls, explore hidden caves, and admire the panoramic views of the Adriatic Sea. Guided tours often include snorkeling stops, allowing you to discover the underwater world teeming with marine life.", + "locationName": "Dubrovnik Coast", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "dubrovnik", + "ref": "sea-kayaking-along-the-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_sea-kayaking-along-the-coast.jpg" + }, + { + "name": "Lokrum Island Escape", + "description": "Take a short ferry ride to Lokrum Island, a natural oasis just a stone's throw from Dubrovnik's Old Town. Explore the botanical gardens, visit the Benedictine monastery ruins, and discover the legendary \"Dead Sea\", a small saltwater lake. Enjoy a picnic amidst the peaceful surroundings or simply relax on the rocky beaches.", + "locationName": "Lokrum Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "dubrovnik", + "ref": "lokrum-island-escape", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_lokrum-island-escape.jpg" + }, + { + "name": "Culinary Delights at Konoba Dubrava", + "description": "Indulge in an authentic Croatian dining experience at Konoba Dubrava, a charming restaurant nestled in the hills above Dubrovnik. Savor traditional dishes like peka (slow-cooked meat and vegetables), fresh seafood specialties, and homemade desserts. Enjoy breathtaking views of the city and the Adriatic Sea while relishing the flavors of the region.", + "locationName": "Konoba Dubrava", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "dubrovnik", + "ref": "culinary-delights-at-konoba-dubrava", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_culinary-delights-at-konoba-dubrava.jpg" + }, + { + "name": "Sunset Cruise with Dinner", + "description": "Embark on a romantic sunset cruise along the Dubrovnik coastline. Sail past the city walls and nearby islands, enjoying breathtaking views of the Adriatic as the sun dips below the horizon. Many cruises offer delicious dinner options, allowing you to savor local cuisine while admiring the picturesque scenery.", + "locationName": "Dubrovnik Coast", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "dubrovnik", + "ref": "sunset-cruise-with-dinner", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_sunset-cruise-with-dinner.jpg" + }, + { + "name": "Wine Tasting Tour in the Konavle Valley", + "description": "Embark on a delightful journey through the picturesque Konavle Valley, renowned for its fertile vineyards and family-run wineries. Indulge in the region's rich winemaking traditions as you sample exquisite local wines, from robust reds to crisp whites, paired with delectable regional specialties. Immerse yourself in the stunning landscapes and charming villages, learning about the unique grape varieties and winemaking techniques that make Konavle wines so special.", + "locationName": "Konavle Valley", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "dubrovnik", + "ref": "wine-tasting-tour-in-the-konavle-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_wine-tasting-tour-in-the-konavle-valley.jpg" + }, + { + "name": "Hiking and Swimming at Mount Srđ", + "description": "For breathtaking panoramic views of Dubrovnik and the Adriatic Sea, embark on a hike up Mount Srđ. Follow scenic trails through lush Mediterranean vegetation, reaching the summit where you'll be rewarded with stunning vistas. Cool off with a refreshing swim at the hidden beach below, or explore the historic Imperial Fortress, a testament to Dubrovnik's resilience.", + "locationName": "Mount Srđ", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "dubrovnik", + "ref": "hiking-and-swimming-at-mount-sr-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_hiking-and-swimming-at-mount-sr-.jpg" + }, + { + "name": "Explore the Elafiti Islands by Boat", + "description": "Escape the bustling city and set sail on a boat trip to the Elafiti Islands, a cluster of idyllic islands just off the coast of Dubrovnik. Discover hidden coves, swim in crystal-clear waters, and explore charming fishing villages. Visit Koločep, Šipan, and Lopud, each offering unique landscapes, historical sites, and relaxed island vibes.", + "locationName": "Elafiti Islands", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "dubrovnik", + "ref": "explore-the-elafiti-islands-by-boat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_explore-the-elafiti-islands-by-boat.jpg" + }, + { + "name": "Catch a Performance at the Dubrovnik Summer Festival", + "description": "Immerse yourself in the vibrant cultural scene of Dubrovnik by attending a performance at the renowned Dubrovnik Summer Festival. Held annually from July to August, the festival showcases a diverse program of theatre, music, dance, and opera performances at various historical venues throughout the city. Experience the magic of open-air performances under the starry sky, surrounded by Dubrovnik's enchanting architecture.", + "locationName": "Various locations in Dubrovnik Old Town", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "dubrovnik", + "ref": "catch-a-performance-at-the-dubrovnik-summer-festival", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_catch-a-performance-at-the-dubrovnik-summer-festival.jpg" + }, + { + "name": "Discover Local Life at Gruž Market", + "description": "Immerse yourself in the local culture and experience the sights, sounds, and aromas of Dubrovnik's Gruž Market. Browse through stalls overflowing with fresh produce, local cheeses, cured meats, and handmade crafts. Engage with friendly vendors, sample regional delicacies, and find unique souvenirs to remember your trip.", + "locationName": "Gruž Market", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "dubrovnik", + "ref": "discover-local-life-at-gru-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_discover-local-life-at-gru-market.jpg" + }, + { + "name": "Cliff Jumping Adventure", + "description": "For thrill-seekers, experience the adrenaline rush of cliff jumping into the crystal-clear Adriatic Sea. Local guides will lead you to hidden coves and cliffs, ensuring safety while providing an unforgettable adventure.", + "locationName": "Various coastal locations", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "dubrovnik", + "ref": "cliff-jumping-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_cliff-jumping-adventure.jpg" + }, + { + "name": "Relaxing Beach Day at Banje Beach", + "description": "Soak up the sun and unwind on the picturesque Banje Beach, located just outside the Old Town walls. Rent a sun lounger, enjoy refreshing cocktails from nearby bars, and take a dip in the azure waters for a perfect beach escape.", + "locationName": "Banje Beach", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "dubrovnik", + "ref": "relaxing-beach-day-at-banje-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_relaxing-beach-day-at-banje-beach.jpg" + }, + { + "name": "Museum Hopping in Dubrovnik", + "description": "Delve into Dubrovnik's rich history and culture by visiting its diverse museums. Explore the Rector's Palace, the Maritime Museum, or the Franciscan Monastery Museum to discover fascinating artifacts and stories.", + "locationName": "Various museums in Dubrovnik", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "dubrovnik", + "ref": "museum-hopping-in-dubrovnik", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_museum-hopping-in-dubrovnik.jpg" + }, + { + "name": "Sea Kayaking and Snorkeling at Betina Cave", + "description": "Embark on a sea kayaking adventure to the enchanting Betina Cave, accessible only by water. Explore the cave's interior, snorkel in the turquoise waters, and marvel at the natural beauty of the hidden gem.", + "locationName": "Betina Cave", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "dubrovnik", + "ref": "sea-kayaking-and-snorkeling-at-betina-cave", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_sea-kayaking-and-snorkeling-at-betina-cave.jpg" + }, + { + "name": "Scenic Hike to Fort Lovrijenac", + "description": "Enjoy a scenic hike to Fort Lovrijenac, a historic fortress perched on a cliff overlooking the Adriatic Sea. Capture breathtaking panoramic views of the city and coastline while immersing yourself in the fort's fascinating history.", + "locationName": "Fort Lovrijenac", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "dubrovnik", + "ref": "scenic-hike-to-fort-lovrijenac", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/dubrovnik_scenic-hike-to-fort-lovrijenac.jpg" + }, + { + "name": "Explore the Rock-Hewn Churches of Lalibela", + "description": "Embark on a spiritual journey to Lalibela, a UNESCO World Heritage Site, and marvel at the 11 monolithic churches carved directly into the rock. Witness the intricate architecture, learn about their religious significance, and experience the unique atmosphere of this ancient pilgrimage site.", + "locationName": "Lalibela", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "ethiopia", + "ref": "explore-the-rock-hewn-churches-of-lalibela", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_explore-the-rock-hewn-churches-of-lalibela.jpg" + }, + { + "name": "Trekking in the Simien Mountains", + "description": "Embark on an unforgettable trekking adventure through the breathtaking Simien Mountains National Park. Hike amidst dramatic landscapes, encounter endemic wildlife such as the Gelada baboons, and enjoy panoramic views from Ras Dashen, Ethiopia's highest peak.", + "locationName": "Simien Mountains National Park", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "ethiopia", + "ref": "trekking-in-the-simien-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_trekking-in-the-simien-mountains.jpg" + }, + { + "name": "Discover the Vibrant Culture of the Omo Valley", + "description": "Immerse yourself in the rich cultural tapestry of the Omo Valley, home to diverse indigenous tribes like the Mursi, Hamar, and Karo. Witness their unique customs, adornments, and traditional way of life, and gain insights into their fascinating cultures.", + "locationName": "Omo Valley", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "ethiopia", + "ref": "discover-the-vibrant-culture-of-the-omo-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_discover-the-vibrant-culture-of-the-omo-valley.jpg" + }, + { + "name": "Visit the Bustling Merkato Market in Addis Ababa", + "description": "Experience the vibrant energy of Merkato, one of the largest open-air markets in Africa. Explore a labyrinth of stalls selling everything from spices and textiles to handicrafts and electronics, and get a taste of local life in Addis Ababa.", + "locationName": "Addis Ababa", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "ethiopia", + "ref": "visit-the-bustling-merkato-market-in-addis-ababa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_visit-the-bustling-merkato-market-in-addis-ababa.jpg" + }, + { + "name": "Coffee Ceremony and Cultural Experience", + "description": "Participate in a traditional Ethiopian coffee ceremony, a social ritual that involves roasting, grinding, and brewing coffee beans. Learn about the cultural significance of coffee in Ethiopia and enjoy the unique flavors and aromas of this ancient tradition.", + "locationName": "Various locations", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "ethiopia", + "ref": "coffee-ceremony-and-cultural-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_coffee-ceremony-and-cultural-experience.jpg" + }, + { + "name": "Visit the Danakil Depression", + "description": "Embark on an adventurous expedition to the Danakil Depression, one of the hottest and lowest places on Earth. Witness the surreal landscapes of salt flats, sulfur springs, and volcanic formations. Explore the unique geology and encounter the Afar people, known for their resilience and distinctive culture.", + "locationName": "Danakil Depression", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "ethiopia", + "ref": "visit-the-danakil-depression", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_visit-the-danakil-depression.jpg" + }, + { + "name": "Explore the Blue Nile Falls", + "description": "Witness the breathtaking beauty of the Blue Nile Falls, also known as Tis Abay. Hike through lush landscapes to reach the cascading waterfalls and feel the mist on your face. Capture stunning photos and enjoy the serene atmosphere of this natural wonder.", + "locationName": "Blue Nile Falls", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "ethiopia", + "ref": "explore-the-blue-nile-falls", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_explore-the-blue-nile-falls.jpg" + }, + { + "name": "Discover the Ancient City of Aksum", + "description": "Step back in time and explore the ancient city of Aksum, a UNESCO World Heritage Site. Marvel at the towering stelae, obelisks, and ruins of palaces and temples. Learn about the rich history and legends of the Aksumite Empire, one of the most powerful civilizations in ancient Africa.", + "locationName": "Aksum", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "ethiopia", + "ref": "discover-the-ancient-city-of-aksum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_discover-the-ancient-city-of-aksum.jpg" + }, + { + "name": "Relax at Lake Tana", + "description": "Escape to the tranquil shores of Lake Tana, the largest lake in Ethiopia. Take a boat trip to visit the island monasteries, known for their beautiful frescoes and historical significance. Enjoy swimming, birdwatching, or simply relaxing by the serene waters.", + "locationName": "Lake Tana", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "ethiopia", + "ref": "relax-at-lake-tana", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_relax-at-lake-tana.jpg" + }, + { + "name": "Wildlife Watching in Awash National Park", + "description": "Embark on a wildlife adventure in Awash National Park, home to diverse animal species. Spot lions, zebras, gazelles, and various bird species in their natural habitat. Enjoy game drives, guided walks, and the chance to experience the Ethiopian wilderness.", + "locationName": "Awash National Park", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "ethiopia", + "ref": "wildlife-watching-in-awash-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_wildlife-watching-in-awash-national-park.jpg" + }, + { + "name": "Birdwatching in the Bale Mountains", + "description": "Embark on a captivating birdwatching adventure in the Bale Mountains National Park, home to diverse avian species including the endemic Ethiopian wolf, mountain nyala, and numerous birds of prey. Hike through stunning landscapes, spot colorful birds, and immerse yourself in the tranquility of nature.", + "locationName": "Bale Mountains National Park", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "ethiopia", + "ref": "birdwatching-in-the-bale-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_birdwatching-in-the-bale-mountains.jpg" + }, + { + "name": "Visit the Harar Jugol, the Fortified Historic Town", + "description": "Step back in time and explore the ancient walled city of Harar Jugol, a UNESCO World Heritage Site. Wander through narrow alleyways, admire the traditional Harari houses, visit vibrant markets, and witness the unique Hyena feeding ritual.", + "locationName": "Harar", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "ethiopia", + "ref": "visit-the-harar-jugol-the-fortified-historic-town", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_visit-the-harar-jugol-the-fortified-historic-town.jpg" + }, + { + "name": "White-Water Rafting on the Omo River", + "description": "Experience an adrenaline-pumping adventure with white-water rafting on the Omo River. Navigate through thrilling rapids, witness stunning scenery, and encounter remote villages along the riverbanks.", + "locationName": "Omo River", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "ethiopia", + "ref": "white-water-rafting-on-the-omo-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_white-water-rafting-on-the-omo-river.jpg" + }, + { + "name": "Sample Ethiopian Cuisine and Honey Wine", + "description": "Embark on a culinary journey and savor the unique flavors of Ethiopian cuisine. Try traditional dishes like injera (flatbread), wat (stews), and kitfo (minced beef), and indulge in the sweet taste of tej, a local honey wine.", + "locationName": "Various restaurants and cafes throughout Ethiopia", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "ethiopia", + "ref": "sample-ethiopian-cuisine-and-honey-wine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_sample-ethiopian-cuisine-and-honey-wine.jpg" + }, + { + "name": "Attend the Timkat Festival (Ethiopian Epiphany)", + "description": "Immerse yourself in the vibrant cultural celebration of Timkat, the Ethiopian Epiphany. Witness colorful processions, traditional dances, and the reenactment of Jesus' baptism, a truly unforgettable experience.", + "locationName": "Various locations throughout Ethiopia", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "ethiopia", + "ref": "attend-the-timkat-festival-ethiopian-epiphany-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_attend-the-timkat-festival-ethiopian-epiphany-.jpg" + }, + { + "name": "Horseback Riding in the Gheralta Mountains", + "description": "Embark on a scenic horseback riding adventure through the Gheralta Mountains, known for their dramatic landscapes and rock-hewn churches. Explore hidden trails, visit remote villages, and enjoy breathtaking views of the surrounding valleys. This activity is suitable for riders of all levels and offers a unique perspective on the region's natural beauty and cultural heritage.", + "locationName": "Gheralta Mountains", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "ethiopia", + "ref": "horseback-riding-in-the-gheralta-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_horseback-riding-in-the-gheralta-mountains.jpg" + }, + { + "name": "Hot Air Balloon Ride over the Rift Valley", + "description": "Soar above the stunning landscapes of the Ethiopian Rift Valley in a hot air balloon. Witness panoramic views of volcanic craters, shimmering lakes, and traditional villages as you drift peacefully through the sky. This unforgettable experience offers a unique perspective on the region's geological wonders and cultural diversity.", + "locationName": "Ethiopian Rift Valley", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "ethiopia", + "ref": "hot-air-balloon-ride-over-the-rift-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_hot-air-balloon-ride-over-the-rift-valley.jpg" + }, + { + "name": "Visit the Yirgacheffe Coffee Farms", + "description": "Delve into the world of Ethiopian coffee with a visit to the renowned Yirgacheffe coffee farms. Learn about the coffee cultivation process, from bean to cup, and participate in a traditional coffee ceremony. Savor the rich flavors of freshly brewed Yirgacheffe coffee and discover why Ethiopia is considered the birthplace of coffee.", + "locationName": "Yirgacheffe", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "ethiopia", + "ref": "visit-the-yirgacheffe-coffee-farms", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_visit-the-yirgacheffe-coffee-farms.jpg" + }, + { + "name": "Explore the Ruins of Gondar", + "description": "Step back in time at the Royal Enclosure of Gondar, a UNESCO World Heritage Site. Explore the impressive castles, palaces, and churches built by Ethiopian emperors during the 17th and 18th centuries. Discover the rich history and architectural marvels of this once-powerful kingdom.", + "locationName": "Gondar", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "ethiopia", + "ref": "explore-the-ruins-of-gondar", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_explore-the-ruins-of-gondar.jpg" + }, + { + "name": "Stargazing in the Danakil Depression", + "description": "Experience the magic of the night sky in the Danakil Depression, one of the lowest and hottest places on Earth. Away from light pollution, marvel at the brilliance of the Milky Way and constellations. This unique experience offers a chance to connect with nature and appreciate the vastness of the universe.", + "locationName": "Danakil Depression", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "ethiopia", + "ref": "stargazing-in-the-danakil-depression", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ethiopia_stargazing-in-the-danakil-depression.jpg" + }, + { + "name": "Explore the Etruscan and Roman Ruins", + "description": "Step back in time and discover the ancient history of Fiesole at the Archaeological Area. Explore the remains of Etruscan walls, Roman baths, and an ancient theatre, imagining life in this hilltop town centuries ago. The panoramic views of the surrounding Tuscan countryside add to the magic of this historical experience.", + "locationName": "Archaeological Area of Fiesole", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "fiesole", + "ref": "explore-the-etruscan-and-roman-ruins", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_explore-the-etruscan-and-roman-ruins.jpg" + }, + { + "name": "Visit the Fiesole Cathedral", + "description": "Immerse yourself in the spiritual and artistic beauty of the Cattedrale di San Romolo. Admire the Romanesque architecture, intricate frescoes, and serene atmosphere of this historic cathedral. Take a moment for quiet reflection and appreciate the cultural significance of this religious landmark.", + "locationName": "Cattedrale di San Romolo", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "fiesole", + "ref": "visit-the-fiesole-cathedral", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_visit-the-fiesole-cathedral.jpg" + }, + { + "name": "Stroll through the Historic Center", + "description": "Wander through the charming streets of Fiesole's historic center, lined with quaint shops, cafes, and centuries-old buildings. Discover hidden squares, admire the local architecture, and soak up the authentic Italian atmosphere. This leisurely walk is a perfect way to experience the town's unique character and charm.", + "locationName": "Fiesole Historic Center", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "fiesole", + "ref": "stroll-through-the-historic-center", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_stroll-through-the-historic-center.jpg" + }, + { + "name": "Enjoy Panoramic Views at the Monastery of San Francesco", + "description": "Hike or drive up to the Monastery of San Francesco, perched on the highest point of Fiesole. Be rewarded with breathtaking panoramic views of Florence, the Arno Valley, and the rolling Tuscan hills. Explore the peaceful monastery grounds and enjoy a moment of serenity surrounded by nature's beauty.", + "locationName": "Monastery of San Francesco", + "duration": 1.5, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "fiesole", + "ref": "enjoy-panoramic-views-at-the-monastery-of-san-francesco", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_enjoy-panoramic-views-at-the-monastery-of-san-francesco.jpg" + }, + { + "name": "Indulge in Tuscan Cuisine", + "description": "Treat your taste buds to the delicious flavors of Tuscan cuisine at one of Fiesole's charming restaurants or trattorias. Savor local specialties like ribollita (vegetable soup), bistecca alla Fiorentina (Florentine steak), and cantucci (almond biscotti) paired with a glass of Chianti wine. Enjoy a romantic dinner with stunning views or a casual lunch in a cozy atmosphere.", + "locationName": "Various restaurants in Fiesole", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "fiesole", + "ref": "indulge-in-tuscan-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_indulge-in-tuscan-cuisine.jpg" + }, + { + "name": "Hike to the top of Monte Ceceri", + "description": "Embark on a scenic hike to the summit of Monte Ceceri, where you'll be rewarded with panoramic views of Florence and the surrounding Tuscan landscape. This moderate hike takes you through picturesque olive groves and offers a glimpse into the region's natural beauty.", + "locationName": "Monte Ceceri", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "fiesole", + "ref": "hike-to-the-top-of-monte-ceceri", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_hike-to-the-top-of-monte-ceceri.jpg" + }, + { + "name": "Discover the Archaeological Area", + "description": "Delve into Fiesole's rich history at the Archaeological Area, home to Etruscan and Roman ruins, including an ancient theatre, baths, and temples. Explore the remnants of these ancient civilizations and imagine life centuries ago.", + "locationName": "Archaeological Area of Fiesole", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "fiesole", + "ref": "discover-the-archaeological-area", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_discover-the-archaeological-area.jpg" + }, + { + "name": "Visit the Bandini Museum", + "description": "Immerse yourself in art and history at the Bandini Museum, housed in a 14th-century palace. Admire its collection of Renaissance paintings and sculptures, including works by Della Robbia and Lorenzo Monaco. The museum also offers stunning views of the Tuscan countryside.", + "locationName": "Bandini Museum", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "fiesole", + "ref": "visit-the-bandini-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_visit-the-bandini-museum.jpg" + }, + { + "name": "Enjoy a Romantic Evening at a Local Trattoria", + "description": "Savor a delightful Tuscan dinner at a charming trattoria in Fiesole. Indulge in regional specialties like bistecca alla Fiorentina or pasta with wild boar ragu, paired with a glass of local Chianti wine. The intimate atmosphere and breathtaking views create a perfect setting for a romantic evening.", + "locationName": "Various trattorias in Fiesole", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "fiesole", + "ref": "enjoy-a-romantic-evening-at-a-local-trattoria", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_enjoy-a-romantic-evening-at-a-local-trattoria.jpg" + }, + { + "name": "Take a Cooking Class", + "description": "Learn the secrets of Tuscan cuisine by taking a cooking class. Discover the art of making fresh pasta, regional sauces, and traditional dishes under the guidance of a local chef. This hands-on experience allows you to bring a taste of Italy back home.", + "locationName": "Various cooking schools in Fiesole", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "fiesole", + "ref": "take-a-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_take-a-cooking-class.jpg" + }, + { + "name": "Truffle Hunting Experience", + "description": "Embark on a sensory adventure with a guided truffle hunt in the picturesque Tuscan countryside. Led by expert truffle hunters and their trained dogs, you'll discover the secrets of finding these prized delicacies. Learn about the different types of truffles, their growth cycle, and the traditional methods used to locate them. After the hunt, savor the unique flavors of fresh truffles with a delicious lunch or dinner at a local farmhouse.", + "locationName": "Tuscan Countryside near Fiesole", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "fiesole", + "ref": "truffle-hunting-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_truffle-hunting-experience.jpg" + }, + { + "name": "Wine Tasting at a Local Vineyard", + "description": "Indulge in the rich flavors of Tuscan wines with a visit to a nearby vineyard. Explore the vineyards, learn about the winemaking process, and sample a variety of local wines, including Chianti Classico, Brunello di Montalcino, and Vernaccia di San Gimignano. Many vineyards also offer stunning views of the rolling hills and charming villages, making it a perfect afternoon escape.", + "locationName": "Vineyards surrounding Fiesole", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "fiesole", + "ref": "wine-tasting-at-a-local-vineyard", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_wine-tasting-at-a-local-vineyard.jpg" + }, + { + "name": "Bike Tour through the Tuscan Hills", + "description": "Experience the beauty of the Tuscan landscape at your own pace with a leisurely bike tour. Rent a bike and follow scenic routes through olive groves, vineyards, and charming villages. Enjoy the fresh air, breathtaking views, and the opportunity to stop at local farms and wineries for refreshments and tastings.", + "locationName": "Tuscan Hills surrounding Fiesole", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "fiesole", + "ref": "bike-tour-through-the-tuscan-hills", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_bike-tour-through-the-tuscan-hills.jpg" + }, + { + "name": "Sunset Picnic with Panoramic Views", + "description": "Create a romantic and unforgettable experience with a sunset picnic overlooking the stunning Tuscan panorama. Pack a basket with local delicacies, find a secluded spot with breathtaking views, and enjoy a peaceful evening as the sun sets over the rolling hills and the city of Florence in the distance.", + "locationName": "Hills surrounding Fiesole with panoramic views", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "fiesole", + "ref": "sunset-picnic-with-panoramic-views", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_sunset-picnic-with-panoramic-views.jpg" + }, + { + "name": "Attend a Classical Music Concert", + "description": "Immerse yourself in the enchanting world of classical music with a concert at a historic venue in Fiesole. Enjoy performances by talented musicians in a beautiful setting, such as the Roman Theatre or the Fiesole Cathedral. The intimate atmosphere and acoustics of these venues create a truly special and memorable experience.", + "locationName": "Roman Theatre or Fiesole Cathedral", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "fiesole", + "ref": "attend-a-classical-music-concert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_attend-a-classical-music-concert.jpg" + }, + { + "name": "Olive Oil Tasting and Farm Tour", + "description": "Immerse yourself in the world of Tuscan olive oil with a visit to a local olive farm. Learn about the cultivation and production process, from grove to bottle, and savor the distinct flavors of freshly pressed extra virgin olive oil. Many farms offer tours that include a stroll through the olive groves, a demonstration of traditional pressing techniques, and a tasting session paired with local delicacies.", + "locationName": "Local olive farms in the Fiesole countryside", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "fiesole", + "ref": "olive-oil-tasting-and-farm-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_olive-oil-tasting-and-farm-tour.jpg" + }, + { + "name": "Explore the Bardini Garden", + "description": "Escape the crowds and discover the enchanting Bardini Garden, a hidden gem with breathtaking views of Florence. Wander through terraced gardens adorned with vibrant flowers, sculptures, and fountains. Enjoy a peaceful picnic amidst the greenery and capture stunning photos of the panoramic vistas.", + "locationName": "Bardini Garden", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "fiesole", + "ref": "explore-the-bardini-garden", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_explore-the-bardini-garden.jpg" + }, + { + "name": "Visit the San Domenico Monastery", + "description": "Delve into the spiritual heart of Fiesole with a visit to the San Domenico Monastery. Explore the serene cloisters, admire Renaissance masterpieces by Fra Angelico, and learn about the monastery's rich history. The peaceful atmosphere and stunning views make it a perfect place for quiet reflection.", + "locationName": "San Domenico Monastery", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "fiesole", + "ref": "visit-the-san-domenico-monastery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_visit-the-san-domenico-monastery.jpg" + }, + { + "name": "Take a Pottery Workshop", + "description": "Unleash your creativity and learn the art of Tuscan pottery. Join a workshop led by local artisans and try your hand at shaping clay on a potter's wheel. Create your own unique piece of ceramics to take home as a special souvenir of your trip.", + "locationName": "Local pottery studios in Fiesole", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 4, + "destinationRef": "fiesole", + "ref": "take-a-pottery-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_take-a-pottery-workshop.jpg" + }, + { + "name": "Stargazing Experience", + "description": "Escape the city lights and embark on a magical stargazing experience. Join a guided tour led by astronomy enthusiasts and learn about constellations, planets, and the wonders of the night sky. With minimal light pollution, Fiesole offers a perfect setting for observing the cosmos.", + "locationName": "Open areas with clear views of the sky, such as the top of Monte Ceceri", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "fiesole", + "ref": "stargazing-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiesole_stargazing-experience.jpg" + }, + { + "name": "Scuba Diving Adventure in the Soft Coral Capital", + "description": "Embark on an underwater adventure to explore the world-renowned coral reefs of Fiji, often called the 'Soft Coral Capital'. Dive into a kaleidoscope of vibrant colors as you encounter diverse marine life, from playful clownfish to majestic manta rays. Whether you're a seasoned diver or a beginner, Fiji offers dive sites suitable for all levels of experience. Discover the magic beneath the waves and create unforgettable memories in this underwater paradise.", + "locationName": "Rainbow Reef, Somosomo Strait", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "fiji", + "ref": "scuba-diving-adventure-in-the-soft-coral-capital", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_scuba-diving-adventure-in-the-soft-coral-capital.jpg" + }, + { + "name": "Island Hopping and Snorkeling", + "description": "Experience the beauty of Fiji's scattered islands with a leisurely island-hopping tour. Cruise through turquoise waters, stopping at idyllic islands where you can relax on pristine beaches, swim in crystal-clear lagoons, and explore vibrant coral reefs while snorkeling. Each island offers its own unique charm and a chance to immerse yourself in the local culture and way of life.", + "locationName": "Mamanuca Islands or Yasawa Islands", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "fiji", + "ref": "island-hopping-and-snorkeling", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_island-hopping-and-snorkeling.jpg" + }, + { + "name": "Sunset Cruise with Traditional Fijian Feast", + "description": "Sail into the golden sunset on a traditional Fijian outrigger canoe or a modern catamaran. As the sky transforms into a canvas of vibrant colors, savor a delicious Fijian feast prepared with fresh local ingredients. Enjoy the warm hospitality of the Fijian people and be captivated by their enchanting cultural performances, creating an unforgettable evening.", + "locationName": "Denarau Marina or Port Denarau", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "fiji", + "ref": "sunset-cruise-with-traditional-fijian-feast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_sunset-cruise-with-traditional-fijian-feast.jpg" + }, + { + "name": "Kava Ceremony and Village Visit", + "description": "Immerse yourself in Fijian culture with a visit to a traditional village. Participate in a kava ceremony, a significant cultural ritual where you'll share a bowl of kava, a mildly narcotic drink made from the root of the pepper plant. Learn about Fijian customs, traditions, and the unique way of life in these remote communities.", + "locationName": "Navala Village or Viseisei Village", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "fiji", + "ref": "kava-ceremony-and-village-visit", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_kava-ceremony-and-village-visit.jpg" + }, + { + "name": "Relaxation and Rejuvenation at a Fijian Spa", + "description": "Indulge in a pampering spa experience amidst the tranquility of Fiji's tropical paradise. Choose from a variety of treatments inspired by traditional Fijian practices and natural ingredients. Let your worries melt away as skilled therapists soothe your body and mind, leaving you feeling refreshed and rejuvenated.", + "locationName": "Various resorts and spas throughout Fiji", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "fiji", + "ref": "relaxation-and-rejuvenation-at-a-fijian-spa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_relaxation-and-rejuvenation-at-a-fijian-spa.jpg" + }, + { + "name": "Sigatoka River Safari", + "description": "Embark on an exhilarating jet boat ride up the Sigatoka River, Fiji's longest river. Journey through the lush rainforest, passing traditional Fijian villages and witnessing the captivating beauty of the island's interior. This adventure offers a unique blend of cultural immersion and thrilling excitement.", + "locationName": "Sigatoka River", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "fiji", + "ref": "sigatoka-river-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_sigatoka-river-safari.jpg" + }, + { + "name": "Garden of the Sleeping Giant", + "description": "Immerse yourself in the tranquil beauty of the Garden of the Sleeping Giant, a horticultural paradise nestled at the foothills of the Nausori Highlands. Stroll through vibrant orchid collections, admire diverse native flora, and discover the captivating legends surrounding this enchanting garden. Perfect for nature enthusiasts and those seeking a peaceful escape.", + "locationName": "Nausori Highlands", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "fiji", + "ref": "garden-of-the-sleeping-giant", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_garden-of-the-sleeping-giant.jpg" + }, + { + "name": "Cloud 9 Floating Bar", + "description": "Experience the ultimate in relaxation and revelry at Cloud 9, a unique floating bar located in the turquoise waters of the Mamanuca Islands. Soak up the sun, sip on tropical cocktails, enjoy delicious wood-fired pizzas, and dance to the rhythm of the ocean waves. This adults-only haven promises an unforgettable day of fun and indulgence.", + "locationName": "Mamanuca Islands", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "fiji", + "ref": "cloud-9-floating-bar", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_cloud-9-floating-bar.jpg" + }, + { + "name": "Navala Village Visit", + "description": "Step back in time with a visit to Navala Village, a traditional Fijian settlement nestled amidst the Ba Highlands. Immerse yourself in the rich cultural heritage of the villagers, witness their unique way of life, and gain insights into their customs and traditions. This authentic experience offers a glimpse into the heart and soul of Fiji.", + "locationName": "Ba Highlands", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "fiji", + "ref": "navala-village-visit", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_navala-village-visit.jpg" + }, + { + "name": "Fiji Museum", + "description": "Delve into Fiji's captivating history and cultural heritage at the Fiji Museum, located in the heart of Suva. Explore fascinating exhibits showcasing archaeological artifacts, traditional crafts, and historical photographs. Gain a deeper understanding of the island nation's past, from its early settlers to its colonial era and beyond.", + "locationName": "Suva", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "fiji", + "ref": "fiji-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_fiji-museum.jpg" + }, + { + "name": "Hiking the Lavena Coastal Walk", + "description": "Embark on a scenic coastal hike along the Lavena Coastal Walk on Taveuni Island. This moderately challenging trail winds through lush rainforests, offering breathtaking views of the coastline, secluded beaches, and cascading waterfalls. Keep an eye out for unique Fijian wildlife and immerse yourself in the island's natural beauty.", + "locationName": "Taveuni Island", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "fiji", + "ref": "hiking-the-lavena-coastal-walk", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_hiking-the-lavena-coastal-walk.jpg" + }, + { + "name": "Exploring the Kula Wild Adventure Park", + "description": "Get up close and personal with Fiji's native wildlife at the Kula Wild Adventure Park. This eco-friendly park offers a range of activities, including ziplining through the rainforest canopy, encountering iguanas and parrots, and learning about conservation efforts. It's an educational and exciting experience for all ages.", + "locationName": "Kula Wild Adventure Park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "fiji", + "ref": "exploring-the-kula-wild-adventure-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_exploring-the-kula-wild-adventure-park.jpg" + }, + { + "name": "Indulging in a Traditional Lovo Feast", + "description": "Experience the authentic flavors of Fiji with a traditional Lovo feast. This unique cooking method involves burying food in an underground oven lined with hot stones, resulting in tender meats, flavorful vegetables, and delicious root crops. Enjoy this communal dining experience while learning about Fijian culture and customs.", + "locationName": "Various locations", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "fiji", + "ref": "indulging-in-a-traditional-lovo-feast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_indulging-in-a-traditional-lovo-feast.jpg" + }, + { + "name": "Kayaking and Stand-Up Paddleboarding Adventures", + "description": "Explore the crystal-clear waters of Fiji at your own pace with kayaking and stand-up paddleboarding adventures. Glide along the coastline, discover hidden coves, and marvel at the vibrant marine life below. Whether you're a beginner or an experienced paddler, there are options for all skill levels.", + "locationName": "Various locations", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "fiji", + "ref": "kayaking-and-stand-up-paddleboarding-adventures", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_kayaking-and-stand-up-paddleboarding-adventures.jpg" + }, + { + "name": "Shopping for Fijian Handicrafts and Souvenirs", + "description": "Discover unique Fijian handicrafts and souvenirs at local markets and shops. Browse through a variety of items, including hand-woven baskets, wood carvings, tapa cloth, and pearl jewelry. This is a great opportunity to support local artisans and find meaningful gifts to remember your Fijian adventure.", + "locationName": "Nadi, Suva, and other towns", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "fiji", + "ref": "shopping-for-fijian-handicrafts-and-souvenirs", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_shopping-for-fijian-handicrafts-and-souvenirs.jpg" + }, + { + "name": "Jet Boat Adventure on the Sigatoka River", + "description": "Embark on a thrilling jet boat ride through the heart of Fiji's lush rainforest, experiencing high-speed turns, spins, and splashes as you navigate the Sigatoka River. Witness stunning natural scenery, including cascading waterfalls and towering volcanic peaks, while learning about the region's rich history and culture from your knowledgeable guide.", + "locationName": "Sigatoka River", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "fiji", + "ref": "jet-boat-adventure-on-the-sigatoka-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_jet-boat-adventure-on-the-sigatoka-river.jpg" + }, + { + "name": "Traditional Fijian Cooking Class", + "description": "Immerse yourself in Fijian culture by participating in a hands-on cooking class, where you'll learn to prepare authentic dishes using fresh local ingredients. Discover the secrets of traditional cooking methods, such as using an underground oven or 'lovo', and savor the delicious flavors of Fiji's culinary heritage.", + "locationName": "Varies - local villages or resorts", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "fiji", + "ref": "traditional-fijian-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_traditional-fijian-cooking-class.jpg" + }, + { + "name": "Firewalking Ceremony at Beqa Island", + "description": "Witness the ancient Fijian tradition of firewalking, a mesmerizing cultural performance unique to Beqa Island. Experience the spiritual significance and history behind this ritual, as skilled firewalkers demonstrate their courage and faith by walking barefoot across burning hot stones.", + "locationName": "Beqa Island", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "fiji", + "ref": "firewalking-ceremony-at-beqa-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_firewalking-ceremony-at-beqa-island.jpg" + }, + { + "name": "Stargazing and Night Kayaking Tour", + "description": "Embark on a magical night kayaking adventure under the starlit Fijian sky. Paddle through calm waters, surrounded by the tranquil sounds of nature, and marvel at the brilliance of the Milky Way. Learn about Polynesian navigation techniques and hear captivating legends about the constellations.", + "locationName": "Varies - coastal areas", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "fiji", + "ref": "stargazing-and-night-kayaking-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_stargazing-and-night-kayaking-tour.jpg" + }, + { + "name": "Horseback Riding through the Highlands", + "description": "Explore the scenic beauty of Fiji's highlands on horseback, venturing through lush rainforests, open meadows, and traditional villages. Enjoy breathtaking panoramic views, encounter friendly locals, and experience the authentic charm of Fijian rural life.", + "locationName": "Viti Levu or Vanua Levu highlands", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "fiji", + "ref": "horseback-riding-through-the-highlands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/fiji_horseback-riding-through-the-highlands.jpg" + }, + { + "name": "Skiing in Chamonix", + "description": "Experience the thrill of skiing in Chamonix, a world-renowned resort nestled at the foot of Mont Blanc. With diverse slopes for all levels, from gentle beginner runs to challenging black diamonds, Chamonix offers an unforgettable skiing adventure. Enjoy breathtaking views of the snow-capped peaks and indulge in the après-ski scene in the charming village.", + "locationName": "Chamonix", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "french-alps", + "ref": "skiing-in-chamonix", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_skiing-in-chamonix.jpg" + }, + { + "name": "Hiking in the Aiguilles Rouges Nature Reserve", + "description": "Embark on a scenic hike through the Aiguilles Rouges Nature Reserve, a protected area boasting stunning alpine landscapes. Discover diverse flora and fauna, cascading waterfalls, and panoramic views of the Mont Blanc massif. Choose from various trails catering to different fitness levels, allowing you to immerse yourself in the natural beauty of the French Alps.", + "locationName": "Aiguilles Rouges Nature Reserve", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-alps", + "ref": "hiking-in-the-aiguilles-rouges-nature-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_hiking-in-the-aiguilles-rouges-nature-reserve.jpg" + }, + { + "name": "Paragliding over the Chamonix Valley", + "description": "Soar through the skies on a thrilling paragliding experience, taking in breathtaking aerial views of the Chamonix Valley. Accompanied by a certified instructor, feel the adrenaline rush as you glide over snow-capped peaks, lush forests, and charming villages. This unforgettable adventure offers a unique perspective of the majestic French Alps.", + "locationName": "Chamonix Valley", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "french-alps", + "ref": "paragliding-over-the-chamonix-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_paragliding-over-the-chamonix-valley.jpg" + }, + { + "name": "Exploring the charming village of Annecy", + "description": "Wander through the picturesque canals and cobbled streets of Annecy, known as the \"Venice of the Alps.\" Discover its rich history, admire the colorful houses lining the waterways, and visit the iconic Palais de l'Isle. Enjoy a leisurely boat ride on Lake Annecy or explore the vibrant local markets for unique souvenirs.", + "locationName": "Annecy", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-alps", + "ref": "exploring-the-charming-village-of-annecy", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_exploring-the-charming-village-of-annecy.jpg" + }, + { + "name": "Indulging in Savoyard cuisine", + "description": "Treat your taste buds to the delectable flavors of Savoyard cuisine. Savor local specialties such as fondue, raclette, and tartiflette, made with regional cheeses and fresh ingredients. Pair your meal with a glass of Savoy wine and enjoy the cozy ambiance of a traditional mountain restaurant.", + "locationName": "Various restaurants throughout the French Alps", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "french-alps", + "ref": "indulging-in-savoyard-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_indulging-in-savoyard-cuisine.jpg" + }, + { + "name": "White-Water Rafting on the Durance River", + "description": "Experience the thrill of navigating the rapids on the Durance River, surrounded by breathtaking alpine scenery. This exhilarating activity is perfect for adventure seekers and nature enthusiasts alike.", + "locationName": "Durance River", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "french-alps", + "ref": "white-water-rafting-on-the-durance-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_white-water-rafting-on-the-durance-river.jpg" + }, + { + "name": "Scenic Train Ride on the Mont Blanc Express", + "description": "Embark on a picturesque journey through the heart of the Alps aboard the Mont Blanc Express. Marvel at the towering peaks, charming villages, and lush valleys as you traverse this historic railway.", + "locationName": "Mont Blanc Express", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-alps", + "ref": "scenic-train-ride-on-the-mont-blanc-express", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_scenic-train-ride-on-the-mont-blanc-express.jpg" + }, + { + "name": "Relaxing Spa Day at a Thermal Bath", + "description": "Indulge in a rejuvenating spa experience at one of the region's renowned thermal baths. Unwind in the soothing mineral-rich waters, enjoy a massage, and let the stress melt away.", + "locationName": "Various thermal baths throughout the French Alps", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "french-alps", + "ref": "relaxing-spa-day-at-a-thermal-bath", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_relaxing-spa-day-at-a-thermal-bath.jpg" + }, + { + "name": "Visit the Historic Fort de Tamié", + "description": "Step back in time at the Fort de Tamié, a 19th-century fortress perched high above the Albertville Valley. Explore the fortifications, learn about its military history, and enjoy panoramic views of the surrounding mountains.", + "locationName": "Fort de Tamié", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-alps", + "ref": "visit-the-historic-fort-de-tami-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_visit-the-historic-fort-de-tami-.jpg" + }, + { + "name": "Sample Local Cheeses at a Traditional Market", + "description": "Immerse yourself in the local culture by visiting a traditional market. Discover a variety of artisanal cheeses, fresh produce, and regional specialties while soaking up the lively atmosphere.", + "locationName": "Various markets throughout the French Alps", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "french-alps", + "ref": "sample-local-cheeses-at-a-traditional-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_sample-local-cheeses-at-a-traditional-market.jpg" + }, + { + "name": "Mountain Biking", + "description": "Explore the diverse terrain of the French Alps on two wheels! Numerous trails cater to all skill levels, from gentle paths through valleys to challenging mountain climbs. Rent a bike and embark on an adventure through picturesque landscapes, enjoying breathtaking views and fresh mountain air.", + "locationName": "Various locations throughout the French Alps", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "french-alps", + "ref": "mountain-biking", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_mountain-biking.jpg" + }, + { + "name": "Visit the Mer de Glace", + "description": "Embark on a journey to the Mer de Glace, the largest glacier in France! Take a scenic train ride on the Montenvers Railway and descend into the ice cave to witness the mesmerizing blue hues and learn about the glacier's history and formation.", + "locationName": "Chamonix", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-alps", + "ref": "visit-the-mer-de-glace", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_visit-the-mer-de-glace.jpg" + }, + { + "name": "Stargazing in the Mountains", + "description": "Escape the city lights and experience the magic of the night sky in the French Alps. Join a stargazing tour or simply find a secluded spot away from light pollution. With minimal interference, marvel at the Milky Way, constellations, and shooting stars for an unforgettable evening.", + "locationName": "Various locations throughout the French Alps", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "french-alps", + "ref": "stargazing-in-the-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_stargazing-in-the-mountains.jpg" + }, + { + "name": "Canyoning Adventure", + "description": "Get your adrenaline pumping with a canyoning experience! Descend through stunning canyons, rappel down waterfalls, slide down natural water slides, and jump into refreshing pools. This exhilarating activity combines adventure, nature, and stunning scenery.", + "locationName": "Various locations throughout the French Alps", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "french-alps", + "ref": "canyoning-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_canyoning-adventure.jpg" + }, + { + "name": "Discover Local Crafts and Traditions", + "description": "Immerse yourself in the rich cultural heritage of the French Alps by exploring local crafts and traditions. Visit workshops and studios to observe artisans creating wood carvings, ceramics, and textiles. Learn about the history and significance of these crafts and perhaps even try your hand at creating your own masterpiece.", + "locationName": "Various villages throughout the French Alps", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-alps", + "ref": "discover-local-crafts-and-traditions", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_discover-local-crafts-and-traditions.jpg" + }, + { + "name": "Hot Air Balloon Ride over the Alps", + "description": "Experience the breathtaking beauty of the French Alps from a unique perspective with a hot air balloon ride. Soar above snow-capped peaks, charming villages, and lush valleys, taking in panoramic views that will leave you speechless. This unforgettable experience is perfect for a romantic getaway or a special occasion.", + "locationName": "Various locations throughout the French Alps", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "french-alps", + "ref": "hot-air-balloon-ride-over-the-alps", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_hot-air-balloon-ride-over-the-alps.jpg" + }, + { + "name": "Via Ferrata Climbing", + "description": "Embark on a thrilling adventure with via ferrata climbing, a unique experience that combines hiking with rock climbing. Traverse secured routes along cliffs and rock faces, enjoying stunning views and an adrenaline rush. With various difficulty levels available, it's an activity suitable for both beginners and experienced climbers.", + "locationName": "Various locations throughout the French Alps, such as Les Gaillands near Chamonix", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "french-alps", + "ref": "via-ferrata-climbing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_via-ferrata-climbing.jpg" + }, + { + "name": "Visit a Traditional Alpine Village", + "description": "Step back in time and immerse yourself in the charm of a traditional Alpine village. Explore cobblestone streets lined with quaint shops, historic churches, and traditional houses adorned with flower boxes. Savor local delicacies at a cozy café and enjoy the peaceful atmosphere of village life.", + "locationName": "Villages like Megève, Samoëns, or Yvoire", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-alps", + "ref": "visit-a-traditional-alpine-village", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_visit-a-traditional-alpine-village.jpg" + }, + { + "name": "Lake Annecy Boat Tour", + "description": "Cruise along the crystal-clear waters of Lake Annecy, surrounded by breathtaking mountain scenery. Enjoy the fresh air and sunshine as you admire the picturesque villages, medieval castles, and lush greenery that line the shores. Opt for a guided tour to learn about the history and culture of the region, or simply relax and soak up the beauty of your surroundings.", + "locationName": "Lake Annecy", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-alps", + "ref": "lake-annecy-boat-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_lake-annecy-boat-tour.jpg" + }, + { + "name": "Wine Tasting in the Savoie Region", + "description": "Discover the unique flavors of the Savoie wine region with a visit to a local vineyard. Sample a variety of wines, from crisp whites to robust reds, and learn about the traditional winemaking techniques of the region. Enjoy the scenic beauty of the vineyards and indulge in a delightful culinary experience.", + "locationName": "Vineyards in the Savoie region, such as Apremont or Chignin", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "french-alps", + "ref": "wine-tasting-in-the-savoie-region", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-alps_wine-tasting-in-the-savoie-region.jpg" + }, + { + "name": "Scuba Diving in Rangiroa", + "description": "Embark on an underwater adventure in Rangiroa, known for its vast lagoon and diverse marine life. Explore vibrant coral reefs, encounter sharks, manta rays, and a kaleidoscope of tropical fish. Whether you're a seasoned diver or a beginner, Rangiroa offers unforgettable scuba diving experiences.", + "locationName": "Rangiroa", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "french-polynesia", + "ref": "scuba-diving-in-rangiroa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_scuba-diving-in-rangiroa.jpg" + }, + { + "name": "Overwater Bungalow Relaxation", + "description": "Indulge in the ultimate luxury experience by staying in an overwater bungalow. Wake up to breathtaking ocean views, step directly into the turquoise waters from your private deck, and enjoy the tranquility of your secluded haven. This is the perfect way to unwind and soak in the beauty of French Polynesia.", + "locationName": "Various islands", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "french-polynesia", + "ref": "overwater-bungalow-relaxation", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_overwater-bungalow-relaxation.jpg" + }, + { + "name": "Island Hopping Adventure", + "description": "Explore the diverse islands of French Polynesia on an island-hopping adventure. Discover the unique charm of each island, from the lush rainforests of Tahiti to the white-sand beaches of Bora Bora. Experience different cultures, landscapes, and activities, creating lasting memories of your Polynesian journey.", + "locationName": "Various islands", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "french-polynesia", + "ref": "island-hopping-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_island-hopping-adventure.jpg" + }, + { + "name": "Sunset Cruise with Polynesian Dinner", + "description": "Set sail on a romantic sunset cruise and savor a delicious Polynesian dinner. Enjoy breathtaking views of the islands as the sky transforms into a canvas of vibrant colors. Indulge in traditional dishes and immerse yourself in the Polynesian culture with live music and dance performances.", + "locationName": "Various islands", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "french-polynesia", + "ref": "sunset-cruise-with-polynesian-dinner", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_sunset-cruise-with-polynesian-dinner.jpg" + }, + { + "name": "Hiking and Exploring Mount Otemanu", + "description": "For adventure enthusiasts, hike to the summit of Mount Otemanu in Bora Bora. Enjoy panoramic views of the island and its stunning lagoon. The challenging hike rewards you with breathtaking scenery and a sense of accomplishment.", + "locationName": "Bora Bora", + "duration": 5, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 2, + "destinationRef": "french-polynesia", + "ref": "hiking-and-exploring-mount-otemanu", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_hiking-and-exploring-mount-otemanu.jpg" + }, + { + "name": "Jet Skiing around Bora Bora Lagoon", + "description": "Experience the thrill of gliding across the turquoise waters of Bora Bora's iconic lagoon on a jet ski. Feel the wind in your hair as you zip past luxurious overwater bungalows, secluded beaches, and breathtaking volcanic peaks. You can even stop for a swim or snorkel in the crystal-clear waters.", + "locationName": "Bora Bora Lagoon", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "french-polynesia", + "ref": "jet-skiing-around-bora-bora-lagoon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_jet-skiing-around-bora-bora-lagoon.jpg" + }, + { + "name": "Black Pearl Farm Tour in Taha'a", + "description": "Delve into the fascinating world of Tahitian black pearls on a guided tour of a pearl farm. Learn about the unique cultivation process, admire the iridescent beauty of these precious gems, and even have the opportunity to purchase your own piece of Polynesian treasure.", + "locationName": "Taha'a Island", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "french-polynesia", + "ref": "black-pearl-farm-tour-in-taha-a", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_black-pearl-farm-tour-in-taha-a.jpg" + }, + { + "name": "Traditional Polynesian Dance Performance", + "description": "Immerse yourself in the vibrant culture of French Polynesia by attending a captivating Polynesian dance performance. Witness the graceful movements, rhythmic drumming, and colorful costumes that tell stories of ancient legends and island life.", + "locationName": "Various locations across the islands", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-polynesia", + "ref": "traditional-polynesian-dance-performance", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_traditional-polynesian-dance-performance.jpg" + }, + { + "name": "4x4 Safari Adventure in Moorea", + "description": "Embark on a thrilling 4x4 safari adventure through the lush interior of Moorea. Traverse rugged mountain trails, discover hidden waterfalls, and enjoy panoramic views of the island's stunning coastline and volcanic peaks. This off-road experience is perfect for adventure seekers.", + "locationName": "Moorea Island", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "french-polynesia", + "ref": "4x4-safari-adventure-in-moorea", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_4x4-safari-adventure-in-moorea.jpg" + }, + { + "name": "Sunset Cocktails at a Beach Bar", + "description": "Unwind and soak up the breathtaking Polynesian sunset with a refreshing cocktail at a beachfront bar. Enjoy the laid-back atmosphere, listen to the gentle waves lapping against the shore, and create unforgettable memories as the sky transforms into a canvas of vibrant colors.", + "locationName": "Various locations across the islands", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 3, + "destinationRef": "french-polynesia", + "ref": "sunset-cocktails-at-a-beach-bar", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_sunset-cocktails-at-a-beach-bar.jpg" + }, + { + "name": "Whale Watching Excursion", + "description": "Embark on a magical journey to witness the awe-inspiring humpback whales that migrate to the warm waters of French Polynesia between July and November. Observe these gentle giants breaching, tail-slapping, and singing their haunting songs in their natural habitat. This unforgettable experience offers a unique opportunity to connect with nature and appreciate the beauty of these majestic creatures.", + "locationName": "Various islands, including Moorea and Rurutu", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "french-polynesia", + "ref": "whale-watching-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_whale-watching-excursion.jpg" + }, + { + "name": "Polynesian Cooking Class", + "description": "Delve into the heart of Polynesian culture by participating in a hands-on cooking class. Learn the secrets of preparing traditional dishes like poisson cru (marinated fish salad), poulet fafa (chicken with coconut milk and taro leaves), and poe (sweet pudding made from taro or banana). Discover the unique flavors and ingredients of the islands while creating delicious meals to share with your loved ones.", + "locationName": "Various resorts and cultural centers", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-polynesia", + "ref": "polynesian-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_polynesian-cooking-class.jpg" + }, + { + "name": "Stand-Up Paddleboarding in the Lagoon", + "description": "Glide across the crystal-clear waters of the lagoon on a stand-up paddleboard, enjoying the tranquility and breathtaking views of the surrounding islands. This relaxing activity is suitable for all ages and skill levels, providing a unique perspective of the marine life below and the lush landscapes above. Opt for a guided tour or explore at your own pace, discovering hidden coves and secluded beaches.", + "locationName": "Various lagoons, including Bora Bora and Moorea", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "french-polynesia", + "ref": "stand-up-paddleboarding-in-the-lagoon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_stand-up-paddleboarding-in-the-lagoon.jpg" + }, + { + "name": "Stargazing on a Secluded Beach", + "description": "Escape the city lights and experience the magic of the Polynesian night sky. Find a secluded beach, lie back on the soft sand, and gaze up at the countless stars twinkling above. With minimal light pollution, the islands offer exceptional stargazing opportunities, allowing you to marvel at constellations, shooting stars, and the Milky Way.", + "locationName": "Various secluded beaches", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "french-polynesia", + "ref": "stargazing-on-a-secluded-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_stargazing-on-a-secluded-beach.jpg" + }, + { + "name": "Hiking to Ancient Polynesian Ruins", + "description": "Embark on a journey through time by hiking to ancient Polynesian ruins scattered across the islands. Explore the remnants of marae (sacred ceremonial sites), stone temples, and traditional villages, learning about the fascinating history and culture of the Polynesian people. These hikes offer a unique blend of adventure, cultural immersion, and breathtaking scenery.", + "locationName": "Various islands, including Raiatea and Huahine", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-polynesia", + "ref": "hiking-to-ancient-polynesian-ruins", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_hiking-to-ancient-polynesian-ruins.jpg" + }, + { + "name": "Kayaking in the Turquoise Waters", + "description": "Embark on a serene kayaking adventure through the crystal-clear lagoons of Bora Bora or Moorea. Paddle at your own pace, explore hidden coves, and marvel at the vibrant marine life below. Witness the majestic Mount Otemanu as you glide across the tranquil waters, creating unforgettable memories.", + "locationName": "Bora Bora or Moorea lagoons", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "french-polynesia", + "ref": "kayaking-in-the-turquoise-waters", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_kayaking-in-the-turquoise-waters.jpg" + }, + { + "name": "Indulge in a Polynesian Spa Ritual", + "description": "Escape to a world of tranquility and rejuvenation with a traditional Polynesian spa ritual. Experience the healing powers of local ingredients like coconut oil, vanilla, and fragrant flowers as skilled therapists pamper you with massages, body wraps, and facials. Emerge feeling refreshed and revitalized.", + "locationName": "Various luxury resorts and spas", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "french-polynesia", + "ref": "indulge-in-a-polynesian-spa-ritual", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_indulge-in-a-polynesian-spa-ritual.jpg" + }, + { + "name": "Explore the Vibrant Markets of Papeete", + "description": "Immerse yourself in the bustling atmosphere of Papeete's vibrant markets. Discover a treasure trove of local handicrafts, Polynesian art, fragrant spices, and exotic fruits. Engage with friendly vendors, sample delicious street food, and find unique souvenirs to commemorate your trip.", + "locationName": "Papeete Market", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-polynesia", + "ref": "explore-the-vibrant-markets-of-papeete", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_explore-the-vibrant-markets-of-papeete.jpg" + }, + { + "name": "Romantic Dinner at a Lagoon-Side Restaurant", + "description": "Indulge in a magical dining experience at a lagoon-side restaurant. Savor exquisite French Polynesian cuisine, featuring fresh seafood, tropical flavors, and innovative dishes. Enjoy breathtaking sunset views, live music, and a romantic ambiance, creating a truly unforgettable evening.", + "locationName": "Various lagoon-side restaurants", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "french-polynesia", + "ref": "romantic-dinner-at-a-lagoon-side-restaurant", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_romantic-dinner-at-a-lagoon-side-restaurant.jpg" + }, + { + "name": "Learn the Art of Polynesian Tattooing", + "description": "Delve into the rich cultural heritage of Polynesian tattooing. Visit a local tattoo artist and learn about the symbolism, history, and techniques behind this ancient art form. Consider getting a temporary or permanent tattoo as a unique and meaningful souvenir of your Polynesian adventure.", + "locationName": "Local tattoo studios", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "french-polynesia", + "ref": "learn-the-art-of-polynesian-tattooing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-polynesia_learn-the-art-of-polynesian-tattooing.jpg" + }, + { + "name": "Stroll Along the Promenade des Anglais", + "description": "Take a leisurely walk or bike ride along the iconic Promenade des Anglais in Nice, enjoying the stunning views of the Mediterranean Sea, the vibrant atmosphere, and the beautiful architecture.", + "locationName": "Nice", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-riviera", + "ref": "stroll-along-the-promenade-des-anglais", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_stroll-along-the-promenade-des-anglais.jpg" + }, + { + "name": "Explore the Palais des Festivals et des Congrès", + "description": "Visit the Palais des Festivals et des Congrès in Cannes, where the prestigious Cannes Film Festival takes place. Walk the red carpet, admire the stunning architecture, and learn about the history of this iconic venue.", + "locationName": "Cannes", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "french-riviera", + "ref": "explore-the-palais-des-festivals-et-des-congr-s", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_explore-the-palais-des-festivals-et-des-congr-s.jpg" + }, + { + "name": "Discover the Charm of Saint-Tropez", + "description": "Wander through the charming streets of Saint-Tropez, known for its luxury boutiques, art galleries, and celebrity sightings. Visit the Vieux Port, soak up the atmosphere at a sidewalk café, and relax on the beautiful beaches.", + "locationName": "Saint-Tropez", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "french-riviera", + "ref": "discover-the-charm-of-saint-tropez", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_discover-the-charm-of-saint-tropez.jpg" + }, + { + "name": "Indulge in Fine Dining", + "description": "Experience the renowned culinary scene of the French Riviera. Choose from Michelin-starred restaurants, charming bistros, or waterfront seafood restaurants to savor delicious French and Mediterranean cuisine.", + "locationName": "Various", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "french-riviera", + "ref": "indulge-in-fine-dining", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_indulge-in-fine-dining.jpg" + }, + { + "name": "Sail the Mediterranean Sea", + "description": "Embark on a boat tour or rent a yacht to explore the stunning coastline of the French Riviera. Enjoy swimming, sunbathing, and admiring the picturesque towns and villages from the water.", + "locationName": "Various", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "french-riviera", + "ref": "sail-the-mediterranean-sea", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_sail-the-mediterranean-sea.jpg" + }, + { + "name": "Hike the Coastal Trails of Cap Ferrat", + "description": "Embark on a scenic hike along the coastal trails of Cap Ferrat, a peninsula renowned for its dramatic cliffs, hidden coves, and panoramic views of the Mediterranean Sea. Breathe in the fresh sea air as you traverse the well-maintained paths, encountering secluded beaches, lush vegetation, and perhaps even glimpses of luxurious villas.", + "locationName": "Cap Ferrat", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-riviera", + "ref": "hike-the-coastal-trails-of-cap-ferrat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_hike-the-coastal-trails-of-cap-ferrat.jpg" + }, + { + "name": "Scuba Dive in the Lerins Islands", + "description": "Discover the underwater wonders of the Lerins Islands, a group of four islands off the coast of Cannes. Dive into the crystal-clear waters and explore vibrant coral reefs, diverse marine life, and even underwater shipwrecks. Whether you're a seasoned diver or a beginner, the Lerins Islands offer an unforgettable scuba diving experience.", + "locationName": "Lerins Islands", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "french-riviera", + "ref": "scuba-dive-in-the-lerins-islands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_scuba-dive-in-the-lerins-islands.jpg" + }, + { + "name": "Visit the Hilltop Village of Eze", + "description": "Step back in time with a visit to the enchanting hilltop village of Eze. Wander through its narrow medieval streets, admire the charming stone houses adorned with colorful flowers, and soak in the breathtaking views of the coastline from the Jardin Exotique. Explore the Fragonard perfume factory and discover the art of fragrance creation.", + "locationName": "Eze", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-riviera", + "ref": "visit-the-hilltop-village-of-eze", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_visit-the-hilltop-village-of-eze.jpg" + }, + { + "name": "Experience the Thrill of Monaco", + "description": "Take a day trip to the glamorous principality of Monaco, known for its opulent casinos, luxurious yachts, and the Formula One Grand Prix. Visit the Prince's Palace, explore the Oceanographic Museum, or try your luck at the iconic Monte Carlo Casino. In the evening, enjoy the vibrant nightlife scene with its exclusive clubs and bars.", + "locationName": "Monaco", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "french-riviera", + "ref": "experience-the-thrill-of-monaco", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_experience-the-thrill-of-monaco.jpg" + }, + { + "name": "Indulge in Local Flavors at a Provençal Market", + "description": "Immerse yourself in the vibrant atmosphere of a traditional Provençal market. Browse through stalls overflowing with fresh produce, local cheeses, fragrant spices, and handcrafted souvenirs. Sample regional specialties such as socca (chickpea pancake) and tapenade (olive spread), and discover the culinary delights of the region.", + "locationName": "Various towns and villages", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-riviera", + "ref": "indulge-in-local-flavors-at-a-proven-al-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_indulge-in-local-flavors-at-a-proven-al-market.jpg" + }, + { + "name": "Kayak Along the Mediterranean Coast", + "description": "Embark on a serene kayaking adventure along the stunning coastline of the French Riviera. Paddle through crystal-clear turquoise waters, explore hidden coves, and admire the breathtaking views of the cliffs and beaches. This activity is suitable for various skill levels and offers a unique perspective of the region's natural beauty.", + "locationName": "Various locations along the coast, such as Nice, Cannes, or Antibes", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-riviera", + "ref": "kayak-along-the-mediterranean-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_kayak-along-the-mediterranean-coast.jpg" + }, + { + "name": "Wine Tasting in Provence", + "description": "Discover the renowned wines of Provence with a delightful wine tasting experience. Visit charming vineyards nestled amidst rolling hills, learn about the winemaking process, and savor a selection of exquisite local wines, including rosé, red, and white varieties. Immerse yourself in the region's rich viticulture heritage and indulge in the flavors of Provence.", + "locationName": "Vineyards in the Provence region", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "french-riviera", + "ref": "wine-tasting-in-provence", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_wine-tasting-in-provence.jpg" + }, + { + "name": "Visit the Musée Picasso in Antibes", + "description": "Art enthusiasts will appreciate a visit to the Musée Picasso in Antibes. Housed in the Château Grimaldi, the museum showcases an extensive collection of Pablo Picasso's works, including paintings, ceramics, and drawings. Explore the artist's creative journey and gain insights into his connection with the French Riviera.", + "locationName": "Antibes", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-riviera", + "ref": "visit-the-mus-e-picasso-in-antibes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_visit-the-mus-e-picasso-in-antibes.jpg" + }, + { + "name": "Experience the Glamour of the Monaco Grand Prix", + "description": "For thrill-seekers and motorsport enthusiasts, attending the Monaco Grand Prix is an unforgettable experience. Witness the world's most prestigious Formula One race as drivers navigate the challenging street circuit of Monte Carlo. Immerse yourself in the electric atmosphere, admire the high-performance cars, and enjoy the glamorous ambiance of this iconic event.", + "locationName": "Monte Carlo, Monaco", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "french-riviera", + "ref": "experience-the-glamour-of-the-monaco-grand-prix", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_experience-the-glamour-of-the-monaco-grand-prix.jpg" + }, + { + "name": "Enjoy a Romantic Dinner Cruise", + "description": "Indulge in a romantic evening with a dinner cruise along the French Riviera. Set sail on a luxurious yacht and savor a gourmet meal while admiring the breathtaking coastal views as the sun sets over the Mediterranean Sea. Enjoy live music, dancing, and the company of your loved one for a truly unforgettable experience.", + "locationName": "Various ports along the coast", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "french-riviera", + "ref": "enjoy-a-romantic-dinner-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_enjoy-a-romantic-dinner-cruise.jpg" + }, + { + "name": "Paragliding over the Mediterranean", + "description": "Experience the thrill of soaring above the stunning coastline of the French Riviera with a tandem paragliding flight. Take in breathtaking panoramic views of the turquoise waters, sandy beaches, and charming towns as you glide through the air. This exhilarating adventure offers a unique perspective of the region's beauty and is perfect for adrenaline seekers.", + "locationName": "Various locations along the coast", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "french-riviera", + "ref": "paragliding-over-the-mediterranean", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_paragliding-over-the-mediterranean.jpg" + }, + { + "name": "Cycling the Route du Mimosa", + "description": "Embark on a scenic cycling journey along the Route du Mimosa, a picturesque route that winds through charming villages and vibrant mimosa groves. Admire the fragrant yellow blooms, enjoy the fresh air, and discover hidden gems along the way. This leisurely activity is perfect for nature lovers and those seeking a relaxing escape.", + "locationName": "Route du Mimosa", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-riviera", + "ref": "cycling-the-route-du-mimosa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_cycling-the-route-du-mimosa.jpg" + }, + { + "name": "Exploring the Lerins Islands", + "description": "Take a boat trip to the Lerins Islands, a small archipelago located just off the coast of Cannes. Discover the historic monastery on Saint-Honorat Island, relax on the pristine beaches of Sainte-Marguerite Island, or explore the island's diverse flora and fauna. This island escape offers a tranquil retreat from the bustling mainland.", + "locationName": "Lerins Islands", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "french-riviera", + "ref": "exploring-the-lerins-islands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_exploring-the-lerins-islands.jpg" + }, + { + "name": "Canyoning in the Gorges du Verdon", + "description": "Embark on an adventurous canyoning expedition in the Gorges du Verdon, a stunning natural wonder known as the 'Grand Canyon of Europe'. Rappel down waterfalls, swim through crystal-clear pools, and navigate through narrow gorges. This thrilling activity is perfect for adrenaline junkies and outdoor enthusiasts.", + "locationName": "Gorges du Verdon", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "french-riviera", + "ref": "canyoning-in-the-gorges-du-verdon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_canyoning-in-the-gorges-du-verdon.jpg" + }, + { + "name": "Stargazing at the Observatoire de la Côte d'Azur", + "description": "Discover the wonders of the night sky at the Observatoire de la Côte d'Azur, a renowned astronomical observatory. Participate in a guided stargazing session, learn about constellations and planets, and marvel at the beauty of the cosmos through powerful telescopes. This unique experience offers a glimpse into the vastness of the universe.", + "locationName": "Observatoire de la Côte d'Azur", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "french-riviera", + "ref": "stargazing-at-the-observatoire-de-la-c-te-d-azur", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/french-riviera_stargazing-at-the-observatoire-de-la-c-te-d-azur.jpg" + }, + { + "name": "Snorkeling with Sea Lions at Gardner Bay", + "description": "Immerse yourself in the turquoise waters of Gardner Bay, Española Island, and swim alongside playful sea lions. Witness their incredible agility underwater as they twirl and dart around you, creating an unforgettable experience.", + "locationName": "Gardner Bay, Española Island", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "galapagos-islands", + "ref": "snorkeling-with-sea-lions-at-gardner-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_snorkeling-with-sea-lions-at-gardner-bay.jpg" + }, + { + "name": "Hiking to the Sierra Negra Volcano", + "description": "Embark on a thrilling hike to the rim of the Sierra Negra Volcano, one of the largest volcanic craters in the world. Enjoy breathtaking panoramic views of the volcanic landscape and surrounding islands. Keep an eye out for unique volcanic features and endemic plant life along the way.", + "locationName": "Sierra Negra Volcano, Isabela Island", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "galapagos-islands", + "ref": "hiking-to-the-sierra-negra-volcano", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_hiking-to-the-sierra-negra-volcano.jpg" + }, + { + "name": "Wildlife Watching at Tortuga Bay", + "description": "Stroll along the pristine white sand beach of Tortuga Bay, a haven for wildlife. Observe marine iguanas basking in the sun, sea turtles nesting on the shore, and a variety of bird species soaring overhead. This tranquil beach offers a perfect escape to connect with nature.", + "locationName": "Tortuga Bay, Santa Cruz Island", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "galapagos-islands", + "ref": "wildlife-watching-at-tortuga-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_wildlife-watching-at-tortuga-bay.jpg" + }, + { + "name": "Scuba Diving at Gordon Rocks", + "description": "Dive into the underwater world at Gordon Rocks, a renowned dive site known for its diverse marine life. Encounter hammerhead sharks, Galapagos sharks, sea turtles, rays, and schools of colorful fish. This thrilling dive is perfect for experienced divers seeking an adrenaline rush.", + "locationName": "Gordon Rocks, off the coast of Santa Cruz Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "galapagos-islands", + "ref": "scuba-diving-at-gordon-rocks", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_scuba-diving-at-gordon-rocks.jpg" + }, + { + "name": "Exploring the Charles Darwin Research Station", + "description": "Delve into the scientific and conservation efforts at the Charles Darwin Research Station. Learn about the unique flora and fauna of the Galapagos Islands, ongoing research projects, and the importance of protecting this fragile ecosystem. You can even see the famous Galapagos giant tortoises up close.", + "locationName": "Charles Darwin Research Station, Santa Cruz Island", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "galapagos-islands", + "ref": "exploring-the-charles-darwin-research-station", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_exploring-the-charles-darwin-research-station.jpg" + }, + { + "name": "Kayaking along the Coast", + "description": "Embark on a serene kayaking adventure along the stunning coastline of the Galapagos Islands. Paddle through crystal-clear waters, marvel at volcanic formations, and encounter marine life such as sea turtles, penguins, and playful sea lions. Enjoy the tranquility of the ocean and discover hidden coves and beaches.", + "locationName": "Various locations throughout the archipelago", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "galapagos-islands", + "ref": "kayaking-along-the-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_kayaking-along-the-coast.jpg" + }, + { + "name": "Birdwatching on Genovesa Island", + "description": "Genovesa Island, also known as 'Bird Island,' is a paradise for bird enthusiasts. Hike along the volcanic cliffs and witness an abundance of avian species, including red-footed boobies, Nazca boobies, frigatebirds, and swallow-tailed gulls. Capture breathtaking photos and immerse yourself in the sights and sounds of this natural aviary.", + "locationName": "Genovesa Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "galapagos-islands", + "ref": "birdwatching-on-genovesa-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_birdwatching-on-genovesa-island.jpg" + }, + { + "name": "Island Hopping Adventure", + "description": "Discover the diverse landscapes and unique wildlife of the Galapagos Islands by embarking on an island-hopping adventure. Visit multiple islands, each with its own distinct ecosystem and charm. Explore volcanic craters, hike through lush forests, and relax on pristine beaches.", + "locationName": "Various islands throughout the archipelago", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "galapagos-islands", + "ref": "island-hopping-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_island-hopping-adventure.jpg" + }, + { + "name": "Stargazing on a Remote Beach", + "description": "Escape the city lights and experience the magic of stargazing on a secluded beach in the Galapagos Islands. With minimal light pollution, the night sky comes alive with a breathtaking display of stars and constellations. Relax on the sand, listen to the soothing sounds of the ocean, and marvel at the wonders of the universe.", + "locationName": "Various secluded beaches throughout the archipelago", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "galapagos-islands", + "ref": "stargazing-on-a-remote-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_stargazing-on-a-remote-beach.jpg" + }, + { + "name": "Sunset Cruise with Local Cuisine", + "description": "Indulge in a romantic sunset cruise while savoring the flavors of local Ecuadorian cuisine. Sail along the coastline, witness stunning views of the islands bathed in golden light, and enjoy a delicious meal prepared with fresh, local ingredients. Create unforgettable memories as you toast to the beauty of the Galapagos Islands.", + "locationName": "Various departure points throughout the archipelago", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "galapagos-islands", + "ref": "sunset-cruise-with-local-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_sunset-cruise-with-local-cuisine.jpg" + }, + { + "name": "Horseback Riding in the Highlands", + "description": "Explore the lush highlands of Santa Cruz Island on horseback, traversing volcanic landscapes and encountering endemic flora and fauna like giant tortoises in their natural habitat. This gentle adventure offers stunning views and a unique perspective of the island's diverse ecosystems. ", + "locationName": "Santa Cruz Island", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "galapagos-islands", + "ref": "horseback-riding-in-the-highlands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_horseback-riding-in-the-highlands.jpg" + }, + { + "name": "Panga Ride Through the Mangroves", + "description": "Embark on a relaxing panga (small boat) ride through the intricate mangrove forests of the Galapagos. Observe marine life such as sea turtles, rays, and various bird species as you navigate the calm waters and learn about the ecological importance of these unique ecosystems.", + "locationName": "Various Islands (Santa Cruz, Isabela, Fernandina)", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "galapagos-islands", + "ref": "panga-ride-through-the-mangroves", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_panga-ride-through-the-mangroves.jpg" + }, + { + "name": "Visit the Wall of Tears", + "description": "Delve into the history of Isabela Island with a visit to the Wall of Tears, a historical landmark built by prisoners in the 1940s and 50s. Learn about the penal colony's past and enjoy panoramic views of the island's coastline.", + "locationName": "Isabela Island", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "galapagos-islands", + "ref": "visit-the-wall-of-tears", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_visit-the-wall-of-tears.jpg" + }, + { + "name": "Biking on Isabela Island", + "description": "Rent a bike and explore the scenic landscapes of Isabela Island at your own pace. Cycle through charming villages, along coastal paths, and to secluded beaches, enjoying the freedom to discover hidden gems and connect with the island's natural beauty.", + "locationName": "Isabela Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "galapagos-islands", + "ref": "biking-on-isabela-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_biking-on-isabela-island.jpg" + }, + { + "name": "Indulge in Local Cuisine", + "description": "Experience the flavors of the Galapagos by sampling local cuisine at restaurants and markets. Savor fresh seafood dishes, traditional Ecuadorian specialties, and tropical fruits while immersing yourself in the island's culinary culture.", + "locationName": "Various Islands (Santa Cruz, San Cristobal, Isabela)", + "duration": 1, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "galapagos-islands", + "ref": "indulge-in-local-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_indulge-in-local-cuisine.jpg" + }, + { + "name": "Surfing at Tortuga Bay", + "description": "Catch some waves at the renowned Tortuga Bay, known for its consistent swells and pristine beach. Whether you're a seasoned surfer or a beginner eager to learn, Tortuga Bay offers a thrilling experience amidst stunning natural beauty. Rent a board or join a surf lesson to ride the waves like a pro.", + "locationName": "Tortuga Bay", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "galapagos-islands", + "ref": "surfing-at-tortuga-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_surfing-at-tortuga-bay.jpg" + }, + { + "name": "Volunteer at a Conservation Project", + "description": "Contribute to the preservation of the Galapagos Islands by participating in a volunteer program. Assist with habitat restoration, wildlife monitoring, or community outreach initiatives. Immerse yourself in the local culture and make a meaningful impact on this unique ecosystem.", + "locationName": "Various locations across the islands", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "galapagos-islands", + "ref": "volunteer-at-a-conservation-project", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_volunteer-at-a-conservation-project.jpg" + }, + { + "name": "Photography Expedition", + "description": "Embark on a photography expedition to capture the extraordinary biodiversity and landscapes of the Galapagos. Join a guided tour led by a professional photographer who will help you find the perfect shots of iconic wildlife, volcanic formations, and breathtaking seascapes. Enhance your skills and create lasting memories through your lens.", + "locationName": "Various islands and locations", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "galapagos-islands", + "ref": "photography-expedition", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_photography-expedition.jpg" + }, + { + "name": "Relaxation and Wellness Retreat", + "description": "Escape the hustle and bustle of everyday life and indulge in a rejuvenating wellness retreat. Choose from a variety of options, including yoga sessions on the beach, spa treatments with local ingredients, and meditation amidst the tranquil natural surroundings. Reconnect with yourself and find inner peace in this island paradise.", + "locationName": "Various resorts and retreat centers", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "galapagos-islands", + "ref": "relaxation-and-wellness-retreat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_relaxation-and-wellness-retreat.jpg" + }, + { + "name": "Island-Hopping by Yacht", + "description": "Experience the ultimate luxury and exclusivity by exploring the Galapagos Islands aboard a private yacht. Customize your itinerary to visit secluded coves, pristine beaches, and hidden gems. Enjoy personalized service, gourmet meals, and unparalleled views of the archipelago's natural wonders.", + "locationName": "Various islands and routes", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "galapagos-islands", + "ref": "island-hopping-by-yacht", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galapagos-islands_island-hopping-by-yacht.jpg" + }, + { + "name": "Hike the Camino de Santiago", + "description": "Embark on a spiritual journey along the Camino de Santiago, a network of ancient pilgrimage routes leading to the Cathedral of Santiago de Compostela. Choose from various routes, such as the popular Camino Frances or the coastal Camino del Norte, and experience the breathtaking landscapes, charming villages, and camaraderie of fellow pilgrims.", + "locationName": "Various routes throughout Galicia", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "galicia", + "ref": "hike-the-camino-de-santiago", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_hike-the-camino-de-santiago.jpg" + }, + { + "name": "Explore the Historic City of Santiago de Compostela", + "description": "Wander through the cobbled streets of Santiago de Compostela, a UNESCO World Heritage Site and the culmination of the Camino de Santiago. Marvel at the magnificent Cathedral, explore the charming squares and plazas, and visit the vibrant Mercado de Abastos for a taste of Galician cuisine.", + "locationName": "Santiago de Compostela", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "galicia", + "ref": "explore-the-historic-city-of-santiago-de-compostela", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_explore-the-historic-city-of-santiago-de-compostela.jpg" + }, + { + "name": "Discover the Cíes Islands", + "description": "Escape to the Cíes Islands, an archipelago off the coast of Galicia known for its pristine beaches, crystal-clear waters, and abundant wildlife. Relax on the white sands of Rodas Beach, hike to the lighthouse for panoramic views, and enjoy a boat trip to spot dolphins and seabirds.", + "locationName": "Cíes Islands", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "galicia", + "ref": "discover-the-c-es-islands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_discover-the-c-es-islands.jpg" + }, + { + "name": "Indulge in Galician Cuisine", + "description": "Delight your taste buds with the fresh and flavorful cuisine of Galicia. Sample the region's famous seafood, such as octopus, scallops, and mussels, paired with local Albariño wine. Explore the charming tapas bars and traditional restaurants in towns like A Coruña and Vigo, and savor the unique culinary experience.", + "locationName": "Various locations throughout Galicia", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "galicia", + "ref": "indulge-in-galician-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_indulge-in-galician-cuisine.jpg" + }, + { + "name": "Experience the Rías Baixas Wine Region", + "description": "Embark on a wine tour through the Rías Baixas region, known for its crisp and aromatic Albariño wines. Visit charming wineries, learn about the winemaking process, and indulge in tastings of this renowned white wine. Enjoy the scenic vineyards and picturesque coastal landscapes.", + "locationName": "Rías Baixas region", + "duration": 5, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "galicia", + "ref": "experience-the-r-as-baixas-wine-region", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_experience-the-r-as-baixas-wine-region.jpg" + }, + { + "name": "Kayaking in the Rías Baixas", + "description": "Embark on a serene kayaking adventure through the Rías Baixas, a series of estuaries renowned for their stunning natural beauty. Paddle along calm waters, surrounded by verdant landscapes and charming coastal villages. Discover hidden coves, observe diverse marine life, and soak in the tranquility of the Galician coast.", + "locationName": "Rías Baixas", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "galicia", + "ref": "kayaking-in-the-r-as-baixas", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_kayaking-in-the-r-as-baixas.jpg" + }, + { + "name": "Surfing on the Atlantic Coast", + "description": "Galicia's rugged coastline boasts some of the best surfing conditions in Europe. Catch thrilling waves at renowned surf spots like Praia de Pantín or Praia de Razo. Whether you're a seasoned surfer or a beginner, you'll find the perfect wave to ride and experience the adrenaline of this exhilarating water sport.", + "locationName": "Praia de Pantín or Praia de Razo", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "galicia", + "ref": "surfing-on-the-atlantic-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_surfing-on-the-atlantic-coast.jpg" + }, + { + "name": "Whale Watching Excursion", + "description": "Embark on an unforgettable whale watching excursion off the Galician coast. Witness the majestic presence of these gentle giants as they migrate through the Atlantic waters. Observe various whale species, such as humpback whales, fin whales, and dolphins, in their natural habitat. This awe-inspiring experience is perfect for nature enthusiasts and wildlife lovers.", + "locationName": "Galician Coast", + "duration": 5, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "galicia", + "ref": "whale-watching-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_whale-watching-excursion.jpg" + }, + { + "name": "Explore the Tower of Hercules", + "description": "Step back in time and visit the Tower of Hercules, an ancient Roman lighthouse and the oldest functioning lighthouse in the world. Climb to the top for breathtaking panoramic views of the city of A Coruña and the surrounding coastline. Explore the fascinating history and legends surrounding this iconic landmark.", + "locationName": "A Coruña", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "galicia", + "ref": "explore-the-tower-of-hercules", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_explore-the-tower-of-hercules.jpg" + }, + { + "name": "Discover the Lugo Roman Walls", + "description": "Walk along the ancient Lugo Roman Walls, a UNESCO World Heritage Site and one of the best-preserved Roman fortifications in the world. Explore the historic city center of Lugo, visit the Roman baths, and immerse yourself in the rich history of this charming Galician city.", + "locationName": "Lugo", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "galicia", + "ref": "discover-the-lugo-roman-walls", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_discover-the-lugo-roman-walls.jpg" + }, + { + "name": "Hot Springs Relaxation", + "description": "Unwind and rejuvenate in Galicia's natural hot springs. Numerous thermal bath complexes are scattered throughout the region, offering a variety of therapeutic and relaxing experiences. Immerse yourself in the mineral-rich waters, surrounded by stunning landscapes, and let the stress melt away.", + "locationName": "Ourense", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "galicia", + "ref": "hot-springs-relaxation", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_hot-springs-relaxation.jpg" + }, + { + "name": "Explore the Ribeira Sacra", + "description": "Embark on a scenic journey through the Ribeira Sacra, a stunning region known for its dramatic canyons, terraced vineyards, and historic monasteries. Take a boat trip along the Sil River, hike through the vineyards, and visit ancient religious sites, enjoying breathtaking views and a taste of Galician wine culture.", + "locationName": "Ribeira Sacra", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "galicia", + "ref": "explore-the-ribeira-sacra", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_explore-the-ribeira-sacra.jpg" + }, + { + "name": "Visit the Castro de Santa Trega", + "description": "Step back in time at the Castro de Santa Trega, an ancient Celtic settlement perched on a hilltop overlooking the Atlantic Ocean. Explore the remains of stone houses, fortifications, and learn about the fascinating history and culture of the Celts who once inhabited this region.", + "locationName": "A Guarda", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "galicia", + "ref": "visit-the-castro-de-santa-trega", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_visit-the-castro-de-santa-trega.jpg" + }, + { + "name": "Discover the Islas Atlánticas National Park", + "description": "Embark on a boat tour to the Islas Atlánticas National Park, a stunning archipelago off the coast of Galicia. Explore the unique ecosystems of the islands, home to diverse birdlife, marine species, and breathtaking landscapes. Hike to the lighthouses, relax on secluded beaches, and enjoy the tranquility of this protected natural paradise.", + "locationName": "Islas Atlánticas", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "galicia", + "ref": "discover-the-islas-atl-nticas-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_discover-the-islas-atl-nticas-national-park.jpg" + }, + { + "name": "Experience Galician Festivals", + "description": "Immerse yourself in the vibrant culture of Galicia by attending one of the many traditional festivals held throughout the year. From lively music and dance performances to religious processions and gastronomic celebrations, these events offer a unique opportunity to experience the local customs and traditions.", + "locationName": "Various locations", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "galicia", + "ref": "experience-galician-festivals", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_experience-galician-festivals.jpg" + }, + { + "name": "Go horseback riding through the Galician countryside", + "description": "Embark on a scenic horseback riding adventure through Galicia's lush landscapes, taking in rolling hills, verdant forests, and charming villages. This activity is perfect for nature enthusiasts and animal lovers, offering a unique perspective of the region's beauty and tranquility.", + "locationName": "Various locations throughout Galicia", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "galicia", + "ref": "go-horseback-riding-through-the-galician-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_go-horseback-riding-through-the-galician-countryside.jpg" + }, + { + "name": "Take a boat trip to the Islas Cíes", + "description": "Embark on a boat trip to the stunning Islas Cíes, an archipelago off the coast of Galicia known for its pristine beaches, crystal-clear waters, and diverse marine life. Spend the day swimming, sunbathing, and exploring the islands' natural beauty. Keep an eye out for dolphins and other marine creatures during the journey.", + "locationName": "Islas Cíes", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "galicia", + "ref": "take-a-boat-trip-to-the-islas-c-es", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_take-a-boat-trip-to-the-islas-c-es.jpg" + }, + { + "name": "Visit the Cathedral of Santiago de Compostela", + "description": "Explore the magnificent Cathedral of Santiago de Compostela, the culmination of the Camino de Santiago pilgrimage and a masterpiece of Romanesque architecture. Marvel at its intricate facade, ornate interior, and the tomb of St. James. Join a guided tour to delve into the cathedral's history and significance.", + "locationName": "Santiago de Compostela", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "galicia", + "ref": "visit-the-cathedral-of-santiago-de-compostela", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_visit-the-cathedral-of-santiago-de-compostela.jpg" + }, + { + "name": "Explore the fishing villages along the coast", + "description": "Discover the charming fishing villages that dot Galicia's coastline, each with its own unique character and traditions. Wander through narrow streets, admire colorful houses, and savor the freshest seafood at local restaurants. Immerse yourself in the authentic atmosphere and maritime heritage of these coastal gems.", + "locationName": "Various coastal villages in Galicia", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "galicia", + "ref": "explore-the-fishing-villages-along-the-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_explore-the-fishing-villages-along-the-coast.jpg" + }, + { + "name": "Attend a traditional Galician festival", + "description": "Immerse yourself in the vibrant culture of Galicia by attending a traditional festival. Experience lively music, folk dances, and colorful costumes, and sample local delicacies. These festivals offer a glimpse into the region's rich heritage and provide a truly unforgettable cultural experience.", + "locationName": "Various locations throughout Galicia", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "galicia", + "ref": "attend-a-traditional-galician-festival", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/galicia_attend-a-traditional-galician-festival.jpg" + }, + { + "name": "Grand Canyon South Rim Trail", + "description": "Embark on a scenic hike along the South Rim Trail, offering breathtaking panoramic views of the canyon's vastness and geological layers. Choose from various trail segments, like the paved Rim Trail or the challenging Bright Angel Trail, catering to different fitness levels. Witness iconic landmarks such as Mather Point and Yavapai Point, capturing stunning photographs and creating unforgettable memories.", + "locationName": "Grand Canyon South Rim", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "grand-canyon", + "ref": "grand-canyon-south-rim-trail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_grand-canyon-south-rim-trail.jpg" + }, + { + "name": "Mule Rides into the Canyon", + "description": "Experience the thrill of descending into the canyon on a mule, traversing scenic trails and enjoying unique perspectives of the majestic landscape. Opt for a half-day or full-day ride, guided by experienced wranglers who share insights about the canyon's history and geology. This iconic Grand Canyon activity offers a memorable adventure suitable for families and nature enthusiasts.", + "locationName": "Grand Canyon Village", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "grand-canyon", + "ref": "mule-rides-into-the-canyon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_mule-rides-into-the-canyon.jpg" + }, + { + "name": "Whitewater Rafting on the Colorado River", + "description": "Embark on an exhilarating whitewater rafting expedition down the Colorado River, navigating through the heart of the Grand Canyon. Choose from multi-day adventures camping under the stars or shorter day trips. Experience the thrill of rapids, marvel at towering canyon walls, and witness the raw power of nature. This adrenaline-pumping activity is perfect for adventure seekers and nature lovers.", + "locationName": "Colorado River", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "grand-canyon", + "ref": "whitewater-rafting-on-the-colorado-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_whitewater-rafting-on-the-colorado-river.jpg" + }, + { + "name": "Grand Canyon Skywalk", + "description": "Step onto the glass-bottom Skywalk, extending 70 feet over the canyon's edge, and experience a thrilling sensation of walking on air. Enjoy unparalleled panoramic views of the canyon floor and the Colorado River below. Capture breathtaking photos and create lasting memories of this unique and exhilarating experience.", + "locationName": "Grand Canyon West Rim", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "grand-canyon", + "ref": "grand-canyon-skywalk", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_grand-canyon-skywalk.jpg" + }, + { + "name": "Grand Canyon Stargazing", + "description": "Escape the city lights and immerse yourself in the wonders of the night sky at the Grand Canyon. Join a ranger-led stargazing program or find a secluded spot to witness the brilliance of the Milky Way and constellations. The Grand Canyon's dark skies offer an exceptional opportunity to connect with the universe and appreciate the beauty of the cosmos.", + "locationName": "Various locations within the park", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "grand-canyon", + "ref": "grand-canyon-stargazing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_grand-canyon-stargazing.jpg" + }, + { + "name": "Scenic Helicopter Tour over the Grand Canyon", + "description": "Embark on a breathtaking helicopter tour and witness the grandeur of the Grand Canyon from a unique aerial perspective. Soar above the rim, marvel at the intricate layers of rock formations, and capture stunning panoramic views of the vast canyon landscape. This exhilarating experience offers an unforgettable way to appreciate the immense scale and beauty of this natural wonder.", + "locationName": "Grand Canyon National Park", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "grand-canyon", + "ref": "scenic-helicopter-tour-over-the-grand-canyon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_scenic-helicopter-tour-over-the-grand-canyon.jpg" + }, + { + "name": "Explore the Historic Grand Canyon Village", + "description": "Step back in time and discover the rich history of the Grand Canyon at the Grand Canyon Village. Visit the historic El Tovar Hotel, a landmark lodge with a fascinating past, and explore the Hopi House, a unique building showcasing Native American arts and crafts. Immerse yourself in the cultural heritage of the region through exhibits at the Yavapai Museum and Verkamp's Visitor Center. This journey through time offers insights into the people and events that shaped the Grand Canyon.", + "locationName": "Grand Canyon Village", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "grand-canyon", + "ref": "explore-the-historic-grand-canyon-village", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_explore-the-historic-grand-canyon-village.jpg" + }, + { + "name": "Bike the South Rim Trail", + "description": "Enjoy a leisurely bike ride along the scenic South Rim Trail, offering breathtaking views of the Grand Canyon at every turn. Rent a bicycle and explore the paved path, stopping at various viewpoints to admire the vastness and beauty of the canyon. This family-friendly activity provides a relaxing way to experience the natural splendor of the Grand Canyon at your own pace.", + "locationName": "South Rim Trail", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "grand-canyon", + "ref": "bike-the-south-rim-trail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_bike-the-south-rim-trail.jpg" + }, + { + "name": "Jeep Tour through the Desert Landscape", + "description": "Embark on an adventurous jeep tour through the rugged desert landscape surrounding the Grand Canyon. Explore hidden trails, discover ancient Native American ruins, and witness the unique flora and fauna of the region. This off-road experience offers a thrilling way to explore the diverse ecosystems and geological wonders beyond the canyon rim.", + "locationName": "Grand Canyon National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "grand-canyon", + "ref": "jeep-tour-through-the-desert-landscape", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_jeep-tour-through-the-desert-landscape.jpg" + }, + { + "name": "Visit the Desert View Watchtower", + "description": "Journey to the eastern edge of the Grand Canyon and discover the Desert View Watchtower, a historic landmark offering panoramic views of the canyon and the Colorado River. Climb to the top of the tower for breathtaking vistas, explore the unique architecture inspired by Native American designs, and learn about the cultural significance of this iconic structure.", + "locationName": "Desert View Watchtower", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "grand-canyon", + "ref": "visit-the-desert-view-watchtower", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_visit-the-desert-view-watchtower.jpg" + }, + { + "name": "Havasupai Hike and Camping", + "description": "Embark on a challenging yet rewarding hike to the turquoise waterfalls and swimming holes of Havasupai, an indigenous village located within the Grand Canyon National Park. Camp under the stars and immerse yourself in the natural beauty of this secluded oasis. Reservations are required well in advance due to its popularity.", + "locationName": "Havasupai Indian Reservation", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "grand-canyon", + "ref": "havasupai-hike-and-camping", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_havasupai-hike-and-camping.jpg" + }, + { + "name": "Grand Canyon Railway Adventure", + "description": "Take a nostalgic journey on the Grand Canyon Railway, a historic train that travels from Williams, Arizona to the South Rim of the Grand Canyon. Enjoy the scenic views and onboard entertainment, including Wild West shows and live music, as you travel back in time.", + "locationName": "Grand Canyon Railway Depot", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "grand-canyon", + "ref": "grand-canyon-railway-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_grand-canyon-railway-adventure.jpg" + }, + { + "name": "Geological Museum Exploration", + "description": "Discover the fascinating geological history of the Grand Canyon at the Yavapai Geology Museum. Learn about the formation of the canyon, the different rock layers, and the fossils that have been found in the area. Interactive exhibits and knowledgeable rangers make this a great educational experience for all ages.", + "locationName": "Yavapai Geology Museum", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "grand-canyon", + "ref": "geological-museum-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_geological-museum-exploration.jpg" + }, + { + "name": "Sunset Viewing at Hopi Point", + "description": "Witness a breathtaking sunset over the Grand Canyon from Hopi Point, a popular viewpoint on the South Rim. The vibrant colors of the sky reflecting off the canyon walls create a truly magical experience. Arrive early to secure a good spot, as this location tends to get crowded.", + "locationName": "Hopi Point", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "grand-canyon", + "ref": "sunset-viewing-at-hopi-point", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_sunset-viewing-at-hopi-point.jpg" + }, + { + "name": "Ranger-led Programs and Nature Walks", + "description": "Join a park ranger for a guided nature walk or attend one of the many ranger-led programs offered at the Grand Canyon. Learn about the park's history, geology, flora, and fauna while gaining a deeper appreciation for this natural wonder. These programs are a great way to enhance your visit and learn from experts.", + "locationName": "Various locations within the park", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "grand-canyon", + "ref": "ranger-led-programs-and-nature-walks", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_ranger-led-programs-and-nature-walks.jpg" + }, + { + "name": "Rock Climbing", + "description": "Challenge yourself with a thrilling rock climbing experience on the cliffs surrounding the Grand Canyon. With various routes for different skill levels, both beginners and experienced climbers can enjoy the breathtaking views and adrenaline rush.", + "locationName": "Grand Canyon National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "grand-canyon", + "ref": "rock-climbing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_rock-climbing.jpg" + }, + { + "name": "Grand Canyon North Rim Visit", + "description": "Escape the crowds and discover the serene beauty of the Grand Canyon's North Rim. Hike through lush forests, enjoy panoramic viewpoints, and visit the historic Grand Canyon Lodge for a peaceful retreat.", + "locationName": "Grand Canyon North Rim", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "grand-canyon", + "ref": "grand-canyon-north-rim-visit", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_grand-canyon-north-rim-visit.jpg" + }, + { + "name": "Photography Tour", + "description": "Capture the awe-inspiring landscapes of the Grand Canyon on a guided photography tour. Learn professional tips and tricks while discovering hidden gems and iconic viewpoints, creating unforgettable memories and stunning photos.", + "locationName": "Various locations within the park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "grand-canyon", + "ref": "photography-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_photography-tour.jpg" + }, + { + "name": "Visit the Tusayan Museum and Ruin", + "description": "Step back in time and explore the ancient history of the Ancestral Puebloan people at the Tusayan Museum and Ruin. Discover archaeological artifacts, learn about their culture and traditions, and walk among the remnants of their dwellings.", + "locationName": "Tusayan Museum and Ruin", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "grand-canyon", + "ref": "visit-the-tusayan-museum-and-ruin", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_visit-the-tusayan-museum-and-ruin.jpg" + }, + { + "name": "Scenic Drive along Desert View Drive", + "description": "Embark on a scenic drive along Desert View Drive, stopping at various viewpoints and historical landmarks. Enjoy breathtaking panoramas, explore the Watchtower, and witness the changing colors of the canyon walls as the sun sets.", + "locationName": "Desert View Drive", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "grand-canyon", + "ref": "scenic-drive-along-desert-view-drive", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/grand-canyon_scenic-drive-along-desert-view-drive.jpg" + }, + { + "name": "Snorkeling Adventure on the Outer Reef", + "description": "Embark on a full-day snorkeling tour to the outer reef, where you'll discover vibrant coral gardens teeming with colorful fish, sea turtles, and other marine life. Explore different snorkel sites, enjoy a delicious lunch on board, and relax on the sun-drenched deck while cruising through turquoise waters.", + "locationName": "Outer Great Barrier Reef", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "great-barrier-reef", + "ref": "snorkeling-adventure-on-the-outer-reef", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_snorkeling-adventure-on-the-outer-reef.jpg" + }, + { + "name": "Scuba Diving for Certified Divers", + "description": "Dive into the underwater world of the Great Barrier Reef and witness its breathtaking beauty up close. Explore renowned dive sites, encounter diverse marine species, and experience the thrill of diving in one of the most iconic destinations on Earth. Choose from introductory dives for beginners or advanced dives for experienced divers.", + "locationName": "Various dive sites throughout the reef", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "great-barrier-reef", + "ref": "scuba-diving-for-certified-divers", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_scuba-diving-for-certified-divers.jpg" + }, + { + "name": "Scenic Helicopter Flight over the Reef", + "description": "Soar above the Great Barrier Reef on a breathtaking helicopter tour and witness its vastness and beauty from a unique perspective. Marvel at the vibrant colors of the coral reefs, spot marine life swimming below, and capture stunning aerial photographs of this natural wonder.", + "locationName": "Various departure points along the coast", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "great-barrier-reef", + "ref": "scenic-helicopter-flight-over-the-reef", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_scenic-helicopter-flight-over-the-reef.jpg" + }, + { + "name": "Glass-Bottom Boat and Underwater Observatory Tour", + "description": "Experience the magic of the reef without getting wet on a glass-bottom boat tour. Observe the coral reefs and marine life through the glass bottom, or visit an underwater observatory for a closer look at the underwater ecosystem. This option is perfect for families with young children or those who prefer to stay dry.", + "locationName": "Green Island or Reefworld pontoon", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "great-barrier-reef", + "ref": "glass-bottom-boat-and-underwater-observatory-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_glass-bottom-boat-and-underwater-observatory-tour.jpg" + }, + { + "name": "Island Hopping and Beach Relaxation", + "description": "Explore the idyllic islands of the Great Barrier Reef, such as Whitsunday Island or Fitzroy Island. Relax on pristine beaches, swim in crystal-clear waters, go for a hike with stunning views, or simply soak up the tropical island vibes. Each island offers unique experiences, from luxury resorts to secluded coves.", + "locationName": "Whitsunday Islands or Fitzroy Island", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "great-barrier-reef", + "ref": "island-hopping-and-beach-relaxation", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_island-hopping-and-beach-relaxation.jpg" + }, + { + "name": "Whitsunday Islands Sailing Adventure", + "description": "Embark on a sailing expedition through the stunning Whitsunday Islands, a collection of 74 idyllic islands within the Great Barrier Reef. Sail turquoise waters, discover secluded beaches, and snorkel among vibrant coral reefs. Opt for a day trip or a multi-day sailing adventure with overnight stays on the boat or at island resorts.", + "locationName": "Whitsunday Islands", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "great-barrier-reef", + "ref": "whitsunday-islands-sailing-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_whitsunday-islands-sailing-adventure.jpg" + }, + { + "name": "Indigenous Culture and Reef Exploration", + "description": "Immerse yourself in the rich cultural heritage of the Aboriginal people and their connection to the Great Barrier Reef. Join a guided tour led by Indigenous rangers who will share their knowledge of the reef's ecosystem, traditional fishing practices, and the spiritual significance of the land and sea.", + "locationName": "Various locations along the coast", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "great-barrier-reef", + "ref": "indigenous-culture-and-reef-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_indigenous-culture-and-reef-exploration.jpg" + }, + { + "name": "Reef Sleep Experience at Reefworld", + "description": "Spend an unforgettable night on the Great Barrier Reef with the Reefsleep experience at Reefworld. Enjoy a day of snorkeling, diving, and exploring the reef, followed by a delicious dinner under the stars. Sleep in a comfortable swag on the upper deck of the pontoon, surrounded by the mesmerizing sounds of the ocean.", + "locationName": "Reefworld Pontoon", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "great-barrier-reef", + "ref": "reef-sleep-experience-at-reefworld", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_reef-sleep-experience-at-reefworld.jpg" + }, + { + "name": "Kuranda Scenic Railway and Rainforest Exploration", + "description": "Embark on a scenic journey through the lush rainforests of Queensland aboard the Kuranda Scenic Railway. Travel through the rainforest canopy, past cascading waterfalls, and into the charming village of Kuranda. Explore the local markets, visit wildlife parks, or take a thrilling Skyrail Rainforest Cableway ride for breathtaking views.", + "locationName": "Kuranda", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "great-barrier-reef", + "ref": "kuranda-scenic-railway-and-rainforest-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_kuranda-scenic-railway-and-rainforest-exploration.jpg" + }, + { + "name": "Wildlife Encounters at Hartley's Crocodile Adventures", + "description": "Get up close to Australia's incredible wildlife at Hartley's Crocodile Adventures. Witness thrilling crocodile feeding shows, learn about cassowaries and koalas, and explore the diverse ecosystems of the park. Take a boat cruise through the melaleuca wetlands and spot native birds, reptiles, and mammals.", + "locationName": "Hartley's Crocodile Adventures", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "great-barrier-reef", + "ref": "wildlife-encounters-at-hartley-s-crocodile-adventures", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_wildlife-encounters-at-hartley-s-crocodile-adventures.jpg" + }, + { + "name": "Sunset Sailing Cruise", + "description": "Embark on a romantic and relaxing sunset sailing cruise along the Great Barrier Reef. Witness the breathtaking colors of the sky as the sun dips below the horizon, casting a golden glow over the turquoise waters. Enjoy a glass of sparkling wine and delicious canapés while taking in the stunning scenery and the tranquil atmosphere.", + "locationName": "Various locations along the Great Barrier Reef", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "great-barrier-reef", + "ref": "sunset-sailing-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_sunset-sailing-cruise.jpg" + }, + { + "name": "Whitehaven Beach Picnic and Swimming", + "description": "Escape to the pristine shores of Whitehaven Beach, renowned for its powdery white sand and crystal-clear waters. Enjoy a leisurely picnic on the beach, soaking up the sun and the breathtaking views. Take a refreshing swim in the turquoise waters or simply relax and unwind in this idyllic paradise.", + "locationName": "Whitsunday Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "great-barrier-reef", + "ref": "whitehaven-beach-picnic-and-swimming", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_whitehaven-beach-picnic-and-swimming.jpg" + }, + { + "name": "Kayaking and Stand-Up Paddleboarding", + "description": "Explore the calm waters and hidden coves of the Great Barrier Reef at your own pace with a kayaking or stand-up paddleboarding adventure. Glide through the mangrove forests, discover secluded beaches, and encounter diverse marine life. This activity is perfect for those seeking a more active and immersive experience.", + "locationName": "Various locations along the Great Barrier Reef", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "great-barrier-reef", + "ref": "kayaking-and-stand-up-paddleboarding", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_kayaking-and-stand-up-paddleboarding.jpg" + }, + { + "name": "Fishing Charters", + "description": "Cast your line and experience the thrill of fishing in the Great Barrier Reef. Join a fishing charter and try your luck at catching a variety of fish species, including coral trout, red emperor, and Spanish mackerel. Whether you're a seasoned angler or a beginner, this activity offers an exciting adventure on the open water.", + "locationName": "Various locations along the Great Barrier Reef", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "great-barrier-reef", + "ref": "fishing-charters", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_fishing-charters.jpg" + }, + { + "name": "Island Resort Stay", + "description": "Indulge in a luxurious and relaxing stay at one of the many island resorts located on the Great Barrier Reef. Enjoy world-class amenities, stunning ocean views, and access to a variety of water activities. Pamper yourself with spa treatments, savor gourmet cuisine, and create unforgettable memories in this tropical paradise.", + "locationName": "Various islands within the Great Barrier Reef", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "great-barrier-reef", + "ref": "island-resort-stay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_island-resort-stay.jpg" + }, + { + "name": "Whale Watching Expedition", + "description": "Embark on a thrilling journey to witness the majestic humpback whales during their annual migration (June-November). Observe these gentle giants breaching, tail-slapping, and spyhopping in the pristine waters of the Great Barrier Reef. Experienced guides provide insights into whale behavior and conservation efforts, making it an unforgettable and educational experience.", + "locationName": "Heron Island or Whitsunday Islands", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "great-barrier-reef", + "ref": "whale-watching-expedition", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_whale-watching-expedition.jpg" + }, + { + "name": "Indigenous Cultural Immersion", + "description": "Connect with the rich heritage of the Aboriginal and Torres Strait Islander peoples through an immersive cultural experience. Learn about their deep connection to the reef, participate in traditional storytelling, art workshops, or dance performances. Gain a profound appreciation for their sustainable practices and ancient wisdom.", + "locationName": "Mossman Gorge Centre or various islands", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "great-barrier-reef", + "ref": "indigenous-cultural-immersion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_indigenous-cultural-immersion.jpg" + }, + { + "name": "Low Isles Tropical Island Escape", + "description": "Escape to the idyllic Low Isles, a picturesque coral cay surrounded by turquoise waters and teeming with marine life. Relax on pristine beaches, snorkel among colorful coral gardens, or take a leisurely glass-bottom boat tour. Enjoy a picnic lunch amidst the tropical paradise and soak up the serenity of this secluded island gem.", + "locationName": "Low Isles", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "great-barrier-reef", + "ref": "low-isles-tropical-island-escape", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_low-isles-tropical-island-escape.jpg" + }, + { + "name": "Stargazing Cruise under the Southern Sky", + "description": "Experience the magic of the night sky on a stargazing cruise. Sail away from the city lights and marvel at the brilliance of the Milky Way and constellations. Knowledgeable guides share insights into astronomy and Aboriginal starlore, making it a romantic and awe-inspiring evening.", + "locationName": "Departs from Port Douglas or Cairns", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "great-barrier-reef", + "ref": "stargazing-cruise-under-the-southern-sky", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_stargazing-cruise-under-the-southern-sky.jpg" + }, + { + "name": "Seafood Feast and Culinary Delights", + "description": "Indulge in a delectable seafood feast featuring the freshest catches of the day. Savor the flavors of locally sourced prawns, oysters, fish, and other delicacies prepared with culinary expertise. Pair your meal with regional wines and enjoy the vibrant atmosphere of waterfront restaurants or charming cafes.", + "locationName": "Port Douglas, Cairns, or various islands", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "great-barrier-reef", + "ref": "seafood-feast-and-culinary-delights", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-barrier-reef_seafood-feast-and-culinary-delights.jpg" + }, + { + "name": "Grizzly Bear Viewing", + "description": "Embark on a thrilling expedition to witness the majestic grizzly bears in their natural habitat. Join a guided tour to prime viewing locations, such as the Khutzeymateen Grizzly Bear Sanctuary, where you can observe these magnificent creatures as they fish for salmon or interact with their cubs. This unforgettable experience offers a unique glimpse into the lives of these iconic animals.", + "locationName": "Khutzeymateen Grizzly Bear Sanctuary or other designated viewing areas", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "great-bear-rainforest", + "ref": "grizzly-bear-viewing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_grizzly-bear-viewing.jpg" + }, + { + "name": "Kayaking through the Fjords", + "description": "Paddle through the pristine waters of the Great Bear Rainforest's fjords, surrounded by towering mountains and lush forests. Explore hidden coves, encounter marine life such as seals and sea lions, and marvel at the breathtaking scenery. Kayaking tours cater to all skill levels, from beginners to experienced paddlers, offering a peaceful and immersive way to experience the rainforest's beauty.", + "locationName": "Various fjords and inlets throughout the rainforest", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "great-bear-rainforest", + "ref": "kayaking-through-the-fjords", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_kayaking-through-the-fjords.jpg" + }, + { + "name": "Whale Watching Excursions", + "description": "Set sail on a whale watching adventure to witness the awe-inspiring humpback whales, orcas, and other marine mammals that inhabit the waters of the Great Bear Rainforest. Join experienced guides who will share their knowledge about these incredible creatures and their habitat. Witness the whales breaching, tail-slapping, and socializing in their natural environment, creating memories that will last a lifetime.", + "locationName": "Departure points from various coastal towns and villages", + "duration": 6, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 4, + "destinationRef": "great-bear-rainforest", + "ref": "whale-watching-excursions", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_whale-watching-excursions.jpg" + }, + { + "name": "Hiking the Rainforest Trails", + "description": "Lace up your hiking boots and explore the diverse trails that wind through the Great Bear Rainforest. From short and easy walks to challenging multi-day treks, there's a trail for every level of hiker. Discover ancient forests, cascading waterfalls, and panoramic viewpoints, immersing yourself in the tranquility and beauty of the rainforest.", + "locationName": "Various trailheads throughout the rainforest, including the Spirit Bear Trail and the West Coast Trail", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "great-bear-rainforest", + "ref": "hiking-the-rainforest-trails", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_hiking-the-rainforest-trails.jpg" + }, + { + "name": "Indigenous Cultural Experiences", + "description": "Immerse yourself in the rich culture and traditions of the First Nations people who have called the Great Bear Rainforest home for millennia. Visit cultural centers, participate in traditional storytelling sessions, or learn about ancient art forms and spiritual practices. These experiences offer a deeper understanding of the rainforest's significance to the indigenous communities and their connection to the land.", + "locationName": "Various cultural centers and indigenous communities within the rainforest", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "great-bear-rainforest", + "ref": "indigenous-cultural-experiences", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_indigenous-cultural-experiences.jpg" + }, + { + "name": "Birdwatching in the Estuary", + "description": "Embark on a serene birdwatching experience in the heart of the Great Bear Rainforest's estuaries. Witness a mesmerizing array of avian life, from majestic bald eagles soaring above to vibrant migratory birds like the Pacific loon and the western sandpiper. Local guides can provide insights into the unique behaviors and habitats of these feathered wonders, making it an unforgettable experience for nature enthusiasts.", + "locationName": "Kitimat River Estuary or Bella Coola Estuary", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "great-bear-rainforest", + "ref": "birdwatching-in-the-estuary", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_birdwatching-in-the-estuary.jpg" + }, + { + "name": "Wildlife Photography Expedition", + "description": "Capture the essence of the Great Bear Rainforest's wild inhabitants on a dedicated photography expedition. Accompanied by experienced guides and professional photographers, venture into prime wildlife viewing areas, seeking encounters with black bears, wolves, orcas, and other iconic species. Learn valuable techniques for wildlife photography amidst the stunning backdrop of the rainforest.", + "locationName": "Khutzeymateen Grizzly Bear Sanctuary or various islands and inlets", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "great-bear-rainforest", + "ref": "wildlife-photography-expedition", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_wildlife-photography-expedition.jpg" + }, + { + "name": "Forest Bathing and Nature Meditation", + "description": "Immerse yourself in the tranquility of the rainforest with a rejuvenating forest bathing and nature meditation experience. Led by certified guides, engage in mindfulness practices and gentle walks amidst the towering trees and calming sounds of nature. Reconnect with your senses, reduce stress, and find inner peace in the heart of this pristine wilderness.", + "locationName": "Various rainforest trails and secluded areas", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 2, + "destinationRef": "great-bear-rainforest", + "ref": "forest-bathing-and-nature-meditation", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_forest-bathing-and-nature-meditation.jpg" + }, + { + "name": "Cultural Tour of First Nations Villages", + "description": "Embark on a respectful and enriching cultural tour to experience the heritage and traditions of the First Nations people who have inhabited the Great Bear Rainforest for millennia. Visit local villages, engage with community members, and gain insights into their art, storytelling, and deep connection to the land. Learn about their sustainable practices and the vital role they play in protecting the rainforest ecosystem.", + "locationName": "First Nations villages such as Hartley Bay or Klemtu", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "great-bear-rainforest", + "ref": "cultural-tour-of-first-nations-villages", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_cultural-tour-of-first-nations-villages.jpg" + }, + { + "name": "Stargazing Cruise on a Silent Electric Boat", + "description": "Embark on a magical stargazing cruise aboard a silent electric boat, gliding through the calm waters of the rainforest under a canopy of stars. With minimal light pollution, marvel at the brilliance of the night sky, constellations, and the Milky Way. Knowledgeable guides can share insights into astronomy and the importance of preserving the dark sky environment.", + "locationName": "Various inlets and channels within the rainforest", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 4, + "destinationRef": "great-bear-rainforest", + "ref": "stargazing-cruise-on-a-silent-electric-boat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_stargazing-cruise-on-a-silent-electric-boat.jpg" + }, + { + "name": "Heli-Hiking Adventure", + "description": "Embark on an exhilarating helicopter journey to remote alpine meadows and pristine mountain peaks. Hike through breathtaking landscapes, surrounded by towering glaciers and panoramic vistas, experiencing the raw beauty of the rainforest from a unique perspective.", + "locationName": "Various mountain ranges within the Great Bear Rainforest", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "great-bear-rainforest", + "ref": "heli-hiking-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_heli-hiking-adventure.jpg" + }, + { + "name": "Wildlife Photography Workshop", + "description": "Join a professional wildlife photographer on a guided expedition to capture the incredible biodiversity of the Great Bear Rainforest. Learn valuable techniques for photographing elusive animals like bears, wolves, and eagles in their natural habitat, creating lasting memories of your wildlife encounters.", + "locationName": "Various locations throughout the rainforest, including estuaries, rivers, and forests", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "great-bear-rainforest", + "ref": "wildlife-photography-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_wildlife-photography-workshop.jpg" + }, + { + "name": "Fishing Excursion in Pristine Waters", + "description": "Cast your line into the abundant waters of the Great Bear Rainforest, teeming with salmon, halibut, and other prized fish species. Experience the thrill of sport fishing amidst stunning natural scenery, guided by experienced local fishermen who share their knowledge of the region's aquatic life.", + "locationName": "Rivers and coastal areas within the rainforest", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "great-bear-rainforest", + "ref": "fishing-excursion-in-pristine-waters", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_fishing-excursion-in-pristine-waters.jpg" + }, + { + "name": "Scenic Seaplane Flight", + "description": "Soar above the vast expanse of the Great Bear Rainforest in a seaplane, enjoying breathtaking aerial views of its rugged coastlines, ancient forests, and sparkling waterways. Witness the immensity and beauty of this unique ecosystem from a different perspective, capturing unforgettable memories from above.", + "locationName": "Departure from various coastal towns or villages", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "great-bear-rainforest", + "ref": "scenic-seaplane-flight", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_scenic-seaplane-flight.jpg" + }, + { + "name": "Cultural Immersion with First Nations Communities", + "description": "Engage in a meaningful cultural exchange with the indigenous communities who have called the Great Bear Rainforest home for millennia. Learn about their traditions, art, storytelling, and deep connection to the land, gaining a profound appreciation for their way of life and the rich cultural heritage of the region.", + "locationName": "First Nations villages and cultural centers within the rainforest", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "great-bear-rainforest", + "ref": "cultural-immersion-with-first-nations-communities", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_cultural-immersion-with-first-nations-communities.jpg" + }, + { + "name": "Hot Springs Relaxation", + "description": "Escape to serenity with a visit to the natural hot springs nestled within the rainforest. Immerse yourself in the warm, mineral-rich waters while surrounded by lush greenery and the soothing sounds of nature. This rejuvenating experience is perfect for relaxation and unwinding after a day of exploring the rainforest.", + "locationName": "Various locations within the rainforest", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "great-bear-rainforest", + "ref": "hot-springs-relaxation", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_hot-springs-relaxation.jpg" + }, + { + "name": "Bear Viewing from a Floating Lodge", + "description": "Experience the thrill of observing grizzly bears in their natural habitat from the comfort and safety of a floating lodge. These unique accommodations provide a front-row seat to witness the majestic creatures as they fish for salmon and interact with their surroundings. Expert guides will offer insights into bear behavior and the delicate ecosystem of the rainforest.", + "locationName": "Various lodges within the rainforest", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "great-bear-rainforest", + "ref": "bear-viewing-from-a-floating-lodge", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_bear-viewing-from-a-floating-lodge.jpg" + }, + { + "name": "Scenic Boat Tour", + "description": "Embark on a scenic boat tour through the breathtaking fjords and channels of the Great Bear Rainforest. Witness towering waterfalls cascading down moss-covered cliffs, spot playful seals and dolphins, and marvel at the dense forests that line the shores. This leisurely excursion offers a unique perspective of the rainforest's vastness and beauty.", + "locationName": "Various departure points within the rainforest", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "great-bear-rainforest", + "ref": "scenic-boat-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_scenic-boat-tour.jpg" + }, + { + "name": "Wildlife Photography Safari", + "description": "Capture the magic of the Great Bear Rainforest with a wildlife photography safari. Accompanied by experienced guides, venture into prime locations to photograph grizzly bears, black bears, wolves, and other fascinating creatures. Learn valuable tips and techniques to enhance your photography skills and create lasting memories of your rainforest adventure.", + "locationName": "Various locations within the rainforest", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "great-bear-rainforest", + "ref": "wildlife-photography-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_wildlife-photography-safari.jpg" + }, + { + "name": "Cultural Immersion with Coastal First Nations", + "description": "Engage in a cultural immersion experience with the Coastal First Nations communities who have inhabited the Great Bear Rainforest for centuries. Learn about their rich traditions, storytelling, art, and deep connection to the land. Participate in workshops, enjoy traditional meals, and gain a profound understanding of their way of life.", + "locationName": "Coastal First Nations villages", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "great-bear-rainforest", + "ref": "cultural-immersion-with-coastal-first-nations", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/great-bear-rainforest_cultural-immersion-with-coastal-first-nations.jpg" + }, + { + "name": "Explore the Ruins of Akrotiri on Santorini", + "description": "Step back in time and wander through the ancient ruins of Akrotiri, a Minoan Bronze Age settlement that was remarkably preserved by volcanic ash. Marvel at the advanced architecture, intricate frescoes, and everyday objects that offer a glimpse into life thousands of years ago. This archaeological wonder is often compared to Pompeii and provides a fascinating journey into the past.", + "locationName": "Akrotiri Archaeological Site, Santorini", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "greek-islands", + "ref": "explore-the-ruins-of-akrotiri-on-santorini", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_explore-the-ruins-of-akrotiri-on-santorini.jpg" + }, + { + "name": "Sail the Aegean Sea", + "description": "Embark on a sailing adventure through the turquoise waters of the Aegean Sea. Feel the refreshing sea breeze as you glide past picturesque islands, secluded coves, and volcanic landscapes. Many tours offer opportunities for swimming, snorkeling, and exploring hidden beaches, allowing you to experience the beauty of the Greek Islands from a unique perspective.", + "locationName": "Various islands and harbors", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "greek-islands", + "ref": "sail-the-aegean-sea", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_sail-the-aegean-sea.jpg" + }, + { + "name": "Hike to the Peak of Mount Zas on Naxos", + "description": "For breathtaking panoramic views and a touch of Greek mythology, hike to the summit of Mount Zas, the highest peak in the Cyclades islands. According to legend, this mountain was the childhood home of Zeus, the king of the gods. The trail offers a challenging but rewarding experience, with stunning vistas of the surrounding islands and coastline.", + "locationName": "Mount Zas, Naxos", + "duration": 5, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 2, + "destinationRef": "greek-islands", + "ref": "hike-to-the-peak-of-mount-zas-on-naxos", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_hike-to-the-peak-of-mount-zas-on-naxos.jpg" + }, + { + "name": "Indulge in a Traditional Greek Feast", + "description": "No trip to the Greek Islands is complete without savoring the delicious local cuisine. Find a charming taverna with outdoor seating and treat your taste buds to a feast of fresh seafood, grilled meats, flavorful cheeses, and vibrant salads. Don't forget to finish your meal with a glass of ouzo or a slice of baklava for a truly authentic experience.", + "locationName": "Various tavernas and restaurants throughout the islands", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "greek-islands", + "ref": "indulge-in-a-traditional-greek-feast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_indulge-in-a-traditional-greek-feast.jpg" + }, + { + "name": "Relax on the iconic Beaches of Mykonos", + "description": "Mykonos is renowned for its stunning beaches, each with its own unique vibe. From the lively Paradise Beach with its beach clubs and water sports to the more secluded Agios Sostis, known for its natural beauty, there's a perfect spot for everyone to unwind and soak up the Mediterranean sun. Enjoy swimming in the crystal-clear waters, trying out water sports, or simply relaxing on the sand with a refreshing drink.", + "locationName": "Various beaches in Mykonos", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "greek-islands", + "ref": "relax-on-the-iconic-beaches-of-mykonos", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_relax-on-the-iconic-beaches-of-mykonos.jpg" + }, + { + "name": "Go spelunking in the Melissani Cave", + "description": "Embark on an enchanting boat tour through the Melissani Cave on Kefalonia Island. Glide across the crystal-clear turquoise waters as sunlight streams through the collapsed cave ceiling, illuminating the magical underground lake. Marvel at the unique geological formations and the mystical atmosphere of this natural wonder.", + "locationName": "Melissani Cave, Kefalonia", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "greek-islands", + "ref": "go-spelunking-in-the-melissani-cave", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_go-spelunking-in-the-melissani-cave.jpg" + }, + { + "name": "Hike the Samaria Gorge", + "description": "Challenge yourself with a thrilling hike through the Samaria Gorge on Crete, the longest gorge in Europe. Trek through stunning landscapes, passing through ancient forests, towering cliffs, and refreshing streams. Keep an eye out for the elusive kri-kri, the wild goats that inhabit the gorge.", + "locationName": "Samaria Gorge, Crete", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "greek-islands", + "ref": "hike-the-samaria-gorge", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_hike-the-samaria-gorge.jpg" + }, + { + "name": "Discover the ancient city of Rhodes", + "description": "Step back in time and explore the medieval city of Rhodes, a UNESCO World Heritage Site. Wander through the cobblestone streets of the Old Town, visit the Palace of the Grand Master, and admire the impressive fortifications. Don't miss the Street of the Knights, lined with medieval inns and the Archaeological Museum.", + "locationName": "Rhodes Town, Rhodes", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "greek-islands", + "ref": "discover-the-ancient-city-of-rhodes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_discover-the-ancient-city-of-rhodes.jpg" + }, + { + "name": "Scuba dive or snorkel in the Aegean Sea", + "description": "Plunge into the crystal-clear waters of the Aegean Sea and discover a vibrant underwater world. Explore colorful coral reefs, encounter diverse marine life, and discover ancient shipwrecks. Whether you're an experienced diver or a beginner snorkeler, the Greek Islands offer unforgettable underwater adventures.", + "locationName": "Various islands", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "greek-islands", + "ref": "scuba-dive-or-snorkel-in-the-aegean-sea", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_scuba-dive-or-snorkel-in-the-aegean-sea.jpg" + }, + { + "name": "Experience the nightlife of Mykonos", + "description": "Dance the night away in the vibrant nightlife scene of Mykonos. Explore the numerous bars and clubs, from beachfront parties to chic cocktail lounges. Enjoy live music, DJs, and a lively atmosphere that lasts until dawn.", + "locationName": "Mykonos Town, Mykonos", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 4, + "destinationRef": "greek-islands", + "ref": "experience-the-nightlife-of-mykonos", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_experience-the-nightlife-of-mykonos.jpg" + }, + { + "name": "Kayaking to Sea Caves and Hidden Beaches", + "description": "Embark on a kayaking adventure along the dramatic coastlines of islands like Milos or Kefalonia. Paddle into secluded sea caves, discover hidden beaches inaccessible by land, and snorkel in crystal-clear waters. This active experience allows you to explore the islands' natural beauty from a unique perspective.", + "locationName": "Milos or Kefalonia", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "greek-islands", + "ref": "kayaking-to-sea-caves-and-hidden-beaches", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_kayaking-to-sea-caves-and-hidden-beaches.jpg" + }, + { + "name": "Visit a Traditional Village and Learn Local Crafts", + "description": "Step back in time and immerse yourself in the authentic charm of a traditional Greek village. Explore the narrow streets, visit local shops selling handmade crafts, and perhaps even participate in a workshop to learn skills like pottery, weaving, or cheese-making. This cultural experience provides a glimpse into the islands' rich heritage.", + "locationName": "Various Islands", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "greek-islands", + "ref": "visit-a-traditional-village-and-learn-local-crafts", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_visit-a-traditional-village-and-learn-local-crafts.jpg" + }, + { + "name": "Wine Tasting at a Vineyard with Stunning Views", + "description": "Indulge in the unique flavors of Greek wine with a visit to a local vineyard. Sample a variety of wines, learn about the winemaking process, and savor breathtaking views of the surrounding landscapes. Santorini and Crete are particularly renowned for their volcanic wines and picturesque vineyards.", + "locationName": "Santorini or Crete", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "greek-islands", + "ref": "wine-tasting-at-a-vineyard-with-stunning-views", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_wine-tasting-at-a-vineyard-with-stunning-views.jpg" + }, + { + "name": "Sunset Cruise with Dinner and Live Music", + "description": "Experience the magic of a Greek sunset on a romantic cruise along the coast. Enjoy a delicious dinner onboard, sip on cocktails, and be serenaded by live music as you witness the sky ablaze with colors. This unforgettable experience is perfect for couples or those seeking a memorable evening.", + "locationName": "Various Islands", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "greek-islands", + "ref": "sunset-cruise-with-dinner-and-live-music", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_sunset-cruise-with-dinner-and-live-music.jpg" + }, + { + "name": "Hiking or Biking Through Scenic Trails", + "description": "Explore the diverse landscapes of the islands on foot or by bike. Hike through olive groves, pine forests, and along coastal paths, enjoying panoramic views and discovering hidden gems. Many islands offer well-maintained trails suitable for different fitness levels, making it a perfect activity for nature enthusiasts.", + "locationName": "Various Islands", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "greek-islands", + "ref": "hiking-or-biking-through-scenic-trails", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_hiking-or-biking-through-scenic-trails.jpg" + }, + { + "name": "Island Hopping Adventure", + "description": "Embark on a multi-day island hopping adventure, exploring the diverse landscapes and unique charm of each island. Ferry between popular destinations like Mykonos, Santorini, and Crete, or venture off the beaten path to discover hidden gems like Folegandros and Milos. Each island offers its own blend of history, culture, and natural beauty, allowing you to customize your itinerary to match your interests.", + "locationName": "Various Greek Islands", + "duration": 48, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "greek-islands", + "ref": "island-hopping-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_island-hopping-adventure.jpg" + }, + { + "name": "Cooking Class with a Local Family", + "description": "Immerse yourself in Greek culture by participating in a cooking class hosted by a local family. Learn the secrets of traditional Greek cuisine, from fresh ingredients and time-honored recipes to the warmth of Greek hospitality. Enjoy the fruits (and vegetables) of your labor with a delicious home-cooked meal shared with your hosts.", + "locationName": "Various Islands", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "greek-islands", + "ref": "cooking-class-with-a-local-family", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_cooking-class-with-a-local-family.jpg" + }, + { + "name": "Volcanic Exploration on Nisyros", + "description": "Venture to the volcanic island of Nisyros and descend into the crater of an active volcano. Witness the raw power of nature as you explore the lunar-like landscape, feeling the heat beneath your feet and smelling the sulfur in the air. Learn about the island's volcanic history and unique ecosystem.", + "locationName": "Nisyros", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "greek-islands", + "ref": "volcanic-exploration-on-nisyros", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_volcanic-exploration-on-nisyros.jpg" + }, + { + "name": "Stargazing on a Secluded Beach", + "description": "Escape the city lights and find a secluded beach to experience the magic of the Greek night sky. With minimal light pollution, the stars shine brightly, offering a breathtaking view of the Milky Way and constellations. Bring a blanket and some local wine for a truly romantic and unforgettable evening.", + "locationName": "Various Islands", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "greek-islands", + "ref": "stargazing-on-a-secluded-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_stargazing-on-a-secluded-beach.jpg" + }, + { + "name": "Watersports Extravaganza", + "description": "Get your adrenaline pumping with a day of exhilarating watersports. Choose from a variety of options such as windsurfing, kitesurfing, jet skiing, or parasailing. Many islands offer rentals and lessons, allowing you to experience the thrill of riding the waves or soaring above the Aegean Sea.", + "locationName": "Various Islands", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "greek-islands", + "ref": "watersports-extravaganza", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greek-islands_watersports-extravaganza.jpg" + }, + { + "name": "Boat Tour of the Icefjord", + "description": "Embark on an unforgettable boat tour through the Ilulissat Icefjord, a UNESCO World Heritage site. Marvel at the towering icebergs, some as tall as skyscrapers, that have calved from the Sermeq Kujalleq glacier. Capture stunning photographs of the icy landscape and witness the raw power of nature.", + "locationName": "Ilulissat Icefjord", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "greenland", + "ref": "boat-tour-of-the-icefjord", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_boat-tour-of-the-icefjord.jpg" + }, + { + "name": "Hiking to the Icefjord Viewpoint", + "description": "Lace up your hiking boots and embark on a scenic trail that leads to a breathtaking viewpoint overlooking the Ilulissat Icefjord. Enjoy panoramic views of the massive icebergs and the vast expanse of the Arctic landscape. This moderate hike is suitable for those with a reasonable level of fitness.", + "locationName": "Ilulissat Icefjord", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "greenland", + "ref": "hiking-to-the-icefjord-viewpoint", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_hiking-to-the-icefjord-viewpoint.jpg" + }, + { + "name": "Kayaking Among Icebergs", + "description": "Experience the thrill of kayaking amidst the icebergs of the Ilulissat Icefjord. Paddle through the calm waters, surrounded by the towering ice formations, and feel a sense of awe and wonder. This adventure activity is suitable for experienced kayakers.", + "locationName": "Ilulissat Icefjord", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "greenland", + "ref": "kayaking-among-icebergs", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_kayaking-among-icebergs.jpg" + }, + { + "name": "Visit the Ilulissat Museum", + "description": "Delve into the history and culture of Greenland at the Ilulissat Museum. Learn about the Inuit people, their traditions, and their way of life in this Arctic region. Explore exhibits on the geology of the icefjord and the impact of climate change.", + "locationName": "Ilulissat Town", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "greenland", + "ref": "visit-the-ilulissat-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_visit-the-ilulissat-museum.jpg" + }, + { + "name": "Dog Sledding Adventure", + "description": "Embark on a thrilling dog sledding adventure across the frozen landscape. Experience the traditional mode of transportation of the Inuit people and enjoy the exhilaration of being pulled by a team of huskies. This activity is available during the winter months.", + "locationName": "Ilulissat Icefjord", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "greenland", + "ref": "dog-sledding-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_dog-sledding-adventure.jpg" + }, + { + "name": "Northern Lights Viewing", + "description": "Experience the magic of the Aurora Borealis dancing across the Arctic sky. Join a guided evening tour to escape the city lights and witness this breathtaking natural phenomenon. Warm beverages and local folklore add to the enchantment of this unforgettable experience.", + "locationName": "Ilulissat Icefjord and surrounding areas", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "greenland", + "ref": "northern-lights-viewing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_northern-lights-viewing.jpg" + }, + { + "name": "Whale Watching Excursion", + "description": "Embark on a thrilling boat trip in search of majestic whales that inhabit the waters around Ilulissat Icefjord. Witness humpback whales, minke whales, and even fin whales breaching and spouting in their natural habitat. Knowledgeable guides provide insights into these fascinating creatures and the delicate Arctic ecosystem.", + "locationName": "Disko Bay", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "greenland", + "ref": "whale-watching-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_whale-watching-excursion.jpg" + }, + { + "name": "Sermermiut Eskimo Settlement Hike", + "description": "Step back in time with a hike to the abandoned Sermermiut settlement. Explore the remains of ancient Inuit dwellings and learn about the history and culture of the people who thrived in this harsh Arctic environment for centuries. The panoramic views of the Icefjord add to the allure of this historical and scenic adventure.", + "locationName": "Sermermiut", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "greenland", + "ref": "sermermiut-eskimo-settlement-hike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_sermermiut-eskimo-settlement-hike.jpg" + }, + { + "name": "Greenlandic Gastronomy Experience", + "description": "Indulge in the unique flavors of Greenlandic cuisine. Savor traditional dishes like suaasat (seal soup), musk ox steak, and fresh Arctic seafood. Local restaurants and cafes offer a delightful culinary journey, showcasing the region's rich food culture and reliance on seasonal ingredients.", + "locationName": "Ilulissat town", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "greenland", + "ref": "greenlandic-gastronomy-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_greenlandic-gastronomy-experience.jpg" + }, + { + "name": "Arctic Wildlife Photography Tour", + "description": "Capture the beauty of Greenland's wildlife through the lens of your camera. Join a photography tour led by experienced guides who will take you to prime locations for spotting reindeer, Arctic foxes, seabirds, and other fascinating creatures. Learn valuable photography tips and techniques while immersing yourself in the stunning Arctic landscapes.", + "locationName": "Ilulissat Icefjord and surrounding areas", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "greenland", + "ref": "arctic-wildlife-photography-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_arctic-wildlife-photography-tour.jpg" + }, + { + "name": "Midnight Sun Hike", + "description": "Experience the surreal phenomenon of the midnight sun, where the sun remains visible even at night, by embarking on a guided hiking tour. Witness the ethereal glow of the sun casting long shadows on the icebergs and the surrounding landscape, creating a truly magical experience. This unique opportunity allows you to explore the Arctic wilderness under the soft light of the midnight sun, capturing breathtaking photos and creating unforgettable memories.", + "locationName": "Sermermiut Valley", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "greenland", + "ref": "midnight-sun-hike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_midnight-sun-hike.jpg" + }, + { + "name": "Ice Climbing Adventure", + "description": "For thrill-seekers, embark on an ice climbing adventure on the frozen waterfalls and cliffs surrounding the Ilulissat Icefjord. With experienced guides and proper equipment, challenge yourself with this exhilarating activity, testing your strength and agility as you ascend the icy surfaces. Enjoy breathtaking views of the icefjord and surrounding landscapes from unique vantage points.", + "locationName": "Various locations around the Ilulissat Icefjord", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "greenland", + "ref": "ice-climbing-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_ice-climbing-adventure.jpg" + }, + { + "name": "Greenlandic Culture Workshop", + "description": "Immerse yourself in the rich culture of Greenland by participating in a Greenlandic culture workshop. Learn about traditional crafts such as drum dancing, mask making, and Inuit storytelling. Engage with local artisans and gain insights into their way of life, traditions, and connection to the Arctic environment.", + "locationName": "Ilulissat Community Center", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "greenland", + "ref": "greenlandic-culture-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_greenlandic-culture-workshop.jpg" + }, + { + "name": "Arctic Wildlife Safari", + "description": "Embark on an Arctic wildlife safari by boat or jeep to explore the diverse fauna of the region. Keep an eye out for reindeer, Arctic foxes, musk oxen, and various bird species that inhabit the area. Learn about their adaptations to the harsh Arctic environment and their role in the ecosystem from knowledgeable guides.", + "locationName": "Tundra areas around Ilulissat Icefjord", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "greenland", + "ref": "arctic-wildlife-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_arctic-wildlife-safari.jpg" + }, + { + "name": "Kayak Fishing Expedition", + "description": "Combine the thrill of kayaking with the excitement of fishing on a kayak fishing expedition. Paddle through the calm waters of the Ilulissat Icefjord, surrounded by towering icebergs, and try your luck at catching Arctic fish species like halibut or cod. Enjoy the tranquility of the surroundings and the satisfaction of reeling in your own catch.", + "locationName": "Ilulissat Icefjord", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "greenland", + "ref": "kayak-fishing-expedition", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_kayak-fishing-expedition.jpg" + }, + { + "name": "Snowshoeing in the Arctic Wilderness", + "description": "Embark on a serene snowshoeing adventure through the pristine Arctic wilderness surrounding the Ilulissat Icefjord. Explore the snow-covered landscapes, breathe in the crisp air, and experience the tranquility of the Arctic winter. This activity offers a unique way to connect with nature and enjoy the peaceful beauty of Greenland.", + "locationName": "Ilulissat Icefjord surrounding area", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "greenland", + "ref": "snowshoeing-in-the-arctic-wilderness", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_snowshoeing-in-the-arctic-wilderness.jpg" + }, + { + "name": "Scenic Flight over the Icefjord", + "description": "Take to the skies for a breathtaking scenic flight over the Ilulissat Icefjord and witness the grandeur of the icebergs from a different perspective. Soar above the frozen landscape, marvel at the vastness of the icefjord, and capture stunning aerial photographs of this natural wonder.", + "locationName": "Ilulissat Airport", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "greenland", + "ref": "scenic-flight-over-the-icefjord", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_scenic-flight-over-the-icefjord.jpg" + }, + { + "name": "Visit the Knud Rasmussen Museum", + "description": "Delve into the history of Greenland and the Arctic at the Knud Rasmussen Museum. Learn about the famous polar explorer Knud Rasmussen, explore exhibits on Inuit culture and history, and gain insights into the region's unique heritage and way of life.", + "locationName": "Ilulissat town", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "greenland", + "ref": "visit-the-knud-rasmussen-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_visit-the-knud-rasmussen-museum.jpg" + }, + { + "name": "Greenlandic Kaffemik Experience", + "description": "Immerse yourself in Greenlandic culture by attending a traditional Kaffemik gathering. Enjoy coffee, tea, and local delicacies while socializing with local residents and learning about their customs and traditions. This is a wonderful opportunity to experience Greenlandic hospitality and connect with the community.", + "locationName": "Local homes in Ilulissat", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "greenland", + "ref": "greenlandic-kaffemik-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_greenlandic-kaffemik-experience.jpg" + }, + { + "name": "Stargazing in the Arctic Night", + "description": "Experience the magic of the Arctic night sky with a stargazing excursion. Away from the city lights, marvel at the celestial wonders, including the possibility of witnessing the mesmerizing Northern Lights. Learn about constellations and astronomical phenomena from expert guides.", + "locationName": "Ilulissat Icefjord surrounding area", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "greenland", + "ref": "stargazing-in-the-arctic-night", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/greenland_stargazing-in-the-arctic-night.jpg" + }, + { + "name": "Hike to Carbet Falls", + "description": "Embark on an invigorating hike through the lush rainforest to witness the breathtaking Carbet Falls, a series of three cascading waterfalls nestled amidst volcanic slopes. The trail offers varying difficulty levels, catering to both casual hikers and seasoned adventurers. Be prepared to be mesmerized by the power and beauty of nature as you immerse yourself in the sights and sounds of the rainforest.", + "locationName": "Carbet Falls", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "guadeloupe", + "ref": "hike-to-carbet-falls", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_hike-to-carbet-falls.jpg" + }, + { + "name": "Discover the Charm of Pointe-à-Pitre", + "description": "Wander through the colorful streets of Pointe-à-Pitre, Guadeloupe's largest city, and soak up the vibrant atmosphere. Explore the bustling markets, admire the colonial architecture, and visit historical landmarks such as the Saint-Pierre and Saint-Paul Cathedral. Don't miss the opportunity to savor delicious Creole cuisine at local restaurants and experience the unique blend of French and Caribbean culture.", + "locationName": "Pointe-à-Pitre", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "guadeloupe", + "ref": "discover-the-charm-of-pointe-pitre", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_discover-the-charm-of-pointe-pitre.jpg" + }, + { + "name": "Relax on Grande Anse Beach", + "description": "Unwind on the pristine sands of Grande Anse Beach, considered one of the most beautiful beaches in Guadeloupe. Bask in the warm Caribbean sun, take a refreshing dip in the turquoise waters, or simply enjoy the breathtaking views of the coastline. With its calm waters and gentle waves, it's an ideal spot for families with children and those seeking a tranquil escape.", + "locationName": "Grande Anse Beach", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "guadeloupe", + "ref": "relax-on-grande-anse-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_relax-on-grande-anse-beach.jpg" + }, + { + "name": "Visit La Soufrière Volcano", + "description": "Embark on a thrilling adventure to La Soufrière, an active volcano and the highest peak in the Lesser Antilles. Hike through volcanic landscapes, witness steaming fumaroles, and enjoy panoramic views from the summit. This experience is perfect for adventure seekers and those interested in the geological wonders of the island.", + "locationName": "La Soufrière Volcano", + "duration": 5, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "guadeloupe", + "ref": "visit-la-soufri-re-volcano", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_visit-la-soufri-re-volcano.jpg" + }, + { + "name": "Island Hopping Adventure", + "description": "Embark on a boat tour to explore the surrounding islands of Guadeloupe, each offering its own unique charm. Discover the pristine beaches of Petite Terre, snorkel in the turquoise waters of Marie-Galante, or immerse yourself in the history of Les Saintes. This island-hopping adventure promises breathtaking scenery and unforgettable memories.", + "locationName": "Guadeloupe Archipelago", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "guadeloupe", + "ref": "island-hopping-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_island-hopping-adventure.jpg" + }, + { + "name": "Kayaking through the Mangroves", + "description": "Paddle through the tranquil mangrove forests of Grand Cul-de-Sac Marin, a protected natural reserve. Observe the diverse ecosystem, including exotic birds, fish, and crabs, while enjoying the serenity of this unique environment. Kayaking tours offer a peaceful way to connect with nature and explore Guadeloupe's hidden gems.", + "locationName": "Grand Cul-de-Sac Marin", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "guadeloupe", + "ref": "kayaking-through-the-mangroves", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_kayaking-through-the-mangroves.jpg" + }, + { + "name": "Indulge in Creole Cuisine", + "description": "Embark on a culinary journey through Guadeloupe's vibrant food scene. Savor the unique flavors of Creole cuisine, a fusion of French, African, and Indian influences. Sample local delicacies such as accras (cod fritters), colombo (curried meat or vegetables), and bokit (stuffed sandwich) at traditional restaurants or bustling markets.", + "locationName": "Various Restaurants and Markets", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "guadeloupe", + "ref": "indulge-in-creole-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_indulge-in-creole-cuisine.jpg" + }, + { + "name": "Sunset Catamaran Cruise", + "description": "Set sail on a romantic catamaran cruise as the sun dips below the horizon. Enjoy breathtaking views of the coastline, sip on cocktails, and sway to the rhythm of Caribbean music. This unforgettable experience is perfect for couples or anyone seeking a magical evening on the water.", + "locationName": "Guadeloupe Coastline", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "guadeloupe", + "ref": "sunset-catamaran-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_sunset-catamaran-cruise.jpg" + }, + { + "name": "Discover the History of Fort Delgrès", + "description": "Step back in time at Fort Delgrès, a historic landmark overlooking Basse-Terre. Explore the ruins of this 17th-century fort, which played a significant role in Guadeloupe's colonial past. Learn about the island's history and enjoy panoramic views of the surrounding landscape.", + "locationName": "Fort Delgrès", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "guadeloupe", + "ref": "discover-the-history-of-fort-delgr-s", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_discover-the-history-of-fort-delgr-s.jpg" + }, + { + "name": "Canyoning Adventure in the Jungle", + "description": "Embark on an exhilarating canyoning adventure through Guadeloupe's lush rainforests. Rappel down cascading waterfalls, slide down natural water slides, and jump into refreshing pools. This adrenaline-pumping activity is perfect for thrill-seekers and nature lovers.", + "locationName": "Guadeloupe National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "guadeloupe", + "ref": "canyoning-adventure-in-the-jungle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_canyoning-adventure-in-the-jungle.jpg" + }, + { + "name": "Horseback Riding on the Beach", + "description": "Experience the beauty of Guadeloupe's coastline on horseback. Ride along pristine beaches, through coconut groves, and enjoy breathtaking ocean views. This activity is suitable for all skill levels and offers a unique perspective of the island.", + "locationName": "Sainte-Anne Beach", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "guadeloupe", + "ref": "horseback-riding-on-the-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_horseback-riding-on-the-beach.jpg" + }, + { + "name": "Rum Distillery Tour and Tasting", + "description": "Delve into the rich history of rum production in Guadeloupe. Visit a traditional distillery, learn about the rum-making process, and indulge in a tasting of various aged rums. This cultural experience is perfect for those who appreciate fine spirits.", + "locationName": "Damoiseau Distillery", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "guadeloupe", + "ref": "rum-distillery-tour-and-tasting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_rum-distillery-tour-and-tasting.jpg" + }, + { + "name": "Stargazing on the Beach", + "description": "Escape the city lights and marvel at the celestial wonders above. Join a guided stargazing tour on a secluded beach, where you can observe constellations, planets, and the Milky Way with the help of telescopes and expert astronomers.", + "locationName": "Plage de la Caravelle", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "guadeloupe", + "ref": "stargazing-on-the-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_stargazing-on-the-beach.jpg" + }, + { + "name": "Scuba Diving at Pigeon Island", + "description": "Explore the vibrant underwater world of Pigeon Island, a protected marine reserve renowned for its diverse marine life. Discover colorful coral reefs, swim alongside tropical fish, and encounter fascinating sea creatures such as sea turtles and rays. This activity is perfect for certified scuba divers.", + "locationName": "Pigeon Island", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "guadeloupe", + "ref": "scuba-diving-at-pigeon-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_scuba-diving-at-pigeon-island.jpg" + }, + { + "name": "Ziplining through the Rainforest Canopy", + "description": "Experience the thrill of soaring through the lush rainforest canopy on a zipline adventure. Enjoy breathtaking views of the island's diverse flora and fauna as you glide from platform to platform, feeling the adrenaline rush of this exhilarating activity. Several locations across Basse-Terre offer zipline courses suitable for various ages and skill levels.", + "locationName": "Rainforest Canopy", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "guadeloupe", + "ref": "ziplining-through-the-rainforest-canopy", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_ziplining-through-the-rainforest-canopy.jpg" + }, + { + "name": "Explore the Local Markets", + "description": "Immerse yourself in the vibrant culture of Guadeloupe by visiting the bustling local markets. Discover a variety of fresh produce, spices, handcrafted souvenirs, and local delicacies. Engage with friendly vendors, practice your French or Creole, and experience the authentic charm of Guadeloupean life.", + "locationName": "Pointe-à-Pitre or Basse-Terre", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "guadeloupe", + "ref": "explore-the-local-markets", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_explore-the-local-markets.jpg" + }, + { + "name": "Take a Cooking Class", + "description": "Delve into the world of Creole cuisine by taking a cooking class. Learn the secrets of preparing traditional dishes like Colombo, accras, and poisson cru. Master the art of blending spices and creating flavorful sauces, and enjoy the fruits of your labor with a delicious meal.", + "locationName": "Various locations", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "guadeloupe", + "ref": "take-a-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_take-a-cooking-class.jpg" + }, + { + "name": "Go Birdwatching in the National Park", + "description": "Embark on a birdwatching adventure in Guadeloupe National Park. With over 100 bird species, including the Guadeloupe woodpecker and the white-breasted thrasher, the park offers a haven for bird enthusiasts. Hike through diverse ecosystems, from rainforests to mangroves, and observe these feathered creatures in their natural habitat.", + "locationName": "Guadeloupe National Park", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "guadeloupe", + "ref": "go-birdwatching-in-the-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_go-birdwatching-in-the-national-park.jpg" + }, + { + "name": "Enjoy Watersports", + "description": "Embrace the crystal-clear waters of Guadeloupe with a variety of watersports. Try windsurfing or kitesurfing, rent a jet ski for an adrenaline rush, or go stand-up paddleboarding for a more relaxing experience. The calm lagoons and steady trade winds provide ideal conditions for beginners and experienced enthusiasts.", + "locationName": "Various beaches", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "guadeloupe", + "ref": "enjoy-watersports", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guadeloupe_enjoy-watersports.jpg" + }, + { + "name": "Kayaking on the Lake", + "description": "Embark on a serene kayaking adventure across the crystal-clear waters of Lake Atitlán. Witness breathtaking panoramic views of the surrounding volcanoes and charming villages while enjoying the tranquility of the lake. Rent a kayak and explore at your own pace, or join a guided tour to discover hidden coves and learn about the area's rich history and ecosystem.", + "locationName": "Lake Atitlán", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "guatemala", + "ref": "kayaking-on-the-lake", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_kayaking-on-the-lake.jpg" + }, + { + "name": "Hiking Indian Nose", + "description": "Challenge yourself with a hike up Indian Nose, a mountain peak known for its unique profile resembling a person's face. The trail offers stunning vistas of the lake and surrounding landscapes, especially during sunrise when the golden light bathes the scenery. Be prepared for a moderate climb and pack water and snacks for the journey.", + "locationName": "Indian Nose", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 2, + "destinationRef": "guatemala", + "ref": "hiking-indian-nose", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_hiking-indian-nose.jpg" + }, + { + "name": "Exploring Mayan Villages", + "description": "Immerse yourself in the vibrant Mayan culture by visiting the traditional villages that dot the shores of Lake Atitlán. Each village has its unique charm, from the bustling market of Santiago Atitlán to the artistic hub of San Juan la Laguna. Interact with local artisans, witness traditional weaving techniques, and learn about their customs and beliefs.", + "locationName": "Various villages around Lake Atitlán", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "guatemala", + "ref": "exploring-mayan-villages", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_exploring-mayan-villages.jpg" + }, + { + "name": "Coffee Plantation Tour", + "description": "Delve into the world of Guatemalan coffee with a tour of a local coffee plantation. Learn about the coffee-making process, from bean to cup, and discover the unique flavors and aromas of the region's renowned coffee beans. Enjoy a tasting session and appreciate the meticulous care that goes into each brew.", + "locationName": "Various coffee plantations around Lake Atitlán", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "guatemala", + "ref": "coffee-plantation-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_coffee-plantation-tour.jpg" + }, + { + "name": "Sunset Cruise", + "description": "Conclude your day with a magical sunset cruise on Lake Atitlán. Witness the sky ablaze with vibrant colors as the sun dips below the horizon, casting long shadows over the water and surrounding volcanoes. Enjoy the peaceful ambiance and capture unforgettable moments of this breathtaking spectacle.", + "locationName": "Lake Atitlán", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "guatemala", + "ref": "sunset-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_sunset-cruise.jpg" + }, + { + "name": "Scuba Diving in Lake Atitlán", + "description": "Explore the underwater world of Lake Atitlán, including unique volcanic formations, submerged Mayan ruins, and diverse fish species. Several dive shops around the lake offer guided dives for all skill levels, allowing you to discover the hidden depths of this volcanic lake.", + "locationName": "Lake Atitlán", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "guatemala", + "ref": "scuba-diving-in-lake-atitl-n", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_scuba-diving-in-lake-atitl-n.jpg" + }, + { + "name": "Paragliding over Lake Atitlán", + "description": "Soar above the stunning landscapes of Lake Atitlán on a tandem paragliding flight. Experience breathtaking aerial views of the volcanic caldera, surrounding villages, and the glistening lake. This thrilling adventure offers a unique perspective and unforgettable memories.", + "locationName": "Lake Atitlán", + "duration": 1, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "guatemala", + "ref": "paragliding-over-lake-atitl-n", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_paragliding-over-lake-atitl-n.jpg" + }, + { + "name": "Visit the Chichicastenango Market", + "description": "Immerse yourself in the vibrant atmosphere of the Chichicastenango Market, one of the largest and most colorful markets in Central America. Browse through a vast array of handicrafts, textiles, ceramics, and local produce, while experiencing the cultural richness of the indigenous Mayan people.", + "locationName": "Chichicastenango", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "guatemala", + "ref": "visit-the-chichicastenango-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_visit-the-chichicastenango-market.jpg" + }, + { + "name": "Spanish Immersion and Homestay", + "description": "Combine language learning with cultural immersion through a Spanish immersion program and homestay experience. Live with a local family, attend language classes, and practice your Spanish while engaging in daily life and cultural activities. This is a fantastic way to gain language skills and a deeper understanding of Guatemalan culture.", + "locationName": "Lake Atitlán", + "duration": 14, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "guatemala", + "ref": "spanish-immersion-and-homestay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_spanish-immersion-and-homestay.jpg" + }, + { + "name": "Relax at a lakeside spa", + "description": "Unwind and rejuvenate at one of the many lakeside spas offering a variety of treatments, including massages, facials, and body wraps. Enjoy stunning lake views while indulging in relaxation and self-care, providing the perfect escape from the everyday hustle and bustle.", + "locationName": "Lake Atitlán", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "guatemala", + "ref": "relax-at-a-lakeside-spa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_relax-at-a-lakeside-spa.jpg" + }, + { + "name": "Birdwatching at the Atitlán Nature Reserve", + "description": "Embark on a serene journey through the Atitlán Nature Reserve, a sanctuary for diverse bird species. Hike through lush trails, accompanied by expert guides, and spot vibrant feathered creatures like the azure-rumped tanager and pink-headed warbler. Immerse yourself in the tranquil sounds of nature and capture stunning photos of these avian wonders.", + "locationName": "Atitlán Nature Reserve", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "guatemala", + "ref": "birdwatching-at-the-atitl-n-nature-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_birdwatching-at-the-atitl-n-nature-reserve.jpg" + }, + { + "name": "Mountain Biking Adventure", + "description": "Experience the thrill of mountain biking through the rugged landscapes surrounding Lake Atitlán. Rent a bike and explore scenic trails with varying difficulty levels, offering breathtaking views of the lake and volcanoes. Whether you're a seasoned rider or a beginner, this adventure will get your adrenaline pumping and provide a unique perspective of the region.", + "locationName": "Various trails around Lake Atitlán", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "guatemala", + "ref": "mountain-biking-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_mountain-biking-adventure.jpg" + }, + { + "name": "Weaving Workshop with Local Artisans", + "description": "Immerse yourself in the rich textile traditions of Guatemala with a weaving workshop. Learn from skilled Mayan artisans in their homes or workshops, gaining insights into the intricate techniques and cultural significance of backstrap loom weaving. Create your own unique textile souvenir and support local communities.", + "locationName": "Villages around Lake Atitlán", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "guatemala", + "ref": "weaving-workshop-with-local-artisans", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_weaving-workshop-with-local-artisans.jpg" + }, + { + "name": "Stargazing by the Lake", + "description": "Escape the city lights and marvel at the celestial wonders above Lake Atitlán. Join a stargazing tour or simply find a secluded spot on the shore. With minimal light pollution, the night sky explodes with stars, constellations, and even the Milky Way. Relax under the vast expanse and contemplate the universe.", + "locationName": "Lake Atitlán shores", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "guatemala", + "ref": "stargazing-by-the-lake", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_stargazing-by-the-lake.jpg" + }, + { + "name": "Stand Up Paddleboarding on the Lake", + "description": "Glide across the calm waters of Lake Atitlán on a stand-up paddleboard. Rent a board and explore the shoreline at your own pace, enjoying the panoramic views of the surrounding volcanoes and villages. This relaxing activity is perfect for all skill levels and offers a unique way to connect with nature.", + "locationName": "Lake Atitlán", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "guatemala", + "ref": "stand-up-paddleboarding-on-the-lake", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_stand-up-paddleboarding-on-the-lake.jpg" + }, + { + "name": "Rock Climbing at Indian Nose", + "description": "Challenge yourself with a thrilling rock climbing adventure at Indian Nose, a prominent mountain overlooking Lake Atitlán. Experienced guides will lead you on an exhilarating ascent, offering stunning panoramic views of the lake and surrounding volcanoes as you conquer the rocky cliffs. This activity is perfect for adventure seekers looking for an adrenaline rush and a unique perspective of the breathtaking landscape.", + "locationName": "Indian Nose", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "guatemala", + "ref": "rock-climbing-at-indian-nose", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_rock-climbing-at-indian-nose.jpg" + }, + { + "name": "Visit Santiago Atitlán and its Mayan Culture", + "description": "Embark on a cultural journey to Santiago Atitlán, the largest lakeside town known for its strong Mayan heritage. Explore the vibrant local market, where you can find traditional textiles, handicrafts, and fresh produce. Visit the church of St. James the Apostle, a significant religious site, and learn about the town's unique blend of Catholicism and Mayan beliefs. Immerse yourself in the local culture and witness traditional ceremonies or rituals.", + "locationName": "Santiago Atitlán", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "guatemala", + "ref": "visit-santiago-atitl-n-and-its-mayan-culture", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_visit-santiago-atitl-n-and-its-mayan-culture.jpg" + }, + { + "name": "Horseback Riding through the Highlands", + "description": "Experience the beauty of the Guatemalan highlands on horseback. Ride through scenic trails, passing by traditional villages, coffee plantations, and lush forests. Enjoy breathtaking views of the lake and volcanoes as you connect with nature and experience the local way of life. This activity is suitable for all skill levels and offers a unique way to explore the region.", + "locationName": "Lake Atitlán Highlands", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "guatemala", + "ref": "horseback-riding-through-the-highlands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_horseback-riding-through-the-highlands.jpg" + }, + { + "name": "Sample Local Cuisine at a Cooking Class", + "description": "Delve into the flavors of Guatemalan cuisine by participating in a cooking class. Learn to prepare traditional dishes like pepián, a rich stew, or rellenitos, sweet plantains filled with black beans. Discover the secrets of local ingredients and cooking techniques, and savor the delicious results of your culinary creations. This activity is a must for food enthusiasts and provides a deeper understanding of Guatemalan culture.", + "locationName": "Various locations around Lake Atitlán", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "guatemala", + "ref": "sample-local-cuisine-at-a-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_sample-local-cuisine-at-a-cooking-class.jpg" + }, + { + "name": "Catch a Live Music Performance", + "description": "Immerse yourself in the vibrant nightlife of Lake Atitlán by attending a live music performance. Several bars and restaurants around the lake host local bands and musicians, offering a diverse range of musical styles from traditional Mayan music to contemporary Latin beats. Enjoy a lively atmosphere, sip on local cocktails, and dance the night away under the stars.", + "locationName": "Various bars and restaurants around Lake Atitlán", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "guatemala", + "ref": "catch-a-live-music-performance", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/guatemala_catch-a-live-music-performance.jpg" + }, + { + "name": "Cruise Among the Limestone Islands", + "description": "Embark on a scenic cruise through the emerald waters of Ha Long Bay, marveling at the towering limestone formations and hidden caves. Enjoy a delicious seafood lunch on board as you soak in the breathtaking views of this UNESCO World Heritage Site. Opt for a day trip or an overnight adventure on a traditional junk boat for a truly immersive experience.", + "locationName": "Ha Long Bay", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "ha-long-bay", + "ref": "cruise-among-the-limestone-islands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_cruise-among-the-limestone-islands.jpg" + }, + { + "name": "Kayaking Adventure", + "description": "Paddle through the tranquil waters of Ha Long Bay on a kayaking excursion, exploring hidden coves, lagoons, and floating villages. Get up close to the limestone karst formations and discover secret beaches. This activity is perfect for those seeking a more active and adventurous way to experience the bay.", + "locationName": "Ha Long Bay", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "ha-long-bay", + "ref": "kayaking-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_kayaking-adventure.jpg" + }, + { + "name": "Visit Sung Sot Cave (Surprise Cave)", + "description": "Explore the magnificent Sung Sot Cave, one of the largest and most impressive caves in Ha Long Bay. Marvel at the stunning stalactites and stalagmites, and learn about the fascinating geological history of the region. This cave offers a unique glimpse into the hidden world beneath the limestone islands.", + "locationName": "Bo Hon Island", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "ha-long-bay", + "ref": "visit-sung-sot-cave-surprise-cave-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_visit-sung-sot-cave-surprise-cave-.jpg" + }, + { + "name": "Explore Cat Ba Island", + "description": "Venture beyond the bay to Cat Ba Island, the largest island in the Ha Long archipelago. Hike through the lush Cat Ba National Park, home to diverse flora and fauna, including the endangered Cat Ba langur. Visit the Hospital Cave, a historical landmark used during the Vietnam War, or relax on the pristine beaches of Cat Co.", + "locationName": "Cat Ba Island", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "ha-long-bay", + "ref": "explore-cat-ba-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_explore-cat-ba-island.jpg" + }, + { + "name": "Indulge in Local Seafood", + "description": "Savor the freshest seafood at one of the many floating restaurants in Ha Long Bay. Enjoy a variety of dishes, including grilled fish, prawns, and crabs, while taking in the stunning views of the surrounding islands. This is a must-do experience for any foodie visiting the region.", + "locationName": "Ha Long Bay floating restaurants", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "ha-long-bay", + "ref": "indulge-in-local-seafood", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_indulge-in-local-seafood.jpg" + }, + { + "name": "Rock Climbing and Deep Water Soloing", + "description": "Experience the thrill of scaling Ha Long Bay's limestone cliffs with rock climbing and deep water soloing adventures. Professional guides will lead you on exhilarating climbs, allowing you to conquer challenging routes and enjoy breathtaking views of the bay. For the ultimate adrenaline rush, try deep water soloing, where you climb without ropes over the water, taking a refreshing plunge upon reaching the top.", + "locationName": "Cat Ba Island and Lan Ha Bay", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "ha-long-bay", + "ref": "rock-climbing-and-deep-water-soloing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_rock-climbing-and-deep-water-soloing.jpg" + }, + { + "name": "Floating Village Visit and Cultural Immersion", + "description": "Immerse yourself in the local culture by visiting a floating village in Ha Long Bay. Interact with the friendly residents, learn about their traditional way of life, and witness their unique fishing techniques. You can even try your hand at net fishing or pearl farming. Enjoy a home-cooked meal in a local family's home, savoring authentic Vietnamese flavors and hospitality.", + "locationName": "Cua Van Floating Village or Vung Vieng Fishing Village", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "ha-long-bay", + "ref": "floating-village-visit-and-cultural-immersion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_floating-village-visit-and-cultural-immersion.jpg" + }, + { + "name": "Sunset Cruise with Squid Fishing", + "description": "Embark on a romantic sunset cruise through the enchanting waters of Ha Long Bay. As the sky transforms into a canvas of vibrant colors, witness the magical beauty of the limestone islands bathed in golden light. Enjoy a delicious seafood dinner on board and try your hand at squid fishing under the starry night sky.", + "locationName": "Ha Long Bay", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "ha-long-bay", + "ref": "sunset-cruise-with-squid-fishing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_sunset-cruise-with-squid-fishing.jpg" + }, + { + "name": "Hiking and Exploring Cat Ba National Park", + "description": "Embark on a hiking adventure through the lush rainforests of Cat Ba National Park. Discover hidden trails, encounter diverse wildlife, and reach panoramic viewpoints offering breathtaking vistas of the bay and surrounding islands. Keep an eye out for the elusive Cat Ba langur, one of the world's most endangered primates.", + "locationName": "Cat Ba National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "ha-long-bay", + "ref": "hiking-and-exploring-cat-ba-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_hiking-and-exploring-cat-ba-national-park.jpg" + }, + { + "name": "Seaplane or Helicopter Tour", + "description": "Take to the skies for an unforgettable aerial perspective of Ha Long Bay. A seaplane or helicopter tour will provide you with stunning panoramic views of the limestone islands, hidden lagoons, and emerald waters. Capture breathtaking photos and create lasting memories of this unique and awe-inspiring landscape.", + "locationName": "Ha Long Bay", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "ha-long-bay", + "ref": "seaplane-or-helicopter-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_seaplane-or-helicopter-tour.jpg" + }, + { + "name": "Tai Chi on the Sundeck", + "description": "Start your day with a serene Tai Chi session on the sundeck of your cruise ship or at a beachfront resort. As the sun rises over the bay, breathe in the fresh air and move your body in harmony with the gentle flow of Tai Chi, setting the tone for a peaceful and mindful day.", + "locationName": "Cruise ship sundeck or beachfront resort", + "duration": 1, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "ha-long-bay", + "ref": "tai-chi-on-the-sundeck", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_tai-chi-on-the-sundeck.jpg" + }, + { + "name": "Cooking Class with a Local Chef", + "description": "Immerse yourself in Vietnamese culinary culture by joining a cooking class. Learn to prepare authentic dishes like fresh spring rolls, fragrant pho, or savory seafood specialties under the guidance of a local chef. This hands-on experience will tantalize your taste buds and leave you with newfound culinary skills.", + "locationName": "Local cooking school or restaurant", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "ha-long-bay", + "ref": "cooking-class-with-a-local-chef", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_cooking-class-with-a-local-chef.jpg" + }, + { + "name": "Visit a Pearl Farm", + "description": "Discover the fascinating process of pearl cultivation with a visit to a local pearl farm. Learn about the different types of pearls, the meticulous techniques involved in their cultivation, and even witness the delicate art of pearl harvesting. You can also browse exquisite pearl jewelry and find the perfect souvenir to remember your trip.", + "locationName": "Pearl farm on a nearby island", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "ha-long-bay", + "ref": "visit-a-pearl-farm", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_visit-a-pearl-farm.jpg" + }, + { + "name": "Biking through Cat Ba Island's Countryside", + "description": "Rent a bicycle and embark on a scenic journey through the picturesque countryside of Cat Ba Island. Pedal along quiet roads, passing by rice paddies, traditional villages, and lush greenery. This leisurely activity allows you to experience the island's natural beauty and local life at your own pace.", + "locationName": "Cat Ba Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "ha-long-bay", + "ref": "biking-through-cat-ba-island-s-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_biking-through-cat-ba-island-s-countryside.jpg" + }, + { + "name": "Stargazing on the Bay", + "description": "Escape the city lights and experience the magic of stargazing on the bay. Find a secluded spot on the beach or your cruise ship deck, lie down, and gaze up at the breathtaking canopy of stars. With minimal light pollution, Ha Long Bay offers an incredible opportunity to appreciate the vastness and beauty of the night sky.", + "locationName": "Secluded beach or cruise ship deck", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "ha-long-bay", + "ref": "stargazing-on-the-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_stargazing-on-the-bay.jpg" + }, + { + "name": "Scuba Diving and Snorkeling Adventures", + "description": "Dive into the crystal-clear waters of Ha Long Bay and discover a vibrant underwater world teeming with marine life. Explore coral reefs, encounter colorful fish, and experience the thrill of discovering hidden caves beneath the surface. Whether you're a seasoned diver or a beginner snorkeler, there are options for all levels to enjoy this unforgettable experience.", + "locationName": "Various dive sites around Ha Long Bay", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "ha-long-bay", + "ref": "scuba-diving-and-snorkeling-adventures", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_scuba-diving-and-snorkeling-adventures.jpg" + }, + { + "name": "Visit Cua Van Floating Village", + "description": "Embark on a unique cultural experience by visiting Cua Van, a traditional floating village in Ha Long Bay. Interact with the local community, learn about their way of life, and witness their fishing traditions passed down through generations. You can even try your hand at rowing a traditional bamboo boat and gain insight into this fascinating way of life on the water.", + "locationName": "Cua Van Floating Village", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "ha-long-bay", + "ref": "visit-cua-van-floating-village", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_visit-cua-van-floating-village.jpg" + }, + { + "name": "Indulge in Vietnamese Cooking Classes", + "description": "Unleash your inner chef and learn the secrets of authentic Vietnamese cuisine. Join a cooking class led by a local expert and master the art of preparing traditional dishes like fresh spring rolls, fragrant pho, and flavorful stir-fries. Discover the unique blend of herbs, spices, and fresh ingredients that make Vietnamese food so delicious.", + "locationName": "Various cooking schools or restaurants in Ha Long Bay", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "ha-long-bay", + "ref": "indulge-in-vietnamese-cooking-classes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_indulge-in-vietnamese-cooking-classes.jpg" + }, + { + "name": "Relaxation and Wellness Retreats", + "description": "Escape the hustle and bustle of everyday life and embrace tranquility with a rejuvenating wellness retreat. Ha Long Bay offers a range of options, from luxurious spa resorts to serene yoga retreats on secluded islands. Pamper yourself with massages, meditation sessions, and holistic treatments while surrounded by the breathtaking natural beauty of the bay.", + "locationName": "Various spa resorts and retreat centers around Ha Long Bay", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "ha-long-bay", + "ref": "relaxation-and-wellness-retreats", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_relaxation-and-wellness-retreats.jpg" + }, + { + "name": "Explore the Enchanting Thien Cung Cave", + "description": "Venture into the depths of Thien Cung Cave (Heavenly Palace Cave) and be amazed by its stunning natural formations. Witness the intricate stalactites and stalagmites, illuminated by colorful lights, and learn about the legends and folklore surrounding this magical cave. It's a truly awe-inspiring experience that will leave you speechless.", + "locationName": "Thien Cung Cave", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "ha-long-bay", + "ref": "explore-the-enchanting-thien-cung-cave", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ha-long-bay_explore-the-enchanting-thien-cung-cave.jpg" + }, + { + "name": "Explore the Pennsylvania State Capitol Building", + "description": "Immerse yourselves in the grandeur of the Pennsylvania State Capitol Building, a masterpiece of Beaux-Arts architecture. Take a guided tour to marvel at the opulent interiors, intricate artwork, and the stunning rotunda. Learn about the state's rich history and the workings of the government.", + "locationName": "Pennsylvania State Capitol Building", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "harrisburg", + "ref": "explore-the-pennsylvania-state-capitol-building", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_explore-the-pennsylvania-state-capitol-building.jpg" + }, + { + "name": "Enjoy Family Fun at City Island", + "description": "Escape to City Island, a recreational haven located on the Susquehanna River. Take a leisurely stroll along the riverfront, rent bikes to explore the island's trails, or have a picnic lunch in the park. Catch a baseball game at FNB Field, home to the Harrisburg Senators, or ride the City Island Railroad for a scenic journey. There's something for everyone to enjoy.", + "locationName": "City Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "harrisburg", + "ref": "enjoy-family-fun-at-city-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_enjoy-family-fun-at-city-island.jpg" + }, + { + "name": "Stroll Through the Historic Midtown Neighborhood", + "description": "Wander through the charming streets of Midtown Harrisburg, known for its Victorian-era architecture and vibrant atmosphere. Explore independent shops, art galleries, and trendy restaurants. Visit the Broad Street Market, a historic marketplace offering a diverse selection of local produce, artisanal goods, and international cuisine.", + "locationName": "Midtown Harrisburg", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "harrisburg", + "ref": "stroll-through-the-historic-midtown-neighborhood", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_stroll-through-the-historic-midtown-neighborhood.jpg" + }, + { + "name": "Cruise Along the Susquehanna River", + "description": "Embark on a scenic boat tour along the Susquehanna River and admire the city skyline from a different perspective. Enjoy the fresh air and picturesque views as you learn about Harrisburg's history and landmarks. Opt for a dinner cruise for a romantic evening or a sightseeing cruise to capture stunning photos.", + "locationName": "Susquehanna River", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "harrisburg", + "ref": "cruise-along-the-susquehanna-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_cruise-along-the-susquehanna-river.jpg" + }, + { + "name": "Hiking or Biking on the Capital Area Greenbelt", + "description": "Embark on a scenic adventure along the 20-mile Capital Area Greenbelt, a paved trail perfect for hiking, biking, or rollerblading. Enjoy the fresh air and picturesque views of the Susquehanna River, Wildwood Park, and various historic landmarks.", + "locationName": "Capital Area Greenbelt", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "harrisburg", + "ref": "hiking-or-biking-on-the-capital-area-greenbelt", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_hiking-or-biking-on-the-capital-area-greenbelt.jpg" + }, + { + "name": "Indulge in Farm-Fresh Flavors at the Broad Street Market", + "description": "Immerse yourself in the vibrant atmosphere of the Broad Street Market, one of the oldest continuously operating farmers' markets in the country. Sample local produce, artisanal cheeses, baked goods, and international cuisine from a diverse array of vendors.", + "locationName": "Broad Street Market", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "harrisburg", + "ref": "indulge-in-farm-fresh-flavors-at-the-broad-street-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_indulge-in-farm-fresh-flavors-at-the-broad-street-market.jpg" + }, + { + "name": "Catch a Show at the Whitaker Center for Science and the Arts", + "description": "Experience the magic of live performances, captivating exhibits, and educational programs at the Whitaker Center. From Broadway shows to planetarium presentations, there's something to ignite curiosity and inspire creativity for all ages.", + "locationName": "Whitaker Center for Science and the Arts", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "harrisburg", + "ref": "catch-a-show-at-the-whitaker-center-for-science-and-the-arts", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_catch-a-show-at-the-whitaker-center-for-science-and-the-arts.jpg" + }, + { + "name": "Explore the Enchanting Hershey Gardens", + "description": "Take a short drive to Hershey and discover the beauty of Hershey Gardens. Wander through themed gardens, admire the vibrant blooms, and learn about the fascinating world of horticulture. Don't miss the Butterfly House for a magical encounter with fluttering friends.", + "locationName": "Hershey Gardens", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "harrisburg", + "ref": "explore-the-enchanting-hershey-gardens", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_explore-the-enchanting-hershey-gardens.jpg" + }, + { + "name": "Savor Craft Brews on the Harrisburg Beer Trail", + "description": "Embark on a self-guided tour of Harrisburg's thriving craft beer scene. Visit local breweries like Zeroday Brewing Co., Appalachian Brewing Company, and Troegs Independent Brewing, to sample unique flavors and discover your new favorite brew.", + "locationName": "Harrisburg Beer Trail", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "harrisburg", + "ref": "savor-craft-brews-on-the-harrisburg-beer-trail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_savor-craft-brews-on-the-harrisburg-beer-trail.jpg" + }, + { + "name": "Wildwood Park Nature Exploration", + "description": "Embark on a journey through diverse ecosystems at Wildwood Park. Hike or bike along scenic trails, observe native wildlife in their natural habitat, and learn about the park's conservation efforts. This immersive experience is perfect for nature enthusiasts and families seeking outdoor adventure.", + "locationName": "Wildwood Park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "harrisburg", + "ref": "wildwood-park-nature-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_wildwood-park-nature-exploration.jpg" + }, + { + "name": "Antique Treasure Hunt in Midtown", + "description": "Discover hidden gems and unique finds in Harrisburg's Midtown district. Explore antique shops and vintage stores, where you can browse through a diverse collection of furniture, jewelry, clothing, and more. Uncover a piece of history and add a touch of character to your home.", + "locationName": "Midtown Harrisburg", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "harrisburg", + "ref": "antique-treasure-hunt-in-midtown", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_antique-treasure-hunt-in-midtown.jpg" + }, + { + "name": "Pennsylvania National Fire Museum", + "description": "Dive into the history of firefighting at the Pennsylvania National Fire Museum. Explore exhibits showcasing antique fire engines, equipment, and memorabilia. Learn about the brave men and women who have dedicated their lives to protecting our communities from fire.", + "locationName": "Pennsylvania National Fire Museum", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "harrisburg", + "ref": "pennsylvania-national-fire-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_pennsylvania-national-fire-museum.jpg" + }, + { + "name": "Sunset Riverboat Cruise", + "description": "Experience the beauty of Harrisburg from a different perspective with a relaxing sunset riverboat cruise on the Susquehanna River. Enjoy breathtaking views of the city skyline, the rolling hills, and the picturesque waterfront as you savor a delicious meal and live entertainment.", + "locationName": "Susquehanna River", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "harrisburg", + "ref": "sunset-riverboat-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_sunset-riverboat-cruise.jpg" + }, + { + "name": "Fort Hunter Mansion and Park", + "description": "Step back in time at Fort Hunter Mansion and Park, a historic landmark dating back to the 18th century. Explore the beautifully preserved mansion, stroll through the scenic park grounds, and learn about the region's rich history and culture.", + "locationName": "Fort Hunter Mansion and Park", + "duration": 2.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "harrisburg", + "ref": "fort-hunter-mansion-and-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_fort-hunter-mansion-and-park.jpg" + }, + { + "name": "Thrills at Hersheypark", + "description": "Embark on a day of excitement at Hersheypark, a renowned amusement park just a short drive from Harrisburg. Experience thrilling roller coasters, family-friendly rides, water attractions, and delectable chocolate treats. From the iconic wooden coaster, Comet, to the exhilarating Skyrush, there's something for every thrill-seeker. Don't miss the chance to explore ZooAmerica, a walk-through zoo within the park, and indulge in the sweetness of Hershey's Chocolate World.", + "locationName": "Hersheypark", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "harrisburg", + "ref": "thrills-at-hersheypark", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_thrills-at-hersheypark.jpg" + }, + { + "name": "Wine Tasting in the Susquehanna Heartland Wine Trail", + "description": "Embark on a delightful journey through the Susquehanna Heartland Wine Trail, where you can savor the flavors of local wineries. Explore charming vineyards, indulge in wine tastings, and learn about the region's viticulture. From crisp whites to bold reds, discover the perfect vintage to please your palate. Many wineries offer scenic vineyard views and cozy tasting rooms, making it an ideal experience for couples or groups of friends.", + "locationName": "Susquehanna Heartland Wine Trail", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "harrisburg", + "ref": "wine-tasting-in-the-susquehanna-heartland-wine-trail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_wine-tasting-in-the-susquehanna-heartland-wine-trail.jpg" + }, + { + "name": "Antique Shopping in Downtown Harrisburg", + "description": "Discover hidden treasures and unique finds while antique shopping in downtown Harrisburg. Explore charming antique shops and boutiques filled with vintage furniture, collectibles, jewelry, and more. Stroll through the historic streets and uncover one-of-a-kind pieces to add character to your home or wardrobe. Midtown Harrisburg is known for its antique stores, offering a diverse selection for every taste and budget.", + "locationName": "Downtown Harrisburg", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "harrisburg", + "ref": "antique-shopping-in-downtown-harrisburg", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_antique-shopping-in-downtown-harrisburg.jpg" + }, + { + "name": "Kayaking on the Susquehanna River", + "description": "Experience the beauty of the Susquehanna River up close with a kayaking adventure. Rent a kayak and paddle along the scenic waterways, enjoying the peaceful surroundings and observing local wildlife. Several rental companies offer guided tours and equipment rentals, catering to both beginners and experienced kayakers. Admire the city skyline from a different perspective and reconnect with nature on this memorable outdoor activity.", + "locationName": "Susquehanna River", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "harrisburg", + "ref": "kayaking-on-the-susquehanna-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_kayaking-on-the-susquehanna-river.jpg" + }, + { + "name": "Catch a Baseball Game at FNB Field", + "description": "Immerse yourself in the excitement of America's favorite pastime at FNB Field, home to the Harrisburg Senators, a Minor League Baseball team. Cheer on the home team, enjoy classic ballpark snacks, and experience the lively atmosphere of a baseball game. FNB Field offers a family-friendly environment with affordable ticket prices, making it a great option for a fun-filled evening out.", + "locationName": "FNB Field", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "harrisburg", + "ref": "catch-a-baseball-game-at-fnb-field", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/harrisburg_catch-a-baseball-game-at-fnb-field.jpg" + }, + { + "name": "Stroll Down the Malecón", + "description": "Take a leisurely walk along the iconic Malecón, Havana's famous seaside promenade. Enjoy stunning views of the ocean, admire the colorful vintage cars passing by, and soak up the vibrant atmosphere as locals chat, fish, and enjoy the sea breeze. This is a perfect activity for any time of day and a great way to experience the heart and soul of Havana.", + "locationName": "Malecón", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "havana", + "ref": "stroll-down-the-malec-n", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_stroll-down-the-malec-n.jpg" + }, + { + "name": "Explore Old Havana", + "description": "Step back in time and wander through the cobblestone streets of Old Havana, a UNESCO World Heritage Site. Marvel at the colonial architecture, visit historic plazas like Plaza Vieja and Plaza de la Catedral, and discover hidden gems around every corner. Be sure to visit the Catedral de San Cristóbal, a stunning example of Baroque architecture.", + "locationName": "Old Havana", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "havana", + "ref": "explore-old-havana", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_explore-old-havana.jpg" + }, + { + "name": "Immerse Yourself in Cuban Culture", + "description": "Experience the vibrant Cuban culture by visiting the Gran Teatro de La Habana, a stunning neo-baroque theater, or the Museo Nacional de Bellas Artes, showcasing Cuban art. In the evening, enjoy a live music performance at a local bar or catch a captivating dance show featuring traditional Cuban rhythms.", + "locationName": "Various locations", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "havana", + "ref": "immerse-yourself-in-cuban-culture", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_immerse-yourself-in-cuban-culture.jpg" + }, + { + "name": "Visit the Museum of the Revolution", + "description": "Delve into Cuba's rich history at the Museum of the Revolution, housed in the former Presidential Palace. Explore exhibits showcasing the country's struggle for independence, the revolution led by Fidel Castro, and the impact of communism on Cuban society. This is a must-visit for history buffs and those interested in understanding Cuba's complex past.", + "locationName": "Museum of the Revolution", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 2, + "destinationRef": "havana", + "ref": "visit-the-museum-of-the-revolution", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_visit-the-museum-of-the-revolution.jpg" + }, + { + "name": "Take a Classic Car Tour", + "description": "Cruise through the streets of Havana in style with a classic car tour. Feel the wind in your hair as you ride in a vintage American convertible, taking in the sights and sounds of the city. Many tours offer customizable itineraries, allowing you to visit specific landmarks or explore different neighborhoods. This is a fun and unique way to experience Havana's charm.", + "locationName": "Various locations", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "havana", + "ref": "take-a-classic-car-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_take-a-classic-car-tour.jpg" + }, + { + "name": "Dance the Night Away at a Salsa Club", + "description": "Experience the infectious rhythm of Cuban salsa at a local club. Whether you're a seasoned dancer or a beginner, you'll be swept up in the energy and passion of the music and the locals. Take a salsa lesson beforehand to learn some basic steps, or just jump in and let loose on the dance floor. It's a night of pure fun and cultural immersion.", + "locationName": "Casa de la Musica or 1830 Club", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "havana", + "ref": "dance-the-night-away-at-a-salsa-club", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_dance-the-night-away-at-a-salsa-club.jpg" + }, + { + "name": "Relax on the Beaches of Playas del Este", + "description": "Escape the city bustle and unwind on the pristine sands of Playas del Este, a string of beaches just a short drive from Havana. Soak up the sun, swim in the turquoise waters, or simply relax under the shade of a palm tree. Several beach bars and restaurants offer refreshments and local seafood, making it a perfect day trip for relaxation and rejuvenation.", + "locationName": "Playas del Este", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "havana", + "ref": "relax-on-the-beaches-of-playas-del-este", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_relax-on-the-beaches-of-playas-del-este.jpg" + }, + { + "name": "Explore the Lush Botanical Gardens", + "description": "Escape the city heat and immerse yourself in the tranquility of Havana's Botanical Gardens. Wander through diverse collections of tropical plants, orchids, and cacti. The Japanese Garden offers a serene atmosphere with its koi ponds and traditional architecture. It's a perfect place for nature lovers and those seeking a peaceful retreat.", + "locationName": "Jardin Botanico Nacional de Cuba", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "havana", + "ref": "explore-the-lush-botanical-gardens", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_explore-the-lush-botanical-gardens.jpg" + }, + { + "name": "Visit the Fortaleza de San Carlos de la Cabaña", + "description": "Step back in time at this 18th-century fortress, offering stunning views of Havana and the harbor. Explore the ramparts, tunnels, and museums within the fort, which showcase Cuba's military history. Don't miss the nightly cannon firing ceremony, a tradition dating back centuries.", + "locationName": "Fortaleza de San Carlos de la Cabaña", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "havana", + "ref": "visit-the-fortaleza-de-san-carlos-de-la-caba-a", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_visit-the-fortaleza-de-san-carlos-de-la-caba-a.jpg" + }, + { + "name": "Enjoy a Day Trip to Viñales Valley", + "description": "Embark on a scenic journey to Viñales Valley, a UNESCO World Heritage Site renowned for its dramatic limestone mountains, tobacco plantations, and traditional farming communities. Hike or horseback ride through the valley, visit a tobacco farm to learn about cigar making, and enjoy a farm-to-table lunch amidst the breathtaking scenery. It's a perfect escape into Cuba's rural beauty.", + "locationName": "Viñales Valley", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "havana", + "ref": "enjoy-a-day-trip-to-vi-ales-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_enjoy-a-day-trip-to-vi-ales-valley.jpg" + }, + { + "name": "Discover Hemingway's Haunts", + "description": "Embark on a literary pilgrimage to Ernest Hemingway's beloved Cuba. Visit Finca Vigía, his former home turned museum, and explore the rooms where he wrote some of his most famous works. Sip a daiquiri at El Floridita, his favorite bar, and try your luck at fishing in the waters he once sailed.", + "locationName": "Finca Vigía and El Floridita", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "havana", + "ref": "discover-hemingway-s-haunts", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_discover-hemingway-s-haunts.jpg" + }, + { + "name": "Take a Cooking Class", + "description": "Delve into the heart of Cuban cuisine by joining a cooking class. Learn to prepare traditional dishes like ropa vieja, picadillo, and tostones, under the guidance of local chefs. Savor the fruits of your labor and gain a deeper appreciation for Cuban flavors.", + "locationName": "Various cooking schools and paladares", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "havana", + "ref": "take-a-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_take-a-cooking-class.jpg" + }, + { + "name": "Catch a Baseball Game", + "description": "Experience the passion of Cuban baseball at Estadio Latinoamericano. Cheer alongside enthusiastic fans as you witness the skill and athleticism of local teams. Immerse yourself in the vibrant atmosphere and understand why baseball is more than just a sport in Cuba.", + "locationName": "Estadio Latinoamericano", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "havana", + "ref": "catch-a-baseball-game", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_catch-a-baseball-game.jpg" + }, + { + "name": "Explore the Fábrica de Arte Cubano (FAC)", + "description": "Immerse yourself in Havana's contemporary art scene at the Fábrica de Arte Cubano (FAC). This unique art space housed in a former cooking oil factory showcases a diverse range of exhibitions, live music performances, film screenings, and more. Enjoy a drink at the bar and soak up the creative energy.", + "locationName": "Fábrica de Arte Cubano (FAC)", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "havana", + "ref": "explore-the-f-brica-de-arte-cubano-fac-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_explore-the-f-brica-de-arte-cubano-fac-.jpg" + }, + { + "name": "Ride in a Coco Taxi", + "description": "Zip around the city in a unique coco taxi, a three-wheeled scooter with a yellow, coconut-shaped shell. Enjoy the open air and get a different perspective of Havana's streets and sights. It's a fun and memorable way to experience local transportation.", + "locationName": "Throughout Havana", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "havana", + "ref": "ride-in-a-coco-taxi", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_ride-in-a-coco-taxi.jpg" + }, + { + "name": "Dive into the Underwater World of the Bay of Pigs", + "description": "Embark on an unforgettable scuba diving or snorkeling adventure in the Bay of Pigs, renowned for its pristine coral reefs and diverse marine life. Explore underwater caves, swim alongside colorful fish, and discover the hidden treasures of Cuba's Caribbean coast.", + "locationName": "Bay of Pigs", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "havana", + "ref": "dive-into-the-underwater-world-of-the-bay-of-pigs", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_dive-into-the-underwater-world-of-the-bay-of-pigs.jpg" + }, + { + "name": "Hike to the Top of El Yunque", + "description": "Challenge yourself with a hike to the summit of El Yunque, Cuba's highest peak, located in the Sierra Maestra mountains. Enjoy breathtaking panoramic views of the surrounding landscapes, lush rainforests, and the distant coastline. This adventure is perfect for nature enthusiasts and those seeking stunning vistas.", + "locationName": "El Yunque", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "havana", + "ref": "hike-to-the-top-of-el-yunque", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_hike-to-the-top-of-el-yunque.jpg" + }, + { + "name": "Ride Horseback Through Viñales Valley", + "description": "Saddle up for a scenic horseback riding tour through the picturesque Viñales Valley. Admire the stunning mogotes (limestone hills), tobacco fields, and traditional farmhouses. This leisurely activity allows you to connect with nature and experience the authentic Cuban countryside.", + "locationName": "Viñales Valley", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "havana", + "ref": "ride-horseback-through-vi-ales-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_ride-horseback-through-vi-ales-valley.jpg" + }, + { + "name": "Sail Away on a Catamaran Cruise", + "description": "Set sail on a relaxing catamaran cruise along the crystal-clear waters of the Caribbean Sea. Soak up the sun, enjoy refreshing sea breezes, and snorkel or swim in secluded coves. Many cruises offer delicious meals, open bars, and lively music, creating an unforgettable experience.", + "locationName": "Havana Harbor", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "havana", + "ref": "sail-away-on-a-catamaran-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_sail-away-on-a-catamaran-cruise.jpg" + }, + { + "name": "Experience Cuban Art and Music at the Callejón de Hamel", + "description": "Immerse yourself in the vibrant art and music scene of Havana at the Callejón de Hamel. This narrow alleyway is adorned with colorful murals, sculptures, and mosaics, showcasing the creativity of local artists. Enjoy live rumba performances and soak up the lively atmosphere of this unique cultural hub.", + "locationName": "Callejón de Hamel", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "havana", + "ref": "experience-cuban-art-and-music-at-the-callej-n-de-hamel", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/havana_experience-cuban-art-and-music-at-the-callej-n-de-hamel.jpg" + }, + { + "name": "Cu Chi Tunnels Tour", + "description": "Embark on a historical journey to the Cu Chi Tunnels, a vast network of underground tunnels used by the Viet Cong during the Vietnam War. Crawl through the narrow passages, learn about the tunnels' construction and significance, and gain insight into the resilience and ingenuity of the Vietnamese people.", + "locationName": "Cu Chi Tunnels", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "ho-chi-minh-city", + "ref": "cu-chi-tunnels-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_cu-chi-tunnels-tour.jpg" + }, + { + "name": "Ben Thanh Market Shopping Spree", + "description": "Immerse yourself in the vibrant atmosphere of Ben Thanh Market, a bustling hub of commerce and culture. Browse through a labyrinth of stalls selling everything from souvenirs and handicrafts to clothing, spices, and fresh produce. Practice your bargaining skills and find unique treasures to take home.", + "locationName": "Ben Thanh Market", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "ho-chi-minh-city", + "ref": "ben-thanh-market-shopping-spree", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_ben-thanh-market-shopping-spree.jpg" + }, + { + "name": "Saigon Street Food Adventure", + "description": "Embark on a culinary adventure through the streets of Ho Chi Minh City, sampling a variety of delicious street food dishes. From savory banh mi sandwiches and fragrant pho noodle soup to sweet chè desserts and refreshing sugarcane juice, tantalize your taste buds with the authentic flavors of Vietnam.", + "locationName": "Various street food stalls", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "ho-chi-minh-city", + "ref": "saigon-street-food-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_saigon-street-food-adventure.jpg" + }, + { + "name": "Mekong Delta Day Trip", + "description": "Escape the bustling city and venture into the scenic Mekong Delta. Cruise along the waterways, visit floating markets, explore local villages, and witness the traditional way of life in this unique region.", + "locationName": "Mekong Delta", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "ho-chi-minh-city", + "ref": "mekong-delta-day-trip", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_mekong-delta-day-trip.jpg" + }, + { + "name": "Golden Dragon Water Puppet Show", + "description": "Experience the magic of Vietnamese water puppetry, a unique art form dating back centuries. Watch as skilled puppeteers bring colorful puppets to life on a water stage, accompanied by traditional music and captivating storytelling.", + "locationName": "Golden Dragon Water Puppet Theatre", + "duration": 1.5, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "ho-chi-minh-city", + "ref": "golden-dragon-water-puppet-show", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_golden-dragon-water-puppet-show.jpg" + }, + { + "name": "Notre Dame Cathedral Visit", + "description": "Step into a piece of French colonial history at the Notre Dame Cathedral. Admire the neo-Romanesque architecture, stained glass windows, and peaceful atmosphere. Capture stunning photos of this iconic landmark.", + "locationName": "Notre Dame Cathedral Basilica of Saigon", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "ho-chi-minh-city", + "ref": "notre-dame-cathedral-visit", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_notre-dame-cathedral-visit.jpg" + }, + { + "name": "Rooftop Bar Hopping", + "description": "Savor panoramic views of the glittering cityscape while sipping on cocktails at some of Ho Chi Minh City's trendy rooftop bars. Enjoy the vibrant nightlife and soak up the energetic atmosphere.", + "locationName": "Various rooftop bars throughout the city", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "ho-chi-minh-city", + "ref": "rooftop-bar-hopping", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_rooftop-bar-hopping.jpg" + }, + { + "name": "Bitexco Financial Tower Observation Deck", + "description": "Ascend to the Saigon Skydeck on the 49th floor of the Bitexco Financial Tower for breathtaking 360-degree views of the city. Spot iconic landmarks, observe the bustling streets below, and capture memorable photos.", + "locationName": "Bitexco Financial Tower", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "ho-chi-minh-city", + "ref": "bitexco-financial-tower-observation-deck", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_bitexco-financial-tower-observation-deck.jpg" + }, + { + "name": "Cooking Class and Local Market Tour", + "description": "Embark on a culinary adventure with a local market tour and cooking class. Learn about Vietnamese ingredients, practice traditional cooking techniques, and create delicious dishes to enjoy.", + "locationName": "Various cooking schools and markets", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "ho-chi-minh-city", + "ref": "cooking-class-and-local-market-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_cooking-class-and-local-market-tour.jpg" + }, + { + "name": "Explore the Jade Emperor Pagoda", + "description": "Step into a world of vibrant colors and intricate details at the Jade Emperor Pagoda. This Taoist temple, built in the early 20th century, is a captivating masterpiece of architecture and religious art. Admire the ornate carvings, statues of deities, and serene gardens, and immerse yourself in the spiritual atmosphere.", + "locationName": "Jade Emperor Pagoda (Phuoc Hai Tu)", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "ho-chi-minh-city", + "ref": "explore-the-jade-emperor-pagoda", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_explore-the-jade-emperor-pagoda.jpg" + }, + { + "name": "Cruise the Saigon River at Sunset", + "description": "Experience the magic of Ho Chi Minh City from a different perspective with a relaxing sunset cruise on the Saigon River. Watch the city lights twinkle as you glide along the water, enjoying the cool breeze and breathtaking views of the skyline. Some cruises offer dinner or live music for an extra special evening.", + "locationName": "Saigon River", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "ho-chi-minh-city", + "ref": "cruise-the-saigon-river-at-sunset", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_cruise-the-saigon-river-at-sunset.jpg" + }, + { + "name": "Catch a Show at the Saigon Opera House", + "description": "Indulge in a night of culture and elegance at the historic Saigon Opera House. This architectural gem hosts a variety of performances, from traditional Vietnamese opera and dance to international concerts and ballets. Dress up for a memorable evening and enjoy the opulent ambiance of this iconic venue.", + "locationName": "Saigon Opera House", + "duration": 2.5, + "timeOfDay": "night", + "familyFriendly": true, + "price": 4, + "destinationRef": "ho-chi-minh-city", + "ref": "catch-a-show-at-the-saigon-opera-house", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_catch-a-show-at-the-saigon-opera-house.jpg" + }, + { + "name": "Unwind at a Rooftop Cafe", + "description": "Escape the bustling streets and find tranquility at one of Ho Chi Minh City's many rooftop cafes. Sip on a refreshing drink or savor a delicious meal while enjoying panoramic views of the cityscape. These rooftop havens offer a perfect blend of relaxation and stunning scenery.", + "locationName": "Various locations throughout the city", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "ho-chi-minh-city", + "ref": "unwind-at-a-rooftop-cafe", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_unwind-at-a-rooftop-cafe.jpg" + }, + { + "name": "Discover History at the Reunification Palace", + "description": "Step back in time at the Reunification Palace, a historical landmark that witnessed the end of the Vietnam War. Explore the opulent rooms and halls, learn about the palace's role in the country's history, and gain insights into Vietnam's journey to reunification.", + "locationName": "Reunification Palace", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "ho-chi-minh-city", + "ref": "discover-history-at-the-reunification-palace", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_discover-history-at-the-reunification-palace.jpg" + }, + { + "name": "Tao Dan Park Morning Exercise", + "description": "Start your day like a local at Tao Dan Park, a green oasis in the heart of the city. Join the community in their morning routines, from tai chi and badminton to jogging and group exercises. Immerse yourself in the local culture and enjoy the fresh air before the city awakens.", + "locationName": "Tao Dan Park", + "duration": 1.5, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "ho-chi-minh-city", + "ref": "tao-dan-park-morning-exercise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_tao-dan-park-morning-exercise.jpg" + }, + { + "name": "Giac Lam Pagoda Visit", + "description": "Escape the urban bustle and find serenity at Giac Lam Pagoda, the oldest Buddhist temple in Ho Chi Minh City. Explore the intricate architecture, tranquil gardens, and ornate statues. Witness the devotion of local worshippers and experience the peaceful atmosphere of this spiritual haven.", + "locationName": "Giac Lam Pagoda", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "ho-chi-minh-city", + "ref": "giac-lam-pagoda-visit", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_giac-lam-pagoda-visit.jpg" + }, + { + "name": "Scooter Street Food Tour", + "description": "Embark on an exciting culinary adventure through the city on a scooter. Zip through the streets with a local guide, stopping at hidden gems and popular food stalls. Sample authentic Vietnamese dishes like banh mi, pho, and goi cuon, experiencing the true flavors of Ho Chi Minh City.", + "locationName": "Various locations throughout Ho Chi Minh City", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 3, + "destinationRef": "ho-chi-minh-city", + "ref": "scooter-street-food-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_scooter-street-food-tour.jpg" + }, + { + "name": "Traditional Ao Dai Rental and Photoshoot", + "description": "Embrace Vietnamese culture by renting a traditional Ao Dai, the elegant national garment. Choose from a variety of colors and styles, then capture stunning photos at iconic landmarks or hidden corners of the city. This experience offers a unique souvenir and lasting memories.", + "locationName": "Ao Dai rental shops and various photo locations", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "ho-chi-minh-city", + "ref": "traditional-ao-dai-rental-and-photoshoot", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_traditional-ao-dai-rental-and-photoshoot.jpg" + }, + { + "name": "Live Music at Yoko Cafe", + "description": "Immerse yourself in Ho Chi Minh City's vibrant nightlife scene at Yoko Cafe. Enjoy live music performances by local bands, ranging from traditional Vietnamese tunes to contemporary genres. Sip on cocktails or local beers while soaking up the energetic atmosphere and connecting with fellow music enthusiasts.", + "locationName": "Yoko Cafe", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "ho-chi-minh-city", + "ref": "live-music-at-yoko-cafe", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/ho-chi-minh-city_live-music-at-yoko-cafe.jpg" + }, + { + "name": "Glacier Hiking and Ice Climbing", + "description": "Embark on a thrilling adventure across Iceland's stunning glaciers. Experienced guides will lead you on a hike across the icy terrain, teaching you basic ice climbing techniques. Marvel at the breathtaking views of crevasses, ice caves, and frozen landscapes. This activity is perfect for adventurous souls seeking a unique and unforgettable experience.", + "locationName": "Skaftafell National Park or Sólheimajökull Glacier", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "iceland", + "ref": "glacier-hiking-and-ice-climbing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_glacier-hiking-and-ice-climbing.jpg" + }, + { + "name": "Soak in the Blue Lagoon", + "description": "Indulge in a relaxing and rejuvenating experience at the world-renowned Blue Lagoon. Immerse yourself in the geothermal waters, rich in minerals, and let the warmth soothe your muscles. Enjoy the unique milky-blue color of the water and the surrounding volcanic landscape. This is a perfect activity for any time of day and a must-do for visitors to Iceland.", + "locationName": "Blue Lagoon", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "iceland", + "ref": "soak-in-the-blue-lagoon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_soak-in-the-blue-lagoon.jpg" + }, + { + "name": "Whale Watching Tour", + "description": "Set sail on a boat tour from Reykjavik, Akureyri, or Húsavík and witness the majestic whales in their natural habitat. Iceland's waters are home to various whale species, including humpback whales, minke whales, and orcas. Learn about these fascinating creatures from expert guides and enjoy the scenic beauty of the Icelandic coastline.", + "locationName": "Reykjavik, Akureyri, or Húsavík", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "iceland", + "ref": "whale-watching-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_whale-watching-tour.jpg" + }, + { + "name": "Explore the Golden Circle", + "description": "Embark on a scenic journey through Iceland's famous Golden Circle. Visit Thingvellir National Park, a UNESCO World Heritage site, and see the dramatic rift valley where the North American and Eurasian tectonic plates meet. Marvel at the Gullfoss waterfall, a powerful two-tiered cascade, and witness the Strokkur geyser erupting hot water high into the air.", + "locationName": "Thingvellir National Park, Gullfoss Waterfall, Strokkur Geyser", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "iceland", + "ref": "explore-the-golden-circle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_explore-the-golden-circle.jpg" + }, + { + "name": "Hunt for the Northern Lights", + "description": "Experience the magic of the Aurora Borealis, one of nature's most spectacular displays. During the winter months, venture out into the darkness and witness the dancing lights illuminating the night sky. This unforgettable experience is a must-do for any visitor to Iceland during the winter season.", + "locationName": "Various locations away from city lights", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "iceland", + "ref": "hunt-for-the-northern-lights", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_hunt-for-the-northern-lights.jpg" + }, + { + "name": "Horseback Riding through Lava Fields", + "description": "Embark on a unique adventure exploring Iceland's rugged landscapes on horseback. Traverse ancient lava fields, volcanic craters, and scenic trails, experiencing the island's raw beauty from a different perspective. Connect with the friendly Icelandic horses, known for their strength and gentle temperament, as you ride through breathtaking scenery.", + "locationName": "Various locations throughout Iceland", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "iceland", + "ref": "horseback-riding-through-lava-fields", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_horseback-riding-through-lava-fields.jpg" + }, + { + "name": "Snorkeling in Silfra Fissure", + "description": "Dive into the crystal-clear waters of Silfra, a fissure between the North American and Eurasian tectonic plates. Snorkel through this underwater wonderland, marveling at the vibrant colors and incredible visibility. Experience the sensation of swimming between continents in one of the world's most unique diving and snorkeling locations.", + "locationName": "Thingvellir National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "iceland", + "ref": "snorkeling-in-silfra-fissure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_snorkeling-in-silfra-fissure.jpg" + }, + { + "name": "Caving Adventure in Vatnajökull Glacier", + "description": "Embark on a thrilling journey into the heart of Vatnajökull, Europe's largest glacier. Explore stunning ice caves adorned with mesmerizing blue ice formations, sculpted by the forces of nature. Witness the power and beauty of the glacial world as you venture deep into this icy wonderland.", + "locationName": "Vatnajökull National Park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "iceland", + "ref": "caving-adventure-in-vatnaj-kull-glacier", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_caving-adventure-in-vatnaj-kull-glacier.jpg" + }, + { + "name": "Puffin Watching Boat Tour", + "description": "Set sail on a delightful boat tour to observe Iceland's adorable puffins in their natural habitat. Witness these charming seabirds with their colorful beaks nesting on coastal cliffs. Capture incredible photos and learn about the fascinating lives of these beloved creatures.", + "locationName": "Various locations along the coast", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "iceland", + "ref": "puffin-watching-boat-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_puffin-watching-boat-tour.jpg" + }, + { + "name": "Reykjavík Food Tour", + "description": "Embark on a culinary journey through the vibrant city of Reykjavík, savoring the unique flavors of Icelandic cuisine. Sample traditional dishes like fresh seafood, lamb, and skyr, while exploring local restaurants and hidden gems. Discover the city's gastronomic scene and learn about Icelandic culinary traditions.", + "locationName": "Reykjavík", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "iceland", + "ref": "reykjav-k-food-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_reykjav-k-food-tour.jpg" + }, + { + "name": "Kayaking on Jokulsarlon Glacier Lagoon", + "description": "Embark on a serene kayaking adventure amidst the awe-inspiring Jokulsarlon Glacier Lagoon. Paddle through the tranquil waters, marveling at the floating icebergs, some as blue as sapphires, and witness the captivating beauty of this natural wonder.", + "locationName": "Jokulsarlon Glacier Lagoon", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "iceland", + "ref": "kayaking-on-jokulsarlon-glacier-lagoon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_kayaking-on-jokulsarlon-glacier-lagoon.jpg" + }, + { + "name": "Road Trip along the Ring Road", + "description": "Embark on an epic road trip adventure on Iceland's iconic Ring Road, Route 1. This scenic route circumnavigates the entire island, offering breathtaking landscapes, charming villages, and countless opportunities for exploration and discovery. From cascading waterfalls to dramatic coastlines, the Ring Road promises an unforgettable journey.", + "locationName": "Route 1 (Ring Road)", + "duration": 100, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "iceland", + "ref": "road-trip-along-the-ring-road", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_road-trip-along-the-ring-road.jpg" + }, + { + "name": "Visit the Westfjords", + "description": "Escape the crowds and venture into the remote and rugged beauty of the Westfjords. This region offers dramatic landscapes, towering cliffs, secluded beaches, and charming fishing villages. Hike to the Dynjandi waterfall, observe the diverse birdlife, and immerse yourself in the tranquility of this off-the-beaten-path destination.", + "locationName": "Westfjords", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "iceland", + "ref": "visit-the-westfjords", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_visit-the-westfjords.jpg" + }, + { + "name": "Relax in the Mývatn Nature Baths", + "description": "Indulge in a relaxing soak in the soothing geothermal waters of the Mývatn Nature Baths. Surrounded by volcanic landscapes, these milky-blue pools offer a tranquil escape. Unwind and rejuvenate as you soak in the mineral-rich waters and admire the stunning natural beauty of the area.", + "locationName": "Mývatn Nature Baths", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "iceland", + "ref": "relax-in-the-m-vatn-nature-baths", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_relax-in-the-m-vatn-nature-baths.jpg" + }, + { + "name": "Go Snowmobiling on a Glacier", + "description": "Experience the thrill of snowmobiling across the vast expanse of an Icelandic glacier. Feel the adrenaline rush as you zoom over the snow and ice, taking in the breathtaking panoramic views of the surrounding mountains and glaciers. This exhilarating adventure is perfect for thrill-seekers and winter sports enthusiasts.", + "locationName": "Various glaciers", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "iceland", + "ref": "go-snowmobiling-on-a-glacier", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_go-snowmobiling-on-a-glacier.jpg" + }, + { + "name": "Sea Kayaking Adventure", + "description": "Embark on a thrilling sea kayaking expedition along Iceland's rugged coastline. Paddle through crystal-clear waters, marvel at towering cliffs, and explore hidden coves and sea caves. Keep an eye out for playful seals and diverse birdlife as you experience the beauty of Iceland from a unique perspective.", + "locationName": "Various coastal locations", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "iceland", + "ref": "sea-kayaking-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_sea-kayaking-adventure.jpg" + }, + { + "name": "Helicopter Tour over Volcanoes", + "description": "Take to the skies for an unforgettable helicopter tour that showcases Iceland's dramatic volcanic landscapes. Soar over active volcanoes, witness geothermal wonders like bubbling mud pools and steaming fumaroles, and enjoy breathtaking aerial views of glaciers, lava fields, and rugged mountains.", + "locationName": "Various volcanic regions", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "iceland", + "ref": "helicopter-tour-over-volcanoes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_helicopter-tour-over-volcanoes.jpg" + }, + { + "name": "Black Sand Beach Horse Riding", + "description": "Experience the unique Icelandic landscape on horseback with a memorable ride along the black sand beaches of the south coast. Feel the wind in your hair as you trot alongside the powerful Atlantic waves, admiring the dramatic cliffs and rock formations. This is a perfect activity for nature lovers and adventure seekers.", + "locationName": "Vík í Mýrdal or other black sand beaches", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "iceland", + "ref": "black-sand-beach-horse-riding", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_black-sand-beach-horse-riding.jpg" + }, + { + "name": "Reykjavík Nightlife Experience", + "description": "Discover the vibrant nightlife scene of Reykjavík, known for its friendly atmosphere and diverse music offerings. Explore the city's bars and clubs, enjoy live music performances, and experience the unique Icelandic culture of late-night revelry.", + "locationName": "Reykjavík city center", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "iceland", + "ref": "reykjav-k-nightlife-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_reykjav-k-nightlife-experience.jpg" + }, + { + "name": "Local Farm Visit and Icelandic Food Tasting", + "description": "Immerse yourself in Icelandic culture with a visit to a local farm. Learn about traditional farming practices, interact with friendly farm animals, and enjoy a tasting of authentic Icelandic food products, such as fresh dairy, smoked lamb, and homemade bread.", + "locationName": "Various rural locations", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "iceland", + "ref": "local-farm-visit-and-icelandic-food-tasting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/iceland_local-farm-visit-and-icelandic-food-tasting.jpg" + }, + { + "name": "Hike the Kamikochi Valley", + "description": "Embark on a breathtaking journey through the Kamikochi Valley, a natural wonderland renowned for its pristine beauty. Stroll along well-maintained trails, surrounded by towering mountains, crystal-clear rivers, and lush forests. Witness the iconic Kappa Bridge, a picturesque symbol of the valley, and be captivated by the serenity of Taisho Pond, reflecting the majestic peaks.", + "locationName": "Kamikochi Valley", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "japan-alps", + "ref": "hike-the-kamikochi-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_hike-the-kamikochi-valley.jpg" + }, + { + "name": "Skiing in Hakuba", + "description": "Experience the thrill of skiing or snowboarding in Hakuba, a world-class winter sports destination. With its abundant snowfall and diverse terrain, Hakuba offers something for all skill levels. Carve down powdery slopes, enjoy stunning mountain vistas, and après-ski in charming villages.", + "locationName": "Hakuba Valley", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "japan-alps", + "ref": "skiing-in-hakuba", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_skiing-in-hakuba.jpg" + }, + { + "name": "Soak in an Onsen", + "description": "Indulge in the ultimate relaxation experience by immersing yourself in a traditional Japanese onsen. Surrounded by serene landscapes, these natural hot springs offer therapeutic benefits and a sense of tranquility. Let the warm mineral-rich waters soothe your body and mind, rejuvenating you after a day of adventure.", + "locationName": "Various locations throughout the Japanese Alps", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "japan-alps", + "ref": "soak-in-an-onsen", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_soak-in-an-onsen.jpg" + }, + { + "name": "Visit Matsumoto Castle", + "description": "Step back in time and explore Matsumoto Castle, a historic landmark known as the \"Crow Castle\" for its black exterior. Admire its unique architecture, including its impressive main keep and intricate network of walls and moats. Delve into the castle's rich history and enjoy panoramic views of the surrounding city.", + "locationName": "Matsumoto City", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "japan-alps", + "ref": "visit-matsumoto-castle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_visit-matsumoto-castle.jpg" + }, + { + "name": "Experience Local Culture", + "description": "Immerse yourself in the unique culture of the mountain communities. Visit traditional villages, such as Shirakawa-go and Gokayama, with their distinctive gassho-zukuri farmhouses. Sample local cuisine, including soba noodles and mountain vegetables, and participate in cultural events or workshops.", + "locationName": "Various locations throughout the Japanese Alps", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "japan-alps", + "ref": "experience-local-culture", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_experience-local-culture.jpg" + }, + { + "name": "Whitewater Rafting on the Yoshino River", + "description": "Experience the thrill of whitewater rafting on the Yoshino River, surrounded by the stunning scenery of the Japanese Alps. Navigate through rapids with experienced guides, enjoying the adrenaline rush and breathtaking views. This activity is perfect for adventure seekers and nature lovers.", + "locationName": "Yoshino River", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "japan-alps", + "ref": "whitewater-rafting-on-the-yoshino-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_whitewater-rafting-on-the-yoshino-river.jpg" + }, + { + "name": "Cycling the Shimanami Kaido", + "description": "Embark on a scenic cycling journey along the Shimanami Kaido, a 70-kilometer route connecting Japan's main island of Honshu to Shikoku. Enjoy breathtaking views of the Seto Inland Sea and the surrounding islands as you pedal across bridges and through charming coastal towns. This activity is suitable for all fitness levels and offers a unique way to explore the region.", + "locationName": "Shimanami Kaido", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "japan-alps", + "ref": "cycling-the-shimanami-kaido", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_cycling-the-shimanami-kaido.jpg" + }, + { + "name": "Stargazing in the Mountains", + "description": "Escape the city lights and immerse yourself in the beauty of the night sky in the Japanese Alps. With minimal light pollution, the mountains offer exceptional stargazing opportunities. Join a guided tour or find a secluded spot to marvel at the constellations and the Milky Way.", + "locationName": "Various locations in the Japanese Alps", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "japan-alps", + "ref": "stargazing-in-the-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_stargazing-in-the-mountains.jpg" + }, + { + "name": "Exploring the Nakasendo Trail", + "description": "Step back in time and walk along the historic Nakasendo Trail, an ancient route that once connected Kyoto and Edo (Tokyo). Hike through charming villages, past traditional houses, and through serene forests, experiencing the rich history and culture of the region.", + "locationName": "Nakasendo Trail", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "japan-alps", + "ref": "exploring-the-nakasendo-trail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_exploring-the-nakasendo-trail.jpg" + }, + { + "name": "Visiting Local Craft Breweries", + "description": "Discover the growing craft beer scene in the Japanese Alps. Visit local breweries, sample unique and flavorful beers, and learn about the brewing process. Many breweries offer tours and tastings, providing a fun and educational experience for beer enthusiasts.", + "locationName": "Various locations in the Japanese Alps", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 2, + "destinationRef": "japan-alps", + "ref": "visiting-local-craft-breweries", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_visiting-local-craft-breweries.jpg" + }, + { + "name": "Snowshoeing in the Winter Wonderland", + "description": "Strap on snowshoes and embark on a magical journey through the snow-covered forests and meadows of the Japanese Alps. Discover hidden trails, frozen waterfalls, and breathtaking panoramas, all while enjoying the peaceful serenity of the winter landscape. This activity is perfect for nature lovers and those seeking a unique winter experience.", + "locationName": "Various locations throughout the Japanese Alps", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "japan-alps", + "ref": "snowshoeing-in-the-winter-wonderland", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_snowshoeing-in-the-winter-wonderland.jpg" + }, + { + "name": "Indulge in a Traditional Tea Ceremony", + "description": "Immerse yourself in Japanese culture with an authentic tea ceremony experience. Learn about the intricate rituals and symbolism behind this ancient tradition while enjoying the delicate flavors of matcha tea and traditional sweets. This serene and enriching activity offers a glimpse into the heart of Japanese hospitality and aesthetics.", + "locationName": "Local tea houses or cultural centers", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "japan-alps", + "ref": "indulge-in-a-traditional-tea-ceremony", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_indulge-in-a-traditional-tea-ceremony.jpg" + }, + { + "name": "Go Birdwatching in Diverse Habitats", + "description": "The Japanese Alps offer a haven for birdwatchers with its diverse range of habitats, from alpine meadows to dense forests. Spot vibrant kingfishers, majestic eagles, and a variety of other bird species while enjoying the tranquility of nature. This activity is perfect for those seeking a peaceful and rewarding experience in the mountains.", + "locationName": "Kamikochi National Park, Norikura Kogen Highlands", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "japan-alps", + "ref": "go-birdwatching-in-diverse-habitats", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_go-birdwatching-in-diverse-habitats.jpg" + }, + { + "name": "Capture Stunning Landscapes on a Photography Tour", + "description": "Embark on a photography tour led by a local expert and capture the breathtaking beauty of the Japanese Alps. Learn about composition, lighting, and techniques while exploring iconic viewpoints, hidden waterfalls, and charming villages. This activity is ideal for photography enthusiasts of all levels who want to create lasting memories.", + "locationName": "Various locations with scenic viewpoints", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "japan-alps", + "ref": "capture-stunning-landscapes-on-a-photography-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_capture-stunning-landscapes-on-a-photography-tour.jpg" + }, + { + "name": "Savor Local Delights at a Mountain Restaurant", + "description": "Treat your taste buds to the unique flavors of the Japanese Alps at a charming mountain restaurant. Sample regional specialties such as soba noodles, mountain vegetables, and fresh river fish while enjoying panoramic views of the surrounding peaks. This culinary experience offers a delicious way to connect with the local culture and cuisine.", + "locationName": "Restaurants in mountain villages or ski resorts", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "japan-alps", + "ref": "savor-local-delights-at-a-mountain-restaurant", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_savor-local-delights-at-a-mountain-restaurant.jpg" + }, + { + "name": "Climbing Mount Fuji", + "description": "Embark on an unforgettable journey to the summit of Mount Fuji, Japan's iconic and highest peak. Witness breathtaking panoramic views as you ascend through various trails, each offering unique challenges and rewards. Reach the top and be greeted by a spectacular sunrise or sunset, an experience that will stay with you forever.", + "locationName": "Mount Fuji", + "duration": 12, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "japan-alps", + "ref": "climbing-mount-fuji", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_climbing-mount-fuji.jpg" + }, + { + "name": "Kayaking on Lake Aoki", + "description": "Experience the tranquility of Lake Aoki, nestled amidst the stunning landscapes of the Japanese Alps. Rent a kayak and paddle through the crystal-clear waters, surrounded by lush forests and towering mountains. Enjoy a peaceful escape in nature and capture the beauty of the lake from a unique perspective.", + "locationName": "Lake Aoki", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "japan-alps", + "ref": "kayaking-on-lake-aoki", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_kayaking-on-lake-aoki.jpg" + }, + { + "name": "Exploring the Jigokudani Monkey Park", + "description": "Discover the fascinating world of Japanese macaques, also known as snow monkeys, at the Jigokudani Monkey Park. Observe these intelligent primates in their natural habitat as they bathe in the onsen hot springs and interact with each other. Capture adorable photos and learn about their unique behaviors and adaptations to the mountain environment.", + "locationName": "Jigokudani Monkey Park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "japan-alps", + "ref": "exploring-the-jigokudani-monkey-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_exploring-the-jigokudani-monkey-park.jpg" + }, + { + "name": "Paragliding over the Mountains", + "description": "Soar through the skies and experience the thrill of paragliding over the majestic Japanese Alps. Enjoy breathtaking aerial views of the mountains, valleys, and forests below. Feel the rush of adrenaline as you glide through the air, accompanied by experienced instructors who ensure your safety and provide guidance throughout the flight.", + "locationName": "Various locations throughout the Japanese Alps", + "duration": 1, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "japan-alps", + "ref": "paragliding-over-the-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_paragliding-over-the-mountains.jpg" + }, + { + "name": "Visiting Shirakawa-go", + "description": "Step back in time and explore the charming village of Shirakawa-go, a UNESCO World Heritage Site known for its traditional gassho-zukuri houses with their distinctive steep thatched roofs. Wander through the village's narrow streets, learn about its unique history and culture, and admire the picturesque landscapes that surround it.", + "locationName": "Shirakawa-go", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "japan-alps", + "ref": "visiting-shirakawa-go", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/japan-alps_visiting-shirakawa-go.jpg" + }, + { + "name": "Hike Mount Hallasan", + "description": "Embark on an unforgettable journey to the summit of Mount Hallasan, the highest peak in South Korea. Witness breathtaking panoramic views of the island, volcanic craters, and lush forests as you ascend through diverse trails. This challenging hike offers a rewarding experience for adventure seekers and nature enthusiasts.", + "locationName": "Hallasan National Park", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "jeju-island", + "ref": "hike-mount-hallasan", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_hike-mount-hallasan.jpg" + }, + { + "name": "Explore the Manjanggul Lava Tube", + "description": "Delve into the mysterious depths of the Manjanggul Lava Tube, one of the longest lava tubes in the world. Marvel at the unique geological formations, including lava stalactites and stalagmites, and learn about the volcanic history of Jeju Island. This subterranean adventure offers a fascinating glimpse into the island's hidden wonders.", + "locationName": "Manjanggul Lava Tube", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "jeju-island", + "ref": "explore-the-manjanggul-lava-tube", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_explore-the-manjanggul-lava-tube.jpg" + }, + { + "name": "Relax on Hyeopjae Beach", + "description": "Escape to the pristine shores of Hyeopjae Beach, renowned for its white sand, crystal-clear turquoise waters, and stunning coastal views. Bask in the sun, swim in the refreshing ocean, or simply stroll along the beach and enjoy the tranquil atmosphere. This idyllic beach destination is perfect for relaxation and rejuvenation.", + "locationName": "Hyeopjae Beach", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "jeju-island", + "ref": "relax-on-hyeopjae-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_relax-on-hyeopjae-beach.jpg" + }, + { + "name": "Visit the Jeju Folk Village Museum", + "description": "Step back in time at the Jeju Folk Village Museum, a living history museum showcasing traditional Korean life. Explore authentic thatched-roof houses, observe skilled artisans practicing traditional crafts, and learn about the unique culture and customs of Jeju Island. This immersive experience offers a fascinating glimpse into the island's rich heritage.", + "locationName": "Jeju Folk Village Museum", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "jeju-island", + "ref": "visit-the-jeju-folk-village-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_visit-the-jeju-folk-village-museum.jpg" + }, + { + "name": "Indulge in Local Cuisine", + "description": "Embark on a culinary journey through Jeju Island's diverse gastronomic scene. Sample fresh seafood delicacies, savor traditional Korean dishes with a local twist, and discover unique island specialties. From cozy family-run restaurants to upscale dining establishments, Jeju Island offers a delightful array of flavors to tantalize your taste buds.", + "locationName": "Various restaurants and markets", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "jeju-island", + "ref": "indulge-in-local-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_indulge-in-local-cuisine.jpg" + }, + { + "name": "Horseback Riding on Jeju's Coast", + "description": "Embark on a scenic horseback riding adventure along the picturesque coastline of Jeju Island. Several ranches offer guided tours suitable for all skill levels, allowing you to trot through verdant fields, sandy beaches, and volcanic landscapes while enjoying the fresh ocean breeze and breathtaking views.", + "locationName": "Various ranches along the coast", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "jeju-island", + "ref": "horseback-riding-on-jeju-s-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_horseback-riding-on-jeju-s-coast.jpg" + }, + { + "name": "Delve into the O'sulloc Tea Museum and Green Tea Fields", + "description": "Immerse yourself in the world of Korean tea culture at the O'sulloc Tea Museum. Learn about the history and process of tea production, explore the lush green tea fields, and indulge in a delightful tea tasting experience. Don't miss the opportunity to savor unique tea-infused treats and shop for exquisite tea products.", + "locationName": "O'sulloc Tea Museum", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "jeju-island", + "ref": "delve-into-the-o-sulloc-tea-museum-and-green-tea-fields", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_delve-into-the-o-sulloc-tea-museum-and-green-tea-fields.jpg" + }, + { + "name": "Go on a Submarine Tour", + "description": "Embark on an unforgettable underwater adventure with a submarine tour. Descend into the depths of the ocean and witness the vibrant marine life of Jeju Island. Marvel at colorful fish, coral reefs, and other fascinating sea creatures as you explore the underwater realm.", + "locationName": "Seogwipo Submarine", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "jeju-island", + "ref": "go-on-a-submarine-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_go-on-a-submarine-tour.jpg" + }, + { + "name": "Chase Waterfalls: Jeongbang and Cheonjiyeon", + "description": "Discover the mesmerizing beauty of Jeju's waterfalls. Visit Jeongbang Waterfall, cascading directly into the ocean, and Cheonjiyeon Waterfall, surrounded by lush greenery and folklore. Hike the scenic trails, capture stunning photos, and enjoy the refreshing mist and tranquility of these natural wonders.", + "locationName": "Jeongbang and Cheonjiyeon Waterfalls", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "jeju-island", + "ref": "chase-waterfalls-jeongbang-and-cheonjiyeon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_chase-waterfalls-jeongbang-and-cheonjiyeon.jpg" + }, + { + "name": "Kayaking or Stand-Up Paddleboarding", + "description": "Explore the crystal-clear waters of Jeju Island at your own pace with kayaking or stand-up paddleboarding. Rent equipment and venture along the coastline, discovering hidden coves, secluded beaches, and breathtaking views. This activity is perfect for enjoying the serenity of the ocean and getting some exercise.", + "locationName": "Various beaches and coastal areas", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "jeju-island", + "ref": "kayaking-or-stand-up-paddleboarding", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_kayaking-or-stand-up-paddleboarding.jpg" + }, + { + "name": "Stargazing at Seongsan Ilchulbong Peak", + "description": "Escape the city lights and venture to Seongsan Ilchulbong Peak, also known as Sunrise Peak, for a breathtaking stargazing experience. This volcanic cone offers minimal light pollution, making it an ideal spot to marvel at the constellations and Milky Way. Pack a blanket, some snacks, and enjoy a peaceful night under the stars.", + "locationName": "Seongsan Ilchulbong Peak", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "jeju-island", + "ref": "stargazing-at-seongsan-ilchulbong-peak", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_stargazing-at-seongsan-ilchulbong-peak.jpg" + }, + { + "name": "Immerse Yourself in Art at Jeju Museum of Art", + "description": "Delve into the vibrant art scene of Jeju Island at the Jeju Museum of Art. Admire a diverse collection of contemporary and traditional works by Korean and international artists. The museum's architecture is also a sight to behold, blending seamlessly with the surrounding natural landscape.", + "locationName": "Jeju Museum of Art", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "jeju-island", + "ref": "immerse-yourself-in-art-at-jeju-museum-of-art", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_immerse-yourself-in-art-at-jeju-museum-of-art.jpg" + }, + { + "name": "Visit the Spirited Garden", + "description": "Embark on a tranquil journey through the Spirited Garden, a meticulously designed bonsai garden showcasing the harmony between nature and art. Stroll along winding paths, admire miniature landscapes, and find inner peace amidst the serene atmosphere. The garden also features a traditional Korean tea house where you can enjoy a cup of locally grown tea.", + "locationName": "Spirited Garden", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "jeju-island", + "ref": "visit-the-spirited-garden", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_visit-the-spirited-garden.jpg" + }, + { + "name": "Discover the Mysterious Yongmeori Coast", + "description": "Embark on a scenic coastal walk along the Yongmeori Coast, known for its unique rock formations and dramatic cliffs carved by volcanic activity. Explore hidden caves, witness the power of the waves crashing against the shore, and capture stunning photographs of this geological wonder.", + "locationName": "Yongmeori Coast", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "jeju-island", + "ref": "discover-the-mysterious-yongmeori-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_discover-the-mysterious-yongmeori-coast.jpg" + }, + { + "name": "Shop for Local Treasures at Jeju Dongmun Market", + "description": "Immerse yourself in the bustling atmosphere of Jeju Dongmun Market, a traditional Korean market overflowing with local goods and culinary delights. Browse through stalls selling fresh produce, seafood, handicrafts, souvenirs, and clothing. Don't forget to sample some of the island's famous street food!", + "locationName": "Jeju Dongmun Market", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "jeju-island", + "ref": "shop-for-local-treasures-at-jeju-dongmun-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_shop-for-local-treasures-at-jeju-dongmun-market.jpg" + }, + { + "name": "Island Hopping Adventure", + "description": "Embark on a boat tour to explore the cluster of smaller islands surrounding Jeju. Discover hidden coves, snorkel in crystal-clear waters, and soak up the sun on secluded beaches. Some tours even offer fishing opportunities or visits to unique island villages.", + "locationName": "Jeju's surrounding islands (e.g., Udo, Gapado, Biyangdo)", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "jeju-island", + "ref": "island-hopping-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_island-hopping-adventure.jpg" + }, + { + "name": "Cycling the Scenic Coastal Roads", + "description": "Rent a bicycle and embark on a leisurely ride along Jeju's picturesque coastal roads. Enjoy breathtaking ocean views, stop at charming cafes, and discover hidden beaches along the way. Several designated cycling paths offer safe and enjoyable routes for all skill levels.", + "locationName": "Jeju's coastal roads", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "jeju-island", + "ref": "cycling-the-scenic-coastal-roads", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_cycling-the-scenic-coastal-roads.jpg" + }, + { + "name": "Soak in the Healing Waters of a Traditional Spa", + "description": "Indulge in a rejuvenating experience at one of Jeju's traditional Korean spas, known as jjimjilbang. Relax in various saunas and hot tubs, enjoy a body scrub, and experience unique treatments like jade stone therapy. Many spas also offer swimming pools, fitness centers, and dining options.", + "locationName": "Various jjimjilbangs throughout Jeju", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "jeju-island", + "ref": "soak-in-the-healing-waters-of-a-traditional-spa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_soak-in-the-healing-waters-of-a-traditional-spa.jpg" + }, + { + "name": "Tee Off at a World-Class Golf Course", + "description": "Jeju boasts several world-renowned golf courses with stunning landscapes and challenging layouts. Whether you're a seasoned golfer or a beginner, enjoy a round of golf amidst volcanic scenery and ocean views.", + "locationName": "Various golf courses across Jeju", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "jeju-island", + "ref": "tee-off-at-a-world-class-golf-course", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_tee-off-at-a-world-class-golf-course.jpg" + }, + { + "name": "Discover the Wonders of Jeju's Underwater World", + "description": "Explore the vibrant marine life and unique underwater landscapes of Jeju through scuba diving or snorkeling. Numerous dive sites offer opportunities to encounter colorful fish, coral reefs, and even shipwrecks.", + "locationName": "Various dive sites around Jeju", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "jeju-island", + "ref": "discover-the-wonders-of-jeju-s-underwater-world", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jeju-island_discover-the-wonders-of-jeju-s-underwater-world.jpg" + }, + { + "name": "Explore Petra, the Rose City", + "description": "Step back in time and discover the ancient Nabataean city of Petra, carved into the rose-colored sandstone cliffs. Explore the iconic Treasury, Monastery, and Royal Tombs, and marvel at the architectural genius of this UNESCO World Heritage site.", + "locationName": "Petra", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "jordan", + "ref": "explore-petra-the-rose-city", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_explore-petra-the-rose-city.jpg" + }, + { + "name": "Camp Under the Stars in Wadi Rum", + "description": "Embark on a desert adventure in the vast Wadi Rum, known for its dramatic landscapes of sandstone mountains and red sand dunes. Spend a night camping under the starry sky, enjoy traditional Bedouin hospitality, and experience the magic of the desert.", + "locationName": "Wadi Rum", + "duration": 24, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "jordan", + "ref": "camp-under-the-stars-in-wadi-rum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_camp-under-the-stars-in-wadi-rum.jpg" + }, + { + "name": "Discover the Roman Ruins of Jerash", + "description": "Explore the well-preserved Roman city of Jerash, known as the \"Pompeii of the East.\" Walk through the colonnaded streets, admire the impressive Hadrian's Arch, and visit the Oval Plaza and the South Theatre. Jerash offers a fascinating glimpse into Roman history and architecture.", + "locationName": "Jerash", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "jordan", + "ref": "discover-the-roman-ruins-of-jerash", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_discover-the-roman-ruins-of-jerash.jpg" + }, + { + "name": "Snorkel or Scuba Dive in the Red Sea", + "description": "Discover the underwater world of the Red Sea at Aqaba. Go snorkeling or scuba diving to explore vibrant coral reefs, encounter colorful fish, and experience the beauty of marine life.", + "locationName": "Aqaba", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "jordan", + "ref": "snorkel-or-scuba-dive-in-the-red-sea", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_snorkel-or-scuba-dive-in-the-red-sea.jpg" + }, + { + "name": "Hike the Dana Biosphere Reserve", + "description": "Embark on a scenic hike through the Dana Biosphere Reserve, a stunning natural landscape with diverse ecosystems ranging from sandstone cliffs to lush valleys. Encounter rare wildlife, explore hidden canyons, and enjoy breathtaking views of the surrounding mountains.", + "locationName": "Dana Biosphere Reserve", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "jordan", + "ref": "hike-the-dana-biosphere-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_hike-the-dana-biosphere-reserve.jpg" + }, + { + "name": "Indulge in a Traditional Cooking Class", + "description": "Immerse yourself in Jordanian culture with a hands-on cooking class. Learn the secrets of preparing local dishes like mansaf (lamb cooked in yogurt sauce) and maqluba (upside-down rice and vegetable casserole) under the guidance of experienced chefs. Enjoy your delicious creations afterward.", + "locationName": "Amman or other major cities", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "jordan", + "ref": "indulge-in-a-traditional-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_indulge-in-a-traditional-cooking-class.jpg" + }, + { + "name": "Explore the Vibrant Souqs of Amman", + "description": "Get lost in the bustling atmosphere of Amman's traditional souqs. Wander through narrow alleyways filled with colorful stalls selling spices, textiles, handicrafts, and souvenirs. Practice your bargaining skills and discover unique treasures to take home.", + "locationName": "Amman", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "jordan", + "ref": "explore-the-vibrant-souqs-of-amman", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_explore-the-vibrant-souqs-of-amman.jpg" + }, + { + "name": "Relax in a Hammam", + "description": "Experience the ultimate relaxation with a traditional hammam experience. Enjoy a steam bath, body scrub, and massage, leaving you feeling refreshed and rejuvenated. This is a perfect way to unwind after a day of exploring Jordan's historical sites.", + "locationName": "Amman or other major cities", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 3, + "destinationRef": "jordan", + "ref": "relax-in-a-hammam", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_relax-in-a-hammam.jpg" + }, + { + "name": "Visit the Umm Qais Archaeological Site", + "description": "Step back in time at the Umm Qais archaeological site, boasting impressive Roman ruins with panoramic views of the Sea of Galilee and the Golan Heights. Explore the well-preserved theater, basilica, and other structures, and imagine life in this ancient city.", + "locationName": "Umm Qais", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "jordan", + "ref": "visit-the-umm-qais-archaeological-site", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_visit-the-umm-qais-archaeological-site.jpg" + }, + { + "name": "Horseback Riding in Wadi Rum", + "description": "Embark on a unique desert adventure by exploring the vast landscapes of Wadi Rum on horseback. Traverse the red sands, canyons, and rock formations, following ancient Bedouin trails and feeling a sense of connection with the nomadic culture. Whether you're a seasoned rider or a beginner, experienced guides will lead you through breathtaking scenery, offering an unforgettable perspective of Wadi Rum's beauty.", + "locationName": "Wadi Rum", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "jordan", + "ref": "horseback-riding-in-wadi-rum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_horseback-riding-in-wadi-rum.jpg" + }, + { + "name": "Birdwatching at Azraq Wetland Reserve", + "description": "Escape the desert landscapes and discover a haven for birdlife at the Azraq Wetland Reserve. This oasis, fed by a natural spring, attracts a diverse array of migratory and resident birds. Embark on a guided birdwatching tour to spot species like herons, eagles, and songbirds, while learning about the reserve's conservation efforts and unique ecosystem.", + "locationName": "Azraq Wetland Reserve", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "jordan", + "ref": "birdwatching-at-azraq-wetland-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_birdwatching-at-azraq-wetland-reserve.jpg" + }, + { + "name": "Hike to the Monastery at Petra by Night", + "description": "Experience the magic of Petra under the starry sky with a night hike to the Monastery. As the path is illuminated by hundreds of candles, follow the ancient trail and marvel at the architectural wonder of the Monastery bathed in soft light. The serene atmosphere and the unique perspective create an unforgettable and romantic experience.", + "locationName": "Petra", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "jordan", + "ref": "hike-to-the-monastery-at-petra-by-night", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_hike-to-the-monastery-at-petra-by-night.jpg" + }, + { + "name": "Enjoy a Traditional Jordanian Meal with a Local Family", + "description": "Immerse yourself in Jordanian culture and hospitality by sharing a traditional meal with a local family. Experience the warmth of Jordanian homes, learn about their customs and traditions, and savor authentic home-cooked dishes like mansaf, maqluba, and knafeh. This cultural exchange offers a unique opportunity to connect with locals and create lasting memories.", + "locationName": "Various locations (Amman, Madaba, etc.)", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "jordan", + "ref": "enjoy-a-traditional-jordanian-meal-with-a-local-family", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_enjoy-a-traditional-jordanian-meal-with-a-local-family.jpg" + }, + { + "name": "Shop for Handicrafts at the Jordan River Foundation Showroom", + "description": "Discover the beauty of Jordanian craftsmanship at the Jordan River Foundation Showroom. This non-profit organization supports local artisans, particularly women, by showcasing their traditional handicrafts. Browse through a collection of hand-woven rugs, pottery, embroidery, and other unique items, knowing that your purchase empowers local communities and preserves cultural heritage.", + "locationName": "Amman", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "jordan", + "ref": "shop-for-handicrafts-at-the-jordan-river-foundation-showroom", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_shop-for-handicrafts-at-the-jordan-river-foundation-showroom.jpg" + }, + { + "name": "Hot Air Balloon Ride Over Wadi Rum", + "description": "Experience the breathtaking beauty of Wadi Rum from a whole new perspective with a hot air balloon ride. Soar above the towering sandstone cliffs, vast desert landscapes, and witness a stunning sunrise or sunset. This once-in-a-lifetime adventure offers panoramic views and unforgettable memories.", + "locationName": "Wadi Rum", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "jordan", + "ref": "hot-air-balloon-ride-over-wadi-rum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_hot-air-balloon-ride-over-wadi-rum.jpg" + }, + { + "name": "Canyoning Adventure in Wadi Mujib", + "description": "Embark on a thrilling canyoning adventure through the Wadi Mujib, a stunning river canyon with cascading waterfalls and natural pools. Hike, swim, and rappel your way through this natural waterpark, surrounded by dramatic cliffs and lush vegetation. This activity is perfect for adventurous travelers seeking an adrenaline rush.", + "locationName": "Wadi Mujib", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "jordan", + "ref": "canyoning-adventure-in-wadi-mujib", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_canyoning-adventure-in-wadi-mujib.jpg" + }, + { + "name": "Stargazing in the Desert", + "description": "Escape the city lights and experience the magic of the desert night sky. Join a stargazing tour in Wadi Rum or another remote location and marvel at the Milky Way, constellations, and shooting stars. Learn about the celestial wonders from expert guides and enjoy the tranquility of the desert.", + "locationName": "Wadi Rum or other desert locations", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "jordan", + "ref": "stargazing-in-the-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_stargazing-in-the-desert.jpg" + }, + { + "name": "Visit the Jordan River Baptism Site", + "description": "Explore the Jordan River Baptism Site, a significant religious and historical landmark believed to be the place where Jesus was baptized. Visit the archaeological remains, churches, and chapels, and learn about the site's importance to Christianity. The serene atmosphere and spiritual significance make it a meaningful experience.", + "locationName": "Bethany Beyond the Jordan", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "jordan", + "ref": "visit-the-jordan-river-baptism-site", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_visit-the-jordan-river-baptism-site.jpg" + }, + { + "name": "Explore the Ajloun Castle", + "description": "Discover the Ajloun Castle, a 12th-century Muslim fortress perched on a hilltop overlooking the Jordan Valley. Explore the castle's towers, courtyards, and underground passages, and learn about its role in defending against Crusader attacks. Enjoy breathtaking views of the surrounding landscapes and immerse yourself in Jordan's rich history.", + "locationName": "Ajloun", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "jordan", + "ref": "explore-the-ajloun-castle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/jordan_explore-the-ajloun-castle.jpg" + }, + { + "name": "Napali Coast Boat Tour", + "description": "Embark on an unforgettable journey along the majestic Napali Coast, renowned for its towering sea cliffs, hidden sea caves, and pristine beaches. Witness the dramatic beauty of this natural wonder from the comfort of a boat, with opportunities to spot marine life such as dolphins and sea turtles.", + "locationName": "Napali Coast", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "kauai", + "ref": "napali-coast-boat-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_napali-coast-boat-tour.jpg" + }, + { + "name": "Hiking the Kalalau Trail", + "description": "Challenge yourself with a hike on the legendary Kalalau Trail, traversing 11 miles of rugged coastline along the Napali Coast. Experience breathtaking views of the Pacific Ocean, lush valleys, and cascading waterfalls. This strenuous hike is best suited for experienced adventurers.", + "locationName": "Napali Coast State Wilderness Park", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "kauai", + "ref": "hiking-the-kalalau-trail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_hiking-the-kalalau-trail.jpg" + }, + { + "name": "Snorkeling at Tunnels Beach", + "description": "Discover the vibrant underwater world at Tunnels Beach, a renowned snorkeling destination. Explore the coral reefs teeming with colorful fish, sea turtles, and other marine life. The calm, clear waters make it an ideal spot for beginners and experienced snorkelers alike.", + "locationName": "Tunnels Beach", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "kauai", + "ref": "snorkeling-at-tunnels-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_snorkeling-at-tunnels-beach.jpg" + }, + { + "name": "Waimea Canyon State Park", + "description": "Explore the vast and awe-inspiring Waimea Canyon, often referred to as the \"Grand Canyon of the Pacific.\" Hike along the canyon rim, enjoying panoramic views of its colorful layers and cascading waterfalls. Visit the Koke'e State Park nearby for additional hiking trails and scenic overlooks.", + "locationName": "Waimea Canyon State Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "kauai", + "ref": "waimea-canyon-state-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_waimea-canyon-state-park.jpg" + }, + { + "name": "Kayaking the Wailua River", + "description": "Embark on a peaceful kayaking adventure along the Wailua River, paddling through lush rainforests and past ancient Hawaiian temples. Explore hidden waterfalls, secret swimming holes, and the Fern Grotto, a natural lava cave adorned with hanging ferns.", + "locationName": "Wailua River", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "kauai", + "ref": "kayaking-the-wailua-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_kayaking-the-wailua-river.jpg" + }, + { + "name": "Poipu Beach Park", + "description": "Spend a relaxing day at Poipu Beach Park, known for its calm waters, golden sand, and excellent swimming conditions. The protected bay is perfect for families with young children, and lifeguards are on duty for added safety. Enjoy sunbathing, building sandcastles, or simply soaking up the stunning ocean views.", + "locationName": "Poipu Beach Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "kauai", + "ref": "poipu-beach-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_poipu-beach-park.jpg" + }, + { + "name": "Kilauea Lighthouse and Wildlife Refuge", + "description": "Embark on a scenic drive to the Kilauea Lighthouse and Wildlife Refuge, perched on a rugged clifftop. Witness breathtaking panoramic views of the coastline and observe native seabirds like albatrosses, boobies, and shearwaters. Explore the historic lighthouse and learn about its fascinating maritime history.", + "locationName": "Kilauea Point National Wildlife Refuge", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "kauai", + "ref": "kilauea-lighthouse-and-wildlife-refuge", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_kilauea-lighthouse-and-wildlife-refuge.jpg" + }, + { + "name": "Spouting Horn Blowhole", + "description": "Marvel at the natural wonder of the Spouting Horn Blowhole, a unique coastal formation where waves crash into a lava tube, creating a geyser-like eruption of water. Capture stunning photos of the powerful spray and enjoy the dramatic ocean scenery. Browse the nearby shops for local crafts and souvenirs.", + "locationName": "Spouting Horn", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "kauai", + "ref": "spouting-horn-blowhole", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_spouting-horn-blowhole.jpg" + }, + { + "name": "Hanalei Valley Lookout", + "description": "Take a scenic drive to the Hanalei Valley Lookout and be captivated by the breathtaking panoramic vistas of the lush taro fields, meandering rivers, and the majestic mountains in the distance. Capture postcard-worthy photos and immerse yourself in the serene beauty of Kauai's countryside.", + "locationName": "Hanalei Valley Lookout", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "kauai", + "ref": "hanalei-valley-lookout", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_hanalei-valley-lookout.jpg" + }, + { + "name": "Mountain Tubing Adventure", + "description": "Embark on a thrilling mountain tubing adventure through Kauai's historic irrigation system. Float down gentle waterways, passing through lush landscapes and tunnels, and enjoy the unique perspective of the island's interior. This family-friendly activity offers a fun and refreshing way to experience Kauai's natural beauty.", + "locationName": "Lihue Plantation", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "kauai", + "ref": "mountain-tubing-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_mountain-tubing-adventure.jpg" + }, + { + "name": "Ziplining through the Rainforest", + "description": "Soar through the lush Kauai rainforest on a thrilling zipline adventure. Experience breathtaking views of waterfalls, valleys, and the Pacific Ocean as you fly through the air on multiple ziplines. This exhilarating activity is perfect for adrenaline seekers and nature enthusiasts alike.", + "locationName": "Multiple locations throughout Kauai", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "kauai", + "ref": "ziplining-through-the-rainforest", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_ziplining-through-the-rainforest.jpg" + }, + { + "name": "Luau Feast and Polynesian Show", + "description": "Immerse yourself in the vibrant culture of Hawaii at a traditional luau. Indulge in a delicious feast of Hawaiian dishes while enjoying captivating Polynesian music and dance performances. Witness the mesmerizing fire knife dance and learn about the rich history and traditions of the islands. This unforgettable experience is perfect for families and those seeking a taste of authentic Hawaiian culture.", + "locationName": "Various resorts and cultural centers", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "kauai", + "ref": "luau-feast-and-polynesian-show", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_luau-feast-and-polynesian-show.jpg" + }, + { + "name": "Helicopter Tour over the Napali Coast", + "description": "Embark on a breathtaking helicopter tour over the majestic Napali Coast. Witness the dramatic cliffs, cascading waterfalls, and hidden sea caves from a unique aerial perspective. This once-in-a-lifetime experience offers unparalleled views and is perfect for photography enthusiasts or anyone seeking a truly unforgettable adventure.", + "locationName": "Lihue Airport", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "kauai", + "ref": "helicopter-tour-over-the-napali-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_helicopter-tour-over-the-napali-coast.jpg" + }, + { + "name": "Explore Hanalei Town", + "description": "Wander through the charming town of Hanalei, known for its historic buildings, art galleries, and local boutiques. Discover unique souvenirs, indulge in delicious food at local cafes, or simply relax and soak up the laid-back atmosphere. This picturesque town offers a glimpse into the island's local culture and is perfect for a leisurely afternoon stroll.", + "locationName": "Hanalei Town", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "kauai", + "ref": "explore-hanalei-town", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_explore-hanalei-town.jpg" + }, + { + "name": "Sunset Catamaran Cruise", + "description": "Sail along the stunning Kauai coastline on a romantic sunset catamaran cruise. Enjoy breathtaking views of the setting sun as you sip on tropical cocktails and savor delicious appetizers. This relaxing and picturesque experience is perfect for couples or anyone looking to unwind and enjoy the beauty of the island.", + "locationName": "Multiple locations along the coast", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 3, + "destinationRef": "kauai", + "ref": "sunset-catamaran-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_sunset-catamaran-cruise.jpg" + }, + { + "name": "Horseback Riding Adventure", + "description": "Saddle up for an unforgettable horseback riding adventure through Kauai's lush interior. Explore hidden trails, traverse rolling hills, and soak in breathtaking views of the island's diverse landscapes. Whether you're an experienced rider or a beginner, this activity offers a unique and immersive way to connect with Kauai's natural beauty.", + "locationName": "Silver Falls Ranch or Princeville Ranch", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "kauai", + "ref": "horseback-riding-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_horseback-riding-adventure.jpg" + }, + { + "name": "Secret Beach Exploration", + "description": "Embark on a quest to discover Kauai's hidden gems – its secret beaches. Hike through lush jungles, navigate rocky coastlines, and be rewarded with secluded stretches of sand where you can relax, swim, and soak up the tranquility away from the crowds. Some popular options include Mahaulepu Heritage Trail and Polihale State Park.", + "locationName": "Mahaulepu Heritage Trail or Polihale State Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "kauai", + "ref": "secret-beach-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_secret-beach-exploration.jpg" + }, + { + "name": "Koke'e State Park Hiking and Scenic Drives", + "description": "Immerse yourself in the stunning landscapes of Koke'e State Park. Hike through diverse trails offering panoramic views of the Napali Coast, Waimea Canyon, and lush valleys. Alternatively, embark on a scenic drive along Koke'e Road, stopping at lookout points to capture breathtaking vistas and witness the island's natural wonders.", + "locationName": "Koke'e State Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "kauai", + "ref": "koke-e-state-park-hiking-and-scenic-drives", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_koke-e-state-park-hiking-and-scenic-drives.jpg" + }, + { + "name": "Attend a Farmers Market", + "description": "Immerse yourself in Kauai's local culture and flavors by visiting one of the island's vibrant farmers markets. Browse through stalls overflowing with fresh produce, tropical fruits, handcrafted goods, and unique souvenirs. Engage with local farmers and artisans, savor delicious food, and experience the island's authentic charm.", + "locationName": "Various locations throughout Kauai", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "kauai", + "ref": "attend-a-farmers-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_attend-a-farmers-market.jpg" + }, + { + "name": "Sunset at Hanalei Bay", + "description": "Witness the magic of a Hawaiian sunset at Hanalei Bay. Relax on the golden sand, take a leisurely stroll along the shore, or paddle out on a kayak to enjoy the breathtaking views of the sky ablaze with colors. Capture unforgettable photos and create lasting memories of this iconic Kauai experience.", + "locationName": "Hanalei Bay", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "kauai", + "ref": "sunset-at-hanalei-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kauai_sunset-at-hanalei-bay.jpg" + }, + { + "name": "Masai Mara National Reserve Safari", + "description": "Embark on an exhilarating game drive through the iconic Masai Mara National Reserve, renowned for its abundance of wildlife. Witness the breathtaking spectacle of the Great Migration, where millions of wildebeest and zebras traverse the plains. Spot majestic lions, graceful giraffes, powerful elephants, and elusive leopards in their natural habitat.", + "locationName": "Masai Mara National Reserve", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "kenya", + "ref": "masai-mara-national-reserve-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_masai-mara-national-reserve-safari.jpg" + }, + { + "name": "Amboseli National Park Elephant Encounter", + "description": "Venture into Amboseli National Park, famous for its large elephant herds and breathtaking views of Mount Kilimanjaro. Observe these gentle giants as they roam freely against the backdrop of Africa's highest peak. Capture incredible photos and learn about elephant conservation efforts.", + "locationName": "Amboseli National Park", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "kenya", + "ref": "amboseli-national-park-elephant-encounter", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_amboseli-national-park-elephant-encounter.jpg" + }, + { + "name": "Lake Nakuru Flamingo Spectacle", + "description": "Visit Lake Nakuru National Park, a haven for birdwatchers. Marvel at the mesmerizing sight of thousands of pink flamingos flocking to the lake's alkaline waters. Explore the park's diverse ecosystems, home to rhinos, lions, giraffes, and a variety of bird species.", + "locationName": "Lake Nakuru National Park", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "kenya", + "ref": "lake-nakuru-flamingo-spectacle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_lake-nakuru-flamingo-spectacle.jpg" + }, + { + "name": "Maasai Village Cultural Immersion", + "description": "Immerse yourself in the vibrant culture of the Maasai people. Visit a traditional Maasai village and interact with the locals. Learn about their customs, traditions, and way of life. Witness their impressive jumping dances and intricate beadwork.", + "locationName": "Maasai Village", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "kenya", + "ref": "maasai-village-cultural-immersion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_maasai-village-cultural-immersion.jpg" + }, + { + "name": "Nairobi City Exploration", + "description": "Discover the bustling capital city of Nairobi. Visit the Karen Blixen Museum, the former home of the famous author of 'Out of Africa.' Explore the Nairobi National Museum, showcasing Kenya's rich history and culture. Indulge in the city's vibrant nightlife and diverse culinary scene.", + "locationName": "Nairobi City", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "kenya", + "ref": "nairobi-city-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_nairobi-city-exploration.jpg" + }, + { + "name": "Mount Kenya Climbing Expedition", + "description": "Embark on a thrilling adventure to conquer the majestic Mount Kenya, Africa's second-highest peak. Hike through diverse ecosystems, from lush rainforests to alpine meadows, and witness breathtaking panoramic views from the summit. This challenging yet rewarding experience is perfect for adventurous souls seeking an unforgettable climb.", + "locationName": "Mount Kenya National Park", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "kenya", + "ref": "mount-kenya-climbing-expedition", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_mount-kenya-climbing-expedition.jpg" + }, + { + "name": "Diani Beach Relaxation", + "description": "Unwind on the pristine sands of Diani Beach, a tropical paradise along Kenya's coastline. Soak up the sun, swim in the crystal-clear waters, and indulge in water sports like snorkeling and diving. With its luxurious resorts, vibrant nightlife, and stunning coral reefs, Diani Beach offers the perfect blend of relaxation and adventure.", + "locationName": "Diani Beach", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "kenya", + "ref": "diani-beach-relaxation", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_diani-beach-relaxation.jpg" + }, + { + "name": "Lamu Island Cultural Exploration", + "description": "Step back in time on Lamu Island, a UNESCO World Heritage Site known for its rich history and Swahili culture. Explore the narrow streets of Lamu Old Town, visit ancient mosques and fortresses, and witness the traditional dhow sailing boats. Immerse yourself in the island's unique blend of African, Arabic, and Indian influences.", + "locationName": "Lamu Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "kenya", + "ref": "lamu-island-cultural-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_lamu-island-cultural-exploration.jpg" + }, + { + "name": "Tsavo National Park Rhino Tracking", + "description": "Embark on a thrilling rhino tracking experience in Tsavo National Park, home to one of the largest populations of black rhinos in Kenya. Join experienced guides on a bush walk to observe these magnificent creatures in their natural habitat and learn about conservation efforts to protect them. This unique adventure offers an unforgettable encounter with endangered wildlife.", + "locationName": "Tsavo National Park", + "duration": 7, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "kenya", + "ref": "tsavo-national-park-rhino-tracking", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_tsavo-national-park-rhino-tracking.jpg" + }, + { + "name": "Hot Air Balloon Safari over the Masai Mara", + "description": "Experience the breathtaking beauty of the Masai Mara from a unique perspective with a hot air balloon safari. Ascend at dawn and witness the stunning sunrise over the vast savanna, spotting wildlife like lions, elephants, and giraffes from above. This unforgettable experience offers a serene and magical way to witness the wonders of Kenya's wildlife.", + "locationName": "Masai Mara National Reserve", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "kenya", + "ref": "hot-air-balloon-safari-over-the-masai-mara", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_hot-air-balloon-safari-over-the-masai-mara.jpg" + }, + { + "name": "Samburu National Reserve Cultural Safari", + "description": "Explore the Samburu National Reserve, known for its unique wildlife and rich cultural heritage. Encounter the Samburu people, a semi-nomadic tribe with vibrant traditions and distinctive attire. Learn about their customs, way of life, and connection to the land. Observe Grevy's zebras, reticulated giraffes, and other rare species that thrive in this arid region.", + "locationName": "Samburu National Reserve", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "kenya", + "ref": "samburu-national-reserve-cultural-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_samburu-national-reserve-cultural-safari.jpg" + }, + { + "name": "Kisite-Mpunguti Marine National Park Snorkeling Adventure", + "description": "Discover the vibrant underwater world of Kisite-Mpunguti Marine National Park. Embark on a snorkeling adventure to encounter colorful coral reefs, diverse fish species, and even dolphins and sea turtles. Explore the marine ecosystem and enjoy the crystal-clear waters of the Indian Ocean.", + "locationName": "Kisite-Mpunguti Marine National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "kenya", + "ref": "kisite-mpunguti-marine-national-park-snorkeling-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_kisite-mpunguti-marine-national-park-snorkeling-adventure.jpg" + }, + { + "name": "Hike and Camp on Mount Longonot", + "description": "Embark on a challenging yet rewarding hike to the summit of Mount Longonot, a dormant volcano with breathtaking views of the Great Rift Valley. Explore the crater rim and enjoy panoramic landscapes. Camp overnight under the stars and experience the serenity of the Kenyan wilderness.", + "locationName": "Mount Longonot National Park", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "kenya", + "ref": "hike-and-camp-on-mount-longonot", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_hike-and-camp-on-mount-longonot.jpg" + }, + { + "name": "Explore the Karen Blixen Museum", + "description": "Step back in time at the Karen Blixen Museum, the former home of the famous Danish author of \"Out of Africa.\" Explore the colonial farmhouse and its surrounding gardens, gaining insights into Kenya's colonial history and Blixen's life and literary works.", + "locationName": "Nairobi", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "kenya", + "ref": "explore-the-karen-blixen-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_explore-the-karen-blixen-museum.jpg" + }, + { + "name": "White Water Rafting on Tana River", + "description": "Experience the thrill of white water rafting down the Tana River, Kenya's longest river. Navigate through exhilarating rapids, surrounded by stunning landscapes and lush vegetation. This adventure offers an adrenaline-pumping experience for both beginners and seasoned rafters.", + "locationName": "Tana River", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "kenya", + "ref": "white-water-rafting-on-tana-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_white-water-rafting-on-tana-river.jpg" + }, + { + "name": "Explore the Aberdare Ranges", + "description": "Discover the breathtaking beauty of the Aberdare Ranges, a mountain range with diverse ecosystems, including bamboo forests, moorlands, and waterfalls. Hike through scenic trails, encounter unique wildlife like the black rhino and bongo antelope, and enjoy stunning views of the surrounding landscapes.", + "locationName": "Aberdare National Park", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "kenya", + "ref": "explore-the-aberdare-ranges", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_explore-the-aberdare-ranges.jpg" + }, + { + "name": "Birdwatching in Kakamega Forest", + "description": "Immerse yourself in the vibrant world of birds at Kakamega Forest, known for its exceptional avian diversity. Spot rare and endemic species, including the Great Blue Turaco and the Turner's Eremomela, while enjoying the tranquility of this ancient rainforest.", + "locationName": "Kakamega Forest National Reserve", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "kenya", + "ref": "birdwatching-in-kakamega-forest", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_birdwatching-in-kakamega-forest.jpg" + }, + { + "name": "Relax at Lake Naivasha", + "description": "Unwind by the serene shores of Lake Naivasha, a freshwater lake teeming with birdlife and surrounded by lush landscapes. Take a boat ride to Crescent Island, enjoy a nature walk, or simply relax and soak up the peaceful atmosphere.", + "locationName": "Lake Naivasha", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "kenya", + "ref": "relax-at-lake-naivasha", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_relax-at-lake-naivasha.jpg" + }, + { + "name": "Stargazing in the Chyulu Hills", + "description": "Escape the city lights and experience the magic of stargazing in the Chyulu Hills. With minimal light pollution, the night sky comes alive with countless stars, offering a breathtaking spectacle for astronomy enthusiasts and nature lovers alike.", + "locationName": "Chyulu Hills", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "kenya", + "ref": "stargazing-in-the-chyulu-hills", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kenya_stargazing-in-the-chyulu-hills.jpg" + }, + { + "name": "Temple Hopping in the Eastern Mountains", + "description": "Embark on a serene journey through Kyoto's eastern mountains, home to some of Japan's most iconic temples. Explore the tranquil Kiyomizu-dera Temple with its stunning wooden stage and panoramic city views. Wander through the moss-covered gardens of Nanzen-ji Temple, and discover the vibrant red gates of Fushimi Inari-taisha Shrine, winding up the hillside.", + "locationName": "Eastern Kyoto", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "kyoto", + "ref": "temple-hopping-in-the-eastern-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_temple-hopping-in-the-eastern-mountains.jpg" + }, + { + "name": "Geisha Spotting and Cultural Immersion in Gion", + "description": "Step back in time and immerse yourself in the enchanting district of Gion. Wander through its narrow streets lined with traditional wooden machiya houses, and keep an eye out for the elusive geishas in their elegant kimonos. Experience a traditional tea ceremony, learn about the geisha culture, and enjoy a kaiseki dinner for a truly authentic cultural immersion.", + "locationName": "Gion District", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 4, + "destinationRef": "kyoto", + "ref": "geisha-spotting-and-cultural-immersion-in-gion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_geisha-spotting-and-cultural-immersion-in-gion.jpg" + }, + { + "name": "Arashiyama Bamboo Grove and Sagano Scenic Railway", + "description": "Escape the city bustle and venture to the enchanting Arashiyama Bamboo Grove. Stroll through the towering bamboo stalks, creating a surreal and peaceful atmosphere. Afterward, take a scenic train ride on the Sagano Romantic Train, enjoying breathtaking views of the Hozugawa River and the surrounding mountains.", + "locationName": "Arashiyama", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "kyoto", + "ref": "arashiyama-bamboo-grove-and-sagano-scenic-railway", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_arashiyama-bamboo-grove-and-sagano-scenic-railway.jpg" + }, + { + "name": "Nishiki Market Foodie Adventure", + "description": "Indulge your senses in the vibrant Nishiki Market, known as 'Kyoto's Kitchen.' Explore the bustling stalls offering a wide array of fresh seafood, local produce, and traditional Japanese sweets. Sample delicious street food, discover unique culinary ingredients, and experience the authentic flavors of Kyoto.", + "locationName": "Nishiki Market", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "kyoto", + "ref": "nishiki-market-foodie-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_nishiki-market-foodie-adventure.jpg" + }, + { + "name": "Golden Pavilion and Zen Garden Serenity", + "description": "Marvel at the Golden Pavilion (Kinkaku-ji Temple), a shimmering golden structure reflected in a serene pond. Explore the surrounding zen gardens, meticulously designed to inspire tranquility and contemplation. Witness the harmony of nature and architecture, and experience a moment of peace in the heart of Kyoto.", + "locationName": "Kinkaku-ji Temple", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "kyoto", + "ref": "golden-pavilion-and-zen-garden-serenity", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_golden-pavilion-and-zen-garden-serenity.jpg" + }, + { + "name": "Fushimi Inari-taisha Shrine Hike", + "description": "Embark on a captivating hike through thousands of vibrant orange torii gates that wind their way up the mountainside at Fushimi Inari-taisha Shrine. This iconic landmark offers stunning views of the city and a glimpse into the Shinto religion. **Tags:** Hiking, Sightseeing, Cultural experiences, Instagrammable", + "locationName": "Fushimi Inari-taisha Shrine", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "kyoto", + "ref": "fushimi-inari-taisha-shrine-hike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_fushimi-inari-taisha-shrine-hike.jpg" + }, + { + "name": "Kiyomizu-dera Temple and the Philosopher's Path", + "description": "Visit the historic Kiyomizu-dera Temple, known for its wooden stage and breathtaking views of the city. Afterwards, take a leisurely stroll along the Philosopher's Path, a serene stone path lined with cherry blossom trees and traditional shops. **Tags:** Sightseeing, Cultural experiences, Relaxing, Instagrammable, Spring destination", + "locationName": "Eastern Kyoto", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "kyoto", + "ref": "kiyomizu-dera-temple-and-the-philosopher-s-path", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_kiyomizu-dera-temple-and-the-philosopher-s-path.jpg" + }, + { + "name": "Pontocho Alley and Kamogawa River", + "description": "Wander through the charming Pontocho Alley, a narrow lane filled with traditional teahouses and restaurants. Enjoy a delicious meal while overlooking the picturesque Kamogawa River, especially enchanting in the evening with illuminated riverside dining. **Tags:** Food tours, Nightlife, Cultural experiences, Romantic", + "locationName": "Central Kyoto", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 3, + "destinationRef": "kyoto", + "ref": "pontocho-alley-and-kamogawa-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_pontocho-alley-and-kamogawa-river.jpg" + }, + { + "name": "Arashiyama Monkey Park Iwatayama", + "description": "Take a short hike up Mt. Arashiyama to the Monkey Park Iwatayama, home to over 100 playful monkeys. Enjoy panoramic views of the city and the opportunity to observe these fascinating creatures in their natural habitat. **Tags:** Hiking, Wildlife watching, Family-friendly", + "locationName": "Arashiyama", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "kyoto", + "ref": "arashiyama-monkey-park-iwatayama", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_arashiyama-monkey-park-iwatayama.jpg" + }, + { + "name": "Nijo Castle", + "description": "Explore the opulent Nijo Castle, a UNESCO World Heritage Site and former residence of the Tokugawa shoguns. Discover its impressive architecture, including the Ninomaru Palace with its 'nightingale floors' and stunning gardens. **Tags:** Sightseeing, Historic, Cultural experiences", + "locationName": "Central Kyoto", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "kyoto", + "ref": "nijo-castle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_nijo-castle.jpg" + }, + { + "name": "Tea Ceremony Experience at Ensian", + "description": "Immerse yourself in the graceful art of the Japanese tea ceremony at Ensian. Dressed in a traditional kimono, learn the intricate steps of preparing and serving matcha tea from a tea master. Experience the tranquility and cultural significance of this ancient ritual in a serene tatami-mat room.", + "locationName": "Ensian", + "duration": 1.5, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "kyoto", + "ref": "tea-ceremony-experience-at-ensian", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_tea-ceremony-experience-at-ensian.jpg" + }, + { + "name": "Kimono Forest at Randen Arashiyama Station", + "description": "Step into a magical world of color and light at the Kimono Forest. Wander through a pathway lined with hundreds of illuminated kimono-clad poles, each representing a unique pattern and design. Capture stunning photos and enjoy the enchanting atmosphere, especially beautiful in the evening.", + "locationName": "Randen Arashiyama Station", + "duration": 1, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "kyoto", + "ref": "kimono-forest-at-randen-arashiyama-station", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_kimono-forest-at-randen-arashiyama-station.jpg" + }, + { + "name": "Sake Brewery Tour and Tasting at Gekkeikan Okura Sake Museum", + "description": "Delve into the fascinating world of sake brewing with a tour of the Gekkeikan Okura Sake Museum. Learn about the history and process of sake production, explore traditional brewing tools and equipment, and enjoy a guided tasting of different sake varieties. Discover the unique flavors and cultural significance of this beloved Japanese beverage.", + "locationName": "Gekkeikan Okura Sake Museum", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "kyoto", + "ref": "sake-brewery-tour-and-tasting-at-gekkeikan-okura-sake-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_sake-brewery-tour-and-tasting-at-gekkeikan-okura-sake-museum.jpg" + }, + { + "name": "Toei Kyoto Studio Park", + "description": "Embark on a journey through the world of Japanese cinema at Toei Kyoto Studio Park. Explore authentic film sets depicting historical periods, witness live ninja and samurai shows, and even participate in a costume experience. This interactive theme park offers a fun and engaging way to learn about Japan's rich cinematic history.", + "locationName": "Toei Kyoto Studio Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "kyoto", + "ref": "toei-kyoto-studio-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_toei-kyoto-studio-park.jpg" + }, + { + "name": "Day Trip to Nara Park", + "description": "Escape the city bustle with a day trip to Nara Park, a sprawling green space renowned for its friendly wild deer. Interact with these gentle creatures, visit the Todai-ji Temple housing a giant bronze Buddha statue, and explore the Kasuga Taisha Shrine with its thousands of stone and bronze lanterns. Enjoy a relaxing stroll through the park's serene natural beauty.", + "locationName": "Nara Park", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "kyoto", + "ref": "day-trip-to-nara-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_day-trip-to-nara-park.jpg" + }, + { + "name": "Kifune Shrine and the Enchanting Kibune Village", + "description": "Embark on a scenic journey to the northern mountains of Kyoto and discover the mystical Kifune Shrine, nestled amidst lush greenery. Stroll through the charming Kibune village, known for its traditional ryokans with balconies overlooking the Kibune River. Indulge in a unique dining experience by enjoying nagashi-somen, where cold noodles flow down bamboo chutes.", + "locationName": "Kibune Village", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "kyoto", + "ref": "kifune-shrine-and-the-enchanting-kibune-village", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_kifune-shrine-and-the-enchanting-kibune-village.jpg" + }, + { + "name": "Philosophical Ponderings at Nanzen-ji Temple and Aqueduct", + "description": "Explore the expansive Nanzen-ji Temple complex, renowned for its stunning architecture and serene gardens. Marvel at the impressive brick aqueduct, a historic landmark that transported water to the city. Immerse yourself in the Zen atmosphere and contemplate the profound teachings of Buddhism.", + "locationName": "Nanzen-ji Temple", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "kyoto", + "ref": "philosophical-ponderings-at-nanzen-ji-temple-and-aqueduct", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_philosophical-ponderings-at-nanzen-ji-temple-and-aqueduct.jpg" + }, + { + "name": "Arashiyama Bamboo Grove Bike Tour", + "description": "Embark on an exciting bike tour through the enchanting Arashiyama Bamboo Grove. Cycle through the towering bamboo stalks, creating an unforgettable visual and auditory experience. Explore the surrounding areas, including the picturesque Togetsukyo Bridge and the Tenryuji Temple, at your own pace.", + "locationName": "Arashiyama Bamboo Grove", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "kyoto", + "ref": "arashiyama-bamboo-grove-bike-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_arashiyama-bamboo-grove-bike-tour.jpg" + }, + { + "name": "Pontocho Evening Food Tour", + "description": "Embark on a culinary adventure through Pontocho Alley, a historic entertainment district renowned for its traditional restaurants and teahouses. Sample a variety of authentic Kyoto dishes, from delicate kaiseki to hearty ramen, while experiencing the vibrant nightlife atmosphere.", + "locationName": "Pontocho Alley", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "kyoto", + "ref": "pontocho-evening-food-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_pontocho-evening-food-tour.jpg" + }, + { + "name": "Gion Corner Cultural Show", + "description": "Immerse yourself in traditional Japanese arts at the Gion Corner, a renowned venue showcasing various cultural performances. Witness the elegance of Kyomai dance, the artistry of tea ceremony, and the captivating sounds of the koto, a traditional stringed instrument.", + "locationName": "Gion Corner", + "duration": 1.5, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "kyoto", + "ref": "gion-corner-cultural-show", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/kyoto_gion-corner-cultural-show.jpg" + }, + { + "name": "Row a Pletna Boat to Bled Island", + "description": "Embark on a traditional pletna boat, a wooden rowboat unique to Lake Bled, and glide across the emerald waters to Bled Island. Explore the charming island, visit the Church of the Assumption, and ring the wishing bell for good luck. The picturesque views and serene atmosphere make this a truly romantic experience.", + "locationName": "Lake Bled", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-bled", + "ref": "row-a-pletna-boat-to-bled-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_row-a-pletna-boat-to-bled-island.jpg" + }, + { + "name": "Hike to Ojstrica for Panoramic Views", + "description": "Embark on a moderate hike up Ojstrica hill for breathtaking panoramic views of Lake Bled, the island, and the surrounding Julian Alps. The trail is well-maintained and offers several viewpoints along the way. Pack a picnic and enjoy the scenery from the summit, capturing stunning photos of the iconic landscape.", + "locationName": "Ojstrica Hill", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "lake-bled", + "ref": "hike-to-ojstrica-for-panoramic-views", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_hike-to-ojstrica-for-panoramic-views.jpg" + }, + { + "name": "Indulge in Bled Cream Cake", + "description": "Treat yourself to a slice of the famous Bled cream cake, a local delicacy known as Kremšnita. This delicious dessert features layers of crispy pastry, creamy vanilla custard, and a dusting of powdered sugar. Enjoy it at a lakeside cafe while soaking up the views and ambiance.", + "locationName": "Park Cafe", + "duration": 1, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-bled", + "ref": "indulge-in-bled-cream-cake", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_indulge-in-bled-cream-cake.jpg" + }, + { + "name": "Explore Bled Castle", + "description": "Step back in time with a visit to Bled Castle, perched high on a cliff overlooking the lake. Explore the medieval architecture, museum exhibits, and castle printing works. Enjoy stunning views from the castle walls and indulge in a meal at the castle restaurant for a truly memorable experience.", + "locationName": "Bled Castle", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-bled", + "ref": "explore-bled-castle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_explore-bled-castle.jpg" + }, + { + "name": "Relax at the Thermal Spa", + "description": "Unwind and rejuvenate at the Bled Thermal Spa, known for its healing thermal waters. Enjoy a variety of spa treatments, swim in the indoor and outdoor pools, and relax in the saunas and steam rooms. The spa offers a perfect escape for relaxation and wellness.", + "locationName": "Bled Thermal Spa", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "lake-bled", + "ref": "relax-at-the-thermal-spa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_relax-at-the-thermal-spa.jpg" + }, + { + "name": "Vintgar Gorge Adventure", + "description": "Embark on a breathtaking journey through the Vintgar Gorge, a natural wonder carved by the Radovna River. Walk along wooden walkways suspended above the turquoise waters, marvel at cascading waterfalls, and feel the refreshing mist on your face. This family-friendly adventure offers stunning views and a connection with nature.", + "locationName": "Vintgar Gorge", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-bled", + "ref": "vintgar-gorge-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_vintgar-gorge-adventure.jpg" + }, + { + "name": "Biking Around the Lake", + "description": "Rent a bike and enjoy a leisurely ride around the picturesque Lake Bled. Cycle through charming villages, past lush meadows, and along the lakeshore, taking in the breathtaking scenery. Stop for a picnic lunch with panoramic views or enjoy a refreshing swim in the lake. This activity is perfect for a relaxing and active day out.", + "locationName": "Lake Bled", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-bled", + "ref": "biking-around-the-lake", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_biking-around-the-lake.jpg" + }, + { + "name": "Stand Up Paddleboarding on the Lake", + "description": "Experience the tranquility of Lake Bled from a unique perspective with stand-up paddleboarding. Glide across the calm waters, surrounded by stunning mountain views and the iconic island church. Enjoy a peaceful workout while taking in the beauty of your surroundings.", + "locationName": "Lake Bled", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "lake-bled", + "ref": "stand-up-paddleboarding-on-the-lake", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_stand-up-paddleboarding-on-the-lake.jpg" + }, + { + "name": "Wine Tasting in the Countryside", + "description": "Discover the local flavors of Slovenia with a wine tasting tour in the surrounding countryside. Visit family-run wineries, learn about the winemaking process, and indulge in a variety of delicious Slovenian wines. Enjoy the scenic landscapes and charming atmosphere of the wine region.", + "locationName": "Goriska Brda or Vipava Valley", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "lake-bled", + "ref": "wine-tasting-in-the-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_wine-tasting-in-the-countryside.jpg" + }, + { + "name": "Traditional Slovenian Dinner with Folk Music", + "description": "Immerse yourself in Slovenian culture with a traditional dinner accompanied by live folk music. Savor authentic dishes like Kranjska klobasa (Carniolan sausage), žlikrofi (dumplings), and potica (nut roll) while enjoying the lively atmosphere and traditional music.", + "locationName": "Local restaurants or guesthouses", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-bled", + "ref": "traditional-slovenian-dinner-with-folk-music", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_traditional-slovenian-dinner-with-folk-music.jpg" + }, + { + "name": "Soar Above the Lake in a Hot Air Balloon", + "description": "Experience the breathtaking beauty of Lake Bled from a unique perspective with a hot air balloon ride. Drift silently over the emerald waters, the island church, and the surrounding mountains as you soak in the panoramic views. This unforgettable experience is perfect for a romantic occasion or a special treat.", + "locationName": "Lake Bled", + "duration": 1.5, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "lake-bled", + "ref": "soar-above-the-lake-in-a-hot-air-balloon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_soar-above-the-lake-in-a-hot-air-balloon.jpg" + }, + { + "name": "Canyoning Adventure in the Bohinj Valley", + "description": "Embark on an exhilarating canyoning adventure in the nearby Bohinj Valley. Rappel down waterfalls, slide down natural water slides, and jump into crystal-clear pools. This action-packed activity is perfect for thrill-seekers and nature lovers.", + "locationName": "Bohinj Valley", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "lake-bled", + "ref": "canyoning-adventure-in-the-bohinj-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_canyoning-adventure-in-the-bohinj-valley.jpg" + }, + { + "name": "Visit the Beekeeping Museum", + "description": "Discover the fascinating world of Slovenian beekeeping at the Beekeeping Museum in Radovljica. Learn about the history and traditions of beekeeping, see different types of beehives, and sample delicious local honey. This educational and sweet experience is perfect for families.", + "locationName": "Radovljica", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-bled", + "ref": "visit-the-beekeeping-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_visit-the-beekeeping-museum.jpg" + }, + { + "name": "Explore the Charming Town of Radovljica", + "description": "Take a leisurely stroll through the charming medieval town of Radovljica, located just a short drive from Lake Bled. Admire the well-preserved architecture, browse the local shops, and enjoy a coffee or a meal at one of the cozy cafes. This is a perfect way to experience the local culture and atmosphere.", + "locationName": "Radovljica", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "lake-bled", + "ref": "explore-the-charming-town-of-radovljica", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_explore-the-charming-town-of-radovljica.jpg" + }, + { + "name": "Horseback Riding Through the Countryside", + "description": "Experience the beauty of the Slovenian countryside on horseback. Several riding schools around Lake Bled offer guided tours through meadows, forests, and along the Sava River. This is a relaxing and scenic way to enjoy the outdoors and connect with nature.", + "locationName": "Lake Bled surroundings", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-bled", + "ref": "horseback-riding-through-the-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_horseback-riding-through-the-countryside.jpg" + }, + { + "name": "Kayaking on Lake Bled", + "description": "Experience the tranquility of Lake Bled from a different perspective by kayaking on its crystal-clear waters. Rent a kayak and paddle at your own pace, enjoying the stunning views of the island, castle, and surrounding mountains. This is a perfect activity for a peaceful morning or afternoon on the water.", + "locationName": "Lake Bled", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-bled", + "ref": "kayaking-on-lake-bled", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_kayaking-on-lake-bled.jpg" + }, + { + "name": "Hiking to Mala Osojnica", + "description": "For breathtaking panoramic views of Lake Bled, embark on a hike to Mala Osojnica. The trail is moderately challenging and rewards hikers with stunning vistas of the lake, island, castle, and surrounding Julian Alps. This is a perfect activity for adventure seekers and photography enthusiasts.", + "locationName": "Mala Osojnica", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 2, + "destinationRef": "lake-bled", + "ref": "hiking-to-mala-osojnica", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_hiking-to-mala-osojnica.jpg" + }, + { + "name": "Visit the Church of the Assumption on Bled Island", + "description": "Take a traditional Pletna boat ride to Bled Island and visit the iconic Church of the Assumption. Explore the church's history and architecture, ring the wishing bell for good luck, and enjoy the peaceful atmosphere of the island. This is a must-do activity for any visitor to Lake Bled.", + "locationName": "Bled Island", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-bled", + "ref": "visit-the-church-of-the-assumption-on-bled-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_visit-the-church-of-the-assumption-on-bled-island.jpg" + }, + { + "name": "Enjoy a Romantic Dinner with Lake Views", + "description": "Indulge in a romantic dinner at one of the many restaurants with stunning views of Lake Bled. Savor delicious Slovenian cuisine while admiring the illuminated island and castle in the evening. This is a perfect way to celebrate a special occasion or simply enjoy a memorable evening with your loved one. ", + "locationName": "Restaurants around Lake Bled", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "lake-bled", + "ref": "enjoy-a-romantic-dinner-with-lake-views", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_enjoy-a-romantic-dinner-with-lake-views.jpg" + }, + { + "name": "Go Swimming or Sunbathing at Grajska Beach", + "description": "Relax and soak up the sun at Grajska Beach, the main swimming area on Lake Bled. Enjoy a refreshing swim in the clear waters, or simply lay back on the beach and admire the picturesque surroundings. This is a perfect activity for a warm summer day. ", + "locationName": "Grajska Beach", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "lake-bled", + "ref": "go-swimming-or-sunbathing-at-grajska-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-bled_go-swimming-or-sunbathing-at-grajska-beach.jpg" + }, + { + "name": "Lake Como Boat Tour", + "description": "Embark on a scenic boat tour across the glistening waters of Lake Como. Admire the opulent villas clinging to the hillsides, the charming villages dotting the shoreline, and the breathtaking mountain vistas. Opt for a private tour for a romantic experience or join a group tour to meet fellow travelers.", + "locationName": "Lake Como", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-como", + "ref": "lake-como-boat-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_lake-como-boat-tour.jpg" + }, + { + "name": "Villa Carlotta Exploration", + "description": "Step into a world of botanical beauty at Villa Carlotta, a neoclassical villa boasting stunning gardens. Wander through the terraced landscape, marveling at vibrant flowerbeds, sculptures, and fountains. Don't miss the museum within the villa, showcasing artwork and historical artifacts.", + "locationName": "Tremezzo", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-como", + "ref": "villa-carlotta-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_villa-carlotta-exploration.jpg" + }, + { + "name": "Bellagio Stroll and Shopping", + "description": "Meander through the enchanting village of Bellagio, known as the 'Pearl of Lake Como.' Explore the narrow cobblestone streets lined with boutiques, cafes, and gelaterias. Indulge in some souvenir shopping or simply soak up the charming atmosphere of this lakeside gem.", + "locationName": "Bellagio", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-como", + "ref": "bellagio-stroll-and-shopping", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_bellagio-stroll-and-shopping.jpg" + }, + { + "name": "Brunate Funicular Ride", + "description": "Take a thrilling funicular ride up to the village of Brunate, perched high above Lake Como. Enjoy panoramic views of the lake, surrounding mountains, and the city of Como below. Explore the charming village, visit the Volta Lighthouse, or simply relax at a café with a view.", + "locationName": "Como", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-como", + "ref": "brunate-funicular-ride", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_brunate-funicular-ride.jpg" + }, + { + "name": "Culinary Delights in Varenna", + "description": "Embark on a culinary adventure in the charming village of Varenna. Savor authentic Italian dishes at lakeside restaurants, indulge in freshly made gelato, and sample local wines. Enjoy a leisurely dinner with breathtaking views of the sunset over Lake Como.", + "locationName": "Varenna", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "lake-como", + "ref": "culinary-delights-in-varenna", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_culinary-delights-in-varenna.jpg" + }, + { + "name": "Hiking in the Grigna Mountains", + "description": "Embark on a scenic hike in the Grigna Mountains, offering breathtaking panoramic views of Lake Como and the surrounding landscape. Choose from various trails catering to different skill levels, allowing you to immerse yourself in the natural beauty of the region.", + "locationName": "Grigna Mountains", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-como", + "ref": "hiking-in-the-grigna-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_hiking-in-the-grigna-mountains.jpg" + }, + { + "name": "Kayaking or Paddleboarding on the Lake", + "description": "Experience the tranquility of Lake Como by gliding across its crystal-clear waters in a kayak or on a paddleboard. Enjoy the stunning scenery, explore hidden coves, and discover the lakeside villages from a unique perspective.", + "locationName": "Lake Como", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-como", + "ref": "kayaking-or-paddleboarding-on-the-lake", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_kayaking-or-paddleboarding-on-the-lake.jpg" + }, + { + "name": "Greenway del Lago di Como Bike Ride", + "description": "Embark on a cycling adventure along the Greenway del Lago di Como, a scenic path that follows the lake's shoreline. Explore charming villages, lush gardens, and historic sites while enjoying the fresh air and picturesque views.", + "locationName": "Greenway del Lago di Como", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-como", + "ref": "greenway-del-lago-di-como-bike-ride", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_greenway-del-lago-di-como-bike-ride.jpg" + }, + { + "name": "Villa del Balbianello and Gardens Exploration", + "description": "Visit the enchanting Villa del Balbianello, a historic villa renowned for its stunning architecture, lush gardens, and breathtaking lake views. Explore the villa's opulent interiors and wander through the terraced gardens, offering a glimpse into the region's rich history and cultural heritage.", + "locationName": "Villa del Balbianello", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-como", + "ref": "villa-del-balbianello-and-gardens-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_villa-del-balbianello-and-gardens-exploration.jpg" + }, + { + "name": "Wine Tasting in the Valtellina Valley", + "description": "Indulge in a wine tasting experience in the Valtellina Valley, known for its terraced vineyards and production of Nebbiolo wines. Visit local wineries, learn about the winemaking process, and savor the unique flavors of the region.", + "locationName": "Valtellina Valley", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "lake-como", + "ref": "wine-tasting-in-the-valtellina-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_wine-tasting-in-the-valtellina-valley.jpg" + }, + { + "name": "Seaplane Flight over Lake Como", + "description": "Experience the breathtaking beauty of Lake Como from a unique perspective with a scenic seaplane flight. Soar above the sparkling waters, charming villages, and majestic mountains, capturing unforgettable aerial views. This exhilarating adventure offers a truly unforgettable way to appreciate the lake's splendor.", + "locationName": "Lake Como", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "lake-como", + "ref": "seaplane-flight-over-lake-como", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_seaplane-flight-over-lake-como.jpg" + }, + { + "name": "Cooking Class with a Local Chef", + "description": "Immerse yourself in the culinary traditions of Italy by joining a cooking class led by a local chef. Learn the secrets of preparing authentic Italian dishes, from fresh pasta to regional specialties, using local ingredients. This hands-on experience is perfect for food enthusiasts and provides a delicious way to connect with the local culture.", + "locationName": "Various locations in Lake Como", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-como", + "ref": "cooking-class-with-a-local-chef", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_cooking-class-with-a-local-chef.jpg" + }, + { + "name": "Explore the Castello di Vezio", + "description": "Step back in time with a visit to the Castello di Vezio, a medieval castle perched on a hilltop overlooking Varenna. Discover the castle's fascinating history, explore its ancient towers and ramparts, and enjoy panoramic views of the lake and surrounding landscape. The castle also features a falconry show, offering a unique opportunity to witness these majestic birds up close.", + "locationName": "Varenna", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-como", + "ref": "explore-the-castello-di-vezio", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_explore-the-castello-di-vezio.jpg" + }, + { + "name": "Relax at a Lakeside Spa", + "description": "Indulge in a pampering spa experience at one of the luxurious lakeside resorts. Choose from a variety of treatments, including massages, facials, and body wraps, designed to rejuvenate your body and mind. Enjoy the serene atmosphere and stunning lake views as you unwind and escape the stresses of everyday life.", + "locationName": "Various luxury hotels around Lake Como", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "lake-como", + "ref": "relax-at-a-lakeside-spa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_relax-at-a-lakeside-spa.jpg" + }, + { + "name": "Take a Day Trip to Lugano, Switzerland", + "description": "Venture beyond the Italian border and explore the charming city of Lugano in Switzerland. Discover its picturesque old town, stroll along the lakeside promenade, and admire the stunning views of the Swiss Alps. Lugano offers a blend of Italian and Swiss culture, making it a delightful destination for a day trip.", + "locationName": "Lugano, Switzerland", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-como", + "ref": "take-a-day-trip-to-lugano-switzerland", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_take-a-day-trip-to-lugano-switzerland.jpg" + }, + { + "name": "Explore the Silk History of Como", + "description": "Delve into the fascinating history of silk production in Como, dating back centuries. Visit the Silk Museum to learn about the intricate process, from silkworm farming to weaving exquisite fabrics. Explore artisan workshops and boutiques to witness the creation of luxurious silk products and perhaps find a unique souvenir.", + "locationName": "Como", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-como", + "ref": "explore-the-silk-history-of-como", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_explore-the-silk-history-of-como.jpg" + }, + { + "name": "Villa Melzi Gardens and Art Museum", + "description": "Step into a world of botanical beauty and artistic treasures at Villa Melzi. Stroll through the enchanting gardens, adorned with sculptures, exotic plants, and vibrant flowers. Visit the on-site museum to admire a collection of sculptures, paintings, and historical artifacts.", + "locationName": "Bellagio", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-como", + "ref": "villa-melzi-gardens-and-art-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_villa-melzi-gardens-and-art-museum.jpg" + }, + { + "name": "Hike to the Lighthouse of Lenno", + "description": "Embark on a scenic hike to the Lighthouse of Lenno, offering breathtaking panoramic views of Lake Como and the surrounding mountains. The trail winds through lush forests and charming villages, providing a perfect blend of nature and culture. Pack a picnic and enjoy a peaceful lunch at the top.", + "locationName": "Lenno", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 1, + "destinationRef": "lake-como", + "ref": "hike-to-the-lighthouse-of-lenno", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_hike-to-the-lighthouse-of-lenno.jpg" + }, + { + "name": "Enjoy a Romantic Dinner with a View", + "description": "Indulge in a memorable dining experience at a lakeside restaurant with stunning views. Savor delicious Italian cuisine, accompanied by fine wines and impeccable service. Many restaurants offer outdoor terraces where you can soak in the romantic ambiance and admire the shimmering lake.", + "locationName": "Various locations", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "lake-como", + "ref": "enjoy-a-romantic-dinner-with-a-view", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_enjoy-a-romantic-dinner-with-a-view.jpg" + }, + { + "name": "Take a Ferry to Explore Lakeside Villages", + "description": "Hop on a ferry and embark on a journey to discover the charming villages that dot the shores of Lake Como. Each village has its own unique character, offering historic sites, quaint shops, and local restaurants. Explore the colorful houses of Varenna, the gardens of Tremezzo, or the historic center of Menaggio.", + "locationName": "Various locations", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-como", + "ref": "take-a-ferry-to-explore-lakeside-villages", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-como_take-a-ferry-to-explore-lakeside-villages.jpg" + }, + { + "name": "Conquer Scafell Pike", + "description": "Embark on an exhilarating hike to the summit of Scafell Pike, England's highest peak. The challenging yet rewarding trail offers stunning panoramic views of the surrounding mountains, valleys, and lakes. Pack a picnic lunch to enjoy at the top and make sure to wear sturdy hiking boots.", + "locationName": "Scafell Pike", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "lake-district", + "ref": "conquer-scafell-pike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_conquer-scafell-pike.jpg" + }, + { + "name": "Cruise on Lake Windermere", + "description": "Experience the tranquility of Lake Windermere, the largest natural lake in England, on a scenic boat cruise. Relax and soak in the picturesque views of the surrounding fells and villages. Opt for a guided tour to learn about the history and ecology of the lake or rent a private boat for a more intimate experience.", + "locationName": "Lake Windermere", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-district", + "ref": "cruise-on-lake-windermere", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_cruise-on-lake-windermere.jpg" + }, + { + "name": "Discover Beatrix Potter's World", + "description": "Step into the enchanting world of Beatrix Potter at Hill Top, her former farmhouse and now a museum. Explore the charming rooms filled with her personal belongings and original illustrations. Afterwards, visit the World of Beatrix Potter Attraction in Bowness-on-Windermere for interactive exhibits and a delightful garden.", + "locationName": "Hill Top & World of Beatrix Potter Attraction", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-district", + "ref": "discover-beatrix-potter-s-world", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_discover-beatrix-potter-s-world.jpg" + }, + { + "name": "Indulge in Local Flavors", + "description": "Treat your taste buds to the culinary delights of the Lake District. Sample Cumberland sausage, a regional specialty, or savor a traditional roast dinner at a cozy pub. Don't miss the opportunity to try sticky toffee pudding, a delectable local dessert. Explore local farmers markets for fresh produce and artisanal cheeses.", + "locationName": "Various pubs and restaurants", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-district", + "ref": "indulge-in-local-flavors", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_indulge-in-local-flavors.jpg" + }, + { + "name": "Explore Dove Cottage and Wordsworth Museum", + "description": "Delve into the life and works of renowned poet William Wordsworth at Dove Cottage, his former residence. Explore the meticulously preserved rooms and gardens, and visit the Wordsworth Museum to discover manuscripts, letters, and other artifacts that offer insights into his creative process.", + "locationName": "Dove Cottage & Wordsworth Museum", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-district", + "ref": "explore-dove-cottage-and-wordsworth-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_explore-dove-cottage-and-wordsworth-museum.jpg" + }, + { + "name": "Go Ghyll Scrambling", + "description": "Embark on an exhilarating adventure through the Lake District's ghylls (narrow mountain streams). Ghyll scrambling involves navigating waterfalls, rocks, and pools, often requiring wading, climbing, and sometimes even jumping. It's a thrilling way to experience the rugged beauty of the region and challenge yourself physically.", + "locationName": "Various locations throughout the Lake District", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-district", + "ref": "go-ghyll-scrambling", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_go-ghyll-scrambling.jpg" + }, + { + "name": "Ride the Ravenglass and Eskdale Railway", + "description": "Take a nostalgic journey through the stunning scenery of the Lake District on the Ravenglass and Eskdale Railway. This heritage steam railway, affectionately known as La'al Ratty, winds its way through seven miles of picturesque landscapes, offering breathtaking views of mountains, valleys, and the coast. Enjoy a relaxing ride and soak in the beauty of the surrounding nature.", + "locationName": "Ravenglass", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-district", + "ref": "ride-the-ravenglass-and-eskdale-railway", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_ride-the-ravenglass-and-eskdale-railway.jpg" + }, + { + "name": "Visit Muncaster Castle", + "description": "Step back in time with a visit to Muncaster Castle, a historic gem with over 800 years of history. Explore the castle's grand rooms, admire its stunning gardens, and learn about its fascinating past. The castle also features a Hawk & Owl Centre, where you can witness impressive birds of prey displays.", + "locationName": "Ravenglass", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-district", + "ref": "visit-muncaster-castle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_visit-muncaster-castle.jpg" + }, + { + "name": "Explore Grizedale Forest", + "description": "Immerse yourself in the natural beauty of Grizedale Forest, a haven for outdoor enthusiasts. Hike or bike through the extensive network of trails, discover hidden sculptures amidst the trees, and enjoy panoramic views of the surrounding fells. The forest also offers various adventure activities, such as Go Ape and Segway tours.", + "locationName": "Grizedale Forest", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-district", + "ref": "explore-grizedale-forest", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_explore-grizedale-forest.jpg" + }, + { + "name": "Visit the Lakes Distillery", + "description": "Indulge in a unique experience at the Lakes Distillery, where you can discover the art of whisky, gin, and vodka production. Take a tour of the distillery, learn about the distilling process, and enjoy a tasting session of their award-winning spirits. The distillery also offers a bistro and shop, where you can savor delicious local cuisine and purchase unique souvenirs.", + "locationName": "Bassenthwaite Lake", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "lake-district", + "ref": "visit-the-lakes-distillery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_visit-the-lakes-distillery.jpg" + }, + { + "name": "Wild Swimming in Tarn Blea", + "description": "Experience the invigorating sensation of wild swimming in the crystal-clear waters of Tarn Blea, a secluded lake nestled amidst the fells. Surrounded by dramatic scenery, this off-the-beaten-path gem offers a truly refreshing and immersive experience in nature. Take a picnic and make it a memorable day out.", + "locationName": "Tarn Blea", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "lake-district", + "ref": "wild-swimming-in-tarn-blea", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_wild-swimming-in-tarn-blea.jpg" + }, + { + "name": "Stargazing at Low Gillerthwaite Field Centre", + "description": "Escape the city lights and immerse yourself in the wonders of the night sky at Low Gillerthwaite Field Centre. Join an astronomy evening and marvel at the constellations, planets, and distant galaxies through powerful telescopes. Learn about the celestial bodies and enjoy the tranquility of the dark skies.", + "locationName": "Low Gillerthwaite Field Centre", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-district", + "ref": "stargazing-at-low-gillerthwaite-field-centre", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_stargazing-at-low-gillerthwaite-field-centre.jpg" + }, + { + "name": "Paddleboarding on Derwentwater", + "description": "Embark on a serene paddleboarding adventure on the tranquil waters of Derwentwater. Enjoy breathtaking views of the surrounding mountains and lush landscapes as you glide across the lake. This activity is perfect for all skill levels and offers a unique perspective of the Lake District's beauty.", + "locationName": "Derwentwater", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-district", + "ref": "paddleboarding-on-derwentwater", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_paddleboarding-on-derwentwater.jpg" + }, + { + "name": "Mountain Biking in Whinlatter Forest", + "description": "Get your adrenaline pumping with an exhilarating mountain biking experience in Whinlatter Forest. Explore the extensive network of trails, ranging from gentle family-friendly routes to challenging technical descents. Enjoy the thrill of the ride while surrounded by stunning forest scenery.", + "locationName": "Whinlatter Forest", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "lake-district", + "ref": "mountain-biking-in-whinlatter-forest", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_mountain-biking-in-whinlatter-forest.jpg" + }, + { + "name": "Photography Tour of the Langdale Valley", + "description": "Capture the breathtaking beauty of the Lake District on a photography tour of the Langdale Valley. Led by a local expert, discover hidden gems and iconic viewpoints, learning tips and techniques to enhance your photography skills. This tour is perfect for both amateur and experienced photographers seeking to capture the essence of this stunning region.", + "locationName": "Langdale Valley", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "lake-district", + "ref": "photography-tour-of-the-langdale-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_photography-tour-of-the-langdale-valley.jpg" + }, + { + "name": "Kayaking on Coniston Water", + "description": "Embark on a serene kayaking adventure on the tranquil waters of Coniston Water, surrounded by stunning mountain scenery. Glide along the lake's surface, exploring hidden coves and enjoying the peaceful ambiance. This activity is perfect for all skill levels and offers a unique perspective of the Lake District's beauty.", + "locationName": "Coniston Water", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-district", + "ref": "kayaking-on-coniston-water", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_kayaking-on-coniston-water.jpg" + }, + { + "name": "Rock Climbing and Abseiling in Borrowdale", + "description": "Experience the thrill of rock climbing and abseiling in the dramatic landscape of Borrowdale. With expert guides, challenge yourself on the rugged cliffs and enjoy breathtaking views of the valley. This adventurous activity is perfect for adrenaline seekers and offers a memorable experience in the heart of the Lake District.", + "locationName": "Borrowdale", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "lake-district", + "ref": "rock-climbing-and-abseiling-in-borrowdale", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_rock-climbing-and-abseiling-in-borrowdale.jpg" + }, + { + "name": "Afternoon Tea at Lindeth Howe", + "description": "Indulge in a quintessentially English experience with a delightful afternoon tea at Lindeth Howe, a charming country house hotel once owned by Beatrix Potter. Savor a selection of delicate sandwiches, freshly baked scones, and delectable pastries, all while enjoying the elegant ambiance and stunning views of the surrounding gardens.", + "locationName": "Lindeth Howe", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 4, + "destinationRef": "lake-district", + "ref": "afternoon-tea-at-lindeth-howe", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_afternoon-tea-at-lindeth-howe.jpg" + }, + { + "name": "Visit the World of Beatrix Potter Attraction", + "description": "Step into the enchanting world of Beatrix Potter at this family-friendly attraction. Explore interactive exhibits, charming gardens, and delightful displays that bring her beloved characters to life. This immersive experience is perfect for children and adults alike, offering a nostalgic journey through the tales of Peter Rabbit and his friends.", + "locationName": "The World of Beatrix Potter Attraction", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-district", + "ref": "visit-the-world-of-beatrix-potter-attraction", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_visit-the-world-of-beatrix-potter-attraction.jpg" + }, + { + "name": "Enjoy a scenic drive along the Kirkstone Pass", + "description": "Embark on a breathtaking drive along the Kirkstone Pass, one of the highest and most scenic mountain passes in the Lake District. Enjoy panoramic views of the surrounding valleys, rugged mountains, and shimmering lakes. Stop at viewpoints along the way to capture stunning photographs and soak in the beauty of the landscape.", + "locationName": "Kirkstone Pass", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "lake-district", + "ref": "enjoy-a-scenic-drive-along-the-kirkstone-pass", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-district_enjoy-a-scenic-drive-along-the-kirkstone-pass.jpg" + }, + { + "name": "Windsurfing on Lake Garda", + "description": "Experience the thrill of gliding across the crystal-clear waters of Lake Garda, propelled by the wind in your sails. Whether you're a seasoned windsurfer or a beginner eager to learn, the lake offers ideal conditions and stunning scenery. Rent equipment from one of the many windsurfing schools or centers dotted along the shoreline and embrace the invigorating sensation of harnessing the power of nature.", + "locationName": "Torbole", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "lake-garda", + "ref": "windsurfing-on-lake-garda", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_windsurfing-on-lake-garda.jpg" + }, + { + "name": "Hiking in the Mountains", + "description": "Lace up your hiking boots and embark on an adventure through the breathtaking mountain trails surrounding Lake Garda. Explore the scenic landscapes of Monte Baldo, offering panoramic views of the lake and surrounding valleys. Hike amidst lush forests, discover hidden waterfalls, and breathe in the fresh mountain air. Choose from a variety of trails, catering to different fitness levels and interests.", + "locationName": "Monte Baldo", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-garda", + "ref": "hiking-in-the-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_hiking-in-the-mountains.jpg" + }, + { + "name": "Romantic Boat Tour", + "description": "Indulge in a romantic escape with a private boat tour on Lake Garda. Cruise along the shimmering waters, surrounded by picturesque villages and stunning natural landscapes. Savor a glass of local wine as you admire the breathtaking views and create unforgettable memories with your loved one. Opt for a sunset tour to witness the magical colors painting the sky as the sun dips below the horizon.", + "locationName": "Lake Garda", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "lake-garda", + "ref": "romantic-boat-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_romantic-boat-tour.jpg" + }, + { + "name": "Exploring Charming Towns", + "description": "Embark on a journey through the charming towns that dot the shores of Lake Garda. Wander through the narrow streets of Sirmione, known for its Scaliger Castle and thermal baths. Discover the colorful houses and lively atmosphere of Riva del Garda. Explore the historic center of Malcesine, with its medieval castle and cable car ride to Monte Baldo. Each town offers a unique blend of history, culture, and local charm.", + "locationName": "Sirmione, Riva del Garda, Malcesine", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-garda", + "ref": "exploring-charming-towns", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_exploring-charming-towns.jpg" + }, + { + "name": "Wine Tasting Experience", + "description": "Indulge in the flavors of the region with a delightful wine tasting experience. Visit local vineyards and wineries, where you can sample a variety of exquisite wines, from crisp whites to full-bodied reds. Learn about the winemaking process, the unique characteristics of the grapes grown in the area, and the passion that goes into every bottle. Pair your wine with delicious local cheeses and cured meats for a truly unforgettable culinary experience.", + "locationName": "Bardolino, Lugana", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "lake-garda", + "ref": "wine-tasting-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_wine-tasting-experience.jpg" + }, + { + "name": "Paragliding Over Lake Garda", + "description": "Experience the thrill of soaring high above the stunning landscape of Lake Garda on a tandem paragliding flight. Enjoy breathtaking panoramic views of the crystal-clear lake, surrounding mountains, and charming villages as you glide peacefully through the air. This unforgettable adventure is perfect for thrill-seekers and nature lovers alike.", + "locationName": "Monte Baldo", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "lake-garda", + "ref": "paragliding-over-lake-garda", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_paragliding-over-lake-garda.jpg" + }, + { + "name": "Canyoning in the Dolomites", + "description": "Embark on an exhilarating canyoning adventure in the rugged canyons of the Dolomites near Lake Garda. Descend through cascading waterfalls, rappel down rocky cliffs, and swim through crystal-clear pools. This action-packed activity is perfect for adventurous travelers seeking an adrenaline rush.", + "locationName": "Dolomites", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "lake-garda", + "ref": "canyoning-in-the-dolomites", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_canyoning-in-the-dolomites.jpg" + }, + { + "name": "Kayaking on Lake Garda", + "description": "Explore the tranquil waters of Lake Garda at your own pace with a leisurely kayak tour. Paddle along the scenic shoreline, discover hidden coves, and enjoy the peacefulness of the surrounding nature. Kayaking is a great way to experience the beauty of the lake while getting some exercise.", + "locationName": "Various locations around the lake", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-garda", + "ref": "kayaking-on-lake-garda", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_kayaking-on-lake-garda.jpg" + }, + { + "name": "Visit the Medieval Scaliger Castle", + "description": "Step back in time with a visit to the impressive Scaliger Castle in Sirmione. Explore the historic fortress, climb the tower for panoramic views of the lake, and learn about the fascinating history of the region. This cultural experience is perfect for history buffs and architecture enthusiasts.", + "locationName": "Sirmione", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-garda", + "ref": "visit-the-medieval-scaliger-castle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_visit-the-medieval-scaliger-castle.jpg" + }, + { + "name": "Indulge in Gelato and Italian Cuisine", + "description": "No trip to Italy is complete without indulging in delicious gelato and authentic Italian cuisine. Explore the charming towns around Lake Garda and discover local gelaterias, trattorias, and pizzerias. Savor the flavors of fresh pasta, regional specialties, and of course, creamy gelato.", + "locationName": "Various towns around the lake", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-garda", + "ref": "indulge-in-gelato-and-italian-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_indulge-in-gelato-and-italian-cuisine.jpg" + }, + { + "name": "Swimming and Sunbathing at Baia delle Sirene", + "description": "Spend a relaxing day soaking up the Mediterranean sun and taking refreshing dips in the crystal-clear waters of Baia delle Sirene. This picturesque bay, known as the \"Bay of the Sirens,\" offers stunning views, calm waters, and a serene atmosphere, making it an ideal spot for swimming, sunbathing, and simply unwinding.", + "locationName": "Baia delle Sirene", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "lake-garda", + "ref": "swimming-and-sunbathing-at-baia-delle-sirene", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_swimming-and-sunbathing-at-baia-delle-sirene.jpg" + }, + { + "name": "Cycling Along the Lakeside", + "description": "Embark on a scenic cycling adventure along the picturesque shores of Lake Garda. Rent a bike and explore the dedicated cycling paths that wind through charming villages, offering breathtaking views of the lake and surrounding mountains. Stop for a picnic lunch amidst the vineyards or enjoy a refreshing gelato in a local cafe.", + "locationName": "Lake Garda", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-garda", + "ref": "cycling-along-the-lakeside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_cycling-along-the-lakeside.jpg" + }, + { + "name": "Visit the Vittoriale degli Italiani", + "description": "Immerse yourself in history and culture at the Vittoriale degli Italiani, the former estate of the renowned Italian poet Gabriele d'Annunzio. Explore the opulent villa, its extensive gardens, and unique museum collections, including a warship and an open-air theater. This fascinating complex offers a glimpse into the life and legacy of a prominent figure in Italian history.", + "locationName": "Gardone Riviera", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-garda", + "ref": "visit-the-vittoriale-degli-italiani", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_visit-the-vittoriale-degli-italiani.jpg" + }, + { + "name": "Take a Cooking Class", + "description": "Discover the secrets of Italian cuisine by taking a cooking class. Learn to prepare traditional dishes like fresh pasta, risotto, and regional specialties under the guidance of a local chef. Enjoy the fruits of your labor with a delicious meal paired with regional wines, and take home newfound culinary skills to impress your friends and family.", + "locationName": "Various locations", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "lake-garda", + "ref": "take-a-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_take-a-cooking-class.jpg" + }, + { + "name": "Explore Grotte di Catullo", + "description": "Step back in time and explore the ruins of Grotte di Catullo, an ancient Roman villa dating back to the 1st century BC. Wander through the remains of this once-luxurious residence, marvel at its impressive architecture, and enjoy panoramic views of Lake Garda. This archaeological site offers a fascinating glimpse into the region's rich history.", + "locationName": "Sirmione", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-garda", + "ref": "explore-grotte-di-catullo", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_explore-grotte-di-catullo.jpg" + }, + { + "name": "Horseback Riding in the Hills", + "description": "Embark on a scenic horseback riding adventure through the rolling hills surrounding Lake Garda. Experienced guides will lead you on trails offering breathtaking views of the lake and surrounding landscapes. This activity is perfect for nature lovers and those seeking a unique way to explore the region.", + "locationName": "Various stables around Lake Garda", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-garda", + "ref": "horseback-riding-in-the-hills", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_horseback-riding-in-the-hills.jpg" + }, + { + "name": "Visit Gardaland Amusement Park", + "description": "Experience thrills and excitement at Gardaland, one of Europe's most popular amusement parks. Enjoy a variety of rides, shows, and attractions suitable for all ages. From thrilling roller coasters to enchanting fantasy lands, Gardaland offers a fun-filled day for the whole family.", + "locationName": "Castelnuovo del Garda", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "lake-garda", + "ref": "visit-gardaland-amusement-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_visit-gardaland-amusement-park.jpg" + }, + { + "name": "Take a Day Trip to Verona", + "description": "Explore the romantic city of Verona, famous for being the setting of Shakespeare's Romeo and Juliet. Visit Juliet's balcony, marvel at the ancient Roman Arena, and wander through charming piazzas. Verona is a must-visit destination for history buffs and hopeless romantics alike.", + "locationName": "Verona", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-garda", + "ref": "take-a-day-trip-to-verona", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_take-a-day-trip-to-verona.jpg" + }, + { + "name": "Indulge in a Spa Day", + "description": "Unwind and rejuvenate with a luxurious spa day at one of Lake Garda's many wellness centers. Enjoy a variety of treatments, such as massages, facials, and body wraps, while taking in the serene surroundings. This is the perfect way to relax and recharge during your vacation.", + "locationName": "Various spa resorts around Lake Garda", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "lake-garda", + "ref": "indulge-in-a-spa-day", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_indulge-in-a-spa-day.jpg" + }, + { + "name": "Go on a Wine Tour and Tasting", + "description": "Discover the rich winemaking traditions of the Lake Garda region. Visit local vineyards, learn about the winemaking process, and indulge in tastings of renowned Italian wines. This experience is perfect for wine enthusiasts and those looking to savor the flavors of the region.", + "locationName": "Various wineries around Lake Garda", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "lake-garda", + "ref": "go-on-a-wine-tour-and-tasting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-garda_go-on-a-wine-tour-and-tasting.jpg" + }, + { + "name": "Hiking the Rubicon Trail", + "description": "Embark on a breathtaking journey along the Rubicon Trail, a moderate 4.5-mile hike offering panoramic views of the lake and surrounding mountains. Discover hidden coves, cascading waterfalls, and the iconic Emerald Bay. Pack a picnic and enjoy lunch with a view.", + "locationName": "D.L. Bliss State Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-tahoe", + "ref": "hiking-the-rubicon-trail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_hiking-the-rubicon-trail.jpg" + }, + { + "name": "Kayaking or Paddleboarding on the Lake", + "description": "Experience the tranquility of Lake Tahoe from a kayak or paddleboard. Glide across the crystal-clear water, surrounded by stunning mountain scenery. Rent equipment from various locations around the lake and explore hidden coves or simply relax and soak up the sun.", + "locationName": "Various locations around Lake Tahoe", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-tahoe", + "ref": "kayaking-or-paddleboarding-on-the-lake", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_kayaking-or-paddleboarding-on-the-lake.jpg" + }, + { + "name": "Scenic Gondola Ride at Heavenly Mountain Resort", + "description": "Soar above the treetops in a scenic gondola ride at Heavenly Mountain Resort. Enjoy panoramic views of Lake Tahoe and the surrounding Sierra Nevada mountains. At the observation deck, capture breathtaking photos and learn about the area's history and ecology.", + "locationName": "Heavenly Mountain Resort", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-tahoe", + "ref": "scenic-gondola-ride-at-heavenly-mountain-resort", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_scenic-gondola-ride-at-heavenly-mountain-resort.jpg" + }, + { + "name": "Exploring Emerald Bay State Park", + "description": "Discover the jewel of Lake Tahoe, Emerald Bay State Park. Visit Vikingsholm, a Scandinavian-inspired castle, and learn about its fascinating history. Hike down to the shore of Emerald Bay and take a dip in the refreshing water or simply relax on the beach and enjoy the views.", + "locationName": "Emerald Bay State Park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-tahoe", + "ref": "exploring-emerald-bay-state-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_exploring-emerald-bay-state-park.jpg" + }, + { + "name": "Indulging in Local Cuisine and Craft Beer", + "description": "After a day of adventure, treat yourself to Lake Tahoe's culinary scene. Explore the diverse restaurants offering fresh seafood, farm-to-table dishes, and international flavors. Sample local craft beers at breweries with stunning lake views and enjoy live music at vibrant bars and pubs.", + "locationName": "Various locations around Lake Tahoe", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 3, + "destinationRef": "lake-tahoe", + "ref": "indulging-in-local-cuisine-and-craft-beer", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_indulging-in-local-cuisine-and-craft-beer.jpg" + }, + { + "name": "Biking the Flume Trail", + "description": "Embark on an unforgettable mountain biking experience along the Flume Trail, renowned for its breathtaking vistas of Lake Tahoe. This 14-mile singletrack trail winds through scenic forests and along dramatic cliffs, offering thrilling challenges and rewarding panoramas for intermediate to advanced riders.", + "locationName": "Flume Trail", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "lake-tahoe", + "ref": "biking-the-flume-trail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_biking-the-flume-trail.jpg" + }, + { + "name": "Sunset Cruise on Lake Tahoe", + "description": "Experience the magic of Lake Tahoe at twilight with a relaxing sunset cruise. Sail across the pristine waters as the sky transforms into a canvas of vibrant colors, casting a golden glow on the surrounding mountains. Many cruises offer dinner and drinks, creating a romantic and unforgettable evening.", + "locationName": "Lake Tahoe", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "lake-tahoe", + "ref": "sunset-cruise-on-lake-tahoe", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_sunset-cruise-on-lake-tahoe.jpg" + }, + { + "name": "Exploring Vikingsholm Castle", + "description": "Step back in time with a visit to Vikingsholm, a unique Scandinavian-inspired castle nestled on the shores of Emerald Bay. Explore the historic mansion, admire its intricate architecture and period furnishings, and learn about its fascinating history. The surrounding gardens and stunning views of the bay add to the enchanting experience.", + "locationName": "Emerald Bay State Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-tahoe", + "ref": "exploring-vikingsholm-castle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_exploring-vikingsholm-castle.jpg" + }, + { + "name": "Stargazing at the Heavenly Mountain Observatory", + "description": "Escape the city lights and delve into the wonders of the cosmos at the Heavenly Mountain Observatory. Join a guided stargazing tour and observe celestial objects through powerful telescopes, learning about constellations, planets, and galaxies from expert astronomers. The clear mountain air and high altitude provide exceptional viewing conditions.", + "locationName": "Heavenly Mountain Resort", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-tahoe", + "ref": "stargazing-at-the-heavenly-mountain-observatory", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_stargazing-at-the-heavenly-mountain-observatory.jpg" + }, + { + "name": "Visiting the Tallac Historic Site", + "description": "Immerse yourself in the rich history of Lake Tahoe at the Tallac Historic Site. Explore the preserved estates of wealthy families from the early 20th century, including the Pope Estate, Baldwin Estate, and Valhalla Estate. Learn about the region's logging and tourism industries, and enjoy captivating views of the lake.", + "locationName": "Tallac Historic Site", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-tahoe", + "ref": "visiting-the-tallac-historic-site", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_visiting-the-tallac-historic-site.jpg" + }, + { + "name": "Horseback Riding in the Sierras", + "description": "Embark on a scenic horseback riding adventure through the picturesque trails of the Sierra Nevada mountains. Explore alpine meadows, dense forests, and enjoy breathtaking views of Lake Tahoe. Several stables in the area offer guided tours for all skill levels, making it a perfect activity for families and nature lovers.", + "locationName": "Camp Richardson Corral or Zephyr Cove Stables", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-tahoe", + "ref": "horseback-riding-in-the-sierras", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_horseback-riding-in-the-sierras.jpg" + }, + { + "name": "Rock Climbing and Bouldering", + "description": "Challenge yourself with rock climbing and bouldering at one of the many renowned climbing areas around Lake Tahoe. Whether you're a beginner or an experienced climber, you'll find routes that suit your skill level. Donner Summit, Lover's Leap, and the Tahoe Basin offer stunning natural landscapes and thrilling climbing experiences.", + "locationName": "Donner Summit, Lover's Leap, or Tahoe Basin", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "lake-tahoe", + "ref": "rock-climbing-and-bouldering", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_rock-climbing-and-bouldering.jpg" + }, + { + "name": "Hot Air Balloon Ride over Lake Tahoe", + "description": "Experience the magic of Lake Tahoe from a unique perspective with a hot air balloon ride. Soar above the crystal-clear waters and enjoy panoramic views of the surrounding mountains and forests. This unforgettable experience is perfect for a romantic getaway or a special occasion.", + "locationName": "Lake Tahoe Balloons or Tahoe Hot Air Balloons", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "lake-tahoe", + "ref": "hot-air-balloon-ride-over-lake-tahoe", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_hot-air-balloon-ride-over-lake-tahoe.jpg" + }, + { + "name": "Relaxation and Rejuvenation at a Spa Resort", + "description": "Indulge in a day of pampering and relaxation at one of Lake Tahoe's luxurious spa resorts. Choose from a variety of treatments, including massages, facials, and body wraps, while enjoying the serene ambiance and breathtaking views. Several resorts offer wellness packages with yoga classes, meditation sessions, and healthy dining options.", + "locationName": "The Ritz-Carlton, Lake Tahoe or Hyatt Regency Lake Tahoe Resort, Spa and Casino", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "lake-tahoe", + "ref": "relaxation-and-rejuvenation-at-a-spa-resort", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_relaxation-and-rejuvenation-at-a-spa-resort.jpg" + }, + { + "name": "Gaming Fun at the Casinos", + "description": "Experience the excitement of casino gaming in South Lake Tahoe. Try your luck at slot machines, table games, or poker tournaments. The casinos also offer live entertainment, nightclubs, and fine dining restaurants, providing a vibrant nightlife scene.", + "locationName": "Harrah's Lake Tahoe or Hard Rock Hotel & Casino Lake Tahoe", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "lake-tahoe", + "ref": "gaming-fun-at-the-casinos", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_gaming-fun-at-the-casinos.jpg" + }, + { + "name": "Skiing and Snowboarding at World-Class Resorts", + "description": "Experience the thrill of gliding down the slopes at renowned ski resorts like Palisades Tahoe, Heavenly, and Northstar. With diverse terrain for all skill levels, enjoy powdery snow, stunning views, and après-ski activities.", + "locationName": "Various ski resorts around Lake Tahoe", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "lake-tahoe", + "ref": "skiing-and-snowboarding-at-world-class-resorts", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_skiing-and-snowboarding-at-world-class-resorts.jpg" + }, + { + "name": "Scenic Drives and Photography Tours", + "description": "Embark on a scenic drive along the lake's shoreline, capturing breathtaking vistas and iconic landmarks. Consider a photography tour to learn tips and tricks for capturing the perfect shot of Emerald Bay, Sand Harbor, or Zephyr Cove.", + "locationName": "Lake Tahoe Scenic Drive", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-tahoe", + "ref": "scenic-drives-and-photography-tours", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_scenic-drives-and-photography-tours.jpg" + }, + { + "name": "Fishing Adventures on the Lake", + "description": "Cast your line and try your luck at catching trout, salmon, or kokanee salmon. Charter a fishing boat with a local guide or enjoy a relaxing day of fishing from the shore.", + "locationName": "Various locations around Lake Tahoe", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "lake-tahoe", + "ref": "fishing-adventures-on-the-lake", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_fishing-adventures-on-the-lake.jpg" + }, + { + "name": "Exploring the Charming Towns", + "description": "Discover the unique character of towns like Tahoe City, South Lake Tahoe, and Truckee. Explore local shops, art galleries, and historical sites, and enjoy the vibrant atmosphere of these mountain communities.", + "locationName": "Tahoe City, South Lake Tahoe, Truckee", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-tahoe", + "ref": "exploring-the-charming-towns", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_exploring-the-charming-towns.jpg" + }, + { + "name": "Snowshoeing and Cross-Country Skiing", + "description": "Venture into the winter wonderland on snowshoes or cross-country skis. Explore serene trails through snow-covered forests, enjoying the tranquility of nature and the crisp mountain air.", + "locationName": "Various trails around Lake Tahoe", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "lake-tahoe", + "ref": "snowshoeing-and-cross-country-skiing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lake-tahoe_snowshoeing-and-cross-country-skiing.jpg" + }, + { + "name": "Explore the UNESCO World Heritage City of Luang Prabang", + "description": "Step back in time and wander through the charming streets of Luang Prabang, a UNESCO World Heritage city renowned for its well-preserved architecture, gilded temples, and serene atmosphere. Visit the magnificent Wat Xieng Thong, a 16th-century temple complex adorned with intricate mosaics and carvings, and climb Mount Phousi for panoramic views of the city at sunset.", + "locationName": "Luang Prabang", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "laos", + "ref": "explore-the-unesco-world-heritage-city-of-luang-prabang", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_explore-the-unesco-world-heritage-city-of-luang-prabang.jpg" + }, + { + "name": "Kayak Down the Mekong River", + "description": "Embark on a scenic kayaking adventure down the Mekong River, the lifeblood of Laos. Paddle through tranquil waters, passing by lush landscapes, traditional villages, and hidden caves. Opt for a half-day or full-day trip, and immerse yourself in the natural beauty and local life along the riverbanks.", + "locationName": "Mekong River", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "laos", + "ref": "kayak-down-the-mekong-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_kayak-down-the-mekong-river.jpg" + }, + { + "name": "Discover the Kuang Si Falls", + "description": "Escape to the breathtaking Kuang Si Falls, a multi-tiered waterfall cascading through turquoise pools in the heart of the jungle. Take a refreshing dip in the cool waters, hike to the top of the falls for stunning views, and visit the nearby bear rescue center.", + "locationName": "Kuang Si Falls", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "laos", + "ref": "discover-the-kuang-si-falls", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_discover-the-kuang-si-falls.jpg" + }, + { + "name": "Immerse Yourself in Local Culture at a Traditional Village", + "description": "Venture beyond the tourist trail and visit a traditional Laotian village to experience authentic local life. Learn about traditional crafts like weaving and pottery, sample delicious home-cooked Lao cuisine, and engage with friendly villagers to gain insights into their customs and traditions.", + "locationName": "Various villages near Luang Prabang or Vang Vieng", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "laos", + "ref": "immerse-yourself-in-local-culture-at-a-traditional-village", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_immerse-yourself-in-local-culture-at-a-traditional-village.jpg" + }, + { + "name": "Trekking in the Northern Mountains", + "description": "Embark on a multi-day trek through the remote mountains of northern Laos, home to diverse ethnic minority groups and breathtaking landscapes. Experience the thrill of hiking through lush jungles, rice paddies, and traditional villages, while encountering unique cultures and breathtaking vistas.", + "locationName": "Northern Laos (Luang Namtha, Muang Sing)", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "laos", + "ref": "trekking-in-the-northern-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_trekking-in-the-northern-mountains.jpg" + }, + { + "name": "Biking the Bolaven Plateau", + "description": "Explore the Bolaven Plateau by bicycle, a scenic region known for its coffee plantations, waterfalls, and ethnic minority villages. Enjoy the fresh air and stunning views as you pedal through rolling hills, stopping to sample delicious local coffee and immerse yourself in the unique culture of the region.", + "locationName": "Bolaven Plateau (Pakse, Tad Lo)", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "laos", + "ref": "biking-the-bolaven-plateau", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_biking-the-bolaven-plateau.jpg" + }, + { + "name": "Living Land Farm Rice Experience", + "description": "Get your hands dirty and learn about traditional rice farming at the Living Land Farm near Luang Prabang. Participate in activities like planting, harvesting, and threshing rice, gaining insight into the importance of rice cultivation in Lao culture and the sustainable practices employed by local farmers.", + "locationName": "Living Land Farm (Luang Prabang)", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "laos", + "ref": "living-land-farm-rice-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_living-land-farm-rice-experience.jpg" + }, + { + "name": "Sunset Cruise on the Mekong River", + "description": "Embark on a relaxing sunset cruise along the Mekong River, enjoying panoramic views of the city, lush landscapes, and traditional villages. Sip on refreshing drinks and savor delicious local snacks as you witness the magical transformation of the sky at dusk.", + "locationName": "Mekong River (Luang Prabang, Vientiane)", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "laos", + "ref": "sunset-cruise-on-the-mekong-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_sunset-cruise-on-the-mekong-river.jpg" + }, + { + "name": "Cooking Class and Market Tour", + "description": "Delve into the world of Lao cuisine with a cooking class and market tour. Visit a bustling local market to discover fresh ingredients and learn about traditional cooking techniques, then prepare and enjoy a delicious meal under the guidance of a skilled chef.", + "locationName": "Luang Prabang, Vientiane", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "laos", + "ref": "cooking-class-and-market-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_cooking-class-and-market-tour.jpg" + }, + { + "name": "Elephant Encounter at Mandalao Elephant Conservation", + "description": "Embark on a responsible and ethical elephant experience at Mandalao Elephant Conservation. Learn about elephant behavior, observe these gentle giants in their natural habitat, and even assist with their care during bath time. This unforgettable encounter supports the conservation and well-being of elephants in Laos.", + "locationName": "Mandalao Elephant Conservation", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "laos", + "ref": "elephant-encounter-at-mandalao-elephant-conservation", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_elephant-encounter-at-mandalao-elephant-conservation.jpg" + }, + { + "name": "Alms Giving Ceremony in Luang Prabang", + "description": "Rise early to witness the sacred Buddhist tradition of alms giving in Luang Prabang. Observe saffron-clad monks walk barefoot through the streets as locals offer them sticky rice and other food. This serene and spiritual experience provides a glimpse into Lao culture and religious practices.", + "locationName": "Luang Prabang", + "duration": 1, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "laos", + "ref": "alms-giving-ceremony-in-luang-prabang", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_alms-giving-ceremony-in-luang-prabang.jpg" + }, + { + "name": "Tham Kong Lo Cave Exploration", + "description": "Venture into the depths of Tham Kong Lo, one of Southeast Asia's most impressive caves. Take a boat ride through the cave's cavernous chambers, marvel at the stunning stalactites and stalagmites, and witness the emerald-colored pool illuminated by sunlight. This adventurous experience is perfect for those seeking natural wonders.", + "locationName": "Tham Kong Lo", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "laos", + "ref": "tham-kong-lo-cave-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_tham-kong-lo-cave-exploration.jpg" + }, + { + "name": "Relaxing Herbal Sauna and Massage", + "description": "Indulge in a traditional Lao herbal sauna and massage for the ultimate relaxation experience. Enjoy the therapeutic benefits of local herbs in a steam sauna followed by a soothing massage that will rejuvenate your body and mind. This is the perfect way to unwind after a day of exploring.", + "locationName": "Various spas and wellness centers", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "laos", + "ref": "relaxing-herbal-sauna-and-massage", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_relaxing-herbal-sauna-and-massage.jpg" + }, + { + "name": "Night Market Shopping in Vientiane", + "description": "Immerse yourself in the vibrant atmosphere of the Vientiane Night Market. Browse through a wide array of handicrafts, souvenirs, textiles, and local street food. This bustling market offers a unique opportunity to experience Lao culture and find unique treasures to take home.", + "locationName": "Vientiane Night Market", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "laos", + "ref": "night-market-shopping-in-vientiane", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_night-market-shopping-in-vientiane.jpg" + }, + { + "name": "Jungle Zipline Adventure", + "description": "Soar through the lush rainforest canopy on a thrilling zipline adventure! Experience the exhilaration of flying between platforms, enjoying breathtaking views of the jungle landscape below. This activity is perfect for adrenaline seekers and nature enthusiasts looking for a unique perspective of Laos' natural beauty.", + "locationName": "Northern Laos", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "laos", + "ref": "jungle-zipline-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_jungle-zipline-adventure.jpg" + }, + { + "name": " Gibbon Experience Treehouse Stay", + "description": "Embark on an unforgettable overnight adventure in the Bokeo Nature Reserve, staying in a luxurious treehouse nestled high above the jungle floor. Trek through pristine forests, encounter gibbons and other wildlife, and wake up to the sounds of nature in this truly immersive experience.", + "locationName": "Bokeo Nature Reserve", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "laos", + "ref": "-gibbon-experience-treehouse-stay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_-gibbon-experience-treehouse-stay.jpg" + }, + { + "name": "Traditional Lao Pottery Workshop", + "description": "Get hands-on with Lao culture by participating in a traditional pottery workshop. Learn the ancient techniques of shaping clay, creating intricate designs, and firing your own unique piece of pottery to take home as a souvenir.", + "locationName": "Luang Prabang", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "laos", + "ref": "traditional-lao-pottery-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_traditional-lao-pottery-workshop.jpg" + }, + { + "name": "Beerlao Brewery Tour", + "description": "Discover the secrets behind Laos' most famous beer, Beerlao, with a visit to the brewery. Learn about the brewing process, from the selection of ingredients to bottling, and enjoy a tasting of different Beerlao varieties. This tour is perfect for beer enthusiasts and those curious about local industries.", + "locationName": "Vientiane", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 2, + "destinationRef": "laos", + "ref": "beerlao-brewery-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_beerlao-brewery-tour.jpg" + }, + { + "name": "Explore the Plain of Jars", + "description": "Journey to the mysterious Plain of Jars in Xieng Khouang Province, a unique archaeological site with thousands of ancient stone jars scattered across the landscape. Learn about the theories surrounding their origin and purpose, and marvel at the breathtaking scenery of the surrounding plains.", + "locationName": "Xieng Khouang Province", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "laos", + "ref": "explore-the-plain-of-jars", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/laos_explore-the-plain-of-jars.jpg" + }, + { + "name": "Hike to Reinebringen's Peak", + "description": "Embark on a challenging yet rewarding hike to the summit of Reinebringen, offering panoramic views of the Reinefjord, fishing villages, and surrounding mountains. Capture stunning photos of the iconic Lofoten landscape.", + "locationName": "Reinebringen Mountain", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "lofoten-islands", + "ref": "hike-to-reinebringen-s-peak", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_hike-to-reinebringen-s-peak.jpg" + }, + { + "name": "Kayak in the Fjords", + "description": "Paddle through the tranquil waters of the Lofoten fjords, surrounded by towering cliffs and dramatic scenery. Explore hidden coves, observe marine life, and experience the serenity of the Arctic wilderness.", + "locationName": "Nusfjord or Reinefjord", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lofoten-islands", + "ref": "kayak-in-the-fjords", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_kayak-in-the-fjords.jpg" + }, + { + "name": "Visit the Lofotr Viking Museum", + "description": "Step back in time at the Lofotr Viking Museum, featuring a reconstructed Viking longhouse and exhibits showcasing Viking history, culture, and daily life. Participate in interactive activities and learn about the fascinating legacy of the Vikings in the Lofoten Islands.", + "locationName": "Borg", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lofoten-islands", + "ref": "visit-the-lofotr-viking-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_visit-the-lofotr-viking-museum.jpg" + }, + { + "name": "Chase the Northern Lights", + "description": "Experience the magical spectacle of the Aurora Borealis dancing across the night sky. Join a guided tour or find a secluded spot away from light pollution for optimal viewing. Witness the vibrant colors and ethereal beauty of this natural phenomenon.", + "locationName": "Various locations away from light pollution", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "lofoten-islands", + "ref": "chase-the-northern-lights", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_chase-the-northern-lights.jpg" + }, + { + "name": "Indulge in Fresh Seafood", + "description": "Savor the taste of the freshest seafood at local restaurants or fishing villages. Sample Lofoten's specialties, such as stockfish, cod, salmon, and Arctic char. Enjoy the unique culinary experience of the islands.", + "locationName": "Various restaurants and villages", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lofoten-islands", + "ref": "indulge-in-fresh-seafood", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_indulge-in-fresh-seafood.jpg" + }, + { + "name": "Go on a RIB Boat Safari", + "description": "Embark on a thrilling RIB (rigid inflatable boat) safari through the stunning Lofoten archipelago. Zip across the waves, feeling the wind in your hair as you explore hidden coves, dramatic cliffs, and encounter diverse marine life like seals, sea eagles, and even whales.", + "locationName": "Various locations around the islands", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lofoten-islands", + "ref": "go-on-a-rib-boat-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_go-on-a-rib-boat-safari.jpg" + }, + { + "name": "Take a Photography Tour", + "description": "Capture the breathtaking beauty of the Lofoten Islands on a guided photography tour. Learn tips and tricks from a professional photographer while visiting iconic locations like Hamnøy, Reine, and Sakrisøy. Capture the perfect shot of charming fishing villages, dramatic mountains, and the mesmerizing Northern Lights (depending on the season).", + "locationName": "Various locations around the islands", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lofoten-islands", + "ref": "take-a-photography-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_take-a-photography-tour.jpg" + }, + { + "name": "Visit the Lofoten Aquarium", + "description": "Discover the fascinating marine life of the Arctic at the Lofoten Aquarium. Observe playful seals, colorful fish, and other intriguing creatures native to the region. Learn about the ecosystem of the Lofoten Islands and the importance of ocean conservation.", + "locationName": "Kabelvåg", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "lofoten-islands", + "ref": "visit-the-lofoten-aquarium", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_visit-the-lofoten-aquarium.jpg" + }, + { + "name": "Experience the Magic of the Lofoten International Art Festival", + "description": "Immerse yourself in the vibrant art scene of the Lofoten Islands during the annual Lofoten International Art Festival (LIAF). Explore exhibitions showcasing contemporary art from local and international artists, attend workshops, and enjoy cultural events in unique venues across the islands.", + "locationName": "Various locations around the islands", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lofoten-islands", + "ref": "experience-the-magic-of-the-lofoten-international-art-festival", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_experience-the-magic-of-the-lofoten-international-art-festival.jpg" + }, + { + "name": "Go Fishing with Local Fishermen", + "description": "Embark on an authentic fishing adventure with experienced local fishermen. Learn traditional fishing techniques, try your hand at catching cod, haddock, or other species, and experience the thrill of reeling in your own fresh seafood.", + "locationName": "Various locations around the islands", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lofoten-islands", + "ref": "go-fishing-with-local-fishermen", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_go-fishing-with-local-fishermen.jpg" + }, + { + "name": "Go horseback riding on the beach", + "description": "Experience the thrill of horseback riding along the pristine beaches of the Lofoten Islands. Feel the wind in your hair as you gallop across the sand, taking in the breathtaking views of the surrounding mountains and ocean. Several local stables offer guided tours for all skill levels, making it a perfect activity for families or solo travelers.", + "locationName": "Gimsøya Island", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lofoten-islands", + "ref": "go-horseback-riding-on-the-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_go-horseback-riding-on-the-beach.jpg" + }, + { + "name": "Explore charming fishing villages", + "description": "Wander through the picturesque fishing villages that dot the Lofoten Islands. Each village boasts its unique charm, with colorful wooden houses, traditional fishing boats, and friendly locals. Visit Henningsvær, known as the Venice of the North, or Nusfjord, a UNESCO World Heritage Site, to experience the authentic culture and history of the islands. ", + "locationName": "Henningsvær, Nusfjord", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "lofoten-islands", + "ref": "explore-charming-fishing-villages", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_explore-charming-fishing-villages.jpg" + }, + { + "name": "Take a scenic bike ride", + "description": "Embark on a scenic bike ride along the National Tourist Route Lofoten, which stretches across the archipelago. Enjoy the fresh air and stunning landscapes as you pedal past towering mountains, dramatic fjords, and charming villages. Rent a bike from various rental shops and choose a route that suits your fitness level and interests.", + "locationName": "National Tourist Route Lofoten", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lofoten-islands", + "ref": "take-a-scenic-bike-ride", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_take-a-scenic-bike-ride.jpg" + }, + { + "name": "Visit the Lofoten War Memorial Museum", + "description": "Delve into the history of World War II at the Lofoten War Memorial Museum. Learn about the German occupation of Norway and the resistance movement that fought for liberation. The museum exhibits artifacts, photographs, and documents that provide a glimpse into the wartime experiences of the Lofoten people.", + "locationName": "Svolvær", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "lofoten-islands", + "ref": "visit-the-lofoten-war-memorial-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_visit-the-lofoten-war-memorial-museum.jpg" + }, + { + "name": "Indulge in local craft beer", + "description": "Discover the burgeoning craft beer scene in the Lofoten Islands. Visit local breweries like Lofotpils and Svolvær Ølkompani to sample a variety of unique and flavorful beers. Take a brewery tour to learn about the brewing process and enjoy a tasting session with fellow beer enthusiasts.", + "locationName": "Svolvær, Henningsvær", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 3, + "destinationRef": "lofoten-islands", + "ref": "indulge-in-local-craft-beer", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_indulge-in-local-craft-beer.jpg" + }, + { + "name": "Join a Whale Watching Excursion", + "description": "Embark on an unforgettable whale watching adventure in the crystal-clear waters surrounding the Lofoten Islands. Witness majestic humpback whales, orcas, and other marine life as they breach, tail-slap, and play in their natural habitat. Knowledgeable guides provide insights into these fascinating creatures and the delicate ecosystem they inhabit.", + "locationName": "Andenes or Stø", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "lofoten-islands", + "ref": "join-a-whale-watching-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_join-a-whale-watching-excursion.jpg" + }, + { + "name": "Experience Midnight Sun Phenomenon", + "description": "During the summer months, witness the magical phenomenon of the midnight sun. The sun remains above the horizon even at midnight, casting a surreal glow over the dramatic landscapes. Hike to a scenic viewpoint, enjoy a picnic under the golden light, or simply soak in the ethereal atmosphere.", + "locationName": "Reinebringen or Ryten", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "lofoten-islands", + "ref": "experience-midnight-sun-phenomenon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_experience-midnight-sun-phenomenon.jpg" + }, + { + "name": "Go on a Sea Eagle Safari", + "description": "Embark on a thrilling sea eagle safari, where you'll witness the majestic white-tailed eagles soaring through the sky. These magnificent birds of prey are a sight to behold, and you'll have the opportunity to capture stunning photos as they hunt for fish and glide effortlessly above the rugged coastline.", + "locationName": "Trollfjord or Raftsundet", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "lofoten-islands", + "ref": "go-on-a-sea-eagle-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_go-on-a-sea-eagle-safari.jpg" + }, + { + "name": "Unwind in a Traditional Sauna", + "description": "Experience the ultimate relaxation in a traditional Norwegian sauna. Immerse yourself in the warmth and let the steam soothe your muscles and melt away stress. Many saunas offer breathtaking views of the surrounding landscapes, allowing you to unwind in complete tranquility.", + "locationName": "Various locations throughout the islands", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "lofoten-islands", + "ref": "unwind-in-a-traditional-sauna", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_unwind-in-a-traditional-sauna.jpg" + }, + { + "name": "Learn to Surf in Unstad", + "description": "Catch a wave and experience the thrill of surfing in Unstad, a renowned surfing destination. Whether you're a beginner or an experienced surfer, the pristine beaches and consistent waves offer the perfect setting to ride the waves. Surf schools and equipment rentals are readily available.", + "locationName": "Unstad Beach", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lofoten-islands", + "ref": "learn-to-surf-in-unstad", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lofoten-islands_learn-to-surf-in-unstad.jpg" + }, + { + "name": "Mount Rinjani Trekking", + "description": "Embark on an unforgettable adventure by trekking up Mount Rinjani, an active volcano and the second-highest peak in Indonesia. Witness breathtaking sunrises, camp under the stars, and take a dip in the stunning crater lake. This challenging hike offers incredible rewards for those seeking an adventurous experience.", + "locationName": "Mount Rinjani National Park", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "lombok", + "ref": "mount-rinjani-trekking", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_mount-rinjani-trekking.jpg" + }, + { + "name": "Island Hopping in the Gili Islands", + "description": "Escape to paradise by exploring the three Gili Islands: Gili Trawangan, Gili Meno, and Gili Air. Each island offers a unique atmosphere, from the lively bars and restaurants of Gili Trawangan to the serene beaches and crystal-clear waters of Gili Meno. Enjoy snorkeling, diving, kayaking, or simply relaxing on the beach.", + "locationName": "Gili Islands", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lombok", + "ref": "island-hopping-in-the-gili-islands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_island-hopping-in-the-gili-islands.jpg" + }, + { + "name": "Surfing in Kuta Lombok", + "description": "Catch some waves in Kuta Lombok, a haven for surfers of all levels. With consistent swells and a variety of breaks, you'll find the perfect spot to ride the waves. Take a lesson from a local surf school or rent a board and explore the coastline.", + "locationName": "Kuta Lombok", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "lombok", + "ref": "surfing-in-kuta-lombok", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_surfing-in-kuta-lombok.jpg" + }, + { + "name": "Exploring Sasak Culture", + "description": "Immerse yourself in the rich culture of the Sasak people, the indigenous inhabitants of Lombok. Visit traditional villages like Sade and Rambitan to see their unique architecture, weaving techniques, and way of life. Learn about their customs and traditions, and perhaps even try some local delicacies.", + "locationName": "Sade and Rambitan villages", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lombok", + "ref": "exploring-sasak-culture", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_exploring-sasak-culture.jpg" + }, + { + "name": "Chasing Waterfalls", + "description": "Discover the enchanting waterfalls hidden throughout Lombok. Hike through lush jungles to reach cascading falls like Sendang Gile and Tiu Kelep, where you can take a refreshing dip in the cool pools below. These natural wonders offer a perfect escape from the heat and a chance to reconnect with nature.", + "locationName": "Sendang Gile and Tiu Kelep waterfalls", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "lombok", + "ref": "chasing-waterfalls", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_chasing-waterfalls.jpg" + }, + { + "name": "Scuba Diving and Snorkeling in the Gili Islands", + "description": "Dive into the crystal-clear waters of the Gili Islands and discover a vibrant underwater world teeming with marine life. Explore colorful coral reefs, swim alongside tropical fish, and encounter majestic sea turtles. Whether you're a seasoned diver or a beginner snorkeler, the Gili Islands offer unforgettable underwater adventures.", + "locationName": "Gili Islands", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "lombok", + "ref": "scuba-diving-and-snorkeling-in-the-gili-islands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_scuba-diving-and-snorkeling-in-the-gili-islands.jpg" + }, + { + "name": "Sunset Horseback Riding on the Beach", + "description": "Experience the magic of Lombok's coastline with a romantic horseback ride as the sun dips below the horizon. Trot along pristine beaches, feel the gentle sea breeze, and witness breathtaking views of the ocean painted in hues of orange and pink. This unforgettable experience is perfect for couples or anyone seeking a tranquil escape.", + "locationName": "Senggigi Beach or Kuta Beach", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "lombok", + "ref": "sunset-horseback-riding-on-the-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_sunset-horseback-riding-on-the-beach.jpg" + }, + { + "name": "Traditional Cooking Class", + "description": "Delve into the heart of Lombok's culinary scene with a hands-on cooking class. Learn the secrets of authentic Sasak dishes from local chefs, using fresh, aromatic ingredients. Master the art of creating flavorful curries, fragrant rice dishes, and spicy sambals. This immersive experience is a must for food enthusiasts and cultural explorers.", + "locationName": "Local villages or cooking schools", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "lombok", + "ref": "traditional-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_traditional-cooking-class.jpg" + }, + { + "name": "Visit the Narmada Water Palace", + "description": "Step back in time at the Narmada Water Palace, a historic royal garden built in the 18th century. Explore the intricate Hindu temples, serene pools, and lush gardens that once served as a summer retreat for the Balinese kings. Discover the fascinating legends and cultural significance of this architectural gem.", + "locationName": "Narmada Water Palace", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "lombok", + "ref": "visit-the-narmada-water-palace", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_visit-the-narmada-water-palace.jpg" + }, + { + "name": "Explore the Traditional Markets", + "description": "Immerse yourself in the vibrant atmosphere of Lombok's traditional markets. Wander through bustling stalls overflowing with exotic fruits, aromatic spices, handcrafted textiles, and unique souvenirs. Engage with friendly locals, practice your bargaining skills, and discover the authentic flavors and crafts of the island.", + "locationName": "Mandalika Market or Pasar Seni Senggigi", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "lombok", + "ref": "explore-the-traditional-markets", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_explore-the-traditional-markets.jpg" + }, + { + "name": "Kayaking in the Mangroves", + "description": "Embark on a serene kayaking adventure through the lush mangrove forests of Sekotong. Glide through the calm waters, surrounded by the vibrant ecosystem and diverse birdlife. This eco-friendly activity allows you to connect with nature and witness the unique beauty of Lombok's coastal landscapes.", + "locationName": "Sekotong", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "lombok", + "ref": "kayaking-in-the-mangroves", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_kayaking-in-the-mangroves.jpg" + }, + { + "name": "Visit the Pink Beach", + "description": "Discover the natural wonder of Pink Beach, located on the southeastern coast of Lombok. The sand gets its rosy hue from microscopic red coral fragments, creating a breathtaking spectacle. Relax on the beach, swim in the crystal-clear waters, or go snorkeling to explore the vibrant underwater world.", + "locationName": "Tangsi Beach", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lombok", + "ref": "visit-the-pink-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_visit-the-pink-beach.jpg" + }, + { + "name": "Cycling through the Rice Paddies", + "description": "Experience the authentic charm of Lombok's countryside by taking a leisurely bike ride through the verdant rice paddies. Pedal along scenic paths, witness local farmers tending to their crops, and immerse yourself in the peaceful atmosphere of rural life. This activity offers a unique perspective on Lombok's natural beauty and cultural heritage.", + "locationName": "Tetebatu", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "lombok", + "ref": "cycling-through-the-rice-paddies", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_cycling-through-the-rice-paddies.jpg" + }, + { + "name": "Indulge in a Spa Treatment", + "description": "Escape the hustle and bustle and treat yourself to a rejuvenating spa experience. Lombok offers a variety of wellness retreats and traditional spas where you can enjoy massages, body scrubs, and other relaxing treatments. Unwind and revitalize your mind, body, and soul amidst the tranquil ambiance.", + "locationName": "Various locations", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "lombok", + "ref": "indulge-in-a-spa-treatment", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_indulge-in-a-spa-treatment.jpg" + }, + { + "name": "Stargazing in the Desert", + "description": "Venture into the desert landscapes of Lombok and experience the magic of stargazing. Away from the city lights, the night sky comes alive with countless stars. Join a guided tour or find a secluded spot to marvel at the constellations and enjoy the tranquility of the desert night.", + "locationName": "South Lombok", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "lombok", + "ref": "stargazing-in-the-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_stargazing-in-the-desert.jpg" + }, + { + "name": "Learn to Weave with Sasak Artisans", + "description": "Immerse yourself in the rich cultural heritage of Lombok by learning the art of weaving from skilled Sasak artisans. Visit a traditional village and witness the intricate process of creating beautiful textiles, from dyeing threads with natural pigments to weaving them into vibrant fabrics. Try your hand at the loom and create your own unique souvenir to take home.", + "locationName": "Sasak Village", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "lombok", + "ref": "learn-to-weave-with-sasak-artisans", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_learn-to-weave-with-sasak-artisans.jpg" + }, + { + "name": "Visit the Islamic Center Mosque", + "description": "Discover the architectural beauty and spiritual significance of the Islamic Center Mosque, one of the largest and most impressive mosques in Lombok. Admire its intricate design, ornate decorations, and soaring minaret. Learn about Islamic culture and traditions, and enjoy the peaceful atmosphere of this religious landmark.", + "locationName": "Islamic Center Mosque", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "lombok", + "ref": "visit-the-islamic-center-mosque", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_visit-the-islamic-center-mosque.jpg" + }, + { + "name": "Embark on a Wildlife Safari", + "description": "Venture into the lush jungles of Lombok on a thrilling wildlife safari. Spot exotic animals like monkeys, deer, and birds in their natural habitat. Learn about the island's diverse ecosystem and conservation efforts. This adventure offers a unique opportunity to connect with nature and create unforgettable memories.", + "locationName": "Rinjani National Park or Monkey Forest", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "lombok", + "ref": "embark-on-a-wildlife-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_embark-on-a-wildlife-safari.jpg" + }, + { + "name": "Gili Islands Party Hopper Boat Trip", + "description": "Experience the vibrant nightlife of the Gili Islands with a party hopper boat trip. Cruise between the islands, enjoying stunning sunset views and lively music on board. Stop at each island to explore the beachfront bars and clubs, dance the night away, and mingle with fellow travelers. This is the perfect way to let loose and experience the energetic side of Lombok.", + "locationName": "Gili Trawangan, Gili Meno, Gili Air", + "duration": 6, + "timeOfDay": "night", + "familyFriendly": false, + "price": 4, + "destinationRef": "lombok", + "ref": "gili-islands-party-hopper-boat-trip", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_gili-islands-party-hopper-boat-trip.jpg" + }, + { + "name": "Explore the Underwater World with a Seawalker Helmet Dive", + "description": "Discover the wonders of the underwater world without needing scuba diving experience. With a seawalker helmet dive, you can walk along the seabed, surrounded by colorful fish and coral reefs. Breathe normally through the helmet as you observe the marine life up close. This unique and accessible activity is perfect for families and non-swimmers.", + "locationName": "Gili Islands or Senggigi Beach", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "lombok", + "ref": "explore-the-underwater-world-with-a-seawalker-helmet-dive", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/lombok_explore-the-underwater-world-with-a-seawalker-helmet-dive.jpg" + }, + { + "name": "Alms Giving Ceremony", + "description": "Witness the captivating daily ritual of saffron-clad monks collecting alms (food offerings) from locals at dawn. Experience the serenity and cultural significance of this tradition, offering a glimpse into the spiritual heart of Luang Prabang. Remember to dress respectfully and maintain a quiet demeanor.", + "locationName": "Streets of Luang Prabang", + "duration": 1, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "luang-prabang", + "ref": "alms-giving-ceremony", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_alms-giving-ceremony.jpg" + }, + { + "name": "Kuang Si Falls Excursion", + "description": "Embark on a refreshing journey to the turquoise cascades of Kuang Si Falls. Hike through the lush jungle, swim in the cool pools, and marvel at the natural beauty of this multi-tiered waterfall. Visit the nearby bear rescue center to encounter rescued Asiatic black bears.", + "locationName": "Kuang Si Falls", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "luang-prabang", + "ref": "kuang-si-falls-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_kuang-si-falls-excursion.jpg" + }, + { + "name": "Mekong River Cruise", + "description": "Embark on a scenic cruise down the Mekong River, the lifeblood of Laos. Admire the picturesque landscapes, observe local life along the riverbanks, and visit traditional villages. Opt for a sunset cruise for a romantic experience with breathtaking views.", + "locationName": "Mekong River", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "luang-prabang", + "ref": "mekong-river-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_mekong-river-cruise.jpg" + }, + { + "name": "Mount Phousi Climb and Sunset Views", + "description": "Ascend the steps to the summit of Mount Phousi for panoramic views of Luang Prabang and the surrounding mountains. Explore Wat Chom Si, a small temple at the peak, and witness a magical sunset that paints the sky in vibrant hues.", + "locationName": "Mount Phousi", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "luang-prabang", + "ref": "mount-phousi-climb-and-sunset-views", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_mount-phousi-climb-and-sunset-views.jpg" + }, + { + "name": "Luang Prabang Night Market", + "description": "Immerse yourself in the vibrant atmosphere of the Luang Prabang Night Market. Browse through a diverse array of handicrafts, textiles, souvenirs, and local delicacies. This bustling market offers a glimpse into the region's artistic traditions and culinary delights.", + "locationName": "Luang Prabang Night Market", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "luang-prabang", + "ref": "luang-prabang-night-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_luang-prabang-night-market.jpg" + }, + { + "name": "Traditional Lao Cooking Class", + "description": "Embark on a culinary journey with a hands-on cooking class, where you'll learn to prepare authentic Lao dishes like laap, papaya salad, and sticky rice. Discover the secrets of local ingredients and techniques, and savor the delicious results of your efforts.", + "locationName": "Luang Prabang Cooking School", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "luang-prabang", + "ref": "traditional-lao-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_traditional-lao-cooking-class.jpg" + }, + { + "name": "Pak Ou Caves Exploration", + "description": "Embark on a boat trip up the Mekong River to the Pak Ou Caves, two limestone grottoes filled with thousands of Buddha statues left by devoted pilgrims over centuries. Witness the spiritual significance of this sacred site and enjoy the scenic journey along the river.", + "locationName": "Pak Ou Caves", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "luang-prabang", + "ref": "pak-ou-caves-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_pak-ou-caves-exploration.jpg" + }, + { + "name": "Living Land Rice Farm Experience", + "description": "Immerse yourself in the rural life of Laos at the Living Land Farm. Learn about traditional rice cultivation methods, participate in hands-on activities like planting and harvesting, and gain a deeper understanding of the importance of rice in Lao culture.", + "locationName": "Living Land Farm", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "luang-prabang", + "ref": "living-land-rice-farm-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_living-land-rice-farm-experience.jpg" + }, + { + "name": "Royal Palace Museum", + "description": "Step back in time at the Royal Palace Museum, once home to the Lao royal family. Explore the opulent halls and chambers, admire the intricate architecture and royal artifacts, and learn about the history and cultural significance of the Lao monarchy.", + "locationName": "Royal Palace Museum", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "luang-prabang", + "ref": "royal-palace-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_royal-palace-museum.jpg" + }, + { + "name": "Traditional Lao Massage", + "description": "Indulge in a relaxing and rejuvenating traditional Lao massage. Experience the unique techniques and stretches that have been passed down for generations, and let the skilled therapists ease away your tension and stress.", + "locationName": "Local spas and wellness centers", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "luang-prabang", + "ref": "traditional-lao-massage", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_traditional-lao-massage.jpg" + }, + { + "name": "Tat Kuang Si Bear Rescue Center", + "description": "Visit the Tat Kuang Si Bear Rescue Center, a sanctuary for Asiatic black bears rescued from illegal wildlife trade. Learn about conservation efforts, observe these majestic creatures in a natural habitat, and support ethical wildlife tourism.", + "locationName": "Tat Kuang Si Bear Rescue Center", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "luang-prabang", + "ref": "tat-kuang-si-bear-rescue-center", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_tat-kuang-si-bear-rescue-center.jpg" + }, + { + "name": "Bicycle Tour Through Rural Villages", + "description": "Embark on a scenic bicycle tour through the countryside surrounding Luang Prabang. Pedal along quiet roads, passing by traditional villages, rice paddies, and local farms. Interact with friendly villagers, experience rural life, and enjoy the fresh air and beautiful landscapes.", + "locationName": "Luang Prabang Countryside", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "luang-prabang", + "ref": "bicycle-tour-through-rural-villages", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_bicycle-tour-through-rural-villages.jpg" + }, + { + "name": "Sunset Kayak on the Mekong River", + "description": "Paddle along the tranquil Mekong River as the sun sets, casting a golden glow over the water and surrounding landscape. Enjoy breathtaking views of the city and mountains, observe local fishermen, and experience the serenity of the river at dusk.", + "locationName": "Mekong River", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 3, + "destinationRef": "luang-prabang", + "ref": "sunset-kayak-on-the-mekong-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_sunset-kayak-on-the-mekong-river.jpg" + }, + { + "name": "Ock Pop Tok Living Crafts Centre", + "description": "Immerse yourself in the world of Lao textiles at the Ock Pop Tok Living Crafts Centre. Learn about traditional weaving techniques, natural dyeing processes, and the cultural significance of textiles in Laos. Participate in a workshop, create your own souvenir, and support local artisans.", + "locationName": "Ock Pop Tok Living Crafts Centre", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "luang-prabang", + "ref": "ock-pop-tok-living-crafts-centre", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_ock-pop-tok-living-crafts-centre.jpg" + }, + { + "name": "Morning Alms Giving Ceremony Participation", + "description": "Rise early and participate in the sacred Buddhist tradition of alms giving. Witness the procession of saffron-robed monks as they walk through the streets collecting offerings from locals. Immerse yourself in the spiritual atmosphere and gain a deeper understanding of Lao culture.", + "locationName": "Luang Prabang streets", + "duration": 1, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "luang-prabang", + "ref": "morning-alms-giving-ceremony-participation", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_morning-alms-giving-ceremony-participation.jpg" + }, + { + "name": "Jungle Trekking and Waterfall Hiking", + "description": "Embark on a thrilling jungle trek through the lush landscapes surrounding Luang Prabang. Hike to hidden waterfalls, discover diverse flora and fauna, and immerse yourself in the natural beauty of Laos. Experienced guides will lead you through scenic trails, sharing insights about the local ecosystem and cultural significance of the area.", + "locationName": "Luang Prabang mountains", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "luang-prabang", + "ref": "jungle-trekking-and-waterfall-hiking", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_jungle-trekking-and-waterfall-hiking.jpg" + }, + { + "name": "Elephant Sanctuary Visit", + "description": "Spend a heartwarming day at an ethical elephant sanctuary, where you can interact with these gentle giants in a responsible and sustainable way. Learn about elephant conservation efforts, observe their natural behaviors, and even assist with feeding and bathing them. This unforgettable experience offers a unique opportunity to connect with these majestic creatures.", + "locationName": "Mandalao Elephant Conservation", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "luang-prabang", + "ref": "elephant-sanctuary-visit", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_elephant-sanctuary-visit.jpg" + }, + { + "name": "Traditional Weaving Workshop", + "description": "Immerse yourself in the rich textile traditions of Laos with a hands-on weaving workshop. Learn about the intricate techniques and cultural significance of Lao textiles from skilled artisans. Create your own unique piece using a traditional loom and gain a deeper appreciation for this ancient craft.", + "locationName": "Ock Pop Tok Living Crafts Centre", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "luang-prabang", + "ref": "traditional-weaving-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_traditional-weaving-workshop.jpg" + }, + { + "name": "Sunset Cruise on the Nam Khan River", + "description": "Enjoy a serene sunset cruise along the tranquil Nam Khan River. Witness the golden hues of the setting sun paint the sky as you glide past picturesque landscapes and charming villages. This relaxing experience offers a different perspective of Luang Prabang's beauty and allows you to unwind amidst the peaceful ambiance.", + "locationName": "Nam Khan River", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "luang-prabang", + "ref": "sunset-cruise-on-the-nam-khan-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_sunset-cruise-on-the-nam-khan-river.jpg" + }, + { + "name": "Luang Prabang Film Festival", + "description": "If you're visiting in December, don't miss the Luang Prabang Film Festival. This annual event showcases a diverse selection of Southeast Asian films, offering a unique glimpse into the region's culture and storytelling traditions. Attend screenings, workshops, and panel discussions, and immerse yourself in the world of cinema.", + "locationName": "Various venues in Luang Prabang", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 2, + "destinationRef": "luang-prabang", + "ref": "luang-prabang-film-festival", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/luang-prabang_luang-prabang-film-festival.jpg" + }, + { + "name": "Explore Ranomafana National Park", + "description": "Embark on a guided hike through the lush rainforests of Ranomafana National Park, a haven for diverse wildlife. Spot lemurs leaping through the trees, colorful chameleons blending into the foliage, and a myriad of bird species flitting through the canopy. Immerse yourself in the sights and sounds of this pristine ecosystem, learning about the park's conservation efforts and the unique flora and fauna that call it home.", + "locationName": "Ranomafana National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "madagascar", + "ref": "explore-ranomafana-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_explore-ranomafana-national-park.jpg" + }, + { + "name": "Discover Isalo National Park's Jurassic Landscape", + "description": "Venture into Isalo National Park, renowned for its dramatic sandstone canyons, deep gorges, and unique rock formations that resemble a prehistoric landscape. Hike through the park's diverse terrain, encountering natural swimming pools, cascading waterfalls, and hidden caves. Learn about the Bara people, who inhabit the region, and their fascinating cultural traditions.", + "locationName": "Isalo National Park", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "madagascar", + "ref": "discover-isalo-national-park-s-jurassic-landscape", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_discover-isalo-national-park-s-jurassic-landscape.jpg" + }, + { + "name": "Relax on the Beaches of Nosy Be", + "description": "Escape to the idyllic island of Nosy Be, where pristine white-sand beaches meet turquoise waters. Bask in the sun, swim in the crystal-clear ocean, or try your hand at water sports like snorkeling or scuba diving to explore the vibrant coral reefs teeming with marine life. In the evening, indulge in a delicious seafood dinner at a beachfront restaurant and witness a breathtaking sunset over the horizon.", + "locationName": "Nosy Be", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "madagascar", + "ref": "relax-on-the-beaches-of-nosy-be", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_relax-on-the-beaches-of-nosy-be.jpg" + }, + { + "name": "Embark on a Whale Watching Expedition", + "description": "Embark on an unforgettable whale watching excursion off the coast of Île Sainte-Marie during the humpback whale migration season (July to September). Witness these majestic creatures breaching and tail-slapping as they make their annual journey to warmer waters. Learn about their fascinating behaviors and the importance of marine conservation.", + "locationName": "Île Sainte-Marie", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "madagascar", + "ref": "embark-on-a-whale-watching-expedition", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_embark-on-a-whale-watching-expedition.jpg" + }, + { + "name": "Immerse Yourself in the Culture of Antananarivo", + "description": "Explore the vibrant capital city of Antananarivo, a melting pot of Malagasy culture and history. Visit the Rova of Antananarivo, a historic royal palace complex offering panoramic views of the city. Wander through the bustling Analakely Market, a sensory feast of local crafts, spices, and fresh produce. Discover the city's rich architectural heritage, including colonial buildings and traditional wooden houses.", + "locationName": "Antananarivo", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "madagascar", + "ref": "immerse-yourself-in-the-culture-of-antananarivo", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_immerse-yourself-in-the-culture-of-antananarivo.jpg" + }, + { + "name": "Hike to the Top of Pic Boby", + "description": "Embark on a challenging but rewarding hike to the summit of Pic Boby, the highest peak in Madagascar. Trek through diverse landscapes, from lush rainforests to rocky terrain, and be rewarded with breathtaking panoramic views of the surrounding mountains and valleys. This adventure is perfect for experienced hikers seeking a thrilling experience.", + "locationName": "Andringitra National Park", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "madagascar", + "ref": "hike-to-the-top-of-pic-boby", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_hike-to-the-top-of-pic-boby.jpg" + }, + { + "name": "Go Scuba Diving or Snorkeling in the Indian Ocean", + "description": "Dive into the vibrant underwater world surrounding Madagascar. Explore coral reefs teeming with colorful fish, encounter majestic sea turtles, and perhaps even spot dolphins or whale sharks. Whether you're an experienced diver or a beginner snorkeler, Madagascar's waters offer an unforgettable marine experience.", + "locationName": "Nosy Be, Ile Sainte Marie", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "madagascar", + "ref": "go-scuba-diving-or-snorkeling-in-the-indian-ocean", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_go-scuba-diving-or-snorkeling-in-the-indian-ocean.jpg" + }, + { + "name": "Visit the Tsingy de Bemaraha National Park", + "description": "Explore the unique and otherworldly landscapes of Tsingy de Bemaraha National Park, a UNESCO World Heritage Site. Marvel at the towering limestone formations, known as 'tsingy,' which create a labyrinth of sharp pinnacles and canyons. Hike through this geological wonder and discover the diverse flora and fauna that call it home.", + "locationName": "Tsingy de Bemaraha National Park", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "madagascar", + "ref": "visit-the-tsingy-de-bemaraha-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_visit-the-tsingy-de-bemaraha-national-park.jpg" + }, + { + "name": "Take a Cultural Tour of Antsirabe", + "description": "Step back in time and experience the colonial charm of Antsirabe, known as the 'Vichy of Madagascar.' Explore the city's thermal springs, visit the local market, and admire the French architecture. Take a pousse-pousse ride through the streets and soak up the relaxed atmosphere of this historic town.", + "locationName": "Antsirabe", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "madagascar", + "ref": "take-a-cultural-tour-of-antsirabe", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_take-a-cultural-tour-of-antsirabe.jpg" + }, + { + "name": "Cruise Down the Tsiribihina River", + "description": "Embark on a relaxing river journey down the Tsiribihina River, experiencing the heart of Madagascar's wilderness. Drift past lush landscapes, spot diverse wildlife along the riverbanks, and witness stunning sunsets over the water. This tranquil adventure allows you to connect with nature and observe rural life in Madagascar.", + "locationName": "Tsiribihina River", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "madagascar", + "ref": "cruise-down-the-tsiribihina-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_cruise-down-the-tsiribihina-river.jpg" + }, + { + "name": "Visit the Avenue of the Baobabs", + "description": "Witness the iconic Avenue of the Baobabs, a stunning natural corridor lined with majestic baobab trees. Capture breathtaking photos of these giants at sunset or sunrise, and learn about their significance in Malagasy culture. This is a must-see for any visitor to Madagascar.", + "locationName": "Morondava", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "madagascar", + "ref": "visit-the-avenue-of-the-baobabs", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_visit-the-avenue-of-the-baobabs.jpg" + }, + { + "name": "Explore the Masoala National Park", + "description": "Embark on a jungle adventure in Masoala National Park, a haven of biodiversity. Hike through lush rainforests, spot rare lemurs, chameleons, and birds, and discover hidden waterfalls. This park offers a truly immersive experience in Madagascar's unique ecosystem.", + "locationName": "Masoala Peninsula", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "madagascar", + "ref": "explore-the-masoala-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_explore-the-masoala-national-park.jpg" + }, + { + "name": "Learn about Lemur Conservation at a Sanctuary", + "description": "Visit a lemur sanctuary and learn about the conservation efforts to protect these endangered primates. Observe various lemur species up close, learn about their behaviors and habitats, and support the crucial work of these sanctuaries.", + "locationName": "Multiple locations across Madagascar", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "madagascar", + "ref": "learn-about-lemur-conservation-at-a-sanctuary", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_learn-about-lemur-conservation-at-a-sanctuary.jpg" + }, + { + "name": "Experience Local Life in a Rural Village", + "description": "Immerse yourself in the authentic culture of Madagascar by visiting a rural village. Interact with locals, learn about their traditions and way of life, and gain a deeper understanding of the island's rich cultural heritage.", + "locationName": "Various rural villages throughout Madagascar", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "madagascar", + "ref": "experience-local-life-in-a-rural-village", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_experience-local-life-in-a-rural-village.jpg" + }, + { + "name": "Shop for Unique Crafts and Souvenirs", + "description": "Discover the vibrant arts and crafts scene in Madagascar. Explore local markets and shops for unique souvenirs, including handwoven textiles, wood carvings, and semi-precious stones. Find the perfect treasures to remember your trip by.", + "locationName": "Antananarivo, Antsirabe, and other major towns", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "madagascar", + "ref": "shop-for-unique-crafts-and-souvenirs", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_shop-for-unique-crafts-and-souvenirs.jpg" + }, + { + "name": "Kite Surfing in Emerald Waters", + "description": "Harness the power of the wind and glide across the crystal-clear waters of Madagascar's lagoons. Whether you're a beginner or a seasoned pro, numerous spots offer ideal conditions for kite surfing. Feel the adrenaline rush as you soar through the air, surrounded by stunning coastal landscapes. Sakalava Bay, Diego Suarez, and Fort Dauphin are renowned for their consistent winds and vibrant kite surfing communities. This activity is best enjoyed during the windy season, typically between April and October.", + "locationName": "Sakalava Bay, Diego Suarez, or Fort Dauphin", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "madagascar", + "ref": "kite-surfing-in-emerald-waters", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_kite-surfing-in-emerald-waters.jpg" + }, + { + "name": "Indulge in a Malagasy Cooking Class", + "description": "Embark on a culinary journey and learn the secrets of Malagasy cuisine. Join a cooking class led by local chefs who will guide you through traditional recipes and techniques. Discover the unique blend of flavors influenced by African, Asian, and European cultures. Master the art of preparing dishes like ravitoto (cassava leaves with pork) or romazava (a flavorful meat and vegetable stew). Savor the fruits of your labor as you enjoy a delicious meal with newfound friends. This immersive experience offers a deeper understanding of Malagasy culture and its culinary traditions.", + "locationName": "Antananarivo or Nosy Be", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "madagascar", + "ref": "indulge-in-a-malagasy-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_indulge-in-a-malagasy-cooking-class.jpg" + }, + { + "name": "Go Caving in the Ankarana National Park", + "description": "Venture into the depths of the Ankarana National Park, known for its dramatic limestone formations and extensive cave systems. Explore the otherworldly underground realm, adorned with stalactites, stalagmites, and unique geological features. Discover hidden chambers, underground rivers, and diverse bat species. Guided tours offer insights into the geological history and cultural significance of these caves. This adventure is perfect for those seeking an off-the-beaten-path experience and a glimpse into Madagascar's hidden wonders.", + "locationName": "Ankarana National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "madagascar", + "ref": "go-caving-in-the-ankarana-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_go-caving-in-the-ankarana-national-park.jpg" + }, + { + "name": "Take a Scenic Train Ride on the Fianarantsoa-Côte Est Railway", + "description": "Embark on a nostalgic journey through the heart of Madagascar aboard the Fianarantsoa-Côte Est Railway. This historic railway line winds through breathtaking landscapes, offering panoramic views of lush rainforests, terraced rice fields, and charming villages. Experience the rhythm of local life as you interact with fellow passengers and witness the beauty of the countryside unfold. The train journey provides a unique perspective on Madagascar's diverse topography and cultural heritage.", + "locationName": "Fianarantsoa to Manakara", + "duration": 12, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "madagascar", + "ref": "take-a-scenic-train-ride-on-the-fianarantsoa-c-te-est-railway", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_take-a-scenic-train-ride-on-the-fianarantsoa-c-te-est-railway.jpg" + }, + { + "name": "Stargaze in the Remote Wilderness", + "description": "Escape the city lights and immerse yourself in the celestial wonders of Madagascar's night sky. Head to remote areas away from light pollution, such as the Isalo National Park or the Tsingy de Bemaraha National Park, where the Milky Way and countless stars shine brightly. Join a guided stargazing tour or simply lie back and marvel at the constellations. This experience offers a sense of tranquility and a deeper connection with the natural world. Capture stunning astrophotography or simply enjoy the awe-inspiring beauty of the cosmos.", + "locationName": "Isalo National Park or Tsingy de Bemaraha National Park", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "madagascar", + "ref": "stargaze-in-the-remote-wilderness", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/madagascar_stargaze-in-the-remote-wilderness.jpg" + }, + { + "name": "Scuba Diving in the North Malé Atoll", + "description": "Embark on an underwater adventure exploring the vibrant coral reefs of the North Malé Atoll. Encounter diverse marine life, including colorful fish, graceful manta rays, and majestic sharks. Dive sites like Manta Point and Banana Reef offer unforgettable experiences for both beginner and experienced divers.", + "locationName": "North Malé Atoll", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "maldives", + "ref": "scuba-diving-in-the-north-mal-atoll", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_scuba-diving-in-the-north-mal-atoll.jpg" + }, + { + "name": "Island Hopping Tour", + "description": "Discover the beauty and diversity of the Maldivian islands with an island hopping tour. Visit local islands, experience the Maldivian culture, and enjoy swimming, snorkeling, or simply relaxing on pristine beaches.", + "locationName": "Various islands", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "maldives", + "ref": "island-hopping-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_island-hopping-tour.jpg" + }, + { + "name": "Sunset Cruise with Dolphin Watching", + "description": "Sail across the turquoise waters as the sun sets, painting the sky with vibrant colors. Keep an eye out for playful dolphins as they frolic alongside the boat. Enjoy the breathtaking views and create unforgettable memories on this romantic and relaxing cruise.", + "locationName": "Departure from various resorts", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "maldives", + "ref": "sunset-cruise-with-dolphin-watching", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_sunset-cruise-with-dolphin-watching.jpg" + }, + { + "name": "Underwater Dining Experience", + "description": "Indulge in a unique and unforgettable dining experience at an underwater restaurant. Surrounded by marine life, savor delicious cuisine while marveling at the beauty of the coral reef. This is a perfect option for a special occasion or a romantic evening.", + "locationName": "Conrad Maldives Rangali Island", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "maldives", + "ref": "underwater-dining-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_underwater-dining-experience.jpg" + }, + { + "name": "Relaxation at a Spa Resort", + "description": "Escape to a luxurious spa resort and indulge in rejuvenating treatments. Enjoy massages, facials, and body wraps inspired by traditional Maldivian techniques and natural ingredients. Unwind in a serene atmosphere and let your worries melt away.", + "locationName": "Various spa resorts", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "maldives", + "ref": "relaxation-at-a-spa-resort", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_relaxation-at-a-spa-resort.jpg" + }, + { + "name": "Surfing in the North Malé Atoll", + "description": "Experience the thrill of riding the waves in the turquoise waters of the North Malé Atoll. Several surf breaks cater to different skill levels, from beginners to experienced surfers. Rent a board and catch some waves, or take a lesson from a local instructor to improve your technique.", + "locationName": "North Malé Atoll", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "maldives", + "ref": "surfing-in-the-north-mal-atoll", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_surfing-in-the-north-mal-atoll.jpg" + }, + { + "name": "Local Island Experience", + "description": "Immerse yourself in the Maldivian culture by visiting a local island. Explore the traditional way of life, interact with friendly locals, and discover hidden gems away from the tourist resorts. Visit local markets, try authentic Maldivian cuisine, and learn about the island's history and traditions.", + "locationName": "Maafushi, Fulidhoo, or Thoddoo", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "maldives", + "ref": "local-island-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_local-island-experience.jpg" + }, + { + "name": "Snorkeling with Manta Rays", + "description": "Embark on an unforgettable snorkeling adventure to encounter the majestic manta rays. Witness these gentle giants glide gracefully through the water as you swim alongside them. Several tour operators offer snorkeling trips to manta ray cleaning stations, where you can observe their feeding habits.", + "locationName": "Hanifaru Bay or Addu Atoll", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "maldives", + "ref": "snorkeling-with-manta-rays", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_snorkeling-with-manta-rays.jpg" + }, + { + "name": "Sunset Fishing Trip", + "description": "Experience the Maldivian tradition of handline fishing on a sunset cruise. Learn about local fishing techniques, try your luck at catching some fish, and enjoy the stunning views of the sun setting over the Indian Ocean. Many excursions offer the option to grill your catch for a fresh and delicious dinner.", + "locationName": "Various locations throughout the Maldives", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "maldives", + "ref": "sunset-fishing-trip", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_sunset-fishing-trip.jpg" + }, + { + "name": "Bioluminescent Plankton Tour", + "description": "Witness the magical phenomenon of bioluminescent plankton on a night tour. As you move through the water, the plankton illuminates, creating a mesmerizing spectacle of sparkling blue light. This unique experience is a must-do for nature enthusiasts and photographers.", + "locationName": "Vaadhoo Island or Mudhdhoo Island", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "maldives", + "ref": "bioluminescent-plankton-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_bioluminescent-plankton-tour.jpg" + }, + { + "name": "Kayaking in the Turquoise Lagoons", + "description": "Embark on a serene kayaking adventure through the crystal-clear turquoise lagoons of the Maldives. Paddle at your own pace, exploring hidden coves, mangrove forests, and small, deserted islands. Witness the vibrant marine life below and soak in the tranquility of the surrounding nature. This activity is perfect for a relaxing and eco-friendly exploration of the Maldivian waters.", + "locationName": "Various atolls and islands", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "maldives", + "ref": "kayaking-in-the-turquoise-lagoons", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_kayaking-in-the-turquoise-lagoons.jpg" + }, + { + "name": "Sandbank Picnic and Stargazing", + "description": "Escape to a secluded sandbank for a romantic and unforgettable experience. Enjoy a private picnic with delicious Maldivian cuisine as the sun sets over the horizon. As darkness falls, marvel at the breathtaking view of the starlit sky, away from any light pollution. This intimate activity is perfect for couples or anyone seeking a moment of tranquility and wonder.", + "locationName": "Sandbanks near resort islands", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "maldives", + "ref": "sandbank-picnic-and-stargazing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_sandbank-picnic-and-stargazing.jpg" + }, + { + "name": "Hydrofoil Trip to a Local Village", + "description": "Experience the authentic Maldivian culture with a hydrofoil trip to a nearby local island. Immerse yourself in the daily life of the islanders, visit traditional markets, and interact with friendly locals. Learn about their customs, traditions, and way of life. This cultural excursion provides a unique perspective beyond the resort experience.", + "locationName": "Local islands near resort areas", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "maldives", + "ref": "hydrofoil-trip-to-a-local-village", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_hydrofoil-trip-to-a-local-village.jpg" + }, + { + "name": "Windsurfing and Kitesurfing Adventures", + "description": "For thrill-seekers, the Maldives offers ideal conditions for windsurfing and kitesurfing. Harness the power of the wind and glide across the turquoise waters, surrounded by breathtaking scenery. Lessons and equipment rentals are available for all skill levels, making it a perfect activity for both beginners and experienced riders.", + "locationName": "Various atolls and islands with water sports centers", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "maldives", + "ref": "windsurfing-and-kitesurfing-adventures", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_windsurfing-and-kitesurfing-adventures.jpg" + }, + { + "name": "Maldivian Cooking Class", + "description": "Delve into the world of Maldivian cuisine with a hands-on cooking class. Learn to prepare traditional dishes using fresh, local ingredients, and discover the unique flavors and spices that characterize Maldivian food. This immersive experience allows you to take a piece of Maldivian culture home with you.", + "locationName": "Resorts or local islands offering cooking classes", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "maldives", + "ref": "maldivian-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_maldivian-cooking-class.jpg" + }, + { + "name": "Submarine Dive", + "description": "Embark on an unforgettable underwater adventure aboard a submarine, descending into the depths of the Indian Ocean to witness the vibrant marine life and coral reefs without getting wet. Marvel at colorful fish, graceful manta rays, and even elusive sharks as you explore the hidden wonders of the Maldivian waters.", + "locationName": "Malé Atoll", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "maldives", + "ref": "submarine-dive", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_submarine-dive.jpg" + }, + { + "name": "Whale Shark Excursion", + "description": "Join a thrilling excursion to swim alongside gentle giants – whale sharks. These majestic creatures frequent the Maldivian waters, offering a once-in-a-lifetime opportunity to witness their awe-inspiring size and graceful movements. Experienced guides will ensure a safe and unforgettable encounter.", + "locationName": "South Ari Atoll", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "maldives", + "ref": "whale-shark-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_whale-shark-excursion.jpg" + }, + { + "name": "Seaplane Photo Flight", + "description": "Take to the skies for a breathtaking seaplane photo flight, capturing the stunning aerial views of the Maldives' turquoise lagoons, white-sand beaches, and lush islands. This experience provides unparalleled perspectives and the perfect opportunity to create lasting memories through photography.", + "locationName": "Various Atolls", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "maldives", + "ref": "seaplane-photo-flight", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_seaplane-photo-flight.jpg" + }, + { + "name": "Local Market Visit and Cooking Class", + "description": "Immerse yourself in the local culture with a visit to a vibrant Maldivian market. Explore the sights and smells of fresh produce, spices, and local crafts. Then, participate in a hands-on cooking class to learn the secrets of Maldivian cuisine, creating delicious dishes to savor.", + "locationName": "Malé or Maafushi", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "maldives", + "ref": "local-market-visit-and-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maldives_local-market-visit-and-cooking-class.jpg" + }, + { + "name": "Explore the Historic City of Palma", + "description": "Wander through the charming streets of Palma, the capital city of Mallorca. Visit the iconic Palma Cathedral, a stunning Gothic masterpiece, and explore the Royal Palace of La Almudaina. Discover the Arab Baths, a historic hammam dating back to the Moorish era, and lose yourself in the labyrinthine alleyways of the Old Town. Enjoy tapas and local wines at a sidewalk cafe, and soak up the vibrant atmosphere of this historic city.", + "locationName": "Palma", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "mallorca", + "ref": "explore-the-historic-city-of-palma", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_explore-the-historic-city-of-palma.jpg" + }, + { + "name": "Hike the Serra de Tramuntana", + "description": "Embark on a scenic hike through the Serra de Tramuntana mountain range, a UNESCO World Heritage Site. Choose from various trails, ranging from easy to challenging, and enjoy breathtaking views of the coastline, hidden coves, and charming villages. Discover ancient monasteries, such as Lluc Monastery, and experience the tranquility of the mountains.", + "locationName": "Serra de Tramuntana", + "duration": 5, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "mallorca", + "ref": "hike-the-serra-de-tramuntana", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_hike-the-serra-de-tramuntana.jpg" + }, + { + "name": "Relax on Beautiful Beaches", + "description": "Unwind on the pristine beaches of Mallorca, known for their turquoise waters and soft sand. Choose from popular beaches like Cala Millor and Playa de Palma, or discover secluded coves like Cala Mesquida and Cala Agulla. Enjoy swimming, sunbathing, and water sports, or simply relax and enjoy the Mediterranean sunshine.", + "locationName": "Various Beaches", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "mallorca", + "ref": "relax-on-beautiful-beaches", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_relax-on-beautiful-beaches.jpg" + }, + { + "name": "Discover the Caves of Drach", + "description": "Explore the fascinating Caves of Drach, a series of four caves known for their impressive stalactites, stalagmites, and underground lake. Take a boat ride across Lake Martel, one of the largest underground lakes in the world, and enjoy a classical music concert inside the cave.", + "locationName": "Caves of Drach", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "mallorca", + "ref": "discover-the-caves-of-drach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_discover-the-caves-of-drach.jpg" + }, + { + "name": "Indulge in Mallorcan Cuisine", + "description": "Experience the delicious flavors of Mallorcan cuisine. Sample local specialties such as sobrasada (cured sausage), tumbet (vegetable stew), and ensaimada (spiral pastry). Visit traditional markets and local restaurants to savor the authentic tastes of the island. Don't forget to try the local wines, such as Binissalem and Pla i Llevant.", + "locationName": "Various Restaurants and Markets", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "mallorca", + "ref": "indulge-in-mallorcan-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_indulge-in-mallorcan-cuisine.jpg" + }, + { + "name": "Soar Above the Island in a Hot Air Balloon", + "description": "Experience the breathtaking beauty of Mallorca from a unique perspective with a hot air balloon ride. As you gently ascend, marvel at panoramic views of the island's diverse landscapes, from the azure waters of the Mediterranean to the rolling hills and charming villages. This serene and unforgettable experience is perfect for a romantic getaway or a special occasion.", + "locationName": "Various locations across the island", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "mallorca", + "ref": "soar-above-the-island-in-a-hot-air-balloon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_soar-above-the-island-in-a-hot-air-balloon.jpg" + }, + { + "name": "Embark on a Catamaran Cruise to Secluded Coves", + "description": "Set sail on a catamaran adventure to discover hidden coves and pristine beaches inaccessible by land. Dive into crystal-clear waters for a refreshing swim, snorkel among vibrant marine life, or simply relax on deck and soak up the Mediterranean sun. Many cruises include delicious meals and drinks, making for a perfect day trip.", + "locationName": "Departs from various ports", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "mallorca", + "ref": "embark-on-a-catamaran-cruise-to-secluded-coves", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_embark-on-a-catamaran-cruise-to-secluded-coves.jpg" + }, + { + "name": "Visit the Picturesque Villages of Valldemossa and Deià", + "description": "Escape the bustling city and explore the charming villages nestled in the Tramuntana mountains. Valldemossa, with its historic monastery and cobbled streets, offers a glimpse into Mallorca's rich past. Deià, a haven for artists and writers, boasts stunning coastal views and a bohemian atmosphere. Enjoy local crafts, art galleries, and delicious cuisine.", + "locationName": "Valldemossa and Deià", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "mallorca", + "ref": "visit-the-picturesque-villages-of-valldemossa-and-dei-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_visit-the-picturesque-villages-of-valldemossa-and-dei-.jpg" + }, + { + "name": "Go Kayaking or Stand-Up Paddleboarding along the Coast", + "description": "Explore Mallorca's coastline at your own pace with a kayaking or stand-up paddleboarding excursion. Paddle through turquoise waters, discover hidden caves and secluded beaches, and admire the dramatic cliffs. This active adventure is perfect for nature enthusiasts and water sports lovers.", + "locationName": "Various beaches and coves", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "mallorca", + "ref": "go-kayaking-or-stand-up-paddleboarding-along-the-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_go-kayaking-or-stand-up-paddleboarding-along-the-coast.jpg" + }, + { + "name": "Experience the Thrill of Caving in the Coves del Hams", + "description": "Embark on an underground adventure through the Coves del Hams, a network of stunning caves adorned with stalactites, stalagmites, and an underground lake. Take a guided tour to learn about the geological formations and enjoy a magical musical boat ride on the lake. This unique experience is perfect for families and adventure seekers.", + "locationName": "Porto Cristo", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "mallorca", + "ref": "experience-the-thrill-of-caving-in-the-coves-del-hams", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_experience-the-thrill-of-caving-in-the-coves-del-hams.jpg" + }, + { + "name": "Cycling Through Scenic Landscapes", + "description": "Embark on a cycling adventure through Mallorca's diverse landscapes. Pedal along coastal roads with breathtaking sea views, meander through charming villages, or challenge yourself with mountain climbs in the Serra de Tramuntana. With various routes for all levels, cycling offers a unique way to explore the island's beauty.", + "locationName": "Various routes throughout Mallorca", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "mallorca", + "ref": "cycling-through-scenic-landscapes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_cycling-through-scenic-landscapes.jpg" + }, + { + "name": "Wine Tasting in the Binissalem Region", + "description": "Delve into the world of Mallorcan wines with a visit to the Binissalem region. Explore family-run vineyards, learn about the island's winemaking traditions, and indulge in tastings of local varieties like Manto Negro and Callet. Enjoy the scenic beauty of the vineyards and savor the flavors of Mallorca.", + "locationName": "Binissalem region", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "mallorca", + "ref": "wine-tasting-in-the-binissalem-region", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_wine-tasting-in-the-binissalem-region.jpg" + }, + { + "name": "Stargazing in the Tramuntana Mountains", + "description": "Escape the city lights and experience the magic of stargazing in the Tramuntana Mountains. Away from light pollution, the clear night sky offers a breathtaking view of constellations and shooting stars. Join a guided tour or find a secluded spot to marvel at the celestial wonders above.", + "locationName": "Serra de Tramuntana", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "mallorca", + "ref": "stargazing-in-the-tramuntana-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_stargazing-in-the-tramuntana-mountains.jpg" + }, + { + "name": "Horseback Riding through Rural Landscapes", + "description": "Explore the heart of Mallorca on horseback, traversing rural paths and picturesque landscapes. Whether you're a seasoned rider or a beginner, there are options for all levels. Enjoy the tranquility of nature, discover hidden trails, and experience the island from a unique perspective.", + "locationName": "Rural areas of Mallorca", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "mallorca", + "ref": "horseback-riding-through-rural-landscapes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_horseback-riding-through-rural-landscapes.jpg" + }, + { + "name": "Explore the Palma Aquarium", + "description": "Dive into the fascinating underwater world at Palma Aquarium. Discover a diverse array of marine life, from colorful fish and majestic sharks to playful sea turtles and graceful jellyfish. Learn about marine conservation efforts and enjoy interactive exhibits that are both educational and entertaining for all ages.", + "locationName": "Palma", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "mallorca", + "ref": "explore-the-palma-aquarium", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_explore-the-palma-aquarium.jpg" + }, + { + "name": "Scuba Diving in Marine Reserves", + "description": "Explore the underwater wonders of Mallorca's marine reserves, such as El Toro or Cabrera Archipelago. Discover vibrant coral reefs, diverse marine life, and even underwater caves, making for an unforgettable diving experience.", + "locationName": "El Toro Marine Reserve or Cabrera Archipelago", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "mallorca", + "ref": "scuba-diving-in-marine-reserves", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_scuba-diving-in-marine-reserves.jpg" + }, + { + "name": "Sunset Horseback Riding", + "description": "Embark on a magical horseback riding adventure as the sun sets over the Mallorcan countryside. Enjoy breathtaking views of rolling hills, vineyards, and the distant Mediterranean Sea, creating a romantic and unforgettable experience.", + "locationName": "Rural Mallorca", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "mallorca", + "ref": "sunset-horseback-riding", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_sunset-horseback-riding.jpg" + }, + { + "name": "Take a Cooking Class and Learn to Make Paella", + "description": "Immerse yourself in Mallorcan culture by taking a cooking class and learning how to prepare the island's iconic dish, paella. Master the art of creating the perfect blend of rice, seafood, and spices, and savor the delicious results of your culinary efforts.", + "locationName": "Palma or other towns", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "mallorca", + "ref": "take-a-cooking-class-and-learn-to-make-paella", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_take-a-cooking-class-and-learn-to-make-paella.jpg" + }, + { + "name": "Go Cliff Jumping at Cala S'Almunia", + "description": "For the adventurous souls, head to Cala S'Almunia, a secluded cove known for its dramatic cliffs and crystal-clear waters. Take the plunge and experience the thrill of cliff jumping into the refreshing Mediterranean Sea.", + "locationName": "Cala S'Almunia", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "mallorca", + "ref": "go-cliff-jumping-at-cala-s-almunia", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_go-cliff-jumping-at-cala-s-almunia.jpg" + }, + { + "name": "Enjoy Live Music at a Jazz Club", + "description": "Experience the vibrant nightlife of Mallorca by catching live music at a jazz club in Palma or other towns. Enjoy the soulful sounds of local and international musicians while sipping on cocktails and soaking up the atmosphere.", + "locationName": "Palma or other towns", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "mallorca", + "ref": "enjoy-live-music-at-a-jazz-club", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mallorca_enjoy-live-music-at-a-jazz-club.jpg" + }, + { + "name": "Explore the Historic City of Valletta", + "description": "Step back in time as you wander through the charming streets of Valletta, a UNESCO World Heritage Site. Admire the Baroque architecture, visit St. John's Co-Cathedral with its opulent interior, and enjoy panoramic views of the Grand Harbour from the Upper Barrakka Gardens. History buffs will be enthralled by the rich past of this fortified city.", + "locationName": "Valletta", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "malta", + "ref": "explore-the-historic-city-of-valletta", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_explore-the-historic-city-of-valletta.jpg" + }, + { + "name": "Dive into the Blue Lagoon", + "description": "Escape to the island of Comino and discover the breathtaking Blue Lagoon. Dive into the crystal-clear turquoise waters, perfect for swimming, snorkeling, and scuba diving. Relax on the white sandy beach or explore the nearby caves and coves. This is a must-do for water enthusiasts and those seeking a slice of paradise.", + "locationName": "Comino", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "malta", + "ref": "dive-into-the-blue-lagoon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_dive-into-the-blue-lagoon.jpg" + }, + { + "name": "Discover the Ancient Megalithic Temples", + "description": "Embark on a journey through Malta's prehistoric past by visiting the Megalithic Temples, some of the oldest freestanding structures in the world. Explore the UNESCO-listed Ħaġar Qim and Mnajdra temples, marveling at their intricate construction and mysterious origins. This is a unique experience for history and archaeology enthusiasts.", + "locationName": "Ħaġar Qim and Mnajdra", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "malta", + "ref": "discover-the-ancient-megalithic-temples", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_discover-the-ancient-megalithic-temples.jpg" + }, + { + "name": "Indulge in Maltese Cuisine", + "description": "Tantalize your taste buds with the delicious flavors of Maltese cuisine. Sample traditional dishes like pastizzi (savory pastries), rabbit stew, and lampuki pie (fish pie). Explore the vibrant food markets and dine at charming local restaurants. Food tours are a great way to experience the culinary delights of Malta.", + "locationName": "Various locations", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "malta", + "ref": "indulge-in-maltese-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_indulge-in-maltese-cuisine.jpg" + }, + { + "name": "Experience the Nightlife in Paceville", + "description": "When the sun goes down, head to Paceville, Malta's vibrant nightlife hub. Dance the night away at clubs, enjoy live music at bars, and try your luck at the casinos. With a diverse range of venues and a lively atmosphere, Paceville offers something for everyone looking for evening entertainment.", + "locationName": "Paceville", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "malta", + "ref": "experience-the-nightlife-in-paceville", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_experience-the-nightlife-in-paceville.jpg" + }, + { + "name": "Gozo Island Adventure", + "description": "Embark on a day trip to Gozo, Malta's sister island, renowned for its tranquil countryside and dramatic coastline. Explore the charming Citadel in Victoria, visit the stunning Azure Window (collapsed natural arch), and relax on the red sands of Ramla Bay. Hike or bike through the picturesque landscapes, discovering hidden coves and historical sites. Gozo offers a slower pace of life and a taste of authentic Maltese culture.", + "locationName": "Gozo Island", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "malta", + "ref": "gozo-island-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_gozo-island-adventure.jpg" + }, + { + "name": "Sailing & Snorkeling in Comino's Blue Lagoon", + "description": "Set sail on a boat trip to Comino, a small island between Malta and Gozo, famed for its Blue Lagoon. Immerse yourself in the crystal-clear turquoise waters, ideal for swimming, snorkeling, and diving. Discover the vibrant marine life and underwater caves, or simply soak up the sun on the pristine white sand beaches. Enjoy a leisurely lunch on board and breathtaking views of the Mediterranean coastline.", + "locationName": "Comino", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "malta", + "ref": "sailing-snorkeling-in-comino-s-blue-lagoon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_sailing-snorkeling-in-comino-s-blue-lagoon.jpg" + }, + { + "name": "Marsaxlokk Fishing Village & Market", + "description": "Experience the charm of Marsaxlokk, a traditional fishing village with a vibrant Sunday market. Stroll along the waterfront, admiring the colorful luzzu boats and enjoying the fresh sea breeze. Browse the stalls overflowing with local produce, handicrafts, and souvenirs. Savor a delicious seafood lunch at one of the many waterfront restaurants, indulging in the authentic flavors of Malta.", + "locationName": "Marsaxlokk", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "malta", + "ref": "marsaxlokk-fishing-village-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_marsaxlokk-fishing-village-market.jpg" + }, + { + "name": "Mdina: The Silent City", + "description": "Step back in time in Mdina, Malta's ancient capital, known as the \"Silent City.\" Wander through its narrow, winding streets, admiring the medieval and baroque architecture. Explore the imposing bastions, offering panoramic views of the island. Visit St. Paul's Cathedral and the Mdina Dungeons, delving into the city's rich history. Enjoy a peaceful escape from the bustling modern world.", + "locationName": "Mdina", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "malta", + "ref": "mdina-the-silent-city", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_mdina-the-silent-city.jpg" + }, + { + "name": "Hiking & History on Dingli Cliffs", + "description": "Embark on a scenic hike along the Dingli Cliffs, the highest point in Malta, offering breathtaking views of the Mediterranean Sea. Explore the rugged coastline, discovering hidden caves and historical sites, including the Clapham Junction cart ruts and the prehistoric Misqa Tanks. Immerse yourself in the natural beauty and learn about Malta's geological and cultural heritage. This adventurous experience is perfect for nature lovers and history enthusiasts.", + "locationName": "Dingli Cliffs", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "malta", + "ref": "hiking-history-on-dingli-cliffs", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_hiking-history-on-dingli-cliffs.jpg" + }, + { + "name": "Sunset Kayak Tour of Golden Bay", + "description": "Embark on a magical kayaking adventure as the sun dips below the horizon, casting a golden glow on the picturesque Golden Bay. Paddle through the tranquil waters, exploring hidden caves and dramatic cliffs while enjoying the breathtaking views of the Maltese coastline. This serene experience is perfect for nature lovers and those seeking a romantic evening activity.", + "locationName": "Golden Bay", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "malta", + "ref": "sunset-kayak-tour-of-golden-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_sunset-kayak-tour-of-golden-bay.jpg" + }, + { + "name": "Wine Tasting in the Maltese Countryside", + "description": "Indulge in the flavors of Malta with a delightful wine tasting experience at a local vineyard. Discover the unique characteristics of Maltese wines, from crisp whites to robust reds, while learning about the island's rich viticulture history. Enjoy the scenic views of rolling vineyards and charming villages as you savor the tastes of Malta.", + "locationName": "Maltese Countryside", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "malta", + "ref": "wine-tasting-in-the-maltese-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_wine-tasting-in-the-maltese-countryside.jpg" + }, + { + "name": "Horseback Riding through Gozo's Countryside", + "description": "Explore the idyllic countryside of Gozo on horseback, trotting along scenic trails and enjoying the peaceful atmosphere. This activity is suitable for all experience levels, allowing you to connect with nature and discover hidden corners of the island at your own pace. The stunning landscapes and charming villages will create unforgettable memories.", + "locationName": "Gozo", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "malta", + "ref": "horseback-riding-through-gozo-s-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_horseback-riding-through-gozo-s-countryside.jpg" + }, + { + "name": "Rock Climbing Adventure in Wied il-Għasri", + "description": "Challenge yourself with an exhilarating rock climbing experience in Wied il-Għasri, a breathtaking valley with towering cliffs. With routes for various skill levels, both beginners and experienced climbers can enjoy the thrill of conquering the rock face while taking in the stunning views of the Mediterranean Sea. This adventurous activity is perfect for adrenaline seekers.", + "locationName": "Wied il-Għasri", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "malta", + "ref": "rock-climbing-adventure-in-wied-il-g-asri", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_rock-climbing-adventure-in-wied-il-g-asri.jpg" + }, + { + "name": "Spa Day at a Luxury Resort", + "description": "Unwind and rejuvenate with a pampering spa day at one of Malta's luxurious resorts. Indulge in a variety of treatments, including massages, facials, and body wraps, designed to relax your mind and body. Enjoy the serene ambiance and breathtaking views as you escape the stresses of everyday life.", + "locationName": "Various Luxury Resorts", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "malta", + "ref": "spa-day-at-a-luxury-resort", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_spa-day-at-a-luxury-resort.jpg" + }, + { + "name": "Birdwatching at Għadira Nature Reserve", + "description": "Embark on a tranquil birdwatching experience at Għadira Nature Reserve, a haven for migratory birds. Observe various species, including flamingos, herons, and ospreys, in their natural habitat. Enjoy the serene atmosphere and learn about Malta's diverse avian population.", + "locationName": "Għadira Nature Reserve", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "malta", + "ref": "birdwatching-at-g-adira-nature-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_birdwatching-at-g-adira-nature-reserve.jpg" + }, + { + "name": "Explore the Three Cities", + "description": "Step back in time and explore the charming Three Cities: Vittoriosa, Senglea, and Cospicua. Wander through narrow streets, admire historical architecture, and visit the Inquisitor's Palace. Enjoy breathtaking views of the Grand Harbour and immerse yourself in Malta's rich maritime history.", + "locationName": "The Three Cities (Vittoriosa, Senglea, Cospicua)", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "malta", + "ref": "explore-the-three-cities", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_explore-the-three-cities.jpg" + }, + { + "name": "Stargazing on Comino Island", + "description": "Escape the city lights and experience the magic of stargazing on Comino Island. With minimal light pollution, the night sky comes alive with a breathtaking display of stars. Relax on the beach, identify constellations, and marvel at the wonders of the universe.", + "locationName": "Comino Island", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "malta", + "ref": "stargazing-on-comino-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_stargazing-on-comino-island.jpg" + }, + { + "name": "Visit the Malta National Aquarium", + "description": "Embark on an underwater adventure at the Malta National Aquarium. Discover a diverse range of marine life from the Mediterranean Sea and beyond. Explore themed zones, walk through a tunnel surrounded by sharks, and learn about the importance of ocean conservation.", + "locationName": "Malta National Aquarium", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "malta", + "ref": "visit-the-malta-national-aquarium", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_visit-the-malta-national-aquarium.jpg" + }, + { + "name": "Traditional Maltese Cooking Class", + "description": "Immerse yourself in Maltese culture with a hands-on cooking class. Learn to prepare traditional dishes like rabbit stew, pastizzi, and lampuki pie. Discover the secrets of Maltese cuisine and enjoy the fruits of your labor with a delicious meal.", + "locationName": "Various locations", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "malta", + "ref": "traditional-maltese-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/malta_traditional-maltese-cooking-class.jpg" + }, + { + "name": "Explore the Jemaa el-Fna Square", + "description": "Immerse yourself in the vibrant heart of Marrakech at the Jemaa el-Fna Square. Witness the captivating spectacle of snake charmers, storytellers, musicians, and food vendors. As the day transitions into evening, the square transforms with the aromas of local delicacies and the mesmerizing energy of street performers. This cultural experience is a must for any visitor to Marrakech.", + "locationName": "Jemaa el-Fna Square", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "marrakech", + "ref": "explore-the-jemaa-el-fna-square", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_explore-the-jemaa-el-fna-square.jpg" + }, + { + "name": "Wander through the Souks", + "description": "Embark on a sensory adventure through the labyrinthine alleyways of the Marrakech souks. Discover a treasure trove of handcrafted goods, from intricately woven carpets and vibrant ceramics to aromatic spices and dazzling jewelry. Practice your bargaining skills and find unique souvenirs to commemorate your trip.", + "locationName": "Marrakech Souks", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "marrakech", + "ref": "wander-through-the-souks", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_wander-through-the-souks.jpg" + }, + { + "name": "Visit the Majorelle Garden", + "description": "Escape the city bustle and find serenity in the enchanting Majorelle Garden. Stroll through lush pathways adorned with vibrant blue buildings, exotic plants, and tranquil pools. This botanical oasis offers a peaceful retreat and a perfect opportunity for photography enthusiasts.", + "locationName": "Majorelle Garden", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "marrakech", + "ref": "visit-the-majorelle-garden", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_visit-the-majorelle-garden.jpg" + }, + { + "name": "Indulge in a Traditional Hammam Experience", + "description": "Treat yourself to a rejuvenating hammam experience, a quintessential part of Moroccan culture. Relax and unwind in a steam bath, followed by a thorough exfoliation and massage. Emerge feeling refreshed and revitalized, ready to continue your Marrakech adventure.", + "locationName": "Various Hammams throughout the city", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "marrakech", + "ref": "indulge-in-a-traditional-hammam-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_indulge-in-a-traditional-hammam-experience.jpg" + }, + { + "name": "Savor Moroccan Cuisine", + "description": "Embark on a culinary journey through the flavors of Morocco. Sample traditional dishes like tagine, couscous, and pastilla. Explore the Djemaa el-Fna night market for an array of street food options or enjoy a fine dining experience at a rooftop restaurant with stunning city views.", + "locationName": "Various restaurants and food stalls throughout the city", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "marrakech", + "ref": "savor-moroccan-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_savor-moroccan-cuisine.jpg" + }, + { + "name": "Hot Air Balloon Ride over the Atlas Mountains", + "description": "Embark on an unforgettable adventure with a sunrise hot air balloon ride over the majestic Atlas Mountains. Witness breathtaking panoramic views of the rugged landscape, traditional Berber villages, and the vast desert as you gently float above it all. This once-in-a-lifetime experience offers a unique perspective of Morocco's natural beauty and is perfect for capturing stunning photos.", + "locationName": "Atlas Mountains", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "marrakech", + "ref": "hot-air-balloon-ride-over-the-atlas-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_hot-air-balloon-ride-over-the-atlas-mountains.jpg" + }, + { + "name": "Day Trip to Essaouira", + "description": "Escape the bustling city life and embark on a day trip to the charming coastal town of Essaouira. Known for its laid-back atmosphere, beautiful beaches, and vibrant art scene, Essaouira offers a refreshing change of pace. Explore the historic ramparts, wander through the colourful medina, or relax on the sandy shores while enjoying the cool ocean breeze.", + "locationName": "Essaouira", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "marrakech", + "ref": "day-trip-to-essaouira", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_day-trip-to-essaouira.jpg" + }, + { + "name": "Quad Biking in the Agafay Desert", + "description": "Experience the thrill of adventure with a quad biking excursion through the Agafay Desert. Feel the adrenaline rush as you navigate the rocky terrain and sandy dunes, surrounded by stunning desert landscapes. This exciting activity offers a unique way to explore the Moroccan desert and is perfect for those seeking an adrenaline-pumping adventure.", + "locationName": "Agafay Desert", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "marrakech", + "ref": "quad-biking-in-the-agafay-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_quad-biking-in-the-agafay-desert.jpg" + }, + { + "name": "Visit the Bahia Palace", + "description": "Immerse yourself in Moroccan history and architecture with a visit to the Bahia Palace. This stunning 19th-century palace is a masterpiece of intricate design and craftsmanship, featuring beautiful courtyards, ornate rooms, and lush gardens. Explore the palace's rich history and marvel at its exquisite details, offering a glimpse into the opulent lifestyle of Moroccan royalty.", + "locationName": "Bahia Palace", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "marrakech", + "ref": "visit-the-bahia-palace", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_visit-the-bahia-palace.jpg" + }, + { + "name": "Enjoy a Cooking Class", + "description": "Delve into the world of Moroccan cuisine with a hands-on cooking class. Learn the secrets of traditional dishes from experienced local chefs, using fresh, aromatic ingredients. Master the art of preparing tagines, couscous, and other culinary delights, and gain a deeper appreciation for Moroccan culture through its food.", + "locationName": "Various locations", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "marrakech", + "ref": "enjoy-a-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_enjoy-a-cooking-class.jpg" + }, + { + "name": "Atlas Mountains Trek", + "description": "Embark on a breathtaking journey through the rugged landscapes of the Atlas Mountains. Hike through picturesque valleys, encounter Berber villages, and witness panoramic views from towering peaks. Choose from various trails suitable for different fitness levels and durations, allowing you to connect with nature and experience the serenity of the mountains.", + "locationName": "Atlas Mountains", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "marrakech", + "ref": "atlas-mountains-trek", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_atlas-mountains-trek.jpg" + }, + { + "name": "Ouzoud Waterfalls Excursion", + "description": "Escape the city bustle and visit the mesmerizing Ouzoud Waterfalls, cascading down a series of tiers amidst lush greenery. Take a refreshing dip in the natural pools, witness playful monkeys swinging through the trees, and enjoy a scenic boat ride for a closer look at the falls' beauty. This natural wonder offers a perfect retreat for nature lovers and photographers.", + "locationName": "Ouzoud", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "marrakech", + "ref": "ouzoud-waterfalls-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_ouzoud-waterfalls-excursion.jpg" + }, + { + "name": "Sunset Camel Ride in the Agafay Desert", + "description": "Experience the magic of the desert with a captivating camel ride as the sun sets over the Agafay Desert. Traverse the undulating dunes, witness the changing hues of the sky, and immerse yourself in the tranquility of the landscape. This romantic and unforgettable adventure offers a unique perspective of Morocco's natural beauty.", + "locationName": "Agafay Desert", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "marrakech", + "ref": "sunset-camel-ride-in-the-agafay-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_sunset-camel-ride-in-the-agafay-desert.jpg" + }, + { + "name": "Jardin Secret Discovery", + "description": "Step into a hidden oasis in the heart of the Medina at Le Jardin Secret. Explore the beautifully restored Islamic gardens, featuring intricate water features, lush vegetation, and serene courtyards. Discover the fascinating history of the gardens and admire the traditional Moroccan architecture, offering a peaceful escape from the city's vibrant streets.", + "locationName": "Le Jardin Secret", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "marrakech", + "ref": "jardin-secret-discovery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_jardin-secret-discovery.jpg" + }, + { + "name": "Live Music at a Traditional Riad", + "description": "Immerse yourself in the enchanting atmosphere of a traditional riad and enjoy an evening of live Moroccan music. Listen to the mesmerizing melodies of local musicians, experience the rhythmic beats of Gnawa music, or sway to the soulful tunes of Andalusian sounds. This cultural experience offers a glimpse into the rich musical heritage of Morocco.", + "locationName": "Various Riads", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "marrakech", + "ref": "live-music-at-a-traditional-riad", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_live-music-at-a-traditional-riad.jpg" + }, + { + "name": "Horse-Drawn Carriage Ride through Marrakech", + "description": "Embark on a charming horse-drawn carriage ride through the enchanting streets of Marrakech. Clip-clop your way past iconic landmarks, hidden squares, and vibrant neighbourhoods, experiencing the city's charm from a unique perspective. This leisurely tour offers a relaxing way to soak in the sights and sounds of Marrakech.", + "locationName": "Marrakech City Center", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "marrakech", + "ref": "horse-drawn-carriage-ride-through-marrakech", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_horse-drawn-carriage-ride-through-marrakech.jpg" + }, + { + "name": "Visit the Saadian Tombs", + "description": "Step back in time and discover the opulent Saadian Tombs, a historical necropolis dating back to the Saadian dynasty. Marvel at the intricate carvings, colourful mosaics, and peaceful courtyards that adorn the tombs of sultans, their families, and close advisors. This cultural experience offers a glimpse into Morocco's rich history and architectural grandeur.", + "locationName": "Saadian Tombs", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "marrakech", + "ref": "visit-the-saadian-tombs", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_visit-the-saadian-tombs.jpg" + }, + { + "name": "Explore the Mellah (Jewish Quarter)", + "description": "Delve into the historical Mellah, the Jewish Quarter of Marrakech, and uncover its unique cultural heritage. Wander through its narrow streets, visit the synagogues, and explore the spice markets. Learn about the Jewish community's history and traditions in Morocco, gaining a deeper understanding of the city's diverse cultural tapestry.", + "locationName": "Mellah (Jewish Quarter)", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "marrakech", + "ref": "explore-the-mellah-jewish-quarter-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_explore-the-mellah-jewish-quarter-.jpg" + }, + { + "name": "Enjoy a Rooftop Dinner with Views", + "description": "As the sun sets over Marrakech, ascend to a rooftop restaurant and savour a delectable dinner with panoramic views of the city. Indulge in traditional Moroccan cuisine or international flavours, while enjoying the cool evening breeze and the twinkling city lights. This romantic experience offers a memorable way to end a day of exploration.", + "locationName": "Various rooftop restaurants", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "marrakech", + "ref": "enjoy-a-rooftop-dinner-with-views", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_enjoy-a-rooftop-dinner-with-views.jpg" + }, + { + "name": "Attend a Fantasia Show", + "description": "Immerse yourself in the vibrant spectacle of a Fantasia show, a traditional Moroccan equestrian performance. Witness skilled horsemen charging on horseback, performing daring stunts, and showcasing their horsemanship prowess. The show often includes music, acrobatics, and colourful costumes, creating a captivating cultural experience.", + "locationName": "Chez Ali or other Fantasia venues", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "marrakech", + "ref": "attend-a-fantasia-show", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/marrakech_attend-a-fantasia-show.jpg" + }, + { + "name": "Road to Hana", + "description": "Embark on a legendary road trip along the winding Road to Hana, stopping at cascading waterfalls, secluded beaches, and lush rainforests. Discover hidden gems like the Twin Falls, Waimoku Falls, and the black sand beach at Waiʻanapanapa State Park. Pack a picnic lunch and enjoy the breathtaking scenery along the way.", + "locationName": "Hana Highway", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "maui", + "ref": "road-to-hana", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_road-to-hana.jpg" + }, + { + "name": "Haleakala Sunrise", + "description": "Witness the awe-inspiring sunrise from the summit of Haleakala, a dormant volcano and the highest point on Maui. As the sun peeks over the horizon, casting a golden glow over the crater and the clouds below, you'll feel like you're standing above the world. Make sure to book your sunrise reservation in advance.", + "locationName": "Haleakala National Park", + "duration": 5, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "maui", + "ref": "haleakala-sunrise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_haleakala-sunrise.jpg" + }, + { + "name": "Molokini Crater Snorkeling", + "description": "Dive into the crystal-clear waters of Molokini Crater, a partially submerged volcanic caldera teeming with marine life. Snorkel or scuba dive among colorful fish, sea turtles, and vibrant coral reefs. Boat tours often include breakfast, lunch, and snorkeling equipment, making it a convenient and unforgettable experience.", + "locationName": "Molokini Crater", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "maui", + "ref": "molokini-crater-snorkeling", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_molokini-crater-snorkeling.jpg" + }, + { + "name": "Whale Watching", + "description": "During whale watching season (typically November to April), embark on a boat tour to witness the majestic humpback whales that migrate to Maui's warm waters. Marvel at their acrobatic breaches, tail slaps, and haunting songs. Knowledgeable guides will share insights about these gentle giants and their fascinating behaviors.", + "locationName": "Auau Channel", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "maui", + "ref": "whale-watching", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_whale-watching.jpg" + }, + { + "name": "Sunset at Ka'anapali Beach", + "description": "Unwind with a breathtaking sunset at Ka'anapali Beach, one of Maui's most famous stretches of sand. Relax on the beach, take a dip in the ocean, or enjoy a romantic stroll along the shore as the sky explodes with vibrant colors. Consider enjoying a delicious meal at a beachfront restaurant while soaking in the magical ambiance.", + "locationName": "Ka'anapali Beach", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "maui", + "ref": "sunset-at-ka-anapali-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_sunset-at-ka-anapali-beach.jpg" + }, + { + "name": "Iao Valley State Park Hike", + "description": "Immerse yourself in the lush beauty of Iao Valley State Park. Hike through the rainforest to the iconic Iao Needle, a towering rock formation shrouded in legend. Explore the park's diverse flora and fauna, and learn about its cultural significance to the Hawaiian people. Enjoy breathtaking views of the valley and the surrounding mountains.", + "locationName": "Iao Valley State Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "maui", + "ref": "iao-valley-state-park-hike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_iao-valley-state-park-hike.jpg" + }, + { + "name": "Ziplining Adventure", + "description": "Soar through the Maui rainforest on a thrilling zipline adventure. Experience the island's natural beauty from a unique perspective as you zip through the treetops. Choose from various zipline courses, offering different levels of intensity and stunning views.", + "locationName": "Various locations throughout Maui", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "maui", + "ref": "ziplining-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_ziplining-adventure.jpg" + }, + { + "name": "Maui Ocean Center", + "description": "Embark on an underwater journey at the Maui Ocean Center. Discover the diverse marine life of Hawaii through interactive exhibits, underwater tunnels, and touch pools. Learn about conservation efforts and the importance of protecting the ocean's ecosystem.", + "locationName": "Maui Ocean Center", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "maui", + "ref": "maui-ocean-center", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_maui-ocean-center.jpg" + }, + { + "name": "Old Lahaina Luau", + "description": "Immerse yourself in Hawaiian culture at the Old Lahaina Luau. Enjoy a traditional feast, featuring local delicacies and tropical cocktails. Witness captivating hula performances, fire dancers, and live music, while learning about Hawaiian history and traditions.", + "locationName": "Old Lahaina Luau", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "maui", + "ref": "old-lahaina-luau", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_old-lahaina-luau.jpg" + }, + { + "name": "Surfing Lessons", + "description": "Catch a wave and learn to surf on the beautiful beaches of Maui. Take a surfing lesson from experienced instructors and experience the thrill of riding the waves. Enjoy the warm waters and the stunning ocean views as you master the art of surfing.", + "locationName": "Various beaches throughout Maui", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "maui", + "ref": "surfing-lessons", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_surfing-lessons.jpg" + }, + { + "name": "Hike the Pipiwai Trail", + "description": "Embark on a breathtaking journey through bamboo forests, past cascading waterfalls, and to a stunning banyan tree on the Pipiwai Trail in Haleakala National Park. This moderate hike offers incredible views and a chance to immerse yourself in Maui's lush rainforest.", + "locationName": "Haleakala National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "maui", + "ref": "hike-the-pipiwai-trail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_hike-the-pipiwai-trail.jpg" + }, + { + "name": "Explore the Maui Tropical Plantation", + "description": "Discover the agricultural beauty of Maui at the Maui Tropical Plantation. Take a tram tour through fields of pineapple, sugarcane, and coffee, learn about the island's farming history, and indulge in delicious farm-to-table cuisine at the Mill House Restaurant.", + "locationName": "Maui Tropical Plantation", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "maui", + "ref": "explore-the-maui-tropical-plantation", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_explore-the-maui-tropical-plantation.jpg" + }, + { + "name": "Stargazing at Haleakala", + "description": "Experience the magic of the night sky from atop Haleakala. Join a stargazing tour or find a secluded spot to marvel at the constellations, planets, and Milky Way. The high altitude and clear skies of Haleakala offer unparalleled views of the celestial wonders.", + "locationName": "Haleakala National Park", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "maui", + "ref": "stargazing-at-haleakala", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_stargazing-at-haleakala.jpg" + }, + { + "name": "Kayaking and Snorkeling Adventure", + "description": "Embark on a kayaking and snorkeling adventure along the Maui coastline. Paddle through crystal-clear waters, explore hidden coves, and discover vibrant coral reefs teeming with marine life. This activity offers a unique perspective of Maui's natural beauty.", + "locationName": "Various locations along the Maui coastline", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "maui", + "ref": "kayaking-and-snorkeling-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_kayaking-and-snorkeling-adventure.jpg" + }, + { + "name": "Attend a Traditional Hawaiian Luau", + "description": "Immerse yourself in Hawaiian culture at a traditional luau. Enjoy a feast of local cuisine, watch captivating hula performances, and learn about the island's history and traditions. This is a perfect way to experience the spirit of Aloha.", + "locationName": "Various resorts and cultural centers", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "maui", + "ref": "attend-a-traditional-hawaiian-luau", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_attend-a-traditional-hawaiian-luau.jpg" + }, + { + "name": "Helicopter Tour over Maui", + "description": "Embark on an exhilarating helicopter tour that unveils Maui's breathtaking landscapes from a unique perspective. Soar over volcanic craters, cascading waterfalls, and hidden valleys, capturing panoramic views of the island's diverse beauty.", + "locationName": "Kahului Heliport", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "maui", + "ref": "helicopter-tour-over-maui", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_helicopter-tour-over-maui.jpg" + }, + { + "name": "Biking Down Haleakala", + "description": "Experience an unforgettable adventure by biking down the slopes of Haleakala. Witness the stunning sunrise from the summit, then coast down the winding roads, enjoying breathtaking views and the thrill of the descent.", + "locationName": "Haleakala National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "maui", + "ref": "biking-down-haleakala", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_biking-down-haleakala.jpg" + }, + { + "name": "Sunset Sail with Cocktails", + "description": "Set sail on a romantic sunset cruise along the Maui coastline. Sip on handcrafted cocktails as you admire the vibrant hues of the sky, listen to live music, and enjoy the gentle ocean breeze.", + "locationName": "Lahaina Harbor", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "maui", + "ref": "sunset-sail-with-cocktails", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_sunset-sail-with-cocktails.jpg" + }, + { + "name": "Maui Arts & Cultural Center", + "description": "Immerse yourself in the vibrant arts scene of Maui at the Maui Arts & Cultural Center. Enjoy live music performances, theater productions, art exhibitions, and cultural workshops that showcase the island's rich heritage.", + "locationName": "Maui Arts & Cultural Center", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "maui", + "ref": "maui-arts-cultural-center", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_maui-arts-cultural-center.jpg" + }, + { + "name": "Upcountry Farmers Market Hopping", + "description": "Embark on a culinary journey through Maui's Upcountry region, visiting charming farmers markets. Sample fresh local produce, artisanal cheeses, baked goods, and handcrafted treats while soaking up the relaxed atmosphere.", + "locationName": "Upcountry Maui", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "maui", + "ref": "upcountry-farmers-market-hopping", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/maui_upcountry-farmers-market-hopping.jpg" + }, + { + "name": "Scenic Cruise through Milford Sound", + "description": "Embark on a breathtaking boat journey through the heart of Milford Sound. Marvel at the towering Mitre Peak, cascading waterfalls, and lush rainforests as you glide along the pristine waters. Keep an eye out for playful dolphins, fur seals, and Fiordland penguins that call this area home.", + "locationName": "Milford Sound", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "milford-sound", + "ref": "scenic-cruise-through-milford-sound", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_scenic-cruise-through-milford-sound.jpg" + }, + { + "name": "Kayaking Adventure", + "description": "Paddle through the tranquil waters of Milford Sound at your own pace, getting up close to the dramatic cliffs and waterfalls. Explore hidden coves and experience the serenity of this natural wonder from a unique perspective. Kayaking tours cater to different skill levels, making it an enjoyable activity for both beginners and experienced paddlers.", + "locationName": "Milford Sound", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 2, + "destinationRef": "milford-sound", + "ref": "kayaking-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_kayaking-adventure.jpg" + }, + { + "name": "Milford Track Hike", + "description": "Embark on a multi-day trekking adventure along the world-renowned Milford Track. This 53.5 km trail winds through stunning landscapes, including valleys, mountains, and waterfalls. Experience the thrill of crossing suspension bridges, staying in backcountry huts, and immersing yourself in the untouched beauty of Fiordland National Park.", + "locationName": "Fiordland National Park", + "duration": 48, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "milford-sound", + "ref": "milford-track-hike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_milford-track-hike.jpg" + }, + { + "name": "Underwater Observatory", + "description": "Descend into the depths of Milford Sound at the Milford Discovery Centre and Underwater Observatory. Observe the unique marine life, including black coral trees, sponges, and colorful fish, through large viewing windows. Learn about the fiord's ecosystem and the importance of conservation efforts.", + "locationName": "Milford Discovery Centre and Underwater Observatory", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "milford-sound", + "ref": "underwater-observatory", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_underwater-observatory.jpg" + }, + { + "name": "Scenic Flight", + "description": "Take to the skies for a breathtaking aerial perspective of Milford Sound and the surrounding Fiordland National Park. Soar above towering peaks, glaciers, and hidden valleys, capturing stunning panoramic views. This unforgettable experience offers a unique way to appreciate the grandeur of this natural wonder.", + "locationName": "Milford Sound Airport", + "duration": 1, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "milford-sound", + "ref": "scenic-flight", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_scenic-flight.jpg" + }, + { + "name": "Fiordland Discovery Centre and Underwater Observatory", + "description": "Dive into the underwater world of Milford Sound without getting wet at the Fiordland Discovery Centre and Underwater Observatory. Descend 10 meters below the surface to observe the unique marine life, including black coral, through large viewing windows. Learn about the fiord's formation, history, and delicate ecosystem through interactive exhibits. This family-friendly activity offers a fascinating glimpse into the hidden depths of Milford Sound.", + "locationName": "Fiordland Discovery Centre", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "milford-sound", + "ref": "fiordland-discovery-centre-and-underwater-observatory", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_fiordland-discovery-centre-and-underwater-observatory.jpg" + }, + { + "name": "Scenic Drive along Milford Road", + "description": "Embark on a breathtaking road trip along Milford Road, considered one of the world's most scenic drives. Wind through valleys, alongside towering mountains, and past cascading waterfalls like The Chasm and Stirling Falls. Capture stunning photos at designated lookout points, such as Eglinton Valley and Mirror Lakes. Keep an eye out for native wildlife, including kea parrots and cheeky weka birds. This self-guided adventure allows you to explore the beauty of Fiordland National Park at your own pace.", + "locationName": "Milford Road", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "milford-sound", + "ref": "scenic-drive-along-milford-road", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_scenic-drive-along-milford-road.jpg" + }, + { + "name": "Nature Walk to Lady Bowen Falls", + "description": "Immerse yourself in the lush rainforest scenery with a short and accessible walk to the base of Lady Bowen Falls. The well-maintained track leads you through vibrant native flora and offers stunning views of the fiord. Feel the refreshing spray of the falls as you approach the viewing platform. This easy walk is perfect for families and those looking for a gentle nature experience.", + "locationName": "Lady Bowen Falls Track", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "milford-sound", + "ref": "nature-walk-to-lady-bowen-falls", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_nature-walk-to-lady-bowen-falls.jpg" + }, + { + "name": "Discover Maori Culture at Milford Sound Lodge", + "description": "Delve into the rich cultural heritage of the Maori people with a visit to the Milford Sound Lodge. Experience a traditional welcome ceremony, learn about Maori legends and history, and admire intricate carvings and artwork. Participate in interactive activities like weaving or carving demonstrations. This immersive cultural experience provides a deeper understanding of the Maori connection to Milford Sound and the surrounding Fiordland region.", + "locationName": "Milford Sound Lodge", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "milford-sound", + "ref": "discover-maori-culture-at-milford-sound-lodge", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_discover-maori-culture-at-milford-sound-lodge.jpg" + }, + { + "name": "Stargazing in the Sounds", + "description": "Escape the city lights and marvel at the breathtaking night sky above Milford Sound. With minimal light pollution, the fiord offers exceptional stargazing opportunities. Join a guided astronomy tour to learn about constellations, planets, and the Milky Way, or simply lie back and enjoy the celestial show. This awe-inspiring experience is perfect for a romantic evening or a unique family adventure.", + "locationName": "Milford Sound", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "milford-sound", + "ref": "stargazing-in-the-sounds", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_stargazing-in-the-sounds.jpg" + }, + { + "name": "Dive into the Depths with Scuba Diving", + "description": "Experience the magic of Milford Sound beneath the surface with a scuba diving adventure. Plunge into the deep fiord and discover a hidden world teeming with marine life, including black coral trees, colorful fish, and playful seals. Dive operators offer guided excursions for all levels, from beginners to experienced divers, ensuring a safe and unforgettable underwater journey.", + "locationName": "Various dive sites within Milford Sound", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "milford-sound", + "ref": "dive-into-the-depths-with-scuba-diving", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_dive-into-the-depths-with-scuba-diving.jpg" + }, + { + "name": "Fly Fishing in Pristine Waters", + "description": "Cast your line amidst the stunning scenery of Milford Sound and try your hand at fly fishing. The area is renowned for its brown and rainbow trout, providing an exciting challenge for anglers of all skill levels. Local guides can lead you to the best fishing spots and offer expert advice, making for a rewarding and tranquil experience in nature.", + "locationName": "Cleddau River or Lake Te Anau", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "milford-sound", + "ref": "fly-fishing-in-pristine-waters", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_fly-fishing-in-pristine-waters.jpg" + }, + { + "name": "Picnic with a View at Mitre Peak", + "description": "Pack a delightful picnic basket and head to the base of the iconic Mitre Peak for an unforgettable dining experience. Find a scenic spot along the shoreline or amidst the lush greenery, and savor your meal while marveling at the towering peak and the surrounding natural beauty. It's the perfect way to relax and soak in the tranquility of Milford Sound.", + "locationName": "Mitre Peak", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "milford-sound", + "ref": "picnic-with-a-view-at-mitre-peak", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_picnic-with-a-view-at-mitre-peak.jpg" + }, + { + "name": "Birdwatching Paradise", + "description": "Embark on a birdwatching expedition and discover the diverse avian species that call Milford Sound home. Keep an eye out for rare birds like the Fiordland penguin, the kea (a playful alpine parrot), and the South Island robin. Explore the various walking trails and hidden coves to spot these feathered wonders in their natural habitat.", + "locationName": "Fiordland National Park", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "milford-sound", + "ref": "birdwatching-paradise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_birdwatching-paradise.jpg" + }, + { + "name": "Capture the Beauty: Photography Tour", + "description": "Join a photography tour led by a local expert and learn how to capture the breathtaking landscapes of Milford Sound. Discover the best vantage points, lighting techniques, and composition tips to create stunning images that will preserve your memories of this magical place. Whether you're a seasoned photographer or a novice, this tour offers a unique perspective and an opportunity to hone your skills.", + "locationName": "Various locations throughout Milford Sound", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "milford-sound", + "ref": "capture-the-beauty-photography-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_capture-the-beauty-photography-tour.jpg" + }, + { + "name": "Canyoning Adventure", + "description": "Embark on a thrilling canyoning experience in the heart of Fiordland National Park. Rappel down cascading waterfalls, plunge into crystal-clear pools, and navigate through narrow gorges, surrounded by breathtaking scenery. This adrenaline-pumping activity is perfect for adventure seekers.", + "locationName": "Cleddau Canyon", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "milford-sound", + "ref": "canyoning-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_canyoning-adventure.jpg" + }, + { + "name": "Milford Sound Foreshore Walk", + "description": "Take a leisurely stroll along the Milford Sound foreshore and immerse yourself in the tranquility of nature. This easy walking trail offers stunning views of the fiord, lush rainforest, and Mitre Peak. Keep an eye out for native birds and marine life, including seals and penguins.", + "locationName": "Milford Sound Foreshore", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "milford-sound", + "ref": "milford-sound-foreshore-walk", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_milford-sound-foreshore-walk.jpg" + }, + { + "name": "Te Anau Glowworm Caves", + "description": "Embark on a magical journey through the Te Anau Glowworm Caves, a subterranean wonderland illuminated by thousands of tiny glowworms. Take a boat ride through the darkness and marvel at the twinkling lights, while learning about the unique ecosystem of these fascinating creatures.", + "locationName": "Te Anau", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "milford-sound", + "ref": "te-anau-glowworm-caves", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_te-anau-glowworm-caves.jpg" + }, + { + "name": "Horseback Riding through Fiordland", + "description": "Explore the stunning landscapes of Fiordland National Park on horseback. Ride through native forests, alongside pristine rivers, and enjoy panoramic views of the surrounding mountains. This activity is suitable for all levels of experience and offers a unique perspective of the area.", + "locationName": "Fiordland National Park", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "milford-sound", + "ref": "horseback-riding-through-fiordland", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_horseback-riding-through-fiordland.jpg" + }, + { + "name": "Relaxing Spa Day", + "description": "Indulge in a day of pampering and rejuvenation at a luxurious spa. Choose from a range of treatments, including massages, facials, and body wraps, and let your stress melt away amidst the serene surroundings. This is the perfect way to unwind after a day of exploring.", + "locationName": "Milford Sound Lodge", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "milford-sound", + "ref": "relaxing-spa-day", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/milford-sound_relaxing-spa-day.jpg" + }, + { + "name": "Hiking in Arches National Park", + "description": "Embark on a breathtaking hike through Arches National Park, home to over 2,000 natural sandstone arches. Explore iconic formations like Delicate Arch, Landscape Arch, and Double Arch, and witness the awe-inspiring power of nature. Trails range from easy to challenging, offering options for all fitness levels.", + "locationName": "Arches National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "moab", + "ref": "hiking-in-arches-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_hiking-in-arches-national-park.jpg" + }, + { + "name": "Mountain Biking the Slickrock Trail", + "description": "Experience the thrill of mountain biking on the world-renowned Slickrock Trail. This challenging route features steep inclines, slickrock surfaces, and stunning views of the Moab landscape. Test your skills and endurance as you navigate this iconic trail.", + "locationName": "Slickrock Bike Trail", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "moab", + "ref": "mountain-biking-the-slickrock-trail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_mountain-biking-the-slickrock-trail.jpg" + }, + { + "name": "White-Water Rafting on the Colorado River", + "description": "Embark on an exhilarating white-water rafting adventure on the Colorado River. Navigate through rapids, admire the towering canyon walls, and experience the thrill of this iconic river. Choose from various trip lengths and difficulty levels to suit your preferences.", + "locationName": "Colorado River", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "moab", + "ref": "white-water-rafting-on-the-colorado-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_white-water-rafting-on-the-colorado-river.jpg" + }, + { + "name": "Off-Roading in Canyonlands National Park", + "description": "Explore the rugged backcountry of Canyonlands National Park on an off-roading adventure. Discover hidden canyons, ancient ruins, and breathtaking viewpoints as you navigate the challenging terrain. This thrilling experience offers a unique perspective of the park's vast landscapes.", + "locationName": "Canyonlands National Park", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "moab", + "ref": "off-roading-in-canyonlands-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_off-roading-in-canyonlands-national-park.jpg" + }, + { + "name": "Stargazing in the Desert", + "description": "Escape the city lights and experience the magic of stargazing in the Moab desert. With minimal light pollution, the night sky comes alive with countless stars, constellations, and even the Milky Way. Join a guided stargazing tour or find a secluded spot to marvel at the celestial wonders above.", + "locationName": "Moab Desert", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "moab", + "ref": "stargazing-in-the-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_stargazing-in-the-desert.jpg" + }, + { + "name": "Canyoneering", + "description": "Embark on a thrilling canyoneering adventure, rappelling down sandstone cliffs, navigating slot canyons, and exploring hidden waterfalls. This activity offers a unique perspective of Moab's rugged landscapes and is perfect for adrenaline seekers.", + "locationName": "Various canyons around Moab", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "moab", + "ref": "canyoneering", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_canyoneering.jpg" + }, + { + "name": "Scenic Drives", + "description": "Take a leisurely drive along scenic byways like the Potash Road or La Sal Mountain Loop, offering breathtaking views of red rock formations, canyons, and the La Sal Mountains. Enjoy photo opportunities and picnics at designated stops.", + "locationName": "Potash Road, La Sal Mountain Loop", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "moab", + "ref": "scenic-drives", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_scenic-drives.jpg" + }, + { + "name": "Rock Climbing", + "description": "Challenge yourself with rock climbing on Moab's iconic sandstone cliffs. With routes for all skill levels, from beginner to expert, experience the thrill of scaling vertical walls and enjoying panoramic views.", + "locationName": "Various climbing areas around Moab", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "moab", + "ref": "rock-climbing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_rock-climbing.jpg" + }, + { + "name": "Dinosaur Museum", + "description": "Explore the Moab Museum, which houses fascinating exhibits on the region's rich paleontological history. Discover dinosaur fossils, learn about ancient cultures, and delve into the geological wonders of the area.", + "locationName": "Moab Museum", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "moab", + "ref": "dinosaur-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_dinosaur-museum.jpg" + }, + { + "name": "Hot Air Balloon Ride", + "description": "Experience the magic of a hot air balloon ride over Moab's breathtaking landscapes. Soar above red rock formations, canyons, and the Colorado River, enjoying panoramic views and a unique perspective of the desert.", + "locationName": "Moab Valley", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "moab", + "ref": "hot-air-balloon-ride", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_hot-air-balloon-ride.jpg" + }, + { + "name": "Horseback Riding in the Desert", + "description": "Embark on a scenic horseback riding adventure through the rugged desert landscape surrounding Moab. Local outfitters offer guided tours suitable for all skill levels, allowing you to explore hidden canyons, ancient ruins, and panoramic vistas at a relaxed pace. This activity is a unique way to connect with nature and experience the Old West charm of Moab.", + "locationName": "Various locations around Moab", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "moab", + "ref": "horseback-riding-in-the-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_horseback-riding-in-the-desert.jpg" + }, + { + "name": "Scenic Flight Over Canyonlands National Park", + "description": "Take to the skies for a breathtaking aerial tour of Canyonlands National Park. Soar above the vast canyons, mesas, and rivers, gaining a unique perspective of the park's iconic landmarks like Mesa Arch, the Green River Overlook, and the Needles district. This unforgettable experience offers stunning photo opportunities and a chance to appreciate the sheer scale and beauty of the desert landscape.", + "locationName": "Canyonlands National Park", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "moab", + "ref": "scenic-flight-over-canyonlands-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_scenic-flight-over-canyonlands-national-park.jpg" + }, + { + "name": "Relaxation and Rejuvenation at a Spa", + "description": "After a day of adventure, unwind and indulge in a pampering spa experience. Moab offers several wellness centers and spas where you can enjoy a variety of treatments, including massages, facials, body wraps, and hydrotherapy. Some spas even incorporate local elements like red rock clay or desert botanicals into their treatments, providing a unique and rejuvenating experience.", + "locationName": "Various spas in Moab", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "moab", + "ref": "relaxation-and-rejuvenation-at-a-spa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_relaxation-and-rejuvenation-at-a-spa.jpg" + }, + { + "name": "Explore Moab's Culinary Scene", + "description": "Discover the diverse flavors of Moab's culinary scene. From casual cafes and breweries to fine dining establishments, Moab offers a range of options to satisfy any palate. Sample Southwestern specialties, indulge in wood-fired pizzas, or savor fresh, locally sourced ingredients. Be sure to try the craft beers brewed in Moab and explore the charming cafes and restaurants along Main Street.", + "locationName": "Various restaurants and cafes in Moab", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "moab", + "ref": "explore-moab-s-culinary-scene", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_explore-moab-s-culinary-scene.jpg" + }, + { + "name": "Attend a Moab Music Festival Performance", + "description": "Immerse yourself in the vibrant arts and culture scene of Moab by attending a performance at the Moab Music Festival. This renowned festival features world-class musicians performing chamber music, jazz, and other genres in stunning outdoor settings amidst the red rock landscapes. Enjoy an evening of exceptional music under the stars, surrounded by the natural beauty of Moab.", + "locationName": "Various locations in Moab", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "moab", + "ref": "attend-a-moab-music-festival-performance", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_attend-a-moab-music-festival-performance.jpg" + }, + { + "name": "Jeep Safari Tour to Dead Horse Point State Park", + "description": "Embark on a thrilling jeep safari tour to Dead Horse Point State Park, renowned for its breathtaking panoramic views of the Colorado River and Canyonlands National Park. Traverse rugged trails, learn about the area's geology and history, and capture stunning photographs of the iconic landscapes.", + "locationName": "Dead Horse Point State Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "moab", + "ref": "jeep-safari-tour-to-dead-horse-point-state-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_jeep-safari-tour-to-dead-horse-point-state-park.jpg" + }, + { + "name": "Stand Up Paddleboarding on the Colorado River", + "description": "Experience the serenity of the Colorado River from a unique perspective with stand-up paddleboarding. Glide along calm stretches of the river, surrounded by towering red rock cliffs, and enjoy the tranquility of nature. This activity is suitable for all skill levels and offers a relaxing way to explore the waterways.", + "locationName": "Colorado River", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "moab", + "ref": "stand-up-paddleboarding-on-the-colorado-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_stand-up-paddleboarding-on-the-colorado-river.jpg" + }, + { + "name": "Visit the Moab Museum", + "description": "Delve into the rich history and culture of Moab at the Moab Museum. Discover exhibits that showcase the region's Native American heritage, pioneer settlements, uranium mining boom, and the development of Moab as an adventure tourism destination. Gain insights into the area's unique past and present.", + "locationName": "Moab Museum", + "duration": 1.5, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "moab", + "ref": "visit-the-moab-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_visit-the-moab-museum.jpg" + }, + { + "name": "Sunset Horseback Riding Adventure", + "description": "Saddle up for a magical horseback riding adventure as the sun sets over the Moab desert. Traverse scenic trails, witness the vibrant colors of the sky, and enjoy the peaceful ambiance of the evening. This experience is perfect for creating lasting memories.", + "locationName": "Moab desert trails", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "moab", + "ref": "sunset-horseback-riding-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_sunset-horseback-riding-adventure.jpg" + }, + { + "name": "Moab Brewery Tour and Tasting", + "description": "Indulge in the local craft beer scene with a tour and tasting at Moab Brewery. Learn about the brewing process, sample a variety of beers, and discover the unique flavors of Moab. This activity is ideal for beer enthusiasts and those seeking a relaxed evening experience.", + "locationName": "Moab Brewery", + "duration": 1.5, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "moab", + "ref": "moab-brewery-tour-and-tasting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/moab_moab-brewery-tour-and-tasting.jpg" + }, + { + "name": "Explore the Bay of Kotor", + "description": "Embark on a scenic boat tour around the Bay of Kotor, a UNESCO World Heritage Site. Marvel at the dramatic landscapes, charming coastal towns, and historical landmarks like Our Lady of the Rocks and the ancient city walls of Kotor.", + "locationName": "Bay of Kotor", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "montenegro", + "ref": "explore-the-bay-of-kotor", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_explore-the-bay-of-kotor.jpg" + }, + { + "name": "Hiking in Durmitor National Park", + "description": "Lace up your hiking boots and venture into the stunning Durmitor National Park. Hike through pristine forests, glacial lakes, and rugged peaks, including Bobotov Kuk, the highest peak in Montenegro. Enjoy breathtaking views and immerse yourself in nature.", + "locationName": "Durmitor National Park", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "montenegro", + "ref": "hiking-in-durmitor-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_hiking-in-durmitor-national-park.jpg" + }, + { + "name": "Relax on the Beaches of Budva", + "description": "Soak up the sun on the beautiful beaches of Budva, a popular coastal town known for its vibrant atmosphere. Enjoy swimming, sunbathing, or trying out water sports like kayaking and paddleboarding. In the evening, explore the charming Old Town and enjoy the lively nightlife.", + "locationName": "Budva", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "montenegro", + "ref": "relax-on-the-beaches-of-budva", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_relax-on-the-beaches-of-budva.jpg" + }, + { + "name": "Discover the Historic City of Kotor", + "description": "Step back in time and explore the historic city of Kotor. Wander through the labyrinthine streets of the Old Town, visit the Cathedral of Saint Tryphon, and climb the ancient city walls for panoramic views of the bay. Immerse yourself in the rich culture and history of this charming town.", + "locationName": "Kotor", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "montenegro", + "ref": "discover-the-historic-city-of-kotor", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_discover-the-historic-city-of-kotor.jpg" + }, + { + "name": "Experience Local Cuisine and Wine", + "description": "Indulge in the delicious flavors of Montenegrin cuisine. Sample fresh seafood specialties, hearty meat dishes, and local cheeses. Pair your meal with a glass of Montenegrin wine, known for its unique varietals and rich flavors. Visit a local winery or enjoy a traditional meal at a family-run restaurant.", + "locationName": "Various", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "montenegro", + "ref": "experience-local-cuisine-and-wine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_experience-local-cuisine-and-wine.jpg" + }, + { + "name": "Whitewater Rafting on the Tara River", + "description": "Embark on an exhilarating adventure through Europe's deepest canyon, the Tara River Canyon. Navigate thrilling rapids, surrounded by stunning landscapes, and experience the power of nature up close. Choose from various difficulty levels and enjoy a day of adrenaline and breathtaking scenery.", + "locationName": "Tara River Canyon", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "montenegro", + "ref": "whitewater-rafting-on-the-tara-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_whitewater-rafting-on-the-tara-river.jpg" + }, + { + "name": "Kayaking in the Bay of Kotor", + "description": "Explore the tranquil waters of the Bay of Kotor from a different perspective. Paddle along the coastline, admiring the picturesque villages, historic fortifications, and dramatic mountains that enclose the bay. Discover hidden coves, secluded beaches, and enjoy a peaceful escape surrounded by natural beauty.", + "locationName": "Bay of Kotor", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "montenegro", + "ref": "kayaking-in-the-bay-of-kotor", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_kayaking-in-the-bay-of-kotor.jpg" + }, + { + "name": "Wine Tasting Tour in Crmnica Region", + "description": "Indulge in the rich flavors of Montenegro's wine culture with a visit to the Crmnica region. Explore local vineyards, learn about traditional winemaking techniques, and sample a variety of indigenous grape varieties. Discover the unique characteristics of Vranac, Krstač, and other local wines, while enjoying the scenic beauty of the countryside.", + "locationName": "Crmnica Region", + "duration": 6, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "montenegro", + "ref": "wine-tasting-tour-in-crmnica-region", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_wine-tasting-tour-in-crmnica-region.jpg" + }, + { + "name": "Paragliding over Budva Riviera", + "description": "Soar above the stunning Budva Riviera and experience breathtaking panoramic views of the Adriatic coastline. Take off from the mountains and glide through the air, enjoying the sensation of freedom and admiring the beauty of the beaches, islands, and surrounding landscapes. This unforgettable adventure offers a unique perspective of Montenegro's coastal charm.", + "locationName": "Budva Riviera", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "montenegro", + "ref": "paragliding-over-budva-riviera", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_paragliding-over-budva-riviera.jpg" + }, + { + "name": "Exploring Skadar Lake National Park", + "description": "Discover the natural wonders of Skadar Lake National Park, the largest lake in the Balkans. Take a boat trip to explore the lake's diverse ecosystem, home to numerous bird species, including pelicans and herons. Visit traditional fishing villages, ancient monasteries, and hidden beaches, and immerse yourself in the tranquility of this unique natural haven.", + "locationName": "Skadar Lake National Park", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "montenegro", + "ref": "exploring-skadar-lake-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_exploring-skadar-lake-national-park.jpg" + }, + { + "name": "Canyoning in Nevidio Canyon", + "description": "Embark on an exhilarating canyoning adventure through the Nevidio Canyon, known for its narrow passages, cascading waterfalls, and stunning natural beauty. This activity involves rappelling, swimming, and jumping through the canyon, providing an unforgettable adrenaline rush. ", + "locationName": "Nevidio Canyon", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "montenegro", + "ref": "canyoning-in-nevidio-canyon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_canyoning-in-nevidio-canyon.jpg" + }, + { + "name": "Horseback Riding in the Mountains", + "description": "Explore the scenic landscapes of Montenegro's mountains on horseback, enjoying breathtaking views and a peaceful connection with nature. Choose from various trails suitable for all levels, from gentle rides through meadows to more challenging routes with panoramic vistas.", + "locationName": "Durmitor National Park or Lovcen National Park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "montenegro", + "ref": "horseback-riding-in-the-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_horseback-riding-in-the-mountains.jpg" + }, + { + "name": "Visit the Ostrog Monastery", + "description": "Discover the spiritual and architectural marvel of Ostrog Monastery, a Serbian Orthodox monastery carved into a cliff face. Witness stunning views, explore the monastery complex, and learn about its religious significance and history.", + "locationName": "Ostrog Monastery", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "montenegro", + "ref": "visit-the-ostrog-monastery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_visit-the-ostrog-monastery.jpg" + }, + { + "name": "Explore the Old Town of Budva", + "description": "Wander through the charming streets of Budva's Old Town, a historic fortified city with Venetian-era architecture, quaint shops, and lively cafes. Discover hidden squares, ancient churches, and the Citadel for panoramic views of the Adriatic Sea.", + "locationName": "Budva Old Town", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "montenegro", + "ref": "explore-the-old-town-of-budva", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_explore-the-old-town-of-budva.jpg" + }, + { + "name": "Enjoy the Nightlife in Budva or Kotor", + "description": "Experience Montenegro's vibrant nightlife scene in Budva or Kotor. Choose from a variety of bars, clubs, and restaurants offering live music, DJs, and entertainment. Dance the night away or relax with a drink while enjoying the coastal ambiance.", + "locationName": "Budva or Kotor", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "montenegro", + "ref": "enjoy-the-nightlife-in-budva-or-kotor", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_enjoy-the-nightlife-in-budva-or-kotor.jpg" + }, + { + "name": "Ziplining in Lovcen National Park", + "description": "Experience an adrenaline rush as you soar through the treetops of Lovcen National Park on a thrilling zipline adventure. Take in breathtaking views of the surrounding mountains and valleys as you zip from platform to platform. This activity is perfect for adventure seekers and nature lovers.", + "locationName": "Lovcen National Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "montenegro", + "ref": "ziplining-in-lovcen-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_ziplining-in-lovcen-national-park.jpg" + }, + { + "name": "Scuba Diving in the Adriatic Sea", + "description": "Dive into the crystal-clear waters of the Adriatic Sea and discover a vibrant underwater world teeming with marine life. Explore shipwrecks, reefs, and caves, and encounter colorful fish, octopuses, and other fascinating creatures.", + "locationName": "Adriatic Sea", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "montenegro", + "ref": "scuba-diving-in-the-adriatic-sea", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_scuba-diving-in-the-adriatic-sea.jpg" + }, + { + "name": "Visit the Njagara Waterfalls", + "description": "Embark on a scenic hike to the Njagara Waterfalls, a hidden gem nestled amidst lush greenery. Witness the cascading water as it plunges into a picturesque pool below, and enjoy a refreshing dip in the cool waters.", + "locationName": "Njagara Waterfalls", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "montenegro", + "ref": "visit-the-njagara-waterfalls", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_visit-the-njagara-waterfalls.jpg" + }, + { + "name": "Take a Boat Trip to Sveti Stefan", + "description": "Embark on a boat trip to the exclusive island of Sveti Stefan, a luxurious resort known for its stunning beaches and historical architecture. Explore the island's narrow streets, relax on the beach, and soak up the glamorous atmosphere.", + "locationName": "Sveti Stefan", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "montenegro", + "ref": "take-a-boat-trip-to-sveti-stefan", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_take-a-boat-trip-to-sveti-stefan.jpg" + }, + { + "name": "Birdwatching in Lake Skadar National Park", + "description": "Discover the diverse avian population of Lake Skadar National Park, a haven for birdwatchers. Spot pelicans, herons, egrets, and other species as you explore the wetlands, marshes, and open waters of the park.", + "locationName": "Lake Skadar National Park", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "montenegro", + "ref": "birdwatching-in-lake-skadar-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/montenegro_birdwatching-in-lake-skadar-national-park.jpg" + }, + { + "name": "Riesling Wine Tour and Tasting", + "description": "Embark on a delightful journey through the renowned vineyards of the Mosel Valley. Visit charming local wineries, meet passionate winemakers, and indulge in tastings of the region's celebrated Riesling wines. Learn about the unique terroir and winemaking traditions that contribute to the exceptional quality of Mosel wines.", + "locationName": "Various wineries along the Mosel River", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "mosel-valley", + "ref": "riesling-wine-tour-and-tasting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_riesling-wine-tour-and-tasting.jpg" + }, + { + "name": "Cochem Castle Exploration", + "description": "Step back in time with a visit to the majestic Cochem Castle, perched high above the Mosel River. Explore the medieval architecture, wander through historic halls, and enjoy panoramic views of the surrounding valley. Immerse yourself in the rich history and captivating legends of this iconic landmark.", + "locationName": "Cochem Castle", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "mosel-valley", + "ref": "cochem-castle-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_cochem-castle-exploration.jpg" + }, + { + "name": "Scenic Hiking along the Mosel River", + "description": "Lace up your hiking boots and embark on a picturesque journey along the Mosel River. Follow well-maintained trails that wind through rolling vineyards, charming villages, and breathtaking natural landscapes. Enjoy panoramic views of the river valley and immerse yourself in the tranquility of the surrounding nature.", + "locationName": "Moselsteig Trail", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "mosel-valley", + "ref": "scenic-hiking-along-the-mosel-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_scenic-hiking-along-the-mosel-river.jpg" + }, + { + "name": "Relaxing River Cruise", + "description": "Sit back, relax, and soak in the beauty of the Mosel Valley on a leisurely river cruise. Glide along the tranquil waters, admiring the picturesque vineyards, charming villages, and historic castles that line the riverbanks. Enjoy onboard commentary and learn about the region's history and culture while indulging in delicious local cuisine and wine.", + "locationName": "Mosel River", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "mosel-valley", + "ref": "relaxing-river-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_relaxing-river-cruise.jpg" + }, + { + "name": "Beilstein Village Stroll", + "description": "Wander through the enchanting village of Beilstein, known as the \"Sleeping Beauty of the Mosel.\" Explore its narrow cobblestone streets, admire the half-timbered houses, and discover hidden courtyards and charming cafes. Enjoy the peaceful atmosphere and soak in the timeless beauty of this historic village.", + "locationName": "Beilstein Village", + "duration": 1, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "mosel-valley", + "ref": "beilstein-village-stroll", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_beilstein-village-stroll.jpg" + }, + { + "name": "Kayaking on the Mosel River", + "description": "Experience the Mosel Valley's beauty from a unique perspective by kayaking down the serene Mosel River. Paddle past rolling vineyards, charming villages, and towering castles, immersing yourself in the tranquility of the surrounding nature. Rent a kayak for a few hours or embark on a guided tour to explore hidden coves and learn about the region's rich history and ecology. This activity is suitable for various skill levels and offers a refreshing way to enjoy the outdoors.", + "locationName": "Mosel River", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "mosel-valley", + "ref": "kayaking-on-the-mosel-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_kayaking-on-the-mosel-river.jpg" + }, + { + "name": "Cycling through the Vineyards", + "description": "Embark on a scenic cycling adventure through the picturesque vineyards of the Mosel Valley. Rent a bike and follow well-maintained paths that wind through rolling hills, offering breathtaking views of the river and surrounding landscapes. Stop at local wineries for tastings, savor delicious regional cuisine at charming cafes, and discover hidden gems along the way. This activity allows you to explore the region at your own pace and soak in the beauty of the vineyards.", + "locationName": "Mosel Valley vineyards", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "mosel-valley", + "ref": "cycling-through-the-vineyards", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_cycling-through-the-vineyards.jpg" + }, + { + "name": "Burg Eltz Exploration", + "description": "Step back in time with a visit to the enchanting Burg Eltz, a medieval castle nestled amidst the forested hills above the Mosel River. Explore the castle's impressive architecture, admire its well-preserved interiors, and learn about its fascinating history dating back to the 12th century. Take a guided tour or wander through the castle's chambers, armory, and treasury at your own pace. The surrounding forest offers scenic hiking trails with breathtaking views of the castle and valley.", + "locationName": "Burg Eltz", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "mosel-valley", + "ref": "burg-eltz-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_burg-eltz-exploration.jpg" + }, + { + "name": "Indulge in German Cuisine", + "description": "Embark on a culinary journey through the Mosel Valley, savoring authentic German dishes and local specialties. Visit traditional restaurants and cozy taverns to experience the region's rich gastronomic heritage. Sample hearty meat dishes, fresh seafood, and seasonal vegetables, paired with locally produced wines. Don't miss the opportunity to try regional favorites like Zwiebelkuchen (onion cake) and Kartoffelpuffer (potato pancakes).", + "locationName": "Various restaurants and taverns throughout the Mosel Valley", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "mosel-valley", + "ref": "indulge-in-german-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_indulge-in-german-cuisine.jpg" + }, + { + "name": "Thermal Baths and Wellness Retreats", + "description": "Unwind and rejuvenate at one of the Mosel Valley's renowned thermal baths or wellness retreats. Immerse yourself in the healing mineral waters, indulge in spa treatments, and experience relaxation like never before. Many facilities offer a range of services, including massages, saunas, and beauty treatments. Whether you seek a day of pampering or a complete wellness getaway, the Mosel Valley offers options for every preference.", + "locationName": "Various thermal baths and wellness centers throughout the Mosel Valley", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "mosel-valley", + "ref": "thermal-baths-and-wellness-retreats", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_thermal-baths-and-wellness-retreats.jpg" + }, + { + "name": "Hot Air Balloon Ride over the Vineyards", + "description": "Experience the breathtaking beauty of the Mosel Valley from a unique perspective with a hot air balloon ride. Soar above the rolling vineyards, charming villages, and meandering river as you enjoy panoramic views of the picturesque landscape. This unforgettable experience offers a romantic and serene way to appreciate the region's charm.", + "locationName": "Various locations along the Mosel Valley", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "mosel-valley", + "ref": "hot-air-balloon-ride-over-the-vineyards", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_hot-air-balloon-ride-over-the-vineyards.jpg" + }, + { + "name": "Photography Tour of the Mosel Valley", + "description": "Capture the essence of the Mosel Valley's beauty on a photography tour led by a local expert. Discover hidden gems, perfect vantage points, and charming details as you explore the vineyards, villages, and riverbanks. Learn about composition, lighting, and storytelling through photography while creating lasting memories of your trip. #Great for photography #Instagrammable", + "locationName": "Various locations along the Mosel Valley", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "mosel-valley", + "ref": "photography-tour-of-the-mosel-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_photography-tour-of-the-mosel-valley.jpg" + }, + { + "name": "Birdwatching in the Mosel Forests", + "description": "Escape the bustling towns and immerse yourself in the tranquility of the Mosel forests. Embark on a guided birdwatching tour to spot diverse avian species, including woodpeckers, owls, and songbirds. Learn about the region's ecosystem and the importance of conservation while enjoying the peaceful sounds of nature. #Wildlife watching", + "locationName": "Forests surrounding the Mosel Valley", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "mosel-valley", + "ref": "birdwatching-in-the-mosel-forests", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_birdwatching-in-the-mosel-forests.jpg" + }, + { + "name": "Folklore and Fairytale Evening", + "description": "Delve into the rich cultural heritage of the Mosel Valley with an enchanting evening of folklore and fairytales. Gather around a bonfire as local storytellers share captivating legends and myths passed down through generations. Enjoy traditional music, dance, and perhaps even a taste of regional delicacies for a truly immersive experience. #Cultural experiences", + "locationName": "Various villages in the Mosel Valley", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "mosel-valley", + "ref": "folklore-and-fairytale-evening", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_folklore-and-fairytale-evening.jpg" + }, + { + "name": "E-bike Vineyard Adventure", + "description": "Explore the Mosel Valley's vineyards with ease and excitement on an e-bike adventure. Rent an e-bike and follow designated routes through the vineyards, stopping at charming villages and wineries along the way. Enjoy the flexibility to explore at your own pace while taking in the stunning scenery and fresh air. #Adventure sports", + "locationName": "Vineyards throughout the Mosel Valley", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "mosel-valley", + "ref": "e-bike-vineyard-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_e-bike-vineyard-adventure.jpg" + }, + { + "name": "Underground History and Mystery", + "description": "Embark on a captivating journey into the depths of the Mosel Valley, exploring the region's hidden underground world. Visit ancient Roman wine cellars, medieval mining tunnels, and mysterious underground fortifications. Discover the secrets and stories buried beneath the surface, and gain a unique perspective on the Mosel Valley's rich history.", + "locationName": "Various locations throughout the Mosel Valley", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "mosel-valley", + "ref": "underground-history-and-mystery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_underground-history-and-mystery.jpg" + }, + { + "name": "Culinary Delights: Cooking Class and Market Tour", + "description": "Immerse yourself in the flavors of the Mosel Valley with a hands-on cooking class and local market tour. Join a skilled chef to learn the art of preparing traditional German dishes, using fresh, seasonal ingredients sourced from the vibrant markets. Discover the secrets of regional specialties and enjoy the fruits (and vegetables) of your labor with a delicious meal.", + "locationName": "Various towns and villages along the Mosel River", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "mosel-valley", + "ref": "culinary-delights-cooking-class-and-market-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_culinary-delights-cooking-class-and-market-tour.jpg" + }, + { + "name": "Art and Culture: Visit Local Galleries and Museums", + "description": "Delve into the artistic and cultural heritage of the Mosel Valley by exploring its charming galleries and museums. Discover a diverse range of art forms, from contemporary paintings and sculptures to historical artifacts and regional crafts. Immerse yourself in the creative spirit of the region and gain insights into its rich cultural tapestry.", + "locationName": "Various towns and villages along the Mosel River", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "mosel-valley", + "ref": "art-and-culture-visit-local-galleries-and-museums", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_art-and-culture-visit-local-galleries-and-museums.jpg" + }, + { + "name": "Stargazing on the Mosel", + "description": "Escape the city lights and experience the magic of the night sky over the Mosel Valley. Join a guided stargazing tour or find a secluded spot along the riverbank to marvel at the constellations. Learn about the mythology and science behind the stars, and enjoy the tranquility of the night.", + "locationName": "Various locations along the Mosel River", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "mosel-valley", + "ref": "stargazing-on-the-mosel", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_stargazing-on-the-mosel.jpg" + }, + { + "name": "Festival Fun: Experience Local Traditions", + "description": "Immerse yourself in the vibrant culture of the Mosel Valley by attending one of the many local festivals throughout the year. From wine festivals and harvest celebrations to traditional folk events and Christmas markets, there's always something happening in the region. Enjoy live music, delicious food, and a festive atmosphere as you experience the local traditions and customs.", + "locationName": "Various towns and villages along the Mosel River", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "mosel-valley", + "ref": "festival-fun-experience-local-traditions", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mosel-valley_festival-fun-experience-local-traditions.jpg" + }, + { + "name": "Sunrise over Bagan", + "description": "Witness the breathtaking sight of hundreds of ancient temples bathed in the golden glow of dawn. Take a hot air balloon ride or climb to the top of a temple for panoramic views of the plains dotted with these historical marvels. This unforgettable experience is a photographer's dream and a must-do for any visitor to Myanmar.", + "locationName": "Bagan Archaeological Zone", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "myanmar", + "ref": "sunrise-over-bagan", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_sunrise-over-bagan.jpg" + }, + { + "name": "Explore Shwedagon Pagoda", + "description": "Immerse yourself in the spiritual heart of Myanmar at the iconic Shwedagon Pagoda. Marvel at the gold-plated stupa, adorned with thousands of diamonds and precious stones. Wander around the complex, observing locals in prayer and learning about Buddhist traditions. The serene atmosphere and intricate architecture offer a glimpse into Myanmar's rich religious heritage.", + "locationName": "Yangon", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "myanmar", + "ref": "explore-shwedagon-pagoda", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_explore-shwedagon-pagoda.jpg" + }, + { + "name": "Cruise the Irrawaddy River", + "description": "Embark on a scenic journey along the Irrawaddy River, the lifeblood of Myanmar. Sail past rural villages, verdant landscapes, and ancient temples. Opt for a multi-day cruise to explore remote areas and experience the local way of life. This relaxing adventure allows you to witness the beauty and cultural diversity of Myanmar from a unique perspective.", + "locationName": "Irrawaddy River", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "myanmar", + "ref": "cruise-the-irrawaddy-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_cruise-the-irrawaddy-river.jpg" + }, + { + "name": "Trekking in Hsipaw", + "description": "Escape the tourist trail and venture into the scenic hills of Hsipaw. Embark on a multi-day trek through lush rice paddies, remote villages, and stunning waterfalls. Stay overnight in local homestays, experiencing the warm hospitality of the Shan people. This off-the-beaten-path adventure offers a unique insight into rural life in Myanmar.", + "locationName": "Hsipaw", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "myanmar", + "ref": "trekking-in-hsipaw", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_trekking-in-hsipaw.jpg" + }, + { + "name": "Discover Inle Lake", + "description": "Explore the serene beauty of Inle Lake, a vast freshwater lake surrounded by mountains and floating gardens. Take a boat trip to observe the unique leg-rowing fishermen and visit stilt villages where local artisans practice traditional crafts. Immerse yourself in the tranquility of this picturesque landscape and learn about the fascinating culture of the Intha people.", + "locationName": "Inle Lake", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "myanmar", + "ref": "discover-inle-lake", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_discover-inle-lake.jpg" + }, + { + "name": "Visit the Golden Rock", + "description": "Embark on a pilgrimage to the Kyaiktiyo Pagoda, also known as the Golden Rock, a gravity-defying boulder covered in gold leaf and perched precariously on a cliff edge. The journey involves a truck ride up the mountain and a short walk to the pagoda, offering breathtaking views and a unique spiritual experience.", + "locationName": "Kyaiktiyo", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "myanmar", + "ref": "visit-the-golden-rock", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_visit-the-golden-rock.jpg" + }, + { + "name": "Explore Mandalay", + "description": "Discover the cultural heart of Myanmar in Mandalay. Visit the Royal Palace, climb Mandalay Hill for panoramic views, and explore the Kuthodaw Pagoda, home to the world's largest book. Immerse yourself in the local life at bustling markets and enjoy traditional puppet shows.", + "locationName": "Mandalay", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "myanmar", + "ref": "explore-mandalay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_explore-mandalay.jpg" + }, + { + "name": "Relax on Ngapali Beach", + "description": "Escape to the pristine shores of Ngapali Beach, known for its turquoise waters, soft sand, and swaying palm trees. Enjoy swimming, sunbathing, or simply unwinding with a good book. Indulge in fresh seafood at beachside restaurants and experience the laid-back charm of this coastal paradise.", + "locationName": "Ngapali Beach", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "myanmar", + "ref": "relax-on-ngapali-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_relax-on-ngapali-beach.jpg" + }, + { + "name": "Trekking in Kalaw", + "description": "Embark on a scenic trek through the rolling hills and tribal villages surrounding Kalaw. Immerse yourself in the local culture, interact with ethnic minority communities, and witness breathtaking landscapes. Choose from various trekking routes and durations to suit your fitness level and interests.", + "locationName": "Kalaw", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 2, + "destinationRef": "myanmar", + "ref": "trekking-in-kalaw", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_trekking-in-kalaw.jpg" + }, + { + "name": "Visit Mrauk U", + "description": "Step back in time at Mrauk U, an ancient city known for its remarkable temples and pagodas. Explore the archaeological wonders, wander through the atmospheric ruins, and discover the rich history of this once-powerful kingdom.", + "locationName": "Mrauk U", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "myanmar", + "ref": "visit-mrauk-u", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_visit-mrauk-u.jpg" + }, + { + "name": "Kayaking on Inle Lake", + "description": "Embark on a serene kayaking adventure on Inle Lake, gliding through the tranquil waters surrounded by floating gardens, stilt villages, and local fishermen practicing their unique leg-rowing technique. Witness the breathtaking scenery, observe the daily life of the Intha people, and immerse yourself in the peaceful atmosphere of this iconic lake.", + "locationName": "Inle Lake", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "myanmar", + "ref": "kayaking-on-inle-lake", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_kayaking-on-inle-lake.jpg" + }, + { + "name": "Meditation Retreat in a Buddhist Monastery", + "description": "Find inner peace and tranquility with a meditation retreat at a traditional Buddhist monastery. Learn the art of mindfulness from experienced monks, participate in guided meditation sessions, and immerse yourself in the spiritual atmosphere of these sacred spaces. This experience offers a unique opportunity for self-reflection and personal growth.", + "locationName": "Various monasteries throughout Myanmar", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "myanmar", + "ref": "meditation-retreat-in-a-buddhist-monastery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_meditation-retreat-in-a-buddhist-monastery.jpg" + }, + { + "name": "Hot Air Balloon Ride over Bagan", + "description": "Soar above the ancient temples of Bagan in a hot air balloon, witnessing the breathtaking panoramic views of the archaeological wonder at sunrise. Capture stunning aerial photographs of the pagodas and stupas as the golden light bathes the landscape, creating an unforgettable and magical experience.", + "locationName": "Bagan", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "myanmar", + "ref": "hot-air-balloon-ride-over-bagan", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_hot-air-balloon-ride-over-bagan.jpg" + }, + { + "name": "Explore the Pindaya Caves", + "description": "Venture into the mystical Pindaya Caves, a labyrinthine network of caverns housing thousands of Buddha images. Marvel at the intricate carvings and sculptures, learn about the spiritual significance of the site, and experience the unique atmosphere of this hidden gem.", + "locationName": "Pindaya", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "myanmar", + "ref": "explore-the-pindaya-caves", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_explore-the-pindaya-caves.jpg" + }, + { + "name": "Cooking Class with a Local Family", + "description": "Delve into the world of Burmese cuisine with a hands-on cooking class hosted by a local family. Learn the secrets of traditional dishes, discover the unique flavors and ingredients of Myanmar, and enjoy a delicious home-cooked meal with your hosts. This experience offers a glimpse into the local culture and culinary traditions.", + "locationName": "Various locations throughout Myanmar", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "myanmar", + "ref": "cooking-class-with-a-local-family", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_cooking-class-with-a-local-family.jpg" + }, + { + "name": "Volunteer at an Elephant Sanctuary", + "description": "Immerse yourself in the ethical treatment of elephants at a sanctuary like Green Hill Valley Elephant Camp. Observe these gentle giants in their natural habitat, learn about their care and conservation efforts, and even assist with feeding and bathing them. This heartwarming experience provides a responsible way to interact with elephants and support their well-being.", + "locationName": "Green Hill Valley Elephant Camp or similar sanctuaries", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "myanmar", + "ref": "volunteer-at-an-elephant-sanctuary", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_volunteer-at-an-elephant-sanctuary.jpg" + }, + { + "name": "Explore the Mergui Archipelago", + "description": "Embark on an island-hopping adventure through the untouched beauty of the Mergui Archipelago. Discover secluded beaches, snorkel in crystal-clear waters teeming with marine life, and kayak along pristine coastlines. This remote paradise offers a unique opportunity to escape the crowds and connect with nature's wonders.", + "locationName": "Mergui Archipelago", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "myanmar", + "ref": "explore-the-mergui-archipelago", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_explore-the-mergui-archipelago.jpg" + }, + { + "name": "Visit a Local Market", + "description": "Delve into the vibrant atmosphere of a local market, such as Bogyoke Aung San Market in Yangon. Browse through stalls overflowing with handcrafted souvenirs, textiles, jewelry, and fresh produce. Engage with friendly vendors, practice your bargaining skills, and discover unique treasures to take home.", + "locationName": "Bogyoke Aung San Market or other local markets", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "myanmar", + "ref": "visit-a-local-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_visit-a-local-market.jpg" + }, + { + "name": "Take a Burmese Cooking Class", + "description": "Learn the art of Burmese cuisine by taking a cooking class. Discover the unique flavors and spices used in traditional dishes, and master the techniques of creating popular recipes like Mohinga (fish noodle soup) or Lahpet Thoke (pickled tea leaf salad). This hands-on experience will tantalize your taste buds and leave you with newfound culinary skills.", + "locationName": "Various cooking schools or local homes", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "myanmar", + "ref": "take-a-burmese-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_take-a-burmese-cooking-class.jpg" + }, + { + "name": "Enjoy a Traditional Puppet Show", + "description": "Experience the magic of Burmese puppetry at a traditional show. Marvel at the intricate marionettes and their graceful movements as they depict ancient legends and folktales. This cultural performance offers a glimpse into Myanmar's rich artistic heritage and storytelling traditions.", + "locationName": "Htwe Oo Myanmar Puppet Theatre or other venues", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "myanmar", + "ref": "enjoy-a-traditional-puppet-show", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/myanmar_enjoy-a-traditional-puppet-show.jpg" + }, + { + "name": "Soak Up the Sun on Paradise Beach", + "description": "Spend a relaxing day on the golden sands of Paradise Beach, one of Mykonos' most famous and vibrant shores. Enjoy swimming in the crystal-clear turquoise waters, try exciting water sports like jet skiing or parasailing, or simply unwind on a sunbed with a refreshing cocktail from a beachfront bar. The lively atmosphere and stunning scenery make it a perfect beach escape.", + "locationName": "Paradise Beach", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "mykonos", + "ref": "soak-up-the-sun-on-paradise-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_soak-up-the-sun-on-paradise-beach.jpg" + }, + { + "name": "Explore the Picturesque Mykonos Town", + "description": "Wander through the charming labyrinthine streets of Mykonos Town, also known as Chora. Admire the iconic whitewashed houses with blue accents, discover hidden boutiques and art galleries, and visit historical landmarks like the windmills and the Paraportiani Church. Enjoy a delightful meal at a traditional taverna and soak up the vibrant atmosphere of this picturesque town.", + "locationName": "Mykonos Town (Chora)", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "mykonos", + "ref": "explore-the-picturesque-mykonos-town", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_explore-the-picturesque-mykonos-town.jpg" + }, + { + "name": "Experience the Legendary Mykonos Nightlife", + "description": "As the sun sets, immerse yourself in Mykonos' electrifying nightlife scene. Dance the night away at world-renowned beach clubs like Paradise Club or Cavo Paradiso, enjoy live music performances at bars and restaurants, or sip cocktails at chic lounge bars overlooking the Aegean Sea. Mykonos offers a diverse and unforgettable nightlife experience for every taste.", + "locationName": "Various locations in Mykonos", + "duration": 5, + "timeOfDay": "night", + "familyFriendly": false, + "price": 4, + "destinationRef": "mykonos", + "ref": "experience-the-legendary-mykonos-nightlife", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_experience-the-legendary-mykonos-nightlife.jpg" + }, + { + "name": "Discover Ancient Delos", + "description": "Embark on a historical journey to the nearby island of Delos, a UNESCO World Heritage Site and one of the most important archaeological sites in Greece. Explore the ancient ruins of temples, houses, and theaters, and learn about the island's rich history and mythology. Delos offers a fascinating glimpse into the past and a unique cultural experience.", + "locationName": "Delos Island", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "mykonos", + "ref": "discover-ancient-delos", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_discover-ancient-delos.jpg" + }, + { + "name": "Indulge in Delicious Greek Cuisine", + "description": "Tantalize your taste buds with the authentic flavors of Greek cuisine. Enjoy fresh seafood dishes at waterfront tavernas, savor traditional Greek specialties like moussaka and souvlaki, or indulge in gourmet dining experiences at upscale restaurants. Mykonos offers a wide range of culinary options to satisfy every palate.", + "locationName": "Various restaurants and tavernas in Mykonos", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "mykonos", + "ref": "indulge-in-delicious-greek-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_indulge-in-delicious-greek-cuisine.jpg" + }, + { + "name": "Set Sail on a Catamaran Cruise", + "description": "Embark on a luxurious catamaran cruise around the Aegean Sea, soaking in the breathtaking views of the coastline and nearby islands. Swim and snorkel in crystal-clear waters, bask in the sun on deck, and enjoy a delicious meal prepared on board. This is the perfect way to experience the beauty of Mykonos from a different perspective. #Beach #Island #Sailing #Luxury #Romantic #Family-friendly", + "locationName": "Mykonos Harbor", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 4, + "destinationRef": "mykonos", + "ref": "set-sail-on-a-catamaran-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_set-sail-on-a-catamaran-cruise.jpg" + }, + { + "name": "Go Windsurfing or Kitesurfing at Kalafatis Beach", + "description": "Feel the adrenaline rush as you harness the power of the wind and glide across the waves. Kalafatis Beach is renowned for its ideal wind conditions, making it a haven for windsurfing and kitesurfing enthusiasts. Whether you're a beginner or an experienced rider, there are lessons and equipment rentals available to ensure an unforgettable experience. #Beach #Adventure #sports #Summer #destination", + "locationName": "Kalafatis Beach", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "mykonos", + "ref": "go-windsurfing-or-kitesurfing-at-kalafatis-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_go-windsurfing-or-kitesurfing-at-kalafatis-beach.jpg" + }, + { + "name": "Hike to the Armenistis Lighthouse", + "description": "Embark on a scenic hike to the historic Armenistis Lighthouse, offering panoramic views of the island and the Aegean Sea. The trail winds through rugged landscapes and charming villages, providing a glimpse into the island's natural beauty and local life. #Hiking #Off-the-beaten-path #Cultural #experiences #Great #for #photography #Instagrammable", + "locationName": "Fanari", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "mykonos", + "ref": "hike-to-the-armenistis-lighthouse", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_hike-to-the-armenistis-lighthouse.jpg" + }, + { + "name": "Visit the Monastery of Panagia Tourliani", + "description": "Step back in time at the Monastery of Panagia Tourliani, a beautiful example of Cycladic architecture dating back to the 16th century. Admire the intricate marble carvings, ornate iconostasis, and peaceful atmosphere of this historic religious site. #Historic #Cultural #experiences #Secluded", + "locationName": "Ano Mera village", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "mykonos", + "ref": "visit-the-monastery-of-panagia-tourliani", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_visit-the-monastery-of-panagia-tourliani.jpg" + }, + { + "name": "Take a Cooking Class and Learn to Make Traditional Greek Dishes", + "description": "Immerse yourself in the flavors of Greece by taking a cooking class and learning to prepare authentic dishes like moussaka, souvlaki, and baklava. Discover the secrets of Greek cuisine from local chefs and enjoy the fruits of your labor with a delicious meal. #Cultural #experiences #Foodie #Family-friendly", + "locationName": "Mykonos Town", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "mykonos", + "ref": "take-a-cooking-class-and-learn-to-make-traditional-greek-dishes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_take-a-cooking-class-and-learn-to-make-traditional-greek-dishes.jpg" + }, + { + "name": "Horseback Riding at Ano Mera", + "description": "Embark on a serene horseback riding adventure through the charming village of Ano Mera and its surrounding countryside. Experience the island's natural beauty from a unique perspective as you trot past traditional houses, olive groves, and hidden chapels. This activity is suitable for all skill levels and offers a peaceful escape from the bustling beaches.", + "locationName": "Ano Mera", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "mykonos", + "ref": "horseback-riding-at-ano-mera", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_horseback-riding-at-ano-mera.jpg" + }, + { + "name": "Little Venice Sunset Stroll", + "description": "Capture the enchanting beauty of Little Venice, a picturesque neighborhood known for its colorful houses perched on the edge of the Aegean Sea. As the sun begins its descent, take a leisurely stroll along the waterfront, admiring the golden hues reflecting on the water and the charming architecture. Find a cozy spot to savor a glass of local wine and witness a breathtaking Mykonos sunset.", + "locationName": "Little Venice", + "duration": 1, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "mykonos", + "ref": "little-venice-sunset-stroll", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_little-venice-sunset-stroll.jpg" + }, + { + "name": "Scuba Diving Adventure", + "description": "Dive into the crystal-clear waters surrounding Mykonos and discover a vibrant underwater world. Explore fascinating reefs, shipwrecks, and underwater caves teeming with marine life. Whether you're a seasoned diver or a beginner, there are numerous diving centers offering guided excursions and courses, allowing you to experience the thrill of exploring the Aegean Sea's hidden depths.", + "locationName": "Various diving centers around Mykonos", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "mykonos", + "ref": "scuba-diving-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_scuba-diving-adventure.jpg" + }, + { + "name": "Mykonos Farmers Market Visit", + "description": "Immerse yourself in the local culture and flavors at the Mykonos Farmers Market. Discover a vibrant array of fresh produce, local cheeses, honey, herbs, and handmade crafts. Engage with friendly vendors, sample delicious treats, and find unique souvenirs to take home. This is a perfect opportunity to experience the authentic side of Mykonos and support local businesses.", + "locationName": "Mykonos Town", + "duration": 1.5, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "mykonos", + "ref": "mykonos-farmers-market-visit", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_mykonos-farmers-market-visit.jpg" + }, + { + "name": "Private Yacht Excursion to Rhenia Island", + "description": "Embark on a luxurious private yacht excursion to the secluded island of Rhenia. Escape the crowds and discover pristine beaches, turquoise waters, and unspoiled landscapes. Enjoy swimming, snorkeling, and sunbathing in complete privacy. Some excursions offer gourmet meals and water sports activities for an unforgettable day trip.", + "locationName": "Rhenia Island", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 5, + "destinationRef": "mykonos", + "ref": "private-yacht-excursion-to-rhenia-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_private-yacht-excursion-to-rhenia-island.jpg" + }, + { + "name": "Jeep Safari Adventure", + "description": "Embark on an exhilarating jeep safari tour that takes you off the beaten path to discover Mykonos' hidden gems. Traverse rugged terrains, visit secluded beaches, and witness breathtaking panoramic views of the island. This adventure offers a unique perspective of Mykonos beyond the typical tourist spots.", + "locationName": "Mykonos Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "mykonos", + "ref": "jeep-safari-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_jeep-safari-adventure.jpg" + }, + { + "name": "Wine Tasting at a Local Vineyard", + "description": "Indulge in the flavors of Mykonos with a visit to a local vineyard. Learn about the island's unique grape varieties and winemaking traditions while enjoying a guided tasting of their exquisite wines. Savor the distinct notes and aromas of Mykonos' wines amidst picturesque vineyard landscapes.", + "locationName": "Mykonos Vineyards", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "mykonos", + "ref": "wine-tasting-at-a-local-vineyard", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_wine-tasting-at-a-local-vineyard.jpg" + }, + { + "name": "Kayaking and Snorkeling Tour", + "description": "Explore the crystal-clear waters of Mykonos on a kayaking and snorkeling adventure. Paddle along the coastline, discovering hidden coves and beaches inaccessible by land. Dive beneath the surface to snorkel amidst vibrant marine life and explore the underwater world of the Aegean Sea.", + "locationName": "Mykonos Coastline", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "mykonos", + "ref": "kayaking-and-snorkeling-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_kayaking-and-snorkeling-tour.jpg" + }, + { + "name": "Sunset Yoga Session", + "description": "Find your inner peace and connect with nature during a magical sunset yoga session. Practice yoga poses on a secluded beach or a rooftop terrace overlooking the Aegean Sea as the sun dips below the horizon, painting the sky with vibrant hues. This experience offers a perfect blend of relaxation and rejuvenation.", + "locationName": "Various Locations", + "duration": 1.5, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 2, + "destinationRef": "mykonos", + "ref": "sunset-yoga-session", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_sunset-yoga-session.jpg" + }, + { + "name": "Art and Culture Tour", + "description": "Immerse yourself in the artistic and cultural heritage of Mykonos. Visit local art galleries showcasing works by renowned Greek artists, explore historical churches and archaeological sites, and discover the island's rich history and traditions through guided tours and interactive experiences.", + "locationName": "Mykonos Town and surrounding areas", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "mykonos", + "ref": "art-and-culture-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/mykonos_art-and-culture-tour.jpg" + }, + { + "name": "David Sheldrick Elephant Orphanage", + "description": "Witness the heartwarming efforts of this sanctuary as they care for orphaned baby elephants. Observe feeding time, learn about conservation efforts, and even foster an elephant.", + "locationName": "David Sheldrick Elephant Orphanage", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "nairobi", + "ref": "david-sheldrick-elephant-orphanage", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_david-sheldrick-elephant-orphanage.jpg" + }, + { + "name": "Karen Blixen Museum", + "description": "Step back in time at the former home of the famous author of 'Out of Africa.' Explore the colonial farmhouse, lush gardens, and coffee farm, and delve into Kenya's history.", + "locationName": "Karen Blixen Museum", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "nairobi", + "ref": "karen-blixen-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_karen-blixen-museum.jpg" + }, + { + "name": "Nairobi National Park Safari", + "description": "Embark on a thrilling safari adventure just outside the city limits. Spot iconic African wildlife like lions, rhinos, giraffes, and zebras against the backdrop of the city skyline.", + "locationName": "Nairobi National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "nairobi", + "ref": "nairobi-national-park-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_nairobi-national-park-safari.jpg" + }, + { + "name": "Kazuri Beads Women's Cooperative", + "description": "Visit this inspiring workshop and witness the creation of beautiful handcrafted ceramic beads. Learn about the women's empowerment project and support local artisans by purchasing unique souvenirs.", + "locationName": "Kazuri Beads Women's Cooperative", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "nairobi", + "ref": "kazuri-beads-women-s-cooperative", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_kazuri-beads-women-s-cooperative.jpg" + }, + { + "name": "Carnivore Restaurant Experience", + "description": "Indulge in a unique dining experience at Carnivore, famed for its all-you-can-eat meat feast. Sample exotic meats like ostrich, crocodile, and camel, cooked over a charcoal grill.", + "locationName": "Carnivore Restaurant", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "nairobi", + "ref": "carnivore-restaurant-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_carnivore-restaurant-experience.jpg" + }, + { + "name": "Giraffe Centre", + "description": "Get up close and personal with endangered Rothschild's giraffes at the Giraffe Centre. You can feed them, learn about conservation efforts, and even kiss one if you're feeling adventurous! This is a perfect family-friendly activity that allows you to interact with these gentle giants in a safe and educational environment.", + "locationName": "Giraffe Centre", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "nairobi", + "ref": "giraffe-centre", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_giraffe-centre.jpg" + }, + { + "name": "Maasai Market", + "description": "Immerse yourself in the vibrant culture of the Maasai people at the Maasai Market. Browse through stalls overflowing with colorful handcrafted jewelry, textiles, and souvenirs. Bargaining is expected, so hone your negotiation skills and find unique treasures to take home.", + "locationName": "Various locations in Nairobi", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "nairobi", + "ref": "maasai-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_maasai-market.jpg" + }, + { + "name": "Karura Forest", + "description": "Escape the city bustle and explore the serene Karura Forest. Hike or bike through the lush trails, discover hidden waterfalls, and visit the Mau Mau caves, which hold historical significance. This is a perfect escape for nature lovers and those seeking a moment of tranquility.", + "locationName": "Karura Forest", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "nairobi", + "ref": "karura-forest", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_karura-forest.jpg" + }, + { + "name": "Bomas of Kenya", + "description": "Experience the diverse cultural heritage of Kenya at the Bomas of Kenya. Witness traditional dances, music performances, and homesteads representing different ethnic groups. It's an engaging and educational way to learn about the country's rich cultural tapestry.", + "locationName": "Bomas of Kenya", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "nairobi", + "ref": "bomas-of-kenya", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_bomas-of-kenya.jpg" + }, + { + "name": "Nairobi National Museum", + "description": "Delve into the history and art of Kenya at the Nairobi National Museum. Explore exhibits on archaeology, paleontology, and contemporary art. You can also visit the Snake Park within the museum grounds and see a variety of reptiles.", + "locationName": "Nairobi National Museum", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "nairobi", + "ref": "nairobi-national-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_nairobi-national-museum.jpg" + }, + { + "name": "Hike Ngong Hills", + "description": "Embark on a scenic hike up the Ngong Hills, a series of rolling hills offering breathtaking panoramic views of the Great Rift Valley and the Nairobi skyline. Choose from various trails catering to different fitness levels, and enjoy a picnic lunch amidst the serene natural beauty.", + "locationName": "Ngong Hills", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "nairobi", + "ref": "hike-ngong-hills", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_hike-ngong-hills.jpg" + }, + { + "name": "Shop at the Maasai Market", + "description": "Immerse yourself in the vibrant atmosphere of the Maasai Market, a rotating market showcasing authentic Kenyan crafts and souvenirs. Find unique handmade jewelry, textiles, wood carvings, and more, while supporting local artisans and experiencing the rich cultural heritage of the Maasai people.", + "locationName": "Maasai Market (various locations)", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "nairobi", + "ref": "shop-at-the-maasai-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_shop-at-the-maasai-market.jpg" + }, + { + "name": "Visit the Kazuri Beads Women's Cooperative", + "description": "Discover the inspiring work of the Kazuri Beads Women's Cooperative, where disadvantaged women create beautiful handcrafted ceramic beads and pottery. Take a tour of the workshop, learn about the process, and purchase unique souvenirs while supporting women's empowerment and economic independence.", + "locationName": "Kazuri Beads Women's Cooperative", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "nairobi", + "ref": "visit-the-kazuri-beads-women-s-cooperative", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_visit-the-kazuri-beads-women-s-cooperative.jpg" + }, + { + "name": "Experience Kenyan Cuisine", + "description": "Embark on a culinary journey through Kenyan cuisine, known for its diverse flavors and influences. Sample traditional dishes like nyama choma (grilled meat), ugali (maize porridge), and sukuma wiki (collard greens), and explore the vibrant street food scene or dine at upscale restaurants offering modern interpretations of Kenyan classics.", + "locationName": "Various restaurants and street food vendors", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "nairobi", + "ref": "experience-kenyan-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_experience-kenyan-cuisine.jpg" + }, + { + "name": "Enjoy Nairobi's Nightlife", + "description": "Experience the vibrant nightlife of Nairobi, with a diverse range of bars, clubs, and live music venues. Dance the night away to Afrobeat rhythms, enjoy live bands playing local and international music, or unwind with a cocktail at a rooftop bar overlooking the city skyline.", + "locationName": "Various bars, clubs, and live music venues", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "nairobi", + "ref": "enjoy-nairobi-s-nightlife", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_enjoy-nairobi-s-nightlife.jpg" + }, + { + "name": "Hot Air Balloon Safari Over the Maasai Mara", + "description": "Embark on an unforgettable hot air balloon safari over the Maasai Mara National Reserve. Witness the breathtaking sunrise as you soar above the vast savanna, observing wildlife like lions, elephants, and giraffes in their natural habitat. Enjoy a champagne breakfast upon landing, creating a truly magical experience.", + "locationName": "Maasai Mara National Reserve", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "nairobi", + "ref": "hot-air-balloon-safari-over-the-maasai-mara", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_hot-air-balloon-safari-over-the-maasai-mara.jpg" + }, + { + "name": "Visit the Giraffe Manor", + "description": "Experience a unique stay at the Giraffe Manor, a charming boutique hotel known for its resident Rothschild giraffes. Enjoy breakfast or afternoon tea on the terrace as these gentle giants poke their heads through the windows, creating unforgettable memories and photo opportunities.", + "locationName": "Giraffe Manor", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "nairobi", + "ref": "visit-the-giraffe-manor", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_visit-the-giraffe-manor.jpg" + }, + { + "name": "Explore the Ngong Hills", + "description": "Embark on a scenic hike or bike ride through the Ngong Hills, a series of peaks offering panoramic views of the Great Rift Valley and Nairobi National Park. Enjoy the fresh air, diverse birdlife, and stunning landscapes, making it a perfect escape from the city.", + "locationName": "Ngong Hills", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "nairobi", + "ref": "explore-the-ngong-hills", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_explore-the-ngong-hills.jpg" + }, + { + "name": "Discover Kenyan Art at the Nairobi Gallery", + "description": "Immerse yourself in Kenyan art and culture at the Nairobi Gallery. Housed in a historic building, the gallery showcases contemporary and traditional art pieces, sculptures, and photography. Learn about the country's rich artistic heritage and support local artists.", + "locationName": "Nairobi Gallery", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "nairobi", + "ref": "discover-kenyan-art-at-the-nairobi-gallery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_discover-kenyan-art-at-the-nairobi-gallery.jpg" + }, + { + "name": "Unwind at the Oloolua Nature Trail", + "description": "Escape the city bustle and reconnect with nature at the Oloolua Nature Trail. Hike through the lush indigenous forest, discover hidden waterfalls, and spot diverse bird species. Enjoy a peaceful picnic by the river, making it a perfect retreat for nature lovers.", + "locationName": "Oloolua Nature Trail", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "nairobi", + "ref": "unwind-at-the-oloolua-nature-trail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nairobi_unwind-at-the-oloolua-nature-trail.jpg" + }, + { + "name": "Etosha National Park Safari", + "description": "Embark on an unforgettable safari adventure in Etosha National Park, one of Africa's premier wildlife sanctuaries. Witness incredible biodiversity, including elephants, lions, rhinos, giraffes, and countless bird species, as you traverse the vast savannas and gather around watering holes. Capture stunning photographs and create lasting memories in this wildlife paradise.", + "locationName": "Etosha National Park", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "namibia", + "ref": "etosha-national-park-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_etosha-national-park-safari.jpg" + }, + { + "name": "Sossusvlei Dune Climbing and Deadvlei Exploration", + "description": "Challenge yourself with an exhilarating climb up the towering red sand dunes of Sossusvlei, some of the highest in the world. Marvel at the surreal landscapes of Deadvlei, a white clay pan dotted with ancient, skeletal camelthorn trees, creating a photographer's dream. Capture the contrasting colors and unique textures of this otherworldly desert environment.", + "locationName": "Sossusvlei and Deadvlei", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "namibia", + "ref": "sossusvlei-dune-climbing-and-deadvlei-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_sossusvlei-dune-climbing-and-deadvlei-exploration.jpg" + }, + { + "name": "Skeleton Coast Adventure", + "description": "Explore the rugged and remote Skeleton Coast, known for its shipwrecks, seal colonies, and desolate beauty. Embark on a guided tour to discover the history and stories behind the shipwrecks, observe the playful seals basking on the shores, and witness the raw power of the Atlantic Ocean crashing against the coastline.", + "locationName": "Skeleton Coast", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "namibia", + "ref": "skeleton-coast-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_skeleton-coast-adventure.jpg" + }, + { + "name": "Himba Cultural Experience", + "description": "Immerse yourself in the rich culture of the Himba people, a semi-nomadic tribe known for their unique traditions and distinctive appearance. Visit a Himba village and learn about their way of life, customs, and beliefs. Engage with the locals, witness their intricate hairstyles and jewelry, and gain a deeper understanding of their fascinating culture.", + "locationName": "Kaokoland", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "namibia", + "ref": "himba-cultural-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_himba-cultural-experience.jpg" + }, + { + "name": "Stargazing in the Namib Desert", + "description": "Experience the magic of the Namib Desert night sky, renowned for its exceptional clarity and minimal light pollution. Join a stargazing tour or simply lay back under the blanket of stars and marvel at the Milky Way, constellations, and celestial wonders. Learn about astronomy and constellations from expert guides or enjoy the tranquility of the desert night.", + "locationName": "Namib Desert", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "namibia", + "ref": "stargazing-in-the-namib-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_stargazing-in-the-namib-desert.jpg" + }, + { + "name": "Kayaking with Seals in Walvis Bay", + "description": "Embark on a thrilling kayaking adventure in the calm waters of Walvis Bay, where you'll have the opportunity to paddle alongside playful Cape fur seals. Witness these curious creatures up close as they swim, dive, and bask in the sun. This eco-friendly activity allows you to experience the marine life of Namibia in a unique and unforgettable way.", + "locationName": "Walvis Bay", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "namibia", + "ref": "kayaking-with-seals-in-walvis-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_kayaking-with-seals-in-walvis-bay.jpg" + }, + { + "name": "Quad Biking in the Namib Desert", + "description": "Experience the thrill of quad biking across the vast and scenic landscapes of the Namib Desert. Feel the adrenaline rush as you navigate the sandy terrain, surrounded by towering dunes and breathtaking views. This exhilarating activity is perfect for adventure seekers looking for an unforgettable desert experience.", + "locationName": "Namib Desert", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "namibia", + "ref": "quad-biking-in-the-namib-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_quad-biking-in-the-namib-desert.jpg" + }, + { + "name": "Sandboarding and Dune Skiing in Swakopmund", + "description": "Get your adrenaline pumping with sandboarding and dune skiing in the coastal town of Swakopmund. Glide down the steep slopes of the dunes, feeling the rush of wind against your face. Whether you're a beginner or an experienced thrill-seeker, this activity offers an exciting way to experience the unique desert landscape.", + "locationName": "Swakopmund", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "namibia", + "ref": "sandboarding-and-dune-skiing-in-swakopmund", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_sandboarding-and-dune-skiing-in-swakopmund.jpg" + }, + { + "name": "Explore the German Colonial Town of Lüderitz", + "description": "Step back in time with a visit to the charming coastal town of Lüderitz. Explore the well-preserved German colonial architecture, including the iconic Felsenkirche church perched on a rocky outcrop. Discover the town's rich history and enjoy the unique blend of German and Namibian culture.", + "locationName": "Lüderitz", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "namibia", + "ref": "explore-the-german-colonial-town-of-l-deritz", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_explore-the-german-colonial-town-of-l-deritz.jpg" + }, + { + "name": "Visit the Cheetah Conservation Fund", + "description": "Learn about cheetah conservation efforts at the Cheetah Conservation Fund, a research and education center dedicated to protecting these magnificent animals. Take a guided tour to observe cheetahs up close, learn about their behavior and threats they face, and support the organization's mission to ensure their survival in the wild.", + "locationName": "Cheetah Conservation Fund", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "namibia", + "ref": "visit-the-cheetah-conservation-fund", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_visit-the-cheetah-conservation-fund.jpg" + }, + { + "name": "Fish River Canyon Hiking", + "description": "Embark on a multi-day hiking adventure through the second largest canyon in the world, the Fish River Canyon. Hike along the rim, enjoying breathtaking views of the rugged landscape, or descend into the canyon for a challenging and rewarding experience. Camp under the stars and reconnect with nature in this awe-inspiring setting.", + "locationName": "Fish River Canyon", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "namibia", + "ref": "fish-river-canyon-hiking", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_fish-river-canyon-hiking.jpg" + }, + { + "name": "Spitzkoppe Climbing and Camping", + "description": "Challenge yourself with rock climbing and bouldering on the granite peaks of Spitzkoppe, also known as the 'Matterhorn of Namibia'. With various routes for all skill levels, it's a paradise for climbers. Camp at the base and enjoy stunning sunsets and starry nights in this unique landscape.", + "locationName": "Spitzkoppe", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "namibia", + "ref": "spitzkoppe-climbing-and-camping", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_spitzkoppe-climbing-and-camping.jpg" + }, + { + "name": "Cape Cross Seal Colony Visit", + "description": "Witness one of the largest colonies of Cape fur seals in the world at Cape Cross. Observe these fascinating creatures in their natural habitat, learn about their behavior and conservation efforts, and capture unforgettable photos of this wildlife spectacle.", + "locationName": "Cape Cross", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "namibia", + "ref": "cape-cross-seal-colony-visit", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_cape-cross-seal-colony-visit.jpg" + }, + { + "name": "Twyfelfontein Rock Art Exploration", + "description": "Step back in time and explore the ancient rock engravings at Twyfelfontein, a UNESCO World Heritage Site. Discover thousands of petroglyphs depicting animals, human figures, and abstract designs, offering a glimpse into the lives and beliefs of early hunter-gatherer societies.", + "locationName": "Twyfelfontein", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "namibia", + "ref": "twyfelfontein-rock-art-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_twyfelfontein-rock-art-exploration.jpg" + }, + { + "name": "Kolmanskop Ghost Town Photography", + "description": "Explore the eerie abandoned diamond mining town of Kolmanskop, swallowed by the Namib Desert sands. Capture haunting images of the decaying buildings, once opulent homes and facilities, now reclaimed by nature. This unique location offers a photographer's dream with its contrasting colors and textures.", + "locationName": "Kolmanskop", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "namibia", + "ref": "kolmanskop-ghost-town-photography", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_kolmanskop-ghost-town-photography.jpg" + }, + { + "name": "Hot Air Balloon Safari over the Namib Desert", + "description": "Embark on an unforgettable hot air balloon safari over the mesmerizing Namib Desert. Drift silently above the towering dunes, witnessing the breathtaking landscapes bathed in the golden hues of sunrise. Spot wildlife from a unique perspective as you soar through the clear desert air, creating memories that will last a lifetime.", + "locationName": "Namib Desert", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "namibia", + "ref": "hot-air-balloon-safari-over-the-namib-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_hot-air-balloon-safari-over-the-namib-desert.jpg" + }, + { + "name": "Dolphin and Whale Watching Cruise", + "description": "Set sail on a thrilling marine adventure along the Namibian coast, where you can encounter playful dolphins and majestic whales. Witness these incredible creatures in their natural habitat as they breach, tail slap, and glide through the waves. Learn about marine conservation efforts and enjoy the fresh ocean breeze.", + "locationName": "Walvis Bay", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "namibia", + "ref": "dolphin-and-whale-watching-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_dolphin-and-whale-watching-cruise.jpg" + }, + { + "name": "Township Cultural Tour in Katutura", + "description": "Immerse yourself in the vibrant culture of Namibia's capital city with a township tour in Katutura. Interact with local residents, learn about their daily lives, and discover the rich history and traditions of the community. Visit local markets, sample traditional cuisine, and gain a deeper understanding of Namibian culture.", + "locationName": "Windhoek", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "namibia", + "ref": "township-cultural-tour-in-katutura", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_township-cultural-tour-in-katutura.jpg" + }, + { + "name": "Scenic Flight over the Skeleton Coast", + "description": "Take to the skies for a breathtaking scenic flight over the rugged Skeleton Coast. Marvel at the dramatic coastline, shipwrecks scattered along the shore, and vast seal colonies. Capture stunning aerial photographs of this unique and desolate landscape.", + "locationName": "Skeleton Coast", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "namibia", + "ref": "scenic-flight-over-the-skeleton-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_scenic-flight-over-the-skeleton-coast.jpg" + }, + { + "name": "Living Desert Tour", + "description": "Embark on a fascinating journey into the heart of the Namib Desert with a Living Desert Tour. Learn about the unique adaptations of desert flora and fauna, discover hidden creatures such as the dancing white lady spider and the palmato gecko, and gain a deeper appreciation for the delicate desert ecosystem.", + "locationName": "Namib Desert", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "namibia", + "ref": "living-desert-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/namibia_living-desert-tour.jpg" + }, + { + "name": "Wine Tasting Tour", + "description": "Embark on a delightful journey through Napa Valley's renowned wineries. Visit charming vineyards, learn about the winemaking process, and indulge in tastings of exquisite Cabernet Sauvignon, Chardonnay, and other varietals. Knowledgeable guides will share insights into the region's history and terroir, making it an unforgettable experience for wine enthusiasts.", + "locationName": "Various wineries throughout Napa Valley", + "duration": 6, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "napa-valley", + "ref": "wine-tasting-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_wine-tasting-tour.jpg" + }, + { + "name": "Gourmet Food Tour", + "description": "Tantalize your taste buds with a culinary adventure through Napa Valley's acclaimed restaurants. Sample delectable dishes prepared by renowned chefs, paired with local wines. Explore the vibrant culinary scene, from farm-to-table experiences to Michelin-starred establishments, and discover the region's gastronomic delights.", + "locationName": "Various restaurants in Napa Valley", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "napa-valley", + "ref": "gourmet-food-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_gourmet-food-tour.jpg" + }, + { + "name": "Hot Air Balloon Ride", + "description": "Soar above the picturesque vineyards of Napa Valley in a hot air balloon. Witness breathtaking panoramic views of rolling hills, sprawling estates, and the distant Mayacamas Mountains. Enjoy a serene and unforgettable experience as you float gently through the air, capturing stunning photos and creating lasting memories.", + "locationName": "Napa Valley Aloft or Balloons Above the Valley", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "napa-valley", + "ref": "hot-air-balloon-ride", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_hot-air-balloon-ride.jpg" + }, + { + "name": "Napa Valley Wine Train", + "description": "Embark on a scenic and luxurious journey aboard the Napa Valley Wine Train. Travel through the heart of wine country in vintage Pullman cars, enjoying gourmet meals, fine wines, and breathtaking views of the vineyards. Choose from various themed tours, including murder mystery dinners and wine tasting experiences, for an unforgettable adventure.", + "locationName": "Napa Valley Wine Train", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "napa-valley", + "ref": "napa-valley-wine-train", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_napa-valley-wine-train.jpg" + }, + { + "name": "Spa Day and Wellness Retreat", + "description": "Indulge in a day of pampering and relaxation at one of Napa Valley's luxurious spa resorts. Enjoy rejuvenating treatments, such as massages, facials, and body wraps, amidst tranquil surroundings. Many resorts offer wellness programs, yoga classes, and fitness activities, allowing you to unwind and recharge in a serene environment.", + "locationName": "Various spa resorts in Napa Valley", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "napa-valley", + "ref": "spa-day-and-wellness-retreat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_spa-day-and-wellness-retreat.jpg" + }, + { + "name": "Napa Valley Bike Tour", + "description": "Embark on a scenic bike tour through the rolling vineyards of Napa Valley. Pedal along quiet country roads, stopping at charming wineries for tastings and breathtaking views. Enjoy a picnic lunch amidst the vines, soaking up the fresh air and sunshine. This is a fantastic way to experience the beauty of the region at your own pace.", + "locationName": "Various vineyards and wineries throughout Napa Valley", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "napa-valley", + "ref": "napa-valley-bike-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_napa-valley-bike-tour.jpg" + }, + { + "name": "Culinary Class at the Culinary Institute of America", + "description": "Unleash your inner chef with a hands-on cooking class at the renowned Culinary Institute of America (CIA) at Greystone. Learn from world-class chefs and master new culinary techniques, creating delicious dishes using fresh, local ingredients. This immersive experience is perfect for food enthusiasts of all skill levels.", + "locationName": "Culinary Institute of America at Greystone", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "napa-valley", + "ref": "culinary-class-at-the-culinary-institute-of-america", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_culinary-class-at-the-culinary-institute-of-america.jpg" + }, + { + "name": "Kayaking on the Napa River", + "description": "Explore the tranquil beauty of the Napa River on a leisurely kayak adventure. Paddle through serene waters, surrounded by lush vineyards and rolling hills. Keep an eye out for wildlife like herons and egrets as you enjoy the peaceful ambiance of the valley from a unique perspective.", + "locationName": "Napa River", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "napa-valley", + "ref": "kayaking-on-the-napa-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_kayaking-on-the-napa-river.jpg" + }, + { + "name": "Uptown Theater Performance", + "description": "Experience the vibrant arts and culture scene of Napa Valley with a live performance at the historic Uptown Theater. Enjoy a variety of shows, from Broadway musicals and concerts to comedy acts and dance performances. This is a perfect evening activity for those seeking entertainment and a touch of sophistication.", + "locationName": "Uptown Theater, Napa", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "napa-valley", + "ref": "uptown-theater-performance", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_uptown-theater-performance.jpg" + }, + { + "name": "Oxbow Public Market Exploration", + "description": "Indulge in a culinary adventure at the Oxbow Public Market, a vibrant marketplace showcasing the best of Napa Valley's artisanal food and wine. Sample local cheeses, charcuterie, fresh produce, and handcrafted chocolates. Discover unique gifts and souvenirs, or simply soak up the lively atmosphere of this foodie haven.", + "locationName": "Oxbow Public Market, Napa", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "napa-valley", + "ref": "oxbow-public-market-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_oxbow-public-market-exploration.jpg" + }, + { + "name": "Hiking Among the Vineyards", + "description": "Embark on a scenic hike through the rolling hills of Napa Valley, surrounded by picturesque vineyards. Trails like the Oat Hill Mine Trail offer stunning views and a chance to immerse yourself in the region's natural beauty.", + "locationName": "Oat Hill Mine Trail, Robert Louis Stevenson State Park", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "napa-valley", + "ref": "hiking-among-the-vineyards", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_hiking-among-the-vineyards.jpg" + }, + { + "name": "Napa Valley Wine Trolley", + "description": "Step back in time and explore Napa Valley in a replica of an iconic San Francisco cable car. The Napa Valley Wine Trolley offers a unique and charming way to visit different wineries, enjoying the scenery and learning about the region's history.", + "locationName": "Napa Valley Wine Trolley", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "napa-valley", + "ref": "napa-valley-wine-trolley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_napa-valley-wine-trolley.jpg" + }, + { + "name": "Castello di Amorosa", + "description": "Transport yourself to a medieval Tuscan castle at Castello di Amorosa. Explore the authentically-built 13th-century style castle, complete with a moat, drawbridge, and torture chamber. Enjoy a tour and wine tasting in this unique setting.", + "locationName": "Castello di Amorosa", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 4, + "destinationRef": "napa-valley", + "ref": "castello-di-amorosa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_castello-di-amorosa.jpg" + }, + { + "name": "Beringer Vineyards Tour", + "description": "Delve into the history of California winemaking with a tour of Beringer Vineyards, the oldest continuously operating winery in Napa Valley. Explore the historic Rhine House, discover the aging caves, and indulge in a tasting of their renowned wines.", + "locationName": "Beringer Vineyards", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "napa-valley", + "ref": "beringer-vineyards-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_beringer-vineyards-tour.jpg" + }, + { + "name": "Hot Air Balloon Ride Over the Valley", + "description": "Soar above the breathtaking landscapes of Napa Valley in a hot air balloon. Witness the sunrise or sunset paint the vineyards in golden hues, and enjoy panoramic views of the entire region.", + "locationName": "Napa Valley Balloons, Inc.", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "napa-valley", + "ref": "hot-air-balloon-ride-over-the-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_hot-air-balloon-ride-over-the-valley.jpg" + }, + { + "name": "Napa Valley Aloft Balloon Rides", + "description": "Experience the breathtaking beauty of Napa Valley from a unique perspective with a hot air balloon ride. Drift silently over rolling vineyards, picturesque towns, and the stunning Napa River as the sun paints the sky with vibrant colors. This unforgettable adventure offers panoramic views and a sense of tranquility, making it a perfect romantic or special occasion activity.", + "locationName": "Napa Valley", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "napa-valley", + "ref": "napa-valley-aloft-balloon-rides", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_napa-valley-aloft-balloon-rides.jpg" + }, + { + "name": "Silverado Trail Scenic Drive", + "description": "Embark on a scenic drive along the historic Silverado Trail, a winding road that traverses the eastern side of Napa Valley. Discover hidden wineries, charming towns, and breathtaking vistas of vineyards and mountains. Stop at local farms and artisan shops along the way, or simply enjoy the peaceful drive through the countryside. This self-guided tour allows you to explore at your own pace and discover the hidden gems of Napa Valley.", + "locationName": "Silverado Trail", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "napa-valley", + "ref": "silverado-trail-scenic-drive", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_silverado-trail-scenic-drive.jpg" + }, + { + "name": "Bothe-Napa Valley State Park", + "description": "Escape the hustle and bustle of wine country and immerse yourself in nature at Bothe-Napa Valley State Park. Hike through redwood forests, explore scenic trails, or have a picnic by a babbling creek. The park offers a range of activities, including camping, swimming, and fishing, making it a perfect destination for outdoor enthusiasts and families.", + "locationName": "Bothe-Napa Valley State Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "napa-valley", + "ref": "bothe-napa-valley-state-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_bothe-napa-valley-state-park.jpg" + }, + { + "name": "Napa Valley Museum Yountville", + "description": "Delve into the rich history and culture of Napa Valley at the Napa Valley Museum Yountville. Explore exhibits showcasing the region's art, winemaking heritage, and the stories of the people who have shaped the valley. The museum offers a fascinating glimpse into the past and present of this iconic destination.", + "locationName": "Yountville", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "napa-valley", + "ref": "napa-valley-museum-yountville", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_napa-valley-museum-yountville.jpg" + }, + { + "name": "Live Music at Blue Note Napa", + "description": "Experience the vibrant nightlife of Napa Valley at the Blue Note Napa, a renowned jazz club. Enjoy live performances by world-class musicians while sipping on your favorite wine or cocktail. The intimate setting and exceptional acoustics create an unforgettable evening of entertainment.", + "locationName": "Napa", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "napa-valley", + "ref": "live-music-at-blue-note-napa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/napa-valley_live-music-at-blue-note-napa.jpg" + }, + { + "name": "Explore the French Quarter", + "description": "Wander through the charming streets of the French Quarter, the oldest neighborhood in New Orleans. Admire the French and Spanish colonial architecture, visit Jackson Square and St. Louis Cathedral, browse the shops and art galleries, and soak in the lively atmosphere.", + "locationName": "French Quarter", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "new-orleans", + "ref": "explore-the-french-quarter", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_explore-the-french-quarter.jpg" + }, + { + "name": "Indulge in a Culinary Adventure", + "description": "Embark on a delicious journey through New Orleans' renowned cuisine. Savor classic dishes like gumbo, jambalaya, and beignets. Explore local restaurants, cafes, and food markets to experience the unique flavors and spices of Creole and Cajun cooking.", + "locationName": "Various restaurants and cafes", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "new-orleans", + "ref": "indulge-in-a-culinary-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_indulge-in-a-culinary-adventure.jpg" + }, + { + "name": "Immerse in Jazz Music on Frenchmen Street", + "description": "Head to Frenchmen Street, a vibrant hub of live music venues. Experience the soulful sounds of New Orleans jazz, blues, and other genres. Enjoy the lively atmosphere, bar hop, and dance the night away.", + "locationName": "Frenchmen Street", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "new-orleans", + "ref": "immerse-in-jazz-music-on-frenchmen-street", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_immerse-in-jazz-music-on-frenchmen-street.jpg" + }, + { + "name": "Visit the Historic Cemeteries", + "description": "Explore the unique above-ground cemeteries of New Orleans, such as St. Louis Cemetery No. 1. Learn about the city's history, burial customs, and famous figures who are laid to rest there. Take a guided tour or wander through the hauntingly beautiful tombs.", + "locationName": "St. Louis Cemetery No. 1", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "new-orleans", + "ref": "visit-the-historic-cemeteries", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_visit-the-historic-cemeteries.jpg" + }, + { + "name": "Experience Mardi Gras", + "description": "If you're visiting during Mardi Gras season, immerse yourself in the festivities. Watch colorful parades, catch beads, and join the lively celebrations. Experience the unique traditions and costumes of this world-famous carnival.", + "locationName": "Various parade routes", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "new-orleans", + "ref": "experience-mardi-gras", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_experience-mardi-gras.jpg" + }, + { + "name": "Swamp Tour Adventure", + "description": "Embark on a thrilling swamp tour adventure just outside the city. Glide through the mysterious bayous on an airboat, encountering fascinating wildlife like alligators, turtles, and various bird species. Learn about the unique ecosystem and Cajun culture from experienced guides, making it an unforgettable experience for nature enthusiasts and adventure seekers.", + "locationName": "Various swamp tour operators outside New Orleans", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "new-orleans", + "ref": "swamp-tour-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_swamp-tour-adventure.jpg" + }, + { + "name": "St. Charles Streetcar Ride", + "description": "Take a nostalgic ride on the iconic St. Charles Streetcar, one of the oldest continuously operating streetcar lines in the world. Enjoy a scenic journey through the Garden District, admiring the historic mansions, oak-lined streets, and charming shops. It's a relaxing and affordable way to experience the city's beauty and history.", + "locationName": "St. Charles Avenue", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "new-orleans", + "ref": "st-charles-streetcar-ride", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_st-charles-streetcar-ride.jpg" + }, + { + "name": "Explore the Garden District", + "description": "Wander through the picturesque Garden District, known for its elegant mansions, lush gardens, and historic architecture. Admire the antebellum homes, visit Lafayette Cemetery No. 1, and stroll along the charming streets. Discover hidden gems, antique shops, and local cafes for a delightful afternoon.", + "locationName": "Garden District", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "new-orleans", + "ref": "explore-the-garden-district", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_explore-the-garden-district.jpg" + }, + { + "name": "Catch a Show at Preservation Hall", + "description": "Experience the magic of traditional New Orleans jazz at Preservation Hall, a historic venue dedicated to preserving the city's musical heritage. Enjoy intimate performances by renowned jazz musicians in a cozy and authentic setting. It's a must-do for music lovers and a chance to immerse yourself in the soul of New Orleans.", + "locationName": "Preservation Hall", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "new-orleans", + "ref": "catch-a-show-at-preservation-hall", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_catch-a-show-at-preservation-hall.jpg" + }, + { + "name": "Visit the National WWII Museum", + "description": "Immerse yourself in history at the National WWII Museum, one of the top-rated museums in the country. Explore interactive exhibits, personal stories, and artifacts that showcase the American experience during World War II. Gain a deeper understanding of the war's impact and the sacrifices made by those who served.", + "locationName": "National WWII Museum", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "new-orleans", + "ref": "visit-the-national-wwii-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_visit-the-national-wwii-museum.jpg" + }, + { + "name": "Kayaking on Bayou St. John", + "description": "Escape the city bustle and embark on a serene kayaking adventure on Bayou St. John. Paddle through the calm waters, surrounded by lush greenery and charming historic homes. Keep an eye out for local wildlife like turtles, birds, and maybe even an alligator. This relaxing activity is perfect for nature lovers and offers a unique perspective of the city.", + "locationName": "Bayou St. John", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "new-orleans", + "ref": "kayaking-on-bayou-st-john", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_kayaking-on-bayou-st-john.jpg" + }, + { + "name": "Art Exploration in the Warehouse District", + "description": "Immerse yourself in New Orleans' vibrant art scene with a visit to the Warehouse District. Explore contemporary art galleries, studios, and museums, showcasing works by local and international artists. Discover unique pieces, attend art openings, and perhaps even meet some of the artists. This activity is perfect for art enthusiasts and offers a glimpse into the city's creative spirit.", + "locationName": "Warehouse District", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "new-orleans", + "ref": "art-exploration-in-the-warehouse-district", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_art-exploration-in-the-warehouse-district.jpg" + }, + { + "name": "Shopping Spree at the French Market", + "description": "Indulge in a shopping spree at the historic French Market, a vibrant open-air market dating back to the 18th century. Browse through a diverse array of stalls selling local crafts, souvenirs, antiques, clothing, and fresh produce. Enjoy live music, street performers, and delicious food options. This is a perfect place to find unique gifts and experience the local culture.", + "locationName": "French Market", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "new-orleans", + "ref": "shopping-spree-at-the-french-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_shopping-spree-at-the-french-market.jpg" + }, + { + "name": "Cocktail Tour and History", + "description": "Embark on a captivating cocktail tour that blends history and mixology. Learn about the origins and evolution of iconic New Orleans cocktails like the Sazerac and the Hurricane. Visit historic bars, hidden speakeasies, and modern craft cocktail lounges. Sip on expertly crafted drinks while discovering the stories and legends behind them. This is a perfect activity for cocktail enthusiasts and history buffs.", + "locationName": "French Quarter and surrounding areas", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "new-orleans", + "ref": "cocktail-tour-and-history", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_cocktail-tour-and-history.jpg" + }, + { + "name": "Day Trip to Oak Alley Plantation", + "description": "Step back in time with a day trip to Oak Alley Plantation, a historic sugar plantation renowned for its stunning avenue of live oak trees. Explore the beautifully preserved mansion, learn about the history of the plantation and the lives of enslaved people, and wander through the picturesque grounds. This is a captivating experience that offers a glimpse into Louisiana's complex past.", + "locationName": "Oak Alley Plantation (Vacherie, LA)", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "new-orleans", + "ref": "day-trip-to-oak-alley-plantation", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_day-trip-to-oak-alley-plantation.jpg" + }, + { + "name": "Audubon Park Exploration", + "description": "Escape the city bustle and discover the serene beauty of Audubon Park. Rent a bike or stroll along the picturesque trails, have a picnic under the sprawling oak trees, or visit the Audubon Zoo to encounter exotic animals. Perfect for a relaxing afternoon amidst nature.", + "locationName": "Audubon Park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "new-orleans", + "ref": "audubon-park-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_audubon-park-exploration.jpg" + }, + { + "name": "Steamboat Natchez Jazz Cruise", + "description": "Embark on a nostalgic journey aboard the Steamboat Natchez, a historic steamboat offering scenic cruises along the Mississippi River. Enjoy live jazz music, indulge in a delicious buffet, and admire breathtaking views of the city skyline. A perfect way to experience New Orleans' charm from a different perspective.", + "locationName": "Mississippi River", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "new-orleans", + "ref": "steamboat-natchez-jazz-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_steamboat-natchez-jazz-cruise.jpg" + }, + { + "name": "Jackson Square and St. Louis Cathedral", + "description": "Step into the heart of the French Quarter and visit the iconic Jackson Square, a historic park surrounded by charming buildings and street performers. Explore the majestic St. Louis Cathedral, the oldest continuously active Roman Catholic cathedral in the United States, and admire its stunning architecture.", + "locationName": "Jackson Square", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "new-orleans", + "ref": "jackson-square-and-st-louis-cathedral", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_jackson-square-and-st-louis-cathedral.jpg" + }, + { + "name": "Magazine Street Shopping and Gallery Hopping", + "description": "Wander down the trendy Magazine Street and discover its eclectic mix of boutiques, art galleries, antique shops, and local restaurants. Find unique souvenirs, admire local artwork, or simply soak up the vibrant atmosphere of this popular shopping district.", + "locationName": "Magazine Street", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "new-orleans", + "ref": "magazine-street-shopping-and-gallery-hopping", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_magazine-street-shopping-and-gallery-hopping.jpg" + }, + { + "name": "Catch a Performance at Tipitina's", + "description": "Immerse yourself in the local music scene at Tipitina's, a legendary music venue known for hosting renowned musicians and showcasing the best of New Orleans' musical talent. Enjoy live performances ranging from jazz and blues to funk and rock, and experience the city's vibrant nightlife.", + "locationName": "Tipitina's", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "new-orleans", + "ref": "catch-a-performance-at-tipitina-s", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-orleans_catch-a-performance-at-tipitina-s.jpg" + }, + { + "name": "Hiking the Tongariro Alpine Crossing", + "description": "Embark on a challenging yet rewarding journey through volcanic landscapes on the Tongariro Alpine Crossing. Marvel at emerald lakes, volcanic craters, and panoramic views of the North Island.", + "locationName": "Tongariro National Park", + "duration": 7, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "new-zealand", + "ref": "hiking-the-tongariro-alpine-crossing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_hiking-the-tongariro-alpine-crossing.jpg" + }, + { + "name": "Exploring Waitomo Caves", + "description": "Descend into the magical world of Waitomo Caves and witness the mesmerizing glowworms illuminating the darkness. Take a boat ride through the Glowworm Grotto or opt for a thrilling black water rafting adventure.", + "locationName": "Waitomo", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "new-zealand", + "ref": "exploring-waitomo-caves", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_exploring-waitomo-caves.jpg" + }, + { + "name": "Cruising Milford Sound", + "description": "Experience the awe-inspiring beauty of Milford Sound on a scenic cruise. Gaze upon towering waterfalls, dramatic cliffs, and lush rainforests as you navigate through this fiord carved by glaciers.", + "locationName": "Fiordland National Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "new-zealand", + "ref": "cruising-milford-sound", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_cruising-milford-sound.jpg" + }, + { + "name": "Whale Watching in Kaikoura", + "description": "Embark on an unforgettable whale watching tour in Kaikoura, renowned for its diverse marine life. Spot majestic sperm whales, playful dolphins, and graceful albatrosses.", + "locationName": "Kaikoura", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "new-zealand", + "ref": "whale-watching-in-kaikoura", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_whale-watching-in-kaikoura.jpg" + }, + { + "name": "Bungy Jumping in Queenstown", + "description": "Get your adrenaline pumping with a thrilling bungy jump in the adventure capital of Queenstown. Leap from iconic bridges or platforms and experience the ultimate rush.", + "locationName": "Queenstown", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "new-zealand", + "ref": "bungy-jumping-in-queenstown", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_bungy-jumping-in-queenstown.jpg" + }, + { + "name": "Kayaking in Abel Tasman National Park", + "description": "Embark on a kayaking adventure through the turquoise waters of Abel Tasman National Park. Paddle along the coastline, exploring hidden coves, secluded beaches, and encountering marine life such as seals and dolphins. This activity offers a unique perspective of the park's stunning scenery and is suitable for various skill levels.", + "locationName": "Abel Tasman National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "new-zealand", + "ref": "kayaking-in-abel-tasman-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_kayaking-in-abel-tasman-national-park.jpg" + }, + { + "name": "Stargazing in the Mackenzie Basin", + "description": "Experience the magic of the night sky in the Mackenzie Basin, renowned as one of the world's best stargazing destinations. The region's clear skies and minimal light pollution offer breathtaking views of the Milky Way, constellations, and even the Southern Lights. Join a guided tour or simply lie back and marvel at the celestial wonders above.", + "locationName": "Mackenzie Basin", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "new-zealand", + "ref": "stargazing-in-the-mackenzie-basin", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_stargazing-in-the-mackenzie-basin.jpg" + }, + { + "name": "Wine Tasting in Marlborough", + "description": "Indulge in the world-renowned wines of Marlborough, New Zealand's largest wine region. Visit picturesque vineyards, sample a variety of Sauvignon Blanc, Pinot Noir, and other varietals, and learn about the winemaking process from passionate local experts. Enjoy a gourmet lunch or cheese platter while savoring the flavors of the region.", + "locationName": "Marlborough", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "new-zealand", + "ref": "wine-tasting-in-marlborough", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_wine-tasting-in-marlborough.jpg" + }, + { + "name": "Rotorua Geothermal Parks", + "description": "Explore the geothermal wonders of Rotorua, a region famous for its geysers, mud pools, and hot springs. Witness the impressive Pohutu Geyser erupt, marvel at the colorful Champagne Pool, and experience the therapeutic benefits of a natural hot spring soak. Learn about the Maori culture and the geothermal forces that shaped the landscape.", + "locationName": "Rotorua", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "new-zealand", + "ref": "rotorua-geothermal-parks", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_rotorua-geothermal-parks.jpg" + }, + { + "name": "Skiing or Snowboarding in Queenstown", + "description": "Hit the slopes of Queenstown, the adventure capital of New Zealand, and experience world-class skiing and snowboarding. The region boasts several ski resorts with diverse terrain for all skill levels, from gentle beginner slopes to challenging black runs. Enjoy breathtaking mountain views and après-ski activities in the vibrant town center.", + "locationName": "Queenstown", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "new-zealand", + "ref": "skiing-or-snowboarding-in-queenstown", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_skiing-or-snowboarding-in-queenstown.jpg" + }, + { + "name": "Black Water Rafting in Waitomo Caves", + "description": "Embark on a thrilling underground adventure with black water rafting in the Waitomo Caves. Float on an inner tube through the glowworm-lit caverns, rappel down waterfalls, and experience the unique beauty of this subterranean world. This is a perfect activity for those seeking an adrenaline rush and a memorable experience.", + "locationName": "Waitomo Caves", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "new-zealand", + "ref": "black-water-rafting-in-waitomo-caves", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_black-water-rafting-in-waitomo-caves.jpg" + }, + { + "name": "Visit Hobbiton Movie Set", + "description": "Step into the enchanting world of Middle-earth with a visit to the Hobbiton Movie Set. Explore the charming hobbit holes, rolling green hills, and gardens of the Shire, as seen in the Lord of the Rings and The Hobbit films. This is a must-do for movie buffs and anyone who wants to experience a bit of magic.", + "locationName": "Matamata", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "new-zealand", + "ref": "visit-hobbiton-movie-set", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_visit-hobbiton-movie-set.jpg" + }, + { + "name": "Relax in the Polynesian Spa", + "description": "Indulge in a rejuvenating experience at the Polynesian Spa in Rotorua. Soak in the mineral-rich geothermal waters, enjoy a relaxing massage, and admire the stunning lakefront views. This is the perfect way to unwind and recharge after a day of exploring.", + "locationName": "Rotorua", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "new-zealand", + "ref": "relax-in-the-polynesian-spa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_relax-in-the-polynesian-spa.jpg" + }, + { + "name": "Take a Scenic Flight over Franz Josef Glacier", + "description": "Experience the breathtaking beauty of Franz Josef Glacier from above with a scenic helicopter flight. Soar over the ice formations, crevasses, and snow-capped peaks, and enjoy panoramic views of the Southern Alps. This is an unforgettable way to appreciate the scale and majesty of this natural wonder.", + "locationName": "Franz Josef Glacier", + "duration": 1, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "new-zealand", + "ref": "take-a-scenic-flight-over-franz-josef-glacier", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_take-a-scenic-flight-over-franz-josef-glacier.jpg" + }, + { + "name": "Learn About Maori Culture at the Te Papa Museum", + "description": "Immerse yourself in the rich culture and history of the Maori people at the Te Papa Museum in Wellington. Explore interactive exhibits, traditional artifacts, and contemporary art, and gain a deeper understanding of New Zealand's indigenous heritage. This is an enriching and educational experience for visitors of all ages.", + "locationName": "Wellington", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "new-zealand", + "ref": "learn-about-maori-culture-at-the-te-papa-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_learn-about-maori-culture-at-the-te-papa-museum.jpg" + }, + { + "name": "Caving Adventures in the Waitomo Region", + "description": "Embark on a thrilling caving expedition in the Waitomo region, renowned for its extensive network of limestone caves. Experience the mesmerizing glowworm caves, where thousands of tiny bioluminescent creatures illuminate the darkness. Alternatively, choose a more adventurous route with blackwater rafting, rappelling, or spelunking through hidden passages.", + "locationName": "Waitomo Caves", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "new-zealand", + "ref": "caving-adventures-in-the-waitomo-region", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_caving-adventures-in-the-waitomo-region.jpg" + }, + { + "name": "Dolphin and Seal Encounters in Kaikoura", + "description": "Kaikoura is a coastal town famous for its marine wildlife. Embark on a boat tour to witness playful dolphins leaping alongside the vessel, or observe the adorable fur seals basking on the rocky shores. You might even spot migrating whales, depending on the season. This experience offers a unique opportunity to connect with nature and appreciate the rich biodiversity of New Zealand's oceans.", + "locationName": "Kaikoura", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "new-zealand", + "ref": "dolphin-and-seal-encounters-in-kaikoura", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_dolphin-and-seal-encounters-in-kaikoura.jpg" + }, + { + "name": "Scenic Drives on the South Island", + "description": "Embark on a breathtaking road trip through the South Island, renowned for its dramatic landscapes. Cruise along the Great Coast Road, winding past rugged coastlines and charming seaside towns. Explore the picturesque Southern Scenic Route, traversing rolling hills, pristine lakes, and snow-capped mountains. Don't miss the Crown Range Road, offering panoramic views of the Queenstown region.", + "locationName": "South Island", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "new-zealand", + "ref": "scenic-drives-on-the-south-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_scenic-drives-on-the-south-island.jpg" + }, + { + "name": "Mountain Biking in the Redwoods", + "description": "Experience the thrill of mountain biking amidst the towering redwoods of Whakarewarewa Forest in Rotorua. Explore the extensive network of trails, catering to all skill levels. Glide through the lush forest, enjoying the fresh air and the unique atmosphere created by these ancient giants.", + "locationName": "Whakarewarewa Forest, Rotorua", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "new-zealand", + "ref": "mountain-biking-in-the-redwoods", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_mountain-biking-in-the-redwoods.jpg" + }, + { + "name": "Skydiving over Lake Taupo", + "description": "Take the plunge and experience the ultimate adrenaline rush with a skydiving adventure over the stunning Lake Taupo. Enjoy breathtaking panoramic views of the lake, volcanic landscapes, and the surrounding mountains as you freefall through the sky. This unforgettable experience is perfect for thrill-seekers and those looking for an unforgettable way to appreciate New Zealand's beauty.", + "locationName": "Lake Taupo", + "duration": 1, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "new-zealand", + "ref": "skydiving-over-lake-taupo", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/new-zealand_skydiving-over-lake-taupo.jpg" + }, + { + "name": "Hike the East Coast Trail", + "description": "Embark on an unforgettable journey along the East Coast Trail, a network of coastal paths showcasing Newfoundland's dramatic scenery. Hike through rugged cliffs, secluded coves, and charming fishing villages, encountering breathtaking ocean views and diverse wildlife along the way. Choose from various trail sections, catering to different fitness levels and time constraints, and immerse yourself in the island's natural beauty.", + "locationName": "East Coast Trail", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "newfoundland", + "ref": "hike-the-east-coast-trail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_hike-the-east-coast-trail.jpg" + }, + { + "name": "Whale Watching Adventure", + "description": "Set sail on a thrilling whale watching excursion and witness the majestic giants of the sea in their natural habitat. Newfoundland's waters are teeming with humpback whales, minke whales, and even orcas. Experienced guides will lead you to prime viewing spots, providing insights into these fascinating creatures and the marine ecosystem. Capture unforgettable memories as you observe whales breaching, tail slapping, and socializing.", + "locationName": "Witless Bay Ecological Reserve", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "newfoundland", + "ref": "whale-watching-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_whale-watching-adventure.jpg" + }, + { + "name": "Explore Gros Morne National Park", + "description": "Discover the awe-inspiring landscapes of Gros Morne National Park, a UNESCO World Heritage Site. Hike through the towering Long Range Mountains, marvel at the majestic fjords of Western Brook Pond, and explore the unique Tablelands, a geological wonder showcasing the Earth's mantle. Engage in boat tours, kayaking adventures, or scenic drives, and immerse yourself in the park's rich natural and cultural heritage.", + "locationName": "Gros Morne National Park", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "newfoundland", + "ref": "explore-gros-morne-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_explore-gros-morne-national-park.jpg" + }, + { + "name": "Experience the Culture of St. John's", + "description": "Immerse yourself in the vibrant culture of St. John's, Newfoundland's capital city. Explore the colorful houses of Jellybean Row, visit the historic Signal Hill National Historic Site, and delve into the exhibits at The Rooms, a cultural center showcasing the province's history and art. Enjoy live music at local pubs, savor fresh seafood delicacies, and experience the warmth and hospitality of the locals.", + "locationName": "St. John's", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "newfoundland", + "ref": "experience-the-culture-of-st-john-s", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_experience-the-culture-of-st-john-s.jpg" + }, + { + "name": "Puffin and Seabird Watching", + "description": "Embark on a delightful boat tour to witness the charming puffins and diverse seabird colonies that inhabit Newfoundland's coastal cliffs. Observe these adorable creatures up close as they nest, socialize, and soar through the air. Learn about their unique behaviors and the importance of conservation efforts, while enjoying the stunning coastal scenery and the refreshing sea breeze.", + "locationName": "Elliston, Bonavista Peninsula", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "newfoundland", + "ref": "puffin-and-seabird-watching", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_puffin-and-seabird-watching.jpg" + }, + { + "name": "Kayaking Adventure in Witless Bay Ecological Reserve", + "description": "Embark on a guided kayaking tour through the pristine waters of Witless Bay Ecological Reserve. Witness breathtaking coastal scenery, encounter playful puffins and other seabirds, and possibly spot whales or dolphins. This eco-friendly activity allows you to connect with nature and experience the island's marine life up close.", + "locationName": "Witless Bay Ecological Reserve", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "newfoundland", + "ref": "kayaking-adventure-in-witless-bay-ecological-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_kayaking-adventure-in-witless-bay-ecological-reserve.jpg" + }, + { + "name": "Scuba Diving at Bell Island", + "description": "Dive into history and explore the underwater world surrounding Bell Island. Discover shipwrecks from World War II, including the SS Lord Strathcona and the SS Saganaga, and marvel at the diverse marine life that inhabits these artificial reefs. This unique diving experience offers a glimpse into the island's past and the beauty of its underwater ecosystems.", + "locationName": "Bell Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "newfoundland", + "ref": "scuba-diving-at-bell-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_scuba-diving-at-bell-island.jpg" + }, + { + "name": "Explore the Quidi Vidi Village and Brewery", + "description": "Step back in time and visit the charming Quidi Vidi Village, a historic fishing community near St. John's. Stroll through the colorful houses, browse local crafts, and enjoy fresh seafood at the waterfront restaurants. Don't miss a visit to the Quidi Vidi Brewery, where you can sample award-winning craft beers and learn about the brewing process.", + "locationName": "Quidi Vidi Village", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "newfoundland", + "ref": "explore-the-quidi-vidi-village-and-brewery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_explore-the-quidi-vidi-village-and-brewery.jpg" + }, + { + "name": "Journey to the Viking Settlement of L'Anse aux Meadows", + "description": "Travel back in time and discover the only authenticated Viking settlement in North America. Explore the reconstructed Norse buildings, learn about the lives of these early explorers, and imagine their journey across the Atlantic. This historical and archaeological site offers a fascinating glimpse into Newfoundland's rich past.", + "locationName": "L'Anse aux Meadows", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "newfoundland", + "ref": "journey-to-the-viking-settlement-of-l-anse-aux-meadows", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_journey-to-the-viking-settlement-of-l-anse-aux-meadows.jpg" + }, + { + "name": "Road Trip Along the Irish Loop", + "description": "Embark on a scenic road trip along the Irish Loop, a coastal route known for its breathtaking landscapes and charming villages. Visit the Colony of Avalon, a 17th-century English settlement, explore the Cape St. Mary's Ecological Reserve with its thousands of seabirds, and enjoy fresh seafood in the picturesque town of Ferryland.", + "locationName": "Irish Loop", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "newfoundland", + "ref": "road-trip-along-the-irish-loop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_road-trip-along-the-irish-loop.jpg" + }, + { + "name": "Boat Tour of the Iceberg Alley", + "description": "Embark on a breathtaking boat tour along Iceberg Alley, where you can witness the majestic beauty of icebergs up close. Marvel at these colossal giants as they drift down from the Arctic, creating a surreal and unforgettable experience.", + "locationName": "Iceberg Alley (various departure points)", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "newfoundland", + "ref": "boat-tour-of-the-iceberg-alley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_boat-tour-of-the-iceberg-alley.jpg" + }, + { + "name": "Attend a Traditional Kitchen Party", + "description": "Immerse yourself in the lively spirit of Newfoundland culture by attending a traditional kitchen party. Enjoy toe-tapping music, lively dancing, and warm hospitality as locals share stories, songs, and laughter. This is a perfect opportunity to experience the genuine warmth and friendliness of the Newfoundland people.", + "locationName": "Various locations throughout Newfoundland", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "newfoundland", + "ref": "attend-a-traditional-kitchen-party", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_attend-a-traditional-kitchen-party.jpg" + }, + { + "name": "Explore the Bonavista Peninsula", + "description": "Discover the scenic beauty and rich history of the Bonavista Peninsula. Visit charming coastal towns like Trinity and Bonavista, where you can explore historic sites, enjoy local seafood, and witness stunning ocean views. Keep an eye out for puffins and other seabirds that inhabit the area.", + "locationName": "Bonavista Peninsula", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "newfoundland", + "ref": "explore-the-bonavista-peninsula", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_explore-the-bonavista-peninsula.jpg" + }, + { + "name": "Go Fishing in a Remote Outport", + "description": "Experience the traditional way of life in a remote Newfoundland outport by joining a local fishing excursion. Learn about the fishing industry, try your hand at catching cod or other species, and enjoy the tranquility of the surrounding ocean.", + "locationName": "Various outport communities", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "newfoundland", + "ref": "go-fishing-in-a-remote-outport", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_go-fishing-in-a-remote-outport.jpg" + }, + { + "name": "Visit Signal Hill National Historic Site", + "description": "Explore Signal Hill National Historic Site, a landmark overlooking St. John's harbor. Learn about the site's rich history, including its role in transatlantic communication and wartime defense. Enjoy panoramic views of the city and surrounding coastline.", + "locationName": "St. John's", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "newfoundland", + "ref": "visit-signal-hill-national-historic-site", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_visit-signal-hill-national-historic-site.jpg" + }, + { + "name": "Berry Picking Adventure", + "description": "Embark on a delightful journey through Newfoundland's wild landscapes, foraging for delicious berries like blueberries, partridgeberries, and bakeapples. Immerse yourself in the island's natural beauty while enjoying a unique and rewarding experience. Perfect for families and nature enthusiasts, berry picking offers a taste of Newfoundland's bounty and a chance to connect with the land.", + "locationName": "Various locations across the island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "newfoundland", + "ref": "berry-picking-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_berry-picking-adventure.jpg" + }, + { + "name": "Geological Wonders Tour", + "description": "Explore the fascinating geological formations of Newfoundland, from the ancient rock formations of Gros Morne National Park to the dramatic cliffs of the Bonavista Peninsula. Discover the island's unique geological history, learn about plate tectonics, and marvel at the forces that have shaped this incredible landscape. This tour is perfect for those interested in science, nature, and the wonders of the Earth.", + "locationName": "Gros Morne National Park, Bonavista Peninsula", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "newfoundland", + "ref": "geological-wonders-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_geological-wonders-tour.jpg" + }, + { + "name": "Sea Kayaking Along the Coast", + "description": "Embark on a serene sea kayaking adventure along Newfoundland's stunning coastline. Paddle through crystal-clear waters, explore hidden coves, and admire the rugged cliffs and picturesque fishing villages. Keep an eye out for marine life such as whales, seals, and seabirds. This activity is perfect for those seeking a peaceful and immersive experience in nature.", + "locationName": "Various coastal locations", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "newfoundland", + "ref": "sea-kayaking-along-the-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_sea-kayaking-along-the-coast.jpg" + }, + { + "name": "Discover the Arts and Crafts Scene", + "description": "Immerse yourself in Newfoundland's vibrant arts and crafts scene. Visit local studios and galleries, meet talented artists, and discover unique handcrafted treasures. From pottery and paintings to textiles and woodwork, you'll find a diverse range of artistic expressions that reflect the island's rich culture and heritage. This activity is perfect for art lovers and those seeking unique souvenirs.", + "locationName": "St. John's, Twillingate, Trinity", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "newfoundland", + "ref": "discover-the-arts-and-crafts-scene", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_discover-the-arts-and-crafts-scene.jpg" + }, + { + "name": "Indulge in a Traditional Newfoundland Feast", + "description": "Treat your taste buds to a traditional Newfoundland feast, savoring local delicacies such as Jiggs dinner, fish and brewis, toutons, and cod tongues. Experience the unique flavors of the island's cuisine and learn about the culinary traditions that have been passed down through generations. This activity is perfect for foodies and those seeking an authentic cultural experience.", + "locationName": "Various restaurants across the island", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "newfoundland", + "ref": "indulge-in-a-traditional-newfoundland-feast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/newfoundland_indulge-in-a-traditional-newfoundland-feast.jpg" + }, + { + "name": "Surf the Pacific Coast", + "description": "Experience the thrill of riding the waves on Nicaragua's Pacific coast, renowned for its world-class surfing conditions. Whether you're a seasoned pro or a beginner, there are breaks suitable for all levels. Popular spots like San Juan del Sur and Popoyo offer consistent swells and a vibrant surf culture.", + "locationName": "San Juan del Sur or Popoyo", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "nicaragua", + "ref": "surf-the-pacific-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_surf-the-pacific-coast.jpg" + }, + { + "name": "Explore Colonial Granada", + "description": "Step back in time and wander through the charming streets of Granada, one of the oldest colonial cities in Central America. Admire the colorful architecture, visit historic churches and convents, and soak up the vibrant atmosphere of this cultural gem.", + "locationName": "Granada", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "nicaragua", + "ref": "explore-colonial-granada", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_explore-colonial-granada.jpg" + }, + { + "name": "Kayak on Lake Nicaragua", + "description": "Embark on a peaceful kayaking adventure on the vast Lake Nicaragua, the largest lake in Central America. Paddle through calm waters, surrounded by stunning scenery and diverse wildlife. Explore the numerous islands dotting the lake, including Ometepe, known for its twin volcanoes and unique ecosystem.", + "locationName": "Lake Nicaragua", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "nicaragua", + "ref": "kayak-on-lake-nicaragua", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_kayak-on-lake-nicaragua.jpg" + }, + { + "name": "Hike in the Cloud Forest of Reserva Natural Miraflor", + "description": "Immerse yourself in the lush beauty of the cloud forest at Reserva Natural Miraflor. Hike through trails teeming with diverse flora and fauna, including orchids, monkeys, and birds. Enjoy breathtaking views of the surrounding mountains and learn about the conservation efforts protecting this unique ecosystem.", + "locationName": "Reserva Natural Miraflor", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "nicaragua", + "ref": "hike-in-the-cloud-forest-of-reserva-natural-miraflor", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_hike-in-the-cloud-forest-of-reserva-natural-miraflor.jpg" + }, + { + "name": "Snorkel or Scuba Dive the Corn Islands", + "description": "Discover the vibrant underwater world of the Corn Islands, located off Nicaragua's Caribbean coast. With pristine coral reefs teeming with colorful fish and diverse marine life, these islands offer an unforgettable experience for both beginner and experienced snorkelers and scuba divers.", + "locationName": "Corn Islands", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "nicaragua", + "ref": "snorkel-or-scuba-dive-the-corn-islands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_snorkel-or-scuba-dive-the-corn-islands.jpg" + }, + { + "name": "Visit the Masaya Volcano National Park", + "description": "Embark on a thrilling journey to Masaya Volcano National Park, home to an active volcano with a mesmerizing lava lake. Witness the raw power of nature and explore the volcanic craters, lava tubes, and diverse ecosystems within the park. For an extra special experience, visit at night to see the glowing lava.", + "locationName": "Masaya Volcano National Park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "nicaragua", + "ref": "visit-the-masaya-volcano-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_visit-the-masaya-volcano-national-park.jpg" + }, + { + "name": "Indulge in a Culinary Tour of Leon", + "description": "Embark on a delectable culinary adventure through the vibrant city of Leon. Sample traditional Nicaraguan dishes like vigoron, nacatamal, and quesillos, and discover the rich flavors and culinary heritage of the region. Explore local markets, street food stalls, and family-run restaurants to experience the authentic tastes of Nicaragua.", + "locationName": "Leon", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "nicaragua", + "ref": "indulge-in-a-culinary-tour-of-leon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_indulge-in-a-culinary-tour-of-leon.jpg" + }, + { + "name": "Relax at the Apoyo Lagoon", + "description": "Escape to the serene beauty of Apoyo Lagoon, a volcanic crater lake known for its crystal-clear waters and tranquil atmosphere. Enjoy swimming, kayaking, or simply lounging by the lakeshore surrounded by lush vegetation. Several eco-lodges and resorts offer stunning views and opportunities for relaxation and rejuvenation.", + "locationName": "Apoyo Lagoon", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "nicaragua", + "ref": "relax-at-the-apoyo-lagoon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_relax-at-the-apoyo-lagoon.jpg" + }, + { + "name": "Go Birdwatching in the Indio Maiz Biological Reserve", + "description": "Immerse yourself in the rich biodiversity of the Indio Maiz Biological Reserve, a pristine rainforest teeming with exotic birdlife. Embark on a guided birdwatching tour and spot toucans, macaws, parrots, and numerous other species in their natural habitat. The reserve also offers opportunities for wildlife viewing, hiking, and exploring the rainforest ecosystem.", + "locationName": "Indio Maiz Biological Reserve", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "nicaragua", + "ref": "go-birdwatching-in-the-indio-maiz-biological-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_go-birdwatching-in-the-indio-maiz-biological-reserve.jpg" + }, + { + "name": "Horseback Riding through the Countryside", + "description": "Embark on a scenic horseback riding adventure through the Nicaraguan countryside. Explore rolling hills, lush farmlands, and charming villages, all while enjoying the fresh air and stunning natural beauty. This activity is perfect for nature lovers and those seeking a peaceful escape.", + "locationName": "Various locations throughout Nicaragua", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "nicaragua", + "ref": "horseback-riding-through-the-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_horseback-riding-through-the-countryside.jpg" + }, + { + "name": "Sunset Catamaran Cruise", + "description": "Set sail on a romantic catamaran cruise and witness the breathtaking beauty of a Nicaraguan sunset over the Pacific Ocean. Enjoy the gentle sea breeze, sip on refreshing cocktails, and savor delicious appetizers as the sky transforms into a canvas of vibrant colors.", + "locationName": "Pacific Coast", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "nicaragua", + "ref": "sunset-catamaran-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_sunset-catamaran-cruise.jpg" + }, + { + "name": "Learn to Surf at a Surf Camp", + "description": "Catch some waves and learn to surf at a renowned surf camp along Nicaragua's Pacific coast. With experienced instructors and ideal conditions, you'll be riding the waves in no time. This activity is perfect for adventure seekers and those looking to try something new.", + "locationName": "San Juan del Sur or other surf spots", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "nicaragua", + "ref": "learn-to-surf-at-a-surf-camp", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_learn-to-surf-at-a-surf-camp.jpg" + }, + { + "name": "Visit the Flor de Caña Rum Distillery", + "description": "Take a tour of the Flor de Caña Rum Distillery and discover the secrets behind Nicaragua's most famous rum. Learn about the rum-making process, from sugarcane cultivation to distillation and aging, and enjoy a tasting of their premium rums.", + "locationName": "Chichigalpa", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 2, + "destinationRef": "nicaragua", + "ref": "visit-the-flor-de-ca-a-rum-distillery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_visit-the-flor-de-ca-a-rum-distillery.jpg" + }, + { + "name": "Shop for Local Crafts at the Masaya Artisan Market", + "description": "Immerse yourself in the vibrant atmosphere of the Masaya Artisan Market and discover a treasure trove of locally made crafts. From handcrafted pottery and textiles to intricate wood carvings and jewelry, you'll find unique souvenirs and gifts to take home.", + "locationName": "Masaya", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "nicaragua", + "ref": "shop-for-local-crafts-at-the-masaya-artisan-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_shop-for-local-crafts-at-the-masaya-artisan-market.jpg" + }, + { + "name": "White-Water Rafting on the Rio San Juan", + "description": "Embark on an exhilarating white-water rafting adventure down the Rio San Juan, a stunning river that forms part of the border between Nicaragua and Costa Rica. Navigate through lush rainforests, spot diverse wildlife, and experience the thrill of rapids as you paddle downstream. This activity is perfect for adventure seekers and nature lovers.", + "locationName": "Rio San Juan", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "nicaragua", + "ref": "white-water-rafting-on-the-rio-san-juan", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_white-water-rafting-on-the-rio-san-juan.jpg" + }, + { + "name": "Explore the Ruins of Leon Viejo", + "description": "Step back in time and discover the fascinating ruins of Leon Viejo, the original site of Nicaragua's first capital city. Founded in 1524 and later abandoned due to volcanic activity, the ruins offer a glimpse into the colonial past. Explore the excavated buildings, learn about the city's history, and enjoy panoramic views of the surrounding landscape.", + "locationName": "Leon Viejo", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "nicaragua", + "ref": "explore-the-ruins-of-leon-viejo", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_explore-the-ruins-of-leon-viejo.jpg" + }, + { + "name": "Take a Chocolate Making Class", + "description": "Indulge your sweet tooth and discover the art of chocolate making with a hands-on workshop. Learn about the history of cacao in Nicaragua, participate in the bean-to-bar process, and create your own delicious chocolate treats to take home. This activity is perfect for families and foodies alike.", + "locationName": "Various locations", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "nicaragua", + "ref": "take-a-chocolate-making-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_take-a-chocolate-making-class.jpg" + }, + { + "name": "Go Stargazing in the Dark Sky Reserves", + "description": "Escape the city lights and experience the magic of stargazing in one of Nicaragua's dark sky reserves. With minimal light pollution, these reserves offer breathtaking views of the Milky Way and constellations. Join a guided tour or venture out on your own for a truly awe-inspiring experience.", + "locationName": "Isla de Ometepe or other dark sky reserves", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "nicaragua", + "ref": "go-stargazing-in-the-dark-sky-reserves", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_go-stargazing-in-the-dark-sky-reserves.jpg" + }, + { + "name": "Visit the Somoto Canyon National Monument", + "description": "Explore the hidden gem of Somoto Canyon National Monument, a stunning natural wonder with towering cliffs, crystal-clear waters, and diverse wildlife. Hike along the canyon rim, take a refreshing dip in the river, or go rock climbing for an adrenaline rush. This off-the-beaten-path destination offers a unique and unforgettable experience.", + "locationName": "Somoto Canyon National Monument", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "nicaragua", + "ref": "visit-the-somoto-canyon-national-monument", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/nicaragua_visit-the-somoto-canyon-national-monument.jpg" + }, + { + "name": "Yellow Water Cruise", + "description": "Embark on a serene sunrise or sunset cruise across the Yellow Water billabong, a haven for diverse wildlife. Witness saltwater crocodiles basking in the sun, colorful birds soaring overhead, and vibrant lotus flowers adorning the water's surface. Knowledgeable guides share insights into the ecosystem and Aboriginal culture, making it a captivating experience for all ages.", + "locationName": "Yellow Water", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "northern-territory", + "ref": "yellow-water-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_yellow-water-cruise.jpg" + }, + { + "name": "Nourlangie Rock Art Walk", + "description": "Step back in time and explore the ancient Aboriginal rock art galleries of Nourlangie Rock. Marvel at the intricate paintings that depict creation stories, animals, and traditional ways of life. Learn about the significance of these sites to the Aboriginal people and gain a deeper understanding of their connection to the land.", + "locationName": "Nourlangie Rock", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "northern-territory", + "ref": "nourlangie-rock-art-walk", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_nourlangie-rock-art-walk.jpg" + }, + { + "name": "Jim Jim Falls Hike and Swim", + "description": "Embark on a moderately challenging hike through monsoon forests to reach the magnificent Jim Jim Falls. Be rewarded with breathtaking views of the cascading waterfall and a refreshing dip in the plunge pool below. This adventure is perfect for those seeking an active experience amidst stunning natural beauty.", + "locationName": "Jim Jim Falls", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "northern-territory", + "ref": "jim-jim-falls-hike-and-swim", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_jim-jim-falls-hike-and-swim.jpg" + }, + { + "name": "Gunlom Plunge Pool Experience", + "description": "Take a scenic drive and short hike to discover the Gunlom Plunge Pool, a natural infinity pool with panoramic views of the surrounding landscape. Relax in the crystal-clear waters, soak up the sun, and enjoy a picnic lunch amidst the tranquil ambiance. The perfect escape for a relaxing afternoon.", + "locationName": "Gunlom Falls", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "northern-territory", + "ref": "gunlom-plunge-pool-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_gunlom-plunge-pool-experience.jpg" + }, + { + "name": "Warradjan Cultural Centre", + "description": "Immerse yourself in Aboriginal culture at the Warradjan Cultural Centre. Explore exhibits showcasing traditional art, artifacts, and stories of the Bininj/Mungguy people. Learn about their customs, beliefs, and connection to the land. The center also offers workshops and demonstrations, providing a deeper understanding of Aboriginal heritage.", + "locationName": "Bowali Visitor Centre", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "northern-territory", + "ref": "warradjan-cultural-centre", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_warradjan-cultural-centre.jpg" + }, + { + "name": "Maguk Gorge Hike and Swim", + "description": "Embark on a scenic hike through monsoon rainforest to reach the secluded Maguk Gorge. Cool off with a refreshing dip in the crystal-clear plunge pool beneath the cascading waterfall. The trail offers stunning views of the surrounding escarpment and the opportunity to spot unique wildlife.", + "locationName": "Maguk", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "northern-territory", + "ref": "maguk-gorge-hike-and-swim", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_maguk-gorge-hike-and-swim.jpg" + }, + { + "name": "Cahill's Crossing Lookout", + "description": "Witness the thrilling spectacle of saltwater crocodiles at Cahill's Crossing. From the safety of the viewing platform, observe these powerful creatures as they gather to hunt for fish during the changing tides. This is a prime location for wildlife photography and an unforgettable experience.", + "locationName": "Cahill's Crossing", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "northern-territory", + "ref": "cahill-s-crossing-lookout", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_cahill-s-crossing-lookout.jpg" + }, + { + "name": "Ubirr Rock Art and Sunset Viewing", + "description": "Discover the ancient Aboriginal rock art galleries at Ubirr, showcasing thousands of years of cultural heritage. Ascend the rocky outcrop for panoramic views of the Nadab floodplain and witness a breathtaking sunset over the vast landscape. This combination of cultural immersion and natural beauty is truly unforgettable.", + "locationName": "Ubirr", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "northern-territory", + "ref": "ubirr-rock-art-and-sunset-viewing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_ubirr-rock-art-and-sunset-viewing.jpg" + }, + { + "name": "Mamukala Wetlands Birdwatching", + "description": "Explore the Mamukala Wetlands, a haven for birdwatchers. Home to a diverse range of waterbirds, including magpie geese, jacanas, and comb-crested jacanas, this is a paradise for nature enthusiasts. Enjoy the serenity of the wetlands while observing these feathered creatures in their natural habitat.", + "locationName": "Mamukala Wetlands", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "northern-territory", + "ref": "mamukala-wetlands-birdwatching", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_mamukala-wetlands-birdwatching.jpg" + }, + { + "name": "Nighttime Wildlife Spotting Tour", + "description": "Embark on a guided nocturnal adventure to discover the fascinating creatures that come alive after dark. Spot nocturnal wildlife like owls, possums, and bandicoots with the help of experienced guides. This unique tour offers a glimpse into the hidden world of Kakadu's nighttime ecosystem.", + "locationName": "Various locations", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "northern-territory", + "ref": "nighttime-wildlife-spotting-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_nighttime-wildlife-spotting-tour.jpg" + }, + { + "name": "Barramundi Fishing Adventure", + "description": "Embark on an exhilarating fishing expedition in the heart of Kakadu. Join experienced local guides who will lead you to prime fishing spots, where you'll have the opportunity to cast your line for the iconic barramundi, a prized catch known for its fighting spirit. Whether you're a seasoned angler or a beginner, this adventure promises excitement and a chance to connect with the region's abundant aquatic life.", + "locationName": "Various waterways within Kakadu National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "northern-territory", + "ref": "barramundi-fishing-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_barramundi-fishing-adventure.jpg" + }, + { + "name": "4WD Off-Road Exploration", + "description": "Venture off the beaten path and discover the rugged beauty of Kakadu's outback on an exhilarating 4WD tour. Traverse through diverse landscapes, from floodplains and woodlands to rocky escarpments, as you encounter hidden waterfalls, ancient rock art sites, and breathtaking panoramic views. This adventure offers a unique perspective of the park's vastness and remoteness.", + "locationName": "Various off-road tracks within Kakadu National Park", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "northern-territory", + "ref": "4wd-off-road-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_4wd-off-road-exploration.jpg" + }, + { + "name": "Bush Tucker Walk and Aboriginal Culture", + "description": "Immerse yourself in the rich cultural heritage of Kakadu's Aboriginal people with a guided bush tucker walk. Learn about traditional uses of native plants for food, medicine, and tools, and gain insights into the deep connection between the land and its people. This experience provides a unique opportunity to appreciate the cultural significance of Kakadu and its ancient traditions.", + "locationName": "Various locations within Kakadu National Park", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "northern-territory", + "ref": "bush-tucker-walk-and-aboriginal-culture", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_bush-tucker-walk-and-aboriginal-culture.jpg" + }, + { + "name": "Scenic Helicopter Flight", + "description": "Soar above the breathtaking landscapes of Kakadu on a scenic helicopter flight. Witness the grandeur of cascading waterfalls, sandstone escarpments, and vast floodplains from a unique aerial perspective. Capture stunning panoramic views and create unforgettable memories as you explore the park's diverse ecosystems and iconic landmarks.", + "locationName": "Various locations within Kakadu National Park", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "northern-territory", + "ref": "scenic-helicopter-flight", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_scenic-helicopter-flight.jpg" + }, + { + "name": "Stargazing and Astronomy Tour", + "description": "Escape the city lights and embark on a magical stargazing adventure in the pristine night sky of Kakadu. Join an expert astronomer who will guide you through the constellations, planets, and celestial wonders visible in the Southern Hemisphere. Learn about Aboriginal astronomy and the significance of the stars in their culture, while marveling at the beauty of the cosmos.", + "locationName": "Various locations within Kakadu National Park", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "northern-territory", + "ref": "stargazing-and-astronomy-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_stargazing-and-astronomy-tour.jpg" + }, + { + "name": "Indigenous Art Workshops", + "description": "Immerse yourself in the rich artistic traditions of Kakadu's Aboriginal people by participating in an Indigenous art workshop. Learn about the symbolism behind traditional dot paintings and rock art, and create your own masterpiece using natural pigments and techniques passed down through generations.", + "locationName": "Various art centres within the park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "northern-territory", + "ref": "indigenous-art-workshops", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_indigenous-art-workshops.jpg" + }, + { + "name": "Bush Tucker Foraging and Cooking Experience", + "description": "Embark on a guided journey through the bush to discover the edible plants and fruits that have sustained Aboriginal people for millennia. Learn about traditional foraging methods and the medicinal properties of native flora, and then participate in a cooking demonstration to savor the unique flavors of bush tucker.", + "locationName": "Various locations within the park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "northern-territory", + "ref": "bush-tucker-foraging-and-cooking-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_bush-tucker-foraging-and-cooking-experience.jpg" + }, + { + "name": "Kakadu Photography Tour", + "description": "Capture the stunning landscapes and unique wildlife of Kakadu on a photography tour led by a professional photographer. Learn about composition, lighting, and wildlife photography techniques, and receive expert guidance on capturing the essence of this remarkable national park.", + "locationName": "Various locations within the park", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "northern-territory", + "ref": "kakadu-photography-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_kakadu-photography-tour.jpg" + }, + { + "name": "Yellow Water Billabong Sunset Cruise", + "description": "Experience the magic of a Kakadu sunset on a tranquil cruise through the Yellow Water Billabong. As the sun dips below the horizon, witness the abundant wildlife come alive, including crocodiles, birds, and wallabies. Enjoy the serenity of the wetlands and the vibrant colors of the evening sky.", + "locationName": "Yellow Water Billabong", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "northern-territory", + "ref": "yellow-water-billabong-sunset-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_yellow-water-billabong-sunset-cruise.jpg" + }, + { + "name": "Arnhem Land Day Trip", + "description": "Venture beyond Kakadu National Park on a day trip to Arnhem Land, a vast Aboriginal reserve with restricted access. Immerse yourself in the rich culture and traditions of the Yolngu people, learn about their ancient rock art, and witness traditional ceremonies and dances.", + "locationName": "Arnhem Land", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "northern-territory", + "ref": "arnhem-land-day-trip", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/northern-territory_arnhem-land-day-trip.jpg" + }, + { + "name": "Explore Monte Albán", + "description": "Step back in time at Monte Albán, a UNESCO World Heritage Site and ancient Zapotec capital. Marvel at the impressive pyramids, temples, and plazas that offer panoramic views of the Oaxaca Valley. Learn about the fascinating history and culture of this pre-Columbian civilization.", + "locationName": "Monte Albán Archaeological Site", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "oaxaca", + "ref": "explore-monte-alb-n", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_explore-monte-alb-n.jpg" + }, + { + "name": "Wander Through the Mercado 20 de Noviembre and Benito Juárez Markets", + "description": "Immerse yourself in the vibrant atmosphere of Oaxaca's bustling markets. Browse through a colorful array of handicrafts, textiles, ceramics, and local produce. Savor the aromas of Oaxacan cuisine and sample traditional delicacies like chapulines (grasshoppers) and tejate (a pre-Hispanic drink).", + "locationName": "Mercado 20 de Noviembre and Benito Juárez Markets", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "oaxaca", + "ref": "wander-through-the-mercado-20-de-noviembre-and-benito-ju-rez-markets", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_wander-through-the-mercado-20-de-noviembre-and-benito-ju-rez-markets.jpg" + }, + { + "name": "Discover the Tule Tree", + "description": "Visit the Árbol del Tule, a majestic cypress tree with one of the stoutest trunks in the world. Admire its immense size and unique shape, and learn about its cultural significance to the local community.", + "locationName": "Santa María del Tule", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "oaxaca", + "ref": "discover-the-tule-tree", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_discover-the-tule-tree.jpg" + }, + { + "name": "Delve into Oaxacan Cuisine", + "description": "Embark on a culinary journey and discover the rich flavors of Oaxacan cuisine. Take a cooking class to learn the secrets of mole negro, tlayudas, and other regional specialties. Visit traditional restaurants and mezcalerias to savor authentic dishes and sample the smoky notes of mezcal.", + "locationName": "Various locations throughout Oaxaca", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "oaxaca", + "ref": "delve-into-oaxacan-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_delve-into-oaxacan-cuisine.jpg" + }, + { + "name": "Experience the Guelaguetza Festival", + "description": "If you're visiting Oaxaca in July, don't miss the Guelaguetza festival, a vibrant celebration of indigenous culture. Witness traditional dances, music, and costumes from different regions of Oaxaca. Immerse yourself in the festive atmosphere and learn about the state's diverse heritage.", + "locationName": "Auditorio Guelaguetza", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "oaxaca", + "ref": "experience-the-guelaguetza-festival", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_experience-the-guelaguetza-festival.jpg" + }, + { + "name": "Hike Hierve el Agua", + "description": "Embark on a scenic hike to Hierve el Agua, a mesmerizing natural wonder with petrified waterfalls and mineral-rich pools. Enjoy breathtaking views of the surrounding valleys and take a refreshing dip in the pools known for their therapeutic properties.", + "locationName": "Hierve el Agua", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "oaxaca", + "ref": "hike-hierve-el-agua", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_hike-hierve-el-agua.jpg" + }, + { + "name": "Visit Teotitlán del Valle", + "description": "Immerse yourself in the rich textile traditions of Oaxaca with a visit to Teotitlán del Valle, a village renowned for its hand-woven rugs and tapestries. Witness skilled artisans using natural dyes and traditional techniques to create intricate designs, and perhaps even purchase a unique piece to take home.", + "locationName": "Teotitlán del Valle", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "oaxaca", + "ref": "visit-teotitl-n-del-valle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_visit-teotitl-n-del-valle.jpg" + }, + { + "name": "Explore Mitla Archaeological Site", + "description": "Step back in time at the Mitla archaeological site, known for its intricate mosaics and geometric designs. Explore the ancient Zapotec city, admire the impressive architecture, and learn about the fascinating history and culture of the region.", + "locationName": "Mitla", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "oaxaca", + "ref": "explore-mitla-archaeological-site", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_explore-mitla-archaeological-site.jpg" + }, + { + "name": "Go Mezcal Tasting", + "description": "Indulge in the smoky flavors of mezcal, a traditional Oaxacan spirit made from agave. Visit a local palenque (distillery) to learn about the production process, from harvesting the agave to the distillation methods, and enjoy a guided tasting of different mezcal varieties.", + "locationName": "Various Palenques", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "oaxaca", + "ref": "go-mezcal-tasting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_go-mezcal-tasting.jpg" + }, + { + "name": "Catch a Performance at Teatro Macedonio Alcalá", + "description": "Experience the cultural vibrancy of Oaxaca with a performance at the Teatro Macedonio Alcalá, a stunning neoclassical theater. Enjoy a variety of shows, including traditional dance, music concerts, and theatrical productions, showcasing the artistic talents of the region.", + "locationName": "Teatro Macedonio Alcalá", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "oaxaca", + "ref": "catch-a-performance-at-teatro-macedonio-alcal-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_catch-a-performance-at-teatro-macedonio-alcal-.jpg" + }, + { + "name": "Mountain Biking in the Sierra Norte", + "description": "Embark on an exhilarating mountain biking adventure through the stunning landscapes of the Sierra Norte mountains. Explore rugged trails, dense forests, and charming villages while enjoying breathtaking views. This activity is perfect for thrill-seekers and nature enthusiasts looking for an active and immersive experience.", + "locationName": "Sierra Norte Mountains", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "oaxaca", + "ref": "mountain-biking-in-the-sierra-norte", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_mountain-biking-in-the-sierra-norte.jpg" + }, + { + "name": "Relax at Hierve el Agua", + "description": "Unwind and rejuvenate at Hierve el Agua, a natural wonder with petrified waterfalls and mineral-rich pools. Take a dip in the warm waters, enjoy the panoramic views, and experience the unique geological formations. This is a perfect spot to relax, soak up the sun, and connect with nature.", + "locationName": "Hierve el Agua", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "oaxaca", + "ref": "relax-at-hierve-el-agua", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_relax-at-hierve-el-agua.jpg" + }, + { + "name": "Visit the Santo Domingo Cultural Center", + "description": "Immerse yourself in Oaxacan art and history at the Santo Domingo Cultural Center. Explore the stunning 16th-century Santo Domingo de Guzmán church, admire the intricate Baroque architecture, and visit the Oaxaca Cultures Museum to discover the region's rich cultural heritage.", + "locationName": "Santo Domingo Cultural Center", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "oaxaca", + "ref": "visit-the-santo-domingo-cultural-center", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_visit-the-santo-domingo-cultural-center.jpg" + }, + { + "name": "Take a Cooking Class", + "description": "Learn the secrets of Oaxacan cuisine by taking a cooking class. Discover the traditional ingredients and techniques used to prepare iconic dishes like mole, tlayudas, and tamales. This hands-on experience is perfect for food enthusiasts who want to delve deeper into the culinary traditions of Oaxaca.", + "locationName": "Various locations in Oaxaca City", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "oaxaca", + "ref": "take-a-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_take-a-cooking-class.jpg" + }, + { + "name": "Explore the Ruins of Yagul", + "description": "Step back in time at the archaeological site of Yagul, a UNESCO World Heritage Site. Explore the ancient Zapotec city, including palaces, temples, and ball courts. Discover the fascinating history and culture of this pre-Columbian civilization while enjoying panoramic views of the surrounding valley.", + "locationName": "Yagul Archaeological Site", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "oaxaca", + "ref": "explore-the-ruins-of-yagul", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_explore-the-ruins-of-yagul.jpg" + }, + { + "name": "Horseback Riding in the Countryside", + "description": "Embark on a scenic horseback riding adventure through the picturesque Oaxacan countryside. Traverse rolling hills, agave fields, and charming villages, immersing yourself in the natural beauty and rural life of the region. This activity is suitable for all skill levels, offering a unique perspective on the landscape and a chance to connect with nature.", + "locationName": "Oaxacan Countryside", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "oaxaca", + "ref": "horseback-riding-in-the-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_horseback-riding-in-the-countryside.jpg" + }, + { + "name": "Birdwatching in the Sierra Norte", + "description": "Discover the rich avian diversity of the Sierra Norte mountains on a guided birdwatching tour. Explore cloud forests and diverse ecosystems, spotting endemic species and migratory birds. Learn about the region's conservation efforts and the importance of preserving these natural habitats. This activity is perfect for nature enthusiasts and photographers seeking to capture the beauty of Oaxaca's feathered residents.", + "locationName": "Sierra Norte Mountains", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "oaxaca", + "ref": "birdwatching-in-the-sierra-norte", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_birdwatching-in-the-sierra-norte.jpg" + }, + { + "name": "Sunset at the Cerro del Fortín", + "description": "Ascend the Cerro del Fortín, a hilltop overlooking the city of Oaxaca, and witness a breathtaking sunset. Enjoy panoramic views of the city, surrounding valleys, and distant mountains as the sky transforms with vibrant colors. This romantic and picturesque spot is ideal for capturing memorable photos and enjoying a peaceful moment.", + "locationName": "Cerro del Fortín", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "oaxaca", + "ref": "sunset-at-the-cerro-del-fort-n", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_sunset-at-the-cerro-del-fort-n.jpg" + }, + { + "name": "Stargazing in the Desert", + "description": "Escape the city lights and embark on a stargazing adventure in the Oaxacan desert. With minimal light pollution, the night sky comes alive with countless stars, constellations, and celestial wonders. Join a guided tour or find a secluded spot to marvel at the vastness of the universe and learn about the constellations visible from this region.", + "locationName": "Oaxacan Desert", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "oaxaca", + "ref": "stargazing-in-the-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_stargazing-in-the-desert.jpg" + }, + { + "name": "Temazcal Ceremony", + "description": "Participate in a traditional Temazcal ceremony, a pre-Hispanic steam bath ritual used for physical and spiritual purification. Enter a dome-shaped structure and experience the healing properties of herbs and steam. This ancient practice is led by a shaman and offers a unique opportunity to connect with indigenous traditions and promote well-being.", + "locationName": "Various Locations", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "oaxaca", + "ref": "temazcal-ceremony", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oaxaca_temazcal-ceremony.jpg" + }, + { + "name": "Mokoro Safari", + "description": "Embark on a serene mokoro excursion through the tranquil waterways of the Okavango Delta. Glide past papyrus reeds and water lilies as you observe elephants bathing, hippos wallowing, and crocodiles basking in the sun. Your experienced poler will navigate the channels, sharing their knowledge of the delta's ecosystem and its inhabitants.", + "locationName": "Okavango Delta", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "okavango-delta", + "ref": "mokoro-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_mokoro-safari.jpg" + }, + { + "name": "Bush Walks and Wildlife Tracking", + "description": "Venture into the heart of the delta on a guided bush walk, accompanied by skilled trackers. Learn to identify animal tracks, interpret their behavior, and discover the intricate relationships within the ecosystem. Spot giraffes gracefully browsing on acacia leaves, zebras grazing in the open plains, and perhaps even lions resting in the shade.", + "locationName": "Moremi Game Reserve", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "okavango-delta", + "ref": "bush-walks-and-wildlife-tracking", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_bush-walks-and-wildlife-tracking.jpg" + }, + { + "name": "Scenic Helicopter Flight", + "description": "Soar above the sprawling Okavango Delta in a helicopter, gaining a breathtaking aerial perspective of its vastness and intricate network of waterways. Witness the mosaic of islands, floodplains, and forests, and marvel at the herds of elephants, buffalo, and antelope roaming freely below.", + "locationName": "Various locations", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "okavango-delta", + "ref": "scenic-helicopter-flight", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_scenic-helicopter-flight.jpg" + }, + { + "name": "Birdwatching Expedition", + "description": "Join a dedicated birdwatching tour to discover the Okavango Delta's incredible avian diversity. With over 400 species recorded, you'll encounter a kaleidoscope of colors and calls. Spot fish eagles soaring overhead, malachite kingfishers perched on reeds, and African jacanas delicately walking on lily pads.", + "locationName": "Various locations", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "okavango-delta", + "ref": "birdwatching-expedition", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_birdwatching-expedition.jpg" + }, + { + "name": "Fishing in the Delta", + "description": "Cast your line into the pristine waters of the Okavango Delta and try your hand at catching tigerfish, bream, and catfish. Whether you're an experienced angler or a novice, fishing in this unique environment is an unforgettable experience.", + "locationName": "Various locations", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "okavango-delta", + "ref": "fishing-in-the-delta", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_fishing-in-the-delta.jpg" + }, + { + "name": "Horseback Safari", + "description": "Embark on a unique safari experience on horseback, allowing you to get closer to nature and observe wildlife from a different perspective. Traverse the diverse landscapes of the delta, from floodplains to islands, and encounter animals like zebras, giraffes, and antelopes in their natural habitat. Experienced guides will ensure your safety and provide insights into the ecosystem.", + "locationName": "Okavango Delta", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "okavango-delta", + "ref": "horseback-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_horseback-safari.jpg" + }, + { + "name": "Stargazing Cruise", + "description": "Escape the city lights and embark on a magical stargazing cruise along the tranquil waterways of the delta. With minimal light pollution, the night sky comes alive with a breathtaking display of stars and constellations. Expert guides will share their knowledge of astronomy, while you enjoy the serenity of the surroundings.", + "locationName": "Okavango Delta", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "okavango-delta", + "ref": "stargazing-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_stargazing-cruise.jpg" + }, + { + "name": "Cultural Village Visit", + "description": "Immerse yourself in the rich cultural heritage of the local communities by visiting a traditional village. Interact with villagers, learn about their customs and way of life, and witness demonstrations of traditional crafts, music, and dance. This experience offers a unique opportunity to gain a deeper understanding of the delta's cultural significance.", + "locationName": "Local village", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "okavango-delta", + "ref": "cultural-village-visit", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_cultural-village-visit.jpg" + }, + { + "name": "Hot Air Balloon Ride", + "description": "Soar above the breathtaking landscapes of the Okavango Delta in a hot air balloon. Witness the vastness of the delta from a unique aerial perspective, as you drift over floodplains, islands, and channels teeming with wildlife. Enjoy the tranquility of the early morning or the golden hues of sunset, creating unforgettable memories.", + "locationName": "Okavango Delta", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "okavango-delta", + "ref": "hot-air-balloon-ride", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_hot-air-balloon-ride.jpg" + }, + { + "name": "Photography Safari", + "description": "Capture the beauty of the Okavango Delta through the lens of your camera on a dedicated photography safari. Accompanied by experienced guides and professional photographers, you'll have the opportunity to learn advanced photography techniques and capture stunning images of wildlife, landscapes, and local cultures.", + "locationName": "Okavango Delta", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "okavango-delta", + "ref": "photography-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_photography-safari.jpg" + }, + { + "name": "Quad Biking Adventure", + "description": "Embark on an exhilarating quad biking adventure through the diverse terrain of the Okavango Delta. Traverse sandy tracks, splash through shallow waters, and navigate lush vegetation as you explore the wilderness on four wheels. This thrilling experience offers a unique perspective of the delta's landscapes and the chance to encounter wildlife in their natural habitat.", + "locationName": "Various locations within the delta", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "okavango-delta", + "ref": "quad-biking-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_quad-biking-adventure.jpg" + }, + { + "name": "Traditional Village Immersion", + "description": "Immerse yourself in the rich culture of the Okavango Delta by visiting a local village. Interact with the friendly residents, learn about their customs and traditions, and gain insights into their daily lives. Participate in activities such as basket weaving, traditional dancing, or storytelling, and discover the authentic essence of the delta's communities.", + "locationName": "Local villages within or near the delta", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "okavango-delta", + "ref": "traditional-village-immersion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_traditional-village-immersion.jpg" + }, + { + "name": "Scenic Boat Cruise", + "description": "Embark on a serene boat cruise along the tranquil waterways of the Okavango Delta. Relax and soak in the breathtaking scenery as you glide past lush vegetation, papyrus-lined channels, and islands teeming with wildlife. Keep an eye out for elephants, hippos, crocodiles, and a variety of bird species, all while enjoying the peaceful ambiance of the delta.", + "locationName": "Various locations within the delta", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "okavango-delta", + "ref": "scenic-boat-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_scenic-boat-cruise.jpg" + }, + { + "name": "Bush Camping Experience", + "description": "Spend a night under the stars with a thrilling bush camping experience in the heart of the Okavango Delta. Set up camp in a secluded location, surrounded by the sights and sounds of the African wilderness. Enjoy a campfire dinner, listen to the nocturnal sounds of the bush, and wake up to the stunning sunrise over the delta.", + "locationName": "Designated campsites within the delta", + "duration": 24, + "timeOfDay": "night", + "familyFriendly": true, + "price": 4, + "destinationRef": "okavango-delta", + "ref": "bush-camping-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_bush-camping-experience.jpg" + }, + { + "name": "Wildlife Photography Workshop", + "description": "Join a wildlife photography workshop led by experienced professionals and capture stunning images of the Okavango Delta's diverse fauna. Learn valuable techniques for photographing animals in their natural habitat, including composition, lighting, and patience. This workshop is perfect for photography enthusiasts of all levels who want to improve their skills and create lasting memories of their safari adventure.", + "locationName": "Various locations within the delta", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "okavango-delta", + "ref": "wildlife-photography-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_wildlife-photography-workshop.jpg" + }, + { + "name": "Sleep-Out Under the Stars", + "description": "Embark on an unforgettable overnight adventure sleeping under the vast African sky. Enjoy a delicious bush dinner prepared over an open fire, share stories with your guide, and fall asleep to the symphony of nocturnal wildlife. Wake up to a breathtaking sunrise and the sounds of the delta coming to life.", + "locationName": "Remote island in the delta", + "duration": 24, + "timeOfDay": "night", + "familyFriendly": true, + "price": 4, + "destinationRef": "okavango-delta", + "ref": "sleep-out-under-the-stars", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_sleep-out-under-the-stars.jpg" + }, + { + "name": "Community-Based Tourism Experience", + "description": "Immerse yourself in the local culture and traditions by visiting a nearby village. Interact with community members, learn about their way of life, participate in traditional crafts or activities, and support sustainable tourism initiatives.", + "locationName": "Local village near the delta", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "okavango-delta", + "ref": "community-based-tourism-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_community-based-tourism-experience.jpg" + }, + { + "name": "Scenic Helicopter Flight over the Delta", + "description": "Get a bird's-eye view of the Okavango Delta's intricate waterways, lush islands, and abundant wildlife. Soar above the landscape in a helicopter, capturing stunning aerial photographs and gaining a unique perspective of this natural wonder.", + "locationName": "Various locations in the delta", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "okavango-delta", + "ref": "scenic-helicopter-flight-over-the-delta", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_scenic-helicopter-flight-over-the-delta.jpg" + }, + { + "name": "Learn Traditional Fishing Techniques", + "description": "Join local fishermen and learn the art of traditional fishing methods used in the Okavango Delta. Discover the secrets of sustainable fishing practices, try your hand at catching local fish species, and gain insights into the importance of the delta's ecosystem.", + "locationName": "Fishing villages or camps along the delta", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "okavango-delta", + "ref": "learn-traditional-fishing-techniques", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_learn-traditional-fishing-techniques.jpg" + }, + { + "name": "Wildlife Photography Workshop", + "description": "Enhance your wildlife photography skills with a dedicated workshop led by experienced photographers. Learn about camera settings, composition techniques, and animal behavior to capture stunning images of the delta's diverse wildlife.", + "locationName": "Various lodges or camps in the delta", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "okavango-delta", + "ref": "wildlife-photography-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/okavango-delta_wildlife-photography-workshop.jpg" + }, + { + "name": "Wahiba Sands Adventure", + "description": "Embark on a thrilling 4x4 journey into the vast Wahiba Sands desert, where towering dunes shift with the desert winds. Experience the thrill of dune bashing, sandboarding down steep slopes, and witness the breathtaking sunset over the endless sandscape. Spend a night under the starlit sky in a traditional Bedouin camp, enjoying authentic Omani hospitality, music, and dance.", + "locationName": "Wahiba Sands", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "oman", + "ref": "wahiba-sands-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_wahiba-sands-adventure.jpg" + }, + { + "name": "Explore the Historic Forts of Nizwa and Bahla", + "description": "Step back in time and delve into Oman's rich history by visiting the impressive forts of Nizwa and Bahla. Explore the ancient architecture, intricate carvings, and hidden passages of these UNESCO World Heritage sites. Learn about the role these forts played in defending the region and gain insights into Omani culture and heritage.", + "locationName": "Nizwa and Bahla", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "oman", + "ref": "explore-the-historic-forts-of-nizwa-and-bahla", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_explore-the-historic-forts-of-nizwa-and-bahla.jpg" + }, + { + "name": "Dive into the Turquoise Waters of Wadi Shab", + "description": "Escape the desert heat and embark on a refreshing adventure to Wadi Shab, a stunning gorge with emerald-green pools and cascading waterfalls. Hike through the wadi, swim in the crystal-clear waters, and discover hidden caves. For the adventurous, climb up to the secret waterfall and take a plunge into the refreshing pool below.", + "locationName": "Wadi Shab", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "oman", + "ref": "dive-into-the-turquoise-waters-of-wadi-shab", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_dive-into-the-turquoise-waters-of-wadi-shab.jpg" + }, + { + "name": "Immerse Yourself in the Bustling Muttrah Souq", + "description": "Wander through the labyrinthine alleys of the Muttrah Souq, a traditional Omani market overflowing with vibrant sights, sounds, and aromas. Discover a treasure trove of handcrafted souvenirs, aromatic spices, and exquisite silver jewelry. Bargaining is expected, so hone your negotiation skills and find unique keepsakes to remember your Omani adventure.", + "locationName": "Muttrah Souq", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "oman", + "ref": "immerse-yourself-in-the-bustling-muttrah-souq", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_immerse-yourself-in-the-bustling-muttrah-souq.jpg" + }, + { + "name": "Stargazing in the Desert", + "description": "Escape the city lights and experience the magic of the desert night sky. Join a stargazing tour and marvel at the Milky Way stretching across the darkness. Learn about constellations, planets, and the wonders of the universe from knowledgeable guides. This unforgettable experience will leave you with a sense of awe and wonder.", + "locationName": "Wahiba Sands or other desert locations", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "oman", + "ref": "stargazing-in-the-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_stargazing-in-the-desert.jpg" + }, + { + "name": "Dolphin Watching in Musandam", + "description": "Embark on a thrilling boat trip through the fjords of Musandam, often called the 'Norway of Arabia'. Witness playful dolphins leaping alongside your vessel, surrounded by stunning landscapes of towering cliffs and crystal-clear waters. This unforgettable experience offers a unique perspective of Oman's diverse marine life and breathtaking natural beauty.", + "locationName": "Musandam Fjords", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "oman", + "ref": "dolphin-watching-in-musandam", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_dolphin-watching-in-musandam.jpg" + }, + { + "name": "Trekking in the Hajar Mountains", + "description": "Lace up your hiking boots and embark on an adventurous trek through the rugged Hajar Mountains. Discover hidden wadis, ancient villages, and breathtaking panoramic views. Challenge yourself with a climb to the summit of Jebel Shams, the highest peak in Oman, or opt for a gentler trail through scenic valleys. This experience is perfect for nature enthusiasts and adventure seekers.", + "locationName": "Hajar Mountains", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "oman", + "ref": "trekking-in-the-hajar-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_trekking-in-the-hajar-mountains.jpg" + }, + { + "name": "Explore the Frankincense Trail", + "description": "Journey through the ancient Frankincense Trail, a UNESCO World Heritage Site, and delve into Oman's rich history and cultural heritage. Visit the archaeological sites of Al Baleed and Sumhuram, wander through the Frankincense Land Museum, and explore the lush Wadi Dawkah, where frankincense trees still thrive. This experience offers a fascinating glimpse into Oman's legendary past and its connection to the ancient trade routes.", + "locationName": "Dhofar Region", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "oman", + "ref": "explore-the-frankincense-trail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_explore-the-frankincense-trail.jpg" + }, + { + "name": "Sunset Cruise in a Traditional Dhow", + "description": "Sail along the Omani coastline aboard a traditional dhow, a wooden sailing vessel, and witness a magical sunset over the Arabian Sea. Enjoy the gentle breeze, admire the picturesque scenery, and savor a delicious Omani dinner on board. This romantic and relaxing experience is perfect for couples or those seeking a tranquil escape.", + "locationName": "Muscat or Salalah", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "oman", + "ref": "sunset-cruise-in-a-traditional-dhow", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_sunset-cruise-in-a-traditional-dhow.jpg" + }, + { + "name": "Experience Omani Hospitality at a Local Farm", + "description": "Immerse yourself in Omani culture with a visit to a local farm. Learn about traditional farming practices, sample fresh produce, and enjoy a home-cooked meal with a local family. This authentic and heartwarming experience offers a glimpse into the daily lives of Omani people and their warm hospitality.", + "locationName": "Various locations", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "oman", + "ref": "experience-omani-hospitality-at-a-local-farm", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_experience-omani-hospitality-at-a-local-farm.jpg" + }, + { + "name": "Discover the Underwater World of the Daymaniyat Islands", + "description": "Embark on a snorkeling or diving adventure to the Daymaniyat Islands, a protected nature reserve known for its pristine coral reefs and diverse marine life. Swim alongside colorful fish, encounter graceful sea turtles, and marvel at the vibrant underwater ecosystem.", + "locationName": "Daymaniyat Islands", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "oman", + "ref": "discover-the-underwater-world-of-the-daymaniyat-islands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_discover-the-underwater-world-of-the-daymaniyat-islands.jpg" + }, + { + "name": "Unwind at a Luxurious Spa Retreat", + "description": "Indulge in a rejuvenating spa experience at one of Oman's many luxurious resorts. Choose from a variety of treatments, including traditional hammam rituals, aromatherapy massages, and revitalizing facials. Let the expert therapists melt away your stress and leave you feeling refreshed and renewed.", + "locationName": "Various spa resorts", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "oman", + "ref": "unwind-at-a-luxurious-spa-retreat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_unwind-at-a-luxurious-spa-retreat.jpg" + }, + { + "name": "Visit the Sultan Qaboos Grand Mosque", + "description": "Witness the architectural grandeur of the Sultan Qaboos Grand Mosque, a masterpiece of modern Islamic design. Admire the intricate details, including the hand-woven prayer carpet and the stunning Swarovski crystal chandelier. Explore the peaceful courtyards and learn about Islamic culture and heritage.", + "locationName": "Muscat", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "oman", + "ref": "visit-the-sultan-qaboos-grand-mosque", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_visit-the-sultan-qaboos-grand-mosque.jpg" + }, + { + "name": "Go Sandboarding in the Sharqiya Sands", + "description": "Experience the thrill of sandboarding down the towering dunes of the Sharqiya Sands. Rent a board and try your hand at this exhilarating activity. Whether you're a beginner or an experienced boarder, the endless expanse of sand provides an unforgettable adventure.", + "locationName": "Sharqiya Sands", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "oman", + "ref": "go-sandboarding-in-the-sharqiya-sands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_go-sandboarding-in-the-sharqiya-sands.jpg" + }, + { + "name": "Explore the Jabal Akhdar Mountains", + "description": "Embark on a scenic drive or hike through the Jabal Akhdar Mountains, known as the \"Green Mountain\" for its terraced orchards and rose plantations. Visit traditional villages, enjoy breathtaking views, and discover the unique culture of the mountain communities.", + "locationName": "Jabal Akhdar Mountains", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "oman", + "ref": "explore-the-jabal-akhdar-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_explore-the-jabal-akhdar-mountains.jpg" + }, + { + "name": "Kayaking in the Fjords of Musandam", + "description": "Embark on a kayaking adventure through the stunning fjords of Musandam, often referred to as the 'Norway of Arabia'. Paddle through crystal-clear waters, surrounded by towering limestone cliffs, secluded beaches, and hidden coves. Encounter playful dolphins, colorful fish, and diverse marine life as you explore this breathtaking natural wonder.", + "locationName": "Musandam Peninsula", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "oman", + "ref": "kayaking-in-the-fjords-of-musandam", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_kayaking-in-the-fjords-of-musandam.jpg" + }, + { + "name": "Camel Racing in the Desert", + "description": "Experience the thrill of camel racing, a traditional Omani sport. Witness the incredible speed and agility of these majestic animals as they compete across the desert sands. Immerse yourself in the vibrant atmosphere, with cheering crowds and local festivities. You can even try your hand at riding a camel and get a taste of Bedouin life.", + "locationName": "Sharqiya Sands or other desert locations", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "oman", + "ref": "camel-racing-in-the-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_camel-racing-in-the-desert.jpg" + }, + { + "name": "Sample Omani Cuisine at a Local Restaurant", + "description": "Embark on a culinary journey through Oman by indulging in the local cuisine. Visit a traditional restaurant and savor authentic dishes like Shuwa (slow-cooked lamb), Machboos (spiced rice with meat), and Omani Halwa (sweet gelatinous dessert). Experience the unique flavors and spices that make Omani food a delightful experience.", + "locationName": "Muscat or other cities and towns", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "oman", + "ref": "sample-omani-cuisine-at-a-local-restaurant", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_sample-omani-cuisine-at-a-local-restaurant.jpg" + }, + { + "name": "Visit the Royal Opera House Muscat", + "description": "Immerse yourself in the world of arts and culture at the Royal Opera House Muscat. Attend a captivating performance, ranging from operas and ballets to Arabic and international music concerts. Admire the architectural grandeur of this iconic landmark and enjoy a sophisticated evening out.", + "locationName": "Muscat", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 4, + "destinationRef": "oman", + "ref": "visit-the-royal-opera-house-muscat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_visit-the-royal-opera-house-muscat.jpg" + }, + { + "name": "Explore the Ancient City of Qalhat", + "description": "Step back in time as you explore the UNESCO World Heritage Site of Qalhat. Wander through the ruins of this once-thriving port city, including the Bibi Maryam Mausoleum and the remnants of mosques, houses, and markets. Discover the rich history and cultural significance of Qalhat, a testament to Oman's maritime past.", + "locationName": "Qalhat", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "oman", + "ref": "explore-the-ancient-city-of-qalhat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/oman_explore-the-ancient-city-of-qalhat.jpg" + }, + { + "name": "Snorkeling with Sea Lions at Isla Lobos", + "description": "Embark on a snorkeling adventure around Isla Lobos, known for its playful sea lion colony. Witness these graceful creatures underwater as they twirl and glide around you, creating an unforgettable experience.", + "locationName": "Isla Lobos", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "pagos-islands", + "ref": "snorkeling-with-sea-lions-at-isla-lobos", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_snorkeling-with-sea-lions-at-isla-lobos.jpg" + }, + { + "name": "Giant Tortoise Encounter at El Chato Reserve", + "description": "Venture into the lush highlands of Santa Cruz Island to El Chato Reserve. Observe giant tortoises in their natural habitat, grazing on vegetation and lumbering across the volcanic landscape. Learn about their conservation efforts and unique life cycle.", + "locationName": "El Chato Reserve", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "pagos-islands", + "ref": "giant-tortoise-encounter-at-el-chato-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_giant-tortoise-encounter-at-el-chato-reserve.jpg" + }, + { + "name": "Hiking and Volcano Exploration on Bartolomé Island", + "description": "Embark on a scenic hike up the volcanic cone of Bartolomé Island. Be rewarded with breathtaking panoramic views of the surrounding islands and iconic Pinnacle Rock. Explore the volcanic formations and learn about the geological history of the Galápagos.", + "locationName": "Bartolomé Island", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "pagos-islands", + "ref": "hiking-and-volcano-exploration-on-bartolom-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_hiking-and-volcano-exploration-on-bartolom-island.jpg" + }, + { + "name": "Kayaking and Wildlife Spotting in Tortuga Bay", + "description": "Paddle through the calm turquoise waters of Tortuga Bay, a haven for marine life. Spot marine iguanas basking on the shores, sea turtles gliding through the water, and a variety of bird species soaring overhead.", + "locationName": "Tortuga Bay", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "pagos-islands", + "ref": "kayaking-and-wildlife-spotting-in-tortuga-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_kayaking-and-wildlife-spotting-in-tortuga-bay.jpg" + }, + { + "name": "Sunset Cruise and Stargazing", + "description": "Sail into the golden hour aboard a catamaran, enjoying stunning views of the archipelago as the sun dips below the horizon. As darkness falls, marvel at the brilliance of the unpolluted night sky, perfect for stargazing and spotting constellations.", + "locationName": "Various locations", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "pagos-islands", + "ref": "sunset-cruise-and-stargazing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_sunset-cruise-and-stargazing.jpg" + }, + { + "name": "Panga Ride and Birdwatching in the Wetlands", + "description": "Embark on a relaxing panga ride through the serene wetlands of Isabela or Santa Cruz Island. Observe the fascinating avian life of the Galápagos, including flamingos, herons, and the unique flightless cormorant. Knowledgeable guides will share insights into the ecosystem and behaviors of these remarkable birds.", + "locationName": "Isabela Island or Santa Cruz Island", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "pagos-islands", + "ref": "panga-ride-and-birdwatching-in-the-wetlands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_panga-ride-and-birdwatching-in-the-wetlands.jpg" + }, + { + "name": "Biking Adventure on Floreana Island", + "description": "Explore the captivating landscapes of Floreana Island on a guided bike tour. Pedal through volcanic craters, lush highlands, and along the scenic coastline, encountering unique flora and fauna along the way. Discover hidden beaches, historical sites, and breathtaking viewpoints, all while enjoying the fresh air and exercise.", + "locationName": "Floreana Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "pagos-islands", + "ref": "biking-adventure-on-floreana-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_biking-adventure-on-floreana-island.jpg" + }, + { + "name": "Visit the Charles Darwin Research Station", + "description": "Delve into the scientific legacy of the Galápagos Islands at the Charles Darwin Research Station on Santa Cruz Island. Learn about the ongoing conservation efforts, observe the famous giant tortoises in captivity, and gain a deeper understanding of the archipelago's unique biodiversity and its importance to evolutionary science.", + "locationName": "Santa Cruz Island", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "pagos-islands", + "ref": "visit-the-charles-darwin-research-station", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_visit-the-charles-darwin-research-station.jpg" + }, + { + "name": "Surf's Up at Punta Carola", + "description": "Catch some waves at Punta Carola on San Cristobal Island, a renowned surfing spot in the Galápagos. Whether you're a seasoned surfer or a beginner, enjoy the thrill of riding the Pacific Ocean swells amidst stunning volcanic scenery. Equipment rentals and lessons are available for all skill levels.", + "locationName": "San Cristobal Island", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "pagos-islands", + "ref": "surf-s-up-at-punta-carola", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_surf-s-up-at-punta-carola.jpg" + }, + { + "name": "Savor the Flavors of Ecuadorian Cuisine", + "description": "Embark on a culinary journey through the local flavors of the Galápagos Islands. Sample fresh seafood dishes, traditional Ecuadorian cuisine, and exotic tropical fruits. Enjoy a memorable dining experience at a charming restaurant with ocean views or join a cooking class to learn the secrets of Galápagos gastronomy.", + "locationName": "Various locations", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "pagos-islands", + "ref": "savor-the-flavors-of-ecuadorian-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_savor-the-flavors-of-ecuadorian-cuisine.jpg" + }, + { + "name": "Horseback Riding in the Highlands", + "description": "Embark on a scenic horseback riding adventure through the highlands of Santa Cruz Island. Explore lush landscapes, volcanic craters, and hidden trails while enjoying panoramic views of the surrounding islands. Connect with nature and experience the unique flora and fauna of the Galápagos in a tranquil and unforgettable way.", + "locationName": "Santa Cruz Island Highlands", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "pagos-islands", + "ref": "horseback-riding-in-the-highlands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_horseback-riding-in-the-highlands.jpg" + }, + { + "name": "Isabela Island Volcano Hike and Lava Tunnels", + "description": "Challenge yourself with an exhilarating hike up one of the five volcanoes on Isabela Island, the largest island in the archipelago. Witness stunning volcanic landscapes, lava fields, and unique geological formations. Descend into the mysterious lava tunnels and explore the hidden underworld of the Galápagos.", + "locationName": "Isabela Island", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "pagos-islands", + "ref": "isabela-island-volcano-hike-and-lava-tunnels", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_isabela-island-volcano-hike-and-lava-tunnels.jpg" + }, + { + "name": "Galápagos Photography Tour", + "description": "Join a specialized photography tour designed for capturing the breathtaking beauty of the Galápagos Islands. Accompanied by an expert guide and professional photographer, learn techniques for photographing unique wildlife, landscapes, and seascapes. Enhance your skills and create lasting memories through stunning photographs.", + "locationName": "Various Islands", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "pagos-islands", + "ref": "gal-pagos-photography-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_gal-pagos-photography-tour.jpg" + }, + { + "name": "Dive with Hammerhead Sharks at Gordon Rocks", + "description": "For the ultimate underwater thrill, embark on a scuba diving excursion to Gordon Rocks, a renowned dive site. Encounter schools of hammerhead sharks, along with other pelagic species like rays, turtles, and reef fish. Immerse yourself in the vibrant marine ecosystem and witness the awe-inspiring predators of the deep.", + "locationName": "Gordon Rocks", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "pagos-islands", + "ref": "dive-with-hammerhead-sharks-at-gordon-rocks", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_dive-with-hammerhead-sharks-at-gordon-rocks.jpg" + }, + { + "name": "Relaxation and Spa Day", + "description": "Indulge in a day of relaxation and rejuvenation at a luxurious spa on one of the main islands. Choose from a variety of treatments, including massages, facials, and body wraps, inspired by local ingredients and techniques. Unwind amidst serene surroundings and let the stresses of everyday life melt away.", + "locationName": "Santa Cruz or San Cristobal Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "pagos-islands", + "ref": "relaxation-and-spa-day", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_relaxation-and-spa-day.jpg" + }, + { + "name": "Island Hopping Adventure", + "description": "Embark on a multi-day island hopping tour to experience the diverse landscapes and wildlife of the Galápagos. Each island offers unique encounters, from the volcanic formations of Isabela to the playful sea lions of San Cristobal. Explore hidden coves, hike to panoramic viewpoints, and discover the incredible biodiversity that makes this archipelago so special.", + "locationName": "Various Islands", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "pagos-islands", + "ref": "island-hopping-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_island-hopping-adventure.jpg" + }, + { + "name": "Penguins and Marine Life Boat Tour", + "description": "Join a guided boat tour around the islands to spot the adorable Galápagos penguins, the only penguin species found north of the equator. Along the way, keep an eye out for other fascinating marine creatures such as sea turtles, dolphins, and rays as they glide through the crystal-clear waters.", + "locationName": "Various Islands", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "pagos-islands", + "ref": "penguins-and-marine-life-boat-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_penguins-and-marine-life-boat-tour.jpg" + }, + { + "name": "Visit the Interpretation Centers", + "description": "Delve deeper into the unique ecosystem and history of the Galápagos Islands by visiting the interpretation centers on different islands. Learn about the volcanic origins of the archipelago, the ongoing conservation efforts, and the fascinating adaptations of the native species.", + "locationName": "Santa Cruz Island, San Cristobal Island", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "pagos-islands", + "ref": "visit-the-interpretation-centers", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_visit-the-interpretation-centers.jpg" + }, + { + "name": "Stargazing on a Remote Beach", + "description": "Escape the light pollution and experience the magic of the Galápagos night sky. Find a secluded beach, lay back on the soft sand, and marvel at the brilliance of the Milky Way and constellations, far from the distractions of city life.", + "locationName": "Various beaches", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "pagos-islands", + "ref": "stargazing-on-a-remote-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_stargazing-on-a-remote-beach.jpg" + }, + { + "name": "Indulge in Local Seafood", + "description": "Treat your taste buds to the freshest seafood delicacies the Galápagos has to offer. From succulent lobster and ceviche to grilled fish and seafood stews, the local restaurants showcase the flavors of the islands with a focus on sustainability and local ingredients.", + "locationName": "Puerto Ayora, Puerto Baquerizo Moreno", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "pagos-islands", + "ref": "indulge-in-local-seafood", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/pagos-islands_indulge-in-local-seafood.jpg" + }, + { + "name": "Trekking in Torres del Paine National Park", + "description": "Embark on a multi-day trek through the stunning landscapes of Torres del Paine National Park. Hike past towering granite peaks, turquoise lakes, and sprawling glaciers, immersing yourself in the raw beauty of Patagonia. Choose from various trails, like the famous W Trek or the challenging O Circuit, and witness breathtaking views at every turn. ", + "locationName": "Torres del Paine National Park", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "patagonia", + "ref": "trekking-in-torres-del-paine-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_trekking-in-torres-del-paine-national-park.jpg" + }, + { + "name": "Kayaking on Lago Argentino", + "description": "Paddle through the pristine waters of Lago Argentino, the largest lake in Argentina, and marvel at the majestic Perito Moreno Glacier up close. Kayak amidst icebergs of various shapes and sizes, feeling the crisp Patagonian air and enjoying the tranquility of the surrounding nature.", + "locationName": "Lago Argentino", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "patagonia", + "ref": "kayaking-on-lago-argentino", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_kayaking-on-lago-argentino.jpg" + }, + { + "name": "Wildlife Watching in Peninsula Valdés", + "description": "Explore the Peninsula Valdés, a UNESCO World Heritage Site, and encounter an array of fascinating wildlife. Spot playful sea lions, elephant seals basking on the beaches, and Magellanic penguins waddling along the shores. During the right season, you might even witness the awe-inspiring spectacle of southern right whales breaching in the ocean.", + "locationName": "Peninsula Valdés", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "patagonia", + "ref": "wildlife-watching-in-peninsula-vald-s", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_wildlife-watching-in-peninsula-vald-s.jpg" + }, + { + "name": "Horseback Riding through the Pampas", + "description": "Experience the gaucho lifestyle with a horseback riding adventure through the vast Patagonian pampas. Gallop across the plains, feeling the wind in your hair and the freedom of the open space. Learn about the gaucho culture, their traditions, and their unique horsemanship skills.", + "locationName": "Patagonian Pampas", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "patagonia", + "ref": "horseback-riding-through-the-pampas", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_horseback-riding-through-the-pampas.jpg" + }, + { + "name": "Glacier Hiking on Perito Moreno", + "description": "Embark on a once-in-a-lifetime adventure by hiking on the surface of the Perito Moreno Glacier. Strap on crampons and explore the icy wonderland, discovering crevasses, ice caves, and stunning blue pools. Witness the immense power and beauty of this natural wonder up close.", + "locationName": "Perito Moreno Glacier", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "patagonia", + "ref": "glacier-hiking-on-perito-moreno", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_glacier-hiking-on-perito-moreno.jpg" + }, + { + "name": "Stargazing in Elqui Valley", + "description": "Experience the magic of the southern hemisphere's night sky in the Elqui Valley, known as a stargazing paradise. Join a guided tour at one of the many observatories, where powerful telescopes unveil constellations, planets, and the Milky Way in breathtaking detail. Learn about the cosmos from knowledgeable guides and capture stunning astrophotography shots.", + "locationName": "Elqui Valley", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "patagonia", + "ref": "stargazing-in-elqui-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_stargazing-in-elqui-valley.jpg" + }, + { + "name": "Fly Fishing in Patagonia's Rivers", + "description": "Cast your line amidst the pristine rivers and lakes of Patagonia, a haven for fly fishing enthusiasts. With expert guides, embark on a thrilling adventure targeting brown, rainbow, and brook trout. Immerse yourself in the stunning landscapes and enjoy the tranquility of nature while testing your angling skills.", + "locationName": "Various rivers and lakes", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "patagonia", + "ref": "fly-fishing-in-patagonia-s-rivers", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_fly-fishing-in-patagonia-s-rivers.jpg" + }, + { + "name": "Wine Tasting in the Argentine Wine Region", + "description": "Indulge in the flavors of Argentina's renowned wine region, exploring vineyards nestled amidst breathtaking scenery. Embark on a guided tour and tasting, savoring Malbecs, Cabernet Sauvignons, and other varietals. Learn about the winemaking process, from grape to bottle, and appreciate the unique terroir of Patagonia.", + "locationName": "Mendoza or other wine regions", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "patagonia", + "ref": "wine-tasting-in-the-argentine-wine-region", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_wine-tasting-in-the-argentine-wine-region.jpg" + }, + { + "name": "Mountain Biking through Patagonia's Trails", + "description": "Embark on an exhilarating mountain biking adventure through Patagonia's diverse landscapes. Explore scenic trails that wind through forests, mountains, and valleys, offering breathtaking views and challenging terrain. Whether you're a seasoned rider or a beginner, there are trails suitable for all levels, providing an unforgettable way to experience the region's natural beauty.", + "locationName": "Various mountain biking trails", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "patagonia", + "ref": "mountain-biking-through-patagonia-s-trails", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_mountain-biking-through-patagonia-s-trails.jpg" + }, + { + "name": "Exploring the Culture of Indigenous Communities", + "description": "Immerse yourself in the rich cultural heritage of Patagonia's indigenous communities, such as the Mapuche. Visit local villages, interact with residents, and learn about their traditions, crafts, and way of life. Participate in cultural events, workshops, or guided tours to gain a deeper understanding of their connection to the land and their enduring traditions.", + "locationName": "Various indigenous communities", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "patagonia", + "ref": "exploring-the-culture-of-indigenous-communities", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_exploring-the-culture-of-indigenous-communities.jpg" + }, + { + "name": "Scenic Flight Over the Andes", + "description": "Embark on an unforgettable aerial adventure with a scenic flight over the majestic Andes Mountains. Witness the breathtaking panorama of snow-capped peaks, glaciers, and turquoise lakes, capturing stunning aerial photography. This experience offers a unique perspective of Patagonia's vast and awe-inspiring landscapes.", + "locationName": "Various locations throughout Patagonia", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "patagonia", + "ref": "scenic-flight-over-the-andes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_scenic-flight-over-the-andes.jpg" + }, + { + "name": "Whale Watching in Puerto Madryn", + "description": "Embark on a thrilling whale-watching excursion in Puerto Madryn, a prime location for observing Southern Right Whales. Witness these magnificent creatures up close as they breach, tail slap, and nurse their calves in the protected waters of Golfo Nuevo. This unforgettable experience offers a unique opportunity to connect with Patagonia's marine wildlife.", + "locationName": "Puerto Madryn", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "patagonia", + "ref": "whale-watching-in-puerto-madryn", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_whale-watching-in-puerto-madryn.jpg" + }, + { + "name": "4x4 Off-Road Adventure", + "description": "Experience the rugged beauty of Patagonia on an exhilarating 4x4 off-road adventure. Traverse challenging terrains, cross glacial rivers, and discover hidden valleys and remote landscapes inaccessible by conventional vehicles. This adrenaline-pumping activity offers a thrilling way to explore Patagonia's wild and untamed beauty.", + "locationName": "Various locations throughout Patagonia", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "patagonia", + "ref": "4x4-off-road-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_4x4-off-road-adventure.jpg" + }, + { + "name": "Relaxing at a Patagonian Estancia", + "description": "Immerse yourself in the authentic Patagonian lifestyle with a stay at a traditional estancia (ranch). Enjoy horseback riding, sheep shearing demonstrations, and delicious Argentine asados (barbecues). Experience the tranquility of rural life and connect with the warm hospitality of local gauchos (cowboys).", + "locationName": "Various locations throughout Patagonia", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "patagonia", + "ref": "relaxing-at-a-patagonian-estancia", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_relaxing-at-a-patagonian-estancia.jpg" + }, + { + "name": "Exploring the Caves of Patagonia", + "description": "Discover the hidden wonders beneath the surface with a spelunking adventure in Patagonia's caves. Explore ancient formations, stalactites, and stalagmites, and learn about the geological history of the region. This unique activity offers a different perspective of Patagonia's natural beauty and is perfect for adventurous travelers.", + "locationName": "Various locations throughout Patagonia", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "patagonia", + "ref": "exploring-the-caves-of-patagonia", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_exploring-the-caves-of-patagonia.jpg" + }, + { + "name": "Sailing in the Beagle Channel", + "description": "Embark on a scenic boat tour through the Beagle Channel, a strait in the Tierra del Fuego Archipelago, and marvel at the stunning landscapes of snow-capped mountains, glaciers, and lush forests. Spot diverse wildlife including sea lions, penguins, and various bird species. Choose from various tour options, ranging from half-day excursions to multi-day expeditions, and experience the unique beauty of this remote waterway.", + "locationName": "Ushuaia or Puerto Williams", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "patagonia", + "ref": "sailing-in-the-beagle-channel", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_sailing-in-the-beagle-channel.jpg" + }, + { + "name": "Birdwatching in Punta Tombo", + "description": "Visit Punta Tombo, a nature reserve on the Atlantic coast, and witness one of the largest Magellanic penguin colonies in the world. Observe these adorable creatures up close as they waddle, swim, and nest along the shore. The reserve also hosts other bird species like cormorants, gulls, and rheas, making it a paradise for birdwatchers and nature enthusiasts.", + "locationName": "Punta Tombo", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "patagonia", + "ref": "birdwatching-in-punta-tombo", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_birdwatching-in-punta-tombo.jpg" + }, + { + "name": "White-Water Rafting on the Futaleufú River", + "description": "Experience an adrenaline-pumping adventure with a white-water rafting trip on the Futaleufú River. Navigate through thrilling rapids surrounded by breathtaking scenery of mountains, canyons, and forests. Choose from various difficulty levels and enjoy a day of excitement and stunning natural beauty. ", + "locationName": "Futaleufú River", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "patagonia", + "ref": "white-water-rafting-on-the-futaleuf-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_white-water-rafting-on-the-futaleuf-river.jpg" + }, + { + "name": "Skiing or Snowboarding in Cerro Catedral", + "description": "Hit the slopes at Cerro Catedral, one of the largest ski resorts in South America. Enjoy a variety of trails for all skill levels, from gentle beginner slopes to challenging black diamond runs. Take in the panoramic views of the Andes mountains as you carve down the snow-covered slopes. The resort also offers other winter activities like snowshoeing and cross-country skiing.", + "locationName": "Cerro Catedral", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "patagonia", + "ref": "skiing-or-snowboarding-in-cerro-catedral", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_skiing-or-snowboarding-in-cerro-catedral.jpg" + }, + { + "name": "Visiting the Perito Moreno Glacier", + "description": "Witness the awe-inspiring Perito Moreno Glacier, a massive ice formation in Los Glaciares National Park. Take a boat tour to get up close to the glacier and marvel at its towering ice walls and deep blue crevasses. You might even witness the spectacular sight of ice calving, where large chunks of ice break off and crash into the water. For a more adventurous experience, opt for a glacier trekking tour and walk on the surface of this natural wonder.", + "locationName": "Los Glaciares National Park", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "patagonia", + "ref": "visiting-the-perito-moreno-glacier", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/patagonia_visiting-the-perito-moreno-glacier.jpg" + }, + { + "name": "Explore the Historic Center", + "description": "Wander through the UNESCO-listed Historic Center of Arequipa, admiring the stunning colonial architecture made of white volcanic stone. Visit the Plaza de Armas, the main square, and marvel at the intricate carvings of the Arequipa Cathedral. Discover hidden courtyards, charming cafes, and local shops as you soak in the city's rich history.", + "locationName": "Historic Center of Arequipa", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "peru", + "ref": "explore-the-historic-center", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_explore-the-historic-center.jpg" + }, + { + "name": "Visit the Santa Catalina Monastery", + "description": "Step back in time at the Santa Catalina Monastery, a 16th-century complex that was once home to cloistered nuns. Explore the colorful streets, peaceful gardens, and hidden chapels of this city within a city. Learn about the fascinating lives of the nuns and admire the religious art and architecture.", + "locationName": "Santa Catalina Monastery", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "peru", + "ref": "visit-the-santa-catalina-monastery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_visit-the-santa-catalina-monastery.jpg" + }, + { + "name": "Hike the Colca Canyon", + "description": "Embark on a breathtaking hike through the Colca Canyon, one of the deepest canyons in the world. Witness stunning landscapes, traditional Andean villages, and soaring condors. Choose from various hiking trails, ranging from easy to challenging, and enjoy panoramic views of the canyon and surrounding mountains.", + "locationName": "Colca Canyon", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "peru", + "ref": "hike-the-colca-canyon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_hike-the-colca-canyon.jpg" + }, + { + "name": "Savor Peruvian Cuisine", + "description": "Indulge in the delicious flavors of Peruvian cuisine at Arequipa's many restaurants and cafes. Sample local specialties such as rocoto relleno (stuffed spicy peppers), chupe de camarones (shrimp chowder), and adobo arequipeño (marinated pork dish). Don't forget to try the traditional drink, chicha de jora, made from fermented corn.", + "locationName": "Various restaurants and cafes", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "peru", + "ref": "savor-peruvian-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_savor-peruvian-cuisine.jpg" + }, + { + "name": "Yanahuara Viewpoint", + "description": "Capture stunning panoramic views of the city and the surrounding volcanoes from the Yanahuara Viewpoint. Admire the white-stone arches and enjoy a peaceful moment while taking in the breathtaking scenery. This is a perfect spot for photography enthusiasts and anyone who wants to appreciate the beauty of Arequipa.", + "locationName": "Yanahuara Viewpoint", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "peru", + "ref": "yanahuara-viewpoint", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_yanahuara-viewpoint.jpg" + }, + { + "name": "Whitewater Rafting on the Chili River", + "description": "Experience the thrill of whitewater rafting on the Chili River, which flows through the Arequipa region. Choose from different difficulty levels depending on your experience and enjoy breathtaking views of the surrounding canyons and landscapes. This is a perfect activity for adventure seekers and nature lovers.", + "locationName": "Chili River", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "peru", + "ref": "whitewater-rafting-on-the-chili-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_whitewater-rafting-on-the-chili-river.jpg" + }, + { + "name": "Stargazing in the Desert", + "description": "Escape the city lights and embark on a stargazing adventure in the Atacama Desert, one of the driest deserts in the world. With clear skies and minimal light pollution, you'll have an unforgettable experience observing constellations, planets, and even the Milky Way.", + "locationName": "Atacama Desert", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "peru", + "ref": "stargazing-in-the-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_stargazing-in-the-desert.jpg" + }, + { + "name": "Soak in the Thermal Baths of Yura", + "description": "Relax and rejuvenate in the natural thermal baths of Yura, located just outside of Arequipa. The mineral-rich waters are known for their therapeutic properties and offer a perfect escape from the city's hustle and bustle.", + "locationName": "Yura", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "peru", + "ref": "soak-in-the-thermal-baths-of-yura", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_soak-in-the-thermal-baths-of-yura.jpg" + }, + { + "name": "Visit the Mundo Alpaca", + "description": "Learn about the fascinating world of alpacas at Mundo Alpaca, a farm and textile center. Witness the shearing process, discover the different types of alpaca wool, and shop for unique handcrafted souvenirs made from this luxurious fiber.", + "locationName": "Mundo Alpaca", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "peru", + "ref": "visit-the-mundo-alpaca", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_visit-the-mundo-alpaca.jpg" + }, + { + "name": "Explore the Arequipa Countryside on Horseback", + "description": "Embark on a scenic horseback riding tour through the picturesque countryside surrounding Arequipa. Admire the stunning views of the volcanoes, valleys, and traditional villages, and experience the local way of life.", + "locationName": "Arequipa Countryside", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "peru", + "ref": "explore-the-arequipa-countryside-on-horseback", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_explore-the-arequipa-countryside-on-horseback.jpg" + }, + { + "name": "Rock Climbing and Bouldering", + "description": "Challenge yourself with the volcanic cliffs surrounding Arequipa. Several outfitters offer guided climbing and bouldering excursions for all skill levels, from beginners to seasoned climbers. Experience the thrill of reaching new heights while enjoying panoramic views of the city and surrounding landscapes.", + "locationName": "Quebrada de Culebrillas or Charcani", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "peru", + "ref": "rock-climbing-and-bouldering", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_rock-climbing-and-bouldering.jpg" + }, + { + "name": "Mountain Biking Adventure", + "description": "Explore the rugged terrain around Arequipa on a thrilling mountain biking adventure. Several routes cater to different skill levels, offering stunning views of the Andes Mountains and the Colca Valley. You can choose a guided tour or rent a bike and explore independently.", + "locationName": "Yura or Chilina Valley", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "peru", + "ref": "mountain-biking-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_mountain-biking-adventure.jpg" + }, + { + "name": "Cooking Class and Food Market Tour", + "description": "Delve into the vibrant culinary scene of Arequipa with a cooking class and food market tour. Learn to prepare traditional Peruvian dishes like rocoto relleno or ocopa, using fresh local ingredients. Visit a bustling market to discover the variety of fruits, vegetables, and spices that contribute to the region's unique flavors.", + "locationName": "San Camilo Market or local cooking schools", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "peru", + "ref": "cooking-class-and-food-market-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_cooking-class-and-food-market-tour.jpg" + }, + { + "name": "Sillar Route Tour", + "description": "Discover the source of Arequipa's white volcanic stone on a Sillar Route tour. Visit the quarries where sillar is extracted and learn about its use in the city's iconic architecture. Explore the unique landscapes formed by volcanic activity and gain insight into the geological history of the region.", + "locationName": "Añashuayco or Quebrada de Añashuayco", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "peru", + "ref": "sillar-route-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_sillar-route-tour.jpg" + }, + { + "name": "Picanterias Food Tour", + "description": "Embark on a culinary journey through Arequipa's traditional picanterias. These family-run restaurants offer a unique dining experience, serving up hearty and flavorful dishes in a lively atmosphere. Sample local specialties like chupe de camarones, adobo arequipeño, and pastel de papa.", + "locationName": "Yanahuara or Sachaca districts", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "peru", + "ref": "picanterias-food-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_picanterias-food-tour.jpg" + }, + { + "name": "Sandboarding and Dune Buggying in the Desert", + "description": "Experience the thrill of gliding down the sand dunes on a sandboard or riding a dune buggy across the vast desert landscape. The surrounding desert offers exhilarating adventures for those seeking an adrenaline rush.", + "locationName": "Arequipa Desert", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "peru", + "ref": "sandboarding-and-dune-buggying-in-the-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_sandboarding-and-dune-buggying-in-the-desert.jpg" + }, + { + "name": "Catch a Show at the Teatro Municipal", + "description": "Immerse yourself in the local arts and culture scene by attending a performance at the Teatro Municipal. Enjoy a variety of shows, including music concerts, dance performances, and theatrical productions.", + "locationName": "Teatro Municipal de Arequipa", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "peru", + "ref": "catch-a-show-at-the-teatro-municipal", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_catch-a-show-at-the-teatro-municipal.jpg" + }, + { + "name": "Explore the San Camilo Market", + "description": "Wander through the vibrant San Camilo Market, a bustling hub of local life. Discover an array of fresh produce, handcrafted souvenirs, traditional textiles, and unique Peruvian delicacies.", + "locationName": "San Camilo Market", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "peru", + "ref": "explore-the-san-camilo-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_explore-the-san-camilo-market.jpg" + }, + { + "name": "Take a Day Trip to the Salinas and Aguada Blanca National Reserve", + "description": "Embark on a day trip to the Salinas and Aguada Blanca National Reserve, a stunning natural area home to diverse wildlife, including vicuñas, alpacas, and flamingos. Explore the breathtaking landscapes, salt flats, and volcanic formations.", + "locationName": "Salinas and Aguada Blanca National Reserve", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "peru", + "ref": "take-a-day-trip-to-the-salinas-and-aguada-blanca-national-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peru_take-a-day-trip-to-the-salinas-and-aguada-blanca-national-reserve.jpg" + }, + { + "name": "Amazon River Cruise", + "description": "Embark on a scenic river cruise along the Amazon River, the lifeblood of the rainforest. Spot diverse wildlife such as pink river dolphins, caimans, monkeys, and exotic birds while enjoying the lush scenery and the sounds of the jungle. Opt for a sunrise or sunset cruise for a truly magical experience.", + "locationName": "Amazon River", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "peruvian-amazon", + "ref": "amazon-river-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_amazon-river-cruise.jpg" + }, + { + "name": "Jungle Trekking and Wildlife Watching", + "description": "Venture deep into the rainforest on a guided jungle trek, immersing yourself in the sights and sounds of the Amazon. Learn about medicinal plants, observe fascinating insects, and encounter unique wildlife like sloths, monkeys, and colorful birds. Keep an eye out for elusive creatures like jaguars and tapirs.", + "locationName": "Various jungle trails", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "peruvian-amazon", + "ref": "jungle-trekking-and-wildlife-watching", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_jungle-trekking-and-wildlife-watching.jpg" + }, + { + "name": "Canopy Walkway Adventure", + "description": "Experience the rainforest from a different perspective by taking a thrilling canopy walkway tour. Walk among the treetops, enjoying breathtaking views of the jungle canopy and observing the rich biodiversity from above. This is a fantastic opportunity to spot birds, monkeys, and other arboreal creatures.", + "locationName": "Various canopy walkway locations", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "peruvian-amazon", + "ref": "canopy-walkway-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_canopy-walkway-adventure.jpg" + }, + { + "name": "Visit an Indigenous Community", + "description": "Immerse yourself in the culture of the indigenous people of the Amazon by visiting a local community. Learn about their traditions, way of life, and connection to the rainforest. Participate in cultural activities, try traditional foods, and gain a deeper understanding of the human history of the Amazon.", + "locationName": "Various indigenous communities", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "peruvian-amazon", + "ref": "visit-an-indigenous-community", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_visit-an-indigenous-community.jpg" + }, + { + "name": "Nighttime Wildlife Safari", + "description": "Embark on a thrilling nighttime safari into the rainforest, where nocturnal creatures come alive. With the help of a guide, spot caimans, snakes, owls, and other fascinating animals that are active after dark. This is a unique opportunity to experience the magic of the Amazon at night.", + "locationName": "Various jungle locations", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "peruvian-amazon", + "ref": "nighttime-wildlife-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_nighttime-wildlife-safari.jpg" + }, + { + "name": "Piranha Fishing Excursion", + "description": "Experience the thrill of piranha fishing in the Amazon River. Local guides will teach you traditional fishing techniques and share insights about these fascinating creatures. Enjoy the excitement of reeling in your catch and learn about the important role piranhas play in the ecosystem.", + "locationName": "Amazon River tributaries", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "peruvian-amazon", + "ref": "piranha-fishing-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_piranha-fishing-excursion.jpg" + }, + { + "name": "Kayaking through Amazonian Waterways", + "description": "Embark on a serene kayaking adventure through the tranquil waterways of the Amazon. Paddle through flooded forests, observe diverse wildlife along the riverbanks, and immerse yourself in the peaceful beauty of the rainforest. This activity offers a unique perspective of the Amazon's ecosystem and allows you to connect with nature at your own pace.", + "locationName": "Amazon River tributaries and flooded forests", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "peruvian-amazon", + "ref": "kayaking-through-amazonian-waterways", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_kayaking-through-amazonian-waterways.jpg" + }, + { + "name": "Birdwatching in the Rainforest Canopy", + "description": "Join a guided birdwatching tour and witness the incredible diversity of avian life in the Amazon rainforest. With the help of experienced local guides, spot colorful macaws, toucans, hummingbirds, and numerous other bird species. Learn about their unique behaviors, calls, and the vital role they play in the rainforest ecosystem. This activity is perfect for nature enthusiasts and photography lovers.", + "locationName": "Various locations within the rainforest", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "peruvian-amazon", + "ref": "birdwatching-in-the-rainforest-canopy", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_birdwatching-in-the-rainforest-canopy.jpg" + }, + { + "name": "Learn Traditional Crafts with Indigenous Artisans", + "description": "Immerse yourself in the rich cultural heritage of the Amazon by participating in a workshop with indigenous artisans. Learn traditional crafts such as basket weaving, pottery making, or jewelry crafting using natural materials found in the rainforest. This experience provides a unique opportunity to connect with local communities, support their livelihoods, and gain a deeper appreciation for their artistic traditions.", + "locationName": "Indigenous villages or cultural centers", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "peruvian-amazon", + "ref": "learn-traditional-crafts-with-indigenous-artisans", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_learn-traditional-crafts-with-indigenous-artisans.jpg" + }, + { + "name": "Relaxing Hammock Retreat and Nature Sounds", + "description": "Escape the hustle and bustle of everyday life with a relaxing hammock retreat in the heart of the Amazon rainforest. Find a peaceful spot, sway gently in a hammock, and let the soothing sounds of nature wash over you. Listen to the calls of exotic birds, the rustling of leaves, and the gentle flow of nearby rivers. This activity is perfect for those seeking tranquility and a chance to reconnect with nature.", + "locationName": "Various lodges or jungle camps", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "peruvian-amazon", + "ref": "relaxing-hammock-retreat-and-nature-sounds", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_relaxing-hammock-retreat-and-nature-sounds.jpg" + }, + { + "name": "Stargazing in the Amazonian Night", + "description": "Escape the city lights and experience the magic of the Amazonian night sky. Join a local guide for an evening of stargazing, where you'll learn about constellations, planets, and the fascinating stories behind them. With minimal light pollution, the Amazon offers breathtaking views of the Milky Way and countless stars, creating an unforgettable celestial experience.", + "locationName": "Various jungle lodges and camps", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "peruvian-amazon", + "ref": "stargazing-in-the-amazonian-night", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_stargazing-in-the-amazonian-night.jpg" + }, + { + "name": "Swim with Pink River Dolphins", + "description": "Embark on a unique adventure to swim with the legendary pink river dolphins of the Amazon. These intelligent and playful creatures are native to the region and offer a truly unforgettable experience. Take a dip in the river alongside these gentle giants and learn about their importance in the Amazonian ecosystem.", + "locationName": "Amazon River tributaries", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "peruvian-amazon", + "ref": "swim-with-pink-river-dolphins", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_swim-with-pink-river-dolphins.jpg" + }, + { + "name": "Photography Expedition in the Rainforest", + "description": "Capture the beauty and biodiversity of the Amazon rainforest on a photography expedition. Led by experienced guides and local photographers, you'll explore diverse ecosystems, learn about unique flora and fauna, and receive expert tips on capturing stunning images of the rainforest's hidden wonders. This activity is perfect for photography enthusiasts of all levels.", + "locationName": "Various rainforest locations", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "peruvian-amazon", + "ref": "photography-expedition-in-the-rainforest", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_photography-expedition-in-the-rainforest.jpg" + }, + { + "name": "Medicinal Plant Walk and Workshop", + "description": "Discover the healing power of the Amazon rainforest on a medicinal plant walk and workshop. Learn from indigenous healers about traditional uses of plants for various ailments and wellness practices. Participate in a hands-on workshop to create your own natural remedies and gain insights into the rich medicinal knowledge of the Amazonian people.", + "locationName": "Indigenous communities or jungle lodges", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "peruvian-amazon", + "ref": "medicinal-plant-walk-and-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_medicinal-plant-walk-and-workshop.jpg" + }, + { + "name": "Amazonian Cooking Class", + "description": "Delve into the flavors of the Amazon with a hands-on cooking class. Learn from local chefs about traditional ingredients and cooking techniques used in Amazonian cuisine. Prepare and savor authentic dishes like juanes (rice and chicken wrapped in bijao leaves) or tacacho (plantain and pork dish) while experiencing the unique culinary heritage of the region.", + "locationName": "Jungle lodges or local communities", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "peruvian-amazon", + "ref": "amazonian-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_amazonian-cooking-class.jpg" + }, + { + "name": "Mountain Biking through the Rainforest", + "description": "Embark on an exhilarating mountain biking adventure through the lush rainforest trails. Pedal past towering trees, cascading waterfalls, and hidden creeks, feeling the thrill of the rugged terrain and the fresh air on your face. This adrenaline-pumping experience offers a unique perspective of the Amazon's diverse ecosystem and is perfect for adventure seekers.", + "locationName": "Various rainforest trails", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "peruvian-amazon", + "ref": "mountain-biking-through-the-rainforest", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_mountain-biking-through-the-rainforest.jpg" + }, + { + "name": "Indigenous Village Homestay", + "description": "Immerse yourself in the rich culture and traditions of the Amazonian people by participating in a homestay program with an indigenous community. Share meals, learn traditional crafts, and experience their way of life firsthand. This unique opportunity offers a glimpse into the fascinating customs and deep connection to nature that have been passed down for generations.", + "locationName": "Indigenous villages", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "peruvian-amazon", + "ref": "indigenous-village-homestay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_indigenous-village-homestay.jpg" + }, + { + "name": "Amazon River Stand-Up Paddleboarding", + "description": "Glide along the tranquil waters of the Amazon River on a stand-up paddleboard, enjoying a peaceful and unique perspective of the rainforest. Observe the diverse wildlife along the riverbanks, from playful monkeys to colorful birds, and soak in the serenity of the surrounding nature. This relaxing activity is perfect for all skill levels and offers a chance to connect with the Amazon's aquatic ecosystem.", + "locationName": "Amazon River", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "peruvian-amazon", + "ref": "amazon-river-stand-up-paddleboarding", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_amazon-river-stand-up-paddleboarding.jpg" + }, + { + "name": "Caving Expedition", + "description": "Embark on a thrilling caving expedition, exploring the hidden depths of the Amazonian caves. Discover stunning rock formations, underground rivers, and unique cave-dwelling creatures. This adventurous activity is perfect for those seeking an adrenaline rush and a glimpse into the geological wonders of the rainforest.", + "locationName": "Various cave systems", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "peruvian-amazon", + "ref": "caving-expedition", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_caving-expedition.jpg" + }, + { + "name": "Rainforest Photography Workshop", + "description": "Capture the beauty and diversity of the Amazon rainforest through a photography workshop led by experienced guides. Learn valuable techniques for photographing wildlife, landscapes, and indigenous cultures. This workshop is perfect for photography enthusiasts of all levels and provides an opportunity to create lasting memories of your Amazonian adventure.", + "locationName": "Various rainforest locations", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "peruvian-amazon", + "ref": "rainforest-photography-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/peruvian-amazon_rainforest-photography-workshop.jpg" + }, + { + "name": "Royal Palace Complex Exploration", + "description": "Embark on a captivating journey through the Royal Palace Complex, a stunning symbol of Cambodian royalty. Marvel at the intricate architecture of the Silver Pagoda, adorned with shimmering silver tiles, and witness the grandeur of the Throne Hall. Explore the lush gardens and immerse yourself in the opulent history of the Cambodian monarchy.", + "locationName": "Royal Palace Complex", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "phnom-penh", + "ref": "royal-palace-complex-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_royal-palace-complex-exploration.jpg" + }, + { + "name": "Wat Phnom: A Historical and Spiritual Ascent", + "description": "Climb the steps to Wat Phnom, a revered Buddhist temple perched atop a hill, offering panoramic city views. Discover the legend of Lady Penh, who is said to have found four Buddha statues within a tree trunk and built the temple to house them. Immerse yourself in the serene atmosphere, observe the locals praying, and learn about the temple's significance in Cambodian culture.", + "locationName": "Wat Phnom", + "duration": 1.5, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "phnom-penh", + "ref": "wat-phnom-a-historical-and-spiritual-ascent", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_wat-phnom-a-historical-and-spiritual-ascent.jpg" + }, + { + "name": "Tuol Sleng Genocide Museum: A Poignant Journey", + "description": "Pay your respects at the Tuol Sleng Genocide Museum, a former school that was converted into a prison during the Khmer Rouge regime. Gain a deeper understanding of Cambodia's tragic past as you explore the exhibits and learn about the atrocities that took place. This experience is a somber but important reminder of the resilience of the human spirit.", + "locationName": "Tuol Sleng Genocide Museum", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "phnom-penh", + "ref": "tuol-sleng-genocide-museum-a-poignant-journey", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_tuol-sleng-genocide-museum-a-poignant-journey.jpg" + }, + { + "name": "Sunset Cruise on the Mekong River", + "description": "Indulge in a relaxing sunset cruise along the Mekong River. Admire the city skyline as it transforms into a tapestry of colors, observe the local life along the riverbanks, and savor a delicious Cambodian dinner on board. This experience offers a perfect blend of sightseeing and tranquility.", + "locationName": "Mekong River", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "phnom-penh", + "ref": "sunset-cruise-on-the-mekong-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_sunset-cruise-on-the-mekong-river.jpg" + }, + { + "name": "Phsar Thmey: A Shopper's Paradise", + "description": "Explore the vibrant Phsar Thmey, also known as the Central Market, a bustling hub for shopping and cultural immersion. Browse through a diverse array of goods, including textiles, handicrafts, souvenirs, and local produce. Engage with friendly vendors, practice your bargaining skills, and discover unique treasures to take home.", + "locationName": "Phsar Thmey (Central Market)", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "phnom-penh", + "ref": "phsar-thmey-a-shopper-s-paradise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_phsar-thmey-a-shopper-s-paradise.jpg" + }, + { + "name": "Koh Dach (Silk Island) Excursion", + "description": "Embark on a captivating journey to Koh Dach, also known as Silk Island, just a short ferry ride from Phnom Penh. Witness the intricate art of silk weaving passed down through generations, explore traditional stilt houses, and immerse yourself in the island's serene rural atmosphere. You can even purchase exquisite silk products directly from the local artisans.", + "locationName": "Koh Dach (Silk Island)", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "phnom-penh", + "ref": "koh-dach-silk-island-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_koh-dach-silk-island-excursion.jpg" + }, + { + "name": "Savor Culinary Delights at Friends the Restaurant", + "description": "Indulge in a unique dining experience at Friends the Restaurant, a renowned training restaurant empowering marginalized youth with culinary skills. Enjoy delicious Khmer and Western dishes while supporting a worthy cause, knowing that your meal contributes to a brighter future for these aspiring chefs.", + "locationName": "Friends the Restaurant", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "phnom-penh", + "ref": "savor-culinary-delights-at-friends-the-restaurant", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_savor-culinary-delights-at-friends-the-restaurant.jpg" + }, + { + "name": "Unwind at a Traditional Khmer Spa", + "description": "Escape the bustling city and rejuvenate your senses with a traditional Khmer spa treatment. Experience the therapeutic benefits of ancient massage techniques, herbal remedies, and aromatic oils, leaving you feeling refreshed and revitalized.", + "locationName": "Various spas in Phnom Penh", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "phnom-penh", + "ref": "unwind-at-a-traditional-khmer-spa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_unwind-at-a-traditional-khmer-spa.jpg" + }, + { + "name": "Discover Local Treasures at the Russian Market", + "description": "Embark on a treasure hunt at the Russian Market, a vibrant labyrinth of stalls offering everything from souvenirs and handicrafts to clothing, jewelry, and antiques. Practice your bargaining skills and find unique mementos to remember your Cambodian adventure.", + "locationName": "Russian Market", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "phnom-penh", + "ref": "discover-local-treasures-at-the-russian-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_discover-local-treasures-at-the-russian-market.jpg" + }, + { + "name": "Cambodian Living Arts Performance", + "description": "Immerse yourself in the rich cultural heritage of Cambodia at a mesmerizing performance by the Cambodian Living Arts. Witness traditional Apsara dance, shadow puppetry, and other captivating art forms, preserving and celebrating the country's artistic legacy.", + "locationName": "National Museum of Phnom Penh", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "phnom-penh", + "ref": "cambodian-living-arts-performance", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_cambodian-living-arts-performance.jpg" + }, + { + "name": "Cycling the Cambodian Countryside", + "description": "Embark on a scenic cycling tour through the picturesque Cambodian countryside surrounding Phnom Penh. Pedal along tranquil rice paddies, observe local village life, and witness the beauty of rural Cambodia. This leisurely adventure offers a refreshing escape from the city's hustle and bustle, allowing you to connect with nature and experience authentic Cambodian culture.", + "locationName": "Rural areas surrounding Phnom Penh", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "phnom-penh", + "ref": "cycling-the-cambodian-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_cycling-the-cambodian-countryside.jpg" + }, + { + "name": "National Museum of Cambodia: A Journey Through Khmer Art and History", + "description": "Delve into the rich cultural heritage of Cambodia at the National Museum, home to an extensive collection of Khmer art and artifacts. Explore ancient sculptures, intricate carvings, and historical relics that showcase the country's fascinating past. Gain insights into the Angkorian era, learn about traditional craftsmanship, and appreciate the beauty of Khmer artistic expression.", + "locationName": "National Museum of Cambodia", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "phnom-penh", + "ref": "national-museum-of-cambodia-a-journey-through-khmer-art-and-history", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_national-museum-of-cambodia-a-journey-through-khmer-art-and-history.jpg" + }, + { + "name": "Koh Rong Island Getaway", + "description": "Escape the city and embark on a tropical island adventure to Koh Rong. Relax on pristine beaches, swim in crystal-clear waters, and explore the island's lush interior. Go snorkeling or diving to discover vibrant coral reefs teeming with marine life. Indulge in fresh seafood at beachfront restaurants and enjoy the laid-back island vibes.", + "locationName": "Koh Rong Island", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "phnom-penh", + "ref": "koh-rong-island-getaway", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_koh-rong-island-getaway.jpg" + }, + { + "name": "Phnom Chisor Temple: Ancient Ruins with Panoramic Views", + "description": "Embark on a journey to Phnom Chisor, an ancient temple complex perched atop a hill, offering breathtaking panoramic views of the surrounding countryside. Climb the steps to the temple and explore the intricate carvings and architectural details. Learn about the history and significance of this sacred site while enjoying the serene atmosphere and stunning vistas.", + "locationName": "Phnom Chisor", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "phnom-penh", + "ref": "phnom-chisor-temple-ancient-ruins-with-panoramic-views", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_phnom-chisor-temple-ancient-ruins-with-panoramic-views.jpg" + }, + { + "name": "Indulge in Street Food Delights", + "description": "Embark on a culinary adventure through the vibrant streets of Phnom Penh, sampling a variety of delicious street food offerings. From flavorful noodle soups and savory grilled meats to refreshing fruit shakes and sweet treats, the city's street food scene is a feast for the senses. Discover local favorites, experience authentic Khmer flavors, and enjoy the lively atmosphere of the city's food stalls.", + "locationName": "Various street food stalls throughout Phnom Penh", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "phnom-penh", + "ref": "indulge-in-street-food-delights", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_indulge-in-street-food-delights.jpg" + }, + { + "name": "Killing Fields of Choeung Ek: A Somber Reflection", + "description": "Embark on a deeply moving journey to the Killing Fields of Choeung Ek, a poignant memorial dedicated to the victims of the Khmer Rouge regime. Pay your respects at the stupa filled with skulls and learn about Cambodia's tragic past. This experience offers a profound understanding of the country's history and resilience.", + "locationName": "Choeung Ek Genocidal Center", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "phnom-penh", + "ref": "killing-fields-of-choeung-ek-a-somber-reflection", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_killing-fields-of-choeung-ek-a-somber-reflection.jpg" + }, + { + "name": "Wat Ounalom: Serenity Amidst the City", + "description": "Escape the bustling city and find tranquility at Wat Ounalom, one of Phnom Penh's oldest and most important Buddhist temples. Admire the intricate architecture, observe monks in prayer, and experience the serene atmosphere of this spiritual haven.", + "locationName": "Wat Ounalom", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "phnom-penh", + "ref": "wat-ounalom-serenity-amidst-the-city", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_wat-ounalom-serenity-amidst-the-city.jpg" + }, + { + "name": "Sunset Kayak on the Tonle Sap River", + "description": "Embark on a picturesque kayaking adventure along the Tonle Sap River as the sun begins its descent. Witness the city skyline bathed in golden light, observe local life along the riverbanks, and enjoy the tranquility of the water. This unique perspective offers stunning views and a memorable experience.", + "locationName": "Tonle Sap River", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "phnom-penh", + "ref": "sunset-kayak-on-the-tonle-sap-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_sunset-kayak-on-the-tonle-sap-river.jpg" + }, + { + "name": "Cambodian Cooking Class: Master Khmer Flavors", + "description": "Delve into the heart of Cambodian cuisine with a hands-on cooking class. Learn the secrets of traditional dishes like fish amok, Khmer curry, and fresh spring rolls under the guidance of a local chef. This immersive experience allows you to recreate authentic flavors and impress your friends back home.", + "locationName": "Various Cooking Schools", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "phnom-penh", + "ref": "cambodian-cooking-class-master-khmer-flavors", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_cambodian-cooking-class-master-khmer-flavors.jpg" + }, + { + "name": "Phnom Tamao Wildlife Rescue Center: A Sanctuary for Animals", + "description": "Take a day trip to the Phnom Tamao Wildlife Rescue Center, a sanctuary for rescued animals including elephants, tigers, and gibbons. Learn about conservation efforts, observe the animals in their natural habitats, and contribute to the center's mission of protecting Cambodia's wildlife.", + "locationName": "Phnom Tamao Wildlife Rescue Center", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "phnom-penh", + "ref": "phnom-tamao-wildlife-rescue-center-a-sanctuary-for-animals", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phnom-penh_phnom-tamao-wildlife-rescue-center-a-sanctuary-for-animals.jpg" + }, + { + "name": "Island Hopping and Snorkeling Adventure", + "description": "Embark on a full-day island-hopping tour to discover the beauty of Phi Phi Islands and Phang Nga Bay. Dive into crystal-clear waters for snorkeling among colorful coral reefs and tropical fish, explore hidden coves and lagoons, and relax on pristine beaches. This adventure offers a perfect blend of relaxation and exploration, making it ideal for families and nature enthusiasts.", + "locationName": "Phi Phi Islands and Phang Nga Bay", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "phuket", + "ref": "island-hopping-and-snorkeling-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_island-hopping-and-snorkeling-adventure.jpg" + }, + { + "name": "Phuket Town Night Market Exploration", + "description": "Delve into the vibrant atmosphere of Phuket Town's Sunday Walking Street Market. Wander through the bustling stalls filled with local handicrafts, souvenirs, clothing, and street food. Savor the flavors of authentic Thai cuisine, enjoy live music performances, and experience the lively ambiance of this popular night market. This is a perfect opportunity to discover local culture and indulge in some shopping.", + "locationName": "Phuket Town", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "phuket", + "ref": "phuket-town-night-market-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_phuket-town-night-market-exploration.jpg" + }, + { + "name": "Thai Cooking Class and Market Tour", + "description": "Learn the secrets of Thai cuisine with a hands-on cooking class. Start with a visit to a local market to select fresh ingredients, then master the art of preparing traditional dishes under the guidance of experienced chefs. Discover the flavors and techniques of Thai cooking, from fragrant curries to delicious stir-fries. This immersive experience is perfect for food enthusiasts and those looking to enhance their culinary skills.", + "locationName": "Phuket Cooking Schools", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "phuket", + "ref": "thai-cooking-class-and-market-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_thai-cooking-class-and-market-tour.jpg" + }, + { + "name": "Relaxing Beach Day and Sunset Cruise", + "description": "Unwind and soak up the sun on the pristine beaches of Phuket. Choose from popular spots like Patong, Kata, or Karon Beach, and enjoy swimming, sunbathing, or simply relaxing by the turquoise waters. As the day ends, embark on a romantic sunset cruise along the coast, admiring the breathtaking views and enjoying a delicious dinner on board. This experience offers the perfect combination of relaxation and scenic beauty.", + "locationName": "Phuket Beaches", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "phuket", + "ref": "relaxing-beach-day-and-sunset-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_relaxing-beach-day-and-sunset-cruise.jpg" + }, + { + "name": "Phang Nga Bay Sea Kayaking", + "description": "Embark on a breathtaking sea kayaking adventure through the iconic Phang Nga Bay. Paddle through emerald-green waters, explore hidden caves and lagoons, and marvel at the towering limestone cliffs. Discover the famous James Bond Island and Koh Panyee, a floating village built on stilts.", + "locationName": "Phang Nga Bay", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "phuket", + "ref": "phang-nga-bay-sea-kayaking", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_phang-nga-bay-sea-kayaking.jpg" + }, + { + "name": "Elephant Sanctuary Experience", + "description": "Connect with majestic elephants in an ethical and sustainable sanctuary. Learn about their behavior and conservation efforts, feed them, and observe them bathing in the mud. This unforgettable experience promotes responsible tourism and supports the well-being of these gentle giants.", + "locationName": "Elephant Sanctuary", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "phuket", + "ref": "elephant-sanctuary-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_elephant-sanctuary-experience.jpg" + }, + { + "name": "Bangla Road Nightlife", + "description": "Immerse yourself in the vibrant nightlife of Patong Beach on the infamous Bangla Road. Experience the bustling atmosphere, live music, street performances, and a variety of bars and clubs. This is the perfect place to let loose and enjoy the energetic nightlife of Phuket.", + "locationName": "Bangla Road, Patong Beach", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "phuket", + "ref": "bangla-road-nightlife", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_bangla-road-nightlife.jpg" + }, + { + "name": "Karon Viewpoint Hike", + "description": "Embark on a scenic hike to Karon Viewpoint, offering panoramic views of Kata Noi Beach, Kata Beach, and Karon Beach. Capture stunning photos of the coastline and enjoy the fresh air and natural beauty of Phuket. This hike is suitable for various fitness levels and rewards you with breathtaking vistas.", + "locationName": "Karon Viewpoint", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "phuket", + "ref": "karon-viewpoint-hike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_karon-viewpoint-hike.jpg" + }, + { + "name": "Phuket Weekend Market", + "description": "Explore the vibrant Phuket Weekend Market, also known as Naka Market, and discover a treasure trove of local goods, souvenirs, clothing, and delicious street food. Immerse yourself in the bustling atmosphere, bargain with vendors, and experience the authentic local culture of Phuket.", + "locationName": "Phuket Weekend Market", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "phuket", + "ref": "phuket-weekend-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_phuket-weekend-market.jpg" + }, + { + "name": "Jungle Trekking and Waterfall Exploration", + "description": "Embark on an adventurous journey through Phuket's lush rainforests. Hike along scenic trails, discover hidden waterfalls like Bang Pae or Kathu Waterfall, take a refreshing dip in natural pools, and encounter diverse flora and fauna. This activity is perfect for nature lovers and those seeking an escape into the island's wild beauty.", + "locationName": "Khao Phra Thaeo National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "phuket", + "ref": "jungle-trekking-and-waterfall-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_jungle-trekking-and-waterfall-exploration.jpg" + }, + { + "name": "Simon Cabaret Show", + "description": "Experience the dazzling spectacle of the Simon Cabaret Show, one of Phuket's most famous nightlife attractions. Be entertained by talented performers in elaborate costumes, showcasing a vibrant blend of music, dance, and comedy. This is a unique cultural experience and a perfect way to enjoy an evening in Phuket.", + "locationName": "Patong Beach", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": false, + "price": 4, + "destinationRef": "phuket", + "ref": "simon-cabaret-show", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_simon-cabaret-show.jpg" + }, + { + "name": "Phuket Old Town Cultural Exploration", + "description": "Step back in time with a visit to Phuket Old Town. Wander through the charming streets lined with Sino-Portuguese architecture, explore historical landmarks like the Chinpracha House and the Thai Hua Museum, visit vibrant markets, and sample delicious local cuisine. This is a great way to immerse yourself in Phuket's rich history and culture.", + "locationName": "Phuket Old Town", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "phuket", + "ref": "phuket-old-town-cultural-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_phuket-old-town-cultural-exploration.jpg" + }, + { + "name": "Thai Massage and Spa Day", + "description": "Indulge in a relaxing and rejuvenating experience with a traditional Thai massage. Choose from a variety of treatments, including aromatherapy, herbal compresses, and foot reflexology, at one of Phuket's many luxurious spas. This is the perfect way to unwind and pamper yourself during your vacation.", + "locationName": "Various spas throughout Phuket", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "phuket", + "ref": "thai-massage-and-spa-day", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_thai-massage-and-spa-day.jpg" + }, + { + "name": "Ziplining Adventure", + "description": "Soar through the rainforest canopy on an exhilarating ziplining adventure. Experience breathtaking views of the island as you zip between platforms, enjoying an adrenaline-pumping activity surrounded by nature. This is a perfect choice for thrill-seekers and adventure enthusiasts.", + "locationName": "Hanuman World or Flying Hanuman", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "phuket", + "ref": "ziplining-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_ziplining-adventure.jpg" + }, + { + "name": "Racha Yai and Coral Island Speedboat Day Trip", + "description": "Embark on a thrilling speedboat adventure to the pristine islands of Racha Yai and Coral Island. Dive into crystal-clear waters for snorkeling, discover vibrant coral reefs teeming with marine life, and bask on the soft sandy beaches. Enjoy a delicious lunch on board and soak up the breathtaking scenery. This action-packed day trip is perfect for adventure seekers and beach lovers.", + "locationName": "Racha Yai and Coral Island", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "phuket", + "ref": "racha-yai-and-coral-island-speedboat-day-trip", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_racha-yai-and-coral-island-speedboat-day-trip.jpg" + }, + { + "name": "James Bond Island and Phang Nga Bay Tour by Longtail Boat", + "description": "Experience the iconic James Bond Island and the stunning Phang Nga Bay on a traditional longtail boat tour. Explore hidden lagoons, marvel at towering limestone cliffs, and visit the famous Koh Panyee floating village. Enjoy a delicious Thai lunch and capture unforgettable photos of this picturesque landscape.", + "locationName": "Phang Nga Bay", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "phuket", + "ref": "james-bond-island-and-phang-nga-bay-tour-by-longtail-boat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_james-bond-island-and-phang-nga-bay-tour-by-longtail-boat.jpg" + }, + { + "name": "FantaSea Show with Buffet Dinner", + "description": "Immerse yourself in the magic of Thai culture at the spectacular FantaSea show. Witness a captivating performance featuring acrobatics, illusions, and traditional dance, all set against a backdrop of stunning special effects. Indulge in a delicious buffet dinner with a variety of Thai and international dishes. This enchanting evening is perfect for families and culture enthusiasts.", + "locationName": "Kamala Beach", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "phuket", + "ref": "fantasea-show-with-buffet-dinner", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_fantasea-show-with-buffet-dinner.jpg" + }, + { + "name": "ATV Riding Adventure through the Jungle", + "description": "Get your adrenaline pumping with an exhilarating ATV ride through the lush jungles of Phuket. Navigate challenging terrains, discover hidden trails, and enjoy breathtaking views of the surrounding landscapes. This adventurous activity is perfect for thrill-seekers and nature lovers.", + "locationName": "Phuket's interior", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "phuket", + "ref": "atv-riding-adventure-through-the-jungle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_atv-riding-adventure-through-the-jungle.jpg" + }, + { + "name": "Romantic Sunset Dinner Cruise", + "description": "Indulge in a romantic evening aboard a luxurious yacht as you sail along the picturesque coastline of Phuket. Savor a delectable dinner with panoramic ocean views, sip on cocktails as the sun sets over the horizon, and create unforgettable memories with your loved one. This intimate experience is perfect for couples seeking a special getaway.", + "locationName": "Andaman Sea", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "phuket", + "ref": "romantic-sunset-dinner-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/phuket_romantic-sunset-dinner-cruise.jpg" + }, + { + "name": "Path of the Gods Hike", + "description": "Embark on a breathtaking hike along the Path of the Gods, a scenic trail offering panoramic views of the Amalfi Coast, the turquoise waters of the Mediterranean Sea, and charming villages nestled amidst terraced hillsides. This moderate hike is suitable for various fitness levels and rewards you with unforgettable vistas at every turn. Pack a picnic lunch to enjoy amidst the stunning scenery.", + "locationName": "Path of the Gods", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "positano", + "ref": "path-of-the-gods-hike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_path-of-the-gods-hike.jpg" + }, + { + "name": "Spiaggia Grande Beach Relaxation", + "description": "Soak up the sun and enjoy the vibrant atmosphere of Spiaggia Grande, Positano's main beach. Rent a sun lounger and umbrella, take a refreshing dip in the crystal-clear waters, or simply relax on the shore with a good book. Beachside cafes and restaurants offer delicious Italian fare and refreshing drinks, making it the perfect spot to unwind and people-watch.", + "locationName": "Spiaggia Grande", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "positano", + "ref": "spiaggia-grande-beach-relaxation", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_spiaggia-grande-beach-relaxation.jpg" + }, + { + "name": "Boat Trip to Capri", + "description": "Embark on a memorable boat trip to the captivating island of Capri. Explore the enchanting Blue Grotto, a sea cave illuminated with an ethereal blue light, wander through the charming towns of Capri and Anacapri, and admire the stunning coastal landscapes. This excursion offers a perfect blend of natural beauty, cultural exploration, and relaxation.", + "locationName": "Capri Island", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "positano", + "ref": "boat-trip-to-capri", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_boat-trip-to-capri.jpg" + }, + { + "name": "Positano Town Exploration", + "description": "Stroll through the charming streets of Positano, lined with colorful houses, boutique shops, and art galleries. Discover local crafts, indulge in delicious Italian gelato, and soak up the lively atmosphere. Visit the Church of Santa Maria Assunta, known for its majolica-tiled dome and Byzantine icon of the Virgin Mary, and explore the narrow alleyways that lead to hidden squares and breathtaking viewpoints.", + "locationName": "Positano Town", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "positano", + "ref": "positano-town-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_positano-town-exploration.jpg" + }, + { + "name": "Romantic Sunset Dinner", + "description": "Indulge in a romantic sunset dinner at one of Positano's cliffside restaurants. Savor delectable Italian cuisine, sip on fine wine, and enjoy breathtaking views of the coastline as the sun dips below the horizon. The enchanting ambiance and panoramic vistas create an unforgettable dining experience.", + "locationName": "Various cliffside restaurants", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "positano", + "ref": "romantic-sunset-dinner", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_romantic-sunset-dinner.jpg" + }, + { + "name": "Kayaking Along the Amalfi Coast", + "description": "Embark on a sea kayaking adventure, paddling along the crystal-clear waters of the Amalfi Coast. Explore hidden coves, sea caves, and secluded beaches inaccessible by foot. Enjoy breathtaking views of the coastline and the charming villages perched on the cliffs. This active excursion allows you to experience the beauty of the region from a unique perspective.", + "locationName": "Amalfi Coast", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "positano", + "ref": "kayaking-along-the-amalfi-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_kayaking-along-the-amalfi-coast.jpg" + }, + { + "name": "Cooking Class with a Local Chef", + "description": "Immerse yourself in Italian culinary culture with a hands-on cooking class. Learn the secrets of traditional dishes like fresh pasta, seafood specialties, and regional desserts from a local chef. Discover the art of selecting ingredients, mastering cooking techniques, and creating authentic Italian flavors. Enjoy the fruits of your labor with a delicious meal accompanied by local wine.", + "locationName": "Positano town", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "positano", + "ref": "cooking-class-with-a-local-chef", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_cooking-class-with-a-local-chef.jpg" + }, + { + "name": "Lively Night at Music on the Rocks", + "description": "Experience Positano's vibrant nightlife at Music on the Rocks, a legendary nightclub carved into the cliffs. Dance the night away to the beats of renowned DJs and enjoy live music performances. Sip on cocktails and soak up the electric atmosphere with stunning coastal views as your backdrop.", + "locationName": "Music on the Rocks", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 4, + "destinationRef": "positano", + "ref": "lively-night-at-music-on-the-rocks", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_lively-night-at-music-on-the-rocks.jpg" + }, + { + "name": "Scenic Drive along the Amalfi Coast", + "description": "Embark on a scenic drive along the winding roads of the Amalfi Coast. Rent a car or scooter and explore the picturesque villages, stopping at viewpoints to capture breathtaking panoramas. Visit charming towns like Ravello, Amalfi, and Atrani, each with its unique charm and historical sites. Enjoy the freedom to explore at your own pace and discover hidden gems along the way.", + "locationName": "Amalfi Coast", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "positano", + "ref": "scenic-drive-along-the-amalfi-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_scenic-drive-along-the-amalfi-coast.jpg" + }, + { + "name": "Shopping for Ceramics and Local Crafts", + "description": "Explore Positano's charming boutiques and workshops, discovering unique ceramics, handcrafted jewelry, and locally made souvenirs. Find beautifully painted ceramics, from decorative plates to intricate sculptures, showcasing the region's artistic traditions. Support local artisans and bring home a piece of Positano's charm.", + "locationName": "Positano town", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "positano", + "ref": "shopping-for-ceramics-and-local-crafts", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_shopping-for-ceramics-and-local-crafts.jpg" + }, + { + "name": "Villa Cimbrone Gardens Exploration", + "description": "Step into a world of enchantment at the Villa Cimbrone Gardens, a historic villa boasting breathtaking panoramic views of the Amalfi Coast. Wander through lush gardens adorned with sculptures, fountains, and hidden pathways, leading to the Terrace of Infinity, offering unparalleled vistas that will leave you speechless. Immerse yourself in the beauty and tranquility of this botanical paradise.", + "locationName": "Villa Cimbrone", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "positano", + "ref": "villa-cimbrone-gardens-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_villa-cimbrone-gardens-exploration.jpg" + }, + { + "name": "Scuba Diving Adventure in the Mediterranean", + "description": "Dive into the crystal-clear waters of the Mediterranean Sea and discover a vibrant underwater world teeming with marine life. Explore hidden coves, underwater caves, and ancient shipwrecks, encountering colorful fish, playful dolphins, and graceful sea turtles. Whether you're a seasoned diver or a beginner, Positano offers unforgettable scuba diving experiences for all levels.", + "locationName": "Various diving centers along the Amalfi Coast", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "positano", + "ref": "scuba-diving-adventure-in-the-mediterranean", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_scuba-diving-adventure-in-the-mediterranean.jpg" + }, + { + "name": "Wine Tasting Tour in the Hills of Furore", + "description": "Embark on a delightful journey through the vineyards of Furore, a hidden gem nestled in the hills above Positano. Visit local wineries, sample exquisite regional wines, and learn about the traditional winemaking techniques passed down through generations. Indulge in the flavors of the Amalfi Coast while enjoying breathtaking views of the surrounding countryside.", + "locationName": "Furore wineries", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "positano", + "ref": "wine-tasting-tour-in-the-hills-of-furore", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_wine-tasting-tour-in-the-hills-of-furore.jpg" + }, + { + "name": "Catch a Performance at Teatro La Fenice", + "description": "Immerse yourself in the vibrant cultural scene of Positano with a captivating performance at Teatro La Fenice. This intimate theater hosts a variety of events, including concerts, plays, and dance shows, showcasing local and international talent. Experience the magic of live entertainment in a charming setting.", + "locationName": "Teatro La Fenice", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "positano", + "ref": "catch-a-performance-at-teatro-la-fenice", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_catch-a-performance-at-teatro-la-fenice.jpg" + }, + { + "name": "Indulge in a Spa Day with a View", + "description": "Escape the hustle and bustle and treat yourself to a luxurious spa day with breathtaking views of the Amalfi Coast. Relax and rejuvenate with a variety of treatments, including massages, facials, and body wraps, while enjoying the serene ambiance and stunning scenery. Several hotels and wellness centers in Positano offer spa packages with panoramic views.", + "locationName": "Various hotels and wellness centers", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "positano", + "ref": "indulge-in-a-spa-day-with-a-view", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_indulge-in-a-spa-day-with-a-view.jpg" + }, + { + "name": "Lemon Grove Tour and Limoncello Tasting", + "description": "Explore the fragrant lemon groves that Positano is famous for. Learn about the cultivation of these citrus fruits and their significance to the local economy. Enjoy a tasting of limoncello, the region's beloved lemon liqueur, and other lemon-infused treats. This sensory experience offers a unique glimpse into the agricultural heritage of the Amalfi Coast.", + "locationName": "Local lemon grove", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "positano", + "ref": "lemon-grove-tour-and-limoncello-tasting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_lemon-grove-tour-and-limoncello-tasting.jpg" + }, + { + "name": "Stand Up Paddleboarding Excursion", + "description": "Embark on a stand-up paddleboarding adventure along the Positano coastline. Enjoy the tranquility of the sea while taking in breathtaking views of the cliffs and colorful houses. This activity is suitable for various skill levels and offers a fun and active way to explore the area from a different perspective.", + "locationName": "Positano coastline", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "positano", + "ref": "stand-up-paddleboarding-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_stand-up-paddleboarding-excursion.jpg" + }, + { + "name": "Grotta dello Smeraldo Cave Exploration", + "description": "Discover the enchanting Grotta dello Smeraldo, a sea cave known for its emerald-green waters. Take a boat tour to the cave and marvel at the unique light reflections that create a magical atmosphere. This natural wonder is a must-see for visitors to Positano.", + "locationName": "Grotta dello Smeraldo", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "positano", + "ref": "grotta-dello-smeraldo-cave-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_grotta-dello-smeraldo-cave-exploration.jpg" + }, + { + "name": "Li Galli Island Boat Trip and Snorkeling", + "description": "Escape to the secluded Li Galli archipelago, a group of small islands off the coast of Positano. Enjoy a boat trip to these pristine islands and discover their hidden coves and beaches. Go snorkeling in the crystal-clear waters and admire the vibrant marine life. This excursion offers a perfect blend of relaxation and adventure.", + "locationName": "Li Galli Islands", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "positano", + "ref": "li-galli-island-boat-trip-and-snorkeling", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_li-galli-island-boat-trip-and-snorkeling.jpg" + }, + { + "name": "Live Music and Dancing at Franco's Bar", + "description": "Experience the vibrant nightlife of Positano at Franco's Bar, a legendary venue known for its live music and lively atmosphere. Enjoy cocktails, dance the night away, and soak up the energetic ambiance. This is a perfect option for those looking for a fun and memorable night out.", + "locationName": "Franco's Bar", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "positano", + "ref": "live-music-and-dancing-at-franco-s-bar", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/positano_live-music-and-dancing-at-franco-s-bar.jpg" + }, + { + "name": "Explore Prague Castle", + "description": "Embark on a journey through time at the magnificent Prague Castle, the largest ancient castle complex in the world. Discover St. Vitus Cathedral, witness the Changing of the Guard ceremony, and explore the Golden Lane with its charming houses and workshops.", + "locationName": "Prague Castle", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "prague", + "ref": "explore-prague-castle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_explore-prague-castle.jpg" + }, + { + "name": "Wander through Old Town Square", + "description": "Immerse yourself in the heart of Prague at the Old Town Square. Admire the Astronomical Clock, marvel at the Gothic architecture of the Týn Church, and enjoy the vibrant atmosphere of street performers and local vendors.", + "locationName": "Old Town Square", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "prague", + "ref": "wander-through-old-town-square", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_wander-through-old-town-square.jpg" + }, + { + "name": "Cruise on the Vltava River", + "description": "Enjoy a relaxing boat tour along the Vltava River, offering stunning views of the city's iconic landmarks. Admire the Charles Bridge, the National Theatre, and the Prague Castle from a unique perspective while enjoying the gentle breeze and the city's skyline.", + "locationName": "Vltava River", + "duration": 1, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "prague", + "ref": "cruise-on-the-vltava-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_cruise-on-the-vltava-river.jpg" + }, + { + "name": "Discover the Jewish Quarter", + "description": "Delve into the rich history and culture of Prague's Jewish Quarter. Explore the synagogues, including the Old-New Synagogue, the oldest active synagogue in Europe, and visit the Old Jewish Cemetery, a poignant reminder of the community's past.", + "locationName": "Josefov", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "prague", + "ref": "discover-the-jewish-quarter", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_discover-the-jewish-quarter.jpg" + }, + { + "name": "Savor Traditional Czech Cuisine", + "description": "Indulge in the hearty flavors of traditional Czech cuisine. Sample classic dishes like vepřo knedlo zelo (roast pork with dumplings and cabbage), guláš (beef stew), and smažený sýr (fried cheese), accompanied by a refreshing Pilsner Urquell beer.", + "locationName": "Various restaurants", + "duration": 1, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "prague", + "ref": "savor-traditional-czech-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_savor-traditional-czech-cuisine.jpg" + }, + { + "name": "Petrin Hill Viewpoint", + "description": "Take a funicular ride or hike up Petrin Hill for breathtaking panoramic views of Prague. Explore Petrin Gardens, visit the Petrin Lookout Tower (a mini Eiffel Tower!), or wander through the rose gardens. This activity offers stunning views and a peaceful escape from the city.", + "locationName": "Petrin Hill", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "prague", + "ref": "petrin-hill-viewpoint", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_petrin-hill-viewpoint.jpg" + }, + { + "name": "Vyšehrad Fortress", + "description": "Discover the historical Vyšehrad Fortress, a complex with stunning views, beautiful gardens, and significant landmarks like the Basilica of St. Peter and St. Paul and the Vyšehrad Cemetery. Explore the ancient walls, delve into Czech legends, and enjoy a picnic with scenic views.", + "locationName": "Vyšehrad", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "prague", + "ref": "vy-ehrad-fortress", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_vy-ehrad-fortress.jpg" + }, + { + "name": "Beer Culture Experience", + "description": "Immerse yourself in Prague's renowned beer culture. Take a brewery tour to learn about the brewing process, visit traditional beer halls to sample local brews, or join a beer tasting session to discover unique flavors. This activity is perfect for beer enthusiasts and those wanting to experience Czech culture.", + "locationName": "Various breweries and beer halls", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 3, + "destinationRef": "prague", + "ref": "beer-culture-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_beer-culture-experience.jpg" + }, + { + "name": "John Lennon Wall", + "description": "Visit the iconic John Lennon Wall, a symbol of peace and freedom. Admire the ever-changing graffiti art, leave your own message, and soak in the inspiring atmosphere. This activity is perfect for art lovers, music fans, and those seeking a unique cultural experience.", + "locationName": "John Lennon Wall", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "prague", + "ref": "john-lennon-wall", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_john-lennon-wall.jpg" + }, + { + "name": "Black Light Theater", + "description": "Experience the magic of Black Light Theater, a unique theatrical performance that combines UV lights, fluorescent costumes, and illusions. Enjoy a visually stunning and captivating show that tells a story through movement and music.", + "locationName": "Various theaters in Prague", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "prague", + "ref": "black-light-theater", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_black-light-theater.jpg" + }, + { + "name": "Delve into the World of Franz Kafka", + "description": "Embark on a literary journey exploring the life and works of Prague's most famous author, Franz Kafka. Visit the Franz Kafka Museum, which delves into his complex life and literary contributions, and wander through the streets that inspired his surrealist writings. For a deeper dive, consider joining a guided Kafka-themed walking tour to uncover hidden gems and gain unique insights into his influence on the city.", + "locationName": "Franz Kafka Museum and various locations throughout Prague", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 2, + "destinationRef": "prague", + "ref": "delve-into-the-world-of-franz-kafka", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_delve-into-the-world-of-franz-kafka.jpg" + }, + { + "name": "Experience the Magic of the National Theatre", + "description": "Immerse yourself in the cultural heart of Prague with a visit to the National Theatre. Catch a captivating opera, ballet, or drama performance in this architectural masterpiece. Even if you're not attending a show, take a guided tour to admire the opulent interiors and learn about the theatre's rich history.", + "locationName": "National Theatre", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "prague", + "ref": "experience-the-magic-of-the-national-theatre", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_experience-the-magic-of-the-national-theatre.jpg" + }, + { + "name": "Shop for Treasures at Havelské Market", + "description": "Indulge in a sensory experience at Havelské Market, the oldest outdoor market in Prague. Browse through stalls brimming with fresh produce, local handicrafts, souvenirs, and unique Czech specialties. Sample traditional pastries, cheeses, and cured meats while soaking in the vibrant atmosphere.", + "locationName": "Havelské Market", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "prague", + "ref": "shop-for-treasures-at-havelsk-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_shop-for-treasures-at-havelsk-market.jpg" + }, + { + "name": "Escape to the Tranquility of Vrtba Garden", + "description": "Find a peaceful oasis amidst the bustling city at Vrtba Garden, a hidden gem of Baroque landscape architecture. Wander through terraced gardens adorned with sculptures, fountains, and vibrant flowerbeds. Enjoy panoramic views of the city from the upper terraces and escape the urban rush in this serene setting.", + "locationName": "Vrtba Garden", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "prague", + "ref": "escape-to-the-tranquility-of-vrtba-garden", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_escape-to-the-tranquility-of-vrtba-garden.jpg" + }, + { + "name": "Take a Day Trip to the Enchanting Karlštejn Castle", + "description": "Embark on a scenic day trip to Karlštejn Castle, a medieval fortress nestled amidst rolling hills just outside of Prague. Explore the castle's grand halls, towers, and courtyards, and learn about its fascinating history as a repository for royal treasures. Enjoy breathtaking views of the surrounding countryside and experience a journey back in time.", + "locationName": "Karlštejn", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "prague", + "ref": "take-a-day-trip-to-the-enchanting-karl-tejn-castle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_take-a-day-trip-to-the-enchanting-karl-tejn-castle.jpg" + }, + { + "name": "Day Trip to Kutná Hora", + "description": "Embark on a captivating day trip to the UNESCO-listed town of Kutná Hora, renowned for its Sedlec Ossuary, a unique chapel adorned with human bones. Explore the historic center, visit the magnificent St. Barbara's Church, and descend into the eerie depths of the silver mines.", + "locationName": "Kutná Hora", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "prague", + "ref": "day-trip-to-kutn-hora", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_day-trip-to-kutn-hora.jpg" + }, + { + "name": "Paddleboarding on the Vltava River", + "description": "Experience Prague from a different perspective with a stand-up paddleboarding adventure on the Vltava River. Glide beneath the city's iconic bridges, admire the picturesque skyline, and enjoy a unique and active way to explore the city.", + "locationName": "Vltava River", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "prague", + "ref": "paddleboarding-on-the-vltava-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_paddleboarding-on-the-vltava-river.jpg" + }, + { + "name": "Unwind at a Traditional Beer Spa", + "description": "Indulge in a unique and relaxing experience at a traditional Czech beer spa. Immerse yourself in a tub filled with natural ingredients like hops and barley, while enjoying unlimited beer on tap. This rejuvenating treatment is a perfect way to unwind after a day of exploring.", + "locationName": "Various Beer Spas throughout Prague", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "prague", + "ref": "unwind-at-a-traditional-beer-spa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_unwind-at-a-traditional-beer-spa.jpg" + }, + { + "name": "Catch a Classical Concert", + "description": "Immerse yourself in Prague's rich musical heritage by attending a classical concert. Choose from a variety of venues, including historic churches, concert halls, and even intimate settings, to experience the enchanting melodies of renowned composers.", + "locationName": "Various concert halls and churches throughout Prague", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "prague", + "ref": "catch-a-classical-concert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_catch-a-classical-concert.jpg" + }, + { + "name": "Explore the Trendy Vinohrady District", + "description": "Venture beyond the historic center and discover the trendy Vinohrady district. Explore its charming streets lined with Art Nouveau buildings, relax in one of the many cafes and restaurants, or browse through independent shops and boutiques.", + "locationName": "Vinohrady District", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "prague", + "ref": "explore-the-trendy-vinohrady-district", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/prague_explore-the-trendy-vinohrady-district.jpg" + }, + { + "name": "Explore Old San Juan", + "description": "Wander through the cobblestone streets of Old San Juan, a UNESCO World Heritage Site, and admire the colorful Spanish colonial architecture. Visit historic forts like Castillo San Felipe del Morro and Castillo San Cristobal, offering stunning ocean views. Explore local shops, art galleries, and museums, and savor delicious Puerto Rican cuisine at charming cafes and restaurants.", + "locationName": "Old San Juan", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "puerto-rico", + "ref": "explore-old-san-juan", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_explore-old-san-juan.jpg" + }, + { + "name": "Relax on Flamenco Beach", + "description": "Escape to the pristine shores of Flamenco Beach, consistently ranked among the world's best beaches. Sink your toes into the soft white sand, swim in the crystal-clear turquoise waters, and soak up the Caribbean sun. Snorkel or scuba dive to discover vibrant coral reefs teeming with marine life. Enjoy beachside amenities, water sports rentals, and delicious food kiosks.", + "locationName": "Flamenco Beach, Culebra Island", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "puerto-rico", + "ref": "relax-on-flamenco-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_relax-on-flamenco-beach.jpg" + }, + { + "name": "Hike in El Yunque National Forest", + "description": "Embark on a hike through the lush rainforests of El Yunque National Forest, the only tropical rainforest in the US National Forest System. Discover cascading waterfalls, unique flora and fauna, and breathtaking panoramic views. Hike to La Mina Falls for a refreshing dip, or climb the Yokahu Tower for stunning vistas. Choose from various trails suitable for different fitness levels.", + "locationName": "El Yunque National Forest", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "puerto-rico", + "ref": "hike-in-el-yunque-national-forest", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_hike-in-el-yunque-national-forest.jpg" + }, + { + "name": "Kayak in a Bioluminescent Bay", + "description": "Experience the magic of a bioluminescent bay, where the water glows with tiny organisms called dinoflagellates. Paddle through the darkness in a kayak and witness the mesmerizing blue-green light illuminate with every movement. Choose from three bioluminescent bays in Puerto Rico: Mosquito Bay (Vieques), Laguna Grande (Fajardo), or La Parguera (Lajas).", + "locationName": "Bioluminescent Bays (Vieques, Fajardo, or Lajas)", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "puerto-rico", + "ref": "kayak-in-a-bioluminescent-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_kayak-in-a-bioluminescent-bay.jpg" + }, + { + "name": "Go Salsa Dancing", + "description": "Immerse yourself in the vibrant nightlife of San Juan and experience the rhythm of salsa dancing. Take a salsa lesson or join a dance social at a local club or bar. Enjoy live music, delicious cocktails, and the infectious energy of the dance floor. Learn basic steps or show off your advanced moves, and let loose to the pulsating beats of salsa.", + "locationName": "San Juan", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "puerto-rico", + "ref": "go-salsa-dancing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_go-salsa-dancing.jpg" + }, + { + "name": "Caving Adventure in Río Camuy Cave Park", + "description": "Embark on a thrilling journey into the depths of the third-largest cave system in the world. Explore the majestic caverns adorned with stalactites and stalagmites, marvel at the underground river, and learn about the unique ecosystem within.", + "locationName": "Río Camuy Cave Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "puerto-rico", + "ref": "caving-adventure-in-r-o-camuy-cave-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_caving-adventure-in-r-o-camuy-cave-park.jpg" + }, + { + "name": "Horseback Riding through the Countryside", + "description": "Experience the beauty of Puerto Rico's lush landscapes on horseback. Ride through scenic trails, passing by plantations, rolling hills, and breathtaking coastal views. This is a perfect activity for nature lovers and those seeking a relaxing yet adventurous experience.", + "locationName": "Hacienda Carabalí", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "puerto-rico", + "ref": "horseback-riding-through-the-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_horseback-riding-through-the-countryside.jpg" + }, + { + "name": "Ziplining through the Rainforest Canopy", + "description": "Soar through the air on a thrilling zipline adventure, experiencing the rainforest from a unique perspective. Enjoy breathtaking views of the lush foliage, cascading waterfalls, and the distant ocean as you zip between platforms.", + "locationName": "Toro Verde Nature Adventure Park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "puerto-rico", + "ref": "ziplining-through-the-rainforest-canopy", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_ziplining-through-the-rainforest-canopy.jpg" + }, + { + "name": "Taste the Flavors of Puerto Rico on a Food Tour", + "description": "Embark on a culinary journey through the vibrant streets of San Juan, indulging in the diverse flavors of Puerto Rican cuisine. Sample local delicacies, learn about traditional cooking methods, and discover hidden culinary gems.", + "locationName": "Old San Juan", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "puerto-rico", + "ref": "taste-the-flavors-of-puerto-rico-on-a-food-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_taste-the-flavors-of-puerto-rico-on-a-food-tour.jpg" + }, + { + "name": "Sunset Sail along the Coast", + "description": "Set sail on a romantic catamaran cruise as the sun begins its descent, painting the sky with vibrant hues. Enjoy breathtaking views of the coastline, sip on refreshing cocktails, and create unforgettable memories.", + "locationName": "Fajardo", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "puerto-rico", + "ref": "sunset-sail-along-the-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_sunset-sail-along-the-coast.jpg" + }, + { + "name": "Snorkeling Adventure at Cayo Icacos", + "description": "Embark on a boat trip to the uninhabited island of Cayo Icacos, a true gem off the coast of Fajardo. Dive into crystal-clear waters and discover a vibrant underwater world teeming with colorful fish and coral reefs. This snorkeling adventure offers a glimpse into the island's diverse marine life and is perfect for all skill levels.", + "locationName": "Cayo Icacos", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "puerto-rico", + "ref": "snorkeling-adventure-at-cayo-icacos", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_snorkeling-adventure-at-cayo-icacos.jpg" + }, + { + "name": "Coffee Plantation Tour and Tasting", + "description": "Delve into the world of Puerto Rican coffee with a visit to a local coffee plantation. Explore the lush fields, learn about the coffee-making process from bean to cup, and indulge in a tasting of freshly brewed coffee. This cultural experience offers insight into the island's rich coffee heritage and is a must for coffee enthusiasts.", + "locationName": "Hacienda Buena Vista or Hacienda Lealtad", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "puerto-rico", + "ref": "coffee-plantation-tour-and-tasting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_coffee-plantation-tour-and-tasting.jpg" + }, + { + "name": "Stand-Up Paddleboarding in Condado Lagoon", + "description": "Experience the tranquility of Condado Lagoon on a stand-up paddleboard. Glide across the calm waters, surrounded by the cityscape and lush greenery. This activity is perfect for a relaxing afternoon, offering a unique perspective of the San Juan area and a chance to connect with nature.", + "locationName": "Condado Lagoon", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "puerto-rico", + "ref": "stand-up-paddleboarding-in-condado-lagoon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_stand-up-paddleboarding-in-condado-lagoon.jpg" + }, + { + "name": "Stargazing at Arecibo Observatory", + "description": "Embark on a celestial journey at the Arecibo Observatory, home to one of the world's largest radio telescopes. Learn about the cosmos, participate in a stargazing session, and marvel at the wonders of the night sky. This unique experience offers a glimpse into the world of astronomy and is perfect for those seeking a nighttime adventure.", + "locationName": "Arecibo Observatory", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "puerto-rico", + "ref": "stargazing-at-arecibo-observatory", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_stargazing-at-arecibo-observatory.jpg" + }, + { + "name": "Castillo San Cristóbal Exploration", + "description": "Step back in time with a visit to Castillo San Cristóbal, a 17th-century Spanish fort offering breathtaking views of San Juan. Explore the historic ramparts, tunnels, and dungeons, and learn about the fort's role in protecting the island from invaders. This journey into the past is perfect for history buffs and those seeking panoramic views.", + "locationName": "Castillo San Cristóbal", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "puerto-rico", + "ref": "castillo-san-crist-bal-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_castillo-san-crist-bal-exploration.jpg" + }, + { + "name": "Learn to Surf at Rincon", + "description": "Catch some waves and experience the thrill of surfing in Rincon, known as the 'Surfing Capital of the Caribbean.' Whether you're a beginner or an experienced surfer, Rincon offers waves for all skill levels. Take a lesson from a local surf school and enjoy the beautiful beaches while learning a new skill.", + "locationName": "Rincon", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "puerto-rico", + "ref": "learn-to-surf-at-rincon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_learn-to-surf-at-rincon.jpg" + }, + { + "name": "Explore the Colorful Streets of Ponce", + "description": "Wander through the historic city of Ponce, known for its colorful colonial architecture, charming plazas, and vibrant art scene. Visit the Ponce Museum of Art, home to an extensive collection of European and Puerto Rican art, or explore the historic Serrallés Castle for a glimpse into the island's sugar cane industry past.", + "locationName": "Ponce", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "puerto-rico", + "ref": "explore-the-colorful-streets-of-ponce", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_explore-the-colorful-streets-of-ponce.jpg" + }, + { + "name": "Dive into History at Castillo San Felipe del Morro", + "description": "Step back in time and explore the impressive Castillo San Felipe del Morro, a 16th-century citadel that guarded the entrance to San Juan Bay. Discover the fort's rich history, walk through its tunnels and ramparts, and enjoy breathtaking views of the ocean.", + "locationName": "San Juan", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "puerto-rico", + "ref": "dive-into-history-at-castillo-san-felipe-del-morro", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_dive-into-history-at-castillo-san-felipe-del-morro.jpg" + }, + { + "name": "Go on a Culinary Adventure", + "description": "Embark on a culinary journey through Puerto Rico's diverse food scene. Sample traditional dishes like mofongo, arroz con gandules, and pasteles, or indulge in fresh seafood and tropical fruits. Explore local markets, take a cooking class, or dine at renowned restaurants to experience the island's unique flavors.", + "locationName": "Various Locations", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "puerto-rico", + "ref": "go-on-a-culinary-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_go-on-a-culinary-adventure.jpg" + }, + { + "name": "Discover the Enchanting Guánica Dry Forest", + "description": "Explore the unique ecosystem of the Guánica Dry Forest, a UNESCO Biosphere Reserve. Hike through the dry, subtropical forest, home to diverse plant and animal life, including rare bird species and cacti. Enjoy stunning views of the Caribbean Sea and learn about the importance of conservation efforts.", + "locationName": "Guánica", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "puerto-rico", + "ref": "discover-the-enchanting-gu-nica-dry-forest", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/puerto-rico_discover-the-enchanting-gu-nica-dry-forest.jpg" + }, + { + "name": "Bavaro Beach Bliss", + "description": "Indulge in the quintessential Punta Cana experience with a day of relaxation on the stunning Bavaro Beach. Bask in the sun on the powdery white sand, take a refreshing dip in the turquoise waters, or simply unwind under the shade of a swaying palm tree. The beach offers a variety of water sports options, including snorkeling, kayaking, and paddleboarding, for those seeking a bit more adventure.", + "locationName": "Bavaro Beach", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "punta-cana", + "ref": "bavaro-beach-bliss", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_bavaro-beach-bliss.jpg" + }, + { + "name": "Underwater Adventures", + "description": "Explore the vibrant underwater world of Punta Cana with a snorkeling or scuba diving excursion. Discover colorful coral reefs teeming with tropical fish, graceful sea turtles, and other fascinating marine life. Numerous dive centers offer guided tours and courses for all levels, making it an unforgettable experience for both beginners and experienced divers.", + "locationName": "Various dive sites along the coast", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "punta-cana", + "ref": "underwater-adventures", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_underwater-adventures.jpg" + }, + { + "name": "Hoyo Azul Eco Tour", + "description": "Embark on an eco-adventure to Hoyo Azul, a hidden natural wonder tucked away in the Scape Park. Hike through lush rainforest trails, descend into a cenote with crystal-clear turquoise waters, and take a refreshing swim in this magical oasis. The tour also includes a visit to the Indigenous Eyes Ecological Park, where you can explore a series of lagoons and learn about the local flora and fauna.", + "locationName": "Scape Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "punta-cana", + "ref": "hoyo-azul-eco-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_hoyo-azul-eco-tour.jpg" + }, + { + "name": "Flavors of the Dominican Republic", + "description": "Embark on a culinary journey and discover the rich flavors of Dominican cuisine. Take a cooking class and learn to prepare traditional dishes such as La Bandera (rice, beans, and meat), Pescado con Coco (fish with coconut sauce), or Sancocho (a hearty stew). Alternatively, join a food tour and sample local delicacies at various restaurants and street food stalls.", + "locationName": "Various locations", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "punta-cana", + "ref": "flavors-of-the-dominican-republic", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_flavors-of-the-dominican-republic.jpg" + }, + { + "name": "Indigenous Eyes Ecological Park", + "description": "Immerse yourself in nature at the Indigenous Eyes Ecological Park, a sanctuary of lagoons, lush vegetation, and diverse wildlife. Take a leisurely walk along the trails, swim in the refreshing lagoons, and learn about the park's conservation efforts. The park is also home to a petting zoo and a cultural village, providing a glimpse into the Dominican way of life.", + "locationName": "Indigenous Eyes Ecological Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "punta-cana", + "ref": "indigenous-eyes-ecological-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_indigenous-eyes-ecological-park.jpg" + }, + { + "name": "Saona Island Escape", + "description": "Embark on a full-day excursion to the breathtaking Saona Island, a tropical paradise boasting pristine beaches, swaying palm trees, and turquoise waters. Cruise along the coastline, snorkel among vibrant coral reefs, and indulge in a delicious Dominican feast on the beach. Relax in a hammock, soak up the sun, and experience the ultimate island getaway.", + "locationName": "Saona Island", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "punta-cana", + "ref": "saona-island-escape", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_saona-island-escape.jpg" + }, + { + "name": "Horseback Riding Adventure", + "description": "Explore the Dominican countryside on horseback, traversing lush trails, scenic landscapes, and local villages. Experience the beauty of nature, interact with friendly locals, and create unforgettable memories. This activity is suitable for all skill levels and offers a unique perspective of Punta Cana's natural wonders.", + "locationName": "Dominican countryside", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "punta-cana", + "ref": "horseback-riding-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_horseback-riding-adventure.jpg" + }, + { + "name": "ChocoMuseo Chocolate Experience", + "description": "Immerse yourself in the world of Dominican chocolate at the ChocoMuseo. Learn about the history of cocoa, participate in a chocolate-making workshop, and indulge in delicious tastings. Discover the bean-to-bar process, create your own chocolate treats, and explore the museum's fascinating exhibits.", + "locationName": "ChocoMuseo", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "punta-cana", + "ref": "chocomuseo-chocolate-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_chocomuseo-chocolate-experience.jpg" + }, + { + "name": "Marinarium Snorkeling Cruise", + "description": "Embark on a catamaran cruise to a vibrant marine sanctuary teeming with marine life. Snorkel among colorful fish, graceful stingrays, and playful nurse sharks. Enjoy refreshing drinks, lively music, and stunning views of the Dominican coastline. This adventure offers a perfect blend of relaxation and underwater exploration.", + "locationName": "Marinarium", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "punta-cana", + "ref": "marinarium-snorkeling-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_marinarium-snorkeling-cruise.jpg" + }, + { + "name": "Coco Bongo Nightlife Extravaganza", + "description": "Experience the electrifying nightlife of Punta Cana at Coco Bongo, a world-renowned nightclub. Immerse yourself in a dazzling show featuring acrobats, dancers, live music, and impressive special effects. Dance the night away, enjoy unlimited drinks, and create unforgettable memories in this vibrant and energetic atmosphere.", + "locationName": "Coco Bongo", + "duration": 5, + "timeOfDay": "night", + "familyFriendly": false, + "price": 4, + "destinationRef": "punta-cana", + "ref": "coco-bongo-nightlife-extravaganza", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_coco-bongo-nightlife-extravaganza.jpg" + }, + { + "name": "Scape Park Adventure", + "description": "Embark on a thrilling journey through Scape Park, a natural theme park boasting captivating cenotes, exhilarating zip lines, and exciting cave expeditions. Discover hidden waterfalls, swim in crystal-clear waters, and challenge yourself with adventurous activities amidst the Dominican jungle.", + "locationName": "Scape Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "punta-cana", + "ref": "scape-park-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_scape-park-adventure.jpg" + }, + { + "name": "Sunset Catamaran Cruise", + "description": "Set sail on a romantic catamaran cruise as the sun dips below the horizon, painting the sky with vibrant hues. Enjoy breathtaking ocean views, sip on tropical cocktails, and dance to the rhythm of local music as you create unforgettable memories.", + "locationName": "Punta Cana coastline", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "punta-cana", + "ref": "sunset-catamaran-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_sunset-catamaran-cruise.jpg" + }, + { + "name": "Indigenous Cooking Class", + "description": "Immerse yourself in Dominican culture with a hands-on cooking class, learning to prepare traditional dishes using fresh, local ingredients. Discover the secrets of flavorful Dominican cuisine and savor the delicious results of your culinary adventure.", + "locationName": "Various locations", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 2, + "destinationRef": "punta-cana", + "ref": "indigenous-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_indigenous-cooking-class.jpg" + }, + { + "name": "Ocean Spa Experience", + "description": "Indulge in a rejuvenating spa experience with oceanfront views, soothing massages, and revitalizing body treatments. Unwind and reconnect with yourself amidst the tranquil sounds of the waves and the gentle ocean breeze.", + "locationName": "Various resorts and spas", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "punta-cana", + "ref": "ocean-spa-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_ocean-spa-experience.jpg" + }, + { + "name": "Explore Altos de Chavón", + "description": "Step back in time at Altos de Chavón, a replica of a 16th-century Mediterranean village. Wander through cobblestone streets, admire the charming architecture, and discover local art galleries and artisan shops. Enjoy stunning views of the Chavón River and immerse yourself in the cultural heritage of the Dominican Republic.", + "locationName": "Altos de Chavón", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "punta-cana", + "ref": "explore-altos-de-chav-n", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_explore-altos-de-chav-n.jpg" + }, + { + "name": "Zipline Adventure Through the Jungle", + "description": "Soar through the lush Dominican rainforest canopy on an exhilarating zipline adventure. Experience breathtaking views of the tropical landscape as you glide from platform to platform, feeling the adrenaline rush and enjoying the cool breeze. This activity is perfect for thrill-seekers and nature lovers alike, offering a unique perspective of the Dominican wilderness.", + "locationName": "Anamuya Mountains", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "punta-cana", + "ref": "zipline-adventure-through-the-jungle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_zipline-adventure-through-the-jungle.jpg" + }, + { + "name": "Sunset Horseback Riding on the Beach", + "description": "Embark on a romantic and unforgettable horseback riding experience along the pristine shores of Punta Cana. As the sun begins its descent, casting a warm glow over the turquoise waters, you'll ride gentle horses through the soft sand, enjoying the tranquil beauty of the beach and the sound of waves crashing against the shore. This is a perfect way to connect with nature and create lasting memories.", + "locationName": "Uvero Alto Beach", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "punta-cana", + "ref": "sunset-horseback-riding-on-the-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_sunset-horseback-riding-on-the-beach.jpg" + }, + { + "name": "Dominican Dance Class", + "description": "Immerse yourself in the vibrant Dominican culture with a lively dance class. Learn the steps to traditional dances like Merengue and Bachata, guided by experienced instructors who will share their passion and energy. This is a fun and interactive way to connect with local culture, meet new people, and add some rhythm to your vacation.", + "locationName": "Local dance studio or resort", + "duration": 1.5, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "punta-cana", + "ref": "dominican-dance-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_dominican-dance-class.jpg" + }, + { + "name": "Catamaran Sailing and Snorkeling Trip", + "description": "Set sail on a luxurious catamaran and embark on a journey along the stunning coastline of Punta Cana. Enjoy the warm Caribbean breeze as you cruise through crystal-clear waters, stopping at vibrant coral reefs for snorkeling adventures. Discover the colorful underwater world teeming with marine life, and later, indulge in a delicious lunch on board while soaking up the sun and enjoying the breathtaking views.", + "locationName": "Punta Cana coastline", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "punta-cana", + "ref": "catamaran-sailing-and-snorkeling-trip", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_catamaran-sailing-and-snorkeling-trip.jpg" + }, + { + "name": "Rum Distillery Tour and Tasting", + "description": "Delve into the history and production of Dominican rum with a fascinating tour of a local distillery. Learn about the sugarcane cultivation process, the distillation techniques, and the aging methods that create the unique flavors of Dominican rum. Afterward, indulge in a tasting session, sampling various rum varieties and discovering your favorite.", + "locationName": "Ron Barceló Distillery", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 2, + "destinationRef": "punta-cana", + "ref": "rum-distillery-tour-and-tasting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/punta-cana_rum-distillery-tour-and-tasting.jpg" + }, + { + "name": "Explore the Historic Old Town", + "description": "Step back in time and wander through the cobblestone streets of Old Quebec, a UNESCO World Heritage Site. Admire the charming architecture, visit historic landmarks like the Notre-Dame de Québec Basilica-Cathedral, and soak up the European ambiance.", + "locationName": "Old Quebec", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "quebec-city", + "ref": "explore-the-historic-old-town", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_explore-the-historic-old-town.jpg" + }, + { + "name": "Visit the Iconic Chateau Frontenac", + "description": "Discover the grandeur of the Fairmont Le Château Frontenac, a historic luxury hotel and one of Quebec City's most recognizable landmarks. Take a guided tour, enjoy afternoon tea, or simply admire its architectural beauty from Dufferin Terrace.", + "locationName": "Chateau Frontenac", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "quebec-city", + "ref": "visit-the-iconic-chateau-frontenac", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_visit-the-iconic-chateau-frontenac.jpg" + }, + { + "name": "Cruise the St. Lawrence River", + "description": "Embark on a scenic boat tour along the St. Lawrence River and enjoy breathtaking views of the city skyline, the Laurentian Mountains, and the Île d'Orléans. Choose from various options, including sightseeing cruises, dinner cruises, or even whale watching excursions.", + "locationName": "St. Lawrence River", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "quebec-city", + "ref": "cruise-the-st-lawrence-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_cruise-the-st-lawrence-river.jpg" + }, + { + "name": "Indulge in French Canadian Cuisine", + "description": "Delight your taste buds with the unique flavors of French Canadian cuisine. Sample traditional dishes like poutine, tourtière, and maple syrup pie at local restaurants or bistros. Don't miss the chance to explore the city's vibrant culinary scene.", + "locationName": "Various restaurants in Quebec City", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "quebec-city", + "ref": "indulge-in-french-canadian-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_indulge-in-french-canadian-cuisine.jpg" + }, + { + "name": "Immerse Yourself in History at the Museum of Civilization", + "description": "Delve into Quebec's rich history and culture at the Museum of Civilization. Explore fascinating exhibits on the region's First Nations people, European settlement, and contemporary society. The museum offers interactive displays and educational programs for all ages.", + "locationName": "Museum of Civilization", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "quebec-city", + "ref": "immerse-yourself-in-history-at-the-museum-of-civilization", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_immerse-yourself-in-history-at-the-museum-of-civilization.jpg" + }, + { + "name": "Hike or Bike the Plains of Abraham", + "description": "Explore the historic Plains of Abraham, a sprawling park where a pivotal battle between the French and British took place in 1759. Enjoy scenic trails for hiking and biking, offering breathtaking views of the St. Lawrence River and the city skyline. In winter, the park transforms into a winter wonderland, perfect for cross-country skiing and snowshoeing.", + "locationName": "Plains of Abraham", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "quebec-city", + "ref": "hike-or-bike-the-plains-of-abraham", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_hike-or-bike-the-plains-of-abraham.jpg" + }, + { + "name": "Discover Local Art at Quartier Petit Champlain", + "description": "Wander through the charming Quartier Petit Champlain, known for its narrow cobblestone streets, unique boutiques, and art galleries. Discover the works of local artists, find one-of-a-kind souvenirs, and soak up the vibrant atmosphere of this historic district.", + "locationName": "Quartier Petit Champlain", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "quebec-city", + "ref": "discover-local-art-at-quartier-petit-champlain", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_discover-local-art-at-quartier-petit-champlain.jpg" + }, + { + "name": "Indulge in Sweet Treats at a Sugar Shack", + "description": "Experience the Quebecois tradition of visiting a sugar shack, especially delightful in the spring during maple syrup season. Enjoy a traditional meal, indulge in maple-infused treats, and learn about the process of making maple syrup.", + "locationName": "Various sugar shacks in the region", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "quebec-city", + "ref": "indulge-in-sweet-treats-at-a-sugar-shack", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_indulge-in-sweet-treats-at-a-sugar-shack.jpg" + }, + { + "name": "Go on a Whale Watching Tour", + "description": "Embark on an unforgettable whale watching excursion from Baie-Sainte-Catherine, a short drive from Quebec City. Witness majestic whales like belugas, humpbacks, and minke whales in their natural habitat, and learn about these fascinating creatures from experienced guides.", + "locationName": "Baie-Sainte-Catherine", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "quebec-city", + "ref": "go-on-a-whale-watching-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_go-on-a-whale-watching-tour.jpg" + }, + { + "name": "Relax at the Nordic Spa", + "description": "Unwind and rejuvenate at the Nordic Spa, a haven of relaxation offering a variety of thermal experiences, including hot and cold pools, saunas, and steam rooms. Enjoy breathtaking views of the St. Lawrence River while indulging in a massage or body treatment.", + "locationName": "Strøm Nordic Spa", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "quebec-city", + "ref": "relax-at-the-nordic-spa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_relax-at-the-nordic-spa.jpg" + }, + { + "name": "Ice Hotel Experience", + "description": "Embark on a magical winter adventure at the Hôtel de Glace, North America's only ice hotel. Explore the stunning ice sculptures, sip cocktails from ice glasses in the ice bar, or even spend a night in a luxurious ice suite for an unforgettable experience. (Note: This activity is only available during winter months.)", + "locationName": "Hôtel de Glace", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "quebec-city", + "ref": "ice-hotel-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_ice-hotel-experience.jpg" + }, + { + "name": "Montmorency Falls Park", + "description": "Venture outside the city center to witness the breathtaking Montmorency Falls, cascading down 83 meters – taller than Niagara Falls! Take a cable car ride for panoramic views, cross the suspension bridge for an adrenaline rush, or hike the scenic trails surrounding the falls.", + "locationName": "Montmorency Falls Park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "quebec-city", + "ref": "montmorency-falls-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_montmorency-falls-park.jpg" + }, + { + "name": "Ile d'Orleans Getaway", + "description": "Escape to the idyllic Ile d'Orleans, a charming island just a short drive from Quebec City. Discover its quaint villages, sample local produce at farms and vineyards, visit historical sites, and enjoy the picturesque landscapes of the St. Lawrence River.", + "locationName": "Ile d'Orleans", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "quebec-city", + "ref": "ile-d-orleans-getaway", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_ile-d-orleans-getaway.jpg" + }, + { + "name": "Jacques-Cartier National Park", + "description": "Immerse yourself in the natural beauty of Jacques-Cartier National Park, a paradise for outdoor enthusiasts. Hike through pristine forests, go canoeing or kayaking on the Jacques-Cartier River, spot wildlife, and enjoy breathtaking views of the Laurentian Mountains.", + "locationName": "Jacques-Cartier National Park", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "quebec-city", + "ref": "jacques-cartier-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_jacques-cartier-national-park.jpg" + }, + { + "name": "Fine Dining and Nightlife", + "description": "Experience Quebec City's vibrant culinary scene by indulging in a gourmet dinner at one of its renowned restaurants. Later, explore the city's lively nightlife with options ranging from cozy pubs and live music venues to trendy bars and clubs.", + "locationName": "Various locations", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 4, + "destinationRef": "quebec-city", + "ref": "fine-dining-and-nightlife", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_fine-dining-and-nightlife.jpg" + }, + { + "name": "Explore the Fortifications of Quebec", + "description": "Embark on a journey through time as you walk along the historic fortifications of Quebec City. These impressive walls, dating back to the 17th century, offer stunning views of the city and the St. Lawrence River. Discover hidden corners, military structures, and historical sites while learning about the city's rich military past.", + "locationName": "Ramparts of Quebec City", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "quebec-city", + "ref": "explore-the-fortifications-of-quebec", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_explore-the-fortifications-of-quebec.jpg" + }, + { + "name": "Visit the Basilica-Cathedral of Notre-Dame de Québec", + "description": "Immerse yourself in the spiritual heart of Quebec City at the Basilica-Cathedral of Notre-Dame de Québec. This architectural gem boasts stunning stained glass windows, intricate sculptures, and a rich history dating back to the 17th century. Attend a mass or simply admire the beauty of this iconic landmark.", + "locationName": "Basilica-Cathedral of Notre-Dame de Québec", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "quebec-city", + "ref": "visit-the-basilica-cathedral-of-notre-dame-de-qu-bec", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_visit-the-basilica-cathedral-of-notre-dame-de-qu-bec.jpg" + }, + { + "name": "Take a Ferry Ride to Lévis", + "description": "Enjoy breathtaking panoramic views of Quebec City's skyline by taking a ferry ride across the St. Lawrence River to Lévis. Capture stunning photos of the city's landmarks, including the Chateau Frontenac and the historic Old Town, from a unique perspective. Explore the charming town of Lévis or simply relax on board and soak in the scenery.", + "locationName": "Quebec City-Lévis Ferry", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "quebec-city", + "ref": "take-a-ferry-ride-to-l-vis", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_take-a-ferry-ride-to-l-vis.jpg" + }, + { + "name": "Wander Through the Quartier des Arts", + "description": "Discover the vibrant artistic scene of Quebec City in the Quartier des Arts. Explore art galleries showcasing local and international artists, catch a live performance at a theater, or simply soak up the bohemian atmosphere. This neighborhood is a hub for creativity and offers a diverse range of artistic experiences.", + "locationName": "Quartier des Arts", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "quebec-city", + "ref": "wander-through-the-quartier-des-arts", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_wander-through-the-quartier-des-arts.jpg" + }, + { + "name": "Experience the Magic of the German Christmas Market", + "description": "During the holiday season, immerse yourself in the festive atmosphere of the German Christmas Market. Browse through charming wooden stalls offering traditional German crafts, decorations, and delicious treats. Enjoy live music, sip on mulled wine, and experience the magic of Christmas in a European setting.", + "locationName": "Place de l'Hôtel-de-Ville", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "quebec-city", + "ref": "experience-the-magic-of-the-german-christmas-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/quebec-city_experience-the-magic-of-the-german-christmas-market.jpg" + }, + { + "name": "Hike the Ben Lomond Track", + "description": "Embark on a challenging yet rewarding hike up Ben Lomond, offering breathtaking panoramic views of Queenstown, Lake Wakatipu, and the surrounding mountains. Choose from various trails catering to different fitness levels, from the Tiki Trail to the summit, for an unforgettable experience.", + "locationName": "Ben Lomond Scenic Reserve", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 2, + "destinationRef": "queenstown", + "ref": "hike-the-ben-lomond-track", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_hike-the-ben-lomond-track.jpg" + }, + { + "name": "Experience the Thrill of Bungy Jumping", + "description": "Take the plunge at the Kawarau Bridge Bungy, the world's first commercial bungy jump, or choose from various other adrenaline-pumping options like the Nevis Bungy and Ledge Bungy. Feel the rush as you leap into the void, surrounded by stunning landscapes.", + "locationName": "Kawarau Bridge, Nevis Bungy, or The Ledge Bungy", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "queenstown", + "ref": "experience-the-thrill-of-bungy-jumping", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_experience-the-thrill-of-bungy-jumping.jpg" + }, + { + "name": "Cruise on Lake Wakatipu", + "description": "Enjoy a relaxing and scenic cruise on the pristine waters of Lake Wakatipu aboard the historic TSS Earnslaw steamship. Admire the Remarkables mountain range, visit Walter Peak High Country Farm, and indulge in a delicious gourmet barbecue lunch or dinner.", + "locationName": "Lake Wakatipu", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "queenstown", + "ref": "cruise-on-lake-wakatipu", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_cruise-on-lake-wakatipu.jpg" + }, + { + "name": "Indulge in Local Flavors", + "description": "Explore Queenstown's vibrant culinary scene, from cozy cafes to award-winning restaurants. Sample fresh local produce, savor delicious wines from the Central Otago region, and discover international cuisines. Don't miss the iconic Fergburger for a satisfying burger experience.", + "locationName": "Queenstown Town Center", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "queenstown", + "ref": "indulge-in-local-flavors", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_indulge-in-local-flavors.jpg" + }, + { + "name": "Discover Queenstown's Nightlife", + "description": "As the sun sets, experience Queenstown's vibrant nightlife. Enjoy live music at local pubs, dance the night away at trendy clubs, or relax with a cocktail at a rooftop bar. With a diverse range of options, there's something for everyone to enjoy after dark.", + "locationName": "Queenstown Town Center", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "queenstown", + "ref": "discover-queenstown-s-nightlife", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_discover-queenstown-s-nightlife.jpg" + }, + { + "name": "Soar Above the Remarkables with a Scenic Flight", + "description": "Experience the breathtaking beauty of Queenstown and the surrounding Southern Alps from a unique perspective. Take a scenic flight over the Remarkables mountain range, glaciers, and Lake Wakatipu, capturing stunning aerial views and creating unforgettable memories. Choose from various flight options, including helicopter tours or fixed-wing aircraft, to tailor your experience.", + "locationName": "Queenstown Airport", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "queenstown", + "ref": "soar-above-the-remarkables-with-a-scenic-flight", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_soar-above-the-remarkables-with-a-scenic-flight.jpg" + }, + { + "name": "Explore the Underwater World with a Dive in Lake Wakatipu", + "description": "Embark on an underwater adventure in the crystal-clear waters of Lake Wakatipu. Discover the unique freshwater marine life and submerged landscapes, including the sunken remains of the historic TSS Earnslaw steamship. Whether you're a seasoned diver or a beginner, local dive operators offer guided experiences for all levels.", + "locationName": "Lake Wakatipu", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "queenstown", + "ref": "explore-the-underwater-world-with-a-dive-in-lake-wakatipu", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_explore-the-underwater-world-with-a-dive-in-lake-wakatipu.jpg" + }, + { + "name": "Unwind and Rejuvenate at Onsen Hot Pools", + "description": "Indulge in a luxurious and relaxing experience at the Onsen Hot Pools. Immerse yourself in the therapeutic waters of private hot tubs perched on a cliffside overlooking the Shotover River. Enjoy breathtaking views of the surrounding mountains while you soak away your stress and rejuvenate your body and mind. Ideal for couples or solo travelers seeking a tranquil escape.", + "locationName": "Onsen Hot Pools", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "queenstown", + "ref": "unwind-and-rejuvenate-at-onsen-hot-pools", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_unwind-and-rejuvenate-at-onsen-hot-pools.jpg" + }, + { + "name": "Journey to Glenorchy and Paradise", + "description": "Take a scenic drive to the picturesque village of Glenorchy, nestled at the northern end of Lake Wakatipu. Explore the stunning landscapes that have served as filming locations for movies like The Lord of the Rings. Continue your journey to Paradise, a remote valley renowned for its untouched beauty and hiking trails. Capture postcard-worthy photos and immerse yourself in the tranquility of nature.", + "locationName": "Glenorchy & Paradise", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "queenstown", + "ref": "journey-to-glenorchy-and-paradise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_journey-to-glenorchy-and-paradise.jpg" + }, + { + "name": "Go White Water Rafting on the Shotover River", + "description": "Get your adrenaline pumping with an exhilarating white-water rafting adventure on the Shotover River. Navigate through thrilling rapids, surrounded by dramatic canyons and stunning scenery. Experienced guides ensure your safety while providing an unforgettable experience for adventure seekers of all levels.", + "locationName": "Shotover River", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "queenstown", + "ref": "go-white-water-rafting-on-the-shotover-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_go-white-water-rafting-on-the-shotover-river.jpg" + }, + { + "name": "Stargazing in the Southern Sky", + "description": "Escape the city lights and embark on a magical stargazing journey. Queenstown's clear skies and minimal light pollution offer breathtaking views of the Milky Way, constellations, and even the Southern Lights. Join a guided tour or find a secluded spot to marvel at the celestial wonders above.", + "locationName": "Queenstown Gardens or Bob's Peak", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "queenstown", + "ref": "stargazing-in-the-southern-sky", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_stargazing-in-the-southern-sky.jpg" + }, + { + "name": "Wine Tour in the Gibbston Valley", + "description": "Embark on a delightful wine tour through the picturesque Gibbston Valley, renowned for its world-class Pinot Noir. Visit boutique wineries, indulge in tastings, and savor gourmet food pairings amidst stunning vineyard landscapes. Learn about the region's unique terroir and the art of winemaking.", + "locationName": "Gibbston Valley", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "queenstown", + "ref": "wine-tour-in-the-gibbston-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_wine-tour-in-the-gibbston-valley.jpg" + }, + { + "name": "Horseback Riding through Paradise", + "description": "Explore the breathtaking landscapes surrounding Queenstown on horseback. Ride through rolling hills, meadows, and alongside crystal-clear rivers, immersing yourself in the tranquility of nature. This unforgettable experience is suitable for all skill levels and offers stunning panoramic views.", + "locationName": "Glenorchy or Paradise Valley", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "queenstown", + "ref": "horseback-riding-through-paradise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_horseback-riding-through-paradise.jpg" + }, + { + "name": "Shop for Unique Souvenirs and Local Crafts", + "description": "Discover Queenstown's vibrant shopping scene, offering a diverse range of unique souvenirs and locally crafted treasures. Explore charming boutiques, art galleries, and craft markets to find the perfect mementos of your trip. From handcrafted jewelry and artwork to merino wool clothing and gourmet treats, there's something for everyone.", + "locationName": "Queenstown Mall or Arrowtown", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "queenstown", + "ref": "shop-for-unique-souvenirs-and-local-crafts", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_shop-for-unique-souvenirs-and-local-crafts.jpg" + }, + { + "name": "Take a Scenic Gondola Ride to Bob's Peak", + "description": "Enjoy breathtaking panoramic views of Queenstown and the surrounding mountains with a scenic gondola ride to Bob's Peak. At the top, indulge in delicious cuisine at a mountaintop restaurant, experience the thrill of the Skyline Luge, or simply soak in the awe-inspiring vistas.", + "locationName": "Skyline Queenstown", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "queenstown", + "ref": "take-a-scenic-gondola-ride-to-bob-s-peak", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_take-a-scenic-gondola-ride-to-bob-s-peak.jpg" + }, + { + "name": "Milford Sound Day Trip", + "description": "Embark on a breathtaking journey to Milford Sound, a stunning fiord renowned for its dramatic waterfalls, towering cliffs, and pristine natural beauty. Cruise through the fiord, marvel at the cascading Bowen Falls and Stirling Falls, and keep an eye out for playful dolphins, seals, and penguins. This full-day excursion is a must-do for nature enthusiasts and photographers alike.", + "locationName": "Milford Sound", + "duration": 12, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "queenstown", + "ref": "milford-sound-day-trip", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_milford-sound-day-trip.jpg" + }, + { + "name": "Skyline Luge", + "description": "Get your adrenaline pumping with a thrilling ride on the Skyline Luge! Zoom down the purpose-built track, navigating twists, turns, and tunnels with stunning views of Queenstown and Lake Wakatipu. Choose from different tracks for varying levels of difficulty and enjoy multiple rides to experience the excitement.", + "locationName": "Skyline Queenstown", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "queenstown", + "ref": "skyline-luge", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_skyline-luge.jpg" + }, + { + "name": "Kiwi Birdlife Park", + "description": "Discover New Zealand's unique wildlife at the Kiwi Birdlife Park. Observe the iconic kiwi bird in a nocturnal enclosure, encounter playful kea parrots, and learn about conservation efforts for endangered species. The park offers educational presentations and a chance to see tuataras, geckos, and other native reptiles.", + "locationName": "Kiwi Birdlife Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "queenstown", + "ref": "kiwi-birdlife-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_kiwi-birdlife-park.jpg" + }, + { + "name": "Arrowtown Historic Village", + "description": "Step back in time at Arrowtown, a charming historic gold mining village. Explore the preserved buildings, wander along the quaint streets, and visit the Lakes District Museum to delve into the region's rich history. Pan for gold in the Arrow River, indulge in delicious local fare, and enjoy the picturesque scenery.", + "locationName": "Arrowtown", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "queenstown", + "ref": "arrowtown-historic-village", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_arrowtown-historic-village.jpg" + }, + { + "name": "Relaxing Spa Day", + "description": "Indulge in a day of pampering and relaxation at one of Queenstown's luxurious spas. Choose from a variety of treatments, including massages, facials, body wraps, and hydrotherapy. Unwind in tranquil surroundings and let the expert therapists melt away your stress and leave you feeling refreshed and rejuvenated.", + "locationName": "Various spas in Queenstown", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "queenstown", + "ref": "relaxing-spa-day", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/queenstown_relaxing-spa-day.jpg" + }, + { + "name": "Explore the Majestic Mehrangarh Fort", + "description": "Embark on a journey through time at the Mehrangarh Fort, a magnificent 15th-century citadel perched atop a hill overlooking Jodhpur. Marvel at its intricate architecture, explore museums housing royal artifacts, and enjoy panoramic views of the 'Blue City'.", + "locationName": "Jodhpur", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "rajasthan", + "ref": "explore-the-majestic-mehrangarh-fort", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_explore-the-majestic-mehrangarh-fort.jpg" + }, + { + "name": "Camel Safari in the Thar Desert", + "description": "Embark on an unforgettable adventure across the undulating sand dunes of the Thar Desert. Ride atop a camel, witness breathtaking sunsets, and camp under the starry sky for a truly immersive desert experience.", + "locationName": "Jaisalmer", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "rajasthan", + "ref": "camel-safari-in-the-thar-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_camel-safari-in-the-thar-desert.jpg" + }, + { + "name": "Shop at the Bustling Bazaars", + "description": "Immerse yourself in the vibrant atmosphere of Rajasthan's bustling bazaars. Discover a treasure trove of textiles, handicrafts, jewelry, and spices. Hone your bargaining skills and find unique souvenirs to cherish.", + "locationName": "Jaipur", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "rajasthan", + "ref": "shop-at-the-bustling-bazaars", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_shop-at-the-bustling-bazaars.jpg" + }, + { + "name": "Witness the Grandeur of the City Palace", + "description": "Step into the opulent world of Rajasthan's royals at the City Palace in Jaipur. Explore the intricate courtyards, museums, and halls adorned with exquisite artwork and historical artifacts. Get a glimpse into the rich heritage and regal lifestyle of the Maharajas.", + "locationName": "Jaipur", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "rajasthan", + "ref": "witness-the-grandeur-of-the-city-palace", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_witness-the-grandeur-of-the-city-palace.jpg" + }, + { + "name": "Experience a Traditional Rajasthani Folk Dance Performance", + "description": "Immerse yourself in the vibrant culture of Rajasthan by witnessing a mesmerizing folk dance performance. Be captivated by the colorful costumes, rhythmic music, and graceful movements that tell stories of the region's rich heritage.", + "locationName": "Udaipur", + "duration": 1.5, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "rajasthan", + "ref": "experience-a-traditional-rajasthani-folk-dance-performance", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_experience-a-traditional-rajasthani-folk-dance-performance.jpg" + }, + { + "name": "Hot Air Balloon Ride Over Jaipur", + "description": "Soar above the Pink City of Jaipur in a hot air balloon and witness the breathtaking landscapes of Rajasthan from a unique perspective. Capture stunning aerial views of majestic forts, palaces, and the sprawling cityscape as you gently drift with the wind. This unforgettable experience offers a serene and romantic way to start your day and create lasting memories.", + "locationName": "Jaipur", + "duration": 1.5, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "rajasthan", + "ref": "hot-air-balloon-ride-over-jaipur", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_hot-air-balloon-ride-over-jaipur.jpg" + }, + { + "name": "Wildlife Safari in Ranthambore National Park", + "description": "Embark on an exhilarating jeep safari through Ranthambore National Park, renowned for its population of Royal Bengal tigers. Spot these majestic creatures in their natural habitat, along with other fascinating wildlife like leopards, sloth bears, crocodiles, and various bird species. Immerse yourself in the beauty of the park's diverse landscapes, from dense forests to tranquil lakes, and experience the thrill of observing animals in the wild.", + "locationName": "Ranthambore National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "rajasthan", + "ref": "wildlife-safari-in-ranthambore-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_wildlife-safari-in-ranthambore-national-park.jpg" + }, + { + "name": "Cooking Class and Traditional Rajasthani Meal", + "description": "Delve into the rich culinary heritage of Rajasthan by participating in a cooking class. Learn the secrets of preparing authentic Rajasthani dishes, from fragrant curries to delectable desserts, under the guidance of a local chef. After your culinary adventure, savor the fruits of your labor with a traditional Rajasthani meal, experiencing the unique flavors and spices of the region.", + "locationName": "Various locations", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "rajasthan", + "ref": "cooking-class-and-traditional-rajasthani-meal", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_cooking-class-and-traditional-rajasthani-meal.jpg" + }, + { + "name": "Stargazing in the Thar Desert", + "description": "Escape the city lights and venture into the vast Thar Desert for an unforgettable stargazing experience. Lie back under the clear night sky, away from light pollution, and marvel at the countless stars and constellations. Learn about celestial bodies from local guides and enjoy the tranquility of the desert night.", + "locationName": "Thar Desert", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "rajasthan", + "ref": "stargazing-in-the-thar-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_stargazing-in-the-thar-desert.jpg" + }, + { + "name": "Abhaneri Step Well", + "description": "Descend into the architectural marvel of the Chand Baori stepwell in Abhaneri, one of the largest and deepest in India. Marvel at the intricate geometric patterns and the play of light and shadow on the ancient steps.", + "locationName": "Abhaneri", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "rajasthan", + "ref": "abhaneri-step-well", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_abhaneri-step-well.jpg" + }, + { + "name": "Bundi Palace", + "description": "Explore the enchanting Bundi Palace, known for its exquisite murals and miniature paintings. Wander through the halls adorned with vibrant artwork, and enjoy panoramic views of the city and surrounding Aravalli Hills.", + "locationName": "Bundi", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "rajasthan", + "ref": "bundi-palace", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_bundi-palace.jpg" + }, + { + "name": "Kumbhalgarh Fort", + "description": "Embark on a journey to Kumbhalgarh Fort, the second-longest wall in the world after the Great Wall of China. Walk along the ramparts, explore the palaces and temples within the fort, and immerse yourself in the historical significance of this UNESCO World Heritage Site.", + "locationName": "Kumbhalgarh", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "rajasthan", + "ref": "kumbhalgarh-fort", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_kumbhalgarh-fort.jpg" + }, + { + "name": "Jaisalmer Desert Festival", + "description": "If you're visiting in February, immerse yourself in the vibrant Jaisalmer Desert Festival. Witness traditional folk dances, camel races, and musical performances against the backdrop of the golden sand dunes.", + "locationName": "Jaisalmer", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "rajasthan", + "ref": "jaisalmer-desert-festival", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_jaisalmer-desert-festival.jpg" + }, + { + "name": "Samode Palace", + "description": "Indulge in luxury and history at the Samode Palace, a heritage hotel known for its exquisite architecture and regal ambiance. Relax by the pool, enjoy a traditional Rajasthani thali, or explore the palace's intricate courtyards and gardens.", + "locationName": "Samode", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "rajasthan", + "ref": "samode-palace", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_samode-palace.jpg" + }, + { + "name": "Jeep Safari in the Aravalli Hills", + "description": "Embark on a thrilling jeep safari through the rugged terrain of the Aravalli Hills, the oldest mountain range in India. Discover hidden villages, ancient temples, and breathtaking views of the surrounding landscapes. Keep an eye out for diverse wildlife, including leopards, hyenas, and various bird species. This adventurous experience offers a unique perspective of Rajasthan's natural beauty.", + "locationName": "Aravalli Hills", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "rajasthan", + "ref": "jeep-safari-in-the-aravalli-hills", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_jeep-safari-in-the-aravalli-hills.jpg" + }, + { + "name": "Sunset Boat Ride on Lake Pichola", + "description": "As the sun begins its descent, embark on a serene boat ride across the picturesque Lake Pichola in Udaipur. Witness the city's palaces, temples, and ghats bathed in the golden hues of the setting sun. Enjoy the tranquility of the lake and capture stunning photographs of the cityscape. This romantic experience is perfect for couples or those seeking a moment of peace.", + "locationName": "Lake Pichola, Udaipur", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "rajasthan", + "ref": "sunset-boat-ride-on-lake-pichola", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_sunset-boat-ride-on-lake-pichola.jpg" + }, + { + "name": "Village Tour and Rural Life Experience", + "description": "Immerse yourself in the authentic culture of Rajasthan with a visit to a traditional village. Interact with local villagers, learn about their customs and way of life, and participate in daily activities such as pottery making, weaving, or farming. This enriching experience provides a glimpse into the heart and soul of Rajasthan.", + "locationName": "Rural Villages near Jodhpur or Jaipur", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "rajasthan", + "ref": "village-tour-and-rural-life-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_village-tour-and-rural-life-experience.jpg" + }, + { + "name": "Attend a Traditional Puppet Show", + "description": "Experience the magic of Rajasthani puppetry, a centuries-old art form. Watch skilled puppeteers bring colorful puppets to life, narrating folktales and mythological stories. The vibrant costumes, lively music, and engaging performances offer a delightful cultural experience for all ages.", + "locationName": "Jaipur or Jodhpur", + "duration": 1, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "rajasthan", + "ref": "attend-a-traditional-puppet-show", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_attend-a-traditional-puppet-show.jpg" + }, + { + "name": "Birdwatching at Keoladeo National Park", + "description": "Discover a haven for birdwatchers at Keoladeo National Park, a UNESCO World Heritage Site. Explore the diverse ecosystems of wetlands, woodlands, and grasslands, home to over 370 bird species. Spot migratory birds, including the Siberian crane, and enjoy the serene natural beauty of the park. This activity is perfect for nature enthusiasts and photography lovers.", + "locationName": "Keoladeo National Park, Bharatpur", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "rajasthan", + "ref": "birdwatching-at-keoladeo-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rajasthan_birdwatching-at-keoladeo-national-park.jpg" + }, + { + "name": "Hike to the Summit of Piton de la Fournaise", + "description": "Embark on an unforgettable adventure to the top of one of the world's most active volcanoes. Witness breathtaking panoramic views of the volcanic landscape, lunar-like craters, and the vast Indian Ocean. This challenging hike is best suited for experienced hikers with a good level of fitness.", + "locationName": "Piton de la Fournaise", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "reunion-island", + "ref": "hike-to-the-summit-of-piton-de-la-fournaise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_hike-to-the-summit-of-piton-de-la-fournaise.jpg" + }, + { + "name": "Relax on the Black Sand Beaches of Etang-Salé", + "description": "Unwind on the unique black sand beaches of Etang-Salé, formed by volcanic activity. Enjoy swimming in the refreshing waters, sunbathing under the tropical sun, and marveling at the dramatic contrast of the black sand against the turquoise ocean.", + "locationName": "Etang-Salé", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "reunion-island", + "ref": "relax-on-the-black-sand-beaches-of-etang-sal-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_relax-on-the-black-sand-beaches-of-etang-sal-.jpg" + }, + { + "name": "Explore the Lush Rainforests of Bébour-Bélouve", + "description": "Immerse yourself in the vibrant biodiversity of Réunion's rainforests. Hike through dense vegetation, discover hidden waterfalls, and encounter unique plant and animal species. This is a perfect activity for nature lovers and those seeking tranquility.", + "locationName": "Bébour-Bélouve Forest", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "reunion-island", + "ref": "explore-the-lush-rainforests-of-b-bour-b-louve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_explore-the-lush-rainforests-of-b-bour-b-louve.jpg" + }, + { + "name": "Discover the Creole Culture in Saint-Denis", + "description": "Explore the charming capital city of Saint-Denis and experience the unique blend of French, African, Indian, and Chinese influences that shape Réunion's Creole culture. Visit historical sites, vibrant markets, and indulge in delicious Creole cuisine.", + "locationName": "Saint-Denis", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "reunion-island", + "ref": "discover-the-creole-culture-in-saint-denis", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_discover-the-creole-culture-in-saint-denis.jpg" + }, + { + "name": "Go Canyoning in the Trou de Fer Canyon", + "description": "Embark on a thrilling canyoning adventure through the spectacular Trou de Fer Canyon. Rappel down cascading waterfalls, swim through crystal-clear pools, and experience the adrenaline rush of this unique activity. This is perfect for adventure seekers and those looking for an unforgettable experience.", + "locationName": "Trou de Fer Canyon", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "reunion-island", + "ref": "go-canyoning-in-the-trou-de-fer-canyon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_go-canyoning-in-the-trou-de-fer-canyon.jpg" + }, + { + "name": "Whale Watching Excursion", + "description": "Embark on a magical boat tour to witness the majestic humpback whales that migrate to Réunion's warm waters between June and October. Watch in awe as these gentle giants breach and slap their tails, creating unforgettable memories.", + "locationName": "Off the coast of Réunion Island", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "reunion-island", + "ref": "whale-watching-excursion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_whale-watching-excursion.jpg" + }, + { + "name": "Helicopter Tour over the Volcanoes", + "description": "Experience the breathtaking volcanic landscapes of Réunion from a unique perspective with a thrilling helicopter tour. Soar above Piton de la Fournaise and the dramatic cirques, capturing stunning aerial views of the island's diverse terrain.", + "locationName": "Departure from Saint-Gilles or Saint-Pierre", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "reunion-island", + "ref": "helicopter-tour-over-the-volcanoes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_helicopter-tour-over-the-volcanoes.jpg" + }, + { + "name": "Explore the Lava Tubes of Saint-Philippe", + "description": "Embark on a spelunking adventure through the fascinating lava tubes formed by past volcanic eruptions. Discover the unique geological formations and learn about the volcanic history of the island.", + "locationName": "Saint-Philippe", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "reunion-island", + "ref": "explore-the-lava-tubes-of-saint-philippe", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_explore-the-lava-tubes-of-saint-philippe.jpg" + }, + { + "name": "Visit the Jardin des Parfums et des Épices", + "description": "Immerse yourself in the fragrant world of spices and perfumes at this botanical garden. Discover a wide variety of exotic plants, learn about their traditional uses, and enjoy the captivating scents of ylang-ylang, vanilla, and other aromatic treasures.", + "locationName": "Saint-Philippe", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "reunion-island", + "ref": "visit-the-jardin-des-parfums-et-des-pices", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_visit-the-jardin-des-parfums-et-des-pices.jpg" + }, + { + "name": "Stargazing on Maïdo Mountain", + "description": "Escape the city lights and venture up Maïdo Mountain for an unforgettable stargazing experience. The high altitude and clear skies offer breathtaking views of the Milky Way and constellations, making it a perfect spot for astronomy enthusiasts.", + "locationName": "Maïdo Mountain", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "reunion-island", + "ref": "stargazing-on-ma-do-mountain", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_stargazing-on-ma-do-mountain.jpg" + }, + { + "name": "Scuba Diving in the Indian Ocean", + "description": "Dive into the crystal-clear waters of the Indian Ocean and discover a vibrant underwater world teeming with marine life. Explore coral reefs, encounter colorful fish, graceful sea turtles, and maybe even dolphins or whales. Réunion Island offers numerous dive sites suitable for all levels, from beginners to experienced divers.", + "locationName": "Various dive sites around the island", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "reunion-island", + "ref": "scuba-diving-in-the-indian-ocean", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_scuba-diving-in-the-indian-ocean.jpg" + }, + { + "name": "Paragliding over the Volcanic Landscape", + "description": "Soar through the sky and witness the breathtaking beauty of Réunion Island's volcanic landscapes from a unique perspective. Paragliding offers an exhilarating experience as you glide over craters, calderas, and lush forests, with panoramic views of the Indian Ocean.", + "locationName": "Saint-Leu or other paragliding launch sites", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "reunion-island", + "ref": "paragliding-over-the-volcanic-landscape", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_paragliding-over-the-volcanic-landscape.jpg" + }, + { + "name": "Horseback Riding through the Plaines des Cafres", + "description": "Embark on a scenic horseback riding adventure through the Plaines des Cafres, a vast plateau known for its rolling hills, volcanic craters, and panoramic vistas. This activity allows you to connect with nature and experience the island's diverse landscapes at a leisurely pace.", + "locationName": "Plaines des Cafres", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "reunion-island", + "ref": "horseback-riding-through-the-plaines-des-cafres", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_horseback-riding-through-the-plaines-des-cafres.jpg" + }, + { + "name": "Rum Distillery Tour and Tasting", + "description": "Discover the secrets of rum production on a guided tour of a local distillery. Learn about the history of rum on Réunion Island, witness the distillation process, and indulge in a tasting of various aged rums, savoring the unique flavors of this island specialty.", + "locationName": "Saga du Rhum or other distilleries", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 2, + "destinationRef": "reunion-island", + "ref": "rum-distillery-tour-and-tasting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_rum-distillery-tour-and-tasting.jpg" + }, + { + "name": "Market Exploration and Local Cuisine", + "description": "Immerse yourself in the vibrant atmosphere of a local market, such as the Saint-Paul Market. Explore the stalls brimming with fresh produce, exotic spices, handcrafted souvenirs, and local delicacies. Sample Creole dishes, tropical fruits, and other culinary delights, experiencing the authentic flavors of Réunion.", + "locationName": "Saint-Paul Market or other local markets", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "reunion-island", + "ref": "market-exploration-and-local-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_market-exploration-and-local-cuisine.jpg" + }, + { + "name": "Kitesurfing in Saint-Pierre", + "description": "Experience the thrill of kitesurfing in the turquoise waters of Saint-Pierre. With consistent winds and a variety of schools and rental shops available, it's an ideal spot for both beginners and experienced kitesurfers. Soar through the air, ride the waves, and enjoy the stunning coastal scenery.", + "locationName": "Saint-Pierre Beach", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "reunion-island", + "ref": "kitesurfing-in-saint-pierre", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_kitesurfing-in-saint-pierre.jpg" + }, + { + "name": "Sunset Cruise along the West Coast", + "description": "Embark on a romantic sunset cruise along Réunion's picturesque west coast. Sail past dramatic cliffs, secluded coves, and charming fishing villages as the sky explodes with vibrant hues. Enjoy breathtaking views, sip on cocktails, and savor a delicious onboard dinner.", + "locationName": "West Coast", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "reunion-island", + "ref": "sunset-cruise-along-the-west-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_sunset-cruise-along-the-west-coast.jpg" + }, + { + "name": "Explore the Underwater World with Snorkeling", + "description": "Discover the vibrant marine life of Réunion through snorkeling. Head to the lagoon of Saint-Gilles-les-Bains or the Hermitage Beach, where calm, clear waters offer excellent visibility. Swim among colorful fish, coral reefs, and other fascinating underwater creatures. A perfect activity for families and nature enthusiasts.", + "locationName": "Saint-Gilles-les-Bains or Hermitage Beach", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "reunion-island", + "ref": "explore-the-underwater-world-with-snorkeling", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_explore-the-underwater-world-with-snorkeling.jpg" + }, + { + "name": "Indulge in a Spa Day at a Luxury Resort", + "description": "Pamper yourself with a rejuvenating spa day at one of Réunion's luxurious resorts. Choose from a range of treatments, including massages, facials, and body wraps, using locally sourced ingredients like volcanic clay and essential oils. Unwind in serene surroundings and emerge feeling refreshed and revitalized.", + "locationName": "Luxury Resorts", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "reunion-island", + "ref": "indulge-in-a-spa-day-at-a-luxury-resort", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_indulge-in-a-spa-day-at-a-luxury-resort.jpg" + }, + { + "name": "Take a Scenic Drive on the Route des Laves", + "description": "Embark on a scenic road trip along the Route des Laves, a coastal road that winds through dramatic volcanic landscapes. Witness the aftermath of past eruptions, marvel at lava flows frozen in time, and enjoy breathtaking views of the Indian Ocean. Stop at viewpoints and explore lava tunnels along the way.", + "locationName": "Route des Laves", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "reunion-island", + "ref": "take-a-scenic-drive-on-the-route-des-laves", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/reunion-island_take-a-scenic-drive-on-the-route-des-laves.jpg" + }, + { + "name": "Christ the Redeemer and Corcovado Mountain", + "description": "Ascend Corcovado Mountain to marvel at the iconic Christ the Redeemer statue, a symbol of Rio and one of the New Seven Wonders of the World. Enjoy breathtaking panoramic views of the city, Guanabara Bay, and the surrounding mountains.", + "locationName": "Corcovado Mountain", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "rio-de-janeiro", + "ref": "christ-the-redeemer-and-corcovado-mountain", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_christ-the-redeemer-and-corcovado-mountain.jpg" + }, + { + "name": "Sugarloaf Mountain and Cable Car Ride", + "description": "Take a thrilling cable car ride to the top of Sugarloaf Mountain, another iconic landmark in Rio. Capture stunning views of the city, beaches, and Christ the Redeemer from a different perspective.", + "locationName": "Sugarloaf Mountain", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 4, + "destinationRef": "rio-de-janeiro", + "ref": "sugarloaf-mountain-and-cable-car-ride", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_sugarloaf-mountain-and-cable-car-ride.jpg" + }, + { + "name": "Copacabana Beach", + "description": "Relax and soak up the sun on the world-famous Copacabana Beach. Take a stroll along the iconic black and white promenade, enjoy a refreshing swim in the ocean, or try your hand at beach volleyball.", + "locationName": "Copacabana Beach", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "rio-de-janeiro", + "ref": "copacabana-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_copacabana-beach.jpg" + }, + { + "name": "Carnival Experience", + "description": "Immerse yourself in the vibrant and energetic atmosphere of Rio's Carnival. Watch the spectacular parades with elaborate costumes and samba dancing, or join a street party and dance the night away.", + "locationName": "Sambadrome or various neighborhoods", + "duration": 5, + "timeOfDay": "night", + "familyFriendly": false, + "price": 4, + "destinationRef": "rio-de-janeiro", + "ref": "carnival-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_carnival-experience.jpg" + }, + { + "name": "Tijuca National Park Hike", + "description": "Explore the Tijuca National Park, the world's largest urban rainforest. Hike through lush trails, discover hidden waterfalls, and encounter diverse wildlife.", + "locationName": "Tijuca National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "rio-de-janeiro", + "ref": "tijuca-national-park-hike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_tijuca-national-park-hike.jpg" + }, + { + "name": "Hang Gliding over Rio", + "description": "Experience breathtaking panoramic views of Rio's iconic landmarks and stunning coastline as you soar through the sky on a tandem hang gliding adventure. Take off from Pedra Bonita ramp and glide with experienced instructors, feeling the adrenaline rush as you witness the city's beauty from a unique perspective. This exhilarating activity is perfect for thrill-seekers and offers unforgettable memories.", + "locationName": "Pedra Bonita", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "rio-de-janeiro", + "ref": "hang-gliding-over-rio", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_hang-gliding-over-rio.jpg" + }, + { + "name": "Explore Santa Teresa", + "description": "Wander through the charming bohemian neighborhood of Santa Teresa, known for its artistic vibe, historic tram, and colorful houses. Discover local art galleries, studios, and craft shops, and enjoy the relaxed atmosphere of this hillside enclave. Take a ride on the iconic yellow tram for a scenic journey and visit Parque das Ruínas, a cultural center with stunning city views.", + "locationName": "Santa Teresa", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "rio-de-janeiro", + "ref": "explore-santa-teresa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_explore-santa-teresa.jpg" + }, + { + "name": "Visit the Maracanã Stadium", + "description": "Immerse yourself in Brazil's passion for football with a tour of the legendary Maracanã Stadium. Explore the history of this iconic venue, which hosted the FIFA World Cup finals in 1950 and 2014, and learn about its significance in Brazilian culture. Walk through the players' tunnel, visit the locker rooms, and imagine the electrifying atmosphere during a match.", + "locationName": "Maracanã Stadium", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "rio-de-janeiro", + "ref": "visit-the-maracan-stadium", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_visit-the-maracan-stadium.jpg" + }, + { + "name": "Experience Samba Nightlife", + "description": "Immerse yourself in the vibrant nightlife of Rio by attending a Samba show. Head to a local Samba club or a dedicated performance venue and enjoy the energetic music, captivating dance routines, and lively atmosphere. Feel the rhythm of Rio's soul as you witness the passion and talent of Samba dancers and musicians, creating an unforgettable cultural experience.", + "locationName": "Rio Scenarium (or other Samba clubs)", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "rio-de-janeiro", + "ref": "experience-samba-nightlife", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_experience-samba-nightlife.jpg" + }, + { + "name": "Botanical Garden Exploration", + "description": "Escape the city's hustle and bustle with a visit to the Rio de Janeiro Botanical Garden. Explore the diverse collection of plants and flowers from around the world, including orchids, bromeliads, and giant water lilies. Enjoy a peaceful stroll through the gardens, visit the sensory garden, and discover the historical significance of this green oasis.", + "locationName": "Rio de Janeiro Botanical Garden", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "rio-de-janeiro", + "ref": "botanical-garden-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_botanical-garden-exploration.jpg" + }, + { + "name": "Island Escape to Ilha Fiscal", + "description": "Embark on a ferry trip to the enchanting Ilha Fiscal, a small island in Guanabara Bay known for its fairytale-like palace. Explore the opulent halls and gardens of the former customs house, delve into its fascinating history, and enjoy breathtaking panoramic views of the city.", + "locationName": "Ilha Fiscal", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "rio-de-janeiro", + "ref": "island-escape-to-ilha-fiscal", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_island-escape-to-ilha-fiscal.jpg" + }, + { + "name": "Pedra da Gávea Hike and Climb", + "description": "For adventurous souls, the Pedra da Gávea hike offers a challenging but rewarding experience. Trek through lush rainforest, scramble up rocky slopes, and conquer the iconic 'Carrasqueira' rock face. The summit rewards you with awe-inspiring vistas of the entire city and coastline.", + "locationName": "Pedra da Gávea", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "rio-de-janeiro", + "ref": "pedra-da-g-vea-hike-and-climb", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_pedra-da-g-vea-hike-and-climb.jpg" + }, + { + "name": "Bohemian Vibes in Lapa", + "description": "Immerse yourself in the vibrant nightlife of Lapa, Rio's bohemian district. Wander through the colorful streets, admire the Arcos da Lapa, and hop between lively bars and clubs pulsating with samba, choro, and other Brazilian rhythms.", + "locationName": "Lapa", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "rio-de-janeiro", + "ref": "bohemian-vibes-in-lapa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_bohemian-vibes-in-lapa.jpg" + }, + { + "name": "Sailboat Cruise on Guanabara Bay", + "description": "Experience the beauty of Rio from a different perspective with a relaxing sailboat cruise on Guanabara Bay. Soak up the sun, admire the iconic landmarks from the water, and enjoy the refreshing sea breeze. Opt for a sunset cruise for a truly magical experience.", + "locationName": "Guanabara Bay", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "rio-de-janeiro", + "ref": "sailboat-cruise-on-guanabara-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_sailboat-cruise-on-guanabara-bay.jpg" + }, + { + "name": "Feira Hippie de Ipanema: Treasure Hunt", + "description": "Discover unique souvenirs and local crafts at the Feira Hippie de Ipanema, a vibrant open-air market. Browse through stalls filled with handmade jewelry, clothing, art, and more. Enjoy the lively atmosphere and find the perfect memento of your Rio adventure.", + "locationName": "Ipanema", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "rio-de-janeiro", + "ref": "feira-hippie-de-ipanema-treasure-hunt", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_feira-hippie-de-ipanema-treasure-hunt.jpg" + }, + { + "name": "Museum of Tomorrow", + "description": "Embark on a journey into the future at the Museum of Tomorrow, a science museum with interactive exhibits exploring sustainability and the challenges facing our planet. The striking architecture and thought-provoking displays make it a unique and educational experience for all ages.", + "locationName": "Museum of Tomorrow", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "rio-de-janeiro", + "ref": "museum-of-tomorrow", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_museum-of-tomorrow.jpg" + }, + { + "name": "Parque Lage", + "description": "Escape the city bustle at Parque Lage, a tranquil oasis with a historic mansion, a picturesque lake, and lush gardens. Enjoy a leisurely stroll, visit the art school, or simply relax at the on-site cafe and soak in the serene atmosphere. ", + "locationName": "Parque Lage", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "rio-de-janeiro", + "ref": "parque-lage", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_parque-lage.jpg" + }, + { + "name": "AquaRio", + "description": "Dive into the underwater world at AquaRio, the largest marine aquarium in South America. Discover a diverse array of marine life, from colorful fish to majestic sharks, and walk through a mesmerizing underwater tunnel for an immersive experience.", + "locationName": "AquaRio", + "duration": 2.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "rio-de-janeiro", + "ref": "aquario", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_aquario.jpg" + }, + { + "name": "Theatro Municipal do Rio de Janeiro", + "description": "Experience the grandeur of Theatro Municipal do Rio de Janeiro, a stunning opera house renowned for its opulent architecture and world-class performances. Catch a ballet, opera, or symphony concert for a dose of culture and sophistication.", + "locationName": "Theatro Municipal do Rio de Janeiro", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "rio-de-janeiro", + "ref": "theatro-municipal-do-rio-de-janeiro", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_theatro-municipal-do-rio-de-janeiro.jpg" + }, + { + "name": "Ilha da Gigóia", + "description": "Escape the city and explore Ilha da Gigóia, a car-free island in the Barra da Tijuca neighborhood. Rent a kayak or stand-up paddleboard, enjoy fresh seafood at a local restaurant, and discover the island's laid-back charm.", + "locationName": "Ilha da Gigóia", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "rio-de-janeiro", + "ref": "ilha-da-gig-ia", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/rio-de-janeiro_ilha-da-gig-ia.jpg" + }, + { + "name": "Salt Flats Photography Tour", + "description": "Embark on a guided photography tour across the mesmerizing Salar de Uyuni. Capture the surreal reflections of the sky on the flooded salt flats during the rainy season, creating stunning optical illusions. Learn perspective tricks from your guide to take playful and unforgettable photos with the unique landscape.", + "locationName": "Salar de Uyuni", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "salar-de-uyuni", + "ref": "salt-flats-photography-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_salt-flats-photography-tour.jpg" + }, + { + "name": "Stargazing Experience", + "description": "Witness the breathtaking spectacle of the night sky above the Salar de Uyuni. Far from city lights, the desert offers unparalleled views of the Milky Way and constellations. Join a stargazing tour led by an expert guide who will share insights about the celestial wonders above.", + "locationName": "Salar de Uyuni", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "salar-de-uyuni", + "ref": "stargazing-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_stargazing-experience.jpg" + }, + { + "name": "Isla Incahuasi Exploration", + "description": "Venture to Isla Incahuasi, an island oasis in the heart of the salt flats. Hike to the island's summit for panoramic views of the vast white expanse. Explore the unique ecosystem with its giant cacti, and learn about the island's history and geological formations.", + "locationName": "Isla Incahuasi", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "salar-de-uyuni", + "ref": "isla-incahuasi-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_isla-incahuasi-exploration.jpg" + }, + { + "name": "Train Cemetery Visit", + "description": "Step back in time at the Train Cemetery, a collection of rusting locomotives and train cars from Bolivia's mining era. Explore the abandoned trains, capture unique photos, and learn about the history of the railway system and its impact on the region.", + "locationName": "Uyuni Train Cemetery", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "salar-de-uyuni", + "ref": "train-cemetery-visit", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_train-cemetery-visit.jpg" + }, + { + "name": "Laguna Colorada Flamingo Viewing", + "description": "Journey to Laguna Colorada, a vibrant red lagoon known for its large population of flamingos. Observe these elegant birds in their natural habitat as they feed and interact. Learn about the unique ecosystem of the lagoon and the factors that contribute to its distinctive color.", + "locationName": "Laguna Colorada", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "salar-de-uyuni", + "ref": "laguna-colorada-flamingo-viewing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_laguna-colorada-flamingo-viewing.jpg" + }, + { + "name": "Andean Salt Hotel Experience", + "description": "Spend a night in a unique hotel constructed entirely from salt blocks, offering an unforgettable experience in the heart of the Salar de Uyuni. Marvel at the intricate salt carvings, enjoy local cuisine in the salt restaurant, and relax in the cozy atmosphere of this architectural wonder.", + "locationName": "Salt Hotel on the Salar de Uyuni", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "salar-de-uyuni", + "ref": "andean-salt-hotel-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_andean-salt-hotel-experience.jpg" + }, + { + "name": "Off-Road Adventure to the Tunupa Volcano", + "description": "Embark on an exhilarating 4x4 journey to the Tunupa Volcano, a dormant stratovolcano offering breathtaking panoramic views of the Salar de Uyuni and surrounding landscapes. Explore ancient caves adorned with cave paintings, hike to the volcano's crater, and learn about the region's geological history.", + "locationName": "Tunupa Volcano", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "salar-de-uyuni", + "ref": "off-road-adventure-to-the-tunupa-volcano", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_off-road-adventure-to-the-tunupa-volcano.jpg" + }, + { + "name": "Mountain Biking on the Salt Flats", + "description": "Experience the vastness of the Salar de Uyuni on two wheels, cycling across the seemingly endless expanse of salt. Feel the cool breeze against your face as you pedal through this unique landscape, stopping to capture stunning photos and enjoy the serene atmosphere.", + "locationName": "Salar de Uyuni", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "salar-de-uyuni", + "ref": "mountain-biking-on-the-salt-flats", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_mountain-biking-on-the-salt-flats.jpg" + }, + { + "name": "Sunset Picnic on the Salt Flats", + "description": "Indulge in a romantic and unforgettable experience with a sunset picnic on the Salar de Uyuni. As the sun dips below the horizon, witness the sky ablaze with vibrant colors, reflecting off the shimmering salt crust. Enjoy a delicious spread of local delicacies and savor the magical ambiance.", + "locationName": "Salar de Uyuni", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "salar-de-uyuni", + "ref": "sunset-picnic-on-the-salt-flats", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_sunset-picnic-on-the-salt-flats.jpg" + }, + { + "name": "Uyuni Market Exploration", + "description": "Immerse yourself in the local culture with a visit to the vibrant Uyuni Market. Browse through stalls brimming with colorful handicrafts, textiles, and souvenirs. Sample regional delicacies, interact with friendly vendors, and discover the authentic flavors of Bolivia.", + "locationName": "Uyuni Market", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "salar-de-uyuni", + "ref": "uyuni-market-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_uyuni-market-exploration.jpg" + }, + { + "name": "Cave Exploration at Cueva del Diablo", + "description": "Embark on a thrilling adventure to the 'Devil's Cave,' a natural cavern located near the salt flats. Explore its eerie chambers adorned with stalactites and stalagmites, and learn about the local legends and folklore surrounding this mysterious site.", + "locationName": "Cueva del Diablo", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "salar-de-uyuni", + "ref": "cave-exploration-at-cueva-del-diablo", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_cave-exploration-at-cueva-del-diablo.jpg" + }, + { + "name": "Authentic Quinoa Farm Visit and Lunch", + "description": "Immerse yourself in the local culture with a visit to a traditional quinoa farm. Learn about the cultivation process of this Andean superfood, participate in harvesting activities (depending on the season), and savor a delicious lunch prepared with fresh, locally-sourced ingredients.", + "locationName": "Local quinoa farm", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "salar-de-uyuni", + "ref": "authentic-quinoa-farm-visit-and-lunch", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_authentic-quinoa-farm-visit-and-lunch.jpg" + }, + { + "name": "Sunrise Hot Springs Experience", + "description": "Start your day with a magical sunrise soak in the natural hot springs near the salt flats. Relax and rejuvenate in the therapeutic waters while witnessing the breathtaking colors of the dawn sky. This is a perfect opportunity for stunning photographs and peaceful reflection.", + "locationName": "Hot springs near Salar de Uyuni", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "salar-de-uyuni", + "ref": "sunrise-hot-springs-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_sunrise-hot-springs-experience.jpg" + }, + { + "name": "Local Village Cultural Exchange", + "description": "Engage with the local community and experience their way of life. Visit a nearby village, interact with residents, learn about their customs and traditions, and perhaps even participate in a traditional craft workshop.", + "locationName": "Local village", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "salar-de-uyuni", + "ref": "local-village-cultural-exchange", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_local-village-cultural-exchange.jpg" + }, + { + "name": "Andean Textile Art Workshop", + "description": "Discover the vibrant world of Andean textiles with a hands-on workshop. Learn about traditional weaving techniques, natural dyes, and the cultural significance of these intricate textiles. Create your own small piece of art to take home as a unique souvenir.", + "locationName": "Local workshop or community center", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "salar-de-uyuni", + "ref": "andean-textile-art-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_andean-textile-art-workshop.jpg" + }, + { + "name": "Salt Flat ATV Adventure", + "description": "Embark on an exhilarating ATV adventure across the vast expanse of the Salar de Uyuni. Feel the wind in your hair as you zoom past unique rock formations, hidden lagoons, and endless white landscapes. This thrilling experience offers a unique perspective of the salt flats and is perfect for adrenaline seekers.", + "locationName": "Salar de Uyuni", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "salar-de-uyuni", + "ref": "salt-flat-atv-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_salt-flat-atv-adventure.jpg" + }, + { + "name": "Andean Astronomy Night", + "description": "Experience the magic of the Uyuni night sky with a guided astronomy tour. Far from city lights, the salt flats offer unparalleled views of the Milky Way and constellations. Learn about Andean astronomy, mythology, and the significance of the stars in the local culture. This activity is perfect for couples, families, and anyone seeking a unique and awe-inspiring experience.", + "locationName": "Salar de Uyuni", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "salar-de-uyuni", + "ref": "andean-astronomy-night", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_andean-astronomy-night.jpg" + }, + { + "name": "Traditional Salt Harvesting Experience", + "description": "Discover the ancient art of salt harvesting with a visit to a local salt mining community. Learn about the traditional methods used to extract salt from the flats and the cultural significance of this practice. Participate in the process, from breaking the salt crust to loading it onto trucks. This immersive experience offers a glimpse into the lives of the local people and their connection to the salt flats.", + "locationName": "Colchani Village", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "salar-de-uyuni", + "ref": "traditional-salt-harvesting-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_traditional-salt-harvesting-experience.jpg" + }, + { + "name": "Uyuni Photography Workshop", + "description": "Elevate your photography skills with a specialized workshop on the Salar de Uyuni. Learn about composition, lighting, and perspective from experienced photographers, capturing the unique beauty of the salt flats. This workshop is perfect for photography enthusiasts of all levels and will help you create stunning images to remember your trip.", + "locationName": "Salar de Uyuni", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "salar-de-uyuni", + "ref": "uyuni-photography-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_uyuni-photography-workshop.jpg" + }, + { + "name": "Andean Music and Dance Performance", + "description": "Immerse yourself in the vibrant culture of the Andes with a traditional music and dance performance. Enjoy the lively rhythms of local instruments and witness the colorful costumes and energetic dances. This cultural experience provides insight into the rich heritage of the region and is a perfect way to end a day on the salt flats.", + "locationName": "Uyuni Town", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "salar-de-uyuni", + "ref": "andean-music-and-dance-performance", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/salar-de-uyuni_andean-music-and-dance-performance.jpg" + }, + { + "name": "Explore Balboa Park", + "description": "Spend a day wandering through the beautiful Balboa Park, a cultural oasis with stunning gardens, museums, theaters, and the world-famous San Diego Zoo. Discover diverse plant life in the Botanical Building, marvel at Spanish Renaissance architecture, and enjoy street performances.", + "locationName": "Balboa Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-diego", + "ref": "explore-balboa-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_explore-balboa-park.jpg" + }, + { + "name": "Visit the San Diego Zoo", + "description": "Embark on a wildlife adventure at the renowned San Diego Zoo, home to over 3,500 animals from around the world. See giant pandas, koalas, elephants, and more in naturalistic habitats. Take a guided bus tour, ride the aerial tram, and enjoy educational shows.", + "locationName": "San Diego Zoo", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "san-diego", + "ref": "visit-the-san-diego-zoo", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_visit-the-san-diego-zoo.jpg" + }, + { + "name": "Relax on Coronado Island", + "description": "Escape to the picturesque Coronado Island, known for its pristine beaches, charming shops, and the iconic Hotel del Coronado. Sunbathe on the soft sand, try water sports like kayaking or paddleboarding, and enjoy a leisurely bike ride along the coast.", + "locationName": "Coronado Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-diego", + "ref": "relax-on-coronado-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_relax-on-coronado-island.jpg" + }, + { + "name": "Discover the Gaslamp Quarter", + "description": "Step back in time in the historic Gaslamp Quarter, a vibrant district with Victorian-era architecture, trendy restaurants, and lively nightlife. Explore art galleries, enjoy live music at a jazz bar, and experience the city's energetic atmosphere.", + "locationName": "Gaslamp Quarter", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 3, + "destinationRef": "san-diego", + "ref": "discover-the-gaslamp-quarter", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_discover-the-gaslamp-quarter.jpg" + }, + { + "name": "Catch a wave at La Jolla Shores", + "description": "Head to La Jolla Shores, a popular beach known for its gentle waves, making it perfect for beginner surfers and families. Take a surf lesson, rent a board, or simply relax on the sand and watch the surfers. Explore the nearby La Jolla Underwater Park for snorkeling and diving adventures.", + "locationName": "La Jolla Shores", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-diego", + "ref": "catch-a-wave-at-la-jolla-shores", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_catch-a-wave-at-la-jolla-shores.jpg" + }, + { + "name": "Kayak with Sea Lions in La Jolla Cove", + "description": "Embark on a guided kayaking tour of the La Jolla sea caves and ecological reserve. Paddle alongside playful sea lions, marvel at the dramatic cliffs, and discover hidden coves. This eco-friendly adventure offers stunning views and close encounters with marine life.", + "locationName": "La Jolla Cove", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "san-diego", + "ref": "kayak-with-sea-lions-in-la-jolla-cove", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_kayak-with-sea-lions-in-la-jolla-cove.jpg" + }, + { + "name": "Hike Torrey Pines State Natural Reserve", + "description": "Experience the breathtaking beauty of Torrey Pines State Natural Reserve, with its iconic sandstone cliffs overlooking the Pacific Ocean. Hike through trails offering panoramic ocean views, diverse plant life, and opportunities for bird watching. Choose from various trails suitable for different fitness levels.", + "locationName": "Torrey Pines State Natural Reserve", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "san-diego", + "ref": "hike-torrey-pines-state-natural-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_hike-torrey-pines-state-natural-reserve.jpg" + }, + { + "name": "Explore the San Diego Harbor by Boat", + "description": "Enjoy a scenic cruise or sailing adventure around San Diego Harbor. Admire the city skyline, the iconic Coronado Bridge, and naval ships. Opt for a sunset cruise with breathtaking views or a whale watching tour during migration season.", + "locationName": "San Diego Harbor", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "san-diego", + "ref": "explore-the-san-diego-harbor-by-boat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_explore-the-san-diego-harbor-by-boat.jpg" + }, + { + "name": "Catch a Show at the Old Globe Theatre", + "description": "Experience world-class theater at the Old Globe, renowned for its Shakespearean productions and Broadway-caliber shows. Choose from a variety of performances in different theaters, enjoying a captivating evening of entertainment in a beautiful setting.", + "locationName": "Old Globe Theatre", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "san-diego", + "ref": "catch-a-show-at-the-old-globe-theatre", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_catch-a-show-at-the-old-globe-theatre.jpg" + }, + { + "name": "Go tidepooling at Cabrillo National Monument", + "description": "Discover the fascinating world of tide pools at Cabrillo National Monument, where you can observe sea creatures like starfish, anemones, and crabs in their natural habitat. This educational and engaging activity is perfect for families and nature enthusiasts.", + "locationName": "Cabrillo National Monument", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-diego", + "ref": "go-tidepooling-at-cabrillo-national-monument", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_go-tidepooling-at-cabrillo-national-monument.jpg" + }, + { + "name": "Stroll through the San Diego Botanic Garden", + "description": "Immerse yourself in the beauty of diverse plant life at the San Diego Botanic Garden. Explore themed gardens, including a desert garden, a tropical rainforest, and a California native plant section. Enjoy a peaceful escape surrounded by nature's wonders.", + "locationName": "San Diego Botanic Garden", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "san-diego", + "ref": "stroll-through-the-san-diego-botanic-garden", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_stroll-through-the-san-diego-botanic-garden.jpg" + }, + { + "name": "Take a day trip to Julian", + "description": "Escape the city and venture into the charming mountain town of Julian. Known for its apple pies and historic gold mining past, Julian offers a delightful change of pace. Explore the town's shops, enjoy a slice of pie, and hike amidst scenic landscapes.", + "locationName": "Julian", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-diego", + "ref": "take-a-day-trip-to-julian", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_take-a-day-trip-to-julian.jpg" + }, + { + "name": "Visit the Birch Aquarium at Scripps", + "description": "Delve into the wonders of the underwater world at the Birch Aquarium at Scripps. Explore exhibits showcasing diverse marine life, learn about oceanographic research, and enjoy breathtaking views of the Pacific Ocean.", + "locationName": "Birch Aquarium at Scripps", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "san-diego", + "ref": "visit-the-birch-aquarium-at-scripps", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_visit-the-birch-aquarium-at-scripps.jpg" + }, + { + "name": "Embark on a Whale Watching Adventure", + "description": "Experience the thrill of witnessing majestic whales in their natural habitat on a whale watching excursion. San Diego is renowned as a prime location for spotting gray whales during their annual migration, as well as other whale species like humpbacks and blue whales. Join a guided tour and marvel at these gentle giants as they breach, spout, and swim alongside the boat.", + "locationName": "San Diego Harbor", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "san-diego", + "ref": "embark-on-a-whale-watching-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_embark-on-a-whale-watching-adventure.jpg" + }, + { + "name": "Indulge in a Craft Beer Tour", + "description": "Discover San Diego's thriving craft beer scene by embarking on a brewery tour. With numerous award-winning breweries scattered throughout the city, you can sample a wide variety of beers, from hoppy IPAs to rich stouts. Join a guided tour to learn about the brewing process, meet local brewers, and indulge in delicious beer tastings.", + "locationName": "Various breweries throughout San Diego", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 2, + "destinationRef": "san-diego", + "ref": "indulge-in-a-craft-beer-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_indulge-in-a-craft-beer-tour.jpg" + }, + { + "name": "Explore the Vibrant Neighborhoods", + "description": "Beyond the popular tourist spots, San Diego boasts diverse and charming neighborhoods, each with its unique character. Explore the historic streets of Old Town San Diego, experience the hipster vibes of North Park, or discover the artistic spirit of Barrio Logan. Each neighborhood offers a distinct atmosphere, local shops, restaurants, and cultural attractions.", + "locationName": "Various neighborhoods throughout San Diego", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "san-diego", + "ref": "explore-the-vibrant-neighborhoods", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_explore-the-vibrant-neighborhoods.jpg" + }, + { + "name": "Take a Day Trip to Tijuana, Mexico", + "description": "Just a short drive from San Diego lies Tijuana, Mexico, offering a vibrant cultural experience. Explore the bustling Avenida Revolución, sample authentic Mexican cuisine, discover local artisan crafts, and immerse yourself in the lively atmosphere of this border city.", + "locationName": "Tijuana, Mexico", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-diego", + "ref": "take-a-day-trip-to-tijuana-mexico", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_take-a-day-trip-to-tijuana-mexico.jpg" + }, + { + "name": "Go Hiking or Biking with Scenic Views", + "description": "San Diego offers numerous hiking and biking trails with breathtaking views. Explore the coastal trails of Torrey Pines State Natural Reserve, hike to the summit of Cowles Mountain for panoramic vistas, or bike along the scenic Mission Beach Boardwalk. Enjoy the fresh air, exercise, and stunning natural landscapes.", + "locationName": "Various trails throughout San Diego", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "san-diego", + "ref": "go-hiking-or-biking-with-scenic-views", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-diego_go-hiking-or-biking-with-scenic-views.jpg" + }, + { + "name": "Explore the Historic Centro", + "description": "Wander through the cobblestone streets of San Miguel's historic center, admiring the colonial architecture, vibrant colors, and charming atmosphere. Visit the iconic Parroquia de San Miguel Arcángel, a pink neo-Gothic church, and explore the many art galleries, boutiques, and cafes.", + "locationName": "Centro Histórico", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "san-miguel-de-allende", + "ref": "explore-the-historic-centro", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_explore-the-historic-centro.jpg" + }, + { + "name": "Immerse in Art and Culture", + "description": "San Miguel de Allende is an art lover's paradise. Visit the Fabrica La Aurora, a former textile factory turned art and design center, or explore the many art galleries showcasing works by local and international artists. Take an art class or workshop to unleash your creativity.", + "locationName": "Fabrica La Aurora, art galleries throughout the city", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-miguel-de-allende", + "ref": "immerse-in-art-and-culture", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_immerse-in-art-and-culture.jpg" + }, + { + "name": "Savor Culinary Delights", + "description": "Indulge in San Miguel's vibrant culinary scene. Sample traditional Mexican dishes at local restaurants, enjoy fine dining experiences with international flavors, or take a cooking class to learn the secrets of Mexican cuisine. Don't miss the opportunity to try the city's famous churros and mole.", + "locationName": "Various restaurants and cooking schools throughout the city", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "san-miguel-de-allende", + "ref": "savor-culinary-delights", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_savor-culinary-delights.jpg" + }, + { + "name": "Experience the Rooftop Views", + "description": "Enjoy breathtaking panoramic views of the city from one of San Miguel's many rooftop bars and restaurants. Sip on a margarita, admire the sunset over the colorful cityscape, and soak up the magical ambiance of this charming colonial city.", + "locationName": "Various rooftop venues throughout the city", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 3, + "destinationRef": "san-miguel-de-allende", + "ref": "experience-the-rooftop-views", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_experience-the-rooftop-views.jpg" + }, + { + "name": "Day Trip to the Sanctuary of Atotonilco", + "description": "Embark on a cultural excursion to the Sanctuary of Atotonilco, a UNESCO World Heritage site known as the 'Sistine Chapel of Mexico.' Admire the impressive murals and architecture of this 18th-century religious complex, and learn about its historical and spiritual significance.", + "locationName": "Sanctuary of Atotonilco", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-miguel-de-allende", + "ref": "day-trip-to-the-sanctuary-of-atotonilco", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_day-trip-to-the-sanctuary-of-atotonilco.jpg" + }, + { + "name": "Horseback Riding in the Countryside", + "description": "Embark on a scenic horseback riding adventure through the picturesque countryside surrounding San Miguel de Allende. Several ranches and tour operators offer guided horseback riding excursions, allowing you to explore the rolling hills, charming villages, and breathtaking landscapes of the region. Whether you're an experienced rider or a beginner, this activity provides a unique perspective and a chance to connect with nature.", + "locationName": "Countryside surrounding San Miguel de Allende", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "san-miguel-de-allende", + "ref": "horseback-riding-in-the-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_horseback-riding-in-the-countryside.jpg" + }, + { + "name": "Hot Air Balloon Ride over the City", + "description": "Experience the magic of San Miguel de Allende from a breathtaking perspective with a hot air balloon ride. Ascend into the sky and marvel at the panoramic views of the city's colonial architecture, colorful streets, and surrounding landscapes. Enjoy the tranquility of floating above the rooftops and capture unforgettable memories as the sun rises or sets.", + "locationName": "San Miguel de Allende", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "san-miguel-de-allende", + "ref": "hot-air-balloon-ride-over-the-city", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_hot-air-balloon-ride-over-the-city.jpg" + }, + { + "name": "Relax and Rejuvenate at a Spa", + "description": "Indulge in a pampering spa experience and rejuvenate your mind, body, and soul. San Miguel de Allende offers a variety of luxurious spas and wellness centers where you can enjoy a range of treatments, including massages, facials, body wraps, and hydrotherapy. Immerse yourself in a tranquil atmosphere and let the stresses of everyday life melt away.", + "locationName": "Various spas and wellness centers in San Miguel de Allende", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "san-miguel-de-allende", + "ref": "relax-and-rejuvenate-at-a-spa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_relax-and-rejuvenate-at-a-spa.jpg" + }, + { + "name": "Explore the Fabrica La Aurora", + "description": "Visit the Fabrica La Aurora, a former textile factory that has been transformed into a vibrant art and design center. Explore the various galleries, studios, and shops showcasing the works of local and international artists. Discover unique paintings, sculptures, jewelry, furniture, and more. The Fabrica La Aurora also features charming cafes and restaurants where you can enjoy a leisurely meal or a cup of coffee.", + "locationName": "Fabrica La Aurora", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-miguel-de-allende", + "ref": "explore-the-fabrica-la-aurora", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_explore-the-fabrica-la-aurora.jpg" + }, + { + "name": "Take a Cooking Class", + "description": "Immerse yourself in Mexican culinary culture by taking a cooking class. Learn how to prepare traditional dishes from local chefs, using fresh, regional ingredients. Discover the secrets of Mexican cuisine, from classic recipes to contemporary creations. Many cooking classes also include a visit to a local market to select ingredients and learn about Mexican culinary traditions.", + "locationName": "Various cooking schools and culinary centers in San Miguel de Allende", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "san-miguel-de-allende", + "ref": "take-a-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_take-a-cooking-class.jpg" + }, + { + "name": "Hiking in the Canyon", + "description": "Embark on a scenic hike through the breathtaking canyon just outside San Miguel de Allende. Explore the rugged trails, surrounded by stunning rock formations and panoramic views of the city. Keep an eye out for local flora and fauna along the way, and enjoy a picnic lunch amidst nature's beauty.", + "locationName": "Canyon outside San Miguel de Allende", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-miguel-de-allende", + "ref": "hiking-in-the-canyon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_hiking-in-the-canyon.jpg" + }, + { + "name": "Live Music at a Local Bar", + "description": "Immerse yourself in the vibrant nightlife of San Miguel de Allende by catching a live music performance at a local bar. From traditional Mexican folk music to contemporary jazz and blues, the city offers a diverse range of musical experiences to suit all tastes. Enjoy a margarita or local craft beer as you soak up the lively atmosphere.", + "locationName": "Various bars in San Miguel de Allende", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "san-miguel-de-allende", + "ref": "live-music-at-a-local-bar", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_live-music-at-a-local-bar.jpg" + }, + { + "name": "Visit the Botanical Garden", + "description": "Escape the hustle and bustle of the city with a visit to the serene Botanical Garden. Stroll through a diverse collection of cacti, succulents, and other native plants, and learn about the region's unique flora. Enjoy the peaceful ambiance and take in the stunning views of the surrounding landscape.", + "locationName": "El Charco del Ingenio Botanical Garden", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "san-miguel-de-allende", + "ref": "visit-the-botanical-garden", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_visit-the-botanical-garden.jpg" + }, + { + "name": "Shop for Unique Souvenirs", + "description": "Wander through the charming streets of San Miguel de Allende and discover a treasure trove of unique souvenirs. Browse the local artisan shops and art galleries, where you can find handcrafted jewelry, textiles, pottery, and other one-of-a-kind items. Take home a piece of Mexican culture and support local artists.", + "locationName": "Centro Histórico and surrounding areas", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "san-miguel-de-allende", + "ref": "shop-for-unique-souvenirs", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_shop-for-unique-souvenirs.jpg" + }, + { + "name": "Take a Day Trip to Guanajuato", + "description": "Embark on a day trip to the nearby city of Guanajuato, another UNESCO World Heritage site. Explore the colorful colonial architecture, visit the historic silver mines, and wander through the charming alleyways. Don't miss the opportunity to visit the iconic Callejon del Beso (Alley of the Kiss) and learn about its romantic legend.", + "locationName": "Guanajuato City", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "san-miguel-de-allende", + "ref": "take-a-day-trip-to-guanajuato", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_take-a-day-trip-to-guanajuato.jpg" + }, + { + "name": "Wine Tour in the Valley", + "description": "Embark on a delightful journey through the burgeoning wine region surrounding San Miguel de Allende. Visit local vineyards, sample exquisite wines, and learn about the unique terroir and winemaking techniques of the region. Enjoy breathtaking vineyard vistas and indulge in a gourmet picnic lunch amidst the rolling hills.", + "locationName": "San Miguel de Allende Valley", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "san-miguel-de-allende", + "ref": "wine-tour-in-the-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_wine-tour-in-the-valley.jpg" + }, + { + "name": "Charreada Experience", + "description": "Immerse yourself in Mexican culture with a thrilling Charreada, a traditional rodeo-like event. Witness skilled Charros showcase their horsemanship, roping skills, and daring stunts. Enjoy lively music, vibrant costumes, and authentic Mexican food for a truly unforgettable experience.", + "locationName": "Lienzo Charro", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-miguel-de-allende", + "ref": "charreada-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_charreada-experience.jpg" + }, + { + "name": "Temazcal Ritual", + "description": "Experience a traditional Temazcal ceremony, a pre-Hispanic sweat lodge ritual used for purification and healing. Enter a dome-shaped structure and participate in a guided ceremony involving heated volcanic rocks, herbal steam, and chanting. Emerge feeling refreshed, rejuvenated, and connected to ancient traditions.", + "locationName": "Various locations throughout the city", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "san-miguel-de-allende", + "ref": "temazcal-ritual", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_temazcal-ritual.jpg" + }, + { + "name": "Stargazing in the Desert", + "description": "Escape the city lights and venture into the surrounding desert for a magical stargazing experience. Join a guided tour led by an astronomy expert who will unveil the wonders of the night sky. Marvel at constellations, planets, and distant galaxies, and learn about the celestial stories and myths.", + "locationName": "San Miguel de Allende Desert", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-miguel-de-allende", + "ref": "stargazing-in-the-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_stargazing-in-the-desert.jpg" + }, + { + "name": "Parroquia de San Miguel Arcángel Light Show", + "description": "As the sun sets, witness the iconic Parroquia de San Miguel Arcángel come alive with a mesmerizing light show. The church's neo-Gothic facade is illuminated with vibrant colors and intricate patterns, creating a breathtaking spectacle that reflects the city's artistic spirit.", + "locationName": "Parroquia de San Miguel Arcángel", + "duration": 1, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "san-miguel-de-allende", + "ref": "parroquia-de-san-miguel-arc-ngel-light-show", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-miguel-de-allende_parroquia-de-san-miguel-arc-ngel-light-show.jpg" + }, + { + "name": "Pintxos Hopping in the Old Town", + "description": "Embark on a delightful culinary adventure through the charming streets of San Sebastian's Old Town. Sample an array of delicious pintxos, small bites typically served on bread, at various bars and restaurants. Each establishment boasts its own unique specialties, from classic combinations to innovative creations. Savor the flavors, soak up the lively atmosphere, and discover why San Sebastian is a food lover's paradise.", + "locationName": "Old Town", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-sebastian", + "ref": "pintxos-hopping-in-the-old-town", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_pintxos-hopping-in-the-old-town.jpg" + }, + { + "name": "Beach Bliss at La Concha", + "description": "Unwind on the golden sands of La Concha, one of the most beautiful urban beaches in Europe. Bask in the sun, take a refreshing dip in the turquoise waters, or simply stroll along the picturesque promenade. Rent a paddleboard or kayak for a fun water adventure. In the evening, enjoy a breathtaking sunset over the bay.", + "locationName": "La Concha Beach", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "san-sebastian", + "ref": "beach-bliss-at-la-concha", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_beach-bliss-at-la-concha.jpg" + }, + { + "name": "Hiking Mount Urgull for Panoramic Views", + "description": "Embark on a scenic hike up Mount Urgull, a historic hill overlooking the city. Ascend through lush greenery and discover remnants of ancient fortifications. Reach the summit and be rewarded with breathtaking panoramic views of San Sebastian, the bay, and the surrounding mountains. Visit the Mota Castle and the Sagrado Corazón statue for a dose of history and culture.", + "locationName": "Mount Urgull", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "san-sebastian", + "ref": "hiking-mount-urgull-for-panoramic-views", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_hiking-mount-urgull-for-panoramic-views.jpg" + }, + { + "name": "Michelin-Starred Culinary Experience", + "description": "Indulge in a world-class dining experience at one of San Sebastian's renowned Michelin-starred restaurants. Immerse yourself in the artistry of Basque cuisine as you savor exquisitely crafted dishes prepared with the finest local ingredients. Be captivated by the elegant ambiance, impeccable service, and innovative culinary creations that will tantalize your taste buds.", + "locationName": "Various Michelin-starred restaurants", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "san-sebastian", + "ref": "michelin-starred-culinary-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_michelin-starred-culinary-experience.jpg" + }, + { + "name": "Exploring the Charms of Santa Clara Island", + "description": "Take a boat trip to Santa Clara Island, a small island located in the middle of La Concha Bay. Relax on the island's secluded beach, swim in the crystal-clear waters, or hike to the top for panoramic views. Discover the island's lighthouse and small chapel, and enjoy a peaceful escape from the bustling city.", + "locationName": "Santa Clara Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-sebastian", + "ref": "exploring-the-charms-of-santa-clara-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_exploring-the-charms-of-santa-clara-island.jpg" + }, + { + "name": "Surfing at Zurriola Beach", + "description": "Catch some waves at Zurriola Beach, a haven for surfers of all levels. Rent a board and take a lesson, or simply watch the pros in action. The lively atmosphere and stunning coastal views make it a perfect spot to spend an active afternoon.", + "locationName": "Zurriola Beach", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-sebastian", + "ref": "surfing-at-zurriola-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_surfing-at-zurriola-beach.jpg" + }, + { + "name": "Kayaking or Stand Up Paddleboarding in La Concha Bay", + "description": "Enjoy a unique perspective of San Sebastian's coastline by kayaking or stand up paddleboarding in the calm waters of La Concha Bay. Glide past iconic landmarks like the Santa Clara Island and admire the elegant architecture of the city from the water. It's a relaxing and scenic way to experience the beauty of the bay.", + "locationName": "La Concha Bay", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "san-sebastian", + "ref": "kayaking-or-stand-up-paddleboarding-in-la-concha-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_kayaking-or-stand-up-paddleboarding-in-la-concha-bay.jpg" + }, + { + "name": "Exploring the Parte Vieja (Old Town)", + "description": "Get lost in the charming Parte Vieja, the historic heart of San Sebastian. Wander through narrow streets lined with traditional Basque buildings, discover hidden plazas, and pop into local shops and pintxos bars. Soak in the vibrant atmosphere and enjoy the architectural beauty of this historic district.", + "locationName": "Parte Vieja", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "san-sebastian", + "ref": "exploring-the-parte-vieja-old-town-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_exploring-the-parte-vieja-old-town-.jpg" + }, + { + "name": "Day Trip to the French Basque Country", + "description": "Embark on a day trip to the charming towns of the French Basque Country, such as Biarritz and Saint-Jean-de-Luz. Experience the unique culture and traditions of this region, indulge in delicious French cuisine, and explore the picturesque coastal landscapes. It's a perfect opportunity to discover the French side of the Basque Country.", + "locationName": "Biarritz and Saint-Jean-de-Luz", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "san-sebastian", + "ref": "day-trip-to-the-french-basque-country", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_day-trip-to-the-french-basque-country.jpg" + }, + { + "name": "Peine del Viento Sculptures and Paseo Nuevo", + "description": "Take a stroll along the Paseo Nuevo, a beautiful promenade offering breathtaking views of the Bay of Biscay. Admire the iconic Peine del Viento sculptures by Eduardo Chillida, a series of wind combs anchored to the rocks, and capture stunning photos of this unique art installation against the dramatic coastal backdrop.", + "locationName": "Paseo Nuevo", + "duration": 1, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "san-sebastian", + "ref": "peine-del-viento-sculptures-and-paseo-nuevo", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_peine-del-viento-sculptures-and-paseo-nuevo.jpg" + }, + { + "name": "Sunset Sailing on the Bay of Biscay", + "description": "Embark on a magical sunset sail along the stunning Bay of Biscay. As the sun dips below the horizon, painting the sky with vibrant hues, admire the city's coastline from a unique perspective. Enjoy the gentle sea breeze and the tranquility of the open water, perhaps even spotting dolphins playing in the waves.", + "locationName": "Bay of Biscay", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "san-sebastian", + "ref": "sunset-sailing-on-the-bay-of-biscay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_sunset-sailing-on-the-bay-of-biscay.jpg" + }, + { + "name": "Cider House Experience in the Countryside", + "description": "Venture into the picturesque Basque countryside to discover the tradition of cider houses. Enjoy a rustic feast of chorizo, cod omelet, and steak, all accompanied by free-flowing cider poured directly from enormous barrels. Immerse yourself in the lively atmosphere and local culture, often accompanied by live music and singing.", + "locationName": "Basque Countryside", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-sebastian", + "ref": "cider-house-experience-in-the-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_cider-house-experience-in-the-countryside.jpg" + }, + { + "name": "Time Travel at the San Telmo Museum", + "description": "Delve into the rich history and culture of the Basque region at the San Telmo Museum. Explore fascinating exhibits showcasing archaeological artifacts, traditional costumes, and artwork, spanning centuries of Basque heritage. Gain a deeper understanding of the unique identity and traditions of this captivating region.", + "locationName": "San Telmo Museum", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-sebastian", + "ref": "time-travel-at-the-san-telmo-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_time-travel-at-the-san-telmo-museum.jpg" + }, + { + "name": "Indulge in Sweet Treats at a Local Pastelería", + "description": "Satisfy your sweet tooth with a visit to one of San Sebastian's charming pastelerías. Delight in a variety of delectable pastries, cakes, and confections, all made with fresh, local ingredients. Savor the flavors of Basque gastronomy and experience the art of traditional baking.", + "locationName": "Various locations throughout the city", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "san-sebastian", + "ref": "indulge-in-sweet-treats-at-a-local-pasteler-a", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_indulge-in-sweet-treats-at-a-local-pasteler-a.jpg" + }, + { + "name": "Catch a Performance at the Victoria Eugenia Theatre", + "description": "Experience the magic of live performance at the historic Victoria Eugenia Theatre. Choose from a diverse program of plays, concerts, dance shows, and opera, showcasing local and international talent. Immerse yourself in the world of performing arts and enjoy a memorable evening in this architectural gem.", + "locationName": "Victoria Eugenia Theatre", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "san-sebastian", + "ref": "catch-a-performance-at-the-victoria-eugenia-theatre", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_catch-a-performance-at-the-victoria-eugenia-theatre.jpg" + }, + { + "name": "Monte Igueldo Funicular Ride and Amusement Park", + "description": "Embark on a nostalgic journey on the historic Monte Igueldo funicular, offering breathtaking panoramic views of the city and coastline. At the top, enjoy the charming amusement park with vintage rides, games, and a delightful atmosphere perfect for families and those seeking a touch of whimsy.", + "locationName": "Monte Igueldo", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-sebastian", + "ref": "monte-igueldo-funicular-ride-and-amusement-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_monte-igueldo-funicular-ride-and-amusement-park.jpg" + }, + { + "name": "Comb of the Wind and Ondarreta Beach Stroll", + "description": "Take a leisurely walk along the picturesque Paseo Nuevo, marveling at the iconic Comb of the Wind sculptures by Eduardo Chillida. Continue to the serene Ondarreta Beach, perfect for sunbathing, swimming, or simply enjoying the tranquil atmosphere. Unwind with a drink or meal at one of the charming beachfront cafes.", + "locationName": "Paseo Nuevo and Ondarreta Beach", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "san-sebastian", + "ref": "comb-of-the-wind-and-ondarreta-beach-stroll", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_comb-of-the-wind-and-ondarreta-beach-stroll.jpg" + }, + { + "name": "Aquarium and Naval Museum Exploration", + "description": "Dive into the fascinating underwater world at the San Sebastian Aquarium, home to diverse marine species and interactive exhibits. Adjacent to the aquarium, delve into the rich maritime history of the region at the Naval Museum, exploring historical artifacts and model ships.", + "locationName": "San Sebastian Aquarium and Naval Museum", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "san-sebastian", + "ref": "aquarium-and-naval-museum-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_aquarium-and-naval-museum-exploration.jpg" + }, + { + "name": "La Bretxa Market and Culinary Delights", + "description": "Immerse yourself in the vibrant atmosphere of La Bretxa Market, a bustling hub of local produce, fresh seafood, and artisanal products. Sample Basque cheeses, cured meats, and other regional specialties. Enjoy a delightful lunch at a nearby restaurant, savoring the authentic flavors of San Sebastian.", + "locationName": "La Bretxa Market", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "san-sebastian", + "ref": "la-bretxa-market-and-culinary-delights", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_la-bretxa-market-and-culinary-delights.jpg" + }, + { + "name": "Miramar Palace and Gardens", + "description": "Step back in time at the elegant Miramar Palace, a former royal summer residence boasting stunning architecture and picturesque gardens. Explore the palace grounds, enjoying panoramic views of the bay and surrounding landscapes. Pack a picnic or visit the nearby cafe for a delightful afternoon.", + "locationName": "Miramar Palace", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "san-sebastian", + "ref": "miramar-palace-and-gardens", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/san-sebastian_miramar-palace-and-gardens.jpg" + }, + { + "name": "Sunset Catamaran Cruise with Dinner and Drinks", + "description": "Embark on a romantic evening cruise aboard a catamaran, sailing along the caldera cliffs as the sun dips below the horizon. Indulge in a delicious dinner featuring local Greek specialties while enjoying breathtaking views of the Aegean Sea. The cruise also includes stops for swimming and snorkeling in secluded coves, allowing you to experience the beauty of the island from a unique perspective. As the sky transforms into a canvas of vibrant colors, raise a glass of Santorini's renowned wine and create unforgettable memories with your loved one.", + "locationName": "Ammoudi Bay", + "duration": 5, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "santorini", + "ref": "sunset-catamaran-cruise-with-dinner-and-drinks", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_sunset-catamaran-cruise-with-dinner-and-drinks.jpg" + }, + { + "name": "Explore the Ancient City of Akrotiri", + "description": "Step back in time and discover the fascinating ruins of Akrotiri, a Minoan Bronze Age settlement buried by volcanic ash thousands of years ago. Explore the remarkably preserved streets, houses, and frescoes that offer a glimpse into the daily life of this ancient civilization. Learn about the advanced culture and artistry of the Minoans and marvel at the engineering feats that allowed them to thrive on this volcanic island.", + "locationName": "Akrotiri Archaeological Site", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "santorini", + "ref": "explore-the-ancient-city-of-akrotiri", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_explore-the-ancient-city-of-akrotiri.jpg" + }, + { + "name": "Hike from Fira to Oia", + "description": "Embark on a scenic hike along the caldera rim, connecting the villages of Fira and Oia. The trail offers breathtaking panoramic views of the volcanic caldera, the Aegean Sea, and the iconic white-washed villages that cling to the cliffs. Along the way, you'll encounter charming churches, traditional houses, and hidden viewpoints. This moderate hike is a perfect way to immerse yourself in the beauty of Santorini's landscape and capture stunning photographs.", + "locationName": "Fira to Oia Trail", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "santorini", + "ref": "hike-from-fira-to-oia", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_hike-from-fira-to-oia.jpg" + }, + { + "name": "Relax on the Black Sand Beaches", + "description": "Escape to the unique black sand beaches of Santorini, formed by volcanic eruptions centuries ago. Perissa and Kamari beaches offer a vibrant atmosphere with beach clubs, water sports, and beachfront restaurants. For a more secluded experience, head to the Red Beach, known for its striking red cliffs and crystal-clear waters. Soak up the sun, swim in the Aegean Sea, and enjoy the contrast of the dark sand against the turquoise waters.", + "locationName": "Perissa, Kamari, or Red Beach", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "santorini", + "ref": "relax-on-the-black-sand-beaches", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_relax-on-the-black-sand-beaches.jpg" + }, + { + "name": "Santorini Wine Tour and Tasting", + "description": "Embark on a journey through Santorini's renowned winemaking tradition with a guided tour of local wineries. Discover the unique grape varieties that thrive in the island's volcanic soil and learn about the traditional winemaking methods. Sample a selection of Santorini's distinctive wines, including the crisp Assyrtiko, the sweet Vinsanto, and the full-bodied Nykteri. Enjoy the idyllic vineyard settings and gain insights into the island's rich viticulture heritage.", + "locationName": "Various wineries in Santorini", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "santorini", + "ref": "santorini-wine-tour-and-tasting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_santorini-wine-tour-and-tasting.jpg" + }, + { + "name": "Scuba Dive the Aegean Sea", + "description": "Delve into the crystal-clear waters of the Aegean Sea and discover a mesmerizing underwater world. Explore vibrant coral reefs, encounter fascinating marine life like octopuses and sea turtles, and swim through ancient shipwrecks. Several dive centers on the island cater to all levels, from beginners to experienced divers.", + "locationName": "Various dive sites around Santorini", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "santorini", + "ref": "scuba-dive-the-aegean-sea", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_scuba-dive-the-aegean-sea.jpg" + }, + { + "name": "Kayak to the Sea Caves of the Caldera", + "description": "Embark on a sea kayaking adventure along the dramatic caldera cliffs. Paddle through hidden sea caves, marvel at the volcanic rock formations, and enjoy breathtaking views of the Aegean Sea and the surrounding islands. This is a unique way to experience the beauty of Santorini from a different perspective.", + "locationName": "Caldera cliffs", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "santorini", + "ref": "kayak-to-the-sea-caves-of-the-caldera", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_kayak-to-the-sea-caves-of-the-caldera.jpg" + }, + { + "name": "Indulge in a Traditional Greek Cooking Class", + "description": "Immerse yourself in Greek culture by learning the secrets of traditional cuisine. Join a cooking class and master the art of preparing classic dishes like moussaka, souvlaki, and fresh Greek salad. Enjoy the fruits of your labor with a delicious meal accompanied by local wine.", + "locationName": "Various locations in Santorini", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "santorini", + "ref": "indulge-in-a-traditional-greek-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_indulge-in-a-traditional-greek-cooking-class.jpg" + }, + { + "name": "Explore the Picturesque Village of Oia at Night", + "description": "As the sun sets, wander through the charming village of Oia and witness its magical transformation. The whitewashed houses and blue-domed churches are bathed in a warm glow, creating a romantic and enchanting atmosphere. Enjoy dinner at a cliffside restaurant with panoramic views or simply stroll through the narrow streets and soak up the ambiance.", + "locationName": "Oia", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "santorini", + "ref": "explore-the-picturesque-village-of-oia-at-night", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_explore-the-picturesque-village-of-oia-at-night.jpg" + }, + { + "name": "Hike to the Profitis Ilias Monastery", + "description": "Embark on a rewarding hike to the highest point on Santorini, where the Profitis Ilias Monastery stands proudly. Enjoy panoramic views of the entire island, the caldera, and the Aegean Sea. The monastery itself offers a peaceful atmosphere and a glimpse into the island's religious heritage.", + "locationName": "Mount Profitis Ilias", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "santorini", + "ref": "hike-to-the-profitis-ilias-monastery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_hike-to-the-profitis-ilias-monastery.jpg" + }, + { + "name": "Horseback Riding through Volcanic Landscapes", + "description": "Embark on a unique adventure, exploring the captivating volcanic landscapes of Santorini on horseback. Traverse rugged trails, witness breathtaking caldera views, and discover hidden corners of the island inaccessible by other means. This activity is perfect for nature enthusiasts and adventure seekers looking for an unforgettable experience.", + "locationName": "Megalochori or Akrotiri", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "santorini", + "ref": "horseback-riding-through-volcanic-landscapes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_horseback-riding-through-volcanic-landscapes.jpg" + }, + { + "name": "Sunset Sailing with a Local Skipper", + "description": "Set sail on a private or small-group sailing excursion as the sun begins its descent, painting the sky with vibrant hues. Your local skipper will share insights about the island and its hidden gems while you glide across the Aegean Sea. Enjoy swimming, snorkeling, and a delightful meal on board, creating an unforgettable evening.", + "locationName": "Amoudi Bay or Vlychada Marina", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "santorini", + "ref": "sunset-sailing-with-a-local-skipper", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_sunset-sailing-with-a-local-skipper.jpg" + }, + { + "name": "Discover the Lost Atlantis Experience", + "description": "Embark on a captivating journey to the Lost Atlantis Experience Museum. Explore interactive exhibits, delve into the myth of Atlantis, and learn about the Minoan civilization that once thrived on Santorini. This immersive experience offers a unique blend of history, mythology, and entertainment for all ages.", + "locationName": "Megalochori", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "santorini", + "ref": "discover-the-lost-atlantis-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_discover-the-lost-atlantis-experience.jpg" + }, + { + "name": "Indulge in a Luxurious Spa Day", + "description": "Escape the hustle and bustle of everyday life and treat yourself to a rejuvenating spa experience. Numerous luxury spas on Santorini offer a variety of treatments inspired by local traditions and ingredients, such as volcanic mud masks and olive oil massages. Unwind, de-stress, and emerge feeling refreshed and revitalized.", + "locationName": "Various locations in Oia, Imerovigli, or Fira", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "santorini", + "ref": "indulge-in-a-luxurious-spa-day", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_indulge-in-a-luxurious-spa-day.jpg" + }, + { + "name": "Explore the Island's Charming Villages on an ATV Adventure", + "description": "Rent an ATV and embark on a thrilling adventure, exploring Santorini's charming villages and hidden corners at your own pace. Discover traditional architecture, local shops, and stunning viewpoints, venturing off the beaten path for a unique perspective of the island's beauty.", + "locationName": "Fira or Perissa", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "santorini", + "ref": "explore-the-island-s-charming-villages-on-an-atv-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_explore-the-island-s-charming-villages-on-an-atv-adventure.jpg" + }, + { + "name": "Visit the Museum of Prehistoric Thera", + "description": "Delve into Santorini's rich history at the Museum of Prehistoric Thera. Explore fascinating artifacts from the Minoan civilization, including frescoes, pottery, and tools, and gain insights into the island's ancient past. This indoor activity is perfect for a rainy day or a break from the sun, offering a captivating journey through time.", + "locationName": "Fira", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "santorini", + "ref": "visit-the-museum-of-prehistoric-thera", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_visit-the-museum-of-prehistoric-thera.jpg" + }, + { + "name": "Take a Cooking Class with a Local Family", + "description": "Immerse yourself in Greek culture and culinary traditions with a cooking class hosted by a local family. Learn the secrets of preparing authentic dishes like moussaka, souvlaki, and baklava, using fresh, local ingredients. Enjoy the fruits of your labor with a shared meal, creating lasting memories and a deeper connection with the island's people.", + "locationName": "Various locations", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "santorini", + "ref": "take-a-cooking-class-with-a-local-family", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_take-a-cooking-class-with-a-local-family.jpg" + }, + { + "name": "Go Cliff Jumping in Amoudi Bay", + "description": "For thrill-seekers, cliff jumping in Amoudi Bay is an exhilarating experience. Leap from rocky cliffs into the crystal-clear Aegean Sea, surrounded by stunning views of the caldera. This activity is best suited for adventurous travelers and strong swimmers, offering an adrenaline rush and unforgettable memories.", + "locationName": "Amoudi Bay", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 1, + "destinationRef": "santorini", + "ref": "go-cliff-jumping-in-amoudi-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_go-cliff-jumping-in-amoudi-bay.jpg" + }, + { + "name": "Shop for Unique Souvenirs in Oia", + "description": "Wander through the charming streets of Oia and discover a treasure trove of unique souvenirs. From handcrafted jewelry and ceramics to local artwork and textiles, find the perfect memento to remember your trip. Enjoy the vibrant atmosphere, browse through boutique shops, and support local artisans.", + "locationName": "Oia", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "santorini", + "ref": "shop-for-unique-souvenirs-in-oia", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_shop-for-unique-souvenirs-in-oia.jpg" + }, + { + "name": "Catch a Movie Under the Stars at the Open Air Cinema Kamari", + "description": "Experience a magical evening at the Open Air Cinema Kamari. Relax under the starry sky and enjoy a classic or contemporary film in a unique outdoor setting. This is a perfect way to unwind after a day of exploring, offering a romantic and memorable experience.", + "locationName": "Kamari", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "santorini", + "ref": "catch-a-movie-under-the-stars-at-the-open-air-cinema-kamari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/santorini_catch-a-movie-under-the-stars-at-the-open-air-cinema-kamari.jpg" + }, + { + "name": "Hike the Selvaggio Blu", + "description": "Embark on a challenging multi-day trek along the Selvaggio Blu, renowned as one of Europe's most demanding hiking trails. Traverse dramatic cliffs, hidden coves, and dense forests, while enjoying breathtaking coastal views.", + "locationName": "Eastern Coast of Sardinia", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "sardinia", + "ref": "hike-the-selvaggio-blu", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_hike-the-selvaggio-blu.jpg" + }, + { + "name": "Explore the Ruins of Nora", + "description": "Step back in time at the ancient Roman city of Nora. Wander through the remnants of temples, baths, and houses, and imagine life during the Roman Empire.", + "locationName": "Nora", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "sardinia", + "ref": "explore-the-ruins-of-nora", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_explore-the-ruins-of-nora.jpg" + }, + { + "name": "Relax on Cala Goloritzé Beach", + "description": "Unwind on the pristine sands of Cala Goloritzé, a secluded beach accessible only by boat or a challenging hike. Swim in crystal-clear turquoise waters, soak up the Mediterranean sun, and marvel at the towering limestone cliffs.", + "locationName": "Cala Goloritzé", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "sardinia", + "ref": "relax-on-cala-goloritz-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_relax-on-cala-goloritz-beach.jpg" + }, + { + "name": "Discover the Neptune's Grotto", + "description": "Embark on a boat tour to the Neptune's Grotto, a breathtaking cave system filled with stalactites, stalagmites, and an underground saltwater lake. Explore the illuminated chambers and marvel at the natural wonders.", + "locationName": "Alghero", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "sardinia", + "ref": "discover-the-neptune-s-grotto", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_discover-the-neptune-s-grotto.jpg" + }, + { + "name": "Indulge in Sardinian Cuisine", + "description": "Savor the flavors of Sardinia's unique cuisine. Sample local specialties such as pane carasau (crispy flatbread), fregola (pasta with clams), and porceddu (roast suckling pig). Pair your meal with a glass of Cannonau, a robust red wine.", + "locationName": "Various Restaurants", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "sardinia", + "ref": "indulge-in-sardinian-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_indulge-in-sardinian-cuisine.jpg" + }, + { + "name": "Go Caving in Is Zuddas Caves", + "description": "Embark on an underground adventure by exploring the Is Zuddas Caves, renowned for their impressive stalactites, stalagmites, and unique aragonite formations. Take a guided tour to delve into the depths of these geological wonders and learn about their fascinating history and formation.", + "locationName": "Is Zuddas Caves", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "sardinia", + "ref": "go-caving-in-is-zuddas-caves", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_go-caving-in-is-zuddas-caves.jpg" + }, + { + "name": "Sail the Archipelago of La Maddalena", + "description": "Set sail on a boat trip to the Archipelago of La Maddalena, a collection of stunning islands and islets boasting pristine beaches, crystal-clear waters, and secluded coves. Enjoy swimming, snorkeling, and sunbathing in this idyllic paradise.", + "locationName": "Archipelago of La Maddalena", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "sardinia", + "ref": "sail-the-archipelago-of-la-maddalena", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_sail-the-archipelago-of-la-maddalena.jpg" + }, + { + "name": "Visit the Nuraghe Su Nuraxi", + "description": "Step back in time at the Nuraghe Su Nuraxi, a UNESCO World Heritage Site and one of the most impressive examples of Nuragic civilization. Explore the complex of stone towers, dating back to the Bronze Age, and discover the island's ancient history and culture.", + "locationName": "Nuraghe Su Nuraxi", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "sardinia", + "ref": "visit-the-nuraghe-su-nuraxi", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_visit-the-nuraghe-su-nuraxi.jpg" + }, + { + "name": "Windsurf or Kitesurf on the Coast", + "description": "Embrace the wind and waves by trying windsurfing or kitesurfing along Sardinia's coast. With its consistent winds and beautiful beaches, the island offers ideal conditions for these exhilarating water sports. Take a lesson or rent equipment to experience the thrill of gliding across the water.", + "locationName": "Various beaches", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "sardinia", + "ref": "windsurf-or-kitesurf-on-the-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_windsurf-or-kitesurf-on-the-coast.jpg" + }, + { + "name": "Experience the Vibrant Nightlife of Cagliari", + "description": "As the sun sets, immerse yourself in the lively nightlife of Cagliari, the island's capital city. Explore the charming streets and squares, lined with bars, clubs, and restaurants. Enjoy live music, dancing, and socializing with locals and fellow travelers.", + "locationName": "Cagliari", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "sardinia", + "ref": "experience-the-vibrant-nightlife-of-cagliari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_experience-the-vibrant-nightlife-of-cagliari.jpg" + }, + { + "name": "Horseback Riding in Giara di Gesturi", + "description": "Embark on a unique horseback riding adventure through the Giara di Gesturi, a plateau known for its wild horses, stunning landscapes, and cork oak forests. This experience is perfect for nature lovers and adventure seekers, offering breathtaking views and a chance to connect with the island's wild side.", + "locationName": "Giara di Gesturi", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "sardinia", + "ref": "horseback-riding-in-giara-di-gesturi", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_horseback-riding-in-giara-di-gesturi.jpg" + }, + { + "name": "Delve into History at the National Archaeological Museum of Cagliari", + "description": "Step back in time at the National Archaeological Museum of Cagliari, home to a vast collection of artifacts from Sardinia's rich history. Explore exhibits showcasing prehistoric finds, Roman treasures, and Byzantine art, gaining insights into the island's fascinating past.", + "locationName": "Cagliari", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "sardinia", + "ref": "delve-into-history-at-the-national-archaeological-museum-of-cagliari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_delve-into-history-at-the-national-archaeological-museum-of-cagliari.jpg" + }, + { + "name": "Kayaking in the Gulf of Orosei", + "description": "Paddle through the crystal-clear waters of the Gulf of Orosei, exploring hidden coves, dramatic cliffs, and secluded beaches. Kayak along the coastline, discovering natural wonders like sea caves, rock formations, and diverse marine life. This activity is perfect for adventure seekers and nature enthusiasts.", + "locationName": "Gulf of Orosei", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "sardinia", + "ref": "kayaking-in-the-gulf-of-orosei", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_kayaking-in-the-gulf-of-orosei.jpg" + }, + { + "name": "Indulge in a Wine Tasting Tour", + "description": "Embark on a sensory journey through Sardinia's renowned wine regions. Visit local vineyards, learn about traditional winemaking techniques, and savor a variety of exquisite wines, from robust reds to crisp whites. This experience is perfect for wine enthusiasts and those seeking a taste of the island's cultural heritage.", + "locationName": "Various vineyards throughout Sardinia", + "duration": 5, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "sardinia", + "ref": "indulge-in-a-wine-tasting-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_indulge-in-a-wine-tasting-tour.jpg" + }, + { + "name": "Go Birdwatching in the Molentargius Saline Regional Park", + "description": "Discover a haven for birdwatchers at the Molentargius Saline Regional Park, a wetland area teeming with diverse avian species. Observe flamingos, herons, egrets, and other migratory birds in their natural habitat. This peaceful and educational experience is perfect for nature lovers and families.", + "locationName": "Molentargius Saline Regional Park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "sardinia", + "ref": "go-birdwatching-in-the-molentargius-saline-regional-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_go-birdwatching-in-the-molentargius-saline-regional-park.jpg" + }, + { + "name": "Scuba Dive in the Marine Protected Area of Tavolara", + "description": "Embark on an underwater adventure in the crystal-clear waters of the Tavolara Marine Protected Area. Discover a vibrant world of marine life, including colorful fish, octopuses, and even dolphins. Explore underwater caves and shipwrecks, and witness the beauty of Sardinia's marine ecosystem.", + "locationName": "Tavolara Island", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "sardinia", + "ref": "scuba-dive-in-the-marine-protected-area-of-tavolara", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_scuba-dive-in-the-marine-protected-area-of-tavolara.jpg" + }, + { + "name": "Take a Cooking Class and Learn to Make Traditional Sardinian Dishes", + "description": "Immerse yourself in Sardinian culture by participating in a hands-on cooking class. Learn the secrets of preparing authentic dishes like culurgiones (stuffed pasta), porceddu (roast suckling pig), and seadas (fried cheese pastries). Enjoy the fruits of your labor with a delicious meal accompanied by local wine.", + "locationName": "Various locations throughout Sardinia", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "sardinia", + "ref": "take-a-cooking-class-and-learn-to-make-traditional-sardinian-dishes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_take-a-cooking-class-and-learn-to-make-traditional-sardinian-dishes.jpg" + }, + { + "name": "Go Stargazing in the Supramonte Mountains", + "description": "Escape the city lights and venture into the Supramonte Mountains for an unforgettable stargazing experience. The remote location and clear skies offer breathtaking views of the Milky Way and constellations. Join a guided tour or find a secluded spot to marvel at the celestial wonders above.", + "locationName": "Supramonte Mountains", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "sardinia", + "ref": "go-stargazing-in-the-supramonte-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_go-stargazing-in-the-supramonte-mountains.jpg" + }, + { + "name": "Visit the Medieval Town of Castelsardo", + "description": "Step back in time with a visit to Castelsardo, a charming medieval town perched on a hilltop overlooking the sea. Explore the narrow cobblestone streets, admire the colorful houses, and visit the Castello dei Doria, a 12th-century castle with stunning views. Discover local artisan shops and enjoy fresh seafood at a waterfront restaurant.", + "locationName": "Castelsardo", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "sardinia", + "ref": "visit-the-medieval-town-of-castelsardo", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_visit-the-medieval-town-of-castelsardo.jpg" + }, + { + "name": "Take a Boat Trip to the Island of Asinara", + "description": "Embark on a boat trip to the Island of Asinara, a former prison island turned national park. Discover the island's unique history, observe the diverse wildlife, including wild albino donkeys, and relax on secluded beaches. Enjoy swimming, snorkeling, or simply soaking up the sun in this pristine natural environment.", + "locationName": "Asinara Island", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "sardinia", + "ref": "take-a-boat-trip-to-the-island-of-asinara", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sardinia_take-a-boat-trip-to-the-island-of-asinara.jpg" + }, + { + "name": "Hike the West Highland Way", + "description": "Embark on an epic journey through the Scottish Highlands, trekking the famous West Highland Way. This long-distance trail winds through breathtaking landscapes, from the shores of Loch Lomond to the foot of Ben Nevis, the UK's highest peak. Immerse yourself in the rugged beauty of the mountains, encounter charming villages, and witness the untamed wilderness of Scotland.", + "locationName": "Scottish Highlands", + "duration": 152, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "scotland", + "ref": "hike-the-west-highland-way", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_hike-the-west-highland-way.jpg" + }, + { + "name": "Explore Edinburgh Castle", + "description": "Step back in time with a visit to Edinburgh Castle, perched atop an extinct volcano overlooking the city. Delve into Scotland's rich history as you explore the castle's ancient walls, grand halls, and the Crown Jewels of Scotland. Enjoy panoramic views of Edinburgh and learn about the castle's fascinating role in Scottish history.", + "locationName": "Edinburgh", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "scotland", + "ref": "explore-edinburgh-castle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_explore-edinburgh-castle.jpg" + }, + { + "name": "Discover the Isle of Skye", + "description": "Escape to the enchanting Isle of Skye, renowned for its dramatic scenery, charming villages, and mythical legends. Hike to the Old Man of Storr, a towering rock formation, or visit the Fairy Pools, a series of crystal-clear waterfalls and pools. Explore the island's rich history and folklore, and soak in the magical atmosphere of this iconic Scottish destination.", + "locationName": "Isle of Skye", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "scotland", + "ref": "discover-the-isle-of-skye", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_discover-the-isle-of-skye.jpg" + }, + { + "name": "Visit a Scotch Whisky Distillery", + "description": "Embark on a sensory journey at a Scotch whisky distillery, where you can learn about the intricate process of making this iconic spirit. Tour the distillery, witness the craftsmanship behind each bottle, and indulge in a tasting session to savor the distinct flavors of Scotch whisky. Discover the history and heritage of this beloved Scottish tradition.", + "locationName": "Various locations", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "scotland", + "ref": "visit-a-scotch-whisky-distillery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_visit-a-scotch-whisky-distillery.jpg" + }, + { + "name": "Attend the Royal Edinburgh Military Tattoo", + "description": "Experience a spectacular display of music, dance, and military pageantry at the Royal Edinburgh Military Tattoo. Held annually on the esplanade of Edinburgh Castle, this world-renowned event features performances by military bands, cultural groups, and talented artists from around the globe. Be captivated by the vibrant colors, stirring music, and unforgettable atmosphere of this iconic Scottish tradition.", + "locationName": "Edinburgh Castle", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 4, + "destinationRef": "scotland", + "ref": "attend-the-royal-edinburgh-military-tattoo", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_attend-the-royal-edinburgh-military-tattoo.jpg" + }, + { + "name": "Go Nessie Hunting at Loch Ness", + "description": "Embark on a thrilling boat tour of the legendary Loch Ness, seeking a glimpse of the elusive Loch Ness Monster. Learn about the history and myths surrounding Nessie while enjoying the stunning scenery of the Scottish Highlands. Keep your eyes peeled for a mysterious ripple or a long, serpentine neck emerging from the depths!", + "locationName": "Loch Ness", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "scotland", + "ref": "go-nessie-hunting-at-loch-ness", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_go-nessie-hunting-at-loch-ness.jpg" + }, + { + "name": "Take a Scenic Drive on the North Coast 500", + "description": "Embark on an epic road trip along the North Coast 500, a 500-mile route that winds through the breathtaking landscapes of the Scottish Highlands. Discover hidden beaches, dramatic cliffs, charming villages, and ancient castles. Capture stunning photos at every turn and immerse yourself in the wild beauty of the north.", + "locationName": "North Coast 500", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "scotland", + "ref": "take-a-scenic-drive-on-the-north-coast-500", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_take-a-scenic-drive-on-the-north-coast-500.jpg" + }, + { + "name": "Visit the Magical Isle of Staffa", + "description": "Take a boat tour to the Isle of Staffa, a small, uninhabited island known for its unique geological formations. Explore Fingal's Cave, a sea cave with towering hexagonal basalt columns, and marvel at the island's diverse birdlife, including puffins and guillemots. This natural wonder is sure to leave you spellbound.", + "locationName": "Isle of Staffa", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "scotland", + "ref": "visit-the-magical-isle-of-staffa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_visit-the-magical-isle-of-staffa.jpg" + }, + { + "name": "Experience the Edinburgh Fringe Festival", + "description": "Immerse yourself in the world's largest arts festival, the Edinburgh Fringe Festival. With thousands of shows spanning theater, comedy, music, dance, and more, there's something for everyone. Enjoy the vibrant atmosphere, discover hidden gems, and be entertained by talented performers from around the globe.", + "locationName": "Edinburgh", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "scotland", + "ref": "experience-the-edinburgh-fringe-festival", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_experience-the-edinburgh-fringe-festival.jpg" + }, + { + "name": "Go on a Wildlife Safari in the Cairngorms National Park", + "description": "Embark on a wildlife safari adventure in the Cairngorms National Park, home to a diverse range of animals. Look out for red deer, golden eagles, ospreys, red squirrels, and more as you explore the stunning mountain landscapes. Learn about the park's conservation efforts and experience the thrill of encountering these magnificent creatures in their natural habitat.", + "locationName": "Cairngorms National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "scotland", + "ref": "go-on-a-wildlife-safari-in-the-cairngorms-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_go-on-a-wildlife-safari-in-the-cairngorms-national-park.jpg" + }, + { + "name": "Kayaking on Loch Lomond", + "description": "Embark on a serene kayaking adventure on the glistening waters of Loch Lomond, the largest freshwater lake in Great Britain. Paddle amidst stunning scenery, with majestic mountains as your backdrop and charming islands dotting the horizon. Keep an eye out for diverse wildlife, including ospreys soaring above and playful otters frolicking along the shores. Whether you're a seasoned paddler or a first-timer, kayaking on Loch Lomond offers a tranquil escape into nature's embrace.", + "locationName": "Loch Lomond", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "scotland", + "ref": "kayaking-on-loch-lomond", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_kayaking-on-loch-lomond.jpg" + }, + { + "name": "Step Back in Time at the Highland Folk Museum", + "description": "Immerse yourself in Scotland's rich history at the Highland Folk Museum, an open-air living history museum nestled amidst the scenic Cairngorms National Park. Explore authentic period buildings, from thatched cottages to traditional farmsteads, and encounter costumed interpreters who bring the past to life. Learn about ancient crafts, farming techniques, and the daily lives of Highland people through the centuries. It's an engaging and educational experience for all ages.", + "locationName": "Newtonmore", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "scotland", + "ref": "step-back-in-time-at-the-highland-folk-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_step-back-in-time-at-the-highland-folk-museum.jpg" + }, + { + "name": "Indulge in a Culinary Journey on a Food Tour", + "description": "Embark on a delectable food tour through Scotland's vibrant culinary scene. Sample fresh seafood delicacies in charming coastal towns, savor the rich flavors of traditional haggis, and indulge in artisanal cheeses and locally-sourced produce. Discover the secrets behind Scotland's renowned whisky production with a distillery visit and tasting. From Michelin-starred restaurants to cozy pubs, a food tour promises a tantalizing exploration of Scottish flavors.", + "locationName": "Various cities and regions", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "scotland", + "ref": "indulge-in-a-culinary-journey-on-a-food-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_indulge-in-a-culinary-journey-on-a-food-tour.jpg" + }, + { + "name": "Go Mountain Biking in the Scottish Highlands", + "description": "Experience the thrill of mountain biking amidst the breathtaking landscapes of the Scottish Highlands. Explore challenging trails with steep climbs and exhilarating descents, or opt for leisurely paths through rolling hills and alongside sparkling lochs. With diverse terrain and stunning scenery at every turn, mountain biking in the Highlands is an adventure that will get your adrenaline pumping and leave you with unforgettable memories.", + "locationName": "Scottish Highlands", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "scotland", + "ref": "go-mountain-biking-in-the-scottish-highlands", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_go-mountain-biking-in-the-scottish-highlands.jpg" + }, + { + "name": "Take a Boat Trip to Spot Marine Wildlife", + "description": "Embark on a thrilling boat trip along Scotland's rugged coastline to encounter an array of fascinating marine wildlife. Keep your eyes peeled for playful dolphins leaping through the waves, majestic whales breaching the surface, and adorable puffins perched on rocky cliffs. Experienced guides will share their knowledge about the local ecosystem and provide insights into the behaviors of these incredible creatures. It's a memorable experience for nature enthusiasts of all ages.", + "locationName": "Various coastal locations", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "scotland", + "ref": "take-a-boat-trip-to-spot-marine-wildlife", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_take-a-boat-trip-to-spot-marine-wildlife.jpg" + }, + { + "name": "Unwind at a Traditional Scottish Pub", + "description": "Experience the warm and inviting atmosphere of a traditional Scottish pub. Enjoy live folk music, sample local craft beers and whiskies, and mingle with friendly locals. Immerse yourself in the authentic Scottish culture and create unforgettable memories.", + "locationName": "Various pubs across Scotland", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "scotland", + "ref": "unwind-at-a-traditional-scottish-pub", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_unwind-at-a-traditional-scottish-pub.jpg" + }, + { + "name": "Go Golfing on a World-Renowned Course", + "description": "Scotland is the birthplace of golf, and the country boasts some of the most iconic golf courses in the world. Tee off amidst stunning landscapes and challenge yourself on historic greens. Whether you're a seasoned golfer or a beginner, a round of golf in Scotland is an unforgettable experience.", + "locationName": "St Andrews Old Course, Royal Dornoch Golf Club, Muirfield Village Golf Club", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "scotland", + "ref": "go-golfing-on-a-world-renowned-course", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_go-golfing-on-a-world-renowned-course.jpg" + }, + { + "name": "Explore the Ruins of Urquhart Castle", + "description": "Journey back in time as you explore the ruins of Urquhart Castle, perched on the banks of Loch Ness. Discover its rich history, from medieval times to its role in the Jacobite risings. Take in the breathtaking views of the loch and surrounding mountains, and imagine the lives of those who once called this castle home.", + "locationName": "Urquhart Castle, Loch Ness", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "scotland", + "ref": "explore-the-ruins-of-urquhart-castle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_explore-the-ruins-of-urquhart-castle.jpg" + }, + { + "name": "Take a Train Journey on the Jacobite Steam Train", + "description": "Embark on a magical journey through the Scottish Highlands aboard the Jacobite Steam Train, also known as the \"Hogwarts Express\" from the Harry Potter films. Traverse picturesque landscapes, cross the Glenfinnan Viaduct, and enjoy the nostalgic charm of steam travel. This scenic train ride is a must-do for Harry Potter fans and nature enthusiasts alike.", + "locationName": "Fort William to Mallaig", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "scotland", + "ref": "take-a-train-journey-on-the-jacobite-steam-train", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_take-a-train-journey-on-the-jacobite-steam-train.jpg" + }, + { + "name": "Visit the Kelvingrove Art Gallery and Museum", + "description": "Immerse yourself in art and culture at the Kelvingrove Art Gallery and Museum in Glasgow. Explore a diverse collection of exhibits, including natural history, arms and armor, and European and Scottish art. Admire masterpieces by renowned artists and discover fascinating artifacts from around the world.", + "locationName": "Kelvingrove Art Gallery and Museum, Glasgow", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "scotland", + "ref": "visit-the-kelvingrove-art-gallery-and-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scotland_visit-the-kelvingrove-art-gallery-and-museum.jpg" + }, + { + "name": "Hike Ben Nevis", + "description": "Embark on a challenging yet rewarding hike up Ben Nevis, the highest peak in the British Isles. Enjoy breathtaking panoramic views of the surrounding mountains and valleys, and feel a sense of accomplishment as you reach the summit.", + "locationName": "Ben Nevis", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "scottish-highlands", + "ref": "hike-ben-nevis", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_hike-ben-nevis.jpg" + }, + { + "name": "Explore Eilean Donan Castle", + "description": "Step back in time at Eilean Donan Castle, a picturesque fortress situated on a rocky islet at the meeting point of three sea lochs. Discover the castle's rich history, admire its stunning architecture, and take in the scenic surroundings.", + "locationName": "Eilean Donan Castle", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "scottish-highlands", + "ref": "explore-eilean-donan-castle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_explore-eilean-donan-castle.jpg" + }, + { + "name": "Visit a Whisky Distillery", + "description": "Immerse yourself in the world of Scotch whisky with a tour and tasting at a local distillery. Learn about the whisky-making process, from the selection of grains to the aging in oak casks, and sample a variety of single malts.", + "locationName": "Various distilleries", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "scottish-highlands", + "ref": "visit-a-whisky-distillery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_visit-a-whisky-distillery.jpg" + }, + { + "name": "Take a Scenic Drive on the North Coast 500", + "description": "Embark on a road trip along the North Coast 500, a breathtaking coastal route that winds its way through the Scottish Highlands. Discover hidden beaches, charming villages, and dramatic cliffs, and stop to admire the stunning scenery along the way.", + "locationName": "North Coast 500", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "scottish-highlands", + "ref": "take-a-scenic-drive-on-the-north-coast-500", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_take-a-scenic-drive-on-the-north-coast-500.jpg" + }, + { + "name": "Go Wildlife Watching in the Cairngorms National Park", + "description": "Explore the Cairngorms National Park, home to a diverse array of wildlife. Keep an eye out for red deer, golden eagles, ospreys, and other native species as you hike through the park's forests and mountains.", + "locationName": "Cairngorms National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "scottish-highlands", + "ref": "go-wildlife-watching-in-the-cairngorms-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_go-wildlife-watching-in-the-cairngorms-national-park.jpg" + }, + { + "name": "Kayaking on Loch Ness", + "description": "Embark on a serene kayaking adventure on the legendary Loch Ness. Paddle through the calm waters, surrounded by breathtaking mountain scenery, and keep an eye out for the mythical Loch Ness Monster. This is a fantastic way to experience the natural beauty of the Highlands and create unforgettable memories.", + "locationName": "Loch Ness", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "scottish-highlands", + "ref": "kayaking-on-loch-ness", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_kayaking-on-loch-ness.jpg" + }, + { + "name": "Stargazing in Galloway Forest Park", + "description": "Escape the city lights and immerse yourself in the wonders of the night sky at Galloway Forest Park, a designated Dark Sky Park. With minimal light pollution, the park offers exceptional stargazing opportunities. Join a guided tour or simply lie back and marvel at the constellations, planets, and the Milky Way.", + "locationName": "Galloway Forest Park", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "scottish-highlands", + "ref": "stargazing-in-galloway-forest-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_stargazing-in-galloway-forest-park.jpg" + }, + { + "name": "Mountain Biking in the Cairngorms", + "description": "Experience the thrill of mountain biking amidst the stunning landscapes of the Cairngorms National Park. With a variety of trails catering to different skill levels, you can choose your own adventure. Explore rugged mountain paths, dense forests, and picturesque valleys while enjoying the fresh air and breathtaking views.", + "locationName": "Cairngorms National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "scottish-highlands", + "ref": "mountain-biking-in-the-cairngorms", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_mountain-biking-in-the-cairngorms.jpg" + }, + { + "name": "Explore the Isle of Skye", + "description": "Embark on a captivating journey to the Isle of Skye, known for its dramatic landscapes, charming villages, and rich history. Visit the iconic Old Man of Storr, a towering rock formation, explore the magical Fairy Pools with their crystal-clear waters, and discover the historic Dunvegan Castle, the oldest continuously inhabited castle in Scotland.", + "locationName": "Isle of Skye", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "scottish-highlands", + "ref": "explore-the-isle-of-skye", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_explore-the-isle-of-skye.jpg" + }, + { + "name": "Attend the Highland Games", + "description": "Immerse yourself in Scottish culture at the Highland Games, a traditional sporting event featuring competitions in caber tossing, hammer throwing, and tug-of-war. Enjoy the lively atmosphere, bagpipe music, Highland dancing, and delicious local food. This is a unique opportunity to experience the spirit and heritage of the Highlands.", + "locationName": "Various locations throughout the Highlands", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "scottish-highlands", + "ref": "attend-the-highland-games", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_attend-the-highland-games.jpg" + }, + { + "name": "Discover the Mysteries of Loch Ness", + "description": "Embark on a captivating boat tour of the legendary Loch Ness, delving into the folklore and mystery surrounding the elusive Loch Ness Monster. Enjoy breathtaking views of the surrounding landscapes and learn about the history and ecology of this iconic Scottish loch.", + "locationName": "Loch Ness", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "scottish-highlands", + "ref": "discover-the-mysteries-of-loch-ness", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_discover-the-mysteries-of-loch-ness.jpg" + }, + { + "name": "Step Back in Time at Culloden Battlefield", + "description": "Visit the haunting Culloden Battlefield, site of the last Jacobite Rising in 1746. Explore the visitor center to learn about the battle's history and significance, walk the battlefield where the clans clashed, and pay respects at the memorial cairn.", + "locationName": "Culloden Battlefield", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "scottish-highlands", + "ref": "step-back-in-time-at-culloden-battlefield", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_step-back-in-time-at-culloden-battlefield.jpg" + }, + { + "name": "Indulge in a Culinary Journey", + "description": "Embark on a delectable food tour, savoring the finest Scottish cuisine. Sample fresh seafood, locally sourced meats, and traditional dishes like haggis, neeps, and tatties. Explore charming cafes, vibrant markets, and acclaimed restaurants, experiencing the unique flavors of the Highlands.", + "locationName": "Various locations", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "scottish-highlands", + "ref": "indulge-in-a-culinary-journey", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_indulge-in-a-culinary-journey.jpg" + }, + { + "name": "Go Salmon Fishing on the River Spey", + "description": "Experience the thrill of salmon fishing on the renowned River Spey, one of Scotland's premier fishing destinations. Cast your line amidst stunning scenery and try your hand at catching the 'King of Fish'. Whether you're a seasoned angler or a beginner, a day spent fishing on the Spey is an unforgettable experience.", + "locationName": "River Spey", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "scottish-highlands", + "ref": "go-salmon-fishing-on-the-river-spey", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_go-salmon-fishing-on-the-river-spey.jpg" + }, + { + "name": "Ride the Jacobite Steam Train", + "description": "Embark on a magical journey aboard the Jacobite Steam Train, also known as the 'Hogwarts Express'. Travel through breathtaking landscapes, crossing the iconic Glenfinnan Viaduct featured in the Harry Potter films. Immerse yourself in the nostalgic atmosphere and enjoy panoramic views of the Scottish countryside.", + "locationName": "Fort William to Mallaig", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "scottish-highlands", + "ref": "ride-the-jacobite-steam-train", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_ride-the-jacobite-steam-train.jpg" + }, + { + "name": "Go Canyoning or Gorge Walking", + "description": "Experience the thrill of canyoning or gorge walking in the Scottish Highlands. Plunge into crystal-clear pools, rappel down waterfalls, and navigate through stunning gorges. This adrenaline-pumping activity is perfect for adventure seekers and nature lovers alike.", + "locationName": "Various locations throughout the Highlands", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "scottish-highlands", + "ref": "go-canyoning-or-gorge-walking", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_go-canyoning-or-gorge-walking.jpg" + }, + { + "name": "Take a Boat Trip to Spot Marine Wildlife", + "description": "Embark on a boat trip and witness the incredible marine wildlife of the Scottish Highlands. Look out for seals, dolphins, whales, and a variety of seabirds as you cruise along the coastline or explore the islands. This activity is perfect for families and wildlife enthusiasts.", + "locationName": "Various locations along the coast", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "scottish-highlands", + "ref": "take-a-boat-trip-to-spot-marine-wildlife", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_take-a-boat-trip-to-spot-marine-wildlife.jpg" + }, + { + "name": "Visit Urquhart Castle", + "description": "Explore the ruins of Urquhart Castle, perched on the banks of Loch Ness. Discover its fascinating history dating back to the 13th century, admire the stunning views of the loch, and learn about the legendary Loch Ness Monster.", + "locationName": "Drumnadrochit", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "scottish-highlands", + "ref": "visit-urquhart-castle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_visit-urquhart-castle.jpg" + }, + { + "name": "Enjoy a Traditional Ceilidh", + "description": "Immerse yourself in Scottish culture by attending a traditional ceilidh. Dance the night away to lively folk music, enjoy the friendly atmosphere, and experience a true taste of Highland hospitality.", + "locationName": "Various towns and villages throughout the Highlands", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "scottish-highlands", + "ref": "enjoy-a-traditional-ceilidh", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_enjoy-a-traditional-ceilidh.jpg" + }, + { + "name": "Go Skiing or Snowboarding in the Cairngorms", + "description": "Hit the slopes of the Cairngorms National Park for a thrilling skiing or snowboarding adventure. With a variety of runs for all levels, stunning mountain scenery, and a lively après-ski scene, this is a perfect winter destination for snow sports enthusiasts.", + "locationName": "Cairngorm Mountain", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "scottish-highlands", + "ref": "go-skiing-or-snowboarding-in-the-cairngorms", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/scottish-highlands_go-skiing-or-snowboarding-in-the-cairngorms.jpg" + }, + { + "name": "Explore the Gyeongbokgung Palace", + "description": "Step back in time and immerse yourself in Korean history by visiting the magnificent Gyeongbokgung Palace, the largest and most stunning royal palace in Seoul. Stroll through the grand courtyards, admire the intricate architecture, and witness the changing of the guard ceremony for a glimpse into Korea's regal past. Don't forget to rent a hanbok (traditional Korean dress) for an even more immersive experience and stunning photos!", + "locationName": "Gyeongbokgung Palace", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "seoul", + "ref": "explore-the-gyeongbokgung-palace", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_explore-the-gyeongbokgung-palace.jpg" + }, + { + "name": "Discover the Bukchon Hanok Village", + "description": "Wander through the charming Bukchon Hanok Village, a historic neighborhood with traditional Korean houses (hanoks) dating back to the Joseon Dynasty. Get lost in the labyrinthine alleyways, admire the unique architecture, and pop into quaint tea houses and craft shops. This is a perfect opportunity to capture the essence of old Seoul and experience the city's cultural heritage.", + "locationName": "Bukchon Hanok Village", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "seoul", + "ref": "discover-the-bukchon-hanok-village", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_discover-the-bukchon-hanok-village.jpg" + }, + { + "name": "Indulge in Korean BBQ", + "description": "No trip to Seoul is complete without savoring the mouthwatering flavors of Korean BBQ. Head to the bustling district of Jongno or the trendy Gangnam area to find numerous BBQ restaurants offering a variety of marinated meats, banchan (side dishes), and dipping sauces. Gather your friends or family around a sizzling grill, cook your own food, and experience this quintessential Korean dining tradition.", + "locationName": "Jongno or Gangnam", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "seoul", + "ref": "indulge-in-korean-bbq", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_indulge-in-korean-bbq.jpg" + }, + { + "name": "Experience the Bustling Nightlife of Hongdae", + "description": "When the sun goes down, head to the vibrant district of Hongdae, known for its youthful energy, live music scene, and trendy bars. Catch a performance by up-and-coming indie bands, dance the night away at a club, or simply enjoy a drink with friends at a cozy pub. Hongdae offers a diverse range of nightlife options, ensuring an unforgettable evening.", + "locationName": "Hongdae", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "seoul", + "ref": "experience-the-bustling-nightlife-of-hongdae", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_experience-the-bustling-nightlife-of-hongdae.jpg" + }, + { + "name": "Shop till you drop in Myeongdong", + "description": "For a retail therapy fix, head to Myeongdong, a shopper's paradise with a plethora of stores offering everything from trendy fashion and cosmetics to K-pop merchandise and street food. Explore the bustling streets, discover local and international brands, and indulge in some serious shopping.", + "locationName": "Myeongdong", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "seoul", + "ref": "shop-till-you-drop-in-myeongdong", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_shop-till-you-drop-in-myeongdong.jpg" + }, + { + "name": "Hike to the Peak of Bukhansan National Park", + "description": "Escape the urban bustle and immerse yourself in nature with a hike through Bukhansan National Park. Choose from various trails catering to different fitness levels, leading you to breathtaking panoramic views of the city from the mountain's peak. Pack a picnic and enjoy a serene lunch amidst the stunning scenery.", + "locationName": "Bukhansan National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "seoul", + "ref": "hike-to-the-peak-of-bukhansan-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_hike-to-the-peak-of-bukhansan-national-park.jpg" + }, + { + "name": "Immerse in Korean Art at the Leeum Samsung Museum of Art", + "description": "Delve into the world of Korean art and culture at the renowned Leeum Samsung Museum of Art. Explore a diverse collection of traditional and contemporary works, spanning paintings, sculptures, and digital installations. The museum's unique architecture and serene atmosphere offer a captivating experience for art enthusiasts.", + "locationName": "Leeum Samsung Museum of Art", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "seoul", + "ref": "immerse-in-korean-art-at-the-leeum-samsung-museum-of-art", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_immerse-in-korean-art-at-the-leeum-samsung-museum-of-art.jpg" + }, + { + "name": "Cruise Along the Han River", + "description": "Embark on a relaxing cruise along the picturesque Han River and witness Seoul's skyline from a unique perspective. Enjoy stunning views of iconic landmarks, including the N Seoul Tower and the Banpo Bridge Rainbow Fountain Show. Opt for a romantic evening cruise or a family-friendly daytime excursion.", + "locationName": "Han River", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "seoul", + "ref": "cruise-along-the-han-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_cruise-along-the-han-river.jpg" + }, + { + "name": "Discover Serenity at Bongeunsa Temple", + "description": "Escape the city's hustle and bustle and find tranquility at the historic Bongeunsa Temple. Explore the temple's intricate architecture, participate in a traditional tea ceremony, or join a Templestay program for a deeper immersion into Korean Buddhism and culture.", + "locationName": "Bongeunsa Temple", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "seoul", + "ref": "discover-serenity-at-bongeunsa-temple", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_discover-serenity-at-bongeunsa-temple.jpg" + }, + { + "name": "Experience the Thrill of Lotte World", + "description": "Embark on an exciting adventure at Lotte World, a renowned amusement park featuring thrilling rides, enchanting parades, and a variety of entertainment options. Explore the indoor Adventure Park or experience the magic of the outdoor Magic Island. Lotte World offers fun for all ages, making it a perfect family-friendly destination.", + "locationName": "Lotte World", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "seoul", + "ref": "experience-the-thrill-of-lotte-world", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_experience-the-thrill-of-lotte-world.jpg" + }, + { + "name": "Stroll Through the Secret Garden", + "description": "Escape the urban bustle and discover the serene beauty of the Secret Garden, also known as Huwon, nestled within the Changdeokgung Palace complex. Explore hidden pavilions, lotus ponds, and landscaped gardens that offer a tranquil oasis in the heart of the city. This UNESCO World Heritage site provides a glimpse into the history and artistry of Korean landscape design.", + "locationName": "Changdeokgung Palace", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "seoul", + "ref": "stroll-through-the-secret-garden", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_stroll-through-the-secret-garden.jpg" + }, + { + "name": "Delve into Korean History at the National Museum", + "description": "Embark on a journey through Korea's rich history and cultural heritage at the National Museum of Korea. Explore extensive collections of artifacts, from ancient relics to contemporary art, showcasing the country's fascinating evolution. With interactive exhibits and diverse galleries, the museum offers a captivating experience for history buffs and curious minds alike.", + "locationName": "National Museum of Korea", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "seoul", + "ref": "delve-into-korean-history-at-the-national-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_delve-into-korean-history-at-the-national-museum.jpg" + }, + { + "name": "Unwind and Rejuvenate at a Traditional Korean Spa", + "description": "Indulge in a unique cultural experience and revitalize your body and mind at a traditional Korean spa, known as a jjimjilbang. Enjoy a variety of saunas, hot tubs, and therapeutic treatments, including body scrubs and massages. These 24-hour facilities often offer additional amenities like sleeping areas, restaurants, and entertainment, making it a perfect place to relax and unwind.", + "locationName": "Various jjimjilbangs throughout the city", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "seoul", + "ref": "unwind-and-rejuvenate-at-a-traditional-korean-spa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_unwind-and-rejuvenate-at-a-traditional-korean-spa.jpg" + }, + { + "name": "Wander Through the Colorful Ihwa Mural Village", + "description": "Step into a world of art and creativity at the Ihwa Mural Village. This once-declining neighborhood has been transformed into an open-air gallery with vibrant murals and art installations adorning the walls and streets. Explore the winding alleyways, capture Instagram-worthy photos, and discover hidden cafes and shops along the way.", + "locationName": "Ihwa Mural Village", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "seoul", + "ref": "wander-through-the-colorful-ihwa-mural-village", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_wander-through-the-colorful-ihwa-mural-village.jpg" + }, + { + "name": "Catch a Performance at the Korea House", + "description": "Immerse yourself in Korean culture with a captivating performance at the Korea House. Enjoy traditional music and dance shows, showcasing the elegance and vibrancy of Korean performing arts. The venue also offers cultural workshops and authentic Korean dining experiences, providing a comprehensive cultural immersion.", + "locationName": "Korea House", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "seoul", + "ref": "catch-a-performance-at-the-korea-house", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_catch-a-performance-at-the-korea-house.jpg" + }, + { + "name": "Explore the Trendy Gangnam District", + "description": "Immerse yourself in the upscale and trendy Gangnam district, known for its luxury boutiques, high-end restaurants, and vibrant nightlife. Discover the latest fashion trends, indulge in delicious cuisine, and experience the glamorous side of Seoul.", + "locationName": "Gangnam District", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "seoul", + "ref": "explore-the-trendy-gangnam-district", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_explore-the-trendy-gangnam-district.jpg" + }, + { + "name": "Visit the Demilitarized Zone (DMZ)", + "description": "Embark on a unique journey to the Demilitarized Zone (DMZ), the border between North and South Korea. Learn about the Korean War, witness the remnants of the conflict, and gain insights into the complex history of the peninsula.", + "locationName": "Demilitarized Zone (DMZ)", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 2, + "destinationRef": "seoul", + "ref": "visit-the-demilitarized-zone-dmz-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_visit-the-demilitarized-zone-dmz-.jpg" + }, + { + "name": "Go on a Culinary Adventure at Gwangjang Market", + "description": "Embark on a culinary adventure at Gwangjang Market, a bustling traditional market filled with an array of street food vendors and local delicacies. Sample authentic Korean dishes, from savory kimchi pancakes to sweet hotteok, and experience the vibrant atmosphere of this culinary paradise.", + "locationName": "Gwangjang Market", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "seoul", + "ref": "go-on-a-culinary-adventure-at-gwangjang-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_go-on-a-culinary-adventure-at-gwangjang-market.jpg" + }, + { + "name": "Enjoy Panoramic Views from N Seoul Tower", + "description": "Ascend to the top of N Seoul Tower, an iconic landmark offering breathtaking panoramic views of the city. Take in the stunning cityscape, enjoy romantic moments with your loved ones, and create lasting memories at this must-visit attraction.", + "locationName": "N Seoul Tower", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "seoul", + "ref": "enjoy-panoramic-views-from-n-seoul-tower", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_enjoy-panoramic-views-from-n-seoul-tower.jpg" + }, + { + "name": "Take a Day Trip to the UNESCO World Heritage Site of Suwon Hwaseong Fortress", + "description": "Embark on a day trip to Suwon Hwaseong Fortress, a UNESCO World Heritage Site renowned for its impressive architecture and historical significance. Explore the fortress walls, palaces, and temples, and delve into the rich history of the Joseon Dynasty.", + "locationName": "Suwon Hwaseong Fortress", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "seoul", + "ref": "take-a-day-trip-to-the-unesco-world-heritage-site-of-suwon-hwaseong-fortress", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seoul_take-a-day-trip-to-the-unesco-world-heritage-site-of-suwon-hwaseong-fortress.jpg" + }, + { + "name": "Witness the Great Migration", + "description": "Embark on an unforgettable safari experience to witness the awe-inspiring Great Migration, where millions of wildebeest, zebras, and other herbivores thunder across the plains in search of fresh grazing. Watch in amazement as they navigate treacherous river crossings, creating a spectacle of nature's raw power and determination. This iconic event offers exceptional wildlife viewing and photography opportunities.", + "locationName": "Serengeti National Park", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "serengeti-national-park", + "ref": "witness-the-great-migration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_witness-the-great-migration.jpg" + }, + { + "name": "Hot Air Balloon Safari", + "description": "Take to the skies in a hot air balloon and soar above the vast Serengeti plains at sunrise. Enjoy breathtaking panoramic views of the diverse landscapes, spot wildlife from a unique perspective, and capture stunning aerial photographs. This serene and unforgettable experience offers a different way to appreciate the beauty and grandeur of the Serengeti.", + "locationName": "Serengeti National Park", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "serengeti-national-park", + "ref": "hot-air-balloon-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_hot-air-balloon-safari.jpg" + }, + { + "name": "Game Drives and Wildlife Viewing", + "description": "Embark on thrilling game drives through the Serengeti's diverse ecosystems, accompanied by experienced guides. Encounter an array of wildlife, including lions, elephants, giraffes, leopards, cheetahs, and numerous bird species. Learn about their behavior, habitats, and the delicate balance of the ecosystem. Day and night game drives offer unique opportunities to observe nocturnal animals and predators on the hunt.", + "locationName": "Serengeti National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "serengeti-national-park", + "ref": "game-drives-and-wildlife-viewing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_game-drives-and-wildlife-viewing.jpg" + }, + { + "name": "Cultural Encounters with the Maasai People", + "description": "Immerse yourself in the rich culture and traditions of the Maasai people, who have lived in harmony with the Serengeti's wildlife for centuries. Visit a Maasai village, interact with the locals, and learn about their unique way of life, including their customs, dress, and traditional dances. Gain insights into their deep connection with the land and their knowledge of the natural world.", + "locationName": "Maasai Villages", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "serengeti-national-park", + "ref": "cultural-encounters-with-the-maasai-people", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_cultural-encounters-with-the-maasai-people.jpg" + }, + { + "name": "Bushwalking and Nature Trails", + "description": "For a more intimate experience with the Serengeti's landscapes, embark on guided bushwalks and nature trails. Explore the diverse flora and fauna, learn about medicinal plants, and discover hidden gems within the park. This activity allows you to connect with nature on a deeper level and appreciate the smaller details of the ecosystem.", + "locationName": "Serengeti National Park", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "serengeti-national-park", + "ref": "bushwalking-and-nature-trails", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_bushwalking-and-nature-trails.jpg" + }, + { + "name": "Birdwatching in the Serengeti", + "description": "Embark on a guided birdwatching tour to discover the rich avian diversity of the Serengeti. With over 500 bird species, including ostriches, secretary birds, and various raptors, the park offers a paradise for bird enthusiasts. Capture stunning photos and learn about the fascinating behaviors of these feathered creatures.", + "locationName": "Various locations within the park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "serengeti-national-park", + "ref": "birdwatching-in-the-serengeti", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_birdwatching-in-the-serengeti.jpg" + }, + { + "name": "Hot Air Balloon Safari at Dawn", + "description": "Experience the breathtaking beauty of the Serengeti from a unique perspective with a hot air balloon safari at dawn. As the sun rises over the vast plains, witness the spectacular landscape and observe wildlife from above. This unforgettable experience offers stunning panoramic views and a sense of tranquility.", + "locationName": "Designated launch sites within the park", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "serengeti-national-park", + "ref": "hot-air-balloon-safari-at-dawn", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_hot-air-balloon-safari-at-dawn.jpg" + }, + { + "name": "Photography Safari", + "description": "Join a specialized photography safari designed for both amateur and professional photographers. Capture incredible images of wildlife, landscapes, and the unique moments that unfold in the Serengeti. Learn valuable tips from experienced guides and create lasting memories through your lens.", + "locationName": "Various locations within the park", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "serengeti-national-park", + "ref": "photography-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_photography-safari.jpg" + }, + { + "name": "Stargazing in the Serengeti", + "description": "Escape the city lights and immerse yourself in the wonders of the night sky. Join a stargazing experience led by knowledgeable guides who will share insights about constellations, planets, and the Milky Way. Marvel at the brilliance of the stars and enjoy the tranquility of the African night.", + "locationName": "Designated areas away from light pollution", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "serengeti-national-park", + "ref": "stargazing-in-the-serengeti", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_stargazing-in-the-serengeti.jpg" + }, + { + "name": "Bush Dinner Under the Stars", + "description": "Indulge in a romantic and unforgettable bush dinner experience under the starlit sky. Enjoy a delicious meal prepared with local flavors, surrounded by the sights and sounds of the African wilderness. This intimate setting provides a unique opportunity to connect with nature and create lasting memories.", + "locationName": "Private campsites or lodges within the park", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 4, + "destinationRef": "serengeti-national-park", + "ref": "bush-dinner-under-the-stars", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_bush-dinner-under-the-stars.jpg" + }, + { + "name": "Visit the Serengeti Visitor Center", + "description": "Embark on an educational journey at the Serengeti Visitor Center, where interactive exhibits and informative displays delve into the park's diverse ecosystem, wildlife, and conservation efforts. Learn about the fascinating history of the Serengeti, the science behind the Great Migration, and the challenges faced by the park's inhabitants.", + "locationName": "Serengeti National Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "serengeti-national-park", + "ref": "visit-the-serengeti-visitor-center", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_visit-the-serengeti-visitor-center.jpg" + }, + { + "name": "Explore the Grumeti River", + "description": "Embark on a scenic boat trip along the Grumeti River, a haven for wildlife and a prime location to witness crocodiles basking on the banks, hippos wallowing in the water, and a variety of bird species soaring overhead. Keep an eye out for elephants, giraffes, and other animals that come to the river to quench their thirst.", + "locationName": "Grumeti River", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "serengeti-national-park", + "ref": "explore-the-grumeti-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_explore-the-grumeti-river.jpg" + }, + { + "name": "Visit a Maasai Village", + "description": "Immerse yourself in the rich culture of the Maasai people by visiting a traditional Maasai village. Engage with the locals, learn about their customs and traditions, witness their vibrant dances, and admire their intricate beadwork and craftsmanship. This cultural encounter offers a unique opportunity to gain insights into the Maasai way of life.", + "locationName": "Maasai Village", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "serengeti-national-park", + "ref": "visit-a-maasai-village", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_visit-a-maasai-village.jpg" + }, + { + "name": "Go on a Walking Safari", + "description": "For a more intimate wildlife experience, embark on a guided walking safari with an experienced ranger. Explore the Serengeti's diverse landscapes on foot, getting closer to nature and observing smaller creatures, plants, and tracks that might be missed on a traditional game drive. This adventurous activity allows you to connect with the Serengeti's ecosystem on a deeper level.", + "locationName": "Serengeti National Park", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "serengeti-national-park", + "ref": "go-on-a-walking-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_go-on-a-walking-safari.jpg" + }, + { + "name": "Enjoy a Sundowner Cocktail", + "description": "As the sun begins its descent, indulge in a relaxing sundowner experience amidst the breathtaking scenery of the Serengeti. Sip on a refreshing cocktail or a glass of wine while witnessing the vibrant colors of the African sunset paint the sky. This tranquil moment allows you to reflect on the day's adventures and appreciate the beauty of the natural surroundings.", + "locationName": "Serengeti National Park", + "duration": 1, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "serengeti-national-park", + "ref": "enjoy-a-sundowner-cocktail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_enjoy-a-sundowner-cocktail.jpg" + }, + { + "name": "Horseback Riding Safari", + "description": "Experience the thrill of exploring the Serengeti plains on horseback, getting up close to wildlife while enjoying the freedom and serenity of this unique mode of transport. Skilled guides will lead you through diverse landscapes, allowing you to observe animals in their natural habitat from a different perspective.", + "locationName": "Serengeti National Park", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "serengeti-national-park", + "ref": "horseback-riding-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_horseback-riding-safari.jpg" + }, + { + "name": "Off-Road Adventure to the Gol Mountains", + "description": "Embark on an exhilarating off-road adventure to the remote Gol Mountains, located on the park's eastern edge. Discover hidden waterfalls, ancient rock paintings, and breathtaking panoramic views of the Serengeti plains. This rugged journey offers a unique perspective of the park's diverse ecosystem.", + "locationName": "Gol Mountains", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "serengeti-national-park", + "ref": "off-road-adventure-to-the-gol-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_off-road-adventure-to-the-gol-mountains.jpg" + }, + { + "name": "Nighttime Wildlife Safari", + "description": "Venture into the Serengeti under the cover of darkness on a thrilling nighttime wildlife safari. Equipped with spotlights, you'll have the opportunity to witness the nocturnal behavior of animals rarely seen during the day, including predators on the hunt and elusive creatures like aardvarks and bushbabies.", + "locationName": "Serengeti National Park", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 4, + "destinationRef": "serengeti-national-park", + "ref": "nighttime-wildlife-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_nighttime-wildlife-safari.jpg" + }, + { + "name": "Learn Bushcraft and Survival Skills", + "description": "Immerse yourself in the wilderness and learn essential bushcraft and survival skills from experienced guides. Discover how to identify edible plants, build a fire, navigate using the stars, and create basic shelters. This hands-on experience will connect you with nature and equip you with valuable knowledge for future adventures.", + "locationName": "Serengeti National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "serengeti-national-park", + "ref": "learn-bushcraft-and-survival-skills", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_learn-bushcraft-and-survival-skills.jpg" + }, + { + "name": "Volunteer at a Wildlife Conservation Project", + "description": "Contribute to the preservation of the Serengeti ecosystem by volunteering at a wildlife conservation project. Opportunities may include assisting with animal monitoring, habitat restoration, community outreach, or anti-poaching initiatives. This immersive experience allows you to make a positive impact while gaining insights into the challenges and rewards of conservation work.", + "locationName": "Serengeti National Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "serengeti-national-park", + "ref": "volunteer-at-a-wildlife-conservation-project", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/serengeti-national-park_volunteer-at-a-wildlife-conservation-project.jpg" + }, + { + "name": "Explore the Alcázar Palace", + "description": "Step back in time at the Alcázar, a magnificent Moorish palace with stunning architecture, lush gardens, and captivating history. Explore the intricate courtyards, admire the ornate tilework, and immerse yourself in the royal ambiance of this UNESCO World Heritage Site.", + "locationName": "Alcázar of Seville", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "seville", + "ref": "explore-the-alc-zar-palace", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_explore-the-alc-zar-palace.jpg" + }, + { + "name": "Experience the Passion of Flamenco", + "description": "Witness the soul-stirring art of flamenco in a traditional tablao. Be mesmerized by the passionate dance moves, vibrant costumes, and rhythmic music that embodies the spirit of Andalusian culture. Feel the energy and emotion as the dancers and musicians create an unforgettable spectacle.", + "locationName": "Museo del Baile Flamenco or Tablao El Arenal", + "duration": 1.5, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "seville", + "ref": "experience-the-passion-of-flamenco", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_experience-the-passion-of-flamenco.jpg" + }, + { + "name": "Wander Through the Santa Cruz District", + "description": "Get lost in the enchanting maze of narrow streets and charming squares in the Santa Cruz district, the historic Jewish quarter. Discover hidden patios, admire the whitewashed houses adorned with colorful flowers, and soak up the vibrant atmosphere. Enjoy tapas at a local bar and experience the authentic Sevillian lifestyle.", + "locationName": "Santa Cruz district", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "seville", + "ref": "wander-through-the-santa-cruz-district", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_wander-through-the-santa-cruz-district.jpg" + }, + { + "name": "Indulge in a Tapas Crawl", + "description": "Embark on a culinary adventure through Seville's tapas scene. Hop from bar to bar, savoring a variety of small plates bursting with flavors. From classic tapas like patatas bravas and jamón ibérico to innovative creations, experience the city's gastronomic delights and lively atmosphere.", + "locationName": "Various tapas bars in Seville", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "seville", + "ref": "indulge-in-a-tapas-crawl", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_indulge-in-a-tapas-crawl.jpg" + }, + { + "name": "Cruise Along the Guadalquivir River", + "description": "Enjoy a relaxing boat trip along the Guadalquivir River, admiring Seville's iconic landmarks from a different perspective. See the Torre del Oro, the Triana Bridge, and the Plaza de Toros de la Maestranza as you glide along the water, soaking up the scenic views and gentle breeze.", + "locationName": "Guadalquivir River", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "seville", + "ref": "cruise-along-the-guadalquivir-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_cruise-along-the-guadalquivir-river.jpg" + }, + { + "name": "Bike Tour Through Seville's Charms", + "description": "Embark on a leisurely bike tour through Seville's charming streets and hidden corners. Discover local life, historical landmarks, and picturesque squares at your own pace. This family-friendly activity is a fantastic way to see the city from a different perspective and enjoy the fresh air.", + "locationName": "Seville City Center", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "seville", + "ref": "bike-tour-through-seville-s-charms", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_bike-tour-through-seville-s-charms.jpg" + }, + { + "name": "Explore the Metropol Parasol", + "description": "Ascend the Metropol Parasol, a modern wooden structure offering breathtaking panoramic views of Seville. Wander along its elevated walkways, admire the unique architecture, and capture stunning photos of the cityscape below. Enjoy a drink or a meal at the rooftop restaurant for a truly memorable experience.", + "locationName": "Metropol Parasol", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "seville", + "ref": "explore-the-metropol-parasol", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_explore-the-metropol-parasol.jpg" + }, + { + "name": "Shop at the Seville Flea Market", + "description": "Immerse yourself in the vibrant atmosphere of the Seville Flea Market (El Jueves). Browse through a treasure trove of antiques, vintage clothing, handcrafted souvenirs, and unique local finds. This bustling market offers a glimpse into Seville's culture and is a paradise for bargain hunters.", + "locationName": "Calle Feria", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "seville", + "ref": "shop-at-the-seville-flea-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_shop-at-the-seville-flea-market.jpg" + }, + { + "name": "Catch a Show at the Maestranza Bullring", + "description": "Experience the thrill and artistry of a traditional bullfight at the Maestranza Bullring, one of the oldest and most renowned bullrings in Spain. Witness the skill of the matadors and the pageantry of this cultural spectacle. Please note that opinions on bullfighting vary, and it may not be suitable for all audiences.", + "locationName": "Real Maestranza Bullring", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "seville", + "ref": "catch-a-show-at-the-maestranza-bullring", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_catch-a-show-at-the-maestranza-bullring.jpg" + }, + { + "name": "Relax at Maria Luisa Park", + "description": "Escape the city bustle and unwind in the tranquil Maria Luisa Park. Stroll through its beautiful gardens, admire the fountains and monuments, and rent a boat for a relaxing ride on the lake. This expansive green space is perfect for picnics, leisurely walks, and enjoying the serene atmosphere.", + "locationName": "Maria Luisa Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "seville", + "ref": "relax-at-maria-luisa-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_relax-at-maria-luisa-park.jpg" + }, + { + "name": "Day Trip to Cordoba", + "description": "Embark on a captivating journey to the historical city of Cordoba, a UNESCO World Heritage Site. Explore the Mezquita, a magnificent mosque-cathedral showcasing a captivating blend of Islamic and Christian architecture. Stroll through the enchanting Jewish Quarter with its narrow streets and charming patios, and immerse yourself in the rich cultural tapestry of this ancient city.", + "locationName": "Cordoba", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "seville", + "ref": "day-trip-to-cordoba", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_day-trip-to-cordoba.jpg" + }, + { + "name": "Kayaking on the Guadalquivir River", + "description": "Experience Seville from a different perspective with a thrilling kayaking adventure on the Guadalquivir River. Paddle along the picturesque waterway, passing iconic landmarks and enjoying the refreshing breeze. This unique activity offers a blend of exercise, sightseeing, and a chance to connect with nature.", + "locationName": "Guadalquivir River", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "seville", + "ref": "kayaking-on-the-guadalquivir-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_kayaking-on-the-guadalquivir-river.jpg" + }, + { + "name": "Flamenco Dance Class", + "description": "Immerse yourself in the passionate world of flamenco with an engaging dance class. Learn the basic steps and rhythms of this traditional Spanish art form from experienced instructors. Whether you're a beginner or have some dance experience, this activity offers a fun and cultural way to connect with the soul of Seville.", + "locationName": "Various dance studios throughout Seville", + "duration": 1.5, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "seville", + "ref": "flamenco-dance-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_flamenco-dance-class.jpg" + }, + { + "name": "Rooftop Bar Hopping", + "description": "Savor stunning panoramic views of Seville while enjoying the city's vibrant nightlife scene. Embark on a rooftop bar hopping adventure, discovering hidden gems and popular hotspots with breathtaking vistas. Sip on delicious cocktails, soak in the lively atmosphere, and create unforgettable memories under the starry sky.", + "locationName": "Various rooftop bars throughout Seville", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "seville", + "ref": "rooftop-bar-hopping", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_rooftop-bar-hopping.jpg" + }, + { + "name": "Cooking Class", + "description": "Delve into the culinary delights of Seville with a hands-on cooking class. Learn the secrets of traditional Andalusian cuisine from local chefs, mastering the art of preparing tapas, paella, or other regional specialties. This immersive experience allows you to bring a taste of Seville home with you.", + "locationName": "Various cooking schools throughout Seville", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 4, + "destinationRef": "seville", + "ref": "cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_cooking-class.jpg" + }, + { + "name": "Horse-Drawn Carriage Ride", + "description": "Indulge in a romantic and leisurely horse-drawn carriage ride through the enchanting streets of Seville. Discover hidden corners, admire iconic landmarks, and experience the city's charm in a unique and unforgettable way.", + "locationName": "Seville City Center", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "seville", + "ref": "horse-drawn-carriage-ride", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_horse-drawn-carriage-ride.jpg" + }, + { + "name": "Museo del Baile Flamenco", + "description": "Immerse yourself in the passionate world of flamenco at the Museo del Baile Flamenco. Explore the history, artistry, and cultural significance of this captivating dance form through exhibits, live performances, and interactive displays.", + "locationName": "Museo del Baile Flamenco", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "seville", + "ref": "museo-del-baile-flamenco", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_museo-del-baile-flamenco.jpg" + }, + { + "name": "Triana Market", + "description": "Step into the vibrant atmosphere of the Triana Market, a local gem bursting with colors, aromas, and flavors. Browse stalls overflowing with fresh produce, regional specialties, and handcrafted souvenirs, and immerse yourself in the authentic Sevillian way of life.", + "locationName": "Triana neighborhood", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "seville", + "ref": "triana-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_triana-market.jpg" + }, + { + "name": "Plaza de Toros de la Maestranza Tour", + "description": "Delve into the history and tradition of bullfighting with a guided tour of the Plaza de Toros de la Maestranza. Explore the bullring's museum, learn about the art of bullfighting, and step onto the hallowed sands of the arena where legendary matadors have faced their challenges.", + "locationName": "Plaza de Toros de la Maestranza", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "seville", + "ref": "plaza-de-toros-de-la-maestranza-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_plaza-de-toros-de-la-maestranza-tour.jpg" + }, + { + "name": "Arab Baths Experience", + "description": "Escape the bustling city and indulge in a rejuvenating experience at a traditional Arab bath. Immerse yourself in the soothing waters, enjoy a relaxing massage, and step back in time to the era of Moorish luxury and tranquility.", + "locationName": "Aire de Sevilla", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "seville", + "ref": "arab-baths-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/seville_arab-baths-experience.jpg" + }, + { + "name": "Gardens by the Bay", + "description": "Immerse yourself in the futuristic beauty of Gardens by the Bay, a stunning nature park with iconic Supertrees, diverse plant life, and breathtaking waterfront views. Explore the Flower Dome, Cloud Forest, and OCBC Skyway for a unique and unforgettable experience.", + "locationName": "Gardens by the Bay", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "singapore", + "ref": "gardens-by-the-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_gardens-by-the-bay.jpg" + }, + { + "name": "Hawker Center Food Tour", + "description": "Embark on a culinary adventure through Singapore's renowned hawker centers. Sample a variety of delicious and affordable local dishes, from Hainanese chicken rice to chili crab, and experience the vibrant atmosphere of these bustling food havens.", + "locationName": "Various hawker centers", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "singapore", + "ref": "hawker-center-food-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_hawker-center-food-tour.jpg" + }, + { + "name": "Sentosa Island Escape", + "description": "Escape to the island resort of Sentosa and enjoy a day of fun and relaxation. Relax on pristine beaches, experience thrilling rides at Universal Studios Singapore, or explore the S.E.A Aquarium, home to a diverse array of marine life.", + "locationName": "Sentosa Island", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "singapore", + "ref": "sentosa-island-escape", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_sentosa-island-escape.jpg" + }, + { + "name": "Little India Exploration", + "description": "Step into the vibrant neighborhood of Little India and experience a sensory feast. Wander through colorful streets, admire ornate temples, and discover authentic Indian cuisine, spices, and textiles.", + "locationName": "Little India", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "singapore", + "ref": "little-india-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_little-india-exploration.jpg" + }, + { + "name": "Singapore River Cruise", + "description": "Take a scenic cruise along the Singapore River and admire the city's iconic landmarks from a unique perspective. Enjoy stunning views of Marina Bay Sands, Merlion Park, and the colonial district while learning about Singapore's history and culture.", + "locationName": "Singapore River", + "duration": 1, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "singapore", + "ref": "singapore-river-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_singapore-river-cruise.jpg" + }, + { + "name": "Night Safari Adventure", + "description": "Embark on a thrilling tram ride through the world's first nocturnal wildlife park, encountering over 2,500 animals from around the globe in their natural habitats. Witness the magic of the jungle come alive under the starry sky as you observe fascinating creatures like lions, tigers, elephants, and more.", + "locationName": "Night Safari Singapore", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "singapore", + "ref": "night-safari-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_night-safari-adventure.jpg" + }, + { + "name": "Peranakan Museum Exploration", + "description": "Delve into the rich heritage of the Peranakan community, descendants of Chinese immigrants who settled in Southeast Asia centuries ago. Admire intricate artifacts, textiles, and jewelry, and learn about their unique cultural traditions, cuisine, and language.", + "locationName": "Peranakan Museum", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "singapore", + "ref": "peranakan-museum-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_peranakan-museum-exploration.jpg" + }, + { + "name": "Chinatown Walking Tour", + "description": "Immerse yourself in the vibrant atmosphere of Chinatown, with its colorful shophouses, bustling markets, and ornate temples. Discover hidden gems, sample delicious street food, and learn about the history and traditions of Singapore's Chinese community.", + "locationName": "Chinatown", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "singapore", + "ref": "chinatown-walking-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_chinatown-walking-tour.jpg" + }, + { + "name": "MacRitchie Reservoir Hike", + "description": "Escape the city bustle and reconnect with nature on a scenic hike through the lush rainforest surrounding MacRitchie Reservoir. Cross the iconic TreeTop Walk suspension bridge, spot diverse wildlife, and enjoy breathtaking views of the reservoir and surrounding greenery.", + "locationName": "MacRitchie Reservoir Park", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "singapore", + "ref": "macritchie-reservoir-hike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_macritchie-reservoir-hike.jpg" + }, + { + "name": "Orchard Road Shopping Spree", + "description": "Indulge in a retail therapy session along Orchard Road, Singapore's renowned shopping district. Explore a vast array of luxury brands, flagship stores, and department stores, offering everything from high-end fashion and electronics to local souvenirs and unique finds.", + "locationName": "Orchard Road", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "singapore", + "ref": "orchard-road-shopping-spree", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_orchard-road-shopping-spree.jpg" + }, + { + "name": "Jurong Bird Park Adventure", + "description": "Embark on a colorful journey through Jurong Bird Park, home to over 5,000 birds from around the world. Witness captivating bird shows, stroll through walk-in aviaries, and get up close to vibrant species like flamingos, penguins, and parrots. This immersive experience offers a perfect blend of education and entertainment for all ages.", + "locationName": "Jurong Bird Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "singapore", + "ref": "jurong-bird-park-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_jurong-bird-park-adventure.jpg" + }, + { + "name": "Pulau Ubin Cycling Escape", + "description": "Escape the urban bustle and discover the rustic charm of Pulau Ubin, a tranquil island off Singapore's coast. Rent a bike and explore its idyllic landscapes, including lush forests, serene beaches, and traditional kampongs (villages). Immerse yourself in the island's laid-back atmosphere and enjoy a unique glimpse into Singapore's past.", + "locationName": "Pulau Ubin", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "singapore", + "ref": "pulau-ubin-cycling-escape", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_pulau-ubin-cycling-escape.jpg" + }, + { + "name": "Singapore Botanic Gardens Stroll", + "description": "Unwind amidst the verdant beauty of the Singapore Botanic Gardens, a UNESCO World Heritage Site. Wander through themed gardens, admire the National Orchid Garden's stunning collection, and enjoy a peaceful picnic surrounded by nature. This tranquil oasis offers a welcome respite from the city's vibrant energy.", + "locationName": "Singapore Botanic Gardens", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "singapore", + "ref": "singapore-botanic-gardens-stroll", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_singapore-botanic-gardens-stroll.jpg" + }, + { + "name": "Marina Bay Sands SkyPark Observation Deck", + "description": "Experience breathtaking panoramic views of Singapore's skyline from the Marina Bay Sands SkyPark Observation Deck. Capture iconic landmarks like the Supertree Grove, the Singapore Flyer, and the city's dazzling skyscrapers. This vantage point offers an unforgettable perspective of the city's architectural marvels and vibrant cityscape.", + "locationName": "Marina Bay Sands SkyPark", + "duration": 1, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "singapore", + "ref": "marina-bay-sands-skypark-observation-deck", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_marina-bay-sands-skypark-observation-deck.jpg" + }, + { + "name": "Fort Canning Park History and Heritage", + "description": "Step back in time and explore the rich history of Singapore at Fort Canning Park. Discover ancient artifacts, delve into the park's colonial past, and witness remnants of the spice trade. Immerse yourself in the cultural significance of this landmark and gain a deeper understanding of Singapore's heritage.", + "locationName": "Fort Canning Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "singapore", + "ref": "fort-canning-park-history-and-heritage", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_fort-canning-park-history-and-heritage.jpg" + }, + { + "name": "Singapore Zoo Breakfast with Orangutans", + "description": "Embark on a unique wildlife experience by enjoying a delightful breakfast buffet in the company of playful orangutans at the renowned Singapore Zoo. Witness these incredible creatures swinging through their habitat and learn about their conservation efforts.", + "locationName": "Singapore Zoo", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "singapore", + "ref": "singapore-zoo-breakfast-with-orangutans", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_singapore-zoo-breakfast-with-orangutans.jpg" + }, + { + "name": "Haji Lane Street Art Exploration", + "description": "Immerse yourself in the vibrant street art scene of Haji Lane. Wander through this trendy alleyway, adorned with colorful murals, quirky shops, and hip cafes. Capture Instagram-worthy photos and soak up the artistic atmosphere.", + "locationName": "Haji Lane", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "singapore", + "ref": "haji-lane-street-art-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_haji-lane-street-art-exploration.jpg" + }, + { + "name": "Singapore Cable Car Sky Pass", + "description": "Enjoy breathtaking panoramic views of the city skyline and Sentosa Island from the Singapore Cable Car. Take a scenic ride and hop off at different stations to explore attractions like Mount Faber Park and Sentosa's beaches.", + "locationName": "Singapore Cable Car", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "singapore", + "ref": "singapore-cable-car-sky-pass", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_singapore-cable-car-sky-pass.jpg" + }, + { + "name": "Catch a Show at the Esplanade", + "description": "Experience the vibrant arts scene at the iconic Esplanade - Theatres on the Bay. Choose from a diverse range of performances, including theater, music, dance, and more. Enjoy a world-class show in a stunning architectural setting.", + "locationName": "Esplanade - Theatres on the Bay", + "duration": 2.5, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "singapore", + "ref": "catch-a-show-at-the-esplanade", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_catch-a-show-at-the-esplanade.jpg" + }, + { + "name": "Sungei Buloh Wetland Reserve", + "description": "Escape the city bustle and explore the serene Sungei Buloh Wetland Reserve. Walk along the mangroves, observe diverse birdlife, and learn about the importance of wetland conservation. This is a perfect opportunity to connect with nature and enjoy some peace and quiet.", + "locationName": "Sungei Buloh Wetland Reserve", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "singapore", + "ref": "sungei-buloh-wetland-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/singapore_sungei-buloh-wetland-reserve.jpg" + }, + { + "name": "Lake Bled Boat Ride and Bled Island Visit", + "description": "Embark on a traditional pletna boat ride across the emerald waters of Lake Bled. Visit the iconic Bled Island, climb the 99 steps to reach the Church of the Assumption, and ring the wishing bell for good luck. Enjoy breathtaking views of the Julian Alps and the surrounding countryside.", + "locationName": "Lake Bled", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "slovenia", + "ref": "lake-bled-boat-ride-and-bled-island-visit", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_lake-bled-boat-ride-and-bled-island-visit.jpg" + }, + { + "name": "Postojna Cave Adventure", + "description": "Descend into the mesmerizing Postojna Cave, one of the largest karst cave systems in Europe. Take a thrilling train ride through the caverns and marvel at the stunning stalactites, stalagmites, and otherworldly formations. Learn about the cave's history and its unique ecosystem, including the endemic olm, a blind salamander.", + "locationName": "Postojna Cave", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "slovenia", + "ref": "postojna-cave-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_postojna-cave-adventure.jpg" + }, + { + "name": "Hiking in Triglav National Park", + "description": "Explore the pristine wilderness of Triglav National Park, named after Mount Triglav, Slovenia's highest peak. Choose from a variety of hiking trails, ranging from easy walks to challenging climbs. Discover alpine meadows, glacial valleys, crystal-clear lakes, and breathtaking waterfalls. Keep an eye out for diverse wildlife, including ibex, chamois, and golden eagles.", + "locationName": "Triglav National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "slovenia", + "ref": "hiking-in-triglav-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_hiking-in-triglav-national-park.jpg" + }, + { + "name": "Ljubljana City Tour", + "description": "Wander through the charming streets of Ljubljana, Slovenia's capital city. Admire the Baroque and Art Nouveau architecture, visit the Ljubljana Castle for panoramic views, and stroll along the Ljubljanica River. Explore the vibrant Prešeren Square, the central market, and the picturesque Triple Bridge. Discover the city's rich history and cultural heritage.", + "locationName": "Ljubljana", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "slovenia", + "ref": "ljubljana-city-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_ljubljana-city-tour.jpg" + }, + { + "name": "Slovenian Wine Tasting", + "description": "Indulge in a delightful wine tasting experience in one of Slovenia's renowned wine regions. Sample a variety of local wines, from crisp whites to full-bodied reds, and learn about the country's winemaking traditions. Visit a local vineyard, meet the winemakers, and savor the unique flavors of Slovenian wine.", + "locationName": "Various wine regions", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "slovenia", + "ref": "slovenian-wine-tasting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_slovenian-wine-tasting.jpg" + }, + { + "name": "Whitewater Rafting on the Soča River", + "description": "Experience the thrill of navigating the turquoise waters of the Soča River, surrounded by breathtaking alpine scenery. Choose from various difficulty levels and enjoy a guided rafting tour that combines adventure and the beauty of nature. This activity is perfect for adventure seekers and nature lovers.", + "locationName": "Soča Valley", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "slovenia", + "ref": "whitewater-rafting-on-the-so-a-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_whitewater-rafting-on-the-so-a-river.jpg" + }, + { + "name": "Predjama Castle Exploration", + "description": "Step into a fairytale at Predjama Castle, a Renaissance castle built within a cave mouth. Explore the intriguing chambers and secret tunnels, and learn about the legend of the robber baron Erasmus. This unique castle offers a fascinating glimpse into Slovenia's history and architecture.", + "locationName": "Predjama", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "slovenia", + "ref": "predjama-castle-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_predjama-castle-exploration.jpg" + }, + { + "name": "Škocjan Caves Tour", + "description": "Descend into the UNESCO-listed Škocjan Caves, a natural wonder with massive underground chambers, towering stalagmites and stalactites, and an underground river. Take a guided tour to witness the awe-inspiring beauty of this subterranean world.", + "locationName": "Škocjan Caves Regional Park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "slovenia", + "ref": "-kocjan-caves-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_-kocjan-caves-tour.jpg" + }, + { + "name": "Lipica Stud Farm Visit", + "description": "Discover the home of the Lipizzaner horses at the Lipica Stud Farm. Take a tour to learn about the history and breeding of these elegant white horses, watch a training session, or even enjoy a carriage ride through the picturesque estate.", + "locationName": "Lipica", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "slovenia", + "ref": "lipica-stud-farm-visit", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_lipica-stud-farm-visit.jpg" + }, + { + "name": "Piran Coastal Town Charm", + "description": "Wander through the charming coastal town of Piran, with its Venetian-inspired architecture, narrow streets, and picturesque harbor. Explore the historic Tartini Square, climb the bell tower for panoramic views, and enjoy fresh seafood at a local restaurant.", + "locationName": "Piran", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "slovenia", + "ref": "piran-coastal-town-charm", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_piran-coastal-town-charm.jpg" + }, + { + "name": "Cycling Through the Vipava Valley", + "description": "Embark on a scenic cycling journey through the picturesque Vipava Valley, known for its rolling vineyards, charming villages, and delicious local cuisine. Rent a bike and explore the numerous cycling trails, stopping at family-run wineries for tastings, enjoying farm-to-table meals, and soaking in the stunning landscapes.", + "locationName": "Vipava Valley", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "slovenia", + "ref": "cycling-through-the-vipava-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_cycling-through-the-vipava-valley.jpg" + }, + { + "name": "Kayaking on Lake Bohinj", + "description": "Escape the crowds of Lake Bled and discover the tranquility of Lake Bohinj, Slovenia's largest glacial lake. Rent a kayak and paddle across the crystal-clear waters, surrounded by breathtaking mountain scenery. Enjoy a picnic on the shore, take a refreshing swim, or simply relax and soak in the peaceful atmosphere.", + "locationName": "Lake Bohinj", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "slovenia", + "ref": "kayaking-on-lake-bohinj", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_kayaking-on-lake-bohinj.jpg" + }, + { + "name": "Ziplining in the Ukanc Valley", + "description": "Experience an adrenaline-pumping adventure ziplining through the Ukanc Valley. Soar above the treetops and enjoy breathtaking views of the surrounding mountains and forests. This thrilling activity is perfect for adventure seekers and nature enthusiasts.", + "locationName": "Ukanc Valley", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "slovenia", + "ref": "ziplining-in-the-ukanc-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_ziplining-in-the-ukanc-valley.jpg" + }, + { + "name": "Exploring the Škocjan Caves", + "description": "Embark on a subterranean adventure through the Škocjan Caves, a UNESCO World Heritage site renowned for its vast chambers, underground canyons, and impressive stalactites and stalagmites. Join a guided tour and marvel at the natural wonders of this unique cave system.", + "locationName": "Škocjan Caves", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "slovenia", + "ref": "exploring-the-kocjan-caves", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_exploring-the-kocjan-caves.jpg" + }, + { + "name": "Soaking in the Thermal Waters of Terme Čatež", + "description": "Indulge in relaxation and rejuvenation at Terme Čatež, one of Slovenia's largest and most popular thermal spa resorts. Enjoy the healing properties of the thermal waters, experience a variety of wellness treatments, and unwind in the numerous pools and saunas.", + "locationName": "Terme Čatež", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "slovenia", + "ref": "soaking-in-the-thermal-waters-of-terme-ate-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_soaking-in-the-thermal-waters-of-terme-ate-.jpg" + }, + { + "name": "Stand Up Paddleboarding on Lake Bohinj", + "description": "Experience the tranquility of Lake Bohinj, a glacial lake nestled amidst the Julian Alps, from a unique perspective. Glide across the crystal-clear waters on a stand-up paddleboard, surrounded by breathtaking mountain scenery. This activity is suitable for all skill levels, offering a peaceful and relaxing way to connect with nature.", + "locationName": "Lake Bohinj", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "slovenia", + "ref": "stand-up-paddleboarding-on-lake-bohinj", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_stand-up-paddleboarding-on-lake-bohinj.jpg" + }, + { + "name": "Culinary Tour of Ljubljana", + "description": "Embark on a delectable journey through the culinary scene of Ljubljana, the charming capital city. Join a guided food tour to savor traditional Slovenian dishes, from hearty stews to delicate pastries. Discover local markets, hidden gems, and renowned restaurants, learning about the country's rich gastronomic heritage and indulging in authentic flavors.", + "locationName": "Ljubljana", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "slovenia", + "ref": "culinary-tour-of-ljubljana", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_culinary-tour-of-ljubljana.jpg" + }, + { + "name": "Visit the Velika Planina Alpine Pasture", + "description": "Step back in time at Velika Planina, a traditional alpine pasture nestled in the Kamnik Alps. Take a cable car ride up the mountain and explore the unique herdsmen's settlement with its charming wooden huts. Hike through the picturesque meadows, enjoy breathtaking panoramic views, and sample local dairy products like the famous Trnič cheese.", + "locationName": "Velika Planina", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "slovenia", + "ref": "visit-the-velika-planina-alpine-pasture", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_visit-the-velika-planina-alpine-pasture.jpg" + }, + { + "name": "Explore the Škocjan Caves Park", + "description": "Venture into the depths of the Škocjan Caves Park, a UNESCO World Heritage Site renowned for its dramatic underground landscapes. Embark on a guided tour through the vast caverns, marvel at the impressive stalactites and stalagmites, and witness the roaring Reka River flowing through the canyon. This awe-inspiring adventure offers a glimpse into the geological wonders of Slovenia.", + "locationName": "Škocjan Caves Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "slovenia", + "ref": "explore-the-kocjan-caves-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_explore-the-kocjan-caves-park.jpg" + }, + { + "name": "Glamping in the Slovenian Countryside", + "description": "Escape the hustle and bustle of city life and immerse yourself in the tranquility of the Slovenian countryside. Enjoy a unique glamping experience, staying in luxurious tents or eco-friendly cabins surrounded by nature. Wake up to stunning views, explore the nearby forests and meadows, and unwind under the starry sky.", + "locationName": "Various locations", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "slovenia", + "ref": "glamping-in-the-slovenian-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/slovenia_glamping-in-the-slovenian-countryside.jpg" + }, + { + "name": "Explore the Ancient City of Sigiriya", + "description": "Embark on a journey to the top of Sigiriya, a UNESCO World Heritage Site. Climb the ancient rock fortress, marvel at the stunning frescoes, and enjoy breathtaking panoramic views of the surrounding landscapes. Discover the fascinating history and legends of this iconic landmark, dating back to the 5th century.", + "locationName": "Sigiriya", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "sri-lanka", + "ref": "explore-the-ancient-city-of-sigiriya", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_explore-the-ancient-city-of-sigiriya.jpg" + }, + { + "name": "Relax on the Beaches of Bentota", + "description": "Escape to the golden shores of Bentota, a renowned beach destination on the southwestern coast. Soak up the sun, swim in the turquoise waters, and indulge in water sports like surfing, snorkeling, or jet skiing. Enjoy the serene ambiance and unwind in a beachfront resort or a cozy beach shack.", + "locationName": "Bentota", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "sri-lanka", + "ref": "relax-on-the-beaches-of-bentota", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_relax-on-the-beaches-of-bentota.jpg" + }, + { + "name": "Go on a Wildlife Safari in Yala National Park", + "description": "Embark on an unforgettable wildlife adventure in Yala National Park, renowned for its diverse wildlife population. Spot elephants, leopards, sloth bears, crocodiles, and numerous bird species as you traverse through the park's varied landscapes. Experience the thrill of observing these magnificent creatures in their natural habitat.", + "locationName": "Yala National Park", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "sri-lanka", + "ref": "go-on-a-wildlife-safari-in-yala-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_go-on-a-wildlife-safari-in-yala-national-park.jpg" + }, + { + "name": "Discover the Cultural Triangle", + "description": "Immerse yourself in the rich history and culture of Sri Lanka by exploring the Cultural Triangle. Visit ancient cities like Anuradhapura and Polonnaruwa, home to magnificent ruins, temples, and palaces. Discover the sacred Temple of the Tooth in Kandy, a revered Buddhist pilgrimage site, and witness traditional Kandyan dance performances.", + "locationName": "Cultural Triangle (Anuradhapura, Polonnaruwa, Kandy)", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "sri-lanka", + "ref": "discover-the-cultural-triangle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_discover-the-cultural-triangle.jpg" + }, + { + "name": "Experience the Hill Country Charm in Nuwara Eliya", + "description": "Escape to the cool climate and scenic beauty of Nuwara Eliya, known as 'Little England'. Explore the lush tea plantations, visit a tea factory to learn about the tea-making process, and enjoy a cup of freshly brewed Ceylon tea. Take a scenic train ride through the rolling hills, visit waterfalls, and admire the colonial architecture.", + "locationName": "Nuwara Eliya", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "sri-lanka", + "ref": "experience-the-hill-country-charm-in-nuwara-eliya", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_experience-the-hill-country-charm-in-nuwara-eliya.jpg" + }, + { + "name": "Dive into the Underwater World", + "description": "Explore the vibrant coral reefs and diverse marine life of Sri Lanka's coastline. Popular diving spots include Hikkaduwa, Unawatuna, and Trincomalee, where you can encounter colorful fish, sea turtles, and even shipwrecks. Whether you're a beginner or an experienced diver, there are options for all levels.", + "locationName": "Hikkaduwa, Unawatuna, or Trincomalee", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "sri-lanka", + "ref": "dive-into-the-underwater-world", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_dive-into-the-underwater-world.jpg" + }, + { + "name": "Ride the Waves in Arugam Bay", + "description": "Catch some waves at Arugam Bay, a renowned surfing destination on the east coast. With consistent swells and a laid-back atmosphere, it's a paradise for surfers of all skill levels. Take a lesson, rent a board, and experience the thrill of riding the Indian Ocean.", + "locationName": "Arugam Bay", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "sri-lanka", + "ref": "ride-the-waves-in-arugam-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_ride-the-waves-in-arugam-bay.jpg" + }, + { + "name": "Hike to Adam's Peak", + "description": "Embark on a pilgrimage to Adam's Peak, a sacred mountain with stunning views. The climb is challenging but rewarding, especially at sunrise when you can witness the breathtaking 'Sri Pada' or sacred footprint. This is a cultural and spiritual experience not to be missed.", + "locationName": "Adam's Peak", + "duration": 6, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "sri-lanka", + "ref": "hike-to-adam-s-peak", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_hike-to-adam-s-peak.jpg" + }, + { + "name": "Cruise Along the Dutch Canal in Negombo", + "description": "Take a relaxing boat ride along the historic Dutch Canal in Negombo. Admire the colonial architecture, observe local life, and enjoy the scenic beauty of the waterways. This is a perfect way to unwind and experience a different side of Sri Lanka.", + "locationName": "Negombo", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "sri-lanka", + "ref": "cruise-along-the-dutch-canal-in-negombo", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_cruise-along-the-dutch-canal-in-negombo.jpg" + }, + { + "name": "Wander Through the Royal Botanical Gardens", + "description": "Escape the hustle and bustle in the serene Royal Botanical Gardens in Peradeniya. Explore diverse plant collections, including orchids, spices, and medicinal herbs. Enjoy a peaceful stroll, have a picnic, and immerse yourself in the beauty of nature.", + "locationName": "Peradeniya", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "sri-lanka", + "ref": "wander-through-the-royal-botanical-gardens", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_wander-through-the-royal-botanical-gardens.jpg" + }, + { + "name": "Whale Watching in Mirissa", + "description": "Embark on a thrilling boat excursion from the coastal town of Mirissa to witness the majestic spectacle of whales in their natural habitat. Sri Lanka is renowned as one of the best places in the world to spot blue whales, sperm whales, and dolphins. Keep your eyes peeled for these gentle giants as they breach the surface and marvel at their sheer size and grace.", + "locationName": "Mirissa", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "sri-lanka", + "ref": "whale-watching-in-mirissa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_whale-watching-in-mirissa.jpg" + }, + { + "name": "Explore the Galle Dutch Fort", + "description": "Step back in time with a visit to the historic Galle Dutch Fort, a UNESCO World Heritage Site. Wander through the charming streets lined with Dutch colonial buildings, explore the ramparts offering stunning ocean views, and discover quaint shops, cafes, and museums. Immerse yourself in the rich history and architectural beauty of this captivating landmark.", + "locationName": "Galle", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "sri-lanka", + "ref": "explore-the-galle-dutch-fort", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_explore-the-galle-dutch-fort.jpg" + }, + { + "name": "Visit a Tea Plantation and Factory", + "description": "Delve into the world of Ceylon tea with a visit to a scenic tea plantation and factory in the Hill Country. Learn about the tea-making process, from plucking the leaves to the final stages of production. Enjoy a cup of freshly brewed tea while taking in the breathtaking views of rolling hills carpeted with emerald-green tea bushes.", + "locationName": "Nuwara Eliya", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "sri-lanka", + "ref": "visit-a-tea-plantation-and-factory", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_visit-a-tea-plantation-and-factory.jpg" + }, + { + "name": "Learn to Cook Authentic Sri Lankan Cuisine", + "description": "Embark on a culinary adventure by participating in a cooking class and learn the secrets of Sri Lankan cuisine. Master the art of preparing traditional dishes such as rice and curry, coconut roti, and flavorful sambals. Discover the unique blend of spices and flavors that make Sri Lankan food so special and enjoy a delicious meal you've created yourself.", + "locationName": "Various locations", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "sri-lanka", + "ref": "learn-to-cook-authentic-sri-lankan-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_learn-to-cook-authentic-sri-lankan-cuisine.jpg" + }, + { + "name": "Experience a Traditional Ayurvedic Treatment", + "description": "Indulge in a rejuvenating Ayurvedic treatment and experience the ancient healing traditions of Sri Lanka. Choose from a variety of therapies, including massages, herbal baths, and oil treatments, designed to restore balance and promote well-being. Immerse yourself in a sanctuary of relaxation and emerge feeling refreshed and revitalized.", + "locationName": "Various locations", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "sri-lanka", + "ref": "experience-a-traditional-ayurvedic-treatment", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_experience-a-traditional-ayurvedic-treatment.jpg" + }, + { + "name": "White Water Rafting in Kitulgala", + "description": "Embark on an exhilarating white water rafting adventure down the Kelani River in Kitulgala. Navigate through thrilling rapids surrounded by lush rainforests, offering a perfect blend of adrenaline and stunning natural beauty.", + "locationName": "Kitulgala", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "sri-lanka", + "ref": "white-water-rafting-in-kitulgala", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_white-water-rafting-in-kitulgala.jpg" + }, + { + "name": "Bird Watching in Kumana National Park", + "description": "Discover the rich avian diversity of Sri Lanka at Kumana National Park. Home to a wide variety of resident and migratory birds, including pelicans, painted storks, and spoonbills, this park offers a paradise for bird enthusiasts.", + "locationName": "Kumana National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "sri-lanka", + "ref": "bird-watching-in-kumana-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_bird-watching-in-kumana-national-park.jpg" + }, + { + "name": "Explore the Dambulla Cave Temple", + "description": "Step into the spiritual realm at the Dambulla Cave Temple, a UNESCO World Heritage Site. Marvel at the ancient Buddhist murals and statues housed within five cave temples, showcasing Sri Lanka's rich history and religious significance.", + "locationName": "Dambulla", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "sri-lanka", + "ref": "explore-the-dambulla-cave-temple", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_explore-the-dambulla-cave-temple.jpg" + }, + { + "name": "Take a Scenic Train Journey from Kandy to Ella", + "description": "Embark on a breathtaking train journey through Sri Lanka's scenic hill country. Travel from Kandy to Ella, passing through rolling hills, tea plantations, and picturesque waterfalls, offering unforgettable views of the island's natural beauty.", + "locationName": "Kandy to Ella", + "duration": 7, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "sri-lanka", + "ref": "take-a-scenic-train-journey-from-kandy-to-ella", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_take-a-scenic-train-journey-from-kandy-to-ella.jpg" + }, + { + "name": "Visit the Pinnawala Elephant Orphanage", + "description": "Witness the heartwarming sight of rescued elephants at the Pinnawala Elephant Orphanage. Observe these gentle giants as they bathe, feed, and interact with each other, providing a unique opportunity to learn about elephant conservation efforts.", + "locationName": "Pinnawala", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "sri-lanka", + "ref": "visit-the-pinnawala-elephant-orphanage", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/sri-lanka_visit-the-pinnawala-elephant-orphanage.jpg" + }, + { + "name": "Polar Bear Safari", + "description": "Embark on an unforgettable expedition into the Arctic wilderness in search of the majestic polar bear. Accompanied by experienced guides, you'll navigate the icy landscapes by snowmobile or boat, keeping a keen eye out for these incredible creatures in their natural habitat. Witnessing these powerful predators in action is an experience that will stay with you forever.", + "locationName": "Various locations depending on the season and ice conditions", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "svalbard", + "ref": "polar-bear-safari", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_polar-bear-safari.jpg" + }, + { + "name": "Dog Sledding Adventure", + "description": "Experience the thrill of gliding across the snowy plains of Svalbard on a traditional dog sled. Learn the art of mushing from expert guides as you command your team of huskies through breathtaking Arctic scenery. Feel the adrenaline rush as you race across the frozen tundra, surrounded by the pristine beauty of the polar landscape.", + "locationName": "Various locations around Longyearbyen", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "svalbard", + "ref": "dog-sledding-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_dog-sledding-adventure.jpg" + }, + { + "name": "Northern Lights Viewing", + "description": "Venture out into the darkness of the Arctic night and witness the awe-inspiring spectacle of the Northern Lights. Svalbard's remote location and minimal light pollution offer ideal conditions for observing this celestial phenomenon. Gaze up at the sky as vibrant ribbons of green, purple, and pink dance across the horizon, creating an unforgettable display of nature's magic.", + "locationName": "Various locations away from city lights", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "svalbard", + "ref": "northern-lights-viewing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_northern-lights-viewing.jpg" + }, + { + "name": "Kayaking in the Fjords", + "description": "Paddle through the tranquil waters of Svalbard's fjords and immerse yourself in the serene beauty of the Arctic landscape. Glide past towering glaciers, rugged mountains, and pristine icebergs as you explore hidden coves and observe the diverse marine life. Kayaking offers a unique and peaceful perspective on the Arctic wilderness.", + "locationName": "Isfjorden or other suitable fjords", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "svalbard", + "ref": "kayaking-in-the-fjords", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_kayaking-in-the-fjords.jpg" + }, + { + "name": "Visit the Svalbard Museum", + "description": "Delve into the rich history and unique culture of Svalbard at the Svalbard Museum. Explore exhibits showcasing the archipelago's fascinating past, from early exploration and whaling to coal mining and scientific research. Learn about the challenges and triumphs of human life in this remote Arctic region, and gain a deeper understanding of the delicate balance between nature and human activity.", + "locationName": "Longyearbyen", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "svalbard", + "ref": "visit-the-svalbard-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_visit-the-svalbard-museum.jpg" + }, + { + "name": "Snowmobiling across the Tundra", + "description": "Embark on an exhilarating snowmobile adventure across the vast Arctic tundra. Feel the rush of adrenaline as you zoom through the snowy landscapes, taking in the breathtaking scenery and the crisp Arctic air. This thrilling experience offers a unique way to explore the remote wilderness of Svalbard.", + "locationName": "Various locations across Svalbard", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "svalbard", + "ref": "snowmobiling-across-the-tundra", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_snowmobiling-across-the-tundra.jpg" + }, + { + "name": "Hiking to a Glacier", + "description": "Lace up your hiking boots and embark on an unforgettable trek to one of Svalbard's majestic glaciers. Witness the immense power and beauty of these icy giants up close as you traverse the Arctic terrain. Experienced guides will lead you on a safe and informative journey, sharing insights about the region's geology and glacial formations.", + "locationName": "Various glaciers across Svalbard (e.g., Longyearbreen, Esmarkbreen)", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "svalbard", + "ref": "hiking-to-a-glacier", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_hiking-to-a-glacier.jpg" + }, + { + "name": "Boat Trip to Pyramiden", + "description": "Take a scenic boat trip to the abandoned Russian mining settlement of Pyramiden. Explore the ghost town's eerie remains, including its once-grand cultural center, sports complex, and residential buildings. Learn about the fascinating history of this Soviet-era outpost and its sudden abandonment in the 1990s.", + "locationName": "Pyramiden", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "svalbard", + "ref": "boat-trip-to-pyramiden", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_boat-trip-to-pyramiden.jpg" + }, + { + "name": "Visit the North Pole Expedition Museum", + "description": "Delve into the rich history of Arctic exploration at the North Pole Expedition Museum in Longyearbyen. Discover captivating exhibits showcasing artifacts, photographs, and stories from famous expeditions, including those of Roald Amundsen and Fridtjof Nansen. Gain insights into the challenges and triumphs of polar exploration and its impact on our understanding of the Arctic.", + "locationName": "Longyearbyen", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "svalbard", + "ref": "visit-the-north-pole-expedition-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_visit-the-north-pole-expedition-museum.jpg" + }, + { + "name": "Enjoy Local Cuisine and Culture", + "description": "Indulge in the unique flavors of Svalbard's local cuisine. Sample Arctic delicacies like reindeer steak, fresh seafood, and cloudberries. Visit cozy cafes and restaurants in Longyearbyen, where you can savor traditional dishes and immerse yourself in the local culture. Don't miss the opportunity to try Svalbard's own craft beer brewed with glacial water.", + "locationName": "Longyearbyen", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "svalbard", + "ref": "enjoy-local-cuisine-and-culture", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_enjoy-local-cuisine-and-culture.jpg" + }, + { + "name": "Fossil Hunting at Mine 7", + "description": "Embark on a unique adventure to Mine 7, a former coal mine near Longyearbyen. Here, you can explore the remnants of Svalbard's mining history and participate in guided fossil hunting tours. Uncover ancient plant fossils dating back millions of years and learn about the geological forces that shaped this Arctic landscape. This activity offers a fascinating glimpse into Svalbard's past and is suitable for all ages.", + "locationName": "Mine 7", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "svalbard", + "ref": "fossil-hunting-at-mine-7", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_fossil-hunting-at-mine-7.jpg" + }, + { + "name": "Birdwatching at the Alkefjellet Bird Cliffs", + "description": "Witness the spectacle of thousands of seabirds nesting on the dramatic cliffs of Alkefjellet. Take a boat trip to this impressive location and marvel at the guillemots, kittiwakes, and Brünnich's guillemots that call these cliffs home. Capture stunning photographs of the birds in flight and observe their nesting behaviors. This experience is a must for bird enthusiasts and nature lovers.", + "locationName": "Alkefjellet Bird Cliffs", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "svalbard", + "ref": "birdwatching-at-the-alkefjellet-bird-cliffs", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_birdwatching-at-the-alkefjellet-bird-cliffs.jpg" + }, + { + "name": "Ice Caving Adventure", + "description": "Delve into the mesmerizing world of ice caves beneath Svalbard's glaciers. Join a guided tour and explore these natural ice formations, adorned with sparkling ice crystals and unique ice sculptures. Learn about the formation of glaciers and ice caves while experiencing the thrill of venturing underground in this Arctic wonderland. This activity is ideal for adventurous travelers seeking an unforgettable experience.", + "locationName": "Various glacier locations", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "svalbard", + "ref": "ice-caving-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_ice-caving-adventure.jpg" + }, + { + "name": "Relaxation at the Svalbard Seed Vault", + "description": "Visit the iconic Svalbard Global Seed Vault, a secure facility built to safeguard the world's crop diversity. While entry inside the vault is restricted, you can admire its unique architecture and learn about its crucial role in preserving biodiversity. The surrounding area offers stunning views of the Arctic landscape, providing a peaceful setting for reflection and appreciation of nature's resilience.", + "locationName": "Svalbard Global Seed Vault", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "svalbard", + "ref": "relaxation-at-the-svalbard-seed-vault", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_relaxation-at-the-svalbard-seed-vault.jpg" + }, + { + "name": "Stargazing in the Arctic Wilderness", + "description": "Experience the magic of the Arctic night sky away from light pollution. Join a guided stargazing tour and marvel at the celestial wonders above. Learn about constellations, planets, and the Aurora Borealis, also known as the Northern Lights, which illuminate the sky with vibrant colors. This activity offers a unique opportunity to connect with the vastness of the universe and appreciate the beauty of the Arctic night.", + "locationName": "Various locations away from settlements", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "svalbard", + "ref": "stargazing-in-the-arctic-wilderness", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_stargazing-in-the-arctic-wilderness.jpg" + }, + { + "name": "Arctic Photography Expedition", + "description": "Embark on a guided photography tour to capture the stunning landscapes of Svalbard. Learn from professional photographers and get tips on capturing the Arctic's unique light and wildlife. This activity is perfect for both amateur and experienced photographers looking to create lasting memories.", + "locationName": "Various locations throughout Svalbard", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "svalbard", + "ref": "arctic-photography-expedition", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_arctic-photography-expedition.jpg" + }, + { + "name": "Visit Barentsburg, a Russian Mining Town", + "description": "Take a boat trip to Barentsburg, a Russian coal-mining settlement on Spitsbergen. Experience a different culture and explore the town's unique architecture, history, and way of life. You can even enjoy a traditional Russian meal at a local restaurant.", + "locationName": "Barentsburg", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "svalbard", + "ref": "visit-barentsburg-a-russian-mining-town", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_visit-barentsburg-a-russian-mining-town.jpg" + }, + { + "name": "Go Cross-Country Skiing", + "description": "Explore the Arctic wilderness on skis with a cross-country skiing excursion. Glide across snow-covered landscapes, taking in the breathtaking scenery and enjoying the fresh air and exercise. This activity is suitable for various skill levels, and guided tours are available for beginners.", + "locationName": "Various locations throughout Svalbard", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "svalbard", + "ref": "go-cross-country-skiing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_go-cross-country-skiing.jpg" + }, + { + "name": "Take a Hot Air Balloon Ride over Svalbard", + "description": "Experience the ultimate Arctic adventure with a hot air balloon ride over the stunning landscapes of Svalbard. Enjoy breathtaking aerial views of glaciers, mountains, and fjords, and witness the Arctic wilderness from a unique perspective. This once-in-a-lifetime experience is perfect for special occasions or for those seeking an unforgettable adventure.", + "locationName": "Various locations throughout Svalbard", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "svalbard", + "ref": "take-a-hot-air-balloon-ride-over-svalbard", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_take-a-hot-air-balloon-ride-over-svalbard.jpg" + }, + { + "name": "Enjoy the Local Arts and Culture Scene", + "description": "Explore the local arts and culture scene in Longyearbyen, the largest settlement in Svalbard. Visit art galleries showcasing Arctic-inspired works, attend cultural events, and learn about the unique history and traditions of this remote community.", + "locationName": "Longyearbyen", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "svalbard", + "ref": "enjoy-the-local-arts-and-culture-scene", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/svalbard_enjoy-the-local-arts-and-culture-scene.jpg" + }, + { + "name": "Hiking in the Jungfrau Region", + "description": "Embark on an unforgettable hiking adventure amidst the stunning landscapes of the Jungfrau Region. Explore well-maintained trails that wind through alpine meadows, past glacial lakes, and offer breathtaking panoramic views of snow-capped peaks. Whether you're a seasoned hiker or a beginner, there are trails suitable for all levels of experience. Don't miss the iconic trails like the Panorama Trail from First to Grindelwald or the Eiger Trail for a challenging yet rewarding hike.", + "locationName": "Jungfrau Region", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "swiss-alps", + "ref": "hiking-in-the-jungfrau-region", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_hiking-in-the-jungfrau-region.jpg" + }, + { + "name": "Skiing in Zermatt", + "description": "Experience world-class skiing in the renowned resort town of Zermatt. With over 360 kilometers of slopes, Zermatt offers something for every skier, from gentle beginner runs to challenging off-piste terrain. Enjoy breathtaking views of the iconic Matterhorn while gliding down the slopes. After a day on the mountain, indulge in the après-ski scene at one of the many cozy restaurants or bars.", + "locationName": "Zermatt", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "swiss-alps", + "ref": "skiing-in-zermatt", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_skiing-in-zermatt.jpg" + }, + { + "name": "Scenic Train Ride on the Glacier Express", + "description": "Embark on a breathtaking journey through the Swiss Alps on the Glacier Express, known as the 'slowest express train in the world.' Sit back and relax as you travel through stunning mountain scenery, passing over bridges, through tunnels, and alongside glaciers. The panoramic windows offer unparalleled views of the alpine landscape, making it a truly unforgettable experience.", + "locationName": "Glacier Express Route", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "swiss-alps", + "ref": "scenic-train-ride-on-the-glacier-express", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_scenic-train-ride-on-the-glacier-express.jpg" + }, + { + "name": "Paragliding Over Interlaken", + "description": "Soar through the skies and experience the Swiss Alps from a unique perspective with a paragliding adventure over Interlaken. Take off from a mountaintop and enjoy breathtaking panoramic views of the surrounding mountains, lakes, and valleys. Feel the thrill of flying as you glide through the air, accompanied by experienced pilots who ensure your safety and enjoyment.", + "locationName": "Interlaken", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 4, + "destinationRef": "swiss-alps", + "ref": "paragliding-over-interlaken", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_paragliding-over-interlaken.jpg" + }, + { + "name": "Visit Charming Villages", + "description": "Explore the charming villages nestled amidst the Swiss Alps, each with its unique character and beauty. Wander through cobbled streets, admire traditional architecture, and discover local shops and restaurants. Visit Grindelwald, a popular village with stunning views of the Eiger, or Zermatt, a car-free village at the foot of the Matterhorn. Immerse yourself in the local culture and enjoy the peaceful atmosphere of these alpine gems.", + "locationName": "Various villages", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "swiss-alps", + "ref": "visit-charming-villages", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_visit-charming-villages.jpg" + }, + { + "name": "Mountain Biking", + "description": "Embark on a thrilling mountain biking adventure through the stunning Swiss Alps. Explore diverse terrains, from gentle slopes to challenging trails, and enjoy breathtaking views of snow-capped peaks, lush valleys, and picturesque villages. Whether you're a seasoned rider or a beginner, there are trails suitable for all skill levels, offering an exhilarating and unforgettable experience.", + "locationName": "Various trails throughout the Swiss Alps", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "swiss-alps", + "ref": "mountain-biking", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_mountain-biking.jpg" + }, + { + "name": "Indulge in Swiss Chocolate Delights", + "description": "Embark on a delectable journey into the world of Swiss chocolate. Visit renowned chocolate factories and artisanal shops, where you can witness the art of chocolate making, learn about its rich history, and savor a wide variety of exquisite chocolates, from creamy milk to intense dark. Don't miss the opportunity to create your own chocolate masterpiece during a fun and interactive workshop.", + "locationName": "Chocolate factories and shops in Swiss towns and cities", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "swiss-alps", + "ref": "indulge-in-swiss-chocolate-delights", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_indulge-in-swiss-chocolate-delights.jpg" + }, + { + "name": "Experience Thrilling Water Sports on Lake Geneva", + "description": "Head to the picturesque Lake Geneva and dive into a world of exciting water sports. Try your hand at windsurfing, sailing, or kayaking, enjoying the refreshing breeze and stunning views of the surrounding mountains. For an adrenaline rush, opt for water skiing or wakeboarding, gliding across the crystal-clear waters. Whether you're seeking adventure or relaxation, Lake Geneva offers endless possibilities.", + "locationName": "Lake Geneva", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "swiss-alps", + "ref": "experience-thrilling-water-sports-on-lake-geneva", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_experience-thrilling-water-sports-on-lake-geneva.jpg" + }, + { + "name": "Unwind in Thermal Baths and Spa Resorts", + "description": "Escape to the tranquil oasis of Swiss thermal baths and spa resorts, renowned for their rejuvenating properties. Immerse yourself in warm, mineral-rich waters, surrounded by breathtaking alpine scenery. Indulge in a variety of wellness treatments, including massages, facials, and body wraps, leaving you feeling refreshed and revitalized.", + "locationName": "Various spa resorts throughout the Swiss Alps", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "swiss-alps", + "ref": "unwind-in-thermal-baths-and-spa-resorts", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_unwind-in-thermal-baths-and-spa-resorts.jpg" + }, + { + "name": "Discover Swiss Culture and Heritage", + "description": "Immerse yourself in the rich culture and heritage of Switzerland by visiting charming towns and cities. Explore historical landmarks, museums, and art galleries, learning about the country's fascinating past and vibrant present. Attend traditional festivals and events, experiencing authentic Swiss folklore, music, and dance. Don't forget to sample local delicacies and wines, savoring the unique flavors of the region.", + "locationName": "Swiss towns and cities", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "swiss-alps", + "ref": "discover-swiss-culture-and-heritage", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_discover-swiss-culture-and-heritage.jpg" + }, + { + "name": "Canyoning in Interlaken", + "description": "Embark on an exhilarating canyoning adventure in Interlaken, where you'll rappel down cascading waterfalls, slide down natural rock formations, and jump into crystal-clear pools. This adrenaline-pumping activity offers a unique way to experience the stunning gorges and canyons of the Swiss Alps.", + "locationName": "Interlaken", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "swiss-alps", + "ref": "canyoning-in-interlaken", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_canyoning-in-interlaken.jpg" + }, + { + "name": "Visit the Chillon Castle", + "description": "Step back in time with a visit to the iconic Chillon Castle, a medieval fortress located on the shores of Lake Geneva. Explore its ancient halls, dungeons, and courtyards, and learn about its fascinating history dating back over a thousand years. Enjoy breathtaking views of the lake and surrounding mountains.", + "locationName": "Montreux", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "swiss-alps", + "ref": "visit-the-chillon-castle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_visit-the-chillon-castle.jpg" + }, + { + "name": "Stargazing in the Mountains", + "description": "Escape the city lights and experience the magic of stargazing in the pristine Swiss Alps. Join a guided tour or find a secluded spot to marvel at the Milky Way and constellations. The clear mountain air and high altitude provide exceptional conditions for observing the night sky.", + "locationName": "Jungfrau Region", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "swiss-alps", + "ref": "stargazing-in-the-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_stargazing-in-the-mountains.jpg" + }, + { + "name": "Hot Air Balloon Ride over the Alps", + "description": "Soar above the majestic Swiss Alps in a hot air balloon and witness breathtaking panoramic views of snow-capped peaks, valleys, and glaciers. Enjoy a peaceful and unforgettable experience as you drift through the sky and capture stunning aerial photos.", + "locationName": "Château-d'Oex", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "swiss-alps", + "ref": "hot-air-balloon-ride-over-the-alps", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_hot-air-balloon-ride-over-the-alps.jpg" + }, + { + "name": "Cheese Fondue and Wine Tasting", + "description": "Indulge in the quintessential Swiss experience of cheese fondue and wine tasting. Visit a traditional restaurant or chalet and savor the rich flavors of melted cheese accompanied by local wines. Learn about the art of fondue making and the different varieties of cheese and wine produced in the region.", + "locationName": "Gruyères", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "swiss-alps", + "ref": "cheese-fondue-and-wine-tasting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_cheese-fondue-and-wine-tasting.jpg" + }, + { + "name": "Ice Climbing on a Glacier", + "description": "Embark on a thrilling ice climbing adventure on one of Switzerland's majestic glaciers. Experienced guides will lead you through the basics of ice axe and crampon use, ensuring your safety as you ascend glistening ice walls. This exhilarating activity offers a unique perspective of the alpine landscape and an unforgettable adrenaline rush.", + "locationName": "Aletsch Glacier or Rhône Glacier", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "swiss-alps", + "ref": "ice-climbing-on-a-glacier", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_ice-climbing-on-a-glacier.jpg" + }, + { + "name": "Wildlife Watching in the Swiss National Park", + "description": "Immerse yourself in the pristine wilderness of the Swiss National Park, a haven for diverse wildlife. Hike through scenic trails and observe animals in their natural habitat, including ibex, chamois, marmots, and golden eagles. Keep an eye out for rare sightings like the elusive lynx or bearded vulture. This experience is perfect for nature enthusiasts and photographers.", + "locationName": "Swiss National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "swiss-alps", + "ref": "wildlife-watching-in-the-swiss-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_wildlife-watching-in-the-swiss-national-park.jpg" + }, + { + "name": "Explore the Charming Town of Gruyères", + "description": "Step back in time and visit the medieval town of Gruyères, renowned for its namesake cheese. Wander through cobbled streets, admire the historic architecture, and visit the Gruyères Castle. Indulge in a cheese fondue tasting and explore the Maison du Gruyère to learn about the cheese-making process. Don't miss the HR Giger Museum, showcasing the works of the Swiss surrealist artist.", + "locationName": "Gruyères", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "swiss-alps", + "ref": "explore-the-charming-town-of-gruy-res", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_explore-the-charming-town-of-gruy-res.jpg" + }, + { + "name": "Take a Boat Ride on Lake Lucerne", + "description": "Enjoy a scenic boat ride on the crystal-clear waters of Lake Lucerne, surrounded by breathtaking mountain vistas. Relax on deck and admire the picturesque towns, rolling hills, and snow-capped peaks. Consider a themed cruise, such as a culinary journey or a historical tour, to enhance your experience.", + "locationName": "Lake Lucerne", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "swiss-alps", + "ref": "take-a-boat-ride-on-lake-lucerne", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_take-a-boat-ride-on-lake-lucerne.jpg" + }, + { + "name": "Visit the Jungfraujoch - Top of Europe", + "description": "Embark on an unforgettable journey to the Jungfraujoch, the highest railway station in Europe, known as the \"Top of Europe\". Marvel at the panoramic views of the surrounding Alps, including the Aletsch Glacier. Explore the Ice Palace, experience the Sphinx Observatory, and enjoy a meal at one of the restaurants with breathtaking views.", + "locationName": "Jungfraujoch", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "swiss-alps", + "ref": "visit-the-jungfraujoch-top-of-europe", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/swiss-alps_visit-the-jungfraujoch-top-of-europe.jpg" + }, + { + "name": "Cradle Mountain National Park Hike", + "description": "Embark on a breathtaking hike through the iconic Cradle Mountain National Park. Witness the rugged beauty of Cradle Mountain, Dove Lake, and surrounding peaks. Keep an eye out for unique wildlife like wombats, wallabies, and Tasmanian devils.", + "locationName": "Cradle Mountain National Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "tasmania", + "ref": "cradle-mountain-national-park-hike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_cradle-mountain-national-park-hike.jpg" + }, + { + "name": "Wineglass Bay Cruise", + "description": "Sail across the turquoise waters of Wineglass Bay, marveling at the pristine beaches and dramatic cliffs. Enjoy swimming, snorkeling, or simply relaxing on the deck while soaking up the stunning coastal scenery.", + "locationName": "Wineglass Bay", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "tasmania", + "ref": "wineglass-bay-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_wineglass-bay-cruise.jpg" + }, + { + "name": "Port Arthur Historic Site Tour", + "description": "Step back in time at the Port Arthur Historic Site, a former penal colony with a fascinating and sometimes haunting history. Explore the preserved buildings, learn about the lives of convicts, and discover the stories of this UNESCO World Heritage site.", + "locationName": "Port Arthur", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "tasmania", + "ref": "port-arthur-historic-site-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_port-arthur-historic-site-tour.jpg" + }, + { + "name": "Bonorong Wildlife Sanctuary Visit", + "description": "Get up close and personal with Tasmania's unique wildlife at Bonorong Wildlife Sanctuary. See Tasmanian devils, kangaroos, koalas, wombats, and more in their natural habitats. Learn about conservation efforts and the importance of protecting these incredible animals.", + "locationName": "Bonorong Wildlife Sanctuary", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "tasmania", + "ref": "bonorong-wildlife-sanctuary-visit", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_bonorong-wildlife-sanctuary-visit.jpg" + }, + { + "name": "Salamanca Market Exploration", + "description": "Immerse yourself in the vibrant atmosphere of Salamanca Market in Hobart. Browse through stalls offering local arts and crafts, fresh produce, gourmet food, and unique souvenirs. Enjoy live music and entertainment while experiencing the heart of Tasmania's capital city.", + "locationName": "Salamanca Market, Hobart", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "tasmania", + "ref": "salamanca-market-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_salamanca-market-exploration.jpg" + }, + { + "name": "Bruny Island Wilderness Cruise", + "description": "Embark on a thrilling boat tour around Bruny Island, renowned for its rugged coastlines, towering cliffs, and abundant marine life. Witness playful dolphins, curious seals, and majestic seabirds in their natural habitat. Explore sea caves and marvel at the breathtaking scenery, including the iconic Breathing Rock.", + "locationName": "Bruny Island", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "tasmania", + "ref": "bruny-island-wilderness-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_bruny-island-wilderness-cruise.jpg" + }, + { + "name": "Mount Wellington Summit Hike", + "description": "Challenge yourself with a rewarding hike to the summit of Mount Wellington, overlooking the city of Hobart. Enjoy panoramic views of the surrounding landscape, including the Derwent River, Bruny Island, and the Tasman Peninsula. This moderately challenging hike offers a unique perspective of Tasmania's capital and its natural beauty.", + "locationName": "Mount Wellington", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "tasmania", + "ref": "mount-wellington-summit-hike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_mount-wellington-summit-hike.jpg" + }, + { + "name": "Tahune Airwalk and Eagle Glide", + "description": "Experience the rainforest from a new perspective at the Tahune Airwalk. Stroll amongst the treetops on a suspended walkway, offering breathtaking views of the Huon River and surrounding forests. For the ultimate thrill, soar through the air on the Eagle Glide zipline, enjoying an exhilarating journey through the canopy.", + "locationName": "Tahune Forest Airwalk", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "tasmania", + "ref": "tahune-airwalk-and-eagle-glide", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_tahune-airwalk-and-eagle-glide.jpg" + }, + { + "name": "Lavender Farm Tour and Aromatherapy Experience", + "description": "Indulge in the tranquility of a lavender farm, surrounded by the soothing scent of purple blooms. Take a guided tour to learn about lavender cultivation and its uses in aromatherapy and relaxation. Enjoy a workshop to create your own lavender-infused products, taking home a piece of Tasmanian serenity.", + "locationName": "Bridestowe Lavender Estate or other Lavender Farms", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "tasmania", + "ref": "lavender-farm-tour-and-aromatherapy-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_lavender-farm-tour-and-aromatherapy-experience.jpg" + }, + { + "name": "Gordon River Cruise and Heritage Landing", + "description": "Embark on a scenic cruise along the Gordon River, venturing deep into the Tasmanian Wilderness World Heritage Area. Witness the untouched beauty of the rainforest, waterfalls, and gorges. Visit Sarah Island, a former penal colony, and learn about its fascinating history.", + "locationName": "Strahan", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "tasmania", + "ref": "gordon-river-cruise-and-heritage-landing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_gordon-river-cruise-and-heritage-landing.jpg" + }, + { + "name": "Kayaking on the Derwent River", + "description": "Embark on a serene kayaking adventure on the Derwent River, gliding past Hobart's cityscape and enjoying breathtaking views of Mount Wellington. Spot playful dolphins, admire historic landmarks like the Tasman Bridge, and immerse yourself in the tranquility of the surrounding nature. Choose from guided tours or self-guided rentals for a personalized experience.", + "locationName": "Derwent River, Hobart", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "tasmania", + "ref": "kayaking-on-the-derwent-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_kayaking-on-the-derwent-river.jpg" + }, + { + "name": "Exploring the Royal Tasmanian Botanical Gardens", + "description": "Wander through the Royal Tasmanian Botanical Gardens, a haven of diverse plant life and serene landscapes. Discover themed gardens like the Japanese Garden and the Subantarctic Plant House, marvel at the vibrant colors of the Conservatory, and enjoy a peaceful picnic amidst the lush greenery. This family-friendly attraction offers something for everyone to appreciate.", + "locationName": "Royal Tasmanian Botanical Gardens, Hobart", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "tasmania", + "ref": "exploring-the-royal-tasmanian-botanical-gardens", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_exploring-the-royal-tasmanian-botanical-gardens.jpg" + }, + { + "name": "Delving into History at the Tasmanian Museum and Art Gallery", + "description": "Immerse yourself in Tasmania's rich history and culture at the Tasmanian Museum and Art Gallery. Explore fascinating exhibits showcasing Aboriginal heritage, colonial artifacts, and contemporary art. Discover the island's unique flora and fauna, learn about its maritime history, and gain insights into the lives of Tasmanian people through the ages.", + "locationName": "Tasmanian Museum and Art Gallery, Hobart", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "tasmania", + "ref": "delving-into-history-at-the-tasmanian-museum-and-art-gallery", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_delving-into-history-at-the-tasmanian-museum-and-art-gallery.jpg" + }, + { + "name": "Mountain Biking on the Blue Derby Trails", + "description": "Experience the thrill of mountain biking on the world-renowned Blue Derby Trails. With options for all skill levels, these purpose-built trails wind through stunning forests, offering exhilarating descents, challenging climbs, and breathtaking views. Rent a bike or join a guided tour to explore this mountain biking paradise.", + "locationName": "Blue Derby, North-East Tasmania", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "tasmania", + "ref": "mountain-biking-on-the-blue-derby-trails", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_mountain-biking-on-the-blue-derby-trails.jpg" + }, + { + "name": "Stargazing at the Cataract Gorge Reserve", + "description": "Escape the city lights and marvel at the celestial wonders above at the Cataract Gorge Reserve. With minimal light pollution, this natural amphitheater offers spectacular views of the night sky. Join a stargazing tour or simply lay back and enjoy the breathtaking spectacle of stars, constellations, and planets.", + "locationName": "Cataract Gorge Reserve, Launceston", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "tasmania", + "ref": "stargazing-at-the-cataract-gorge-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_stargazing-at-the-cataract-gorge-reserve.jpg" + }, + { + "name": "Scuba Diving in the Tasman Peninsula", + "description": "Embark on an underwater adventure exploring the kelp forests, caves, and shipwrecks around the Tasman Peninsula. Encounter diverse marine life, including seals, seahorses, and colorful fish, in the crystal-clear waters. Several dive operators cater to all experience levels, making it a thrilling experience for beginners and seasoned divers alike.", + "locationName": "Tasman Peninsula", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "tasmania", + "ref": "scuba-diving-in-the-tasman-peninsula", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_scuba-diving-in-the-tasman-peninsula.jpg" + }, + { + "name": "Farm-to-Table Culinary Experience", + "description": "Indulge in Tasmania's renowned gastronomy with a farm-to-table dining experience. Visit local farms and producers, learn about sustainable agricultural practices, and savor the freshest seasonal ingredients transformed into delectable dishes. Many restaurants and wineries offer farm-to-table menus, showcasing the island's culinary bounty.", + "locationName": "Various locations throughout Tasmania", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "tasmania", + "ref": "farm-to-table-culinary-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_farm-to-table-culinary-experience.jpg" + }, + { + "name": "Wildlife Spotting at Maria Island National Park", + "description": "Escape to the car-free haven of Maria Island National Park, known for its abundance of wildlife. Hike or bike through diverse landscapes, encountering wombats, kangaroos, wallabies, and Tasmanian devils in their natural habitat. The island's pristine beaches and historic ruins offer a unique blend of nature and culture.", + "locationName": "Maria Island National Park", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "tasmania", + "ref": "wildlife-spotting-at-maria-island-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_wildlife-spotting-at-maria-island-national-park.jpg" + }, + { + "name": "Exploring the Bay of Fires", + "description": "Discover the breathtaking beauty of the Bay of Fires, renowned for its turquoise waters, white sandy beaches, and striking orange-hued granite boulders. Hike along the coast, kayak in the pristine bays, or simply relax on the beach and soak up the scenery. The Bay of Fires offers a perfect blend of relaxation and adventure.", + "locationName": "Bay of Fires", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "tasmania", + "ref": "exploring-the-bay-of-fires", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_exploring-the-bay-of-fires.jpg" + }, + { + "name": "Ghost Tour of Port Arthur", + "description": "Delve into the spooky side of Tasmania's history with a ghost tour of Port Arthur Historic Site. Explore the haunting ruins after dark, listening to chilling tales of convicts and paranormal activity. This eerie yet fascinating experience offers a unique perspective on the site's past.", + "locationName": "Port Arthur Historic Site", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "tasmania", + "ref": "ghost-tour-of-port-arthur", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tasmania_ghost-tour-of-port-arthur.jpg" + }, + { + "name": "Relax on the Beach", + "description": "Spend a day soaking up the sun on the beautiful sandy beaches of Tel Aviv. Take a dip in the refreshing Mediterranean Sea, enjoy water sports like surfing or paddleboarding, or simply relax under a beach umbrella with a good book.", + "locationName": "Gordon Beach, Frishman Beach, or Banana Beach", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "tel-aviv", + "ref": "relax-on-the-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_relax-on-the-beach.jpg" + }, + { + "name": "Explore the Bauhaus Architecture", + "description": "Tel Aviv is renowned for its collection of Bauhaus buildings, a UNESCO World Heritage Site. Take a walking tour or join a guided excursion to admire the unique architectural style and learn about the history of the White City.", + "locationName": "White City", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "tel-aviv", + "ref": "explore-the-bauhaus-architecture", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_explore-the-bauhaus-architecture.jpg" + }, + { + "name": "Wander through Neve Tzedek and Florentin", + "description": "Discover the trendy neighborhoods of Neve Tzedek and Florentin, known for their artistic vibe, boutique shops, and charming cafes. Explore the narrow streets, admire the street art, and soak up the bohemian atmosphere.", + "locationName": "Neve Tzedek and Florentin", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "tel-aviv", + "ref": "wander-through-neve-tzedek-and-florentin", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_wander-through-neve-tzedek-and-florentin.jpg" + }, + { + "name": "Experience the Tel Aviv Nightlife", + "description": "Tel Aviv comes alive at night with its vibrant bar and club scene. Dance the night away at one of the many beachfront clubs, enjoy live music at a local bar, or sip cocktails at a rooftop lounge with stunning city views.", + "locationName": "Rothschild Boulevard, Dizengoff Street", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "tel-aviv", + "ref": "experience-the-tel-aviv-nightlife", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_experience-the-tel-aviv-nightlife.jpg" + }, + { + "name": "Indulge in Culinary Delights", + "description": "Tel Aviv offers a diverse culinary scene with options to satisfy every taste. From traditional Israeli cuisine to international flavors, explore the city's many restaurants, cafes, and food markets. Don't miss the opportunity to try hummus, falafel, and other local specialties.", + "locationName": "Carmel Market, Sarona Market", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "tel-aviv", + "ref": "indulge-in-culinary-delights", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_indulge-in-culinary-delights.jpg" + }, + { + "name": "Jaffa Old City Exploration", + "description": "Embark on a captivating journey through the ancient port city of Jaffa, a historical gem adjacent to Tel Aviv. Wander through its narrow cobblestone streets, discovering hidden alleyways, art galleries, and charming shops. Explore the vibrant Jaffa Flea Market, where you can find unique treasures and antiques. Visit the Ilana Goor Museum, housed in a restored 18th-century building, and admire its eclectic collection of art and artifacts. Immerse yourself in the rich history and cultural tapestry of this ancient city.", + "locationName": "Jaffa", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "tel-aviv", + "ref": "jaffa-old-city-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_jaffa-old-city-exploration.jpg" + }, + { + "name": "Carmel Market Immersion", + "description": "Dive into the vibrant atmosphere of the Carmel Market, a bustling hub of sights, sounds, and aromas. Explore the labyrinthine stalls overflowing with fresh produce, spices, clothing, and souvenirs. Sample local delicacies like hummus, falafel, and freshly squeezed juices. Engage with friendly vendors and experience the authentic energy of Tel Aviv's daily life. The Carmel Market is a feast for the senses and a must-visit for any foodie or cultural enthusiast.", + "locationName": "Carmel Market", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "tel-aviv", + "ref": "carmel-market-immersion", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_carmel-market-immersion.jpg" + }, + { + "name": "Yarkon Park Cycling", + "description": "Escape the urban bustle and enjoy a leisurely bike ride through Yarkon Park, a sprawling green oasis in the heart of Tel Aviv. Rent a bike and explore the park's scenic paths, gardens, and lakes. Visit the Tropical Garden, the Rock Garden, and the Seven Mills. Enjoy a picnic lunch amidst nature or simply relax by the water. Yarkon Park offers a refreshing retreat and a chance to connect with nature.", + "locationName": "Yarkon Park", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "tel-aviv", + "ref": "yarkon-park-cycling", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_yarkon-park-cycling.jpg" + }, + { + "name": "Sarona Market Culinary Delights", + "description": "Indulge in a gastronomic adventure at Sarona Market, a trendy culinary destination featuring a diverse array of restaurants, cafes, and gourmet food stalls. Sample international cuisines, from Italian and Asian to Middle Eastern and Mediterranean. Explore artisanal cheese shops, bakeries, and spice shops. Enjoy a coffee or a glass of wine in a stylish setting. Sarona Market is a paradise for food lovers and offers a taste of Tel Aviv's cosmopolitan culinary scene.", + "locationName": "Sarona Market", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "tel-aviv", + "ref": "sarona-market-culinary-delights", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_sarona-market-culinary-delights.jpg" + }, + { + "name": "Tel Aviv Museum of Art", + "description": "Immerse yourself in the world of art at the Tel Aviv Museum of Art, home to an extensive collection of Israeli and international works. Explore galleries showcasing modern and contemporary art, European masterpieces, and Israeli art from various periods. Admire works by renowned artists such as Van Gogh, Picasso, and Chagall. The museum also hosts temporary exhibitions and cultural events, providing a enriching experience for art enthusiasts.", + "locationName": "Tel Aviv Museum of Art", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "tel-aviv", + "ref": "tel-aviv-museum-of-art", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_tel-aviv-museum-of-art.jpg" + }, + { + "name": "Dive into History at the ANU Museum", + "description": "Embark on a captivating journey through time at the ANU - Museum of the Jewish People. Explore interactive exhibits that showcase the rich history, culture, and traditions of the Jewish people from around the world. Discover fascinating stories, artifacts, and multimedia displays that bring Jewish heritage to life.", + "locationName": "ANU - Museum of the Jewish People", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "tel-aviv", + "ref": "dive-into-history-at-the-anu-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_dive-into-history-at-the-anu-museum.jpg" + }, + { + "name": "Sunset Sail along the Mediterranean Coast", + "description": "Experience the magic of Tel Aviv from a different perspective with a breathtaking sunset sail along the Mediterranean coast. As the sun dips below the horizon, casting golden hues across the water, enjoy panoramic views of the city skyline and coastline while feeling the gentle sea breeze.", + "locationName": "Mediterranean Sea", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "tel-aviv", + "ref": "sunset-sail-along-the-mediterranean-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_sunset-sail-along-the-mediterranean-coast.jpg" + }, + { + "name": "Kayak Adventure on the Yarkon River", + "description": "Embark on an exciting kayaking adventure along the Yarkon River, a scenic waterway that winds its way through the heart of Tel Aviv. Paddle through tranquil waters, surrounded by lush greenery and urban landscapes, and discover hidden corners of the city from a unique perspective. ", + "locationName": "Yarkon River", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "tel-aviv", + "ref": "kayak-adventure-on-the-yarkon-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_kayak-adventure-on-the-yarkon-river.jpg" + }, + { + "name": "Shop at the Dizengoff Center", + "description": "Indulge in a shopping spree at the Dizengoff Center, a sprawling indoor mall featuring a wide array of shops, boutiques, and entertainment options. Explore the latest fashion trends, discover unique souvenirs, and enjoy a diverse selection of dining experiences.", + "locationName": "Dizengoff Center", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "tel-aviv", + "ref": "shop-at-the-dizengoff-center", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_shop-at-the-dizengoff-center.jpg" + }, + { + "name": "Escape to the Tranquility of Hayarkon Park", + "description": "Escape the bustling city life and find serenity in Hayarkon Park, a sprawling green oasis in the heart of Tel Aviv. Enjoy a leisurely stroll or bike ride along the park's scenic paths, have a picnic amidst the lush lawns, or rent a paddleboat and explore the serene lake.", + "locationName": "Hayarkon Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "tel-aviv", + "ref": "escape-to-the-tranquility-of-hayarkon-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_escape-to-the-tranquility-of-hayarkon-park.jpg" + }, + { + "name": "Explore the White City's Architectural Gems", + "description": "Embark on a captivating journey through Tel Aviv's UNESCO-listed White City, renowned for its exceptional collection of Bauhaus buildings. Join a guided walking tour or rent a bike to admire the unique architectural style, characterized by clean lines, white facades, and functional design. Discover iconic landmarks like the Bauhaus Center, Dizengoff Square, and Rothschild Boulevard, and immerse yourself in the city's rich architectural heritage.", + "locationName": "White City", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "tel-aviv", + "ref": "explore-the-white-city-s-architectural-gems", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_explore-the-white-city-s-architectural-gems.jpg" + }, + { + "name": "Unwind in the Serene HaYarkon Park", + "description": "Escape the urban bustle and find tranquility in HaYarkon Park, a sprawling green oasis in the heart of Tel Aviv. Rent a paddleboat on the Yarkon River, enjoy a picnic on the grassy lawns, or explore the various gardens and walking paths. The park also offers sports facilities, a bird sanctuary, and an open-air concert venue, providing something for everyone.", + "locationName": "HaYarkon Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "tel-aviv", + "ref": "unwind-in-the-serene-hayarkon-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_unwind-in-the-serene-hayarkon-park.jpg" + }, + { + "name": "Discover History at the Palmach Museum", + "description": "Delve into Israel's fascinating history at the Palmach Museum, dedicated to the elite fighting force that played a crucial role in the country's War of Independence. Explore interactive exhibits, multimedia displays, and historical artifacts that tell the story of the Palmach's courage and sacrifice. Gain a deeper understanding of Israel's past and its fight for independence.", + "locationName": "Palmach Museum", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "tel-aviv", + "ref": "discover-history-at-the-palmach-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_discover-history-at-the-palmach-museum.jpg" + }, + { + "name": "Experience the Levinsky Market Spice Trail", + "description": "Embark on a sensory adventure through the vibrant Levinsky Market, known for its colorful stalls brimming with spices, dried fruits, nuts, and other culinary delights. Join a guided food tour to learn about the history of the market, sample exotic flavors, and discover hidden culinary gems. Immerse yourself in the sights, smells, and tastes of this unique cultural experience.", + "locationName": "Levinsky Market", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "tel-aviv", + "ref": "experience-the-levinsky-market-spice-trail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_experience-the-levinsky-market-spice-trail.jpg" + }, + { + "name": "Catch a Performance at the Habima National Theatre", + "description": "Experience the magic of live theater at the Habima National Theatre, Israel's premier performing arts venue. Choose from a diverse repertoire of plays, musicals, and dance performances, showcasing local and international talent. Enjoy a captivating evening of entertainment in a beautiful and historic setting.", + "locationName": "Habima National Theatre", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "tel-aviv", + "ref": "catch-a-performance-at-the-habima-national-theatre", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tel-aviv_catch-a-performance-at-the-habima-national-theatre.jpg" + }, + { + "name": "Explore the Historic City of Kazan", + "description": "Discover the rich history and cultural blend of Kazan, the capital of Tatarstan. Visit the Kazan Kremlin, a UNESCO World Heritage Site, and marvel at the Kul Sharif Mosque, a stunning example of Tatar architecture. Wander through the vibrant Bauman Street, known for its shops, restaurants, and street performers. Immerse yourself in the local culture by trying traditional Tatar dishes like echpochmak (triangular pastries filled with meat and potatoes) and chak-chak (a sweet honey pastry).", + "locationName": "Kazan", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "trans-siberian-railway", + "ref": "explore-the-historic-city-of-kazan", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_explore-the-historic-city-of-kazan.jpg" + }, + { + "name": "Cruise on Lake Baikal", + "description": "Experience the beauty and serenity of Lake Baikal, the world's deepest and oldest freshwater lake. Take a boat cruise to explore the lake's crystal-clear waters, rugged coastlines, and diverse wildlife. Visit Olkhon Island, the largest island on Lake Baikal, known for its stunning natural landscapes and ancient shamanistic traditions. Hike to the top of Shaman Rock for panoramic views of the lake and surrounding mountains.", + "locationName": "Lake Baikal", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "trans-siberian-railway", + "ref": "cruise-on-lake-baikal", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_cruise-on-lake-baikal.jpg" + }, + { + "name": "Visit the Winter Palace and Hermitage Museum in St. Petersburg", + "description": "Step into the opulent world of the Tsars at the Winter Palace, the former residence of Russian emperors. Explore the vast Hermitage Museum, one of the largest and most prestigious art museums in the world, housing an extensive collection of art and artifacts from around the globe. Admire masterpieces by renowned artists such as Leonardo da Vinci, Rembrandt, and Michelangelo. Immerse yourself in the grandeur and history of Russia's imperial past.", + "locationName": "St. Petersburg", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "trans-siberian-railway", + "ref": "visit-the-winter-palace-and-hermitage-museum-in-st-petersburg", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_visit-the-winter-palace-and-hermitage-museum-in-st-petersburg.jpg" + }, + { + "name": "Hike in the Altai Mountains", + "description": "Embark on a hiking adventure in the Altai Mountains, a remote and stunning mountain range in southern Siberia. Explore diverse landscapes, from alpine meadows and glaciers to dense forests and turquoise lakes. Challenge yourself with a multi-day trek or opt for a shorter hike to a scenic viewpoint. Immerse yourself in the tranquility of nature and experience the rugged beauty of the Altai region.", + "locationName": "Altai Mountains", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "trans-siberian-railway", + "ref": "hike-in-the-altai-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_hike-in-the-altai-mountains.jpg" + }, + { + "name": "Experience a Traditional Russian Banya", + "description": "Indulge in a relaxing and rejuvenating experience at a traditional Russian banya, a type of steam bath. Enjoy the heat and steam of the banya, followed by a refreshing plunge into cold water. Experience the therapeutic benefits of the banya, which is believed to improve circulation, boost the immune system, and promote relaxation.", + "locationName": "Various locations along the route", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "trans-siberian-railway", + "ref": "experience-a-traditional-russian-banya", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_experience-a-traditional-russian-banya.jpg" + }, + { + "name": "Explore Irkutsk, the 'Paris of Siberia'", + "description": "Discover the charming city of Irkutsk, known for its Siberian Baroque architecture, vibrant cultural scene, and proximity to Lake Baikal. Visit the 19th-century wooden houses, explore the Decembrist Museum, and wander through the bustling market.", + "locationName": "Irkutsk", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "trans-siberian-railway", + "ref": "explore-irkutsk-the-paris-of-siberia-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_explore-irkutsk-the-paris-of-siberia-.jpg" + }, + { + "name": "Go Dog Sledding in Siberia", + "description": "Experience the thrill of dog sledding through the snowy landscapes of Siberia. Learn about the traditional way of life for indigenous people and mush your own team of huskies across the frozen wilderness.", + "locationName": "Siberia", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "trans-siberian-railway", + "ref": "go-dog-sledding-in-siberia", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_go-dog-sledding-in-siberia.jpg" + }, + { + "name": "Visit the Yekaterinburg Museum of Fine Arts", + "description": "Immerse yourself in Russian art at the Yekaterinburg Museum of Fine Arts. Admire a diverse collection of paintings, sculptures, and decorative arts, spanning from the 16th century to modern times.", + "locationName": "Yekaterinburg", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "trans-siberian-railway", + "ref": "visit-the-yekaterinburg-museum-of-fine-arts", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_visit-the-yekaterinburg-museum-of-fine-arts.jpg" + }, + { + "name": "Delve into the History of the Gulag at Perm-36", + "description": "Gain insight into the Soviet era with a visit to Perm-36, a former Gulag labor camp turned museum. Explore the preserved barracks, solitary confinement cells, and exhibits that document the harsh realities of the camp system.", + "locationName": "Perm-36", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "trans-siberian-railway", + "ref": "delve-into-the-history-of-the-gulag-at-perm-36", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_delve-into-the-history-of-the-gulag-at-perm-36.jpg" + }, + { + "name": "Take a Cooking Class and Learn to Make Pelmeni", + "description": "Discover the secrets of Russian cuisine with a hands-on cooking class. Learn how to make pelmeni, traditional Russian dumplings, and enjoy the fruits of your labor with a delicious meal.", + "locationName": "Various cities along the route", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "trans-siberian-railway", + "ref": "take-a-cooking-class-and-learn-to-make-pelmeni", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_take-a-cooking-class-and-learn-to-make-pelmeni.jpg" + }, + { + "name": "Visit the Golden Ring Cities", + "description": "Embark on a captivating detour from the main Trans-Siberian route to explore the Golden Ring, a collection of ancient towns northeast of Moscow. Immerse yourself in Russia's rich history and culture as you admire the iconic onion domes, kremlins, and monasteries in towns like Suzdal, Vladimir, and Sergiev Posad. Experience the charm of traditional Russian life, sample local crafts, and witness the architectural masterpieces that have stood for centuries.", + "locationName": "Golden Ring Cities (e.g., Suzdal, Vladimir, Sergiev Posad)", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "trans-siberian-railway", + "ref": "visit-the-golden-ring-cities", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_visit-the-golden-ring-cities.jpg" + }, + { + "name": "Explore the Ulan-Ude Buddhist Temples", + "description": "Step into a different world in Ulan-Ude, the capital of the Republic of Buryatia, where Tibetan Buddhism thrives. Visit the Ivolginsky Datsan, the largest Buddhist temple complex in Russia, and witness the intricate architecture, colorful prayer flags, and serene atmosphere. Engage with the monks, learn about Buddhist traditions, and experience a unique cultural fusion.", + "locationName": "Ulan-Ude", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "trans-siberian-railway", + "ref": "explore-the-ulan-ude-buddhist-temples", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_explore-the-ulan-ude-buddhist-temples.jpg" + }, + { + "name": "Go Ice Fishing on Lake Baikal", + "description": "For a true Siberian adventure, try ice fishing on the frozen surface of Lake Baikal, the world's deepest lake. Experience the thrill of drilling through the thick ice and casting your line into the crystal-clear waters. Learn about traditional ice fishing techniques from local guides and enjoy the tranquility of the winter landscape.", + "locationName": "Lake Baikal", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "trans-siberian-railway", + "ref": "go-ice-fishing-on-lake-baikal", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_go-ice-fishing-on-lake-baikal.jpg" + }, + { + "name": "Visit the Novosibirsk Opera and Ballet Theatre", + "description": "Indulge in a night of culture and elegance at the Novosibirsk Opera and Ballet Theatre, one of the largest opera houses in the world. Witness world-class performances of classic operas, ballets, and contemporary productions in a stunning architectural setting. Dress up for the occasion and enjoy a taste of Russia's vibrant performing arts scene.", + "locationName": "Novosibirsk", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "trans-siberian-railway", + "ref": "visit-the-novosibirsk-opera-and-ballet-theatre", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_visit-the-novosibirsk-opera-and-ballet-theatre.jpg" + }, + { + "name": "Take a Siberian Husky Sled Ride", + "description": "Experience the thrill of gliding through the snowy Siberian landscape on a sled pulled by a team of energetic Siberian Huskies. Enjoy the crisp winter air and the stunning scenery as you mush through forests and across frozen lakes. Learn about the history of dog sledding in Siberia and the special bond between mushers and their dogs.", + "locationName": "Various locations in Siberia", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "trans-siberian-railway", + "ref": "take-a-siberian-husky-sled-ride", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_take-a-siberian-husky-sled-ride.jpg" + }, + { + "name": "Visit the Kizhi Island Open-Air Museum", + "description": "Step back in time at the Kizhi Island Open-Air Museum, a UNESCO World Heritage Site showcasing traditional wooden architecture from the Karelia region. Marvel at the intricate craftsmanship of the Church of the Transfiguration with its 22 onion domes, explore historic windmills and peasant houses, and immerse yourself in the rich cultural heritage of the Russian north. This open-air museum offers a unique glimpse into rural life and architectural traditions.", + "locationName": "Kizhi Island, Lake Onega", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "trans-siberian-railway", + "ref": "visit-the-kizhi-island-open-air-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_visit-the-kizhi-island-open-air-museum.jpg" + }, + { + "name": "Explore the Charm of Yaroslavl", + "description": "Discover the historic city of Yaroslavl, one of the Golden Ring cities and a UNESCO World Heritage Site. Wander through the well-preserved historical center, admire the 16th-century Spassky Monastery and the Church of Elijah the Prophet, and soak in the vibrant atmosphere of the city's many squares and parks. Yaroslavl offers a delightful blend of history, culture, and architectural beauty.", + "locationName": "Yaroslavl", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "trans-siberian-railway", + "ref": "explore-the-charm-of-yaroslavl", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_explore-the-charm-of-yaroslavl.jpg" + }, + { + "name": "Go Hiking or Biking in the Ural Mountains", + "description": "Embark on an outdoor adventure in the Ural Mountains, the natural border between Europe and Asia. Hike through scenic trails, breathe in the fresh mountain air, and enjoy breathtaking views of the surrounding landscapes. For thrill-seekers, mountain biking offers an exhilarating way to experience the rugged beauty of the Urals. This activity is perfect for those seeking an active escape amidst stunning natural scenery.", + "locationName": "Ural Mountains", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "trans-siberian-railway", + "ref": "go-hiking-or-biking-in-the-ural-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_go-hiking-or-biking-in-the-ural-mountains.jpg" + }, + { + "name": "Visit the Taltsy Museum of Wooden Architecture", + "description": "Immerse yourself in Siberian history and culture at the Taltsy Museum, an open-air museum showcasing traditional wooden architecture from the 17th to 20th centuries. Explore relocated historical buildings, including peasant houses, a watchtower, and a watermill, and learn about the way of life of Siberian people in times gone by. The museum offers a fascinating journey through the region's past.", + "locationName": "Taltsy Museum, near Irkutsk", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "trans-siberian-railway", + "ref": "visit-the-taltsy-museum-of-wooden-architecture", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_visit-the-taltsy-museum-of-wooden-architecture.jpg" + }, + { + "name": "Sample Local Cuisine and Vodka", + "description": "Embark on a culinary journey and savor the flavors of Russia. Indulge in traditional dishes like borscht, pelmeni, and beef stroganoff, and sample a variety of local vodkas. Whether you choose a cozy restaurant or a lively food market, this experience is a must for food enthusiasts looking to explore the rich culinary heritage of the region.", + "locationName": "Various locations along the Trans-Siberian Railway", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "trans-siberian-railway", + "ref": "sample-local-cuisine-and-vodka", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/trans-siberian-railway_sample-local-cuisine-and-vodka.jpg" + }, + { + "name": "Explore Bran Castle", + "description": "Step into the legendary Bran Castle, perched high on a rocky cliff. This iconic landmark, often associated with Dracula, offers a glimpse into medieval history with its Gothic architecture, secret passages, and intriguing exhibits. Explore the castle's chambers, learn about Vlad the Impaler's connection to the legend, and enjoy breathtaking views of the surrounding landscape.", + "locationName": "Bran Castle", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "transylvania", + "ref": "explore-bran-castle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_explore-bran-castle.jpg" + }, + { + "name": "Hike in the Carpathian Mountains", + "description": "Embark on a scenic hike through the stunning Carpathian Mountains. Choose from various trails, ranging from easy walks to challenging climbs, and discover picturesque landscapes, hidden waterfalls, and diverse flora and fauna. Keep an eye out for wildlife like brown bears, wolves, and lynx as you immerse yourself in the natural beauty of the region.", + "locationName": "Carpathian Mountains", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "transylvania", + "ref": "hike-in-the-carpathian-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_hike-in-the-carpathian-mountains.jpg" + }, + { + "name": "Wander through Sibiu's Old Town", + "description": "Get lost in the charming streets of Sibiu's Old Town, a UNESCO World Heritage Site. Admire the colorful medieval houses, explore the historic squares, and visit impressive landmarks like the Brukenthal Palace and the Evangelical Cathedral. Enjoy the relaxed atmosphere, indulge in delicious Romanian cuisine at local restaurants, and discover unique souvenirs at craft shops.", + "locationName": "Sibiu", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "transylvania", + "ref": "wander-through-sibiu-s-old-town", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_wander-through-sibiu-s-old-town.jpg" + }, + { + "name": "Discover the Fortified Churches of Transylvania", + "description": "Embark on a journey through history and visit the unique fortified churches of Transylvania. These UNESCO-listed Saxon villages boast impressive churches surrounded by fortified walls, offering a glimpse into the region's past. Explore villages like Biertan, Viscri, and Prejmer, admire the architectural marvels, and learn about the Saxon heritage of Transylvania.", + "locationName": "Various villages in Transylvania", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "transylvania", + "ref": "discover-the-fortified-churches-of-transylvania", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_discover-the-fortified-churches-of-transylvania.jpg" + }, + { + "name": "Indulge in a Traditional Romanian Feast", + "description": "Treat your taste buds to a delicious Romanian feast at a local restaurant or guesthouse. Savor traditional dishes like sarmale (stuffed cabbage rolls), mici (grilled minced meat rolls), and papanasi (fried doughnuts with sour cream and jam). Enjoy the warm hospitality and immerse yourself in the culinary culture of Transylvania.", + "locationName": "Various restaurants and guesthouses throughout Transylvania", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "transylvania", + "ref": "indulge-in-a-traditional-romanian-feast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_indulge-in-a-traditional-romanian-feast.jpg" + }, + { + "name": "Bear Watching in the Carpathian Mountains", + "description": "Embark on a thrilling wildlife adventure in the Carpathian Mountains, home to one of Europe's largest brown bear populations. Join a guided tour and observe these majestic creatures in their natural habitat, learning about their behavior and conservation efforts. Witnessing these magnificent animals up close is an unforgettable experience.", + "locationName": "Carpathian Mountains", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "transylvania", + "ref": "bear-watching-in-the-carpathian-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_bear-watching-in-the-carpathian-mountains.jpg" + }, + { + "name": "Scenic Drive on the Transfagarasan Highway", + "description": "Experience one of the most breathtaking drives in Europe on the Transfagarasan Highway. This winding mountain road offers stunning vistas of the Carpathian Mountains, with dramatic landscapes, cascading waterfalls, and glacial lakes. Stop at Balea Lake for a cable car ride to the summit and enjoy panoramic views.", + "locationName": "Transfagarasan Highway", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "transylvania", + "ref": "scenic-drive-on-the-transfagarasan-highway", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_scenic-drive-on-the-transfagarasan-highway.jpg" + }, + { + "name": "Relaxation and Rejuvenation at a Thermal Spa", + "description": "Indulge in a day of pampering and relaxation at one of Transylvania's renowned thermal spas. Experience the therapeutic benefits of mineral-rich waters, enjoy various spa treatments, and unwind in serene surroundings. Popular options include the Baile Felix and Sovata resorts, known for their healing properties and beautiful landscapes.", + "locationName": "Baile Felix or Sovata", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "transylvania", + "ref": "relaxation-and-rejuvenation-at-a-thermal-spa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_relaxation-and-rejuvenation-at-a-thermal-spa.jpg" + }, + { + "name": "Caving Adventure in the Apuseni Mountains", + "description": "Explore the hidden world beneath the surface with a caving adventure in the Apuseni Mountains. Discover stunning cave formations, underground rivers, and unique geological features. Join a guided tour to navigate the caves safely and learn about their fascinating history and ecosystem. This thrilling experience is perfect for adventurous travelers.", + "locationName": "Apuseni Mountains", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "transylvania", + "ref": "caving-adventure-in-the-apuseni-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_caving-adventure-in-the-apuseni-mountains.jpg" + }, + { + "name": "Wine Tasting in the Jidvei Wine Region", + "description": "Discover the rich flavors of Romanian wine with a visit to the Jidvei wine region. Explore the vineyards, learn about the winemaking process, and enjoy guided tastings of local varieties. Savor the unique character of Transylvanian wines, from crisp whites to full-bodied reds, and experience the region's viticultural heritage.", + "locationName": "Jidvei", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 2, + "destinationRef": "transylvania", + "ref": "wine-tasting-in-the-jidvei-wine-region", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_wine-tasting-in-the-jidvei-wine-region.jpg" + }, + { + "name": "Horseback Riding in the Transylvanian Countryside", + "description": "Embark on a horseback riding adventure through the picturesque Transylvanian countryside. Explore rolling hills, meadows, and forests, taking in the fresh air and stunning scenery. This activity offers a unique way to connect with nature and experience the traditional rural lifestyle of the region.", + "locationName": "Various locations throughout Transylvania", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "transylvania", + "ref": "horseback-riding-in-the-transylvanian-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_horseback-riding-in-the-transylvanian-countryside.jpg" + }, + { + "name": "Visit the UNESCO-listed Villages with Fortified Churches", + "description": "Explore the unique UNESCO-listed villages with fortified churches, such as Biertan, Viscri, and Saschiz. These villages offer a glimpse into the history and culture of the Transylvanian Saxons, with their impressive fortifications and well-preserved medieval architecture.", + "locationName": "Biertan, Viscri, Saschiz", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "transylvania", + "ref": "visit-the-unesco-listed-villages-with-fortified-churches", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_visit-the-unesco-listed-villages-with-fortified-churches.jpg" + }, + { + "name": "Attend a Traditional Folk Festival", + "description": "Immerse yourself in the vibrant culture of Transylvania by attending a traditional folk festival. Experience lively music, colorful costumes, and energetic dances, and learn about the region's rich folklore and customs.", + "locationName": "Various locations throughout Transylvania", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "transylvania", + "ref": "attend-a-traditional-folk-festival", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_attend-a-traditional-folk-festival.jpg" + }, + { + "name": "Explore the Turda Salt Mine", + "description": "Descend into the depths of the Turda Salt Mine, a unique underground world with a fascinating history. Marvel at the impressive salt formations, take a boat ride on the subterranean lake, and enjoy the therapeutic benefits of the salty air.", + "locationName": "Turda", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "transylvania", + "ref": "explore-the-turda-salt-mine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_explore-the-turda-salt-mine.jpg" + }, + { + "name": "Visit the Corvin Castle", + "description": "Explore the magnificent Corvin Castle, also known as Hunyadi Castle, a Gothic-Renaissance masterpiece with a rich history dating back to the 15th century. Discover its impressive architecture, legends of Vlad the Impaler, and captivating stories of medieval times.", + "locationName": "Hunedoara", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "transylvania", + "ref": "visit-the-corvin-castle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_visit-the-corvin-castle.jpg" + }, + { + "name": "Cycle through the picturesque countryside", + "description": "Embark on a cycling adventure through the rolling hills and charming villages of Transylvania. Pedal past sunflower fields, vineyards, and ancient forests, taking in the fresh air and stunning scenery. Choose from various routes suitable for different fitness levels, and discover hidden gems along the way.", + "locationName": "Transylvanian Countryside", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "transylvania", + "ref": "cycle-through-the-picturesque-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_cycle-through-the-picturesque-countryside.jpg" + }, + { + "name": "Kayaking on the Danube River", + "description": "Experience the tranquility of the Danube River on a kayaking excursion. Paddle along the scenic waterways, surrounded by lush landscapes and diverse wildlife. Enjoy the peaceful atmosphere and observe the natural beauty of the Danube Delta, a UNESCO World Heritage Site.", + "locationName": "Danube Delta", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "transylvania", + "ref": "kayaking-on-the-danube-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_kayaking-on-the-danube-river.jpg" + }, + { + "name": "Stargazing in the Carpathian Mountains", + "description": "Escape the city lights and immerse yourself in the breathtaking night sky of the Carpathian Mountains. Join a stargazing tour led by experienced astronomers, who will guide you through the constellations and share fascinating stories about the cosmos. Witness the Milky Way in all its glory and marvel at the vastness of the universe.", + "locationName": "Carpathian Mountains", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "transylvania", + "ref": "stargazing-in-the-carpathian-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_stargazing-in-the-carpathian-mountains.jpg" + }, + { + "name": "Photography tour of Saxon villages", + "description": "Capture the unique charm of Transylvanian Saxon villages on a photography tour. Explore the well-preserved architecture, colorful houses, and fortified churches, learning about the history and culture of these communities. Receive expert guidance from a professional photographer and create stunning images that will preserve your memories of this enchanting region.", + "locationName": "Saxon Villages", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "transylvania", + "ref": "photography-tour-of-saxon-villages", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_photography-tour-of-saxon-villages.jpg" + }, + { + "name": "Attend a traditional craft workshop", + "description": "Immerse yourself in the rich cultural heritage of Transylvania by participating in a traditional craft workshop. Learn the art of pottery, woodcarving, or weaving from skilled artisans and create your own unique souvenir. Gain insights into the region's artistic traditions and take home a piece of Transylvanian craftsmanship.", + "locationName": "Various locations", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "transylvania", + "ref": "attend-a-traditional-craft-workshop", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/transylvania_attend-a-traditional-craft-workshop.jpg" + }, + { + "name": "Explore the Tulum Archaeological Site", + "description": "Step back in time and immerse yourself in Mayan history at the Tulum Archaeological Site. Wander through the ancient ruins, marvel at the iconic El Castillo temple perched on a cliff overlooking the turquoise Caribbean Sea, and imagine life in this once-thriving Mayan port city.", + "locationName": "Tulum Archaeological Site", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "tulum", + "ref": "explore-the-tulum-archaeological-site", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_explore-the-tulum-archaeological-site.jpg" + }, + { + "name": "Relax on Tulum's Pristine Beaches", + "description": "Unwind on the soft white sand beaches of Tulum, where the gentle waves of the Caribbean Sea meet the shore. Soak up the sun, swim in the crystal-clear waters, or simply relax under a palm tree with a refreshing drink. For a more secluded experience, head to Playa Paraíso or Playa Rucondido.", + "locationName": "Tulum Beaches", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "tulum", + "ref": "relax-on-tulum-s-pristine-beaches", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_relax-on-tulum-s-pristine-beaches.jpg" + }, + { + "name": "Dive into Cenotes", + "description": "Embark on a unique adventure and explore the mesmerizing cenotes, natural sinkholes filled with crystal-clear freshwater. Snorkel or scuba dive through these enchanting underwater worlds, discovering hidden caves, stalactites, and stalagmites. Gran Cenote and Cenote Dos Ojos are popular choices, offering unforgettable experiences for all levels.", + "locationName": "Gran Cenote or Cenote Dos Ojos", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "tulum", + "ref": "dive-into-cenotes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_dive-into-cenotes.jpg" + }, + { + "name": "Indulge in a Wellness Retreat", + "description": "Escape the stress of everyday life and rejuvenate your mind, body, and soul at one of Tulum's renowned wellness retreats. Practice yoga overlooking the ocean, indulge in spa treatments inspired by Mayan traditions, and connect with nature in a serene and tranquil environment.", + "locationName": "Various wellness centers and resorts", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "tulum", + "ref": "indulge-in-a-wellness-retreat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_indulge-in-a-wellness-retreat.jpg" + }, + { + "name": "Savor Culinary Delights", + "description": "Embark on a culinary journey and explore Tulum's diverse gastronomic scene. From beachfront restaurants serving fresh seafood to trendy cafes offering organic and sustainable cuisine, there's something to tantalize every palate. Don't miss the chance to try traditional Mayan dishes and experience the unique flavors of the region.", + "locationName": "Various restaurants and cafes in Tulum", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "tulum", + "ref": "savor-culinary-delights", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_savor-culinary-delights.jpg" + }, + { + "name": "Jungle Maya Native Park Adventure", + "description": "Embark on a thrilling journey into the heart of the Mayan jungle. Zip-line through the lush canopy, rappel into hidden cenotes for a refreshing swim, and participate in an authentic Mayan blessing ceremony. This action-packed experience offers a unique blend of adventure and cultural immersion.", + "locationName": "Jungle Maya Native Park", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "tulum", + "ref": "jungle-maya-native-park-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_jungle-maya-native-park-adventure.jpg" + }, + { + "name": "Sunset Horseback Riding on the Beach", + "description": "Experience the magic of Tulum's coastline on horseback as the sun dips below the horizon. Ride along the pristine beach, feeling the gentle sea breeze and witnessing the breathtaking colors of the sky. This romantic and unforgettable activity is perfect for couples or anyone seeking a serene connection with nature.", + "locationName": "Tulum Beach", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "tulum", + "ref": "sunset-horseback-riding-on-the-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_sunset-horseback-riding-on-the-beach.jpg" + }, + { + "name": "Sian Ka'an Biosphere Reserve Tour", + "description": "Discover the incredible biodiversity of the Sian Ka'an Biosphere Reserve, a UNESCO World Heritage Site. Explore its intricate network of lagoons, mangroves, and tropical forests by boat, encountering diverse wildlife such as dolphins, turtles, and exotic birds. This eco-conscious tour provides a glimpse into the region's rich natural heritage.", + "locationName": "Sian Ka'an Biosphere Reserve", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "tulum", + "ref": "sian-ka-an-biosphere-reserve-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_sian-ka-an-biosphere-reserve-tour.jpg" + }, + { + "name": "Tulum Art Walk and Shopping", + "description": "Immerse yourself in Tulum's vibrant art scene by strolling through its art galleries and boutiques. Discover unique handcrafted jewelry, textiles, and paintings by local artisans. This leisurely activity is perfect for finding special souvenirs and supporting the community's creative spirit.", + "locationName": "Tulum Town", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "tulum", + "ref": "tulum-art-walk-and-shopping", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_tulum-art-walk-and-shopping.jpg" + }, + { + "name": "Live Music and Nightlife", + "description": "Experience Tulum's energetic nightlife scene, with beach clubs and bars offering live music, DJs, and dancing under the stars. Enjoy cocktails and soak up the vibrant atmosphere as you connect with fellow travelers and locals. This adults-only activity is perfect for those seeking a lively and social evening.", + "locationName": "Tulum Beach", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "tulum", + "ref": "live-music-and-nightlife", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_live-music-and-nightlife.jpg" + }, + { + "name": "Muyil River Float and Mayan Community Visit", + "description": "Embark on a unique cultural experience, floating down the crystal-clear Muyil River in the Sian Ka'an Biosphere Reserve. Interact with the local Mayan community, learning about their traditions, way of life, and connection to the natural environment. This activity provides a deeper understanding of the region's rich heritage.", + "locationName": "Sian Ka'an Biosphere Reserve", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "tulum", + "ref": "muyil-river-float-and-mayan-community-visit", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_muyil-river-float-and-mayan-community-visit.jpg" + }, + { + "name": "Bike Tour through Tulum's Pueblo", + "description": "Explore the vibrant town of Tulum on two wheels, cycling through its charming streets and discovering hidden gems. Visit local markets, street art murals, and authentic eateries, experiencing the town's unique atmosphere and local culture at your own pace.", + "locationName": "Tulum Pueblo", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "tulum", + "ref": "bike-tour-through-tulum-s-pueblo", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_bike-tour-through-tulum-s-pueblo.jpg" + }, + { + "name": "Cooking Class with a Local Chef", + "description": "Delve into the world of Mexican cuisine with a hands-on cooking class. Learn traditional recipes and techniques from a local chef, preparing authentic dishes using fresh, regional ingredients. This immersive experience allows you to savor the flavors of Mexico and recreate them at home.", + "locationName": "Various locations", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "tulum", + "ref": "cooking-class-with-a-local-chef", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_cooking-class-with-a-local-chef.jpg" + }, + { + "name": "Temazcal Ceremony", + "description": "Participate in a traditional Temazcal ceremony, a Mayan steam bath ritual used for purification and spiritual cleansing. Led by a shaman, this ancient practice combines heat, herbs, and chanting to promote relaxation, detoxification, and a connection to nature.", + "locationName": "Various locations", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "tulum", + "ref": "temazcal-ceremony", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_temazcal-ceremony.jpg" + }, + { + "name": "Stargazing on the Beach", + "description": "Escape the city lights and experience the magic of Tulum's night sky. Join a guided stargazing tour on the beach, learning about constellations, planets, and the wonders of the universe. The clear, dark skies provide an unforgettable opportunity to connect with nature and marvel at the cosmos.", + "locationName": "Tulum Beaches", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 2, + "destinationRef": "tulum", + "ref": "stargazing-on-the-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_stargazing-on-the-beach.jpg" + }, + { + "name": "Coba Ruins Day Trip", + "description": "Embark on a journey to the ancient Mayan city of Coba, nestled deep within the jungle. Climb the Nohoch Mul pyramid, the tallest in the Yucatan Peninsula, and enjoy breathtaking panoramic views. Explore the vast complex of temples, ball courts, and sacbeob (ancient Mayan roads) by bicycle or on foot, and immerse yourself in the rich history and culture of this remarkable site.", + "locationName": "Coba", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "tulum", + "ref": "coba-ruins-day-trip", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_coba-ruins-day-trip.jpg" + }, + { + "name": "Scuba Diving in the Mesoamerican Reef", + "description": "Dive into the turquoise waters of the Mesoamerican Reef, the second-largest coral reef system in the world. Discover an underwater paradise teeming with vibrant marine life, including colorful fish, graceful sea turtles, and majestic manta rays. Explore underwater caves and caverns, or visit the unique Museo Subacuático de Arte (MUSA), an underwater museum featuring sculptures that promote coral life.", + "locationName": "Mesoamerican Reef", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "tulum", + "ref": "scuba-diving-in-the-mesoamerican-reef", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_scuba-diving-in-the-mesoamerican-reef.jpg" + }, + { + "name": "Kaan Luum Lagoon", + "description": "Escape the crowds and unwind in the serene beauty of Kaan Luum Lagoon. This hidden gem boasts crystal-clear waters with varying shades of blue and green, surrounded by lush mangroves. Float in the shallows, take a dip in the cenote at the lagoon's center, or simply relax in a hammock and soak up the tranquil atmosphere.", + "locationName": "Kaan Luum Lagoon", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "tulum", + "ref": "kaan-luum-lagoon", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_kaan-luum-lagoon.jpg" + }, + { + "name": "Tulum Tower and Cenote Encantado", + "description": "Climb the iconic Tulum Tower, a watchtower built by the Mayans for coastal surveillance, and enjoy stunning views of the Caribbean Sea and the Tulum Archaeological Site. Afterwards, take a refreshing swim in the nearby Cenote Encantado, a hidden oasis with crystal-clear waters and a rope swing for adventurous souls.", + "locationName": "Tulum Tower and Cenote Encantado", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "tulum", + "ref": "tulum-tower-and-cenote-encantado", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_tulum-tower-and-cenote-encantado.jpg" + }, + { + "name": "Local Market and Street Food Tour", + "description": "Immerse yourself in the vibrant local culture with a visit to a Tulum market. Explore the colorful stalls filled with fresh produce, handcrafted souvenirs, and traditional Mexican clothing. Indulge in a culinary adventure by sampling delicious street food, such as tacos, tamales, and marquesitas, while interacting with friendly vendors and experiencing the authentic flavors of Mexico.", + "locationName": "Tulum Markets", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "tulum", + "ref": "local-market-and-street-food-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tulum_local-market-and-street-food-tour.jpg" + }, + { + "name": "Explore the Ancient City of Ephesus", + "description": "Step back in time and wander through the remarkably preserved ruins of Ephesus, once a thriving Roman city. Marvel at the Library of Celsus, the Temple of Hadrian, and the Great Theatre, imagining life in ancient times. Guided tours offer fascinating insights into the history and culture of this UNESCO World Heritage Site.", + "locationName": "Ephesus", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "turkish-riviera", + "ref": "explore-the-ancient-city-of-ephesus", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_explore-the-ancient-city-of-ephesus.jpg" + }, + { + "name": "Relax on the Beaches of Antalya", + "description": "Soak up the sun on the golden sands of Antalya's stunning beaches. Whether you choose the popular Konyaalti Beach or the secluded Kaputas Beach, you'll be treated to crystal-clear turquoise waters and breathtaking coastal views. Enjoy swimming, sunbathing, or simply relaxing with a good book.", + "locationName": "Antalya", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "turkish-riviera", + "ref": "relax-on-the-beaches-of-antalya", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_relax-on-the-beaches-of-antalya.jpg" + }, + { + "name": "Embark on a Blue Cruise", + "description": "Set sail on a traditional Turkish gulet and experience the beauty of the Turkish Riviera from the water. Cruise along the coastline, stopping at secluded coves, hidden beaches, and charming coastal towns. Enjoy swimming, snorkeling, and sunbathing on deck, while indulging in delicious Turkish cuisine prepared by the onboard chef.", + "locationName": "Turkish Riviera", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "turkish-riviera", + "ref": "embark-on-a-blue-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_embark-on-a-blue-cruise.jpg" + }, + { + "name": "Discover the Underwater World", + "description": "Dive into the crystal-clear waters of the Mediterranean and explore the vibrant marine life. The Turkish Riviera offers numerous diving and snorkeling spots, where you can encounter colorful fish, ancient shipwrecks, and fascinating underwater landscapes. Whether you're a beginner or an experienced diver, there's an underwater adventure waiting for you.", + "locationName": "Kaş or Kalkan", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "turkish-riviera", + "ref": "discover-the-underwater-world", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_discover-the-underwater-world.jpg" + }, + { + "name": "Indulge in a Turkish Bath Experience", + "description": "Treat yourself to a traditional Turkish bath, also known as a hammam. Experience the ultimate relaxation as you enjoy a steam bath, followed by a body scrub and a soothing massage. This centuries-old tradition is a perfect way to unwind and rejuvenate your body and mind.", + "locationName": "Turkish Riviera", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 2, + "destinationRef": "turkish-riviera", + "ref": "indulge-in-a-turkish-bath-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_indulge-in-a-turkish-bath-experience.jpg" + }, + { + "name": "Hike the Lycian Way", + "description": "Embark on a breathtaking journey along the Lycian Way, a 540-kilometer trail that winds through ancient ruins, secluded coves, and dramatic coastal cliffs. Choose from various sections based on your fitness level, and experience the region's natural beauty and rich history.", + "locationName": "Lycian Way", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "turkish-riviera", + "ref": "hike-the-lycian-way", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_hike-the-lycian-way.jpg" + }, + { + "name": "Go White Water Rafting on the Köprülü River", + "description": "Experience an adrenaline-pumping adventure with white water rafting on the Köprülü River. Navigate through thrilling rapids surrounded by stunning canyon scenery. This activity is perfect for adventure seekers and nature enthusiasts.", + "locationName": "Köprülü River", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "turkish-riviera", + "ref": "go-white-water-rafting-on-the-k-pr-l-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_go-white-water-rafting-on-the-k-pr-l-river.jpg" + }, + { + "name": "Explore the Vibrant City of Antalya", + "description": "Wander through the charming streets of Antalya, a bustling city with a rich history and vibrant culture. Visit Kaleiçi, the historic old town, with its Ottoman-era houses and charming shops. Explore Hadrian's Gate, a triumphal arch dating back to the Roman era, and discover the Antalya Museum with its impressive collection of artifacts.", + "locationName": "Antalya", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "turkish-riviera", + "ref": "explore-the-vibrant-city-of-antalya", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_explore-the-vibrant-city-of-antalya.jpg" + }, + { + "name": "Take a Cooking Class and Learn to Make Traditional Turkish Dishes", + "description": "Delve into the culinary world of Turkey by taking a cooking class. Learn to prepare authentic dishes like meze platters, kebabs, and baklava, under the guidance of local chefs. This immersive experience offers a delicious way to connect with Turkish culture.", + "locationName": "Various locations", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "turkish-riviera", + "ref": "take-a-cooking-class-and-learn-to-make-traditional-turkish-dishes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_take-a-cooking-class-and-learn-to-make-traditional-turkish-dishes.jpg" + }, + { + "name": "Visit the Picturesque Town of Kaş", + "description": "Escape to the charming town of Kaş, known for its bohemian atmosphere, stunning beaches, and ancient Lycian ruins. Explore the narrow streets lined with boutique shops and cafes, or relax on the pebble beaches and enjoy the crystal-clear waters. For a unique experience, take a boat trip to the nearby Greek island of Meis.", + "locationName": "Kaş", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "turkish-riviera", + "ref": "visit-the-picturesque-town-of-ka-", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_visit-the-picturesque-town-of-ka-.jpg" + }, + { + "name": "Paraglide Over Ölüdeniz", + "description": "Experience the breathtaking beauty of Ölüdeniz from a bird's-eye view as you soar through the sky on a tandem paragliding adventure. Take off from the Babadağ Mountain and glide over the turquoise waters, sandy beaches, and lush landscapes, creating an unforgettable memory.", + "locationName": "Ölüdeniz", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 4, + "destinationRef": "turkish-riviera", + "ref": "paraglide-over-l-deniz", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_paraglide-over-l-deniz.jpg" + }, + { + "name": "Visit the Saklikent Gorge", + "description": "Embark on a journey to Saklikent Gorge, one of the deepest canyons in the world. Hike through the cool, rushing waters, admire the towering cliffs, and discover hidden waterfalls. This natural wonder offers a refreshing escape from the summer heat.", + "locationName": "Saklikent National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "turkish-riviera", + "ref": "visit-the-saklikent-gorge", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_visit-the-saklikent-gorge.jpg" + }, + { + "name": "Explore the Ghost Village of Kayaköy", + "description": "Step back in time and explore the haunting ruins of Kayaköy, a once-thriving Greek village abandoned in the early 20th century. Wander through the deserted streets, houses, and churches, and learn about the village's history and the population exchange between Greece and Turkey.", + "locationName": "Kayaköy", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "turkish-riviera", + "ref": "explore-the-ghost-village-of-kayak-y", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_explore-the-ghost-village-of-kayak-y.jpg" + }, + { + "name": "Shop at the Fethiye Market", + "description": "Immerse yourself in the vibrant atmosphere of the Fethiye Market, where you can find an array of local goods, including fresh produce, spices, textiles, and souvenirs. Practice your bargaining skills and discover unique treasures to take home.", + "locationName": "Fethiye", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "turkish-riviera", + "ref": "shop-at-the-fethiye-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_shop-at-the-fethiye-market.jpg" + }, + { + "name": "Enjoy a Traditional Turkish Night", + "description": "Experience the vibrant culture of Turkey with a traditional Turkish night. Enjoy a delicious dinner with local cuisine, watch captivating belly dancing performances, and listen to live music, creating a memorable evening of entertainment.", + "locationName": "Various locations", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "turkish-riviera", + "ref": "enjoy-a-traditional-turkish-night", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_enjoy-a-traditional-turkish-night.jpg" + }, + { + "name": "Hot Air Balloon Ride Over Cappadocia", + "description": "Experience the breathtaking landscapes of Cappadocia from a unique perspective with a hot air balloon ride at sunrise. Soar above the fairy chimneys, valleys, and rock formations, capturing unforgettable photos and creating lasting memories. This magical experience is perfect for couples, families, and anyone seeking a once-in-a-lifetime adventure.", + "locationName": "Cappadocia", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "turkish-riviera", + "ref": "hot-air-balloon-ride-over-cappadocia", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_hot-air-balloon-ride-over-cappadocia.jpg" + }, + { + "name": "Jeep Safari Adventure in the Taurus Mountains", + "description": "Embark on an exhilarating jeep safari through the rugged terrain of the Taurus Mountains. Explore hidden waterfalls, traditional villages, and stunning viewpoints. This adventurous activity is ideal for thrill-seekers and nature enthusiasts who want to experience the wild side of the Turkish Riviera.", + "locationName": "Taurus Mountains", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "turkish-riviera", + "ref": "jeep-safari-adventure-in-the-taurus-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_jeep-safari-adventure-in-the-taurus-mountains.jpg" + }, + { + "name": "Visit the Pamukkale Thermal Pools", + "description": "Discover the natural wonder of Pamukkale, with its cascading white travertine terraces and thermal pools. Take a dip in the mineral-rich waters, known for their healing properties, and enjoy the unique and picturesque landscape. This relaxing experience is perfect for unwinding and rejuvenating.", + "locationName": "Pamukkale", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "turkish-riviera", + "ref": "visit-the-pamukkale-thermal-pools", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_visit-the-pamukkale-thermal-pools.jpg" + }, + { + "name": "Explore the Ancient City of Perge", + "description": "Step back in time and explore the ruins of Perge, an ancient Greek city that was once a major center of trade and culture. Admire the well-preserved Hellenistic and Roman architecture, including the impressive theater, stadium, and agora. This historical experience is perfect for history buffs and those interested in ancient civilizations.", + "locationName": "Perge", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "turkish-riviera", + "ref": "explore-the-ancient-city-of-perge", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_explore-the-ancient-city-of-perge.jpg" + }, + { + "name": "Wine Tasting Tour in the Vineyards of Bozcaada", + "description": "Embark on a delightful wine tasting tour in the vineyards of Bozcaada, a charming island known for its wine production. Sample local wines, learn about the winemaking process, and enjoy the scenic beauty of the vineyards. This experience is perfect for wine enthusiasts and those seeking a relaxing and flavorful getaway.", + "locationName": "Bozcaada", + "duration": 5, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "turkish-riviera", + "ref": "wine-tasting-tour-in-the-vineyards-of-bozcaada", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/turkish-riviera_wine-tasting-tour-in-the-vineyards-of-bozcaada.jpg" + }, + { + "name": "Wine Tasting Tour in Chianti", + "description": "Embark on a delightful journey through the rolling hills of Chianti, famed for its world-renowned wines. Visit charming vineyards, learn about the winemaking process from passionate producers, and savor the rich flavors of Chianti Classico and other regional varieties. Enjoy breathtaking views of the Tuscan countryside and indulge in local delicacies paired perfectly with your wine.", + "locationName": "Chianti Region", + "duration": 6, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "tuscany", + "ref": "wine-tasting-tour-in-chianti", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_wine-tasting-tour-in-chianti.jpg" + }, + { + "name": "Explore the Historic City of Florence", + "description": "Step back in time as you wander through the enchanting streets of Florence, the birthplace of the Renaissance. Marvel at architectural masterpieces like the Duomo and Ponte Vecchio, visit world-class museums housing works by Michelangelo and Leonardo da Vinci, and immerse yourself in the vibrant culture of this historic city.", + "locationName": "Florence", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "tuscany", + "ref": "explore-the-historic-city-of-florence", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_explore-the-historic-city-of-florence.jpg" + }, + { + "name": "Cooking Class in a Tuscan Farmhouse", + "description": "Unleash your inner chef with a hands-on cooking class in a traditional Tuscan farmhouse. Learn the secrets of authentic Italian cuisine from local experts, using fresh, seasonal ingredients. Create delicious dishes like handmade pasta, savory sauces, and delectable desserts. Enjoy the fruits of your labor with a convivial meal accompanied by regional wines.", + "locationName": "Tuscan Countryside", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "tuscany", + "ref": "cooking-class-in-a-tuscan-farmhouse", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_cooking-class-in-a-tuscan-farmhouse.jpg" + }, + { + "name": "Hot Air Balloon Ride over the Val d'Orcia", + "description": "Soar above the picturesque landscapes of the Val d'Orcia in a hot air balloon, taking in breathtaking panoramic views of rolling hills, vineyards, and charming villages. Experience the serenity of floating through the air as you witness the beauty of the Tuscan countryside from a unique perspective.", + "locationName": "Val d'Orcia", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "tuscany", + "ref": "hot-air-balloon-ride-over-the-val-d-orcia", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_hot-air-balloon-ride-over-the-val-d-orcia.jpg" + }, + { + "name": "Relaxing Spa Day in a Thermal Bath", + "description": "Indulge in a rejuvenating spa day at one of Tuscany's renowned thermal baths. Immerse yourself in the therapeutic waters, rich in minerals and known for their healing properties. Enjoy a variety of spa treatments, such as massages, facials, and body wraps, and experience ultimate relaxation amidst the serene Tuscan surroundings.", + "locationName": "Various locations", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "tuscany", + "ref": "relaxing-spa-day-in-a-thermal-bath", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_relaxing-spa-day-in-a-thermal-bath.jpg" + }, + { + "name": "Truffle Hunting in the Tuscan Countryside", + "description": "Embark on a unique adventure, joining local truffle hunters and their trained dogs to search for the prized delicacy among the oak and chestnut trees. Learn about the art of truffle hunting, the different types of truffles, and their culinary significance in Tuscan cuisine. This immersive experience often concludes with a delicious truffle-infused meal, allowing you to savor the fruits of your labor.", + "locationName": "Various locations in the Tuscan countryside", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "tuscany", + "ref": "truffle-hunting-in-the-tuscan-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_truffle-hunting-in-the-tuscan-countryside.jpg" + }, + { + "name": "Hiking or Biking through the Picturesque Landscapes", + "description": "Explore the breathtaking landscapes of Tuscany at your own pace by hiking or biking through its rolling hills, vineyards, and olive groves. Numerous trails cater to various fitness levels, offering stunning vistas and opportunities to discover hidden gems like charming villages, ancient ruins, and local farms. Pack a picnic lunch and enjoy a peaceful break amidst the idyllic scenery.", + "locationName": "Various locations throughout Tuscany, including the Chianti region, Val d'Orcia, and the Tuscan Archipelago", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "tuscany", + "ref": "hiking-or-biking-through-the-picturesque-landscapes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_hiking-or-biking-through-the-picturesque-landscapes.jpg" + }, + { + "name": "Visit the Leaning Tower of Pisa and Explore Pisa", + "description": "Discover the iconic Leaning Tower of Pisa and explore the historic city that surrounds it. Capture memorable photos with the leaning tower, climb its steps for panoramic views, and visit the nearby Cathedral and Baptistery. Wander through Pisa's charming squares and streets, enjoying the local atmosphere and indulging in delicious Italian cuisine.", + "locationName": "Pisa", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "tuscany", + "ref": "visit-the-leaning-tower-of-pisa-and-explore-pisa", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_visit-the-leaning-tower-of-pisa-and-explore-pisa.jpg" + }, + { + "name": "Take a Boat Trip to Elba Island", + "description": "Escape to the largest island of the Tuscan Archipelago, Elba, and discover its stunning beaches, crystal-clear waters, and rich history. Take a ferry or boat trip to the island, explore its charming towns and villages, relax on its sandy shores, or embark on a hike or bike ride through its scenic landscapes. Elba also offers opportunities for snorkeling, diving, and exploring historical sites like Napoleon's former residence.", + "locationName": "Elba Island", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "tuscany", + "ref": "take-a-boat-trip-to-elba-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_take-a-boat-trip-to-elba-island.jpg" + }, + { + "name": "Enjoy a Traditional Tuscan Dinner with a Local Family", + "description": "Immerse yourself in the local culture by enjoying a traditional Tuscan dinner with a welcoming family in their home. Savor authentic home-cooked dishes, learn about local customs and traditions, and share stories and laughter with your hosts. This experience offers a unique opportunity to connect with the people of Tuscany and create lasting memories.", + "locationName": "Various locations in the Tuscan countryside", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "tuscany", + "ref": "enjoy-a-traditional-tuscan-dinner-with-a-local-family", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_enjoy-a-traditional-tuscan-dinner-with-a-local-family.jpg" + }, + { + "name": "Horseback Riding through the Tuscan Hills", + "description": "Embark on a horseback riding adventure through the picturesque Tuscan countryside. Explore rolling hills, vineyards, and olive groves while enjoying the fresh air and stunning views. This activity is suitable for all levels of experience, and local guides will ensure a safe and enjoyable ride.", + "locationName": "Tuscan Countryside", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "tuscany", + "ref": "horseback-riding-through-the-tuscan-hills", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_horseback-riding-through-the-tuscan-hills.jpg" + }, + { + "name": "Visit the Medieval Town of San Gimignano", + "description": "Step back in time with a visit to the charming medieval town of San Gimignano, known as the 'Town of Fine Towers'. Explore the narrow streets, admire the historic architecture, and climb the towers for panoramic views of the surrounding countryside. Don't forget to sample the local gelato, renowned for its delicious flavors.", + "locationName": "San Gimignano", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "tuscany", + "ref": "visit-the-medieval-town-of-san-gimignano", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_visit-the-medieval-town-of-san-gimignano.jpg" + }, + { + "name": "Kayaking or Canoeing on the Arno River", + "description": "Experience Tuscany from a different perspective with a kayaking or canoeing trip on the Arno River. Paddle through the heart of Florence, passing under historic bridges and admiring the city's iconic landmarks from the water. This activity is a great way to combine sightseeing with a bit of exercise and enjoy the outdoors.", + "locationName": "Arno River", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "tuscany", + "ref": "kayaking-or-canoeing-on-the-arno-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_kayaking-or-canoeing-on-the-arno-river.jpg" + }, + { + "name": "Attend a Palio Horse Race in Siena", + "description": "Immerse yourself in the excitement of the Palio, a historic horse race held twice a year in Siena's Piazza del Campo. Witness the pageantry, the fierce competition between the city's districts, and the passionate crowds. This is a truly unique cultural experience that will leave you with lasting memories.", + "locationName": "Siena", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 4, + "destinationRef": "tuscany", + "ref": "attend-a-palio-horse-race-in-siena", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_attend-a-palio-horse-race-in-siena.jpg" + }, + { + "name": "Go Stargazing in the Tuscan Countryside", + "description": "Escape the city lights and experience the magic of the Tuscan night sky. Join a stargazing tour or simply find a quiet spot away from light pollution. With minimal light interference, you'll have the opportunity to see a breathtaking display of stars and constellations.", + "locationName": "Tuscan Countryside", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "tuscany", + "ref": "go-stargazing-in-the-tuscan-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_go-stargazing-in-the-tuscan-countryside.jpg" + }, + { + "name": "Take a Vespa Tour through the Tuscan Countryside", + "description": "Embark on a thrilling adventure as you zip through the picturesque Tuscan countryside on a Vespa scooter. Feel the wind in your hair and soak up the breathtaking scenery as you explore hidden gems, charming villages, and rolling vineyards. This unique and exhilarating experience allows you to discover the true essence of Tuscany at your own pace.", + "locationName": "Tuscan Countryside", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "tuscany", + "ref": "take-a-vespa-tour-through-the-tuscan-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_take-a-vespa-tour-through-the-tuscan-countryside.jpg" + }, + { + "name": "Visit the Uffizi Gallery and Admire Renaissance Masterpieces", + "description": "Immerse yourself in the world of Renaissance art at the renowned Uffizi Gallery in Florence. Marvel at iconic works by legendary artists such as Leonardo da Vinci, Michelangelo, and Botticelli. Explore the vast collection and witness the evolution of art throughout the ages. This cultural experience is a must for art enthusiasts and history buffs.", + "locationName": "Uffizi Gallery, Florence", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "tuscany", + "ref": "visit-the-uffizi-gallery-and-admire-renaissance-masterpieces", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_visit-the-uffizi-gallery-and-admire-renaissance-masterpieces.jpg" + }, + { + "name": "Go Wine Tasting in the Chianti Classico Region", + "description": "Indulge in the rich flavors of Tuscany's world-famous wines with a visit to the Chianti Classico region. Explore charming wineries, learn about the winemaking process, and savor the distinct taste of Chianti Classico. Enjoy breathtaking vineyard views and discover the perfect bottle to take home as a souvenir.", + "locationName": "Chianti Classico Region", + "duration": 5, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "tuscany", + "ref": "go-wine-tasting-in-the-chianti-classico-region", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_go-wine-tasting-in-the-chianti-classico-region.jpg" + }, + { + "name": "Explore the Boboli Gardens and Discover a Renaissance Oasis", + "description": "Escape the hustle and bustle of the city and wander through the enchanting Boboli Gardens in Florence. Discover hidden fountains, sculptures, and grottoes as you explore this Renaissance masterpiece. Enjoy a peaceful picnic amidst the lush greenery and admire the panoramic views of the city.", + "locationName": "Boboli Gardens, Florence", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "tuscany", + "ref": "explore-the-boboli-gardens-and-discover-a-renaissance-oasis", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_explore-the-boboli-gardens-and-discover-a-renaissance-oasis.jpg" + }, + { + "name": "Attend a Traditional Opera Performance in a Historic Theater", + "description": "Experience the magic of Italian opera with a captivating performance in a historic theater. Immerse yourself in the drama, music, and costumes as you witness a timeless masterpiece. This cultural evening is a perfect way to appreciate the artistic heritage of Tuscany.", + "locationName": "Various theaters in Tuscany", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "tuscany", + "ref": "attend-a-traditional-opera-performance-in-a-historic-theater", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/tuscany_attend-a-traditional-opera-performance-in-a-historic-theater.jpg" + }, + { + "name": "Snorkeling at Trunk Bay", + "description": "Embark on an underwater adventure at Trunk Bay, renowned for its crystal-clear waters and vibrant coral reefs. Swim among colorful fish, graceful sea turtles, and other fascinating marine life. The underwater snorkeling trail makes it easy to explore the reef's wonders, even for beginners. **Tags: Beach, Snorkeling, Family-friendly**", + "locationName": "Trunk Bay, St. John", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "us-virgin-islands", + "ref": "snorkeling-at-trunk-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_snorkeling-at-trunk-bay.jpg" + }, + { + "name": "Exploring Historic Charlotte Amalie", + "description": "Step back in time with a stroll through the charming streets of Charlotte Amalie, the capital of St. Thomas. Discover colonial architecture, historic forts, and duty-free shopping. Visit Blackbeard's Castle for panoramic views and pirate lore, or explore the 99 Steps, a historic stairway leading to breathtaking vistas. **Tags: City, Historic, Sightseeing, Shopping**", + "locationName": "Charlotte Amalie, St. Thomas", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "us-virgin-islands", + "ref": "exploring-historic-charlotte-amalie", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_exploring-historic-charlotte-amalie.jpg" + }, + { + "name": "Sunset Sail with Cocktails", + "description": "Indulge in a romantic and unforgettable experience with a sunset sail along the coastline. Sip on tropical cocktails as you admire the vibrant hues of the setting sun painting the sky and reflecting on the turquoise waters. Capture stunning photos and create lasting memories. **Tags: Romantic, Relaxing, Nightlife, Luxury**", + "locationName": "Various Locations", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "us-virgin-islands", + "ref": "sunset-sail-with-cocktails", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_sunset-sail-with-cocktails.jpg" + }, + { + "name": "Hiking the Reef Bay Trail", + "description": "Embark on a scenic hike through the lush rainforest of Virgin Islands National Park. The Reef Bay Trail leads you past ancient petroglyphs, sugar mill ruins, and breathtaking views of the Caribbean Sea. Descend to the Reef Bay Sugar Mill and explore the historic site. **Tags: Hiking, Historic, Off-the-beaten-path**", + "locationName": "Virgin Islands National Park, St. John", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "us-virgin-islands", + "ref": "hiking-the-reef-bay-trail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_hiking-the-reef-bay-trail.jpg" + }, + { + "name": "Kayaking in a Bioluminescent Bay", + "description": "Experience the magic of a bioluminescent bay, where the water glows with an ethereal blue light at night. Paddle through the mangrove forests and witness the mesmerizing spectacle of tiny organisms illuminating the water with each stroke of your kayak. **Tags: Adventure, Nightlife, Eco-conscious**", + "locationName": "Various Locations", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 3, + "destinationRef": "us-virgin-islands", + "ref": "kayaking-in-a-bioluminescent-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_kayaking-in-a-bioluminescent-bay.jpg" + }, + { + "name": "Explore the Virgin Islands National Park", + "description": "Immerse yourself in the natural beauty of St. John by exploring the Virgin Islands National Park. Hike through lush forests, discover hidden beaches, and encounter diverse wildlife. Visit the Annaberg Sugar Plantation ruins for a glimpse into the island's history.", + "locationName": "St. John", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "us-virgin-islands", + "ref": "explore-the-virgin-islands-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_explore-the-virgin-islands-national-park.jpg" + }, + { + "name": "Discover the Coral World Ocean Park", + "description": "Embark on an underwater adventure at Coral World Ocean Park on St. Thomas. Get up close to marine life in the Undersea Observatory, swim with dolphins, hand-feed stingrays, and explore the vibrant coral reefs through snorkeling or diving.", + "locationName": "St. Thomas", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "us-virgin-islands", + "ref": "discover-the-coral-world-ocean-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_discover-the-coral-world-ocean-park.jpg" + }, + { + "name": "Indulge in Duty-Free Shopping", + "description": "Take advantage of the duty-free shopping opportunities in Charlotte Amalie, St. Thomas. Browse through a wide selection of jewelry, perfumes, electronics, and local crafts. Find unique souvenirs and gifts to commemorate your trip.", + "locationName": "Charlotte Amalie", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 4, + "destinationRef": "us-virgin-islands", + "ref": "indulge-in-duty-free-shopping", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_indulge-in-duty-free-shopping.jpg" + }, + { + "name": "Sample Local Cuisine", + "description": "Embark on a culinary journey and savor the flavors of the Virgin Islands. Try local specialties like conch fritters, johnnycakes, and callaloo. Visit beachside shacks for fresh seafood or indulge in fine dining experiences with Caribbean-inspired cuisine.", + "locationName": "Various Locations", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "us-virgin-islands", + "ref": "sample-local-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_sample-local-cuisine.jpg" + }, + { + "name": "Go Island Hopping", + "description": "Embark on an island-hopping adventure and discover the unique charm of each island. Take a ferry or boat tour to explore St. John's pristine beaches, St. Croix's historic towns, or Water Island's secluded coves. Experience the diverse landscapes and cultural offerings of the Virgin Islands.", + "locationName": "Inter-Island", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "us-virgin-islands", + "ref": "go-island-hopping", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_go-island-hopping.jpg" + }, + { + "name": "Windsurfing at Magens Bay", + "description": "Experience the thrill of gliding across the turquoise waters of Magens Bay, renowned as one of the world's most beautiful beaches. Rent windsurfing equipment and catch the trade winds for an exhilarating adventure. Lessons are available for beginners, while experienced windsurfers can enjoy the freedom of exploring the bay at their own pace.", + "locationName": "Magens Bay, St. Thomas", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "us-virgin-islands", + "ref": "windsurfing-at-magens-bay", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_windsurfing-at-magens-bay.jpg" + }, + { + "name": "Horseback Riding on the Beach", + "description": "Embark on a unique and unforgettable adventure with a horseback riding tour along the sandy shores. Several outfitters offer guided tours that cater to all skill levels, allowing you to connect with nature and experience the island's beauty from a different perspective. Enjoy the gentle rhythm of the horse's gait as you take in breathtaking coastal views.", + "locationName": "Various beaches on St. Thomas and St. Croix", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "us-virgin-islands", + "ref": "horseback-riding-on-the-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_horseback-riding-on-the-beach.jpg" + }, + { + "name": "Stargazing on a Secluded Beach", + "description": "Escape the city lights and immerse yourself in the magic of the Caribbean night sky. Find a secluded beach away from light pollution and marvel at the constellations above. The Virgin Islands offer exceptional stargazing opportunities due to their remote location and minimal light interference. Bring a blanket, relax on the sand, and let the celestial wonders captivate you.", + "locationName": "Secluded beaches on St. John or Water Island", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "us-virgin-islands", + "ref": "stargazing-on-a-secluded-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_stargazing-on-a-secluded-beach.jpg" + }, + { + "name": "Explore the Annaberg Sugar Plantation Ruins", + "description": "Step back in time and delve into the Virgin Islands' colonial past at the Annaberg Sugar Plantation Ruins on St. John. Explore the remnants of this historic site, including the factory, windmill, and slave quarters, and learn about the island's sugar production history and the lives of those who worked on the plantation.", + "locationName": "Annaberg Sugar Plantation, St. John", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "us-virgin-islands", + "ref": "explore-the-annaberg-sugar-plantation-ruins", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_explore-the-annaberg-sugar-plantation-ruins.jpg" + }, + { + "name": "Take a Cooking Class and Learn to Make Local Dishes", + "description": "Immerse yourself in the local culture by participating in a cooking class and learning to prepare traditional Virgin Islands dishes. Discover the secrets of Caribbean cuisine, from fresh seafood specialties to flavorful stews and desserts. Many local chefs offer hands-on classes where you can learn about the ingredients, techniques, and cultural significance of the dishes.", + "locationName": "Various locations on St. Thomas and St. Croix", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "us-virgin-islands", + "ref": "take-a-cooking-class-and-learn-to-make-local-dishes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_take-a-cooking-class-and-learn-to-make-local-dishes.jpg" + }, + { + "name": "Dive into History at Fort Christiansvaern", + "description": "Step back in time at Fort Christiansvaern, a meticulously preserved 18th-century Danish fort on the island of St. Croix. Explore the ramparts, barracks, and dungeons, and learn about the island's colonial past and its role in the transatlantic slave trade. Immerse yourself in the fascinating history and stunning architecture of this historic landmark.", + "locationName": "Christiansted, St. Croix", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "us-virgin-islands", + "ref": "dive-into-history-at-fort-christiansvaern", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_dive-into-history-at-fort-christiansvaern.jpg" + }, + { + "name": "Catch a Thrill with Watersports Galore", + "description": "Get your adrenaline pumping with an array of exciting watersports! Rent jet skis and zoom across the turquoise waters, try your hand at parasailing for breathtaking aerial views, or challenge yourself with windsurfing or kitesurfing. The options are endless for an action-packed day on the water.", + "locationName": "Various locations throughout the islands", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "us-virgin-islands", + "ref": "catch-a-thrill-with-watersports-galore", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_catch-a-thrill-with-watersports-galore.jpg" + }, + { + "name": "Indulge in a Culinary Journey", + "description": "Embark on a delectable culinary journey through the Virgin Islands. Join a food tour to discover hidden gems and local favorites, from savory seafood dishes to sweet tropical treats. Explore the vibrant markets, savor fresh island produce, and experience the unique flavors of Caribbean cuisine.", + "locationName": "Various locations throughout the islands", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "us-virgin-islands", + "ref": "indulge-in-a-culinary-journey", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_indulge-in-a-culinary-journey.jpg" + }, + { + "name": "Unwind with a Spa Retreat", + "description": "Escape the hustle and bustle with a rejuvenating spa experience. Treat yourself to a massage, facial, or body wrap using local ingredients like coconut oil and sea salt. Immerse yourself in tranquility and emerge feeling refreshed and revitalized.", + "locationName": "Various resorts and spas", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "us-virgin-islands", + "ref": "unwind-with-a-spa-retreat", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_unwind-with-a-spa-retreat.jpg" + }, + { + "name": "Experience the Nightlife", + "description": "As the sun sets, the islands come alive with vibrant nightlife. Dance the night away at beach bars and clubs, enjoy live music performances, or sip cocktails under the stars. From laid-back beach bars to lively nightclubs, there's something for everyone to enjoy after dark.", + "locationName": "Various locations throughout the islands", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "us-virgin-islands", + "ref": "experience-the-nightlife", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/us-virgin-islands_experience-the-nightlife.jpg" + }, + { + "name": "Whale Watching Adventure", + "description": "Embark on an unforgettable whale watching tour from Victoria or Tofino. Witness majestic orcas, humpback whales, and other marine life in their natural habitat. Learn about their behavior and conservation efforts from experienced guides. This awe-inspiring experience is perfect for nature enthusiasts of all ages.", + "locationName": "Victoria or Tofino", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "vancouver-island", + "ref": "whale-watching-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_whale-watching-adventure.jpg" + }, + { + "name": "Pacific Rim National Park Reserve Exploration", + "description": "Immerse yourself in the wild beauty of Pacific Rim National Park Reserve. Hike through ancient rainforests, explore rugged coastlines, and relax on pristine beaches. Discover diverse ecosystems and encounter unique wildlife. The park offers trails for all levels, making it ideal for both casual walkers and experienced hikers.", + "locationName": "Pacific Rim National Park Reserve", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "vancouver-island", + "ref": "pacific-rim-national-park-reserve-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_pacific-rim-national-park-reserve-exploration.jpg" + }, + { + "name": "Kayaking in Clayoquot Sound", + "description": "Paddle through the tranquil waters of Clayoquot Sound, a UNESCO Biosphere Reserve. Explore hidden coves, encounter marine life, and admire the stunning scenery. Kayak tours are available for various skill levels, providing a unique perspective of Vancouver Island's coastal beauty.", + "locationName": "Clayoquot Sound", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "vancouver-island", + "ref": "kayaking-in-clayoquot-sound", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_kayaking-in-clayoquot-sound.jpg" + }, + { + "name": "Victoria City Tour and Afternoon Tea", + "description": "Explore the charming city of Victoria, known for its British colonial architecture and vibrant culture. Visit iconic landmarks like the Fairmont Empress Hotel and the Royal BC Museum. Indulge in a traditional afternoon tea experience, complete with scones, pastries, and exquisite tea blends.", + "locationName": "Victoria", + "duration": 5, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 4, + "destinationRef": "vancouver-island", + "ref": "victoria-city-tour-and-afternoon-tea", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_victoria-city-tour-and-afternoon-tea.jpg" + }, + { + "name": "Surfing in Tofino", + "description": "Catch some waves in Tofino, a renowned surfing destination. With its consistent swells and stunning beaches, Tofino offers an unforgettable experience for surfers of all levels. Surfing lessons and rentals are readily available, making it easy to enjoy this exhilarating water sport.", + "locationName": "Tofino", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "vancouver-island", + "ref": "surfing-in-tofino", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_surfing-in-tofino.jpg" + }, + { + "name": "Hiking the West Coast Trail", + "description": "Embark on a multi-day backpacking adventure along the legendary West Coast Trail. Traverse through old-growth forests, across rugged beaches, and over suspension bridges, experiencing the raw beauty of Vancouver Island's wild Pacific coast. This challenging hike offers stunning ocean views, encounters with wildlife, and a sense of accomplishment for those who complete it.", + "locationName": "Pacific Rim National Park Reserve", + "duration": 60, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "vancouver-island", + "ref": "hiking-the-west-coast-trail", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_hiking-the-west-coast-trail.jpg" + }, + { + "name": "Exploring Butchart Gardens", + "description": "Immerse yourself in the vibrant colors and fragrant scents of Butchart Gardens, a world-renowned horticultural masterpiece. Stroll through themed gardens, marvel at the intricate floral displays, and enjoy afternoon tea in a charming setting. This family-friendly attraction offers a relaxing escape into a world of natural beauty.", + "locationName": "Victoria", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "vancouver-island", + "ref": "exploring-butchart-gardens", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_exploring-butchart-gardens.jpg" + }, + { + "name": "Ziplining Through the Forest Canopy", + "description": "Soar through the air on a thrilling zipline adventure, experiencing the rainforest from a unique perspective. Choose from various zipline courses, each offering breathtaking views and an adrenaline rush. This activity is perfect for adventure seekers looking for an exhilarating experience in nature.", + "locationName": "Various locations on Vancouver Island", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "vancouver-island", + "ref": "ziplining-through-the-forest-canopy", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_ziplining-through-the-forest-canopy.jpg" + }, + { + "name": "Storm Watching on the West Coast", + "description": "Witness the raw power of the Pacific Ocean during storm season. Find a cozy cabin or beachfront lodge and watch as massive waves crash against the shore, creating a dramatic spectacle. This unique experience is perfect for those seeking a connection with nature's untamed forces.", + "locationName": "Tofino, Ucluelet", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "vancouver-island", + "ref": "storm-watching-on-the-west-coast", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_storm-watching-on-the-west-coast.jpg" + }, + { + "name": "Caving in Horne Lake Caves Provincial Park", + "description": "Embark on a subterranean adventure exploring the Horne Lake Caves. Join a guided tour to discover stunning cave formations, underground rivers, and unique geological wonders. This activity is perfect for those seeking a unique and educational experience.", + "locationName": "Horne Lake Caves Provincial Park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "vancouver-island", + "ref": "caving-in-horne-lake-caves-provincial-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_caving-in-horne-lake-caves-provincial-park.jpg" + }, + { + "name": "Bear Watching Tour in the Great Bear Rainforest", + "description": "Embark on a thrilling expedition into the heart of the Great Bear Rainforest, home to the majestic grizzly bears. Join a guided tour from Campbell River or Telegraph Cove and witness these magnificent creatures in their natural habitat as they fish for salmon and roam the pristine wilderness. This unforgettable experience offers a unique glimpse into the lives of these iconic animals.", + "locationName": "Great Bear Rainforest", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "vancouver-island", + "ref": "bear-watching-tour-in-the-great-bear-rainforest", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_bear-watching-tour-in-the-great-bear-rainforest.jpg" + }, + { + "name": "Wine Tasting Tour in the Cowichan Valley", + "description": "Discover the burgeoning wine scene of the Cowichan Valley, known for its cool-climate wines and picturesque vineyards. Embark on a delightful wine tasting tour, visiting charming wineries and indulging in award-winning vintages. Learn about the unique terroir and winemaking process while savoring the flavors of Pinot Noir, Chardonnay, and other local specialties. This experience is perfect for wine enthusiasts and those seeking a relaxing escape.", + "locationName": "Cowichan Valley", + "duration": 6, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "vancouver-island", + "ref": "wine-tasting-tour-in-the-cowichan-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_wine-tasting-tour-in-the-cowichan-valley.jpg" + }, + { + "name": "Scenic Drive Along the Pacific Marine Circle Route", + "description": "Embark on a breathtaking road trip along the Pacific Marine Circle Route, a scenic loop that showcases the diverse beauty of Vancouver Island. Drive through charming coastal towns, witness dramatic ocean vistas, and explore hidden coves and beaches. Stop at Sooke Potholes Provincial Park for a refreshing swim in natural rock pools, or visit the quaint village of Cowichan Bay for local arts and crafts. This self-guided adventure offers flexibility and stunning views at every turn.", + "locationName": "Pacific Marine Circle Route", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "vancouver-island", + "ref": "scenic-drive-along-the-pacific-marine-circle-route", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_scenic-drive-along-the-pacific-marine-circle-route.jpg" + }, + { + "name": "Mountain Biking in Cumberland", + "description": "Experience the thrill of mountain biking in Cumberland, a renowned destination for off-road enthusiasts. Explore the extensive network of trails that wind through lush forests and offer breathtaking views. Whether you're a beginner or an experienced rider, Cumberland has trails for all skill levels. Rent a bike and gear from local shops and immerse yourself in the vibrant mountain biking culture.", + "locationName": "Cumberland", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "vancouver-island", + "ref": "mountain-biking-in-cumberland", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_mountain-biking-in-cumberland.jpg" + }, + { + "name": "Relaxing Spa Day at a Resort", + "description": "Indulge in a rejuvenating spa day at one of Vancouver Island's luxurious resorts. Pamper yourself with a variety of treatments, from massages and facials to body wraps and hydrotherapy. Enjoy the serene atmosphere and stunning natural surroundings as you unwind and recharge. Several resorts offer spa packages, perfect for a romantic getaway or a solo escape.", + "locationName": "Various Resorts", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "vancouver-island", + "ref": "relaxing-spa-day-at-a-resort", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_relaxing-spa-day-at-a-resort.jpg" + }, + { + "name": "Go Salmon Fishing on the Campbell River", + "description": "Experience the thrill of reeling in a mighty salmon on the legendary Campbell River, renowned as the 'Salmon Capital of the World.' Charter a boat with a seasoned guide who'll lead you to the best spots and share their expertise. Whether you're a seasoned angler or a novice, this adventure promises excitement and a chance to connect with Vancouver Island's rich fishing heritage.", + "locationName": "Campbell River", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "vancouver-island", + "ref": "go-salmon-fishing-on-the-campbell-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_go-salmon-fishing-on-the-campbell-river.jpg" + }, + { + "name": "Explore the Culinary Scene in Victoria", + "description": "Embark on a delectable journey through Victoria's vibrant culinary scene. Discover farm-to-table restaurants showcasing the island's fresh produce, indulge in artisan chocolates and craft breweries, and savor the multicultural flavors that make Victoria a foodie paradise. Don't miss the chance to visit the iconic Fairmont Empress for a classic afternoon tea experience.", + "locationName": "Victoria", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "vancouver-island", + "ref": "explore-the-culinary-scene-in-victoria", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_explore-the-culinary-scene-in-victoria.jpg" + }, + { + "name": "Discover Indigenous Culture at the Royal BC Museum", + "description": "Immerse yourself in the rich history and culture of the First Nations people at the Royal BC Museum. Explore captivating exhibits that showcase traditional art, artifacts, and storytelling, and gain a deeper understanding of their deep connection to the land and sea. Participate in workshops or cultural events for a truly immersive experience.", + "locationName": "Victoria", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "vancouver-island", + "ref": "discover-indigenous-culture-at-the-royal-bc-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_discover-indigenous-culture-at-the-royal-bc-museum.jpg" + }, + { + "name": "Take a Scenic Seaplane Flight", + "description": "Soar above Vancouver Island's breathtaking landscapes on a scenic seaplane flight. Witness the majesty of snow-capped mountains, turquoise waters, and lush forests from a unique perspective. Choose from various routes, including flights over the Gulf Islands, Tofino's coastline, or the remote Clayoquot Sound, for an unforgettable aerial adventure.", + "locationName": "Multiple locations", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "vancouver-island", + "ref": "take-a-scenic-seaplane-flight", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_take-a-scenic-seaplane-flight.jpg" + }, + { + "name": "Go Birdwatching at the Reifel Migratory Bird Sanctuary", + "description": "Escape to the tranquil oasis of the Reifel Migratory Bird Sanctuary, a haven for over 250 bird species. Stroll along the boardwalks and observe a diverse array of waterfowl, shorebirds, and songbirds in their natural habitat. Capture stunning photos, learn about bird conservation efforts, and enjoy the serene beauty of this wildlife sanctuary.", + "locationName": "Reifel Migratory Bird Sanctuary", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "vancouver-island", + "ref": "go-birdwatching-at-the-reifel-migratory-bird-sanctuary", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vancouver-island_go-birdwatching-at-the-reifel-migratory-bird-sanctuary.jpg" + }, + { + "name": "Schönbrunn Palace Tour", + "description": "Step into the opulent world of Habsburg royalty with a tour of the magnificent Schönbrunn Palace. Explore the lavish staterooms, stroll through the sprawling gardens, and immerse yourself in the history of the Austrian Empire.", + "locationName": "Schönbrunn Palace", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "vienna", + "ref": "sch-nbrunn-palace-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_sch-nbrunn-palace-tour.jpg" + }, + { + "name": "Vienna State Opera Performance", + "description": "Experience the magic of a world-renowned opera or ballet performance at the Vienna State Opera. Witness exceptional artistry and acoustics in a breathtaking setting, a truly unforgettable evening.", + "locationName": "Vienna State Opera", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "vienna", + "ref": "vienna-state-opera-performance", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_vienna-state-opera-performance.jpg" + }, + { + "name": "Naschmarkt Culinary Adventure", + "description": "Embark on a sensory journey through the vibrant Naschmarkt, Vienna's largest market. Sample diverse flavors from around the world, from local Austrian specialties to exotic spices and fresh produce.", + "locationName": "Naschmarkt", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "vienna", + "ref": "naschmarkt-culinary-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_naschmarkt-culinary-adventure.jpg" + }, + { + "name": "Danube River Cruise", + "description": "Enjoy a scenic cruise along the Danube River, admiring the city's iconic landmarks from a unique perspective. Relax and soak in the picturesque views while learning about Vienna's history and culture.", + "locationName": "Danube River", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "vienna", + "ref": "danube-river-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_danube-river-cruise.jpg" + }, + { + "name": "MuseumsQuartier Exploration", + "description": "Discover a vibrant hub of art and culture at the MuseumsQuartier. Explore renowned museums like the Leopold Museum and MUMOK, showcasing modern and contemporary art, or simply relax in the trendy courtyards and cafes.", + "locationName": "MuseumsQuartier", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "vienna", + "ref": "museumsquartier-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_museumsquartier-exploration.jpg" + }, + { + "name": "Prater Amusement Park", + "description": "Experience thrills and laughter at Prater, Vienna's iconic amusement park! Ride the Wiener Riesenrad Ferris wheel for panoramic city views, test your courage on roller coasters, and enjoy classic carnival games and treats. This historic park offers entertainment for all ages, making it a perfect family outing.", + "locationName": "Prater", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "vienna", + "ref": "prater-amusement-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_prater-amusement-park.jpg" + }, + { + "name": "Vienna Woods Hike and Wine Tasting", + "description": "Escape the city bustle and embark on a scenic hike through the Vienna Woods. Explore lush trails, breathe fresh air, and discover charming villages nestled amidst the rolling hills. Conclude your adventure with a delightful wine tasting at a local vineyard, savoring the region's renowned vintages.", + "locationName": "Vienna Woods", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "vienna", + "ref": "vienna-woods-hike-and-wine-tasting", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_vienna-woods-hike-and-wine-tasting.jpg" + }, + { + "name": "Belvedere Palace Gardens Stroll", + "description": "Immerse yourself in the beauty and tranquility of the Belvedere Palace Gardens. Wander through meticulously manicured landscapes, admire stunning sculptures and fountains, and soak in the serene atmosphere. This is an ideal spot for a relaxing afternoon or a romantic rendezvous.", + "locationName": "Belvedere Palace", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "vienna", + "ref": "belvedere-palace-gardens-stroll", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_belvedere-palace-gardens-stroll.jpg" + }, + { + "name": "Haus des Meeres Aquarium", + "description": "Embark on an underwater journey at Haus des Meeres, Vienna's impressive aquarium housed in a former WWII flak tower. Discover diverse marine life, from sharks and tropical fish to reptiles and birds. The rooftop terrace offers breathtaking city views, making it a unique and educational experience.", + "locationName": "Haus des Meeres", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "vienna", + "ref": "haus-des-meeres-aquarium", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_haus-des-meeres-aquarium.jpg" + }, + { + "name": "Naschmarkt Evening Food Tour", + "description": "Indulge your taste buds on a culinary adventure at Naschmarkt, Vienna's vibrant international market. Join a guided evening food tour to sample diverse flavors from around the world, discover hidden culinary gems, and experience the lively atmosphere of this popular foodie destination.", + "locationName": "Naschmarkt", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "vienna", + "ref": "naschmarkt-evening-food-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_naschmarkt-evening-food-tour.jpg" + }, + { + "name": "Spanish Riding School Performance", + "description": "Witness the equestrian artistry of the Lipizzaner stallions at the Spanish Riding School, a Viennese institution since the 16th century. Marvel at their graceful movements, intricate formations, and the harmonious bond between horse and rider during a captivating performance in the historic Winter Riding School.", + "locationName": "Spanish Riding School", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 4, + "destinationRef": "vienna", + "ref": "spanish-riding-school-performance", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_spanish-riding-school-performance.jpg" + }, + { + "name": "Vienna Coffee House Culture", + "description": "Indulge in Vienna's renowned coffee house culture by spending a leisurely afternoon at a traditional café. Savor a cup of Viennese coffee, such as a Wiener Melange or Einspänner, and enjoy a slice of Sachertorte or Apfelstrudel while soaking up the elegant ambiance and observing the local way of life.", + "locationName": "Café Central, Café Sacher, or other traditional coffee houses", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "vienna", + "ref": "vienna-coffee-house-culture", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_vienna-coffee-house-culture.jpg" + }, + { + "name": "Third Man Museum & Sewer Tour", + "description": "Delve into the world of espionage and intrigue with a visit to the Third Man Museum, dedicated to the classic film noir \"The Third Man.\" Explore exhibits on the movie's production and historical context, and embark on a unique tour of Vienna's underground sewer system, as featured in the film's iconic chase scene.", + "locationName": "Third Man Museum", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "vienna", + "ref": "third-man-museum-sewer-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_third-man-museum-sewer-tour.jpg" + }, + { + "name": "Hundertwasserhaus & Kunst Haus Wien", + "description": "Discover the whimsical and colorful architecture of Friedensreich Hundertwasser at the Hundertwasserhaus, a unique apartment complex known for its irregular forms, bright facades, and integration of nature. Afterward, explore the Kunst Haus Wien, a museum showcasing Hundertwasser's artistic vision and ecological philosophies.", + "locationName": "Hundertwasserhaus & Kunst Haus Wien", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "vienna", + "ref": "hundertwasserhaus-kunst-haus-wien", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_hundertwasserhaus-kunst-haus-wien.jpg" + }, + { + "name": "Vienna City Bike Tour", + "description": "Embark on a leisurely bike tour through Vienna's historic streets and picturesque parks. Explore iconic landmarks, hidden gems, and local neighborhoods while enjoying the fresh air and getting some exercise. Guided tours offer insights into the city's history and culture, while self-guided options provide flexibility and freedom.", + "locationName": "Various bike rental shops and tour operators", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "vienna", + "ref": "vienna-city-bike-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_vienna-city-bike-tour.jpg" + }, + { + "name": "Wachau Valley Day Trip", + "description": "Embark on a scenic journey through the picturesque Wachau Valley, a UNESCO World Heritage Site. Discover charming villages, terraced vineyards, and medieval castles as you cruise along the Danube River. Indulge in wine tastings at local wineries, savor regional delicacies, and soak in the breathtaking landscapes.", + "locationName": "Wachau Valley", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "vienna", + "ref": "wachau-valley-day-trip", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_wachau-valley-day-trip.jpg" + }, + { + "name": "Kursalon Vienna Concert", + "description": "Immerse yourself in the enchanting world of Viennese classical music with a captivating concert at the Kursalon Vienna. Delight in the timeless masterpieces of Strauss and Mozart performed by talented musicians in a stunning historic setting. Choose from various concert options and enjoy an unforgettable evening of elegance and culture.", + "locationName": "Kursalon Vienna", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 4, + "destinationRef": "vienna", + "ref": "kursalon-vienna-concert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_kursalon-vienna-concert.jpg" + }, + { + "name": "Central Cemetery Exploration", + "description": "Discover the unique charm of Vienna's Central Cemetery, a sprawling green space that is more than just a burial ground. Explore the ornate tombs of famous figures like Beethoven and Schubert, admire the stunning architecture, and enjoy a peaceful stroll through the serene pathways. Opt for a guided tour to uncover fascinating stories and historical insights.", + "locationName": "Central Cemetery (Zentralfriedhof)", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "vienna", + "ref": "central-cemetery-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_central-cemetery-exploration.jpg" + }, + { + "name": "Vienna Rathaus Film Festival", + "description": "Experience the magic of cinema under the stars at the Vienna Rathaus Film Festival. During summer evenings, the square in front of the City Hall transforms into an open-air cinema, showcasing a diverse program of movies, opera performances, and concerts. Enjoy a picnic atmosphere, savor culinary delights from food stalls, and relish a unique cultural experience.", + "locationName": "Vienna City Hall Square", + "duration": 3, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "vienna", + "ref": "vienna-rathaus-film-festival", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_vienna-rathaus-film-festival.jpg" + }, + { + "name": "Grinzing Heuriger Evening", + "description": "Escape the city bustle and venture to Grinzing, a charming village known for its traditional wine taverns called Heuriger. Sample locally produced wines, savor authentic Viennese cuisine, and enjoy live music in a cozy and convivial atmosphere. Experience the authentic Viennese way of life and indulge in the region's rich winemaking heritage.", + "locationName": "Grinzing", + "duration": 4, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "vienna", + "ref": "grinzing-heuriger-evening", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vienna_grinzing-heuriger-evening.jpg" + }, + { + "name": "Explore the Ancient Town", + "description": "Step back in time as you wander through the enchanting streets of Hoi An's Ancient Town, a UNESCO World Heritage Site. Admire the colorful lanterns, traditional wooden houses, and historic temples. Visit the Japanese Covered Bridge, a symbol of the town, and the Fujian Assembly Hall with its intricate carvings. Don't miss the chance to shop for tailor-made clothing and souvenirs at the Central Market.", + "locationName": "Hoi An Ancient Town", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "vietnam", + "ref": "explore-the-ancient-town", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_explore-the-ancient-town.jpg" + }, + { + "name": "Indulge in a Food Tour", + "description": "Embark on a culinary adventure through Hoi An's vibrant food scene. Join a guided food tour and savor local delicacies like Cao Lau (noodles with pork and greens), White Rose dumplings, and Banh Mi sandwiches. Explore hidden alleyways and discover family-run restaurants, learning about the unique flavors and ingredients of Vietnamese cuisine.", + "locationName": "Various locations in Hoi An", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "vietnam", + "ref": "indulge-in-a-food-tour", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_indulge-in-a-food-tour.jpg" + }, + { + "name": "Cruise the Thu Bon River", + "description": "Enjoy a scenic boat ride along the Thu Bon River, which flows through the heart of Hoi An. Admire the picturesque landscapes, observe local life along the riverbanks, and visit nearby villages known for their traditional crafts. You can choose from various boat options, including traditional wooden boats and modern cruises.", + "locationName": "Thu Bon River", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "vietnam", + "ref": "cruise-the-thu-bon-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_cruise-the-thu-bon-river.jpg" + }, + { + "name": "Relax on An Bang Beach", + "description": "Escape the bustling town and unwind on the pristine sands of An Bang Beach. Soak up the sun, swim in the crystal-clear waters, or try water sports like surfing and stand-up paddleboarding. Enjoy fresh seafood at beachfront restaurants and witness stunning sunsets over the East Sea.", + "locationName": "An Bang Beach", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "vietnam", + "ref": "relax-on-an-bang-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_relax-on-an-bang-beach.jpg" + }, + { + "name": "Learn the Art of Lantern Making", + "description": "Immerse yourself in Hoi An's cultural heritage by participating in a lantern-making workshop. Learn about the history and significance of lanterns in Vietnamese culture, and create your own unique lantern to take home as a souvenir. This hands-on experience is a great way to connect with local traditions and unleash your creativity.", + "locationName": "Various workshops in Hoi An", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "vietnam", + "ref": "learn-the-art-of-lantern-making", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_learn-the-art-of-lantern-making.jpg" + }, + { + "name": "Bike through the Countryside", + "description": "Embark on a leisurely bike ride through the scenic Vietnamese countryside surrounding Hoi An. Pedal along rice paddies, quaint villages, and lush greenery, immersing yourself in the peaceful rural atmosphere. This activity allows you to escape the bustling town and experience the authentic charm of the region at your own pace.", + "locationName": "Hoi An Countryside", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "vietnam", + "ref": "bike-through-the-countryside", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_bike-through-the-countryside.jpg" + }, + { + "name": "Visit My Son Sanctuary", + "description": "Embark on a historical journey to My Son Sanctuary, a UNESCO World Heritage Site. Explore the ruins of ancient Hindu temples dating back to the Champa Kingdom, marveling at the intricate carvings and architectural wonders. Discover the rich history and cultural significance of this once-thriving religious center.", + "locationName": "My Son Sanctuary", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "vietnam", + "ref": "visit-my-son-sanctuary", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_visit-my-son-sanctuary.jpg" + }, + { + "name": "Shop for Custom-Made Clothing", + "description": "Indulge in the renowned tailoring experience of Hoi An. Explore the numerous tailor shops and browse through a vast selection of fabrics and designs. Get measured for a custom-made suit, dress, or any garment of your choice, crafted to your exact specifications. This is a unique opportunity to create a personalized souvenir and embrace the town's tailoring heritage.", + "locationName": "Hoi An Tailor Shops", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "vietnam", + "ref": "shop-for-custom-made-clothing", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_shop-for-custom-made-clothing.jpg" + }, + { + "name": "Take a Cooking Class", + "description": "Delve into the world of Vietnamese cuisine by taking a cooking class. Learn the secrets of preparing traditional dishes, from fresh spring rolls to flavorful pho, under the guidance of experienced local chefs. Discover the art of balancing flavors and using aromatic herbs and spices. This immersive experience allows you to bring home a taste of Vietnam and impress your friends and family with your culinary skills.", + "locationName": "Hoi An Cooking Schools", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "vietnam", + "ref": "take-a-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_take-a-cooking-class.jpg" + }, + { + "name": "Enjoy the Nightlife", + "description": "Experience the vibrant nightlife of Hoi An. Explore the bars and pubs along the riverfront, enjoying live music, refreshing drinks, and a lively atmosphere. Dance the night away at a local club or simply relax and soak up the energetic ambiance. Hoi An offers a diverse nightlife scene catering to various tastes.", + "locationName": "Hoi An Bars and Clubs", + "duration": 3, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "vietnam", + "ref": "enjoy-the-nightlife", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_enjoy-the-nightlife.jpg" + }, + { + "name": "Kayak Through the Nipa Palm Forest", + "description": "Embark on a serene kayaking adventure through the enchanting Nipa Palm Forest. Glide along the tranquil waterways, surrounded by lush greenery and the gentle rustling of palm leaves. Observe local fishermen casting their nets and immerse yourself in the peaceful ambiance of this unique ecosystem.", + "locationName": "Cam Thanh Coconut Village", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "vietnam", + "ref": "kayak-through-the-nipa-palm-forest", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_kayak-through-the-nipa-palm-forest.jpg" + }, + { + "name": "Discover the Charm of Cam Kim Island", + "description": "Escape the bustling town and venture to Cam Kim Island, a hidden gem just a short ferry ride away. Explore the island's traditional villages, where skilled artisans craft intricate wood carvings and vibrant straw mats. Immerse yourself in the local culture, visit ancient pagodas, and enjoy the peaceful countryside scenery.", + "locationName": "Cam Kim Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "vietnam", + "ref": "discover-the-charm-of-cam-kim-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_discover-the-charm-of-cam-kim-island.jpg" + }, + { + "name": "Unwind with a Spa Treatment", + "description": "Indulge in a rejuvenating spa experience and let your worries melt away. Hoi An offers a variety of spa treatments, from traditional Vietnamese massages to luxurious body scrubs and facials. Choose from a range of options to suit your needs and emerge feeling refreshed and revitalized.", + "locationName": "Various spas throughout Hoi An", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "vietnam", + "ref": "unwind-with-a-spa-treatment", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_unwind-with-a-spa-treatment.jpg" + }, + { + "name": "Try Your Hand at Basket Boat Riding", + "description": "Experience a unique and thrilling activity by riding a traditional Vietnamese basket boat. Learn how to maneuver these circular boats, used by local fishermen for centuries, and enjoy a fun-filled ride along the Thu Bon River. This is a great way to get a different perspective of the surrounding landscapes and immerse yourself in local culture.", + "locationName": "Thu Bon River", + "duration": 1, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "vietnam", + "ref": "try-your-hand-at-basket-boat-riding", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_try-your-hand-at-basket-boat-riding.jpg" + }, + { + "name": "Catch a Water Puppet Show", + "description": "Immerse yourself in Vietnamese culture with a captivating water puppet show. Marvel at the intricate puppets as they dance and glide across the water, accompanied by traditional music and storytelling. This unique art form dates back centuries and offers a glimpse into Vietnam's rich cultural heritage.", + "locationName": "Hoi An Theater", + "duration": 1, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 2, + "destinationRef": "vietnam", + "ref": "catch-a-water-puppet-show", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_catch-a-water-puppet-show.jpg" + }, + { + "name": "Discover the Marble Mountains", + "description": "Embark on an adventure to the Marble Mountains, a cluster of five marble and limestone hills just south of Hoi An. Explore the natural caves, pagodas, and temples carved into the mountainsides, and enjoy breathtaking panoramic views of the surrounding countryside.", + "locationName": "Marble Mountains", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "vietnam", + "ref": "discover-the-marble-mountains", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_discover-the-marble-mountains.jpg" + }, + { + "name": "Learn to Surf at An Bang Beach", + "description": "Catch some waves at An Bang Beach, a renowned surfing spot with consistent waves suitable for all levels. Enroll in a surf lesson with experienced instructors and experience the thrill of riding the waves.", + "locationName": "An Bang Beach", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "vietnam", + "ref": "learn-to-surf-at-an-bang-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_learn-to-surf-at-an-bang-beach.jpg" + }, + { + "name": "Visit the Tra Que Vegetable Village", + "description": "Immerse yourself in the local culture at Tra Que Vegetable Village, a charming village known for its organic farming practices. Learn about traditional farming methods, interact with local farmers, and enjoy a delicious farm-to-table meal.", + "locationName": "Tra Que Vegetable Village", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "vietnam", + "ref": "visit-the-tra-que-vegetable-village", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_visit-the-tra-que-vegetable-village.jpg" + }, + { + "name": "Experience a Traditional Vietnamese Herbal Foot Bath", + "description": "Indulge in a relaxing and rejuvenating experience with a traditional Vietnamese herbal foot bath. Soak your feet in a warm bath infused with local herbs and essential oils, known for their therapeutic properties.", + "locationName": "Various spas and wellness centers", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "vietnam", + "ref": "experience-a-traditional-vietnamese-herbal-foot-bath", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_experience-a-traditional-vietnamese-herbal-foot-bath.jpg" + }, + { + "name": "Go Birdwatching at the Bay Mau Coconut Forest", + "description": "Embark on a peaceful boat trip through the Bay Mau Coconut Forest, a unique ecosystem home to diverse bird species. Observe the vibrant avian life and immerse yourself in the tranquil beauty of the mangrove forest.", + "locationName": "Bay Mau Coconut Forest", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "vietnam", + "ref": "go-birdwatching-at-the-bay-mau-coconut-forest", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/vietnam_go-birdwatching-at-the-bay-mau-coconut-forest.jpg" + }, + { + "name": "Swim with Whale Sharks at Ningaloo Reef", + "description": "Embark on an unforgettable adventure at Ningaloo Reef, a UNESCO World Heritage Site, and swim alongside gentle giants – whale sharks! These magnificent creatures migrate along the coast of Western Australia between March and August, offering a once-in-a-lifetime experience for snorkelers and divers.", + "locationName": "Ningaloo Reef", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "western-australia", + "ref": "swim-with-whale-sharks-at-ningaloo-reef", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_swim-with-whale-sharks-at-ningaloo-reef.jpg" + }, + { + "name": "Explore the Pinnacles Desert", + "description": "Discover the otherworldly landscapes of the Pinnacles Desert in Nambung National Park. Wander through thousands of limestone pillars rising from the golden sand dunes, formed over millions of years. Capture breathtaking photos and enjoy the unique beauty of this natural wonder.", + "locationName": "Nambung National Park", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "western-australia", + "ref": "explore-the-pinnacles-desert", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_explore-the-pinnacles-desert.jpg" + }, + { + "name": "Visit Rottnest Island", + "description": "Escape to Rottnest Island, a car-free paradise just a short ferry ride from Perth. Relax on pristine beaches, cycle around the island, and encounter the adorable quokkas, known as the happiest animals on Earth. Snorkel in crystal-clear waters, explore historic sites, or simply soak up the island vibes.", + "locationName": "Rottnest Island", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "western-australia", + "ref": "visit-rottnest-island", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_visit-rottnest-island.jpg" + }, + { + "name": "Discover the Margaret River Region", + "description": "Indulge in the renowned Margaret River region, famous for its world-class wineries, craft breweries, and gourmet food scene. Embark on a wine tasting tour, savor delicious local produce, and explore the stunning coastline with its dramatic cliffs, pristine beaches, and surf breaks.", + "locationName": "Margaret River", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "western-australia", + "ref": "discover-the-margaret-river-region", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_discover-the-margaret-river-region.jpg" + }, + { + "name": "Venture into the Kimberley", + "description": "Embark on an epic adventure to the Kimberley, a remote and rugged region in the north of Western Australia. Discover ancient gorges, cascading waterfalls, Aboriginal rock art, and unique wildlife. Cruise through Horizontal Falls, hike in the Bungle Bungle Range, and experience the raw beauty of this untamed wilderness.", + "locationName": "Kimberley Region", + "duration": 5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "western-australia", + "ref": "venture-into-the-kimberley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_venture-into-the-kimberley.jpg" + }, + { + "name": "Hike the Bibbulmun Track", + "description": "Embark on an epic hiking adventure along the Bibbulmun Track, one of the world's longest and most renowned long-distance trails. Traverse diverse landscapes, from towering forests and coastal cliffs to rolling hills and tranquil valleys, while encountering unique flora and fauna along the way. Choose from various sections to suit your fitness level and time constraints, and immerse yourself in the natural beauty of Western Australia.", + "locationName": "Bibbulmun Track", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "western-australia", + "ref": "hike-the-bibbulmun-track", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_hike-the-bibbulmun-track.jpg" + }, + { + "name": "Stargaze in the Outback", + "description": "Escape the city lights and venture into the vast outback of Western Australia for an unforgettable stargazing experience. With minimal light pollution, the night sky comes alive with a breathtaking display of stars, constellations, and even the Milky Way. Join a guided astronomy tour or simply lie back and marvel at the celestial wonders above, feeling a sense of awe and wonder in the vastness of the universe.", + "locationName": "Outback Western Australia", + "duration": 4, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "western-australia", + "ref": "stargaze-in-the-outback", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_stargaze-in-the-outback.jpg" + }, + { + "name": "Visit the Monkey Mia Dolphins", + "description": "Experience the magic of interacting with wild dolphins at Monkey Mia, a renowned marine reserve located on the Shark Bay World Heritage Site. Witness these intelligent and playful creatures swim close to shore and participate in the daily feeding sessions, where you can learn about their behavior and conservation efforts. This unique and heartwarming experience is perfect for families and nature enthusiasts alike.", + "locationName": "Monkey Mia", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "western-australia", + "ref": "visit-the-monkey-mia-dolphins", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_visit-the-monkey-mia-dolphins.jpg" + }, + { + "name": "Learn to Surf at Margaret River", + "description": "Catch a wave and experience the thrill of surfing at Margaret River, a world-renowned surfing destination. With consistent swells, pristine beaches, and a laid-back atmosphere, it's the perfect place to learn or improve your surfing skills. Take a lesson from experienced instructors, rent a board, and ride the waves, enjoying the exhilaration and connection with the ocean.", + "locationName": "Margaret River", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": false, + "price": 3, + "destinationRef": "western-australia", + "ref": "learn-to-surf-at-margaret-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_learn-to-surf-at-margaret-river.jpg" + }, + { + "name": "Explore Fremantle's Historic Streets", + "description": "Step back in time and explore the charming port city of Fremantle, known for its rich maritime history and well-preserved architecture. Wander through the historic streets lined with heritage buildings, visit Fremantle Prison, a UNESCO World Heritage Site, and explore the bustling Fremantle Markets, offering local crafts, fresh produce, and unique souvenirs.", + "locationName": "Fremantle", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "western-australia", + "ref": "explore-fremantle-s-historic-streets", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_explore-fremantle-s-historic-streets.jpg" + }, + { + "name": "Kayak with Dolphins in Rockingham", + "description": "Embark on a thrilling kayaking adventure from Rockingham, just south of Perth, where you'll have the opportunity to paddle alongside playful dolphins in their natural habitat. Witness these intelligent creatures up close as they swim, leap, and interact with each other, creating an unforgettable wildlife encounter.", + "locationName": "Rockingham", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "western-australia", + "ref": "kayak-with-dolphins-in-rockingham", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_kayak-with-dolphins-in-rockingham.jpg" + }, + { + "name": "4WD Adventure in the Pilbara", + "description": "Embark on an exhilarating 4WD adventure through the rugged landscapes of the Pilbara region. Explore ancient gorges, towering rock formations, and hidden waterfalls, and discover the rich Aboriginal history and culture of the area.", + "locationName": "Pilbara", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "western-australia", + "ref": "4wd-adventure-in-the-pilbara", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_4wd-adventure-in-the-pilbara.jpg" + }, + { + "name": "Wine Tour in Swan Valley", + "description": "Indulge in a delightful wine tour through the picturesque Swan Valley, Western Australia's oldest wine region. Sample a variety of award-winning wines at charming boutique wineries, savor gourmet local produce, and enjoy the scenic beauty of the vineyards.", + "locationName": "Swan Valley", + "duration": 6, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "western-australia", + "ref": "wine-tour-in-swan-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_wine-tour-in-swan-valley.jpg" + }, + { + "name": "Treetop Walk in Walpole Nornalup National Park", + "description": "Experience a unique perspective of the towering tingle forests with a thrilling treetop walk in Walpole Nornalup National Park. Walk amongst the giants of the forest on a series of suspended walkways and bridges, offering breathtaking views of the canopy and the surrounding landscape.", + "locationName": "Walpole Nornalup National Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "western-australia", + "ref": "treetop-walk-in-walpole-nornalup-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_treetop-walk-in-walpole-nornalup-national-park.jpg" + }, + { + "name": "Catch a Sunset at Cable Beach", + "description": "Witness the magical spectacle of a Western Australian sunset at the iconic Cable Beach in Broome. Relax on the pristine white sand, watch the sun dip below the horizon, casting vibrant hues across the sky, and perhaps even enjoy a camel ride along the beach for a truly unforgettable experience.", + "locationName": "Cable Beach, Broome", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "western-australia", + "ref": "catch-a-sunset-at-cable-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_catch-a-sunset-at-cable-beach.jpg" + }, + { + "name": "Go on a wildlife cruise to spot humpback whales", + "description": "Embark on an unforgettable whale-watching cruise from Augusta or Dunsborough between June and December. Witness the majestic humpback whales as they migrate along the coast, breaching and playing in the pristine waters. This is a breathtaking experience for nature enthusiasts and families alike.", + "locationName": "Augusta or Dunsborough", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "western-australia", + "ref": "go-on-a-wildlife-cruise-to-spot-humpback-whales", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_go-on-a-wildlife-cruise-to-spot-humpback-whales.jpg" + }, + { + "name": "Explore the ancient landscapes of Karijini National Park", + "description": "Discover the rugged beauty of Karijini National Park, home to breathtaking gorges, cascading waterfalls, and ancient rock formations. Hike through the park's trails, take a refreshing dip in the natural pools, and marvel at the stunning scenery. This adventure is perfect for outdoor enthusiasts seeking a unique experience.", + "locationName": "Karijini National Park", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "western-australia", + "ref": "explore-the-ancient-landscapes-of-karijini-national-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_explore-the-ancient-landscapes-of-karijini-national-park.jpg" + }, + { + "name": "Visit the world's largest fringing reef, Ningaloo Reef", + "description": "Dive into the turquoise waters of Ningaloo Reef, the world's largest fringing reef, and encounter an abundance of marine life. Snorkel or scuba dive amongst colorful coral reefs, swim with manta rays, and witness the gentle giants of the ocean – whale sharks.", + "locationName": "Ningaloo Reef", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "western-australia", + "ref": "visit-the-world-s-largest-fringing-reef-ningaloo-reef", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_visit-the-world-s-largest-fringing-reef-ningaloo-reef.jpg" + }, + { + "name": "Delve into Aboriginal culture and history", + "description": "Immerse yourself in the rich culture and history of Australia's Aboriginal people through guided tours and experiences. Learn about their ancient traditions, connection to the land, and unique art forms. This is a meaningful and educational experience for travelers seeking a deeper understanding of Australia's heritage.", + "locationName": "Various locations across Western Australia", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "western-australia", + "ref": "delve-into-aboriginal-culture-and-history", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_delve-into-aboriginal-culture-and-history.jpg" + }, + { + "name": "Indulge in a gourmet food and wine experience", + "description": "Western Australia boasts a thriving food and wine scene. Embark on a culinary journey, sampling fresh local produce, award-winning wines, and craft beers. Visit renowned restaurants, charming cafes, and vibrant farmers' markets to savor the flavors of the region.", + "locationName": "Margaret River, Swan Valley, Perth", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "western-australia", + "ref": "indulge-in-a-gourmet-food-and-wine-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/western-australia_indulge-in-a-gourmet-food-and-wine-experience.jpg" + }, + { + "name": "Witness the Eruption of Old Faithful", + "description": "Experience the iconic eruption of Old Faithful, a world-renowned geyser that shoots boiling water high into the air at regular intervals. Witnessing this natural wonder is a must-do for any visitor to Yellowstone.", + "locationName": "Upper Geyser Basin", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "yellowstone-national-park", + "ref": "witness-the-eruption-of-old-faithful", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_witness-the-eruption-of-old-faithful.jpg" + }, + { + "name": "Wildlife Watching in Lamar Valley", + "description": "Embark on a wildlife safari in Lamar Valley, known as the 'Serengeti of North America.' Spot herds of bison, elk, and pronghorn, and with some luck, you might even see wolves, bears, or coyotes. Bring your binoculars and camera for an unforgettable experience.", + "locationName": "Lamar Valley", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "yellowstone-national-park", + "ref": "wildlife-watching-in-lamar-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_wildlife-watching-in-lamar-valley.jpg" + }, + { + "name": "Hike to the Grand Prismatic Spring", + "description": "Embark on a scenic hike to the Grand Prismatic Spring, the largest hot spring in the United States. Marvel at the vibrant colors of the spring, caused by thermophilic bacteria, and enjoy panoramic views of the surrounding geothermal landscape.", + "locationName": "Midway Geyser Basin", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "yellowstone-national-park", + "ref": "hike-to-the-grand-prismatic-spring", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_hike-to-the-grand-prismatic-spring.jpg" + }, + { + "name": "Explore the Mud Volcano Area", + "description": "Discover the fascinating geothermal features of the Mud Volcano Area, where bubbling mudpots and fumaroles create a unique and otherworldly landscape. Learn about the volcanic processes that shape this area and witness the power of nature up close.", + "locationName": "Mud Volcano Area", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "yellowstone-national-park", + "ref": "explore-the-mud-volcano-area", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_explore-the-mud-volcano-area.jpg" + }, + { + "name": "Take a Scenic Drive along the Grand Loop Road", + "description": "Embark on a scenic drive along the Grand Loop Road, a 142-mile route that circles the park and offers stunning views of mountains, lakes, geysers, and canyons. Stop at various viewpoints and visitor centers along the way to learn about the park's history and geology.", + "locationName": "Grand Loop Road", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "yellowstone-national-park", + "ref": "take-a-scenic-drive-along-the-grand-loop-road", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_take-a-scenic-drive-along-the-grand-loop-road.jpg" + }, + { + "name": "Go horseback riding through scenic trails", + "description": "Experience the beauty of Yellowstone National Park from a unique perspective on a guided horseback riding tour. Several outfitters offer various trail options, catering to different skill levels and interests. Whether you're a seasoned rider or a beginner, you'll enjoy traversing meadows, forests, and mountain vistas while immersing yourself in the park's serene landscapes. Keep an eye out for wildlife sightings along the way, making your horseback adventure even more memorable.", + "locationName": "Various locations within Yellowstone National Park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "yellowstone-national-park", + "ref": "go-horseback-riding-through-scenic-trails", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_go-horseback-riding-through-scenic-trails.jpg" + }, + { + "name": "Fly fishing in pristine rivers and streams", + "description": "Yellowstone National Park is a haven for fly fishing enthusiasts, boasting renowned rivers and streams teeming with trout. Cast your line in the crystal-clear waters of the Yellowstone River, the Madison River, or the Firehole River, surrounded by stunning natural beauty. Whether you're a seasoned angler or a novice, the park offers ample opportunities to test your skills and experience the thrill of catching wild trout.", + "locationName": "Yellowstone River, Madison River, Firehole River", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "yellowstone-national-park", + "ref": "fly-fishing-in-pristine-rivers-and-streams", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_fly-fishing-in-pristine-rivers-and-streams.jpg" + }, + { + "name": "Camp under the stars in designated campgrounds", + "description": "Immerse yourself in the wilderness of Yellowstone National Park by camping under the starry night sky. The park offers numerous campgrounds, each providing a unique experience. Fall asleep to the sounds of nature and wake up to breathtaking views. Whether you prefer a developed campground with amenities or a more primitive backcountry site, camping in Yellowstone is an unforgettable way to connect with the natural world.", + "locationName": "Various campgrounds within Yellowstone National Park", + "duration": 12, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "yellowstone-national-park", + "ref": "camp-under-the-stars-in-designated-campgrounds", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_camp-under-the-stars-in-designated-campgrounds.jpg" + }, + { + "name": "Take a boat tour on Yellowstone Lake", + "description": "Embark on a scenic boat tour across the pristine waters of Yellowstone Lake, the largest high-altitude lake in North America. Enjoy breathtaking views of the surrounding mountains and forests while learning about the lake's history, geology, and ecology. Keep an eye out for wildlife such as eagles, ospreys, and waterfowl. Some tours even offer opportunities for fishing or swimming.", + "locationName": "Yellowstone Lake", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "yellowstone-national-park", + "ref": "take-a-boat-tour-on-yellowstone-lake", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_take-a-boat-tour-on-yellowstone-lake.jpg" + }, + { + "name": "Visit the historic Old Faithful Inn", + "description": "Step back in time at the iconic Old Faithful Inn, a National Historic Landmark renowned for its rustic architecture and grandeur. Explore the inn's unique features, including the massive stone fireplace, the handcrafted log furniture, and the impressive seven-story lobby. Take a guided tour to learn about the inn's history and construction, or simply relax and soak up the atmosphere of this architectural marvel.", + "locationName": "Old Faithful Inn", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "yellowstone-national-park", + "ref": "visit-the-historic-old-faithful-inn", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_visit-the-historic-old-faithful-inn.jpg" + }, + { + "name": "Go Whitewater Rafting on the Yellowstone River", + "description": "Experience the thrill of whitewater rafting on the Yellowstone River. Navigate through exhilarating rapids, surrounded by stunning canyon scenery and the possibility of spotting wildlife along the riverbanks. Several outfitters offer guided tours for various skill levels, ensuring a safe and unforgettable adventure.", + "locationName": "Yellowstone River", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "yellowstone-national-park", + "ref": "go-whitewater-rafting-on-the-yellowstone-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_go-whitewater-rafting-on-the-yellowstone-river.jpg" + }, + { + "name": "Visit the Grizzly & Wolf Discovery Center", + "description": "Get up close and personal with majestic grizzly bears and gray wolves at the Grizzly & Wolf Discovery Center in West Yellowstone. Learn about these fascinating creatures through educational exhibits and observe their behaviors in spacious enclosures. This experience offers a unique opportunity to understand and appreciate these iconic animals.", + "locationName": "Grizzly & Wolf Discovery Center", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "yellowstone-national-park", + "ref": "visit-the-grizzly-wolf-discovery-center", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_visit-the-grizzly-wolf-discovery-center.jpg" + }, + { + "name": "Stargazing in the World's First Dark Sky Park", + "description": "Escape the city lights and marvel at the breathtaking night sky in Yellowstone, designated as the world's first International Dark Sky Park. Join a ranger-led stargazing program or simply find a secluded spot to witness the Milky Way, constellations, and celestial wonders with exceptional clarity.", + "locationName": "Various locations throughout the park", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "yellowstone-national-park", + "ref": "stargazing-in-the-world-s-first-dark-sky-park", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_stargazing-in-the-world-s-first-dark-sky-park.jpg" + }, + { + "name": "Explore the Historic Fort Yellowstone", + "description": "Step back in time and explore the historic Fort Yellowstone, established in the late 19th century to protect the park. Visit the preserved buildings, including the former army barracks and officer's quarters, and learn about the early history of Yellowstone and the role of the U.S. Army in its conservation.", + "locationName": "Fort Yellowstone", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "yellowstone-national-park", + "ref": "explore-the-historic-fort-yellowstone", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_explore-the-historic-fort-yellowstone.jpg" + }, + { + "name": "Take a Dip in the Boiling River", + "description": "Experience a unique geothermal phenomenon at the Boiling River, where a hot spring flows into the Gardner River, creating a natural hot tub. Relax and soak in the warm waters while enjoying the surrounding scenery. Be sure to follow safety guidelines and check for closures before visiting.", + "locationName": "Boiling River", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "yellowstone-national-park", + "ref": "take-a-dip-in-the-boiling-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_take-a-dip-in-the-boiling-river.jpg" + }, + { + "name": "Snowshoeing or Cross-Country Skiing in Winter Wonderland", + "description": "Experience the magic of Yellowstone blanketed in snow with a peaceful snowshoeing or cross-country skiing adventure. Glide through serene meadows and snow-covered forests, surrounded by breathtaking winter scenery. Numerous trails cater to different skill levels, making it a perfect winter activity for families and individuals seeking tranquility in nature.", + "locationName": "Various trails throughout the park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "yellowstone-national-park", + "ref": "snowshoeing-or-cross-country-skiing-in-winter-wonderland", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_snowshoeing-or-cross-country-skiing-in-winter-wonderland.jpg" + }, + { + "name": "Photography Tour of Yellowstone's Hidden Gems", + "description": "Embark on a photography tour led by a local expert to capture the essence of Yellowstone's lesser-known wonders. Discover hidden waterfalls, secluded geothermal areas, and picturesque landscapes, while learning photography techniques to immortalize the park's beauty. This tour is ideal for photography enthusiasts and those seeking unique perspectives of Yellowstone.", + "locationName": "Various off-the-beaten-path locations", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "yellowstone-national-park", + "ref": "photography-tour-of-yellowstone-s-hidden-gems", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_photography-tour-of-yellowstone-s-hidden-gems.jpg" + }, + { + "name": "Attend a Ranger-led Program", + "description": "Engage in a ranger-led program to delve deeper into Yellowstone's ecosystem, history, and geology. Park rangers offer a variety of informative and entertaining programs throughout the day, including guided walks, campfire talks, and evening presentations. These programs provide valuable insights and enhance your understanding of the park's natural and cultural significance.", + "locationName": "Visitor centers and various locations throughout the park", + "duration": 1, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "yellowstone-national-park", + "ref": "attend-a-ranger-led-program", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_attend-a-ranger-led-program.jpg" + }, + { + "name": "Visit the Museum of the National Park Ranger", + "description": "Explore the Museum of the National Park Ranger to discover the history and heritage of park rangers. Learn about their vital role in preserving national parks and the challenges they face. The museum offers exhibits, artifacts, and interactive displays, providing a unique perspective on the park ranger profession.", + "locationName": "Norris Geyser Basin", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "yellowstone-national-park", + "ref": "visit-the-museum-of-the-national-park-ranger", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_visit-the-museum-of-the-national-park-ranger.jpg" + }, + { + "name": "Biking on Designated Trails", + "description": "Enjoy a scenic bike ride along Yellowstone's designated trails. Explore different areas of the park at your own pace, immersing yourself in the surrounding nature. Several trails offer stunning views and opportunities for wildlife sightings. Biking is a fantastic way to experience the park's vastness while getting some exercise.", + "locationName": "Various paved and unpaved trails throughout the park", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "yellowstone-national-park", + "ref": "biking-on-designated-trails", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yellowstone-national-park_biking-on-designated-trails.jpg" + }, + { + "name": "Hiking to Yosemite Falls", + "description": "Embark on an unforgettable hike to the top of Yosemite Falls, North America's tallest waterfall. Witness breathtaking views of the valley and surrounding granite cliffs as you ascend through lush forests and rocky terrain.", + "locationName": "Yosemite Valley", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "yosemite-national-park", + "ref": "hiking-to-yosemite-falls", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_hiking-to-yosemite-falls.jpg" + }, + { + "name": "Stargazing in Glacier Point", + "description": "Experience the magic of Yosemite's night sky at Glacier Point. Away from city lights, marvel at the Milky Way and countless stars, creating a truly unforgettable celestial experience.", + "locationName": "Glacier Point", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": true, + "price": 1, + "destinationRef": "yosemite-national-park", + "ref": "stargazing-in-glacier-point", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_stargazing-in-glacier-point.jpg" + }, + { + "name": "Rock Climbing El Capitan", + "description": "Challenge yourself with a thrilling rock climbing adventure on El Capitan, one of the world's most iconic rock formations. With various routes for different skill levels, experience the adrenaline rush and stunning views from the top.", + "locationName": "El Capitan", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "yosemite-national-park", + "ref": "rock-climbing-el-capitan", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_rock-climbing-el-capitan.jpg" + }, + { + "name": "Exploring the Mariposa Grove of Giant Sequoias", + "description": "Wander among the majestic giants of Mariposa Grove, home to some of the world's largest and oldest living trees. Walk through the Grizzly Giant Loop Trail and witness the awe-inspiring size and beauty of these ancient sequoias.", + "locationName": "Mariposa Grove", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "yosemite-national-park", + "ref": "exploring-the-mariposa-grove-of-giant-sequoias", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_exploring-the-mariposa-grove-of-giant-sequoias.jpg" + }, + { + "name": "Scenic Drive along Tioga Road", + "description": "Embark on a scenic drive along Tioga Road, offering breathtaking views of Yosemite's high country. Pass by alpine meadows, granite domes, and pristine lakes, stopping at lookout points to capture the stunning vistas.", + "locationName": "Tioga Road", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "yosemite-national-park", + "ref": "scenic-drive-along-tioga-road", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_scenic-drive-along-tioga-road.jpg" + }, + { + "name": "Whitewater Rafting on the Merced River", + "description": "Experience the thrill of whitewater rafting on the Merced River, navigating through exhilarating rapids surrounded by the stunning scenery of Yosemite Valley. Several outfitters offer guided tours for various skill levels, making it an unforgettable adventure for families and thrill-seekers alike.", + "locationName": "Merced River", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "yosemite-national-park", + "ref": "whitewater-rafting-on-the-merced-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_whitewater-rafting-on-the-merced-river.jpg" + }, + { + "name": "Biking Through Yosemite Valley", + "description": "Rent a bike and explore the paved paths winding through Yosemite Valley, offering a leisurely way to soak in the breathtaking views of El Capitan, Half Dome, and Yosemite Falls. It's a fantastic option for families with children or those who prefer a more relaxed pace to experience the park's beauty.", + "locationName": "Yosemite Valley", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "yosemite-national-park", + "ref": "biking-through-yosemite-valley", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_biking-through-yosemite-valley.jpg" + }, + { + "name": "Photography Tour of Yosemite's Icons", + "description": "Join a photography tour led by a local expert to capture the essence of Yosemite's iconic landmarks. Learn about composition, lighting, and techniques to create stunning images of Half Dome, El Capitan, Yosemite Falls, and the surrounding landscapes. This tour is perfect for photography enthusiasts of all levels.", + "locationName": "Various locations throughout Yosemite Valley", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "yosemite-national-park", + "ref": "photography-tour-of-yosemite-s-icons", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_photography-tour-of-yosemite-s-icons.jpg" + }, + { + "name": "Horseback Riding in the High Sierra", + "description": "Embark on a horseback riding adventure through the scenic trails of the High Sierra. Several stables offer guided tours, allowing you to explore the backcountry, meadows, and forests while enjoying the tranquility of nature and the company of these gentle animals.", + "locationName": "High Sierra Camps or Yosemite Valley stables", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "yosemite-national-park", + "ref": "horseback-riding-in-the-high-sierra", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_horseback-riding-in-the-high-sierra.jpg" + }, + { + "name": "Birdwatching in Yosemite's Diverse Habitats", + "description": "With over 260 bird species recorded in Yosemite, birdwatching is a rewarding activity for nature enthusiasts. Explore various habitats, from meadows and forests to rivers and cliffs, and spot a variety of birds, including Steller's jays, woodpeckers, and even bald eagles.", + "locationName": "Various locations throughout the park", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 1, + "destinationRef": "yosemite-national-park", + "ref": "birdwatching-in-yosemite-s-diverse-habitats", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_birdwatching-in-yosemite-s-diverse-habitats.jpg" + }, + { + "name": "Swimming in the Merced River", + "description": "Cool off with a refreshing dip in the Merced River! Several swimming holes are scattered throughout the park, offering stunning views and a chance to relax in nature. Popular spots include Sentinel Beach and Cathedral Beach. Remember to check the water conditions before swimming and be aware of potential currents.", + "locationName": "Merced River", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 1, + "destinationRef": "yosemite-national-park", + "ref": "swimming-in-the-merced-river", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_swimming-in-the-merced-river.jpg" + }, + { + "name": "Visiting the Yosemite Museum", + "description": "Delve into the rich history and culture of Yosemite Valley at the Yosemite Museum. Discover exhibits on the Ahwahneechee people, the park's geological formations, and the early pioneers who explored the area. Learn about the delicate balance of nature and the importance of conservation efforts.", + "locationName": "Yosemite Valley", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "yosemite-national-park", + "ref": "visiting-the-yosemite-museum", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_visiting-the-yosemite-museum.jpg" + }, + { + "name": "Art Classes and Workshops", + "description": "Unleash your creativity amidst the inspiring landscapes of Yosemite! The park offers various art classes and workshops, including painting, photography, and sketching. Capture the beauty of your surroundings on canvas or learn new techniques from experienced instructors.", + "locationName": "Various locations throughout the park", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "yosemite-national-park", + "ref": "art-classes-and-workshops", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_art-classes-and-workshops.jpg" + }, + { + "name": "Ranger-Led Programs", + "description": "Join knowledgeable park rangers for informative and engaging programs that delve deeper into Yosemite's wonders. Participate in guided nature walks, campfire talks, and evening presentations. Learn about the park's flora and fauna, its geological history, and ongoing conservation efforts.", + "locationName": "Various locations throughout the park", + "duration": 1.5, + "timeOfDay": "any", + "familyFriendly": true, + "price": 1, + "destinationRef": "yosemite-national-park", + "ref": "ranger-led-programs", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_ranger-led-programs.jpg" + }, + { + "name": "Fine Dining at The Ahwahnee", + "description": "Indulge in a memorable dining experience at The Ahwahnee, a historic hotel renowned for its elegant ambiance and exquisite cuisine. Savor delicious meals prepared with fresh, local ingredients while enjoying breathtaking views of Yosemite Valley. Reservations are recommended.", + "locationName": "The Ahwahnee Hotel", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": false, + "price": 4, + "destinationRef": "yosemite-national-park", + "ref": "fine-dining-at-the-ahwahnee", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_fine-dining-at-the-ahwahnee.jpg" + }, + { + "name": "Backpacking in the Yosemite Wilderness", + "description": "Embark on a multi-day backpacking adventure into the heart of Yosemite's wilderness. Hike through pristine landscapes, camp under the stars, and experience the park's raw beauty far from the crowds. Choose from various trails like the John Muir Trail or the High Sierra Camps Loop, offering stunning views and a true escape into nature.", + "locationName": "Yosemite Wilderness", + "duration": 24, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "yosemite-national-park", + "ref": "backpacking-in-the-yosemite-wilderness", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_backpacking-in-the-yosemite-wilderness.jpg" + }, + { + "name": "Fishing in Yosemite's Lakes and Streams", + "description": "Cast a line and enjoy a peaceful day of fishing in Yosemite's pristine lakes and streams. Mirror Lake, Tenaya Lake, and the Merced River offer opportunities to catch trout, bass, and other fish species. Obtain a California fishing license and savor the tranquility of nature while waiting for a bite.", + "locationName": "Mirror Lake, Tenaya Lake, Merced River", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "yosemite-national-park", + "ref": "fishing-in-yosemite-s-lakes-and-streams", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_fishing-in-yosemite-s-lakes-and-streams.jpg" + }, + { + "name": "Winter Sports in Yosemite", + "description": "Experience the magic of Yosemite in winter with a variety of snow activities. Badger Pass Ski Area offers downhill skiing, snowboarding, and snow tubing for all skill levels. Cross-country skiing and snowshoeing trails wind through the park's winter wonderland, providing breathtaking views and a serene escape.", + "locationName": "Badger Pass Ski Area", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "yosemite-national-park", + "ref": "winter-sports-in-yosemite", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_winter-sports-in-yosemite.jpg" + }, + { + "name": "Exploring Yosemite Valley by Bike", + "description": "Rent a bike and explore the wonders of Yosemite Valley on two wheels. Cycle along paved paths, enjoying iconic views of Half Dome, El Capitan, and Yosemite Falls. Stop at various points of interest, have a picnic by the Merced River, and experience the valley's beauty at your own pace.", + "locationName": "Yosemite Valley", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "yosemite-national-park", + "ref": "exploring-yosemite-valley-by-bike", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_exploring-yosemite-valley-by-bike.jpg" + }, + { + "name": "Rock Climbing Lessons and Guided Climbs", + "description": "Challenge yourself with rock climbing in Yosemite, a world-renowned destination for this thrilling activity. Take lessons from experienced guides to learn the basics or join a guided climb to conquer iconic formations like El Capitan or Half Dome. Experience the adrenaline rush and breathtaking views from the top.", + "locationName": "El Capitan, Half Dome", + "duration": 8, + "timeOfDay": "any", + "familyFriendly": false, + "price": 4, + "destinationRef": "yosemite-national-park", + "ref": "rock-climbing-lessons-and-guided-climbs", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yosemite-national-park_rock-climbing-lessons-and-guided-climbs.jpg" + }, + { + "name": "Explore Chichen Itza", + "description": "Embark on a journey through time at Chichen Itza, the awe-inspiring ancient Mayan city. Marvel at the iconic El Castillo pyramid, the Great Ball Court, and the Temple of Warriors. Uncover the mysteries of Mayan astronomy at the observatory and immerse yourself in the rich history and culture of this UNESCO World Heritage Site.", + "locationName": "Chichen Itza", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "yucatan-peninsula", + "ref": "explore-chichen-itza", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_explore-chichen-itza.jpg" + }, + { + "name": "Dive into Cenotes", + "description": "Discover the hidden underwater world of the Yucatan Peninsula's cenotes. Snorkel or scuba dive in these natural sinkholes filled with crystal-clear freshwater, exploring stunning stalactites, stalagmites, and unique marine life. Dos Ojos Cenote and Gran Cenote offer unforgettable experiences for all levels of divers.", + "locationName": "Various Cenotes (Dos Ojos, Gran Cenote)", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "yucatan-peninsula", + "ref": "dive-into-cenotes", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_dive-into-cenotes.jpg" + }, + { + "name": "Relax on Tulum's Beaches", + "description": "Unwind on the pristine white sand beaches of Tulum, where turquoise waters meet ancient Mayan ruins. Soak up the sun, swim in the Caribbean Sea, and enjoy breathtaking views of the Tulum Archaeological Site perched on a clifftop. Explore nearby beach clubs and indulge in delicious local cuisine.", + "locationName": "Tulum Beaches", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "yucatan-peninsula", + "ref": "relax-on-tulum-s-beaches", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_relax-on-tulum-s-beaches.jpg" + }, + { + "name": "Swim with Whale Sharks", + "description": "Embark on an unforgettable adventure swimming alongside gentle giants, the whale sharks. From May to September, these magnificent creatures gather off the coast of Isla Mujeres and Holbox. Join a responsible tour and experience the thrill of snorkeling or diving near these majestic animals in their natural habitat.", + "locationName": "Isla Mujeres or Holbox", + "duration": 6, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "yucatan-peninsula", + "ref": "swim-with-whale-sharks", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_swim-with-whale-sharks.jpg" + }, + { + "name": "Explore Valladolid", + "description": "Step back in time in the charming colonial city of Valladolid. Stroll through its colorful streets, admire the historic architecture, and visit the Convent of San Bernardino of Siena. Discover the vibrant local culture at the Mercado Municipal, where you can find handcrafted souvenirs and delicious Yucatecan cuisine.", + "locationName": "Valladolid", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 2, + "destinationRef": "yucatan-peninsula", + "ref": "explore-valladolid", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_explore-valladolid.jpg" + }, + { + "name": "Kayaking through Sian Ka'an Biosphere Reserve", + "description": "Embark on a serene kayaking adventure through the Sian Ka'an Biosphere Reserve, a UNESCO World Heritage Site. Paddle through mangrove forests, spot diverse wildlife like dolphins, turtles, and exotic birds, and immerse yourself in the natural beauty of this protected ecosystem. Choose from guided tours or rent kayaks for a self-guided exploration.", + "locationName": "Sian Ka'an Biosphere Reserve", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "yucatan-peninsula", + "ref": "kayaking-through-sian-ka-an-biosphere-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_kayaking-through-sian-ka-an-biosphere-reserve.jpg" + }, + { + "name": "Visit the Yellow City of Izamal", + "description": "Step into a world of vibrant yellow hues in the charming colonial town of Izamal. Explore the Convent of San Antonio de Padua, a historic monastery with a vast atrium, and climb the Kinich Kak Moo pyramid for panoramic views. Discover local artisan shops, indulge in Yucatecan cuisine, and experience the tranquil atmosphere of this unique town.", + "locationName": "Izamal", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "yucatan-peninsula", + "ref": "visit-the-yellow-city-of-izamal", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_visit-the-yellow-city-of-izamal.jpg" + }, + { + "name": "Sample Tequila and Mezcal at a Hacienda", + "description": "Delve into the world of Mexican spirits with a tequila and mezcal tasting at a traditional hacienda. Learn about the production process, discover the distinct flavors of different varieties, and savor the unique aromas. Many haciendas offer tours that showcase the history and culture of the region, providing a glimpse into the Yucatan's past.", + "locationName": "Various haciendas throughout Yucatan", + "duration": 2, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "yucatan-peninsula", + "ref": "sample-tequila-and-mezcal-at-a-hacienda", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_sample-tequila-and-mezcal-at-a-hacienda.jpg" + }, + { + "name": "Take a Cooking Class and Learn Yucatecan Cuisine", + "description": "Unleash your inner chef and learn the secrets of Yucatecan cuisine with a hands-on cooking class. Master traditional dishes like cochinita pibil, sopa de lima, and panuchos, using fresh local ingredients. Immerse yourself in the flavors and techniques of this unique culinary tradition, and take home newfound skills to recreate the magic in your own kitchen.", + "locationName": "Various cooking schools and restaurants in Yucatan", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "yucatan-peninsula", + "ref": "take-a-cooking-class-and-learn-yucatecan-cuisine", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_take-a-cooking-class-and-learn-yucatecan-cuisine.jpg" + }, + { + "name": "Go Birdwatching in Celestun Biosphere Reserve", + "description": "Embark on a birdwatching adventure in the Celestun Biosphere Reserve, home to a diverse array of avian species. Observe pink flamingos in their natural habitat, spot herons, pelicans, and other migratory birds. Take a boat tour through the mangroves or explore the reserve's walking trails for an unforgettable experience.", + "locationName": "Celestun Biosphere Reserve", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "yucatan-peninsula", + "ref": "go-birdwatching-in-celestun-biosphere-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_go-birdwatching-in-celestun-biosphere-reserve.jpg" + }, + { + "name": "Sunset Sail in the Caribbean Sea", + "description": "Embark on a magical sunset cruise along the turquoise waters of the Caribbean Sea. As the sun dips below the horizon, casting hues of orange and pink across the sky, enjoy breathtaking views of the coastline and the gentle rocking of the boat. Savor delicious cocktails and snacks while keeping an eye out for playful dolphins or sea turtles that might grace you with their presence. This romantic and relaxing experience is perfect for couples or anyone seeking a moment of tranquility.", + "locationName": "Caribbean Sea", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "yucatan-peninsula", + "ref": "sunset-sail-in-the-caribbean-sea", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_sunset-sail-in-the-caribbean-sea.jpg" + }, + { + "name": "Explore the Pink Lakes of Las Coloradas", + "description": "Venture to the unique pink lakes of Las Coloradas, a natural wonder that will leave you awestruck. These vibrant pink waters get their color from salt-loving microorganisms and create a surreal landscape, perfect for capturing stunning photos. Learn about the salt production process at the nearby salt factory and take a dip in the refreshing waters for a truly unforgettable experience. ", + "locationName": "Las Coloradas", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "yucatan-peninsula", + "ref": "explore-the-pink-lakes-of-las-coloradas", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_explore-the-pink-lakes-of-las-coloradas.jpg" + }, + { + "name": "Discover Ek Balam and Rappel into a Cenote", + "description": "Combine history and adventure with a visit to the ancient Mayan city of Ek Balam. Climb the Acropolis pyramid for panoramic views of the surrounding jungle, and then descend into the depths of a cenote by rappelling down its limestone walls. This thrilling experience allows you to explore the hidden world of these natural sinkholes and cool off in their refreshing waters. ", + "locationName": "Ek Balam", + "duration": 5, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "yucatan-peninsula", + "ref": "discover-ek-balam-and-rappel-into-a-cenote", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_discover-ek-balam-and-rappel-into-a-cenote.jpg" + }, + { + "name": "Shop for Handicrafts in Merida's Markets", + "description": "Immerse yourself in the vibrant culture of Merida by exploring its bustling markets. Discover unique handcrafted souvenirs, including textiles, ceramics, and jewelry, all made by local artisans. Wander through the Mercado Lucas de Galvez, the largest market in the city, and soak up the lively atmosphere. This is a great opportunity to find authentic treasures and support the local economy.", + "locationName": "Merida", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "yucatan-peninsula", + "ref": "shop-for-handicrafts-in-merida-s-markets", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_shop-for-handicrafts-in-merida-s-markets.jpg" + }, + { + "name": "Horseback Riding through the Jungle", + "description": "Embark on an adventurous horseback riding tour through the lush Yucatan jungle. Follow scenic trails, passing by ancient Mayan ruins and hidden cenotes, and admire the diverse flora and fauna. This is a unique way to experience the natural beauty of the region and create lasting memories. Whether you're an experienced rider or a beginner, this activity offers a thrilling and unforgettable adventure.", + "locationName": "Yucatan Jungle", + "duration": 2, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "yucatan-peninsula", + "ref": "horseback-riding-through-the-jungle", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_horseback-riding-through-the-jungle.jpg" + }, + { + "name": "Uncover the Secrets of Coba", + "description": "Embark on a journey to Coba, an ancient Mayan city nestled deep in the jungle. Climb Nohoch Mul, the tallest pyramid in the Yucatan, and enjoy breathtaking panoramic views of the surrounding rainforest. Explore the ancient ball court, temples, and sacbes (white roads) that once connected this bustling city. Rent a bike or hire a bicitaxi to navigate the vast archaeological site and truly immerse yourself in the Mayan world.", + "locationName": "Coba", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "yucatan-peninsula", + "ref": "uncover-the-secrets-of-coba", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_uncover-the-secrets-of-coba.jpg" + }, + { + "name": "Take a Salsa Dancing Class", + "description": "Immerse yourself in the vibrant nightlife of the Yucatan Peninsula by taking a salsa dancing class. Learn the basic steps and rhythms of this energetic Latin dance, and then hit the dance floor to practice your newfound skills. Many bars and clubs offer salsa nights, providing the perfect opportunity to show off your moves and mingle with locals.", + "locationName": "Merida or Playa del Carmen", + "duration": 2, + "timeOfDay": "night", + "familyFriendly": false, + "price": 2, + "destinationRef": "yucatan-peninsula", + "ref": "take-a-salsa-dancing-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_take-a-salsa-dancing-class.jpg" + }, + { + "name": "Indulge in a Temazcal Ceremony", + "description": "Experience a traditional Mayan temazcal ceremony, a purifying ritual that combines heat, steam, and medicinal herbs. Enter a dome-shaped sweat lodge led by a shaman and participate in chanting, meditation, and cleansing rituals. This unique cultural experience is believed to promote physical and spiritual well-being.", + "locationName": "Various locations throughout the Yucatan", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "yucatan-peninsula", + "ref": "indulge-in-a-temazcal-ceremony", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_indulge-in-a-temazcal-ceremony.jpg" + }, + { + "name": "Go Spelunking in Rio Secreto", + "description": "Embark on an unforgettable underground adventure at Rio Secreto, a stunning network of underground rivers and caves. Swim and wade through crystal-clear waters, marvel at dramatic stalactites and stalagmites, and learn about the geological history of the region. This unique experience offers a glimpse into the hidden world beneath the Yucatan's surface.", + "locationName": "Rio Secreto", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 4, + "destinationRef": "yucatan-peninsula", + "ref": "go-spelunking-in-rio-secreto", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_go-spelunking-in-rio-secreto.jpg" + }, + { + "name": "Explore the Ruins of Uxmal", + "description": "Journey back in time at Uxmal, another impressive Mayan archaeological site renowned for its Puuc architectural style. Admire the intricate carvings on the Pyramid of the Magician, the Governor's Palace, and the Nunnery Quadrangle. Learn about the fascinating history and mythology of the Mayan civilization as you explore this UNESCO World Heritage Site.", + "locationName": "Uxmal", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "yucatan-peninsula", + "ref": "explore-the-ruins-of-uxmal", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/yucatan-peninsula_explore-the-ruins-of-uxmal.jpg" + }, + { + "name": "Stone Town Exploration", + "description": "Embark on a captivating journey through the labyrinthine streets of Stone Town, a UNESCO World Heritage site. Discover its rich history, architectural marvels like the House of Wonders and the Old Fort, and vibrant cultural tapestry. Get lost in the bustling bazaars, savor aromatic spices, and immerse yourself in the unique blend of African, Arab, and European influences.", + "locationName": "Stone Town", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "zanzibar", + "ref": "stone-town-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_stone-town-exploration.jpg" + }, + { + "name": "Spice Tour Adventure", + "description": "Unleash your inner spice enthusiast with a fragrant spice tour. Explore lush spice plantations, learn about the cultivation of cloves, nutmeg, cinnamon, and other exotic spices, and indulge in the tantalizing aromas and flavors. Discover the medicinal and culinary uses of these spices, and experience the island's rich agricultural heritage.", + "locationName": "Spice Plantations", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "zanzibar", + "ref": "spice-tour-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_spice-tour-adventure.jpg" + }, + { + "name": "Underwater Wonders: Scuba Diving or Snorkeling", + "description": "Dive into the vibrant underwater world surrounding Zanzibar. Explore coral reefs teeming with marine life, encounter colorful fish, graceful sea turtles, and perhaps even dolphins. Whether you choose scuba diving or snorkeling, prepare to be amazed by the beauty and biodiversity of the Indian Ocean.", + "locationName": "Mnemba Atoll or other diving/snorkeling sites", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": false, + "price": 3, + "destinationRef": "zanzibar", + "ref": "underwater-wonders-scuba-diving-or-snorkeling", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_underwater-wonders-scuba-diving-or-snorkeling.jpg" + }, + { + "name": "Prison Island Escape", + "description": "Take a short boat trip to Prison Island, also known as Changuu Island. Discover the island's intriguing history as a former quarantine station and prison, and encounter the resident giant tortoises. Relax on pristine beaches, swim in crystal-clear waters, and enjoy a peaceful escape from the mainland.", + "locationName": "Prison Island", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "zanzibar", + "ref": "prison-island-escape", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_prison-island-escape.jpg" + }, + { + "name": "Sunset Dhow Cruise", + "description": "Sail into the golden sunset aboard a traditional dhow, a wooden sailboat. As you glide along the tranquil waters, soak up the breathtaking views of the coastline, enjoy the gentle sea breeze, and witness the magical colors of the sky. Indulge in a delicious seafood dinner on board and create unforgettable memories.", + "locationName": "Zanzibar Coast", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 3, + "destinationRef": "zanzibar", + "ref": "sunset-dhow-cruise", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_sunset-dhow-cruise.jpg" + }, + { + "name": "Jozani Forest Exploration", + "description": "Embark on a journey into the heart of Zanzibar's Jozani Forest, a haven of biodiversity and home to the rare and endemic red colobus monkey. Hike through the lush mangrove swamps and witness these playful primates swinging through the trees. Keep an eye out for other fascinating creatures like bushbabies, duikers, and various bird species. This is a perfect adventure for nature enthusiasts and wildlife watchers.", + "locationName": "Jozani Chwaka Bay National Park", + "duration": 3, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "zanzibar", + "ref": "jozani-forest-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_jozani-forest-exploration.jpg" + }, + { + "name": "Kitesurfing in Paje", + "description": "Experience the thrill of kitesurfing in Paje, a renowned destination for watersports enthusiasts. With consistent winds, shallow turquoise waters, and a vibrant kitesurfing community, Paje offers ideal conditions for both beginners and experienced riders. Take lessons, rent equipment, and soar across the Indian Ocean, enjoying the adrenaline rush and breathtaking coastal views.", + "locationName": "Paje Beach", + "duration": 4, + "timeOfDay": "afternoon", + "familyFriendly": false, + "price": 3, + "destinationRef": "zanzibar", + "ref": "kitesurfing-in-paje", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_kitesurfing-in-paje.jpg" + }, + { + "name": "Forodhani Gardens Food Market", + "description": "Immerse yourself in the vibrant atmosphere of Forodhani Gardens, a bustling food market that comes alive each evening. Sample a diverse array of local Zanzibari street food, from fresh seafood and grilled meats to aromatic curries and tropical fruits. Enjoy the lively ambiance, mingle with locals, and savor the authentic flavors of Zanzibar under the starry sky.", + "locationName": "Forodhani Gardens", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "zanzibar", + "ref": "forodhani-gardens-food-market", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_forodhani-gardens-food-market.jpg" + }, + { + "name": "Spice Farm Tour and Cooking Class", + "description": "Delve into the world of spices on a captivating tour of a local spice farm. Discover the history and cultivation of Zanzibar's renowned spices, such as cloves, nutmeg, and cinnamon. Engage your senses with the vibrant colors and aromas, and then participate in a hands-on cooking class, learning to prepare traditional Zanzibari dishes infused with these aromatic spices. ", + "locationName": "Zanzibar Spice Farms", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 2, + "destinationRef": "zanzibar", + "ref": "spice-farm-tour-and-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_spice-farm-tour-and-cooking-class.jpg" + }, + { + "name": "Dhow Sailing and Island Hopping", + "description": "Embark on a traditional dhow sailing adventure, exploring the surrounding islands and hidden coves. Sail across the turquoise waters, snorkel in pristine coral reefs, and discover secluded beaches. Visit nearby islands like Mnemba Atoll or Chumbe Island, known for their abundant marine life and untouched natural beauty. Enjoy a leisurely day of sailing, swimming, and soaking up the sun.", + "locationName": "Zanzibar Archipelago", + "duration": 6, + "timeOfDay": "any", + "familyFriendly": true, + "price": 3, + "destinationRef": "zanzibar", + "ref": "dhow-sailing-and-island-hopping", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_dhow-sailing-and-island-hopping.jpg" + }, + { + "name": "Safari Blue Adventure", + "description": "Embark on a full-day sailing excursion to explore the Menai Bay Conservation Area. Swim with dolphins, snorkel amidst vibrant coral reefs, indulge in a seafood feast on a sandbank, and experience the magic of Zanzibar's turquoise waters.", + "locationName": "Menai Bay Conservation Area", + "duration": 8, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 4, + "destinationRef": "zanzibar", + "ref": "safari-blue-adventure", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_safari-blue-adventure.jpg" + }, + { + "name": "The Rock Restaurant Experience", + "description": "Dine at the iconic The Rock Restaurant, perched on a rock formation in the Indian Ocean. Savor delicious seafood and local cuisine while enjoying breathtaking panoramic views of the ocean.", + "locationName": "Michamvi Pingwe", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 4, + "destinationRef": "zanzibar", + "ref": "the-rock-restaurant-experience", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_the-rock-restaurant-experience.jpg" + }, + { + "name": "Mtoni Palace Ruins Exploration", + "description": "Step back in time and explore the haunting ruins of Mtoni Palace, once a majestic residence of Zanzibar's sultans. Discover the palace's history and architectural beauty, and imagine the opulent lifestyle of its former inhabitants.", + "locationName": "Mtoni", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "zanzibar", + "ref": "mtoni-palace-ruins-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_mtoni-palace-ruins-exploration.jpg" + }, + { + "name": "Kendwa Rocks Beach Party", + "description": "Experience Zanzibar's vibrant nightlife at Kendwa Rocks, a renowned beach bar and party hotspot. Dance the night away to live music, DJs, and enjoy the energetic atmosphere under the stars.", + "locationName": "Kendwa", + "duration": 5, + "timeOfDay": "night", + "familyFriendly": false, + "price": 3, + "destinationRef": "zanzibar", + "ref": "kendwa-rocks-beach-party", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_kendwa-rocks-beach-party.jpg" + }, + { + "name": "Zanzibar Butterfly Centre", + "description": "Immerse yourself in the enchanting world of butterflies at the Zanzibar Butterfly Centre. Witness a kaleidoscope of colors as you walk through the enclosed tropical garden and learn about the life cycle of these fascinating creatures.", + "locationName": "Pete", + "duration": 2, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "zanzibar", + "ref": "zanzibar-butterfly-centre", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_zanzibar-butterfly-centre.jpg" + }, + { + "name": "Dolphin Encounter in Kizimkazi", + "description": "Embark on a magical boat trip to Kizimkazi, a fishing village known for its resident population of dolphins. Watch these playful creatures in their natural habitat, and if you're lucky, you might even get the chance to swim alongside them. This experience is perfect for nature lovers and families with children.", + "locationName": "Kizimkazi", + "duration": 4, + "timeOfDay": "morning", + "familyFriendly": true, + "price": 3, + "destinationRef": "zanzibar", + "ref": "dolphin-encounter-in-kizimkazi", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_dolphin-encounter-in-kizimkazi.jpg" + }, + { + "name": "Mangrove Kayaking in Mtoni Marine Reserve", + "description": "Explore the serene beauty of the Mtoni Marine Reserve on a kayak adventure through the mangrove forests. Paddle through the calm waters, observe the diverse ecosystem, and learn about the importance of mangrove conservation. This activity is suitable for all ages and fitness levels, offering a unique perspective of Zanzibar's natural landscape.", + "locationName": "Mtoni Marine Reserve", + "duration": 3, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "zanzibar", + "ref": "mangrove-kayaking-in-mtoni-marine-reserve", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_mangrove-kayaking-in-mtoni-marine-reserve.jpg" + }, + { + "name": "Sunset at Nungwi Beach", + "description": "Experience the breathtaking beauty of a Zanzibar sunset at Nungwi Beach. Relax on the soft sand, sip on a refreshing cocktail, and watch as the sky transforms into a canvas of vibrant colors. Nungwi Beach offers a lively atmosphere with beach bars and restaurants, making it a perfect spot for a romantic evening or a fun night out with friends.", + "locationName": "Nungwi Beach", + "duration": 2, + "timeOfDay": "evening", + "familyFriendly": true, + "price": 1, + "destinationRef": "zanzibar", + "ref": "sunset-at-nungwi-beach", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_sunset-at-nungwi-beach.jpg" + }, + { + "name": "Authentic Swahili Cooking Class", + "description": "Immerse yourself in the local culture with a hands-on Swahili cooking class. Learn the secrets of traditional Zanzibari cuisine, using fresh, local ingredients and aromatic spices. Prepare and savor delicious dishes like pilau rice, coconut bean stew, and grilled seafood. This is a fantastic way to experience the culinary heritage of Zanzibar.", + "locationName": "Various locations", + "duration": 3, + "timeOfDay": "afternoon", + "familyFriendly": true, + "price": 3, + "destinationRef": "zanzibar", + "ref": "authentic-swahili-cooking-class", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_authentic-swahili-cooking-class.jpg" + }, + { + "name": "Jambiani Village and Kuza Cave Exploration", + "description": "Discover the authentic village life of Jambiani, known for its seaweed farming and traditional fishing practices. Interact with the friendly locals, learn about their culture, and explore the Kuza Cave, a natural wonder with crystal-clear water perfect for a refreshing swim. This off-the-beaten-path experience offers a glimpse into the heart of Zanzibar.", + "locationName": "Jambiani Village", + "duration": 4, + "timeOfDay": "any", + "familyFriendly": true, + "price": 2, + "destinationRef": "zanzibar", + "ref": "jambiani-village-and-kuza-cave-exploration", + "imageUrl": "https://storage.googleapis.com/tripedia-images/activities/zanzibar_jambiani-village-and-kuza-cave-exploration.jpg" + } +] diff --git a/compass_app/app/assets/destinations.json b/compass_app/app/assets/destinations.json new file mode 100644 index 000000000..be1f233c5 --- /dev/null +++ b/compass_app/app/assets/destinations.json @@ -0,0 +1,1235 @@ +[ + { + "ref": "alaska", + "name": "Alaska", + "country": "United States", + "continent": "North America", + "knownFor": "Alaska is a haven for outdoor enthusiasts and nature lovers. Visitors can experience glaciers, mountains, and wildlife, making it ideal for hiking, kayaking, and wildlife viewing. Alaska also offers a unique cultural experience with its rich Native American heritage and frontier spirit.", + "tags": ["Mountain", "Off-the-beaten-path", "Wildlife watching"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/alaska.jpg" + }, + { + "ref": "amalfi-coast", + "name": "Amalfi Coast", + "country": "Italy", + "continent": "Europe", + "knownFor": "Experience the breathtaking beauty of the Amalfi Coast, with its dramatic cliffs, colorful villages, and turquoise waters. Indulge in delicious Italian cuisine, explore charming towns like Positano and Amalfi, and soak up the sun on picturesque beaches.", + "tags": ["Beach", "Romantic", "Foodie"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/amalfi-coast.jpg" + }, + { + "ref": "amazon-rainforest", + "name": "Amazon Rainforest", + "country": "Brazil", + "continent": "South America", + "knownFor": "Immerse yourself in the biodiversity of the world's largest rainforest. Embark on jungle treks, spot exotic wildlife, and discover indigenous cultures. Take a boat trip down the Amazon River, explore the canopy on a zipline, and experience the unique ecosystem.", + "tags": ["Jungle", "Wildlife watching", "Adventure sports"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/amazon-rainforest.jpg" + }, + { + "ref": "andes-mountains", + "name": "The Andes Mountains", + "country": "South America", + "continent": "South America", + "knownFor": "The Andes Mountains, stretching along the western coast of South America, offer diverse landscapes and experiences. Visitors can trek to Machu Picchu in Peru, explore the salt flats of Salar de Uyuni in Bolivia, or visit the glaciers of Patagonia. The Andes also provide opportunities for skiing, mountaineering, and cultural encounters with indigenous communities.", + "tags": ["Mountain", "Hiking", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/andes-mountains.jpg" + }, + { + "ref": "angkor-wat", + "name": "Angkor Wat", + "country": "Cambodia", + "continent": "Asia", + "knownFor": "Angkor Wat, a vast temple complex in Cambodia, is the largest religious monument in the world and a UNESCO World Heritage site. Visitors can explore the intricate carvings, towering spires, and vast courtyards, marveling at the architectural grandeur and rich history of the Khmer Empire.", + "tags": ["Historic", "Cultural experiences", "Sightseeing"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/angkor-wat.jpg" + }, + { + "ref": "antelope-canyon", + "name": "Antelope Canyon", + "country": "United States", + "continent": "North America", + "knownFor": "Experience the awe-inspiring beauty of Antelope Canyon, a slot canyon renowned for its flowing sandstone formations and mesmerizing light beams. Embark on guided tours to navigate the narrow passageways and capture stunning photographs. Learn about the Navajo Nation's history and culture, as the canyon is located on their land.", + "tags": ["Off-the-beaten-path", "Hiking", "Sightseeing"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/antelope-canyon.jpg" + }, + { + "ref": "aruba", + "name": "Aruba", + "country": "Aruba", + "continent": "South America", + "knownFor": "Indulge in the beauty of Aruba, a Caribbean paradise known for its pristine beaches, turquoise waters, and year-round sunshine. Relax on the white sands of Eagle Beach, explore the vibrant capital of Oranjestad, and discover hidden coves and natural wonders. Aruba offers a perfect escape for beach lovers and water sports enthusiasts.", + "tags": ["Beach", "Island", "Scuba diving"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/aruba.jpg" + }, + { + "ref": "asheville", + "name": "Asheville", + "country": "USA", + "continent": "North America", + "knownFor": "Asheville, nestled in the Blue Ridge Mountains of North Carolina, is a vibrant city known for its arts scene, craft breweries, and outdoor activities. Visitors can explore the historic Biltmore Estate, hike in the surrounding mountains, sample local beers, and enjoy the city's eclectic shops and restaurants.", + "tags": ["City", "Hiking", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/asheville.jpg" + }, + { + "ref": "azores", + "name": "Azores", + "country": "Portugal", + "continent": "Europe", + "knownFor": "This archipelago in the mid-Atlantic boasts stunning volcanic landscapes, lush green hills, and dramatic coastlines. Hike to crater lakes, soak in natural hot springs, or go whale watching in the surrounding waters. With its relaxed atmosphere and unique culture, the Azores is a perfect destination for nature lovers and adventurers seeking an off-the-beaten-path experience.", + "tags": ["Island", "Off-the-beaten-path", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/azores.jpg" + }, + { + "ref": "bali", + "name": "Bali", + "country": "Indonesia", + "continent": "Asia", + "knownFor": "Discover the cultural heart of Indonesia on the island of Bali. Explore ancient temples, experience vibrant Hindu traditions, and relax on beautiful beaches. Practice yoga and meditation, indulge in spa treatments, and enjoy the island's lush natural beauty.", + "tags": ["Island", "Cultural experiences", "Wellness retreats"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/bali.jpg" + }, + { + "ref": "banff-national-park", + "name": "Banff National Park", + "country": "Canada", + "continent": "North America", + "knownFor": "Nestled in the Canadian Rockies, Banff National Park offers stunning mountain scenery, turquoise lakes, and abundant wildlife. Hike to Lake Louise, explore Johnston Canyon, and enjoy outdoor activities year-round.", + "tags": ["Mountain", "Hiking", "Wildlife watching"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/banff-national-park.jpg" + }, + { + "ref": "belize", + "name": "Belize", + "country": "Belize", + "continent": "North America", + "knownFor": "Embark on an unforgettable adventure in Belize, a Central American gem boasting lush rainforests, ancient Maya ruins, and the world's second-largest barrier reef. Explore the mysteries of Caracol and Xunantunich, dive into the Great Blue Hole, and discover diverse marine life. Belize offers a unique blend of cultural exploration and eco-tourism.", + "tags": ["Jungle", "Historic", "Scuba diving"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/belize.jpg" + }, + { + "ref": "bhutan", + "name": "Bhutan", + "country": "Bhutan", + "continent": "Asia", + "knownFor": "Discover the mystical kingdom of Bhutan, nestled in the Himalayas. Explore ancient monasteries, hike through pristine valleys, and experience the unique culture and traditions. Immerse yourself in the spiritual atmosphere and embrace the concept of Gross National Happiness.", + "tags": ["Mountain", "Cultural experiences", "Off-the-beaten-path"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/bhutan.jpg" + }, + { + "ref": "big-island-hawaii", + "name": "Big Island", + "country": "United States", + "continent": "North America", + "knownFor": "The Big Island of Hawaii offers diverse landscapes, from volcanic craters and black sand beaches to lush rainforests and snow-capped mountains. Visitors can witness the fiery glow of Kilauea volcano, snorkel with manta rays, and stargaze atop Mauna Kea.", + "tags": ["Island", "Hiking", "Snorkeling"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/big-island-hawaii.jpg" + }, + { + "ref": "big-sur", + "name": "Big Sur", + "country": "United States", + "continent": "North America", + "knownFor": "Experience the breathtaking beauty of California's rugged coastline along Big Sur. Drive the iconic Pacific Coast Highway, stopping at dramatic cliffs, hidden coves, and redwood forests. Enjoy hiking, camping, or simply soaking up the awe-inspiring views of this natural wonderland.", + "tags": ["Road trip destination", "Secluded", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/big-sur.jpg" + }, + { + "ref": "bora-bora", + "name": "Bora Bora", + "country": "French Polynesia", + "continent": "Oceania", + "knownFor": "Bora Bora is synonymous with luxury and tranquility. Overwater bungalows perched above turquoise lagoons offer a unique and indulgent experience. Visitors can enjoy snorkeling, diving, and swimming amidst vibrant coral reefs and diverse marine life. The island's lush interior provides opportunities for hiking and exploring, while Polynesian culture adds a touch of exotic charm.", + "tags": ["Island", "Luxury", "Secluded"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/bora-bora.jpg" + }, + { + "ref": "botswana", + "name": "Okavango Delta", + "country": "Botswana", + "continent": "Africa", + "knownFor": "The Okavango Delta, a unique inland delta in Botswana, is a haven for wildlife enthusiasts. Visitors can embark on safari adventures, encountering elephants, lions, hippos, and a diverse array of birds. The delta's waterways offer opportunities for mokoro (canoe) excursions and boat tours, providing a close-up view of the abundant wildlife and stunning landscapes.", + "tags": ["Wildlife watching", "Adventure sports", "Luxury"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/botswana.jpg" + }, + { + "ref": "bruges", + "name": "Bruges", + "country": "Belgium", + "continent": "Europe", + "knownFor": "Step back in time in this charming medieval city with its cobblestone streets, canals, and well-preserved architecture. Explore the historic Markt square, indulge in delicious Belgian chocolate and beer, or take a boat tour through the canals. Bruges offers a romantic and picturesque escape for history buffs and those seeking a quintessential European experience.", + "tags": ["City", "Historic", "Romantic"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/bruges.jpg" + }, + { + "ref": "brunei", + "name": "Brunei", + "country": "Brunei", + "continent": "Asia", + "knownFor": "This small sultanate on the island of Borneo offers a fascinating blend of culture and nature. Visitors can explore the opulent Sultan Omar Ali Saifuddin Mosque, delve into the lush rainforests, and discover the unique water village of Kampong Ayer.", + "tags": ["Secluded", "Cultural experiences", "Island"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/brunei.jpg" + }, + { + "ref": "budapest", + "name": "Budapest", + "country": "Hungary", + "continent": "Europe", + "knownFor": "Discover the charm of Budapest, a historic city divided by the Danube River. Explore Buda's Castle District with its medieval streets and Fisherman's Bastion, offering panoramic views. Relax in the thermal baths, a legacy of the Ottoman era, or visit the Hungarian Parliament Building, a stunning example of Gothic Revival architecture.", + "tags": ["City", "Historic", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/budapest.jpg" + }, + { + "ref": "burgundy", + "name": "Burgundy", + "country": "France", + "continent": "Europe", + "knownFor": "Burgundy, a region in eastern France, is renowned for its world-class wines, charming villages, and rich history. Explore vineyards, indulge in wine tastings, and visit medieval castles and abbeys. Cycle through rolling hills, savor gourmet cuisine, and experience the art de vivre of this picturesque region.", + "tags": ["Rural", "Wine tasting", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/burgundy.jpg" + }, + { + "ref": "cambodia", + "name": "Cambodia", + "country": "Cambodia", + "continent": "Asia", + "knownFor": "Cambodia, a Southeast Asian nation, is a captivating blend of ancient wonders, natural beauty, and vibrant culture. Explore the magnificent temples of Angkor, relax on pristine beaches, and cruise along the Mekong River. Experience the warmth of the Cambodian people, savor delicious cuisine, and discover the rich history of this fascinating country.", + "tags": ["Historic", "Cultural experiences", "Beach"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/cambodia.jpg" + }, + { + "ref": "canadian-rockies", + "name": "Canadian Rockies", + "country": "Canada", + "continent": "North America", + "knownFor": "Embark on an adventure through the majestic Canadian Rockies, where towering mountains, turquoise lakes, and glaciers create a breathtaking landscape. Hike through scenic trails, go skiing or snowboarding in world-class resorts, and encounter diverse wildlife. Experience the thrill of outdoor activities and the beauty of untouched nature.", + "tags": ["Mountain", "Hiking", "Adventure sports"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/canadian-rockies.jpg" + }, + { + "ref": "canary-islands", + "name": "Canary Islands", + "country": "Spain", + "continent": "Europe", + "knownFor": "Discover the volcanic beauty of the Canary Islands, a Spanish archipelago off the coast of Africa. Explore diverse landscapes, from the dramatic volcanic peaks of Tenerife and Mount Teide to the golden beaches of Gran Canaria and Fuerteventura. Enjoy water sports, hiking, and stargazing in this island paradise.", + "tags": ["Island", "Beach", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/canary-islands.jpg" + }, + { + "ref": "cappadocia", + "name": "Cappadocia", + "country": "Turkey", + "continent": "Asia", + "knownFor": "Embark on a magical journey through a surreal landscape of fairy chimneys, cave dwellings, and underground cities. Soar above the valleys in a hot air balloon, explore ancient rock-cut churches, and experience the unique culture and hospitality of the region.", + "tags": ["Historic", "Off-the-beaten-path", "Adventure sports"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/cappadocia.jpg" + }, + { + "ref": "chilean-lake-district", + "name": "Chilean Lake District", + "country": "Chile", + "continent": "South America", + "knownFor": "The Chilean Lake District is a paradise for nature lovers, with snow-capped volcanoes, turquoise lakes, and lush forests. Hike in national parks, go kayaking on the lakes, and enjoy the tranquility of the surroundings. The region's German heritage adds a unique cultural element.", + "tags": ["Lake", "Mountain", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/chilean-lake-district.jpg" + }, + { + "ref": "cinque-terre", + "name": "Cinque Terre", + "country": "Italy", + "continent": "Europe", + "knownFor": "Explore the picturesque villages of Cinque Terre, perched on the rugged Italian Riviera coastline. Hike the scenic trails connecting the five colorful towns, each with its unique character. Enjoy fresh seafood, local wines, and breathtaking views of the Mediterranean Sea.", + "tags": ["Hiking", "Coastal", "Foodie"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/cinque-terre.jpg" + }, + { + "ref": "colombia", + "name": "Colombia", + "country": "Colombia", + "continent": "South America", + "knownFor": "Colombia is a vibrant country with a diverse landscape, ranging from the Andes Mountains to the Caribbean coast. Explore the colonial city of Cartagena, hike in the Cocora Valley, or dance the night away in Medellín. Discover the coffee region, learn about the indigenous cultures, and experience the warmth of the Colombian people.", + "tags": ["City", "Mountain", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/colombia.jpg" + }, + { + "ref": "corsica", + "name": "Corsica", + "country": "France", + "continent": "Europe", + "knownFor": "This mountainous Mediterranean island offers a diverse landscape of rugged mountains, pristine beaches, and charming villages. Visitors can enjoy hiking, water sports, exploring historical sites, and experiencing the unique Corsican culture.", + "tags": ["Mountain", "Beach", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/corsica.jpg" + }, + { + "ref": "costa-rica", + "name": "Osa Peninsula", + "country": "Costa Rica", + "continent": "North America", + "knownFor": "A haven for eco-tourism, the Osa Peninsula boasts incredible biodiversity, lush rainforests, and pristine beaches. Adventure seekers can go zip-lining, kayaking, and hiking, while nature enthusiasts can spot monkeys, sloths, and exotic birds. The Corcovado National Park, known as one of the most biodiverse places on Earth, is a must-visit for wildlife watching.", + "tags": ["Jungle", "Secluded", "Wildlife watching"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/costa-rica.jpg" + }, + { + "ref": "dubai", + "name": "Dubai", + "country": "United Arab Emirates", + "continent": "Asia", + "knownFor": "Dubai is a modern metropolis known for its towering skyscrapers, luxurious shopping malls, and extravagant attractions. Visitors can experience the thrill of the Burj Khalifa, the world's tallest building, shop at the Dubai Mall, or enjoy a desert safari. With its vibrant nightlife and world-class dining scene, Dubai offers a truly cosmopolitan experience.", + "tags": ["City", "Luxury", "Shopping"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/dubai.jpg" + }, + { + "ref": "dubrovnik", + "name": "Dubrovnik", + "country": "Croatia", + "continent": "Europe", + "knownFor": "Dubrovnik, the \"Pearl of the Adriatic\", is a historic walled city renowned for its stunning architecture, ancient city walls, and breathtaking coastal views. Visitors can explore historical sites, enjoy boat trips, and experience the vibrant cultural scene.", + "tags": ["Historic", "Sightseeing", "City"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/dubrovnik.jpg" + }, + { + "ref": "ethiopia", + "name": "Ethiopia", + "country": "Ethiopia", + "continent": "Africa", + "knownFor": "Ethiopia, a landlocked country in the Horn of Africa, is a unique destination with ancient history, diverse landscapes, and rich culture. Explore the rock-hewn churches of Lalibela, trek through the Simien Mountains, and witness the vibrant tribal traditions. From bustling cities to remote villages, Ethiopia offers an unforgettable journey.", + "tags": ["Off-the-beaten-path", "Cultural experiences", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/ethiopia.jpg" + }, + { + "ref": "fiesole", + "name": "Fiesole", + "country": "Italy", + "continent": "Europe", + "knownFor": "Step back in time in Fiesole, a charming hilltop town overlooking Florence, Italy. Explore Etruscan and Roman ruins, visit the beautiful Fiesole Cathedral, and wander through quaint streets lined with historic buildings. Enjoy breathtaking views of the Tuscan countryside and escape the hustle and bustle of Florence.", + "tags": ["Historic", "Rural", "Romantic"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/fiesole.jpg" + }, + { + "ref": "fiji", + "name": "Fiji", + "country": "Fiji", + "continent": "Oceania", + "knownFor": "Fiji, an archipelago in the South Pacific, is renowned for its pristine beaches, crystal-clear waters, and lush rainforests. Visitors can indulge in water activities like snorkeling, scuba diving, and surfing, or explore the islands' rich cultural heritage and traditions. Fiji is also a popular destination for honeymoons and romantic getaways.", + "tags": ["Island", "Beach", "Scuba diving"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/fiji.jpg" + }, + { + "ref": "french-alps", + "name": "French Alps", + "country": "France", + "continent": "Europe", + "knownFor": "The French Alps offer stunning mountain scenery, charming villages, and world-class skiing. During the winter months, hit the slopes in renowned resorts like Chamonix and Val d'Isère. In the summer, enjoy hiking, mountain biking, and paragliding.", + "tags": ["Mountain", "Skiing", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/french-alps.jpg" + }, + { + "ref": "french-polynesia", + "name": "French Polynesia", + "country": "France", + "continent": "Oceania", + "knownFor": "Escape to the paradise of French Polynesia, where overwater bungalows, turquoise lagoons, and pristine beaches await. Dive into the vibrant underwater world, explore volcanic landscapes, and experience Polynesian culture. Indulge in luxury resorts, romantic getaways, and unforgettable island hopping adventures.", + "tags": ["Tropical", "Island", "Luxury"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/french-polynesia.jpg" + }, + { + "ref": "french-riviera", + "name": "French Riviera", + "country": "France", + "continent": "Europe", + "knownFor": "Discover the glamour of the French Riviera, where glamorous beaches, luxury yachts, and charming coastal towns line the Mediterranean coast. Explore the vibrant city of Nice, visit the iconic Monte Carlo casino, and soak up the sun on the beaches of Cannes. Experience the region's luxurious lifestyle, stunning scenery, and vibrant nightlife.", + "tags": ["Beach", "Luxury", "Nightlife"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/french-riviera.jpg" + }, + { + "ref": "galapagos-islands", + "name": "Galapagos Islands", + "country": "Ecuador", + "continent": "South America", + "knownFor": "Embark on a once-in-a-lifetime adventure to the Galapagos Islands, a living laboratory of evolution. Observe unique wildlife, including giant tortoises, marine iguanas, and blue-footed boobies. Go snorkeling or diving among vibrant coral reefs and explore volcanic landscapes.", + "tags": ["Island", "Wildlife watching", "Scuba diving"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/galapagos-islands.jpg" + }, + { + "ref": "galicia", + "name": "Galicia", + "country": "Spain", + "continent": "Europe", + "knownFor": "This region in northwestern Spain boasts rugged coastlines, green landscapes, and a rich Celtic heritage. Visitors can enjoy fresh seafood, explore charming towns, embark on the Camino de Santiago pilgrimage, and discover the unique Galician culture.", + "tags": ["Hiking", "Cultural experiences", "Foodie"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/galicia.jpg" + }, + { + "ref": "grand-canyon", + "name": "Grand Canyon", + "country": "United States", + "continent": "North America", + "knownFor": "Witness the awe-inspiring vastness and natural beauty of the Grand Canyon, a UNESCO World Heritage Site. Hike along the rim for breathtaking panoramic views, descend into the canyon for a challenging adventure, or raft down the Colorado River. The Grand Canyon offers an unforgettable experience for nature enthusiasts and adventure seekers.", + "tags": ["Mountain", "Hiking", "Adventure sports"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/grand-canyon.jpg" + }, + { + "ref": "great-barrier-reef", + "name": "Great Barrier Reef", + "country": "Australia", + "continent": "Australia", + "knownFor": "The Great Barrier Reef is the world's largest coral reef system, teeming with marine life. Snorkel or scuba dive among colorful corals, spot tropical fish, and experience the underwater wonders of this natural treasure.", + "tags": ["Snorkeling", "Scuba diving", "Adventure sports"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/great-barrier-reef.jpg" + }, + { + "ref": "great-bear-rainforest", + "name": "Great Bear Rainforest", + "country": "Canada", + "continent": "North America", + "knownFor": "The Great Bear Rainforest is a vast and pristine wilderness area on the Pacific coast of British Columbia. It is home to a diverse array of wildlife, including grizzly bears, black bears, wolves, and whales. Visitors can explore the rainforest by boat, kayak, or on foot, and experience the magic of this untouched ecosystem.", + "tags": ["Wildlife watching", "Hiking", "Eco-conscious"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/great-bear-rainforest.jpg" + }, + { + "ref": "greek-islands", + "name": "Greek Islands", + "country": "Greece", + "continent": "Europe", + "knownFor": "Island hop through the Greek Islands, each with its own unique charm and allure. Explore ancient ruins, relax on pristine beaches, and indulge in delicious Greek cuisine. Experience the vibrant nightlife of Mykonos, the romantic sunsets of Santorini, and the historical treasures of Crete. Discover a world of crystal-clear waters, whitewashed villages, and endless sunshine.", + "tags": ["Island", "Beach", "Historic"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/greek-islands.jpg" + }, + { + "ref": "greenland", + "name": "Ilulissat Icefjord", + "country": "Greenland", + "continent": "North America", + "knownFor": "Ilulissat Icefjord is a UNESCO World Heritage site and a breathtaking natural wonder with massive icebergs calving from the Sermeq Kujalleq glacier. Visitors can take boat tours to witness the stunning ice formations, go hiking in the surrounding area, and experience the unique culture of Greenland.", + "tags": ["Off-the-beaten-path", "Adventure sports", "Wildlife watching"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/greenland.jpg" + }, + { + "ref": "guadeloupe", + "name": "Guadeloupe", + "country": "France", + "continent": "North America", + "knownFor": "Guadeloupe, a butterfly-shaped archipelago in the Caribbean, is a French overseas territory boasting stunning natural landscapes. With its lush rainforests, volcanic peaks, and white-sand beaches, it's a paradise for outdoor enthusiasts. Hike to cascading waterfalls, explore vibrant coral reefs, and savor the unique blend of French and Creole culture.", + "tags": ["Island", "Tropical", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/guadeloupe.jpg" + }, + { + "ref": "guatemala", + "name": "Lake Atitlán", + "country": "Guatemala", + "continent": "North America", + "knownFor": "Lake Atitlán, surrounded by volcanoes and traditional Mayan villages, offers a scenic and cultural experience in Guatemala. Visitors can explore the lakeside towns, hike to viewpoints, visit Mayan ruins, and learn about local traditions. The lake also provides opportunities for kayaking, swimming, and boat trips.", + "tags": ["Lake", "Cultural experiences", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/guatemala.jpg" + }, + { + "ref": "ha-long-bay", + "name": "Ha Long Bay", + "country": "Vietnam", + "continent": "Asia", + "knownFor": "Ha Long Bay is a breathtaking UNESCO World Heritage Site, featuring thousands of limestone islands and islets rising from emerald waters. Visitors can cruise through the bay, explore hidden caves, kayak among the karst formations, and experience the unique beauty of this natural wonder.", + "tags": ["Island", "Secluded", "Sightseeing"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/ha-long-bay.jpg" + }, + { + "ref": "harrisburg", + "name": "Harrisburg", + "country": "USA", + "continent": "North America", + "knownFor": "Discover the charm of Harrisburg, Pennsylvania's historic capital city. Explore the impressive Pennsylvania State Capitol Building, delve into history at the National Civil War Museum, and enjoy family fun at City Island. With its scenic riverfront location, Harrisburg offers a blend of cultural attractions and outdoor activities.", + "tags": ["City", "Historic", "Family-friendly"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/harrisburg.jpg" + }, + { + "ref": "havana", + "name": "Havana", + "country": "Cuba", + "continent": "North America", + "knownFor": "Step back in time in Havana, the vibrant capital of Cuba. Stroll along the Malecón, a seaside promenade, and admire the colorful vintage cars. Explore Old Havana, a UNESCO World Heritage Site, with its colonial architecture and lively squares. Immerse yourself in Cuban culture, music, and dance.", + "tags": ["City", "Historic", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/havana.jpg" + }, + { + "ref": "ho-chi-minh-city", + "name": "Ho Chi Minh City", + "country": "Vietnam", + "continent": "Asia", + "knownFor": "Ho Chi Minh City is a vibrant metropolis with a rich history and delicious street food. Explore the bustling markets, visit historical landmarks like the Cu Chi Tunnels, and immerse yourself in the city's energetic atmosphere. The blend of French colonial architecture and modern skyscrapers creates a unique cityscape.", + "tags": ["City", "Cultural experiences", "Food tours"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/ho-chi-minh-city.jpg" + }, + { + "ref": "iceland", + "name": "Iceland", + "country": "Iceland", + "continent": "Europe", + "knownFor": "Iceland's dramatic landscapes include glaciers, volcanoes, geysers, and waterfalls. Explore the Golden Circle, relax in geothermal pools, and witness the Northern Lights in winter.", + "tags": ["Secluded", "Adventure sports", "Winter destination"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/iceland.jpg" + }, + { + "ref": "japan-alps", + "name": "Japanese Alps", + "country": "Japan", + "continent": "Asia", + "knownFor": "The Japanese Alps offer stunning mountain scenery, traditional villages, and outdoor adventures. Hike through the Kamikochi Valley, ski in Hakuba, or soak in the onsen hot springs. Visit Matsumoto Castle, a historic landmark, and experience the unique culture of the mountain communities.", + "tags": ["Mountain", "Hiking", "Skiing"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/japan-alps.jpg" + }, + { + "ref": "jeju-island", + "name": "Jeju Island", + "country": "South Korea", + "continent": "Asia", + "knownFor": "Escape to the volcanic paradise of Jeju Island, a popular destination off the coast of South Korea. Discover stunning natural landscapes, from volcanic craters and lava tubes to pristine beaches and waterfalls. Explore unique museums, hike Mount Hallasan, and relax in charming coastal towns.", + "tags": ["Island", "Hiking", "Secluded"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/jeju-island.jpg" + }, + { + "ref": "jordan", + "name": "Petra", + "country": "Jordan", + "continent": "Asia", + "knownFor": "Petra, an ancient city carved into rose-colored sandstone cliffs, is a UNESCO World Heritage site and one of the New Seven Wonders of the World. Visitors can marvel at the Treasury, explore the Siq, and discover hidden tombs and temples. Petra offers a glimpse into the fascinating history and culture of the Nabataean civilization.", + "tags": ["Historic", "Cultural experiences", "Off-the-beaten-path"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/jordan.jpg" + }, + { + "ref": "kauai", + "name": "Kauai", + "country": "United States", + "continent": "North America", + "knownFor": "Escape to the Garden Isle of Kauai, a paradise of lush rainforests, dramatic cliffs, and pristine beaches. Hike the challenging Kalalau Trail along the Na Pali Coast, kayak the Wailua River, or relax on Poipu Beach. Discover hidden waterfalls, explore Waimea Canyon, and experience the island's laid-back atmosphere.", + "tags": ["Island", "Hiking", "Beach"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/kauai.jpg" + }, + { + "ref": "kenya", + "name": "Kenya", + "country": "Kenya", + "continent": "Africa", + "knownFor": "Embark on an unforgettable safari adventure in Kenya, home to diverse wildlife and stunning landscapes. Witness the Great Migration, encounter lions, elephants, and rhinos, and experience the rich culture of the Maasai people.", + "tags": ["Wildlife watching", "Safari", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/kenya.jpg" + }, + { + "ref": "kyoto", + "name": "Kyoto", + "country": "Japan", + "continent": "Asia", + "knownFor": "Kyoto, Japan's former capital, is a cultural treasure trove with numerous temples, shrines, and gardens. Experience traditional tea ceremonies, stroll through the Arashiyama Bamboo Grove, and immerse yourself in Japanese history and spirituality.", + "tags": ["Historic", "Cultural experiences", "City"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/kyoto.jpg" + }, + { + "ref": "lake-bled", + "name": "Lake Bled", + "country": "Slovenia", + "continent": "Europe", + "knownFor": "Nestled in the Julian Alps, Lake Bled is a fairytale-like destination with a stunning glacial lake, a charming island church, and a medieval castle perched on a cliff. Visitors can enjoy swimming, boating, hiking, and exploring the surrounding mountains. Bled is also known for its delicious cream cake and thermal springs.", + "tags": ["Lake", "Mountain", "Romantic"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/lake-bled.jpg" + }, + { + "ref": "lake-como", + "name": "Lake Como", + "country": "Italy", + "continent": "Europe", + "knownFor": "Escape to the picturesque shores of Lake Como, surrounded by charming villages, luxurious villas, and stunning mountain scenery. Take a boat tour on the lake, explore historic gardens, and indulge in fine dining and Italian wines. Enjoy hiking, biking, and water sports in the surrounding area.", + "tags": ["Lake", "Romantic", "Luxury"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/lake-como.jpg" + }, + { + "ref": "lake-district", + "name": "Lake District National Park", + "country": "England", + "continent": "Europe", + "knownFor": "Nestled in the heart of Cumbria, the Lake District offers breathtaking landscapes with rolling hills, shimmering lakes, and charming villages. Visitors can enjoy hiking, boating, and exploring the literary legacy of Beatrix Potter and William Wordsworth. The region is also known for its delicious local produce and cozy pubs.", + "tags": ["Lake", "Hiking", "Rural"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/lake-district.jpg" + }, + { + "ref": "lake-garda", + "name": "Lake Garda", + "country": "Italy", + "continent": "Europe", + "knownFor": "Lake Garda is the largest lake in Italy, known for its stunning scenery, charming towns, and historic sites. Visitors can enjoy swimming, sailing, windsurfing, and hiking in the surrounding mountains. The area is also famous for its lemon groves and olive oil production, offering delicious local cuisine and wine tasting experiences.", + "tags": ["Lake", "Mountain", "Food tours"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/lake-garda.jpg" + }, + { + "ref": "lake-tahoe", + "name": "Lake Tahoe", + "country": "USA", + "continent": "North America", + "knownFor": "Lake Tahoe offers a blend of outdoor adventure and stunning natural beauty. Visitors enjoy skiing in the winter and water sports like kayaking and paddleboarding in the summer. The crystal-clear lake, surrounded by mountains, provides breathtaking scenery and a relaxing atmosphere.", + "tags": ["Lake", "Mountain", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/lake-tahoe.jpg" + }, + { + "ref": "laos", + "name": "Laos", + "country": "Laos", + "continent": "Asia", + "knownFor": "Laos is a landlocked country in Southeast Asia, known for its laid-back atmosphere, stunning natural beauty, and ancient temples. Explore the UNESCO World Heritage city of Luang Prabang, kayak down the Mekong River, discover the Kuang Si Falls, and visit the Pak Ou Caves filled with thousands of Buddha statues.", + "tags": ["Off-the-beaten-path", "Cultural experiences", "River"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/laos.jpg" + }, + { + "ref": "lofoten-islands", + "name": "Lofoten Islands", + "country": "Norway", + "continent": "Europe", + "knownFor": "Experience the breathtaking beauty of the Arctic Circle with dramatic landscapes, towering mountains, and charming fishing villages. Hike scenic trails, kayak along pristine fjords, and marvel at the Northern Lights. Explore Viking history and indulge in fresh seafood delicacies.", + "tags": ["Island", "Secluded", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/lofoten-islands.jpg" + }, + { + "ref": "lombok", + "name": "Lombok", + "country": "Indonesia", + "continent": "Asia", + "knownFor": "Lombok, Bali's less-crowded neighbor, offers pristine beaches, lush rainforests, and the majestic Mount Rinjani volcano. Visitors can enjoy surfing, diving, hiking, and exploring the island's cultural attractions.", + "tags": ["Beach", "Mountain", "Adventure sports"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/lombok.jpg" + }, + { + "ref": "luang-prabang", + "name": "Luang Prabang", + "country": "Laos", + "continent": "Asia", + "knownFor": "Immerse yourself in the tranquility of Luang Prabang, a UNESCO World Heritage town in Laos. Visit ornate temples like Wat Xieng Thong, witness the alms-giving ceremony at dawn, and explore the night market. Cruise down the Mekong River, discover Kuang Si Falls, and experience the town's spiritual atmosphere.", + "tags": ["Off-the-beaten-path", "Cultural experiences", "River"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/luang-prabang.jpg" + }, + { + "ref": "madagascar", + "name": "Madagascar", + "country": "Madagascar", + "continent": "Africa", + "knownFor": "Madagascar, an island nation off the southeast coast of Africa, is a biodiversity hotspot with unique flora and fauna. Explore rainforests, baobab-lined avenues, and pristine beaches. Encounter lemurs, chameleons, and other endemic species, and discover the rich cultural heritage of the Malagasy people. Madagascar offers an unforgettable adventure for nature lovers.", + "tags": ["Island", "Wildlife watching", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/madagascar.jpg" + }, + { + "ref": "maldives", + "name": "Maldives", + "country": "Maldives", + "continent": "Asia", + "knownFor": "The Maldives, a tropical island nation, offers luxurious overwater bungalows, pristine beaches, and world-class diving. Relax on the white sand, swim in the crystal-clear waters, and explore the vibrant coral reefs. The Maldives is the perfect destination for a romantic getaway or a relaxing beach vacation.", + "tags": ["Island", "Beach", "Scuba diving"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/maldives.jpg" + }, + { + "ref": "mallorca", + "name": "Mallorca", + "country": "Spain", + "continent": "Europe", + "knownFor": "Mallorca offers a diverse experience, from stunning beaches and turquoise waters to charming villages and rugged mountains. Visitors can explore historic Palma, hike the Serra de Tramuntana, or simply relax on the beach and enjoy the Mediterranean sunshine.", + "tags": ["Beach", "Island", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/mallorca.jpg" + }, + { + "ref": "malta", + "name": "Malta", + "country": "Malta", + "continent": "Europe", + "knownFor": "Malta, an archipelago in the central Mediterranean, is a captivating blend of history, culture, and stunning natural beauty. Its ancient temples, fortified cities, and hidden coves attract history buffs and adventurers alike. From exploring the UNESCO-listed capital Valletta to diving in crystal-clear waters, Malta offers a diverse experience for every traveler.", + "tags": ["Island", "Historic", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/malta.jpg" + }, + { + "ref": "marrakech", + "name": "Marrakech", + "country": "Morocco", + "continent": "Africa", + "knownFor": "Step into a world of vibrant colours and bustling souks in Marrakech. Explore the historic Medina, with its maze-like alleys and hidden treasures, or marvel at the intricate architecture of mosques and palaces. Indulge in the rich flavours of Moroccan cuisine and experience the unique culture of this magical city.", + "tags": ["Cultural experiences", "City", "Shopping"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/marrakech.jpg" + }, + { + "ref": "maui", + "name": "Maui", + "country": "United States", + "continent": "North America", + "knownFor": "Experience the diverse landscapes of Maui, from volcanic craters to lush rainforests and stunning beaches. Drive the scenic Road to Hana, watch the sunrise from Haleakala Crater, or snorkel in Molokini Crater. Enjoy water sports, whale watching, and the island's relaxed vibes.", + "tags": ["Island", "Road trip", "Beach"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/maui.jpg" + }, + { + "ref": "milford-sound", + "name": "Milford Sound", + "country": "New Zealand", + "continent": "Oceania", + "knownFor": "Milford Sound, nestled in Fiordland National Park, offers breathtaking landscapes with towering cliffs, cascading waterfalls, and pristine waters. Visitors can cruise the fiord, kayak among the peaks, or hike the Milford Track for a multi-day adventure. The area is also known for its rich biodiversity, including dolphins, seals, and penguins.", + "tags": ["Secluded", "Hiking", "Wildlife watching"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/milford-sound.jpg" + }, + { + "ref": "moab", + "name": "Moab", + "country": "United States", + "continent": "North America", + "knownFor": "Moab is an adventurer's paradise, renowned for its stunning red rock formations and world-class outdoor activities. Hiking, mountain biking, and off-roading are popular pursuits in Arches and Canyonlands National Parks. The Colorado River offers white-water rafting and kayaking, while the surrounding desert landscapes provide endless opportunities for exploration and discovery.", + "tags": ["Desert", "Adventure sports", "Off-the-beaten-path"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/moab.jpg" + }, + { + "ref": "montenegro", + "name": "Montenegro", + "country": "Montenegro", + "continent": "Europe", + "knownFor": "Montenegro is a small Balkan country with a dramatic coastline, soaring mountains, and charming towns. Explore the Bay of Kotor, a UNESCO World Heritage Site, hike in Durmitor National Park, or relax on the beaches of Budva. Discover the historic cities of Kotor and Cetinje and enjoy the local seafood specialties.", + "tags": ["Beach", "Mountain", "Historic"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/montenegro.jpg" + }, + { + "ref": "mosel-valley", + "name": "Mosel Valley", + "country": "Germany", + "continent": "Europe", + "knownFor": "Embark on a journey through picturesque vineyards and charming villages along the Mosel River. Explore medieval castles, indulge in world-renowned Riesling wines, and savor authentic German cuisine. Hike or bike along scenic trails, or take a leisurely river cruise to soak in the breathtaking landscapes.", + "tags": ["River", "Wine tasting", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/mosel-valley.jpg" + }, + { + "ref": "myanmar", + "name": "Myanmar", + "country": "Myanmar", + "continent": "Asia", + "knownFor": "Myanmar (formerly Burma) is a country rich in culture and history, with ancient temples, stunning landscapes, and friendly people. Explore the iconic Shwedagon Pagoda in Yangon, visit the temple complex of Bagan, and cruise along the Irrawaddy River.", + "tags": ["Secluded", "Cultural experiences", "Off-the-beaten-path"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/myanmar.jpg" + }, + { + "ref": "mykonos", + "name": "Mykonos", + "country": "Greece", + "continent": "Europe", + "knownFor": "Mykonos is a glamorous Greek island famous for its whitewashed houses, iconic windmills, and vibrant nightlife. Visitors can relax on beautiful beaches, explore charming towns, and indulge in delicious Greek cuisine. Mykonos is also known for its luxury hotels, designer boutiques, and lively beach clubs.", + "tags": ["Island", "Beach", "Nightlife"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/mykonos.jpg" + }, + { + "ref": "nairobi", + "name": "Nairobi", + "country": "Kenya", + "continent": "Africa", + "knownFor": "Nairobi, the bustling capital of Kenya, serves as a gateway to the country's renowned safari destinations. Visit the David Sheldrick Elephant Orphanage, explore the Karen Blixen Museum, and experience the vibrant nightlife and cultural scene.", + "tags": ["City", "Wildlife watching", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/nairobi.jpg" + }, + { + "ref": "namibia", + "name": "Sossusvlei", + "country": "Namibia", + "continent": "Africa", + "knownFor": "Sossusvlei is a mesmerizing salt and clay pan surrounded by towering red sand dunes in the Namib Desert. Visitors can embark on scenic drives, climb the dunes for panoramic views, and capture breathtaking photos of the unique landscape. Sossusvlei is a photographer's paradise and a must-visit for desert enthusiasts.", + "tags": ["Desert", "Off-the-beaten-path", "Photography"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/namibia.jpg" + }, + { + "ref": "napa-valley", + "name": "Napa Valley", + "country": "United States", + "continent": "North America", + "knownFor": "Indulge in the world-renowned wine region of Napa Valley, California. Visit picturesque vineyards, sample exquisite wines, and savor gourmet cuisine at Michelin-starred restaurants. Explore charming towns like St. Helena and Yountville, or relax in luxurious spa resorts. Napa Valley offers a sophisticated and relaxing getaway for wine lovers and foodies.", + "tags": ["Wine tasting", "Food tours", "Luxury"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/napa-valley.jpg" + }, + { + "ref": "new-orleans", + "name": "New Orleans", + "country": "United States", + "continent": "North America", + "knownFor": "New Orleans is a vibrant city with a unique culture, known for its jazz music, Mardi Gras celebrations, and Creole cuisine. Explore the French Quarter, listen to live music on Frenchmen Street, or visit the historic cemeteries. Experience the nightlife, enjoy the local food, and immerse yourself in the spirit of New Orleans.", + "tags": ["City", "Cultural experiences", "Foodie"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/new-orleans.jpg" + }, + { + "ref": "new-zealand", + "name": "New Zealand", + "country": "New Zealand", + "continent": "Oceania", + "knownFor": "Embark on an adventure in New Zealand, a land of diverse landscapes, from snow-capped mountains and glaciers to geothermal wonders and lush rainforests. Hike through Fiordland National Park, explore the Waitomo Caves, and experience the thrill of bungee jumping and white-water rafting. Discover the Maori culture, indulge in delicious local cuisine, and marvel at the country's natural beauty.", + "tags": ["Adventure sports", "Hiking", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/new-zealand.jpg" + }, + { + "ref": "newfoundland", + "name": "Newfoundland", + "country": "Canada", + "continent": "North America", + "knownFor": "Newfoundland boasts rugged coastlines, charming fishing villages, and abundant wildlife. Hike along scenic trails, go whale watching, and experience the unique local culture. The island's friendly people and lively music scene add to its appeal.", + "tags": ["Island", "Wildlife watching", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/newfoundland.jpg" + }, + { + "ref": "nicaragua", + "name": "Nicaragua", + "country": "Nicaragua", + "continent": "North America", + "knownFor": "Nicaragua offers a diverse landscape of volcanoes, lakes, beaches, and rainforests. Visitors can enjoy adventure activities like surfing, volcano boarding, and zip-lining, as well as exploring colonial cities and experiencing the rich Nicaraguan culture.", + "tags": ["Adventure sports", "Beach", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/nicaragua.jpg" + }, + { + "ref": "northern-territory", + "name": "Kakadu National Park", + "country": "Australia", + "continent": "Oceania", + "knownFor": "Kakadu National Park is a UNESCO World Heritage site with diverse landscapes, including wetlands, sandstone escarpments, and ancient rock art sites. Visitors can explore Aboriginal culture, go bird watching, take boat tours through wetlands, and admire cascading waterfalls. Kakadu is a haven for wildlife, with crocodiles, wallabies, and numerous bird species.", + "tags": ["National Park", "Wildlife watching", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/northern-territory.jpg" + }, + { + "ref": "oaxaca", + "name": "Oaxaca", + "country": "Mexico", + "continent": "North America", + "knownFor": "Immerse yourself in the vibrant culture and rich history of Oaxaca, Mexico. Explore ancient Zapotec ruins, visit colorful markets filled with handicrafts, and experience traditional festivals. Sample the region's renowned cuisine, including mole sauces and mezcal. Oaxaca offers a unique and authentic travel experience for culture enthusiasts and foodies.", + "tags": ["Cultural experiences", "Food tours", "Historic"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/oaxaca.jpg" + }, + { + "ref": "okavango-delta", + "name": "Okavango Delta", + "country": "Botswana", + "continent": "Africa", + "knownFor": "The Okavango Delta, a vast inland delta in Botswana, is a haven for wildlife. Explore the waterways by mokoro (traditional canoe) and witness elephants, lions, hippos, and an array of bird species in their natural habitat.", + "tags": ["River", "Wildlife watching", "Adventure sports"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/okavango-delta.jpg" + }, + { + "ref": "oman", + "name": "Oman", + "country": "Oman", + "continent": "Asia", + "knownFor": "Oman, a country on the Arabian Peninsula, is a hidden gem with dramatic landscapes, ancient forts, and warm hospitality. Explore the vast deserts, swim in turquoise wadis, and hike through rugged mountains. Visit traditional souks, experience Bedouin culture, and discover the unique blend of modernity and tradition in this captivating destination.", + "tags": ["Desert", "Secluded", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/oman.jpg" + }, + { + "ref": "pagos-islands", + "name": "Galápagos Islands", + "country": "Ecuador", + "continent": "South America", + "knownFor": "A unique archipelago off the coast of Ecuador, the Galápagos Islands is a haven for wildlife enthusiasts. Encounter giant tortoises, marine iguanas, blue-footed boobies, and sea lions in their natural habitat. Snorkeling and diving opportunities reveal a vibrant underwater world.", + "tags": ["Island", "Wildlife watching", "Snorkeling"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/pagos-islands.jpg" + }, + { + "ref": "patagonia", + "name": "Patagonia", + "country": "Argentina and Chile", + "continent": "South America", + "knownFor": "Patagonia is a vast region at the southern tip of South America, known for its glaciers, mountains, and diverse wildlife. Visitors can embark on trekking adventures, witness the Perito Moreno Glacier, go kayaking, and spot penguins, whales, and other animals.", + "tags": ["Hiking", "Adventure sports", "Wildlife watching"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/patagonia.jpg" + }, + { + "ref": "peru", + "name": "Arequipa", + "country": "Peru", + "continent": "South America", + "knownFor": "Arequipa, known as the \"White City\" due to its buildings made of white volcanic stone, is a beautiful colonial city in southern Peru. Visitors can explore the historic center, visit the Santa Catalina Monastery, and enjoy stunning views of the surrounding volcanoes. Arequipa is also a gateway to the Colca Canyon, one of the deepest canyons in the world.", + "tags": ["City", "Historic", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/peru.jpg" + }, + { + "ref": "peruvian-amazon", + "name": "Peruvian Amazon", + "country": "Peru", + "continent": "South America", + "knownFor": "Venture into the heart of the Amazon rainforest, a biodiversity hotspot teeming with exotic wildlife and indigenous cultures. Embark on jungle treks, navigate the Amazon River, and spot unique flora and fauna. Experience the thrill of adventure travel and connect with nature in its purest form.", + "tags": ["Jungle", "Adventure sports", "Wildlife watching"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/peruvian-amazon.jpg" + }, + { + "ref": "phnom-penh", + "name": "Phnom Penh", + "country": "Cambodia", + "continent": "Asia", + "knownFor": "Immerse yourself in the vibrant culture and rich history of Phnom Penh, Cambodia's bustling capital. Visit the Royal Palace, explore ancient temples like Wat Phnom, and delve into the poignant history at the Tuol Sleng Genocide Museum. Experience the city's energetic nightlife and savor delicious Khmer cuisine.", + "tags": ["City", "Historic", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/phnom-penh.jpg" + }, + { + "ref": "phuket", + "name": "Phuket", + "country": "Thailand", + "continent": "Asia", + "knownFor": "Relax on the stunning beaches of Phuket, Thailand's largest island. Explore the turquoise waters of the Andaman Sea, go snorkeling or scuba diving among coral reefs, or visit nearby islands like Phi Phi. Enjoy the vibrant nightlife, indulge in Thai massages, and experience the local culture. Phuket offers a perfect blend of relaxation and adventure for beach lovers and those seeking a tropical escape.", + "tags": ["Beach", "Island", "Snorkeling"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/phuket.jpg" + }, + { + "ref": "positano", + "name": "Positano", + "country": "Italy", + "continent": "Europe", + "knownFor": "Nestled along the Amalfi Coast, Positano enchants with its colorful cliffside houses, pebble beaches, and luxury boutiques. Explore the narrow streets, indulge in delicious Italian cuisine, and soak up the romantic atmosphere.", + "tags": ["Beach", "Romantic", "Luxury"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/positano.jpg" + }, + { + "ref": "prague", + "name": "Prague", + "country": "Czech Republic", + "continent": "Europe", + "knownFor": "Prague, with its stunning architecture and rich history, is a fairytale city. Explore the Prague Castle, wander through the Old Town Square, and enjoy a traditional Czech meal. The city's charming atmosphere and affordable prices make it a popular destination.", + "tags": ["City", "Historic", "Sightseeing"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/prague.jpg" + }, + { + "ref": "puerto-rico", + "name": "Puerto Rico", + "country": "United States", + "continent": "North America", + "knownFor": "Puerto Rico is a Caribbean island with a rich history, vibrant culture, and stunning natural beauty. Explore the historic forts of Old San Juan, relax on the beaches of Vieques, or hike in El Yunque National Forest. Experience the bioluminescent bays, go salsa dancing, and enjoy the local cuisine.", + "tags": ["Island", "Beach", "Historic"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/puerto-rico.jpg" + }, + { + "ref": "punta-cana", + "name": "Punta Cana", + "country": "Dominican Republic", + "continent": "North America", + "knownFor": "Punta Cana is a renowned beach destination with pristine white sand, crystal-clear waters, and luxurious resorts. Enjoy water sports, golf, or simply unwind by the ocean and experience the vibrant Dominican culture.", + "tags": ["Beach", "All-inclusive", "Family-friendly"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/punta-cana.jpg" + }, + { + "ref": "quebec-city", + "name": "Quebec City", + "country": "Canada", + "continent": "North America", + "knownFor": "Experience the European charm of Quebec City, a UNESCO World Heritage Site. Wander through the historic Old Town with its cobblestone streets and fortified walls, visit the iconic Chateau Frontenac, and admire the stunning views of the St. Lawrence River. Quebec City offers a unique blend of history, culture, and French Canadian charm for a memorable getaway.", + "tags": ["City", "Historic", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/quebec-city.jpg" + }, + { + "ref": "queenstown", + "name": "Queenstown", + "country": "New Zealand", + "continent": "Oceania", + "knownFor": "Experience the adventure capital of the world in Queenstown, New Zealand. Surrounded by stunning mountains and Lake Wakatipu, this town offers everything from bungy jumping and skydiving to skiing and hiking.", + "tags": ["Adventure sports", "Lake", "Mountain"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/queenstown.jpg" + }, + { + "ref": "rajasthan", + "name": "Rajasthan", + "country": "India", + "continent": "Asia", + "knownFor": "Rajasthan, a state in northwestern India, is known for its opulent palaces, vibrant culture, and desert landscapes. Visitors can explore the cities of Jaipur, Jodhpur, and Udaipur, with their magnificent forts and palaces. The region also offers camel safaris, desert camping, and opportunities to experience traditional Rajasthani music and dance.", + "tags": ["Historic", "Desert", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/rajasthan.jpg" + }, + { + "ref": "reunion-island", + "name": "Réunion Island", + "country": "France", + "continent": "Africa", + "knownFor": "This volcanic island boasts dramatic landscapes, including Piton de la Fournaise, one of the world's most active volcanoes. Hike through lush rainforests, relax on black sand beaches, and experience the unique Creole culture.", + "tags": ["Secluded", "Hiking", "Tropical"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/reunion-island.jpg" + }, + { + "ref": "rio-de-janeiro", + "name": "Rio de Janeiro", + "country": "Brazil", + "continent": "South America", + "knownFor": "Rio de Janeiro is a vibrant city known for its stunning beaches, iconic landmarks like Christ the Redeemer and Sugarloaf Mountain, and lively Carnival celebrations. Visitors can enjoy sunbathing, surfing, and exploring the city's diverse neighborhoods, experiencing the infectious energy and cultural richness of Brazil.", + "tags": ["City", "Beach", "Party"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/rio-de-janeiro.jpg" + }, + { + "ref": "salar-de-uyuni", + "name": "Salar de Uyuni", + "country": "Bolivia", + "continent": "South America", + "knownFor": "Witness the surreal beauty of the world's largest salt flats, a mesmerizing landscape that transforms into a giant mirror during the rainy season. Capture incredible photos, explore unique rock formations, and visit nearby lagoons teeming with flamingos.", + "tags": ["Desert", "Off-the-beaten-path", "Photography"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/salar-de-uyuni.jpg" + }, + { + "ref": "san-diego", + "name": "San Diego", + "country": "United States", + "continent": "North America", + "knownFor": "San Diego, a sunny coastal city in Southern California, boasts beautiful beaches, a world-famous zoo, and a vibrant cultural scene. Explore Balboa Park, visit the historic Gaslamp Quarter, and enjoy water sports along the Pacific coast.", + "tags": ["City", "Beach", "Family-friendly"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/san-diego.jpg" + }, + { + "ref": "san-miguel-de-allende", + "name": "San Miguel de Allende", + "country": "Mexico", + "continent": "North America", + "knownFor": "This colonial city in central Mexico is a UNESCO World Heritage site with stunning Spanish architecture, vibrant cultural events, and a thriving arts scene. Visitors can explore historic churches, wander through cobbled streets lined with colorful houses, and enjoy delicious Mexican cuisine. San Miguel de Allende is also a popular destination for art classes and workshops.", + "tags": ["City", "Historic", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/san-miguel-de-allende.jpg" + }, + { + "ref": "san-sebastian", + "name": "San Sebastian", + "country": "Spain", + "continent": "Europe", + "knownFor": "Indulge in the culinary delights of this coastal paradise, renowned for its Michelin-starred restaurants and pintxos bars. Relax on the beautiful beaches, explore the charming Old Town, and hike or bike in the surrounding hills. Experience the vibrant culture and lively festivals of the Basque region.", + "tags": ["Beach", "City", "Foodie"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/san-sebastian.jpg" + }, + { + "ref": "santorini", + "name": "Santorini", + "country": "Greece", + "continent": "Europe", + "knownFor": "Santorini's iconic whitewashed villages perched on volcanic cliffs offer breathtaking views of the Aegean Sea. Explore charming Oia, visit ancient Akrotiri, and enjoy romantic sunsets with caldera views.", + "tags": ["Island", "Romantic", "Luxury"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/santorini.jpg" + }, + { + "ref": "sardinia", + "name": "Sardinia", + "country": "Italy", + "continent": "Europe", + "knownFor": "Experience the allure of Sardinia, a Mediterranean island boasting stunning coastlines, turquoise waters, and rugged mountains. Explore charming villages, ancient ruins, and secluded coves. Indulge in delicious Sardinian cuisine, hike scenic trails, and discover the island's rich history and culture.", + "tags": ["Island", "Beach", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/sardinia.jpg" + }, + { + "ref": "scotland", + "name": "Scotland", + "country": "United Kingdom", + "continent": "Europe", + "knownFor": "Scotland is known for its dramatic landscapes, historic castles, and vibrant cities. Explore the Scottish Highlands, visit Edinburgh Castle, and sample Scotch whisky. The country's rich history and culture, along with its friendly people, make it a captivating destination.", + "tags": ["Mountain", "Historic", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/scotland.jpg" + }, + { + "ref": "scottish-highlands", + "name": "Scottish Highlands", + "country": "Scotland", + "continent": "Europe", + "knownFor": "The Scottish Highlands, a mountainous region in northern Scotland, is renowned for its rugged beauty, ancient castles, and rich history. Visitors can explore the dramatic landscapes through hiking, climbing, and scenic drives, or visit historic sites like Loch Ness and Eilean Donan Castle. The region is also famous for its whisky distilleries and traditional Highland culture.", + "tags": ["Mountain", "Historic", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/scottish-highlands.jpg" + }, + { + "ref": "seoul", + "name": "Seoul", + "country": "South Korea", + "continent": "Asia", + "knownFor": "Seoul is a vibrant metropolis blending modern skyscrapers with ancient palaces and temples. Visitors can explore historical landmarks, experience K-pop culture, indulge in delicious Korean cuisine, and enjoy the city's bustling nightlife.", + "tags": ["City", "Cultural experiences", "Nightlife"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/seoul.jpg" + }, + { + "ref": "serengeti-national-park", + "name": "Serengeti National Park", + "country": "Tanzania", + "continent": "Africa", + "knownFor": "Serengeti National Park is renowned for its incredible wildlife and the annual Great Migration, where millions of wildebeest, zebras, and other animals traverse the plains in search of fresh grazing. Visitors can embark on thrilling safari adventures, witness predator-prey interactions, and marvel at the diversity of the African savanna.", + "tags": ["Wildlife watching", "Safari", "Adventure"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/serengeti-national-park.jpg" + }, + { + "ref": "seville", + "name": "Seville", + "country": "Spain", + "continent": "Europe", + "knownFor": "Seville, the vibrant capital of Andalusia, is renowned for its flamenco dancing, Moorish architecture, and lively tapas bars. Explore the stunning Alcázar palace, witness a passionate flamenco performance, and wander through the charming Santa Cruz district.", + "tags": ["City", "Cultural experiences", "Food tours"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/seville.jpg" + }, + { + "ref": "singapore", + "name": "Singapore", + "country": "Singapore", + "continent": "Asia", + "knownFor": "Experience a vibrant mix of cultures, cutting-edge architecture, and lush green spaces in this dynamic city-state. Discover futuristic Gardens by the Bay, indulge in diverse culinary delights, and explore world-class shopping and entertainment options.", + "tags": ["City", "Cultural experiences", "Foodie"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/singapore.jpg" + }, + { + "ref": "slovenia", + "name": "Slovenia", + "country": "Slovenia", + "continent": "Europe", + "knownFor": "Slovenia is a small country in Central Europe with stunning alpine scenery, charming towns, and a rich history. Visit Lake Bled, a picturesque lake with a church on an island, explore the Postojna Cave, or hike in Triglav National Park. Discover the capital city of Ljubljana, enjoy the local wines, and experience the Slovenian hospitality.", + "tags": ["Lake", "Mountain", "City"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/slovenia.jpg" + }, + { + "ref": "sri-lanka", + "name": "Sri Lanka", + "country": "Sri Lanka", + "continent": "Asia", + "knownFor": "Sri Lanka is an island nation off the southern coast of India, known for its ancient ruins, beautiful beaches, and diverse wildlife. Visit the Sigiriya rock fortress, relax on the beaches of Bentota, or go on a safari in Yala National Park. Explore the tea plantations, experience the local culture, and enjoy the delicious Sri Lankan cuisine.", + "tags": ["Island", "Beach", "Wildlife watching"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/sri-lanka.jpg" + }, + { + "ref": "svalbard", + "name": "Svalbard", + "country": "Norway", + "continent": "Europe", + "knownFor": "Svalbard, an Arctic archipelago under Norwegian sovereignty, is a remote and captivating destination for adventurers and nature enthusiasts. Witness glaciers, fjords, and ice-covered landscapes. Spot polar bears, walruses, and reindeer, and experience the midnight sun or the northern lights. Svalbard offers a unique opportunity to explore the Arctic wilderness.", + "tags": ["Off-the-beaten-path", "Wildlife watching", "Winter destination"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/svalbard.jpg" + }, + { + "ref": "swiss-alps", + "name": "Swiss Alps", + "country": "Switzerland", + "continent": "Europe", + "knownFor": "Discover the breathtaking beauty of the Swiss Alps, a paradise for outdoor enthusiasts. Hike through scenic mountain trails, go skiing or snowboarding in world-class resorts, or take a scenic train ride through the mountains. Enjoy the fresh air, charming villages, and stunning scenery. The Swiss Alps offer an unforgettable experience for nature lovers and adventure seekers.", + "tags": ["Mountain", "Hiking", "Skiing"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/swiss-alps.jpg" + }, + { + "ref": "tasmania", + "name": "Tasmania", + "country": "Australia", + "continent": "Oceania", + "knownFor": "Discover the wild beauty of Tasmania, an island state off the coast of Australia. Explore Cradle Mountain-Lake St Clair National Park, with its rugged mountains and pristine lakes. Visit Port Arthur Historic Site, a former penal colony, or encounter unique wildlife like Tasmanian devils and quolls.", + "tags": ["Island", "Hiking", "Wildlife watching"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/tasmania.jpg" + }, + { + "ref": "tel-aviv", + "name": "Tel Aviv", + "country": "Israel", + "continent": "Asia", + "knownFor": "Experience the vibrant and cosmopolitan city of Tel Aviv, known for its beaches, Bauhaus architecture, and thriving nightlife. Relax on the sandy shores of the Mediterranean Sea, explore the trendy neighborhoods of Neve Tzedek and Florentin, and enjoy the city's diverse culinary scene. Tel Aviv offers a perfect blend of beach relaxation, cultural experiences, and exciting nightlife.", + "tags": ["City", "Beach", "Nightlife"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/tel-aviv.jpg" + }, + { + "ref": "trans-siberian-railway", + "name": "Trans-Siberian Railway", + "country": "Russia", + "continent": "Asia", + "knownFor": "The Trans-Siberian Railway is the longest railway line in the world, stretching over 9,000 kilometers from Moscow to Vladivostok. This epic journey offers travelers a unique opportunity to experience the vastness and diversity of Russia, passing through bustling cities, remote villages, and stunning natural landscapes.", + "tags": ["Adventure sports", "Cultural experiences", "Long-haul vacation"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/trans-siberian-railway.jpg" + }, + { + "ref": "transylvania", + "name": "Transylvania", + "country": "Romania", + "continent": "Europe", + "knownFor": "Transylvania, a region in Romania, is famous for its medieval towns, fortified churches, and stunning Carpathian Mountain scenery. Visitors can explore Bran Castle, associated with the Dracula legend, visit historic cities like Brasov and Sibiu, and hike or ski in the mountains. The region also offers opportunities to experience traditional Romanian culture and cuisine.", + "tags": ["Historic", "Mountain", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/transylvania.jpg" + }, + { + "ref": "tulum", + "name": "Tulum", + "country": "Mexico", + "continent": "North America", + "knownFor": "Tulum seamlessly blends ancient Mayan history with modern bohemian vibes. Visitors can explore the Tulum Archaeological Site, perched on cliffs overlooking the Caribbean Sea, and discover well-preserved ruins. Pristine beaches offer relaxation and water activities, while the town's eco-chic atmosphere provides yoga retreats, wellness centers, and sustainable dining options.", + "tags": ["Beach", "Cultural experiences", "Wellness retreats"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/tulum.jpg" + }, + { + "ref": "turkish-riviera", + "name": "Turkish Riviera", + "country": "Turkey", + "continent": "Asia", + "knownFor": "The Turkish Riviera offers a mix of ancient ruins, stunning beaches, and turquoise waters. Explore the historical sites of Ephesus and Antalya, relax on the sandy shores, and enjoy water sports like sailing and snorkeling. The region's delicious cuisine and affordable prices add to its appeal.", + "tags": ["Beach", "Historic", "Sightseeing"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/turkish-riviera.jpg" + }, + { + "ref": "tuscany", + "name": "Tuscany", + "country": "Italy", + "continent": "Europe", + "knownFor": "Explore the rolling hills and vineyards of Tuscany, indulging in wine tastings and farm-to-table cuisine. Discover charming medieval towns, Renaissance art, and historic cities like Florence and Siena. Immerse yourself in the region's rich culture and art scene, or simply relax and soak up the idyllic scenery.", + "tags": ["Cultural experiences", "Food tours", "Wine tasting"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/tuscany.jpg" + }, + { + "ref": "us-virgin-islands", + "name": "US Virgin Islands", + "country": "United States", + "continent": "North America", + "knownFor": "Escape to the Caribbean paradise of the US Virgin Islands, where you can relax on pristine beaches, explore coral reefs, and experience the laid-back island lifestyle. Visit the historic towns of Charlotte Amalie and Christiansted, go sailing or snorkeling in crystal-clear waters, or simply soak up the sun. The US Virgin Islands offer a perfect tropical getaway for beach lovers and those seeking a relaxing escape.", + "tags": ["Island", "Beach", "Relaxing"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/us-virgin-islands.jpg" + }, + { + "ref": "vancouver-island", + "name": "Vancouver Island", + "country": "Canada", + "continent": "North America", + "knownFor": "Vancouver Island, located off Canada's Pacific coast, is a haven for nature lovers and adventure seekers. Explore the rugged coastline, ancient rainforests, and snow-capped mountains. Go whale watching, kayaking, or surfing, and discover charming towns and vibrant cities like Victoria. Vancouver Island offers a perfect blend of wilderness and urban experiences.", + "tags": ["Island", "Adventure sports", "Wildlife watching"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/vancouver-island.jpg" + }, + { + "ref": "vienna", + "name": "Vienna", + "country": "Austria", + "continent": "Europe", + "knownFor": "Step into the imperial city of Vienna, where grand palaces, historical landmarks, and elegant cafes exude charm and sophistication. Explore museums, art galleries, and renowned opera houses, or visit Schönbrunn Palace and delve into Habsburg history. Enjoy classical music concerts, indulge in Viennese pastries, and experience the city's rich cultural heritage.", + "tags": ["City", "Historic", "Cultural experiences"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/vienna.jpg" + }, + { + "ref": "vietnam", + "name": "Vietnam", + "country": "Vietnam", + "continent": "Asia", + "knownFor": "Vietnam offers a rich tapestry of culture, history, and natural beauty. Explore the bustling streets of Hanoi, cruise through the scenic Ha Long Bay, and discover the ancient town of Hoi An. From delicious street food to stunning landscapes, Vietnam is a destination that will captivate your senses.", + "tags": ["Cultural experiences", "Food tours", "Sightseeing"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/vietnam.jpg" + }, + { + "ref": "western-australia", + "name": "Western Australia", + "country": "Australia", + "continent": "Australia", + "knownFor": "Western Australia, the largest state in Australia, is a land of vast landscapes, stunning coastlines, and unique wildlife. Explore the vibrant city of Perth, swim with whale sharks at Ningaloo Reef, and discover the ancient rock formations of the Kimberley region. From wineries to deserts, Western Australia offers a diverse and unforgettable experience.", + "tags": ["Beach", "Road trip destination", "Wildlife watching"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/western-australia.jpg" + }, + { + "ref": "yellowstone-national-park", + "name": "Yellowstone National Park", + "country": "United States", + "continent": "North America", + "knownFor": "Witness the geothermal wonders of Yellowstone, with its geysers, hot springs, and mudpots. Observe abundant wildlife, including bison, elk, and wolves. Explore the Grand Canyon of the Yellowstone, go hiking or camping, and enjoy winter sports.", + "tags": ["National Park", "Wildlife watching", "Hiking"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/yellowstone-national-park.jpg" + }, + { + "ref": "yosemite-national-park", + "name": "Yosemite National Park", + "country": "United States", + "continent": "North America", + "knownFor": "Yosemite National Park, located in California's Sierra Nevada mountains, is renowned for its towering granite cliffs, giant sequoia trees, and stunning waterfalls. Visitors can enjoy hiking, camping, rock climbing, and exploring the park's natural wonders, including Yosemite Valley, Half Dome, and Glacier Point.", + "tags": ["Mountain", "Hiking", "Sightseeing"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/yosemite-national-park.jpg" + }, + { + "ref": "yucatan-peninsula", + "name": "Yucatan Peninsula", + "country": "Mexico", + "continent": "North America", + "knownFor": "Discover ancient Mayan ruins, explore vibrant coral reefs, and relax on pristine beaches in the Yucatan Peninsula. Dive into cenotes, swim with whale sharks, and experience the rich culture and history of this captivating region.", + "tags": ["Beach", "Historic", "Scuba diving"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/yucatan-peninsula.jpg" + }, + { + "ref": "zanzibar", + "name": "Zanzibar", + "country": "Tanzania", + "continent": "Africa", + "knownFor": "Zanzibar is a Tanzanian archipelago off the coast of East Africa, known for its stunning beaches, turquoise waters, and historical Stone Town. Visitors can relax on the beach, explore the UNESCO-listed Stone Town, go diving or snorkeling, and experience the island's unique blend of African, Arab, and European influences.", + "tags": ["Beach", "Cultural experiences", "Scuba diving"], + "imageUrl": "https://storage.googleapis.com/tripedia-images/destinations/zanzibar.jpg" + } +] diff --git a/compass_app/app/assets/logo.svg b/compass_app/app/assets/logo.svg new file mode 100644 index 000000000..1bf798e05 --- /dev/null +++ b/compass_app/app/assets/logo.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/compass_app/app/assets/user.jpg b/compass_app/app/assets/user.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1e79068e14c12a7f8a286084b66bdde683e5d91d GIT binary patch literal 41922 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 literal 0 HcmV?d00001 diff --git a/compass_app/app/devtools_options.yaml b/compass_app/app/devtools_options.yaml new file mode 100644 index 000000000..fa0b357c4 --- /dev/null +++ b/compass_app/app/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/compass_app/app/integration_test/app_local_data_test.dart b/compass_app/app/integration_test/app_local_data_test.dart new file mode 100644 index 000000000..3a8090e6a --- /dev/null +++ b/compass_app/app/integration_test/app_local_data_test.dart @@ -0,0 +1,145 @@ +import 'package:compass_app/config/dependencies.dart'; +import 'package:compass_app/main.dart'; +import 'package:compass_app/ui/activities/widgets/activities_screen.dart'; +import 'package:compass_app/ui/booking/widgets/booking_screen.dart'; +import 'package:compass_app/ui/core/ui/custom_checkbox.dart'; +import 'package:compass_app/ui/core/ui/home_button.dart'; +import 'package:compass_app/ui/home/widgets/home_screen.dart'; +import 'package:compass_app/ui/results/widgets/result_card.dart'; +import 'package:compass_app/ui/results/widgets/results_screen.dart'; +import 'package:compass_app/ui/search_form/widgets/search_form_guests.dart'; +import 'package:compass_app/ui/search_form/widgets/search_form_screen.dart'; +import 'package:compass_app/ui/search_form/widgets/search_form_submit.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; +import 'package:provider/provider.dart'; + +/// This Integration Test launches the Compass-App with the local configuration. +/// The app uses data from the assets folder to create a booking. +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + group('end-to-end test with local data', () { + testWidgets('should load app', (tester) async { + // Load app widget. + await tester.pumpWidget( + MultiProvider( + providers: providersLocal, + child: const MainApp(), + ), + ); + }); + + testWidgets('Open a booking', (tester) async { + // Load app widget with local configuration + await tester.pumpWidget( + MultiProvider( + providers: providersLocal, + child: const MainApp(), + ), + ); + + await tester.pumpAndSettle(); + + // Home screen + expect(find.byType(HomeScreen), findsOneWidget); + await tester.pumpAndSettle(); + + // Should show user name + expect(find.text('Sofie\'s Trips'), findsOneWidget); + + // Tap on booking (Alaska is created by default) + await tester.tap(find.text('Alaska, North America')); + await tester.pumpAndSettle(); + + // Should be at booking screen + expect(find.byType(BookingScreen), findsOneWidget); + expect(find.text('Alaska'), findsOneWidget); + }); + + testWidgets('Create booking', (tester) async { + // Load app widget with local configuration + await tester.pumpWidget( + MultiProvider( + providers: providersLocal, + child: const MainApp(), + ), + ); + await tester.pumpAndSettle(); + + // Home screen + expect(find.byType(HomeScreen), findsOneWidget); + await tester.pumpAndSettle(); + + // Select create new booking + await tester.tap(find.byKey(const ValueKey(bookingButtonKey))); + await tester.pumpAndSettle(); + + // Search destinations screen + expect(find.byType(SearchFormScreen), findsOneWidget); + + // Select Europe because it is always the first result + await tester.tap(find.text('Europe'), warnIfMissed: false); + + // Select dates + await tester.tap(find.text('Add Dates')); + await tester.pumpAndSettle(); + final tomorrow = DateTime.now().add(const Duration(days: 1)).day; + final nextDay = DateTime.now().add(const Duration(days: 2)).day; + // Select first and last widget that matches today number + //and tomorrow number, sort of ensures a valid range + await tester.tap(find.text(tomorrow.toString()).first); + await tester.pumpAndSettle(); + await tester.tap(find.text(nextDay.toString()).first); + await tester.pumpAndSettle(); + await tester.tap(find.text('Save')); + await tester.pumpAndSettle(); + + // Select guests + await tester.tap(find.byKey(const ValueKey(addGuestsKey)), + warnIfMissed: false); + + // Refresh screen state + await tester.pumpAndSettle(); + + // Perform search and navigate to next screen + await tester.tap(find.byKey(const ValueKey(searchFormSubmitButtonKey))); + await tester.pumpAndSettle(); + + // Results Screen + expect(find.byType(ResultsScreen), findsOneWidget); + + // Amalfi Coast should be the first result for Europe + // Tap and navigate to activities screen + await tester.tap(find.byType(ResultCard).first); + await tester.pumpAndSettle(); + + // Activities Screen + expect(find.byType(ActivitiesScreen), findsOneWidget); + + // Select one activity + await tester.tap(find.byType(CustomCheckbox).first); + await tester.pumpAndSettle(); + expect(find.text('1 selected'), findsOneWidget); + + // Submit selection + await tester.tap(find.byKey(const ValueKey(confirmButtonKey))); + await tester.pumpAndSettle(); + + // Should be at booking screen + expect(find.byType(BookingScreen), findsOneWidget); + expect(find.text('Amalfi Coast'), findsOneWidget); + + // Navigate back home + await tester.tap(find.byType(HomeButton)); + await tester.pumpAndSettle(); + + // Home screen + expect(find.byType(HomeScreen), findsOneWidget); + + // New Booking should appear + expect(find.text('Amalfi Coast, Europe'), findsOneWidget); + }); + }); +} diff --git a/compass_app/app/integration_test/app_server_data_test.dart b/compass_app/app/integration_test/app_server_data_test.dart new file mode 100644 index 000000000..d23d52874 --- /dev/null +++ b/compass_app/app/integration_test/app_server_data_test.dart @@ -0,0 +1,208 @@ +import 'dart:io'; + +import 'package:compass_app/config/dependencies.dart'; +import 'package:compass_app/main.dart'; +import 'package:compass_app/ui/activities/widgets/activities_screen.dart'; +import 'package:compass_app/ui/auth/login/widgets/login_screen.dart'; +import 'package:compass_app/ui/auth/logout/widgets/logout_button.dart'; +import 'package:compass_app/ui/booking/widgets/booking_screen.dart'; +import 'package:compass_app/ui/core/ui/custom_checkbox.dart'; +import 'package:compass_app/ui/core/ui/home_button.dart'; +import 'package:compass_app/ui/home/widgets/home_screen.dart'; +import 'package:compass_app/ui/results/widgets/result_card.dart'; +import 'package:compass_app/ui/results/widgets/results_screen.dart'; +import 'package:compass_app/ui/search_form/widgets/search_form_screen.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +/// This Integration Test starts the Dart server +/// before launching the Compass-App with the remote configuration. +/// The app connects to its endpoints to perform login and create a booking. +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + group('end-to-end test with remote data', () { + const port = '8080'; + late Process p; + + setUpAll(() async { + // Clear any stored shared preferences + final sharedPreferences = await SharedPreferences.getInstance(); + await sharedPreferences.clear(); + + // Start the dart server + p = await Process.start( + 'dart', + ['run', 'bin/compass_server.dart'], + environment: {'PORT': port}, + // Relative to the app/ folder + workingDirectory: '../server', + ); + // Wait for server to start and print to stdout. + await p.stdout.first; + }); + + tearDownAll(() => p.kill()); + + testWidgets('should load app', (tester) async { + // Load app widget. + await tester.pumpWidget( + MultiProvider( + providers: providersRemote, + child: const MainApp(), + ), + ); + + await tester.pumpAndSettle(); + + // Login screen because logget out + expect(find.byType(LoginScreen), findsOneWidget); + }); + + testWidgets('Open a booking', (tester) async { + // Load app widget with local configuration + await tester.pumpWidget( + MultiProvider( + providers: providersRemote, + child: const MainApp(), + ), + ); + + await tester.pumpAndSettle(); + + // Login screen because logget out + expect(find.byType(LoginScreen), findsOneWidget); + + // Perform login (credentials are prefilled) + await tester.tap(find.text('Login')); + await tester.pumpAndSettle(); + + // Home screen + expect(find.byType(HomeScreen), findsOneWidget); + await tester.pumpAndSettle(); + + // Should show user name + expect(find.text('Sofie\'s Trips'), findsOneWidget); + + // Tap on booking (Alaska is created by default) + await tester.tap(find.text('Alaska, North America')); + await tester.pumpAndSettle(); + + // Should be at booking screen + expect(find.byType(BookingScreen), findsOneWidget); + expect(find.text('Alaska'), findsOneWidget); + + // Navigate back to home + await tester.tap(find.byType(HomeButton).first); + await tester.pumpAndSettle(); + + // Home screen + expect(find.byType(HomeScreen), findsOneWidget); + + // Perform logout + await tester.tap(find.byType(LogoutButton).first); + await tester.pumpAndSettle(); + expect(find.byType(LoginScreen), findsOneWidget); + }); + + testWidgets('Create booking', (tester) async { + // Load app widget with local configuration + await tester.pumpWidget( + MultiProvider( + providers: providersRemote, + child: const MainApp(), + ), + ); + + await tester.pumpAndSettle(); + + // Login screen because logget out + expect(find.byType(LoginScreen), findsOneWidget); + + // Perform login (credentials are prefilled) + await tester.tap(find.text('Login')); + await tester.pumpAndSettle(); + + // Home screen + expect(find.byType(HomeScreen), findsOneWidget); + await tester.pumpAndSettle(); + + // Select create new booking + await tester.tap(find.byKey(const ValueKey('booking-button'))); + await tester.pumpAndSettle(); + + // Search destinations screen + expect(find.byType(SearchFormScreen), findsOneWidget); + + // Select Europe because it is always the first result + await tester.tap(find.text('Europe'), warnIfMissed: false); + + // Select dates + await tester.tap(find.text('Add Dates')); + await tester.pumpAndSettle(); + final tomorrow = DateTime.now().add(const Duration(days: 1)).day; + final nextDay = DateTime.now().add(const Duration(days: 2)).day; + // Select first and last widget that matches today number + //and tomorrow number, sort of ensures a valid range + await tester.tap(find.text(tomorrow.toString()).first); + await tester.pumpAndSettle(); + await tester.tap(find.text(nextDay.toString()).first); + await tester.pumpAndSettle(); + await tester.tap(find.text('Save')); + await tester.pumpAndSettle(); + + // Select guests + await tester.tap(find.byKey(const ValueKey('add_guests')), + warnIfMissed: false); + + // Refresh screen state + await tester.pumpAndSettle(); + + // Perform search and navigate to next screen + await tester.tap(find.byKey(const ValueKey('submit_button'))); + await tester.pumpAndSettle(); + + // Results Screen + expect(find.byType(ResultsScreen), findsOneWidget); + + // Amalfi Coast should be the first result for Europe + // Tap and navigate to activities screen + await tester.tap(find.byType(ResultCard).first); + await tester.pumpAndSettle(); + + // Activities Screen + expect(find.byType(ActivitiesScreen), findsOneWidget); + + // Select one activity + await tester.tap(find.byType(CustomCheckbox).first); + await tester.pumpAndSettle(); + expect(find.text('1 selected'), findsOneWidget); + + // Submit selection + await tester.tap(find.byKey(const ValueKey('confirm-button'))); + await tester.pumpAndSettle(); + + // Should be at booking screen + expect(find.byType(BookingScreen), findsOneWidget); + expect(find.text('Amalfi Coast'), findsOneWidget); + + // Navigate back to home + await tester.tap(find.byType(HomeButton).first); + await tester.pumpAndSettle(); + + // Home screen + expect(find.byType(HomeScreen), findsOneWidget); + + // New Booking should appear + expect(find.text('Amalfi Coast, Europe'), findsOneWidget); + + // Perform logout + await tester.tap(find.byType(LogoutButton).first); + await tester.pumpAndSettle(); + expect(find.byType(LoginScreen), findsOneWidget); + }); + }); +} diff --git a/compass_app/app/ios/.gitignore b/compass_app/app/ios/.gitignore new file mode 100644 index 000000000..7a7f9873a --- /dev/null +++ b/compass_app/app/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/compass_app/app/ios/Flutter/AppFrameworkInfo.plist b/compass_app/app/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 000000000..7c5696400 --- /dev/null +++ b/compass_app/app/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/compass_app/app/ios/Flutter/Debug.xcconfig b/compass_app/app/ios/Flutter/Debug.xcconfig new file mode 100644 index 000000000..ec97fc6f3 --- /dev/null +++ b/compass_app/app/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/compass_app/app/ios/Flutter/Release.xcconfig b/compass_app/app/ios/Flutter/Release.xcconfig new file mode 100644 index 000000000..c4855bfe2 --- /dev/null +++ b/compass_app/app/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/compass_app/app/ios/Podfile b/compass_app/app/ios/Podfile new file mode 100644 index 000000000..d97f17e22 --- /dev/null +++ b/compass_app/app/ios/Podfile @@ -0,0 +1,44 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '12.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/compass_app/app/ios/Runner.xcodeproj/project.pbxproj b/compass_app/app/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000..9a72577f6 --- /dev/null +++ b/compass_app/app/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,616 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.compassApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.compassApp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.compassApp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.compassApp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.compassApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.compassApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/compass_app/app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/compass_app/app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/compass_app/app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/compass_app/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/compass_app/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/compass_app/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/compass_app/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/compass_app/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/compass_app/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/compass_app/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/compass_app/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000..8e3ca5dfe --- /dev/null +++ b/compass_app/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/compass_app/app/ios/Runner.xcworkspace/contents.xcworkspacedata b/compass_app/app/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..1d526a16e --- /dev/null +++ b/compass_app/app/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/compass_app/app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/compass_app/app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/compass_app/app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/compass_app/app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/compass_app/app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/compass_app/app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/compass_app/app/ios/Runner/AppDelegate.swift b/compass_app/app/ios/Runner/AppDelegate.swift new file mode 100644 index 000000000..9074fee92 --- /dev/null +++ b/compass_app/app/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Flutter +import UIKit + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..d36b1fab2 --- /dev/null +++ b/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..797d452e458972bab9d994556c8305db4c827017 GIT binary patch literal 406 zcmV;H0crk;P))>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2d933e1120817fe9182483a228007b18ab6ae GIT binary patch literal 450 zcmV;z0X_bSP)iGWQ_5NJQ_~rNh*z)}eT%KUb z`7gNk0#AwF^#0T0?hIa^`~Ck;!}#m+_uT050aTR(J!bU#|IzRL%^UsMS#KsYnTF*!YeDOytlP4VhV?b} z%rz_<=#CPc)tU1MZTq~*2=8~iZ!lSa<{9b@2Jl;?IEV8)=fG217*|@)CCYgFze-x? zIFODUIA>nWKpE+bn~n7;-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGr zXPIdeRE&b2Thd#{MtDK$px*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{Hig)k suLT-RhftRq8b9;(V=235Wa|I=027H2wCDra;{X5v07*qoM6N<$f;9x^2LJ#7 literal 0 HcmV?d00001 diff --git a/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd7b0099ca80c806f8fe495613e8d6c69460d76 GIT binary patch literal 282 zcmV+#0p(^bcu7P-R4C8Q z&e;xxFbF_Vrezo%_kH*OKhshZ6BFpG-Y1e10`QXJKbND7AMQ&cMj60B5TNObaZxYybcN07*qoM6N<$g3m;S%K!iX literal 0 HcmV?d00001 diff --git a/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe730945a01f64a61e2235dbe3f45b08f7729182 GIT binary patch literal 462 zcmV;<0WtoGP)-}iV`2<;=$?g5M=KQbZ{F&YRNy7Nn@%_*5{gvDM0aKI4?ESmw z{NnZg)A0R`+4?NF_RZexyVB&^^ZvN!{I28tr{Vje;QNTz`dG&Jz0~Ek&f2;*Z7>B|cg}xYpxEFY+0YrKLF;^Q+-HreN0P{&i zK~zY`?b7ECf-n?@;d<&orQ*Q7KoR%4|C>{W^h6@&01>0SKS`dn{Q}GT%Qj_{PLZ_& zs`MFI#j-(>?bvdZ!8^xTwlY{qA)T4QLbY@j(!YJ7aXJervHy6HaG_2SB`6CC{He}f zHVw(fJWApwPq!6VY7r1w-Fs)@ox~N+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9 zR%3*Q+)t%S!MU_`id^@&Y{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&)179 zp<)v6Y}pRl100G2FL_t(o!|l{-Q-VMg#&MKg7c{O0 z2wJImOS3Gy*Z2Qifdv~JYOp;v+U)a|nLoc7hNH;I$;lzDt$}rkaFw1mYK5_0Q(Sut zvbEloxON7$+HSOgC9Z8ltuC&0OSF!-mXv5caV>#bc3@hBPX@I$58-z}(ZZE!t-aOG zpjNkbau@>yEzH(5Yj4kZiMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_st8pKG z(%SHyHdU&v%f36~uERh!bd`!T2dw;z6PrOTQ7Vt*#9F2uHlUVnb#ev_o^fh}Dzmq} zWtlk35}k=?xj28uO|5>>$yXadTUE@@IPpgH`gJ~Ro4>jd1IF|(+IX>8M4Ps{PNvmI zNj4D+XgN83gPt_Gm}`Ybv{;+&yu-C(Grdiahmo~BjG-l&mWM+{e5M1sm&=xduwgM9 z`8OEh`=F3r`^E{n_;%9weN{cf2%7=VzC@cYj+lg>+3|D|_1C@{hcU(DyQG_BvBWe? zvTv``=%b1zrol#=R`JB)>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502f463a9bc882b461c96aadf492d1729e49e725 GIT binary patch literal 586 zcmV-Q0=4~#P)+}#`wDE{8-2Mebf5<{{PqV{TgVcv*r8?UZ3{-|G?_}T*&y;@cqf{ z{Q*~+qr%%p!1pS*_Uicl#q9lc(D`!D`LN62sNwq{oYw(Wmhk)k<@f$!$@ng~_5)Ru z0Z)trIA5^j{DIW^c+vT2%lW+2<(RtE2wR;4O@)Tm`Xr*?A(qYoM}7i5Yxw>D(&6ou zxz!_Xr~yNF+waPe00049Nkl*;a!v6h%{rlvIH#gW3s8p;bFr=l}mRqpW2h zw=OA%hdyL~z+UHOzl0eKhEr$YYOL-c-%Y<)=j?(bzDweB7{b+%_ypvm_cG{SvM=DK zhv{K@m>#Bw>2W$eUI#iU)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G! zhkE!s;%oku3;IwG3U^2kw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn`0X*2 zy3(k600_CSZj?O$Qu%&$;|TGUJrptR(HzyIx>5E(2r{eA(<6t3e3I0B)7d6s7?Z5J zZ!rtKvA{MiEBm&KFtoifx>5P^Z=vl)95XJn()aS5%ad(s?4-=Tkis9IGu{`Fy8r+H07*qoM6N<$f20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmV-k1EKthP)20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f5fea27c705180eb716271f41b582e76dcbd90 GIT binary patch literal 1674 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 literal 0 HcmV?d00001 diff --git a/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/compass_app/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8 GIT binary patch literal 1418 zcmV;51$Fv~P)q zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+ zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq z^={4hPQv)y=I|4n+?>7Fim=dxt1 z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf` zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_> z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3 zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62( zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;? zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-< z{s<&cCV_1`^TD^ia9!*mQDq& zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H literal 0 HcmV?d00001 diff --git a/compass_app/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/compass_app/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 000000000..0bedcf2fd --- /dev/null +++ b/compass_app/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/compass_app/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/compass_app/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/compass_app/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/compass_app/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/compass_app/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/compass_app/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/compass_app/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/compass_app/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 000000000..89c2725b7 --- /dev/null +++ b/compass_app/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/compass_app/app/ios/Runner/Base.lproj/LaunchScreen.storyboard b/compass_app/app/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..f2e259c7c --- /dev/null +++ b/compass_app/app/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/compass_app/app/ios/Runner/Base.lproj/Main.storyboard b/compass_app/app/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 000000000..f3c28516f --- /dev/null +++ b/compass_app/app/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/compass_app/app/ios/Runner/Info.plist b/compass_app/app/ios/Runner/Info.plist new file mode 100644 index 000000000..e8a8df16d --- /dev/null +++ b/compass_app/app/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Compass App + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + compass_app + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/compass_app/app/ios/Runner/Runner-Bridging-Header.h b/compass_app/app/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 000000000..308a2a560 --- /dev/null +++ b/compass_app/app/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/compass_app/app/ios/RunnerTests/RunnerTests.swift b/compass_app/app/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 000000000..86a7c3b1b --- /dev/null +++ b/compass_app/app/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/compass_app/app/lib/config/assets.dart b/compass_app/app/lib/config/assets.dart new file mode 100644 index 000000000..b60059e0a --- /dev/null +++ b/compass_app/app/lib/config/assets.dart @@ -0,0 +1,8 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +class Assets { + static const activities = 'assets/activities.json'; + static const destinations = 'assets/destinations.json'; +} diff --git a/compass_app/app/lib/config/dependencies.dart b/compass_app/app/lib/config/dependencies.dart new file mode 100644 index 000000000..42e283477 --- /dev/null +++ b/compass_app/app/lib/config/dependencies.dart @@ -0,0 +1,144 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:provider/single_child_widget.dart'; +import 'package:provider/provider.dart'; + +import '../data/repositories/auth/auth_repository.dart'; +import '../data/repositories/auth/auth_repository_dev.dart'; +import '../data/repositories/auth/auth_repository_remote.dart'; +import '../data/repositories/booking/booking_repository.dart'; +import '../data/repositories/booking/booking_repository_local.dart'; +import '../data/repositories/booking/booking_repository_remote.dart'; +import '../data/repositories/user/user_repository.dart'; +import '../data/repositories/user/user_repository_local.dart'; +import '../data/repositories/user/user_repository_remote.dart'; +import '../data/services/api/auth_api_client.dart'; +import '../data/services/local/local_data_service.dart'; +import '../data/services/shared_preferences_service.dart'; +import '../data/repositories/activity/activity_repository.dart'; +import '../data/repositories/activity/activity_repository_local.dart'; +import '../data/repositories/activity/activity_repository_remote.dart'; +import '../data/repositories/continent/continent_repository.dart'; +import '../data/repositories/continent/continent_repository_local.dart'; +import '../data/repositories/continent/continent_repository_remote.dart'; +import '../data/repositories/destination/destination_repository.dart'; +import '../data/repositories/destination/destination_repository_local.dart'; +import '../data/repositories/destination/destination_repository_remote.dart'; +import '../data/repositories/itinerary_config/itinerary_config_repository.dart'; +import '../data/repositories/itinerary_config/itinerary_config_repository_memory.dart'; +import '../data/services/api/api_client.dart'; +import '../domain/use_cases/booking/booking_create_use_case.dart'; +import '../domain/use_cases/booking/booking_share_use_case.dart'; + +/// Shared providers for all configurations. +List _sharedProviders = [ + Provider( + lazy: true, + create: (context) => BookingCreateUseCase( + destinationRepository: context.read(), + activityRepository: context.read(), + bookingRepository: context.read(), + ), + ), + Provider( + lazy: true, + create: (context) => BookingShareUseCase.withSharePlus(), + ), +]; + +/// Configure dependencies for remote data. +/// This dependency list uses repositories that connect to a remote server. +List get providersRemote { + return [ + Provider( + create: (context) => AuthApiClient(), + ), + Provider( + create: (context) => ApiClient(), + ), + Provider( + create: (context) => SharedPreferencesService(), + ), + ChangeNotifierProvider( + create: (context) => AuthRepositoryRemote( + authApiClient: context.read(), + apiClient: context.read(), + sharedPreferencesService: context.read(), + ) as AuthRepository, + ), + Provider( + create: (context) => DestinationRepositoryRemote( + apiClient: context.read(), + ) as DestinationRepository, + ), + Provider( + create: (context) => ContinentRepositoryRemote( + apiClient: context.read(), + ) as ContinentRepository, + ), + Provider( + create: (context) => ActivityRepositoryRemote( + apiClient: context.read(), + ) as ActivityRepository, + ), + Provider.value( + value: ItineraryConfigRepositoryMemory() as ItineraryConfigRepository, + ), + Provider( + create: (context) => BookingRepositoryRemote( + apiClient: context.read(), + ) as BookingRepository, + ), + Provider( + create: (context) => UserRepositoryRemote( + apiClient: context.read(), + ) as UserRepository, + ), + ..._sharedProviders, + ]; +} + +/// Configure dependencies for local data. +/// This dependency list uses repositories that provide local data. +/// The user is always logged in. +List get providersLocal { + return [ + ChangeNotifierProvider.value( + value: AuthRepositoryDev() as AuthRepository, + ), + Provider.value( + value: LocalDataService(), + ), + Provider( + create: (context) => DestinationRepositoryLocal( + localDataService: context.read(), + ) as DestinationRepository, + ), + Provider( + create: (context) => ContinentRepositoryLocal( + localDataService: context.read(), + ) as ContinentRepository, + ), + Provider( + create: (context) => ActivityRepositoryLocal( + localDataService: context.read(), + ) as ActivityRepository, + ), + Provider( + create: (context) => BookingRepositoryLocal( + localDataService: context.read(), + ) as BookingRepository, + ), + Provider.value( + value: ItineraryConfigRepositoryMemory() as ItineraryConfigRepository, + ), + Provider( + create: (context) => UserRepositoryLocal( + localDataService: context.read(), + ) as UserRepository, + ), + ..._sharedProviders, + ]; +} diff --git a/compass_app/app/lib/data/repositories/activity/activity_repository.dart b/compass_app/app/lib/data/repositories/activity/activity_repository.dart new file mode 100644 index 000000000..ab0c79296 --- /dev/null +++ b/compass_app/app/lib/data/repositories/activity/activity_repository.dart @@ -0,0 +1,12 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../../domain/models/activity/activity.dart'; +import '../../../utils/result.dart'; + +/// Data source for activities. +abstract class ActivityRepository { + /// Get activities by [Destination] ref. + Future>> getByDestination(String ref); +} diff --git a/compass_app/app/lib/data/repositories/activity/activity_repository_local.dart b/compass_app/app/lib/data/repositories/activity/activity_repository_local.dart new file mode 100644 index 000000000..fb2bb23a3 --- /dev/null +++ b/compass_app/app/lib/data/repositories/activity/activity_repository_local.dart @@ -0,0 +1,31 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../../domain/models/activity/activity.dart'; +import '../../../utils/result.dart'; +import '../../services/local/local_data_service.dart'; +import 'activity_repository.dart'; + +/// Local implementation of ActivityRepository +/// Uses data from assets folder +class ActivityRepositoryLocal implements ActivityRepository { + ActivityRepositoryLocal({ + required LocalDataService localDataService, + }) : _localDataService = localDataService; + + final LocalDataService _localDataService; + + @override + Future>> getByDestination(String ref) async { + try { + final activities = (await _localDataService.getActivities()) + .where((activity) => activity.destinationRef == ref) + .toList(); + + return Result.ok(activities); + } on Exception catch (error) { + return Result.error(error); + } + } +} diff --git a/compass_app/app/lib/data/repositories/activity/activity_repository_remote.dart b/compass_app/app/lib/data/repositories/activity/activity_repository_remote.dart new file mode 100644 index 000000000..6d2d0bcc5 --- /dev/null +++ b/compass_app/app/lib/data/repositories/activity/activity_repository_remote.dart @@ -0,0 +1,36 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../../domain/models/activity/activity.dart'; +import '../../../utils/result.dart'; +import '../../services/api/api_client.dart'; +import 'activity_repository.dart'; + +/// Remote data source for [Activity]. +/// Implements basic local caching. +/// See: https://docs.flutter.dev/get-started/fwe/local-caching +class ActivityRepositoryRemote implements ActivityRepository { + ActivityRepositoryRemote({ + required ApiClient apiClient, + }) : _apiClient = apiClient; + + final ApiClient _apiClient; + + final Map> _cachedData = {}; + + @override + Future>> getByDestination(String ref) async { + if (!_cachedData.containsKey(ref)) { + // No cached data, request activities + final result = await _apiClient.getActivityByDestination(ref); + if (result is Ok) { + _cachedData[ref] = result.asOk.value; + } + return result; + } else { + // Return cached data if available + return Result.ok(_cachedData[ref]!); + } + } +} diff --git a/compass_app/app/lib/data/repositories/auth/auth_repository.dart b/compass_app/app/lib/data/repositories/auth/auth_repository.dart new file mode 100644 index 000000000..b2d1f98f0 --- /dev/null +++ b/compass_app/app/lib/data/repositories/auth/auth_repository.dart @@ -0,0 +1,22 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/foundation.dart'; + +import '../../../utils/result.dart'; + +abstract class AuthRepository extends ChangeNotifier { + /// Returns true when the user is logged in + /// Returns [Future] because it will load a stored auth state the first time. + Future get isAuthenticated; + + /// Perform login + Future> login({ + required String email, + required String password, + }); + + /// Perform logout + Future> logout(); +} diff --git a/compass_app/app/lib/data/repositories/auth/auth_repository_dev.dart b/compass_app/app/lib/data/repositories/auth/auth_repository_dev.dart new file mode 100644 index 000000000..5c56b9621 --- /dev/null +++ b/compass_app/app/lib/data/repositories/auth/auth_repository_dev.dart @@ -0,0 +1,27 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../../utils/result.dart'; +import 'auth_repository.dart'; + +class AuthRepositoryDev extends AuthRepository { + /// User is always authenticated in dev scenarios + @override + Future get isAuthenticated => Future.value(true); + + /// Login is always successful in dev scenarios + @override + Future> login({ + required String email, + required String password, + }) async { + return Result.ok(null); + } + + /// Logout is always successful in dev scenarios + @override + Future> logout() async { + return Result.ok(null); + } +} diff --git a/compass_app/app/lib/data/repositories/auth/auth_repository_remote.dart b/compass_app/app/lib/data/repositories/auth/auth_repository_remote.dart new file mode 100644 index 000000000..8d8687f68 --- /dev/null +++ b/compass_app/app/lib/data/repositories/auth/auth_repository_remote.dart @@ -0,0 +1,112 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:logging/logging.dart'; + +import '../../../utils/result.dart'; +import '../../services/api/api_client.dart'; +import '../../services/api/auth_api_client.dart'; +import '../../services/api/model/login_request/login_request.dart'; +import '../../services/api/model/login_response/login_response.dart'; +import '../../services/shared_preferences_service.dart'; +import 'auth_repository.dart'; + +class AuthRepositoryRemote extends AuthRepository { + AuthRepositoryRemote({ + required ApiClient apiClient, + required AuthApiClient authApiClient, + required SharedPreferencesService sharedPreferencesService, + }) : _apiClient = apiClient, + _authApiClient = authApiClient, + _sharedPreferencesService = sharedPreferencesService { + _apiClient.authHeaderProvider = _authHeaderProvider; + } + + final AuthApiClient _authApiClient; + final ApiClient _apiClient; + final SharedPreferencesService _sharedPreferencesService; + + bool? _isAuthenticated; + String? _authToken; + final _log = Logger('AuthRepositoryRemote'); + + /// Fetch token from shared preferences + Future _fetch() async { + final result = await _sharedPreferencesService.fetchToken(); + switch (result) { + case Ok(): + _authToken = result.value; + _isAuthenticated = result.value != null; + case Error(): + _log.severe( + 'Failed to fech Token from SharedPreferences', + result.error, + ); + } + } + + @override + Future get isAuthenticated async { + // Status is cached + if (_isAuthenticated != null) { + return _isAuthenticated!; + } + // No status cached, fetch from storage + await _fetch(); + return _isAuthenticated ?? false; + } + + @override + Future> login({ + required String email, + required String password, + }) async { + try { + final result = await _authApiClient.login( + LoginRequest( + email: email, + password: password, + ), + ); + switch (result) { + case Ok(): + _log.info('User logged int'); + // Set auth status + _isAuthenticated = true; + _authToken = result.value.token; + // Store in Shared preferences + return await _sharedPreferencesService.saveToken(result.value.token); + case Error(): + _log.warning('Error logging in: ${result.error}'); + return Result.error(result.error); + } + } finally { + notifyListeners(); + } + } + + @override + Future> logout() async { + _log.info('User logged out'); + try { + // Clear stored auth token + final result = await _sharedPreferencesService.saveToken(null); + if (result is Error) { + _log.severe('Failed to clear stored auth token'); + } + + // Clear token in ApiClient + _authToken = null; + + // Clear authenticated status + _isAuthenticated = false; + return result; + } finally { + notifyListeners(); + } + } + + String? _authHeaderProvider() => + _authToken != null ? 'Bearer $_authToken' : null; +} diff --git a/compass_app/app/lib/data/repositories/booking/booking_repository.dart b/compass_app/app/lib/data/repositories/booking/booking_repository.dart new file mode 100644 index 000000000..aeda7c74b --- /dev/null +++ b/compass_app/app/lib/data/repositories/booking/booking_repository.dart @@ -0,0 +1,21 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../../domain/models/booking/booking.dart'; +import '../../../domain/models/booking/booking_summary.dart'; +import '../../../utils/result.dart'; + +abstract class BookingRepository { + /// Returns the list of [BookingSummary] for the current user. + Future>> getBookingsList(); + + /// Returns a full [Booking] given the id. + Future> getBooking(int id); + + /// Creates a new [Booking]. + Future> createBooking(Booking booking); + + /// Delete booking + Future> delete(int id); +} diff --git a/compass_app/app/lib/data/repositories/booking/booking_repository_local.dart b/compass_app/app/lib/data/repositories/booking/booking_repository_local.dart new file mode 100644 index 000000000..4a340d7c2 --- /dev/null +++ b/compass_app/app/lib/data/repositories/booking/booking_repository_local.dart @@ -0,0 +1,97 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; + +import 'package:collection/collection.dart'; + +import '../../../domain/models/booking/booking.dart'; +import '../../../domain/models/booking/booking_summary.dart'; +import '../../../utils/result.dart'; + +import '../../services/local/local_data_service.dart'; +import 'booking_repository.dart'; + +class BookingRepositoryLocal implements BookingRepository { + BookingRepositoryLocal({ + required LocalDataService localDataService, + }) : _localDataService = localDataService; + + // Only create default booking once + bool _isInitialized = false; + // Used to generate IDs for bookings + int _sequentialId = 0; + + final _bookings = List.empty(growable: true); + final LocalDataService _localDataService; + + @override + Future> createBooking(Booking booking) async { + // Bookings created come without id, we need to assign one + final bookingWithId = booking.copyWith(id: _sequentialId++); + _bookings.add(bookingWithId); + return Result.ok(null); + } + + @override + Future> getBooking(int id) async { + final booking = _bookings.firstWhereOrNull((booking) => booking.id == id); + if (booking == null) { + return Result.error(Exception('Booking not found')); + } + return Result.ok(booking); + } + + @override + Future>> getBookingsList() async { + // Initialize the repository with a default booking + if (!_isInitialized) { + await _createDefaultBooking(); + _isInitialized = true; + } + + return Result.ok(_createSummaries()); + } + + List _createSummaries() { + return _bookings + .map( + (booking) => BookingSummary( + id: booking.id!, + name: + '${booking.destination.name}, ${booking.destination.continent}', + startDate: booking.startDate, + endDate: booking.endDate, + ), + ) + .toList(); + } + + Future _createDefaultBooking() async { + // create a default booking the first time + if (_bookings.isEmpty) { + final destination = (await _localDataService.getDestinations()).first; + final activities = (await _localDataService.getActivities()) + .where((activity) => activity.destinationRef == destination.ref) + .take(4) + .toList(); + + _bookings.add( + Booking( + id: _sequentialId++, + startDate: DateTime(2024, 1, 1), + endDate: DateTime(2024, 2, 1), + destination: destination, + activity: activities, + ), + ); + } + } + + @override + Future> delete(int id) async { + _bookings.removeWhere((booking) => booking.id == id); + return Result.ok(null); + } +} diff --git a/compass_app/app/lib/data/repositories/booking/booking_repository_remote.dart b/compass_app/app/lib/data/repositories/booking/booking_repository_remote.dart new file mode 100644 index 000000000..1ac1cd7cd --- /dev/null +++ b/compass_app/app/lib/data/repositories/booking/booking_repository_remote.dart @@ -0,0 +1,118 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../../domain/models/activity/activity.dart'; +import '../../../domain/models/booking/booking.dart'; +import '../../../domain/models/booking/booking_summary.dart'; +import '../../../domain/models/destination/destination.dart'; +import '../../../utils/result.dart'; +import '../../services/api/api_client.dart'; +import '../../services/api/model/booking/booking_api_model.dart'; +import 'booking_repository.dart'; + +class BookingRepositoryRemote implements BookingRepository { + BookingRepositoryRemote({ + required ApiClient apiClient, + }) : _apiClient = apiClient; + + final ApiClient _apiClient; + + List? _cachedDestinations; + + @override + Future> createBooking(Booking booking) async { + try { + final BookingApiModel bookingApiModel = BookingApiModel( + startDate: booking.startDate, + endDate: booking.endDate, + name: '${booking.destination.name}, ${booking.destination.continent}', + destinationRef: booking.destination.ref, + activitiesRef: + booking.activity.map((activity) => activity.ref).toList(), + ); + return _apiClient.postBooking(bookingApiModel); + } on Exception catch (e) { + return Result.error(e); + } + } + + @override + Future> getBooking(int id) async { + try { + // Get booking by ID from server + final resultBooking = await _apiClient.getBooking(id); + if (resultBooking is Error) { + return Result.error(resultBooking.error); + } + final booking = resultBooking.asOk.value; + + // Load destinations if not loaded yet + if (_cachedDestinations == null) { + final resultDestination = await _apiClient.getDestinations(); + if (resultDestination is Error>) { + return Result.error(resultDestination.error); + } + _cachedDestinations = resultDestination.asOk.value; + } + + // Get destination for booking + final destination = _cachedDestinations!.firstWhere( + (destination) => destination.ref == booking.destinationRef); + + final resultActivities = + await _apiClient.getActivityByDestination(destination.ref); + + if (resultActivities is Error>) { + return Result.error(resultActivities.error); + } + final activities = resultActivities.asOk.value + .where((activity) => booking.activitiesRef.contains(activity.ref)) + .toList(); + + return Result.ok( + Booking( + id: booking.id, + startDate: booking.startDate, + endDate: booking.endDate, + destination: destination, + activity: activities, + ), + ); + } on Exception catch (e) { + return Result.error(e); + } + } + + @override + Future>> getBookingsList() async { + try { + final result = await _apiClient.getBookings(); + if (result is Error>) { + return Result.error(result.error); + } + final bookingsApi = result.asOk.value; + return Result.ok(bookingsApi + .map( + (bookingApi) => BookingSummary( + id: bookingApi.id!, + name: bookingApi.name, + startDate: bookingApi.startDate, + endDate: bookingApi.endDate, + ), + ) + .toList()); + } on Exception catch (e) { + return Result.error(e); + } + } + + @override + Future> delete(int id) async { + try { + return _apiClient.deleteBooking(id); + } on Exception catch (e) { + return Result.error(e); + } + } +} diff --git a/compass_app/app/lib/data/repositories/continent/continent_repository.dart b/compass_app/app/lib/data/repositories/continent/continent_repository.dart new file mode 100644 index 000000000..14690b6ec --- /dev/null +++ b/compass_app/app/lib/data/repositories/continent/continent_repository.dart @@ -0,0 +1,12 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../../domain/models/continent/continent.dart'; +import '../../../utils/result.dart'; + +/// Data source with all possible continents. +abstract class ContinentRepository { + /// Get complete list of continents. + Future>> getContinents(); +} diff --git a/compass_app/app/lib/data/repositories/continent/continent_repository_local.dart b/compass_app/app/lib/data/repositories/continent/continent_repository_local.dart new file mode 100644 index 000000000..8c64f05f7 --- /dev/null +++ b/compass_app/app/lib/data/repositories/continent/continent_repository_local.dart @@ -0,0 +1,22 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../../domain/models/continent/continent.dart'; +import '../../../utils/result.dart'; +import '../../services/local/local_data_service.dart'; +import 'continent_repository.dart'; + +/// Local data source with all possible continents. +class ContinentRepositoryLocal implements ContinentRepository { + ContinentRepositoryLocal({ + required LocalDataService localDataService, + }) : _localDataService = localDataService; + + final LocalDataService _localDataService; + + @override + Future>> getContinents() async { + return Future.value(Result.ok(_localDataService.getContinents())); + } +} diff --git a/compass_app/app/lib/data/repositories/continent/continent_repository_remote.dart b/compass_app/app/lib/data/repositories/continent/continent_repository_remote.dart new file mode 100644 index 000000000..58a6e439e --- /dev/null +++ b/compass_app/app/lib/data/repositories/continent/continent_repository_remote.dart @@ -0,0 +1,37 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../../domain/models/continent/continent.dart'; +import '../../../utils/result.dart'; +import '../../services/api/api_client.dart'; +import 'continent_repository.dart'; + +/// Remote data source for [Continent]. +/// Implements basic local caching. +/// See: https://docs.flutter.dev/get-started/fwe/local-caching +class ContinentRepositoryRemote implements ContinentRepository { + ContinentRepositoryRemote({ + required ApiClient apiClient, + }) : _apiClient = apiClient; + + final ApiClient _apiClient; + + List? _cachedData; + + @override + Future>> getContinents() async { + if (_cachedData == null) { + // No cached data, request continents + final result = await _apiClient.getContinents(); + if (result is Ok) { + // Store value if result Ok + _cachedData = result.asOk.value; + } + return result; + } else { + // Return cached data if available + return Result.ok(_cachedData!); + } + } +} diff --git a/compass_app/app/lib/data/repositories/destination/destination_repository.dart b/compass_app/app/lib/data/repositories/destination/destination_repository.dart new file mode 100644 index 000000000..64af520ce --- /dev/null +++ b/compass_app/app/lib/data/repositories/destination/destination_repository.dart @@ -0,0 +1,12 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../../domain/models/destination/destination.dart'; +import '../../../utils/result.dart'; + +/// Data source with all possible destinations +abstract class DestinationRepository { + /// Get complete list of destinations + Future>> getDestinations(); +} diff --git a/compass_app/app/lib/data/repositories/destination/destination_repository_local.dart b/compass_app/app/lib/data/repositories/destination/destination_repository_local.dart new file mode 100644 index 000000000..8604251b7 --- /dev/null +++ b/compass_app/app/lib/data/repositories/destination/destination_repository_local.dart @@ -0,0 +1,28 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../../domain/models/destination/destination.dart'; +import '../../../utils/result.dart'; +import '../../services/local/local_data_service.dart'; +import 'destination_repository.dart'; + +/// Local implementation of DestinationRepository +/// Uses data from assets folder +class DestinationRepositoryLocal implements DestinationRepository { + DestinationRepositoryLocal({ + required LocalDataService localDataService, + }) : _localDataService = localDataService; + + final LocalDataService _localDataService; + + /// Obtain list of destinations from local assets + @override + Future>> getDestinations() async { + try { + return Result.ok(await _localDataService.getDestinations()); + } on Exception catch (error) { + return Result.error(error); + } + } +} diff --git a/compass_app/app/lib/data/repositories/destination/destination_repository_remote.dart b/compass_app/app/lib/data/repositories/destination/destination_repository_remote.dart new file mode 100644 index 000000000..191b2a6ed --- /dev/null +++ b/compass_app/app/lib/data/repositories/destination/destination_repository_remote.dart @@ -0,0 +1,37 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../../domain/models/destination/destination.dart'; +import '../../../utils/result.dart'; +import '../../services/api/api_client.dart'; +import 'destination_repository.dart'; + +/// Remote data source for [Destination]. +/// Implements basic local caching. +/// See: https://docs.flutter.dev/get-started/fwe/local-caching +class DestinationRepositoryRemote implements DestinationRepository { + DestinationRepositoryRemote({ + required ApiClient apiClient, + }) : _apiClient = apiClient; + + final ApiClient _apiClient; + + List? _cachedData; + + @override + Future>> getDestinations() async { + if (_cachedData == null) { + // No cached data, request destinations + final result = await _apiClient.getDestinations(); + if (result is Ok) { + // Store value if result Ok + _cachedData = result.asOk.value; + } + return result; + } else { + // Return cached data if available + return Result.ok(_cachedData!); + } + } +} diff --git a/compass_app/app/lib/data/repositories/itinerary_config/itinerary_config_repository.dart b/compass_app/app/lib/data/repositories/itinerary_config/itinerary_config_repository.dart new file mode 100644 index 000000000..a48297620 --- /dev/null +++ b/compass_app/app/lib/data/repositories/itinerary_config/itinerary_config_repository.dart @@ -0,0 +1,17 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../../domain/models/itinerary_config/itinerary_config.dart'; +import '../../../utils/result.dart'; + +/// Data source for the current [ItineraryConfig] +abstract class ItineraryConfigRepository { + /// Get current [ItineraryConfig], may be empty if no configuration started. + /// Method is async to support writing to database, file, etc. + Future> getItineraryConfig(); + + /// Sets [ItineraryConfig], overrides the previous one stored. + /// Returns Result.Ok if set is successful. + Future> setItineraryConfig(ItineraryConfig itineraryConfig); +} diff --git a/compass_app/app/lib/data/repositories/itinerary_config/itinerary_config_repository_memory.dart b/compass_app/app/lib/data/repositories/itinerary_config/itinerary_config_repository_memory.dart new file mode 100644 index 000000000..5bd9cc0d5 --- /dev/null +++ b/compass_app/app/lib/data/repositories/itinerary_config/itinerary_config_repository_memory.dart @@ -0,0 +1,27 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; + +import '../../../domain/models/itinerary_config/itinerary_config.dart'; +import '../../../utils/result.dart'; +import 'itinerary_config_repository.dart'; + +/// In-memory implementation of [ItineraryConfigRepository]. +class ItineraryConfigRepositoryMemory implements ItineraryConfigRepository { + ItineraryConfig? _itineraryConfig; + + @override + Future> getItineraryConfig() async { + return Result.ok(_itineraryConfig ?? const ItineraryConfig()); + } + + @override + Future> setItineraryConfig( + ItineraryConfig itineraryConfig, + ) async { + _itineraryConfig = itineraryConfig; + return Result.ok(true); + } +} diff --git a/compass_app/app/lib/data/repositories/user/user_repository.dart b/compass_app/app/lib/data/repositories/user/user_repository.dart new file mode 100644 index 000000000..142060c46 --- /dev/null +++ b/compass_app/app/lib/data/repositories/user/user_repository.dart @@ -0,0 +1,12 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../../domain/models/user/user.dart'; +import '../../../utils/result.dart'; + +/// Data source for user related data +abstract class UserRepository { + /// Get current user + Future> getUser(); +} diff --git a/compass_app/app/lib/data/repositories/user/user_repository_local.dart b/compass_app/app/lib/data/repositories/user/user_repository_local.dart new file mode 100644 index 000000000..09ad4300b --- /dev/null +++ b/compass_app/app/lib/data/repositories/user/user_repository_local.dart @@ -0,0 +1,21 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../../domain/models/user/user.dart'; +import '../../../utils/result.dart'; +import '../../services/local/local_data_service.dart'; +import 'user_repository.dart'; + +class UserRepositoryLocal implements UserRepository { + UserRepositoryLocal({ + required LocalDataService localDataService, + }) : _localDataService = localDataService; + + final LocalDataService _localDataService; + + @override + Future> getUser() async { + return Result.ok(_localDataService.getUser()); + } +} diff --git a/compass_app/app/lib/data/repositories/user/user_repository_remote.dart b/compass_app/app/lib/data/repositories/user/user_repository_remote.dart new file mode 100644 index 000000000..35e47ff6d --- /dev/null +++ b/compass_app/app/lib/data/repositories/user/user_repository_remote.dart @@ -0,0 +1,39 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../../domain/models/user/user.dart'; +import '../../../utils/result.dart'; +import '../../services/api/api_client.dart'; +import '../../services/api/model/user/user_api_model.dart'; +import 'user_repository.dart'; + +class UserRepositoryRemote implements UserRepository { + UserRepositoryRemote({ + required ApiClient apiClient, + }) : _apiClient = apiClient; + + final ApiClient _apiClient; + + User? _cachedData; + + @override + Future> getUser() async { + if (_cachedData != null) { + return Future.value(Result.ok(_cachedData!)); + } + + final result = await _apiClient.getUser(); + switch (result) { + case Ok(): + final user = User( + name: result.value.name, + picture: result.value.picture, + ); + _cachedData = user; + return Result.ok(user); + case Error(): + return Result.error(result.error); + } + } +} diff --git a/compass_app/app/lib/data/services/api/api_client.dart b/compass_app/app/lib/data/services/api/api_client.dart new file mode 100644 index 000000000..58f2d7a0a --- /dev/null +++ b/compass_app/app/lib/data/services/api/api_client.dart @@ -0,0 +1,210 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; +import 'dart:io'; + +import '../../../domain/models/activity/activity.dart'; +import '../../../domain/models/continent/continent.dart'; +import '../../../domain/models/destination/destination.dart'; +import '../../../utils/result.dart'; +import 'model/booking/booking_api_model.dart'; +import 'model/user/user_api_model.dart'; + +/// Adds the `Authentication` header to a header configuration. +typedef AuthHeaderProvider = String? Function(); + +class ApiClient { + ApiClient({ + String? host, + int? port, + HttpClient Function()? clientFactory, + }) : _host = host ?? 'localhost', + _port = port ?? 8080, + _clientFactory = clientFactory ?? (() => HttpClient()); + + final String _host; + final int _port; + final HttpClient Function() _clientFactory; + + AuthHeaderProvider? _authHeaderProvider; + + set authHeaderProvider(AuthHeaderProvider authHeaderProvider) { + _authHeaderProvider = authHeaderProvider; + } + + Future _authHeader(HttpHeaders headers) async { + final header = _authHeaderProvider?.call(); + if (header != null) { + headers.add(HttpHeaders.authorizationHeader, header); + } + } + + Future>> getContinents() async { + final client = _clientFactory(); + try { + final request = await client.get(_host, _port, '/continent'); + await _authHeader(request.headers); + final response = await request.close(); + if (response.statusCode == 200) { + final stringData = await response.transform(utf8.decoder).join(); + final json = jsonDecode(stringData) as List; + return Result.ok( + json.map((element) => Continent.fromJson(element)).toList()); + } else { + return Result.error(const HttpException("Invalid response")); + } + } on Exception catch (error) { + return Result.error(error); + } finally { + client.close(); + } + } + + Future>> getDestinations() async { + final client = _clientFactory(); + try { + final request = await client.get(_host, _port, '/destination'); + await _authHeader(request.headers); + final response = await request.close(); + if (response.statusCode == 200) { + final stringData = await response.transform(utf8.decoder).join(); + final json = jsonDecode(stringData) as List; + return Result.ok( + json.map((element) => Destination.fromJson(element)).toList()); + } else { + return Result.error(const HttpException("Invalid response")); + } + } on Exception catch (error) { + return Result.error(error); + } finally { + client.close(); + } + } + + Future>> getActivityByDestination(String ref) async { + final client = _clientFactory(); + try { + final request = + await client.get(_host, _port, '/destination/$ref/activity'); + await _authHeader(request.headers); + final response = await request.close(); + if (response.statusCode == 200) { + final stringData = await response.transform(utf8.decoder).join(); + final json = jsonDecode(stringData) as List; + final activities = + json.map((element) => Activity.fromJson(element)).toList(); + return Result.ok(activities); + } else { + return Result.error(const HttpException("Invalid response")); + } + } on Exception catch (error) { + return Result.error(error); + } finally { + client.close(); + } + } + + Future>> getBookings() async { + final client = _clientFactory(); + try { + final request = await client.get(_host, _port, '/booking'); + await _authHeader(request.headers); + final response = await request.close(); + if (response.statusCode == 200) { + final stringData = await response.transform(utf8.decoder).join(); + final json = jsonDecode(stringData) as List; + final bookings = + json.map((element) => BookingApiModel.fromJson(element)).toList(); + return Result.ok(bookings); + } else { + return Result.error(const HttpException("Invalid response")); + } + } on Exception catch (error) { + return Result.error(error); + } finally { + client.close(); + } + } + + Future> getBooking(int id) async { + final client = _clientFactory(); + try { + final request = await client.get(_host, _port, '/booking/$id'); + await _authHeader(request.headers); + final response = await request.close(); + if (response.statusCode == 200) { + final stringData = await response.transform(utf8.decoder).join(); + final booking = BookingApiModel.fromJson(jsonDecode(stringData)); + return Result.ok(booking); + } else { + return Result.error(const HttpException("Invalid response")); + } + } on Exception catch (error) { + return Result.error(error); + } finally { + client.close(); + } + } + + Future> postBooking(BookingApiModel booking) async { + final client = _clientFactory(); + try { + final request = await client.post(_host, _port, '/booking'); + await _authHeader(request.headers); + request.write(jsonEncode(booking)); + final response = await request.close(); + if (response.statusCode == 201) { + final stringData = await response.transform(utf8.decoder).join(); + final booking = BookingApiModel.fromJson(jsonDecode(stringData)); + return Result.ok(booking); + } else { + return Result.error(const HttpException("Invalid response")); + } + } on Exception catch (error) { + return Result.error(error); + } finally { + client.close(); + } + } + + Future> getUser() async { + final client = _clientFactory(); + try { + final request = await client.get(_host, _port, '/user'); + await _authHeader(request.headers); + final response = await request.close(); + if (response.statusCode == 200) { + final stringData = await response.transform(utf8.decoder).join(); + final user = UserApiModel.fromJson(jsonDecode(stringData)); + return Result.ok(user); + } else { + return Result.error(const HttpException("Invalid response")); + } + } on Exception catch (error) { + return Result.error(error); + } finally { + client.close(); + } + } + + Future> deleteBooking(int id) async { + final client = _clientFactory(); + try { + final request = await client.delete(_host, _port, '/booking/$id'); + await _authHeader(request.headers); + final response = await request.close(); + // Response 204 "No Content", delete was successful + if (response.statusCode == 204) { + return Result.ok(null); + } else { + return Result.error(const HttpException("Invalid response")); + } + } on Exception catch (error) { + return Result.error(error); + } finally { + client.close(); + } + } +} diff --git a/compass_app/app/lib/data/services/api/auth_api_client.dart b/compass_app/app/lib/data/services/api/auth_api_client.dart new file mode 100644 index 000000000..7c2191b46 --- /dev/null +++ b/compass_app/app/lib/data/services/api/auth_api_client.dart @@ -0,0 +1,43 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; +import 'dart:io'; + +import '../../../utils/result.dart'; +import 'model/login_request/login_request.dart'; +import 'model/login_response/login_response.dart'; + +class AuthApiClient { + AuthApiClient({ + String? host, + int? port, + HttpClient Function()? clientFactory, + }) : _host = host ?? 'localhost', + _port = port ?? 8080, + _clientFactory = clientFactory ?? (() => HttpClient()); + + final String _host; + final int _port; + final HttpClient Function() _clientFactory; + + Future> login(LoginRequest loginRequest) async { + final client = _clientFactory(); + try { + final request = await client.post(_host, _port, '/login'); + request.write(jsonEncode(loginRequest)); + final response = await request.close(); + if (response.statusCode == 200) { + final stringData = await response.transform(utf8.decoder).join(); + return Result.ok(LoginResponse.fromJson(jsonDecode(stringData))); + } else { + return Result.error(const HttpException("Login error")); + } + } on Exception catch (error) { + return Result.error(error); + } finally { + client.close(); + } + } +} diff --git a/compass_app/app/lib/data/services/api/model/booking/booking_api_model.dart b/compass_app/app/lib/data/services/api/model/booking/booking_api_model.dart new file mode 100644 index 000000000..bbd0ec35a --- /dev/null +++ b/compass_app/app/lib/data/services/api/model/booking/booking_api_model.dart @@ -0,0 +1,35 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'booking_api_model.freezed.dart'; +part 'booking_api_model.g.dart'; + +@freezed +class BookingApiModel with _$BookingApiModel { + const factory BookingApiModel({ + /// Booking ID. Generated when stored in server. + int? id, + + /// Start date of the trip + required DateTime startDate, + + /// End date of the trip + required DateTime endDate, + + /// Booking name + /// Should be "Destination, Continent" + required String name, + + /// Destination of the trip + required String destinationRef, + + /// List of chosen activities + required List activitiesRef, + }) = _BookingApiModel; + + factory BookingApiModel.fromJson(Map json) => + _$BookingApiModelFromJson(json); +} diff --git a/compass_app/app/lib/data/services/api/model/booking/booking_api_model.freezed.dart b/compass_app/app/lib/data/services/api/model/booking/booking_api_model.freezed.dart new file mode 100644 index 000000000..e3589dc52 --- /dev/null +++ b/compass_app/app/lib/data/services/api/model/booking/booking_api_model.freezed.dart @@ -0,0 +1,317 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'booking_api_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +BookingApiModel _$BookingApiModelFromJson(Map json) { + return _BookingApiModel.fromJson(json); +} + +/// @nodoc +mixin _$BookingApiModel { + /// Booking ID. Generated when stored in server. + int? get id => throw _privateConstructorUsedError; + + /// Start date of the trip + DateTime get startDate => throw _privateConstructorUsedError; + + /// End date of the trip + DateTime get endDate => throw _privateConstructorUsedError; + + /// Booking name + /// Should be "Destination, Continent" + String get name => throw _privateConstructorUsedError; + + /// Destination of the trip + String get destinationRef => throw _privateConstructorUsedError; + + /// List of chosen activities + List get activitiesRef => throw _privateConstructorUsedError; + + /// Serializes this BookingApiModel to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of BookingApiModel + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $BookingApiModelCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $BookingApiModelCopyWith<$Res> { + factory $BookingApiModelCopyWith( + BookingApiModel value, $Res Function(BookingApiModel) then) = + _$BookingApiModelCopyWithImpl<$Res, BookingApiModel>; + @useResult + $Res call( + {int? id, + DateTime startDate, + DateTime endDate, + String name, + String destinationRef, + List activitiesRef}); +} + +/// @nodoc +class _$BookingApiModelCopyWithImpl<$Res, $Val extends BookingApiModel> + implements $BookingApiModelCopyWith<$Res> { + _$BookingApiModelCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of BookingApiModel + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = freezed, + Object? startDate = null, + Object? endDate = null, + Object? name = null, + Object? destinationRef = null, + Object? activitiesRef = null, + }) { + return _then(_value.copyWith( + id: freezed == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int?, + startDate: null == startDate + ? _value.startDate + : startDate // ignore: cast_nullable_to_non_nullable + as DateTime, + endDate: null == endDate + ? _value.endDate + : endDate // ignore: cast_nullable_to_non_nullable + as DateTime, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + destinationRef: null == destinationRef + ? _value.destinationRef + : destinationRef // ignore: cast_nullable_to_non_nullable + as String, + activitiesRef: null == activitiesRef + ? _value.activitiesRef + : activitiesRef // ignore: cast_nullable_to_non_nullable + as List, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$BookingApiModelImplCopyWith<$Res> + implements $BookingApiModelCopyWith<$Res> { + factory _$$BookingApiModelImplCopyWith(_$BookingApiModelImpl value, + $Res Function(_$BookingApiModelImpl) then) = + __$$BookingApiModelImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {int? id, + DateTime startDate, + DateTime endDate, + String name, + String destinationRef, + List activitiesRef}); +} + +/// @nodoc +class __$$BookingApiModelImplCopyWithImpl<$Res> + extends _$BookingApiModelCopyWithImpl<$Res, _$BookingApiModelImpl> + implements _$$BookingApiModelImplCopyWith<$Res> { + __$$BookingApiModelImplCopyWithImpl( + _$BookingApiModelImpl _value, $Res Function(_$BookingApiModelImpl) _then) + : super(_value, _then); + + /// Create a copy of BookingApiModel + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = freezed, + Object? startDate = null, + Object? endDate = null, + Object? name = null, + Object? destinationRef = null, + Object? activitiesRef = null, + }) { + return _then(_$BookingApiModelImpl( + id: freezed == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int?, + startDate: null == startDate + ? _value.startDate + : startDate // ignore: cast_nullable_to_non_nullable + as DateTime, + endDate: null == endDate + ? _value.endDate + : endDate // ignore: cast_nullable_to_non_nullable + as DateTime, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + destinationRef: null == destinationRef + ? _value.destinationRef + : destinationRef // ignore: cast_nullable_to_non_nullable + as String, + activitiesRef: null == activitiesRef + ? _value._activitiesRef + : activitiesRef // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$BookingApiModelImpl implements _BookingApiModel { + const _$BookingApiModelImpl( + {this.id, + required this.startDate, + required this.endDate, + required this.name, + required this.destinationRef, + required final List activitiesRef}) + : _activitiesRef = activitiesRef; + + factory _$BookingApiModelImpl.fromJson(Map json) => + _$$BookingApiModelImplFromJson(json); + + /// Booking ID. Generated when stored in server. + @override + final int? id; + + /// Start date of the trip + @override + final DateTime startDate; + + /// End date of the trip + @override + final DateTime endDate; + + /// Booking name + /// Should be "Destination, Continent" + @override + final String name; + + /// Destination of the trip + @override + final String destinationRef; + + /// List of chosen activities + final List _activitiesRef; + + /// List of chosen activities + @override + List get activitiesRef { + if (_activitiesRef is EqualUnmodifiableListView) return _activitiesRef; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_activitiesRef); + } + + @override + String toString() { + return 'BookingApiModel(id: $id, startDate: $startDate, endDate: $endDate, name: $name, destinationRef: $destinationRef, activitiesRef: $activitiesRef)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$BookingApiModelImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.startDate, startDate) || + other.startDate == startDate) && + (identical(other.endDate, endDate) || other.endDate == endDate) && + (identical(other.name, name) || other.name == name) && + (identical(other.destinationRef, destinationRef) || + other.destinationRef == destinationRef) && + const DeepCollectionEquality() + .equals(other._activitiesRef, _activitiesRef)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, id, startDate, endDate, name, + destinationRef, const DeepCollectionEquality().hash(_activitiesRef)); + + /// Create a copy of BookingApiModel + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$BookingApiModelImplCopyWith<_$BookingApiModelImpl> get copyWith => + __$$BookingApiModelImplCopyWithImpl<_$BookingApiModelImpl>( + this, _$identity); + + @override + Map toJson() { + return _$$BookingApiModelImplToJson( + this, + ); + } +} + +abstract class _BookingApiModel implements BookingApiModel { + const factory _BookingApiModel( + {final int? id, + required final DateTime startDate, + required final DateTime endDate, + required final String name, + required final String destinationRef, + required final List activitiesRef}) = _$BookingApiModelImpl; + + factory _BookingApiModel.fromJson(Map json) = + _$BookingApiModelImpl.fromJson; + + /// Booking ID. Generated when stored in server. + @override + int? get id; + + /// Start date of the trip + @override + DateTime get startDate; + + /// End date of the trip + @override + DateTime get endDate; + + /// Booking name + /// Should be "Destination, Continent" + @override + String get name; + + /// Destination of the trip + @override + String get destinationRef; + + /// List of chosen activities + @override + List get activitiesRef; + + /// Create a copy of BookingApiModel + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$BookingApiModelImplCopyWith<_$BookingApiModelImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/app/lib/data/services/api/model/booking/booking_api_model.g.dart b/compass_app/app/lib/data/services/api/model/booking/booking_api_model.g.dart new file mode 100644 index 000000000..8be3181bf --- /dev/null +++ b/compass_app/app/lib/data/services/api/model/booking/booking_api_model.g.dart @@ -0,0 +1,31 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'booking_api_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$BookingApiModelImpl _$$BookingApiModelImplFromJson( + Map json) => + _$BookingApiModelImpl( + id: (json['id'] as num?)?.toInt(), + startDate: DateTime.parse(json['startDate'] as String), + endDate: DateTime.parse(json['endDate'] as String), + name: json['name'] as String, + destinationRef: json['destinationRef'] as String, + activitiesRef: (json['activitiesRef'] as List) + .map((e) => e as String) + .toList(), + ); + +Map _$$BookingApiModelImplToJson( + _$BookingApiModelImpl instance) => + { + 'id': instance.id, + 'startDate': instance.startDate.toIso8601String(), + 'endDate': instance.endDate.toIso8601String(), + 'name': instance.name, + 'destinationRef': instance.destinationRef, + 'activitiesRef': instance.activitiesRef, + }; diff --git a/compass_app/app/lib/data/services/api/model/login_request/login_request.dart b/compass_app/app/lib/data/services/api/model/login_request/login_request.dart new file mode 100644 index 000000000..e30ec7cf6 --- /dev/null +++ b/compass_app/app/lib/data/services/api/model/login_request/login_request.dart @@ -0,0 +1,24 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'login_request.freezed.dart'; + +part 'login_request.g.dart'; + +/// Simple data class to hold login request data. +@freezed +class LoginRequest with _$LoginRequest { + const factory LoginRequest({ + /// Email address. + required String email, + + /// Plain text password. + required String password, + }) = _LoginRequest; + + factory LoginRequest.fromJson(Map json) => + _$LoginRequestFromJson(json); +} diff --git a/compass_app/app/lib/data/services/api/model/login_request/login_request.freezed.dart b/compass_app/app/lib/data/services/api/model/login_request/login_request.freezed.dart new file mode 100644 index 000000000..d130b9a4f --- /dev/null +++ b/compass_app/app/lib/data/services/api/model/login_request/login_request.freezed.dart @@ -0,0 +1,192 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'login_request.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +LoginRequest _$LoginRequestFromJson(Map json) { + return _LoginRequest.fromJson(json); +} + +/// @nodoc +mixin _$LoginRequest { + /// Email address. + String get email => throw _privateConstructorUsedError; + + /// Plain text password. + String get password => throw _privateConstructorUsedError; + + /// Serializes this LoginRequest to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of LoginRequest + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $LoginRequestCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $LoginRequestCopyWith<$Res> { + factory $LoginRequestCopyWith( + LoginRequest value, $Res Function(LoginRequest) then) = + _$LoginRequestCopyWithImpl<$Res, LoginRequest>; + @useResult + $Res call({String email, String password}); +} + +/// @nodoc +class _$LoginRequestCopyWithImpl<$Res, $Val extends LoginRequest> + implements $LoginRequestCopyWith<$Res> { + _$LoginRequestCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of LoginRequest + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? email = null, + Object? password = null, + }) { + return _then(_value.copyWith( + email: null == email + ? _value.email + : email // ignore: cast_nullable_to_non_nullable + as String, + password: null == password + ? _value.password + : password // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$LoginRequestImplCopyWith<$Res> + implements $LoginRequestCopyWith<$Res> { + factory _$$LoginRequestImplCopyWith( + _$LoginRequestImpl value, $Res Function(_$LoginRequestImpl) then) = + __$$LoginRequestImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String email, String password}); +} + +/// @nodoc +class __$$LoginRequestImplCopyWithImpl<$Res> + extends _$LoginRequestCopyWithImpl<$Res, _$LoginRequestImpl> + implements _$$LoginRequestImplCopyWith<$Res> { + __$$LoginRequestImplCopyWithImpl( + _$LoginRequestImpl _value, $Res Function(_$LoginRequestImpl) _then) + : super(_value, _then); + + /// Create a copy of LoginRequest + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? email = null, + Object? password = null, + }) { + return _then(_$LoginRequestImpl( + email: null == email + ? _value.email + : email // ignore: cast_nullable_to_non_nullable + as String, + password: null == password + ? _value.password + : password // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$LoginRequestImpl implements _LoginRequest { + const _$LoginRequestImpl({required this.email, required this.password}); + + factory _$LoginRequestImpl.fromJson(Map json) => + _$$LoginRequestImplFromJson(json); + + /// Email address. + @override + final String email; + + /// Plain text password. + @override + final String password; + + @override + String toString() { + return 'LoginRequest(email: $email, password: $password)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoginRequestImpl && + (identical(other.email, email) || other.email == email) && + (identical(other.password, password) || + other.password == password)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, email, password); + + /// Create a copy of LoginRequest + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$LoginRequestImplCopyWith<_$LoginRequestImpl> get copyWith => + __$$LoginRequestImplCopyWithImpl<_$LoginRequestImpl>(this, _$identity); + + @override + Map toJson() { + return _$$LoginRequestImplToJson( + this, + ); + } +} + +abstract class _LoginRequest implements LoginRequest { + const factory _LoginRequest( + {required final String email, + required final String password}) = _$LoginRequestImpl; + + factory _LoginRequest.fromJson(Map json) = + _$LoginRequestImpl.fromJson; + + /// Email address. + @override + String get email; + + /// Plain text password. + @override + String get password; + + /// Create a copy of LoginRequest + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$LoginRequestImplCopyWith<_$LoginRequestImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/app/lib/data/services/api/model/login_request/login_request.g.dart b/compass_app/app/lib/data/services/api/model/login_request/login_request.g.dart new file mode 100644 index 000000000..0a11bd9f2 --- /dev/null +++ b/compass_app/app/lib/data/services/api/model/login_request/login_request.g.dart @@ -0,0 +1,19 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'login_request.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$LoginRequestImpl _$$LoginRequestImplFromJson(Map json) => + _$LoginRequestImpl( + email: json['email'] as String, + password: json['password'] as String, + ); + +Map _$$LoginRequestImplToJson(_$LoginRequestImpl instance) => + { + 'email': instance.email, + 'password': instance.password, + }; diff --git a/compass_app/app/lib/data/services/api/model/login_response/login_response.dart b/compass_app/app/lib/data/services/api/model/login_response/login_response.dart new file mode 100644 index 000000000..bc17d6a9f --- /dev/null +++ b/compass_app/app/lib/data/services/api/model/login_response/login_response.dart @@ -0,0 +1,24 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'login_response.freezed.dart'; + +part 'login_response.g.dart'; + +/// LoginResponse model. +@freezed +class LoginResponse with _$LoginResponse { + const factory LoginResponse({ + /// The token to be used for authentication. + required String token, + + /// The user id. + required String userId, + }) = _LoginResponse; + + factory LoginResponse.fromJson(Map json) => + _$LoginResponseFromJson(json); +} diff --git a/compass_app/app/lib/data/services/api/model/login_response/login_response.freezed.dart b/compass_app/app/lib/data/services/api/model/login_response/login_response.freezed.dart new file mode 100644 index 000000000..bfc5829a6 --- /dev/null +++ b/compass_app/app/lib/data/services/api/model/login_response/login_response.freezed.dart @@ -0,0 +1,191 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'login_response.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +LoginResponse _$LoginResponseFromJson(Map json) { + return _LoginResponse.fromJson(json); +} + +/// @nodoc +mixin _$LoginResponse { + /// The token to be used for authentication. + String get token => throw _privateConstructorUsedError; + + /// The user id. + String get userId => throw _privateConstructorUsedError; + + /// Serializes this LoginResponse to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of LoginResponse + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $LoginResponseCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $LoginResponseCopyWith<$Res> { + factory $LoginResponseCopyWith( + LoginResponse value, $Res Function(LoginResponse) then) = + _$LoginResponseCopyWithImpl<$Res, LoginResponse>; + @useResult + $Res call({String token, String userId}); +} + +/// @nodoc +class _$LoginResponseCopyWithImpl<$Res, $Val extends LoginResponse> + implements $LoginResponseCopyWith<$Res> { + _$LoginResponseCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of LoginResponse + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? token = null, + Object? userId = null, + }) { + return _then(_value.copyWith( + token: null == token + ? _value.token + : token // ignore: cast_nullable_to_non_nullable + as String, + userId: null == userId + ? _value.userId + : userId // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$LoginResponseImplCopyWith<$Res> + implements $LoginResponseCopyWith<$Res> { + factory _$$LoginResponseImplCopyWith( + _$LoginResponseImpl value, $Res Function(_$LoginResponseImpl) then) = + __$$LoginResponseImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String token, String userId}); +} + +/// @nodoc +class __$$LoginResponseImplCopyWithImpl<$Res> + extends _$LoginResponseCopyWithImpl<$Res, _$LoginResponseImpl> + implements _$$LoginResponseImplCopyWith<$Res> { + __$$LoginResponseImplCopyWithImpl( + _$LoginResponseImpl _value, $Res Function(_$LoginResponseImpl) _then) + : super(_value, _then); + + /// Create a copy of LoginResponse + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? token = null, + Object? userId = null, + }) { + return _then(_$LoginResponseImpl( + token: null == token + ? _value.token + : token // ignore: cast_nullable_to_non_nullable + as String, + userId: null == userId + ? _value.userId + : userId // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$LoginResponseImpl implements _LoginResponse { + const _$LoginResponseImpl({required this.token, required this.userId}); + + factory _$LoginResponseImpl.fromJson(Map json) => + _$$LoginResponseImplFromJson(json); + + /// The token to be used for authentication. + @override + final String token; + + /// The user id. + @override + final String userId; + + @override + String toString() { + return 'LoginResponse(token: $token, userId: $userId)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoginResponseImpl && + (identical(other.token, token) || other.token == token) && + (identical(other.userId, userId) || other.userId == userId)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, token, userId); + + /// Create a copy of LoginResponse + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$LoginResponseImplCopyWith<_$LoginResponseImpl> get copyWith => + __$$LoginResponseImplCopyWithImpl<_$LoginResponseImpl>(this, _$identity); + + @override + Map toJson() { + return _$$LoginResponseImplToJson( + this, + ); + } +} + +abstract class _LoginResponse implements LoginResponse { + const factory _LoginResponse( + {required final String token, + required final String userId}) = _$LoginResponseImpl; + + factory _LoginResponse.fromJson(Map json) = + _$LoginResponseImpl.fromJson; + + /// The token to be used for authentication. + @override + String get token; + + /// The user id. + @override + String get userId; + + /// Create a copy of LoginResponse + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$LoginResponseImplCopyWith<_$LoginResponseImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/app/lib/data/services/api/model/login_response/login_response.g.dart b/compass_app/app/lib/data/services/api/model/login_response/login_response.g.dart new file mode 100644 index 000000000..f1ee1db63 --- /dev/null +++ b/compass_app/app/lib/data/services/api/model/login_response/login_response.g.dart @@ -0,0 +1,19 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'login_response.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$LoginResponseImpl _$$LoginResponseImplFromJson(Map json) => + _$LoginResponseImpl( + token: json['token'] as String, + userId: json['userId'] as String, + ); + +Map _$$LoginResponseImplToJson(_$LoginResponseImpl instance) => + { + 'token': instance.token, + 'userId': instance.userId, + }; diff --git a/compass_app/app/lib/data/services/api/model/user/user_api_model.dart b/compass_app/app/lib/data/services/api/model/user/user_api_model.dart new file mode 100644 index 000000000..09629cd07 --- /dev/null +++ b/compass_app/app/lib/data/services/api/model/user/user_api_model.dart @@ -0,0 +1,28 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'user_api_model.freezed.dart'; +part 'user_api_model.g.dart'; + +@freezed +abstract class UserApiModel with _$UserApiModel { + const factory UserApiModel({ + /// The user's ID. + required String id, + + /// The user's name. + required String name, + + /// The user's email. + required String email, + + /// The user's picture URL. + required String picture, + }) = _UserApiModel; + + factory UserApiModel.fromJson(Map json) => + _$UserApiModelFromJson(json); +} diff --git a/compass_app/app/lib/data/services/api/model/user/user_api_model.freezed.dart b/compass_app/app/lib/data/services/api/model/user/user_api_model.freezed.dart new file mode 100644 index 000000000..6725b7f02 --- /dev/null +++ b/compass_app/app/lib/data/services/api/model/user/user_api_model.freezed.dart @@ -0,0 +1,241 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'user_api_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +UserApiModel _$UserApiModelFromJson(Map json) { + return _UserApiModel.fromJson(json); +} + +/// @nodoc +mixin _$UserApiModel { + /// The user's ID. + String get id => throw _privateConstructorUsedError; + + /// The user's name. + String get name => throw _privateConstructorUsedError; + + /// The user's email. + String get email => throw _privateConstructorUsedError; + + /// The user's picture URL. + String get picture => throw _privateConstructorUsedError; + + /// Serializes this UserApiModel to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of UserApiModel + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $UserApiModelCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $UserApiModelCopyWith<$Res> { + factory $UserApiModelCopyWith( + UserApiModel value, $Res Function(UserApiModel) then) = + _$UserApiModelCopyWithImpl<$Res, UserApiModel>; + @useResult + $Res call({String id, String name, String email, String picture}); +} + +/// @nodoc +class _$UserApiModelCopyWithImpl<$Res, $Val extends UserApiModel> + implements $UserApiModelCopyWith<$Res> { + _$UserApiModelCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of UserApiModel + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? name = null, + Object? email = null, + Object? picture = null, + }) { + return _then(_value.copyWith( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + email: null == email + ? _value.email + : email // ignore: cast_nullable_to_non_nullable + as String, + picture: null == picture + ? _value.picture + : picture // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$UserApiModelImplCopyWith<$Res> + implements $UserApiModelCopyWith<$Res> { + factory _$$UserApiModelImplCopyWith( + _$UserApiModelImpl value, $Res Function(_$UserApiModelImpl) then) = + __$$UserApiModelImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String id, String name, String email, String picture}); +} + +/// @nodoc +class __$$UserApiModelImplCopyWithImpl<$Res> + extends _$UserApiModelCopyWithImpl<$Res, _$UserApiModelImpl> + implements _$$UserApiModelImplCopyWith<$Res> { + __$$UserApiModelImplCopyWithImpl( + _$UserApiModelImpl _value, $Res Function(_$UserApiModelImpl) _then) + : super(_value, _then); + + /// Create a copy of UserApiModel + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? name = null, + Object? email = null, + Object? picture = null, + }) { + return _then(_$UserApiModelImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + email: null == email + ? _value.email + : email // ignore: cast_nullable_to_non_nullable + as String, + picture: null == picture + ? _value.picture + : picture // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$UserApiModelImpl implements _UserApiModel { + const _$UserApiModelImpl( + {required this.id, + required this.name, + required this.email, + required this.picture}); + + factory _$UserApiModelImpl.fromJson(Map json) => + _$$UserApiModelImplFromJson(json); + + /// The user's ID. + @override + final String id; + + /// The user's name. + @override + final String name; + + /// The user's email. + @override + final String email; + + /// The user's picture URL. + @override + final String picture; + + @override + String toString() { + return 'UserApiModel(id: $id, name: $name, email: $email, picture: $picture)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$UserApiModelImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.name, name) || other.name == name) && + (identical(other.email, email) || other.email == email) && + (identical(other.picture, picture) || other.picture == picture)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, id, name, email, picture); + + /// Create a copy of UserApiModel + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$UserApiModelImplCopyWith<_$UserApiModelImpl> get copyWith => + __$$UserApiModelImplCopyWithImpl<_$UserApiModelImpl>(this, _$identity); + + @override + Map toJson() { + return _$$UserApiModelImplToJson( + this, + ); + } +} + +abstract class _UserApiModel implements UserApiModel { + const factory _UserApiModel( + {required final String id, + required final String name, + required final String email, + required final String picture}) = _$UserApiModelImpl; + + factory _UserApiModel.fromJson(Map json) = + _$UserApiModelImpl.fromJson; + + /// The user's ID. + @override + String get id; + + /// The user's name. + @override + String get name; + + /// The user's email. + @override + String get email; + + /// The user's picture URL. + @override + String get picture; + + /// Create a copy of UserApiModel + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$UserApiModelImplCopyWith<_$UserApiModelImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/app/lib/data/services/api/model/user/user_api_model.g.dart b/compass_app/app/lib/data/services/api/model/user/user_api_model.g.dart new file mode 100644 index 000000000..b40cb814a --- /dev/null +++ b/compass_app/app/lib/data/services/api/model/user/user_api_model.g.dart @@ -0,0 +1,23 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user_api_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$UserApiModelImpl _$$UserApiModelImplFromJson(Map json) => + _$UserApiModelImpl( + id: json['id'] as String, + name: json['name'] as String, + email: json['email'] as String, + picture: json['picture'] as String, + ); + +Map _$$UserApiModelImplToJson(_$UserApiModelImpl instance) => + { + 'id': instance.id, + 'name': instance.name, + 'email': instance.email, + 'picture': instance.picture, + }; diff --git a/compass_app/app/lib/data/services/local/local_data_service.dart b/compass_app/app/lib/data/services/local/local_data_service.dart new file mode 100644 index 000000000..c88828b2d --- /dev/null +++ b/compass_app/app/lib/data/services/local/local_data_service.dart @@ -0,0 +1,71 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; + +import 'package:flutter/services.dart'; + +import '../../../config/assets.dart'; +import '../../../domain/models/activity/activity.dart'; +import '../../../domain/models/continent/continent.dart'; +import '../../../domain/models/destination/destination.dart'; +import '../../../domain/models/user/user.dart'; + +class LocalDataService { + List getContinents() { + return [ + const Continent( + name: 'Europe', + imageUrl: 'https://rstr.in/google/tripedia/TmR12QdlVTT', + ), + const Continent( + name: 'Asia', + imageUrl: 'https://rstr.in/google/tripedia/VJ8BXlQg8O1', + ), + const Continent( + name: 'South America', + imageUrl: 'https://rstr.in/google/tripedia/flm_-o1aI8e', + ), + const Continent( + name: 'Africa', + imageUrl: 'https://rstr.in/google/tripedia/-nzi8yFOBpF', + ), + const Continent( + name: 'North America', + imageUrl: 'https://rstr.in/google/tripedia/jlbgFDrSUVE', + ), + const Continent( + name: 'Oceania', + imageUrl: 'https://rstr.in/google/tripedia/vxyrDE-fZVL', + ), + const Continent( + name: 'Australia', + imageUrl: 'https://rstr.in/google/tripedia/z6vy6HeRyvZ', + ), + ]; + } + + Future> getActivities() async { + final json = await _loadStringAsset(Assets.activities); + return json.map((json) => Activity.fromJson(json)).toList(); + } + + Future> getDestinations() async { + final json = await _loadStringAsset(Assets.destinations); + return json.map((json) => Destination.fromJson(json)).toList(); + } + + Future>> _loadStringAsset(String asset) async { + final localData = await rootBundle.loadString(asset); + return (jsonDecode(localData) as List).cast>(); + } + + User getUser() { + return const User( + name: 'Sofie', + // For demo purposes we use a local asset + picture: 'assets/user.jpg', + ); + } +} diff --git a/compass_app/app/lib/data/services/shared_preferences_service.dart b/compass_app/app/lib/data/services/shared_preferences_service.dart new file mode 100644 index 000000000..05a684601 --- /dev/null +++ b/compass_app/app/lib/data/services/shared_preferences_service.dart @@ -0,0 +1,41 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:logging/logging.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import '../../utils/result.dart'; + +class SharedPreferencesService { + static const _tokenKey = 'TOKEN'; + final _log = Logger('SharedPreferencesService'); + + Future> fetchToken() async { + try { + final sharedPreferences = await SharedPreferences.getInstance(); + _log.finer('Got token from SharedPreferences'); + return Result.ok(sharedPreferences.getString(_tokenKey)); + } on Exception catch (e) { + _log.warning('Failed to get token', e); + return Result.error(e); + } + } + + Future> saveToken(String? token) async { + try { + final sharedPreferences = await SharedPreferences.getInstance(); + if (token == null) { + _log.finer('Removed token'); + await sharedPreferences.remove(_tokenKey); + } else { + _log.finer('Replaced token'); + await sharedPreferences.setString(_tokenKey, token); + } + return Result.ok(null); + } on Exception catch (e) { + _log.warning('Failed to set token', e); + return Result.error(e); + } + } +} diff --git a/compass_app/app/lib/domain/models/activity/activity.dart b/compass_app/app/lib/domain/models/activity/activity.dart new file mode 100644 index 000000000..eef66e8dc --- /dev/null +++ b/compass_app/app/lib/domain/models/activity/activity.dart @@ -0,0 +1,56 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'activity.freezed.dart'; + +part 'activity.g.dart'; + +enum TimeOfDay { + any, + morning, + afternoon, + evening, + night, +} + +@freezed +class Activity with _$Activity { + const factory Activity({ + /// e.g. 'Glacier Trekking and Ice Climbing' + required String name, + + /// e.g. 'Embark on a thrilling adventure exploring the awe-inspiring glaciers of Alaska. Hike across the icy terrain, marvel at the deep blue crevasses, and even try your hand at ice climbing for an unforgettable experience.' + required String description, + + /// e.g. 'Matanuska Glacier or Mendenhall Glacier' + required String locationName, + + /// Duration in days. + /// e.g. 8 + required int duration, + + /// e.g. 'morning' + required TimeOfDay timeOfDay, + + /// e.g. false + required bool familyFriendly, + + /// e.g. 4 + required int price, + + /// e.g. 'alaska' + required String destinationRef, + + /// e.g. 'glacier-trekking-and-ice-climbing' + required String ref, + + /// e.g. 'https://storage.googleapis.com/tripedia-images/activities/alaska_glacier-trekking-and-ice-climbing.jpg' + required String imageUrl, + }) = _Activity; + + factory Activity.fromJson(Map json) => + _$ActivityFromJson(json); +} diff --git a/compass_app/app/lib/domain/models/activity/activity.freezed.dart b/compass_app/app/lib/domain/models/activity/activity.freezed.dart new file mode 100644 index 000000000..6e277d0bc --- /dev/null +++ b/compass_app/app/lib/domain/models/activity/activity.freezed.dart @@ -0,0 +1,425 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'activity.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +Activity _$ActivityFromJson(Map json) { + return _Activity.fromJson(json); +} + +/// @nodoc +mixin _$Activity { + /// e.g. 'Glacier Trekking and Ice Climbing' + String get name => throw _privateConstructorUsedError; + + /// e.g. 'Embark on a thrilling adventure exploring the awe-inspiring glaciers of Alaska. Hike across the icy terrain, marvel at the deep blue crevasses, and even try your hand at ice climbing for an unforgettable experience.' + String get description => throw _privateConstructorUsedError; + + /// e.g. 'Matanuska Glacier or Mendenhall Glacier' + String get locationName => throw _privateConstructorUsedError; + + /// Duration in days. + /// e.g. 8 + int get duration => throw _privateConstructorUsedError; + + /// e.g. 'morning' + TimeOfDay get timeOfDay => throw _privateConstructorUsedError; + + /// e.g. false + bool get familyFriendly => throw _privateConstructorUsedError; + + /// e.g. 4 + int get price => throw _privateConstructorUsedError; + + /// e.g. 'alaska' + String get destinationRef => throw _privateConstructorUsedError; + + /// e.g. 'glacier-trekking-and-ice-climbing' + String get ref => throw _privateConstructorUsedError; + + /// e.g. 'https://storage.googleapis.com/tripedia-images/activities/alaska_glacier-trekking-and-ice-climbing.jpg' + String get imageUrl => throw _privateConstructorUsedError; + + /// Serializes this Activity to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Activity + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $ActivityCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ActivityCopyWith<$Res> { + factory $ActivityCopyWith(Activity value, $Res Function(Activity) then) = + _$ActivityCopyWithImpl<$Res, Activity>; + @useResult + $Res call( + {String name, + String description, + String locationName, + int duration, + TimeOfDay timeOfDay, + bool familyFriendly, + int price, + String destinationRef, + String ref, + String imageUrl}); +} + +/// @nodoc +class _$ActivityCopyWithImpl<$Res, $Val extends Activity> + implements $ActivityCopyWith<$Res> { + _$ActivityCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Activity + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = null, + Object? description = null, + Object? locationName = null, + Object? duration = null, + Object? timeOfDay = null, + Object? familyFriendly = null, + Object? price = null, + Object? destinationRef = null, + Object? ref = null, + Object? imageUrl = null, + }) { + return _then(_value.copyWith( + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + description: null == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + locationName: null == locationName + ? _value.locationName + : locationName // ignore: cast_nullable_to_non_nullable + as String, + duration: null == duration + ? _value.duration + : duration // ignore: cast_nullable_to_non_nullable + as int, + timeOfDay: null == timeOfDay + ? _value.timeOfDay + : timeOfDay // ignore: cast_nullable_to_non_nullable + as TimeOfDay, + familyFriendly: null == familyFriendly + ? _value.familyFriendly + : familyFriendly // ignore: cast_nullable_to_non_nullable + as bool, + price: null == price + ? _value.price + : price // ignore: cast_nullable_to_non_nullable + as int, + destinationRef: null == destinationRef + ? _value.destinationRef + : destinationRef // ignore: cast_nullable_to_non_nullable + as String, + ref: null == ref + ? _value.ref + : ref // ignore: cast_nullable_to_non_nullable + as String, + imageUrl: null == imageUrl + ? _value.imageUrl + : imageUrl // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$ActivityImplCopyWith<$Res> + implements $ActivityCopyWith<$Res> { + factory _$$ActivityImplCopyWith( + _$ActivityImpl value, $Res Function(_$ActivityImpl) then) = + __$$ActivityImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String name, + String description, + String locationName, + int duration, + TimeOfDay timeOfDay, + bool familyFriendly, + int price, + String destinationRef, + String ref, + String imageUrl}); +} + +/// @nodoc +class __$$ActivityImplCopyWithImpl<$Res> + extends _$ActivityCopyWithImpl<$Res, _$ActivityImpl> + implements _$$ActivityImplCopyWith<$Res> { + __$$ActivityImplCopyWithImpl( + _$ActivityImpl _value, $Res Function(_$ActivityImpl) _then) + : super(_value, _then); + + /// Create a copy of Activity + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = null, + Object? description = null, + Object? locationName = null, + Object? duration = null, + Object? timeOfDay = null, + Object? familyFriendly = null, + Object? price = null, + Object? destinationRef = null, + Object? ref = null, + Object? imageUrl = null, + }) { + return _then(_$ActivityImpl( + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + description: null == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + locationName: null == locationName + ? _value.locationName + : locationName // ignore: cast_nullable_to_non_nullable + as String, + duration: null == duration + ? _value.duration + : duration // ignore: cast_nullable_to_non_nullable + as int, + timeOfDay: null == timeOfDay + ? _value.timeOfDay + : timeOfDay // ignore: cast_nullable_to_non_nullable + as TimeOfDay, + familyFriendly: null == familyFriendly + ? _value.familyFriendly + : familyFriendly // ignore: cast_nullable_to_non_nullable + as bool, + price: null == price + ? _value.price + : price // ignore: cast_nullable_to_non_nullable + as int, + destinationRef: null == destinationRef + ? _value.destinationRef + : destinationRef // ignore: cast_nullable_to_non_nullable + as String, + ref: null == ref + ? _value.ref + : ref // ignore: cast_nullable_to_non_nullable + as String, + imageUrl: null == imageUrl + ? _value.imageUrl + : imageUrl // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$ActivityImpl implements _Activity { + const _$ActivityImpl( + {required this.name, + required this.description, + required this.locationName, + required this.duration, + required this.timeOfDay, + required this.familyFriendly, + required this.price, + required this.destinationRef, + required this.ref, + required this.imageUrl}); + + factory _$ActivityImpl.fromJson(Map json) => + _$$ActivityImplFromJson(json); + + /// e.g. 'Glacier Trekking and Ice Climbing' + @override + final String name; + + /// e.g. 'Embark on a thrilling adventure exploring the awe-inspiring glaciers of Alaska. Hike across the icy terrain, marvel at the deep blue crevasses, and even try your hand at ice climbing for an unforgettable experience.' + @override + final String description; + + /// e.g. 'Matanuska Glacier or Mendenhall Glacier' + @override + final String locationName; + + /// Duration in days. + /// e.g. 8 + @override + final int duration; + + /// e.g. 'morning' + @override + final TimeOfDay timeOfDay; + + /// e.g. false + @override + final bool familyFriendly; + + /// e.g. 4 + @override + final int price; + + /// e.g. 'alaska' + @override + final String destinationRef; + + /// e.g. 'glacier-trekking-and-ice-climbing' + @override + final String ref; + + /// e.g. 'https://storage.googleapis.com/tripedia-images/activities/alaska_glacier-trekking-and-ice-climbing.jpg' + @override + final String imageUrl; + + @override + String toString() { + return 'Activity(name: $name, description: $description, locationName: $locationName, duration: $duration, timeOfDay: $timeOfDay, familyFriendly: $familyFriendly, price: $price, destinationRef: $destinationRef, ref: $ref, imageUrl: $imageUrl)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ActivityImpl && + (identical(other.name, name) || other.name == name) && + (identical(other.description, description) || + other.description == description) && + (identical(other.locationName, locationName) || + other.locationName == locationName) && + (identical(other.duration, duration) || + other.duration == duration) && + (identical(other.timeOfDay, timeOfDay) || + other.timeOfDay == timeOfDay) && + (identical(other.familyFriendly, familyFriendly) || + other.familyFriendly == familyFriendly) && + (identical(other.price, price) || other.price == price) && + (identical(other.destinationRef, destinationRef) || + other.destinationRef == destinationRef) && + (identical(other.ref, ref) || other.ref == ref) && + (identical(other.imageUrl, imageUrl) || + other.imageUrl == imageUrl)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + name, + description, + locationName, + duration, + timeOfDay, + familyFriendly, + price, + destinationRef, + ref, + imageUrl); + + /// Create a copy of Activity + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$ActivityImplCopyWith<_$ActivityImpl> get copyWith => + __$$ActivityImplCopyWithImpl<_$ActivityImpl>(this, _$identity); + + @override + Map toJson() { + return _$$ActivityImplToJson( + this, + ); + } +} + +abstract class _Activity implements Activity { + const factory _Activity( + {required final String name, + required final String description, + required final String locationName, + required final int duration, + required final TimeOfDay timeOfDay, + required final bool familyFriendly, + required final int price, + required final String destinationRef, + required final String ref, + required final String imageUrl}) = _$ActivityImpl; + + factory _Activity.fromJson(Map json) = + _$ActivityImpl.fromJson; + + /// e.g. 'Glacier Trekking and Ice Climbing' + @override + String get name; + + /// e.g. 'Embark on a thrilling adventure exploring the awe-inspiring glaciers of Alaska. Hike across the icy terrain, marvel at the deep blue crevasses, and even try your hand at ice climbing for an unforgettable experience.' + @override + String get description; + + /// e.g. 'Matanuska Glacier or Mendenhall Glacier' + @override + String get locationName; + + /// Duration in days. + /// e.g. 8 + @override + int get duration; + + /// e.g. 'morning' + @override + TimeOfDay get timeOfDay; + + /// e.g. false + @override + bool get familyFriendly; + + /// e.g. 4 + @override + int get price; + + /// e.g. 'alaska' + @override + String get destinationRef; + + /// e.g. 'glacier-trekking-and-ice-climbing' + @override + String get ref; + + /// e.g. 'https://storage.googleapis.com/tripedia-images/activities/alaska_glacier-trekking-and-ice-climbing.jpg' + @override + String get imageUrl; + + /// Create a copy of Activity + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$ActivityImplCopyWith<_$ActivityImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/app/lib/domain/models/activity/activity.g.dart b/compass_app/app/lib/domain/models/activity/activity.g.dart new file mode 100644 index 000000000..8ad67d674 --- /dev/null +++ b/compass_app/app/lib/domain/models/activity/activity.g.dart @@ -0,0 +1,43 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'activity.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$ActivityImpl _$$ActivityImplFromJson(Map json) => + _$ActivityImpl( + name: json['name'] as String, + description: json['description'] as String, + locationName: json['locationName'] as String, + duration: (json['duration'] as num).toInt(), + timeOfDay: $enumDecode(_$TimeOfDayEnumMap, json['timeOfDay']), + familyFriendly: json['familyFriendly'] as bool, + price: (json['price'] as num).toInt(), + destinationRef: json['destinationRef'] as String, + ref: json['ref'] as String, + imageUrl: json['imageUrl'] as String, + ); + +Map _$$ActivityImplToJson(_$ActivityImpl instance) => + { + 'name': instance.name, + 'description': instance.description, + 'locationName': instance.locationName, + 'duration': instance.duration, + 'timeOfDay': _$TimeOfDayEnumMap[instance.timeOfDay]!, + 'familyFriendly': instance.familyFriendly, + 'price': instance.price, + 'destinationRef': instance.destinationRef, + 'ref': instance.ref, + 'imageUrl': instance.imageUrl, + }; + +const _$TimeOfDayEnumMap = { + TimeOfDay.any: 'any', + TimeOfDay.morning: 'morning', + TimeOfDay.afternoon: 'afternoon', + TimeOfDay.evening: 'evening', + TimeOfDay.night: 'night', +}; diff --git a/compass_app/app/lib/domain/models/booking/booking.dart b/compass_app/app/lib/domain/models/booking/booking.dart new file mode 100644 index 000000000..e94f51b3c --- /dev/null +++ b/compass_app/app/lib/domain/models/booking/booking.dart @@ -0,0 +1,35 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +import '../activity/activity.dart'; +import '../destination/destination.dart'; + +part 'booking.freezed.dart'; +part 'booking.g.dart'; + +@freezed +class Booking with _$Booking { + const factory Booking({ + /// Optional ID of the booking. + /// May be null if the booking is not yet stored. + int? id, + + /// Start date of the trip + required DateTime startDate, + + /// End date of the trip + required DateTime endDate, + + /// Destination of the trip + required Destination destination, + + /// List of chosen activities + required List activity, + }) = _Booking; + + factory Booking.fromJson(Map json) => + _$BookingFromJson(json); +} diff --git a/compass_app/app/lib/domain/models/booking/booking.freezed.dart b/compass_app/app/lib/domain/models/booking/booking.freezed.dart new file mode 100644 index 000000000..680856e46 --- /dev/null +++ b/compass_app/app/lib/domain/models/booking/booking.freezed.dart @@ -0,0 +1,300 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'booking.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +Booking _$BookingFromJson(Map json) { + return _Booking.fromJson(json); +} + +/// @nodoc +mixin _$Booking { + /// Optional ID of the booking. + /// May be null if the booking is not yet stored. + int? get id => throw _privateConstructorUsedError; + + /// Start date of the trip + DateTime get startDate => throw _privateConstructorUsedError; + + /// End date of the trip + DateTime get endDate => throw _privateConstructorUsedError; + + /// Destination of the trip + Destination get destination => throw _privateConstructorUsedError; + + /// List of chosen activities + List get activity => throw _privateConstructorUsedError; + + /// Serializes this Booking to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Booking + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $BookingCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $BookingCopyWith<$Res> { + factory $BookingCopyWith(Booking value, $Res Function(Booking) then) = + _$BookingCopyWithImpl<$Res, Booking>; + @useResult + $Res call( + {int? id, + DateTime startDate, + DateTime endDate, + Destination destination, + List activity}); + + $DestinationCopyWith<$Res> get destination; +} + +/// @nodoc +class _$BookingCopyWithImpl<$Res, $Val extends Booking> + implements $BookingCopyWith<$Res> { + _$BookingCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Booking + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = freezed, + Object? startDate = null, + Object? endDate = null, + Object? destination = null, + Object? activity = null, + }) { + return _then(_value.copyWith( + id: freezed == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int?, + startDate: null == startDate + ? _value.startDate + : startDate // ignore: cast_nullable_to_non_nullable + as DateTime, + endDate: null == endDate + ? _value.endDate + : endDate // ignore: cast_nullable_to_non_nullable + as DateTime, + destination: null == destination + ? _value.destination + : destination // ignore: cast_nullable_to_non_nullable + as Destination, + activity: null == activity + ? _value.activity + : activity // ignore: cast_nullable_to_non_nullable + as List, + ) as $Val); + } + + /// Create a copy of Booking + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $DestinationCopyWith<$Res> get destination { + return $DestinationCopyWith<$Res>(_value.destination, (value) { + return _then(_value.copyWith(destination: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$BookingImplCopyWith<$Res> implements $BookingCopyWith<$Res> { + factory _$$BookingImplCopyWith( + _$BookingImpl value, $Res Function(_$BookingImpl) then) = + __$$BookingImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {int? id, + DateTime startDate, + DateTime endDate, + Destination destination, + List activity}); + + @override + $DestinationCopyWith<$Res> get destination; +} + +/// @nodoc +class __$$BookingImplCopyWithImpl<$Res> + extends _$BookingCopyWithImpl<$Res, _$BookingImpl> + implements _$$BookingImplCopyWith<$Res> { + __$$BookingImplCopyWithImpl( + _$BookingImpl _value, $Res Function(_$BookingImpl) _then) + : super(_value, _then); + + /// Create a copy of Booking + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = freezed, + Object? startDate = null, + Object? endDate = null, + Object? destination = null, + Object? activity = null, + }) { + return _then(_$BookingImpl( + id: freezed == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int?, + startDate: null == startDate + ? _value.startDate + : startDate // ignore: cast_nullable_to_non_nullable + as DateTime, + endDate: null == endDate + ? _value.endDate + : endDate // ignore: cast_nullable_to_non_nullable + as DateTime, + destination: null == destination + ? _value.destination + : destination // ignore: cast_nullable_to_non_nullable + as Destination, + activity: null == activity + ? _value._activity + : activity // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$BookingImpl implements _Booking { + const _$BookingImpl( + {this.id, + required this.startDate, + required this.endDate, + required this.destination, + required final List activity}) + : _activity = activity; + + factory _$BookingImpl.fromJson(Map json) => + _$$BookingImplFromJson(json); + + /// Optional ID of the booking. + /// May be null if the booking is not yet stored. + @override + final int? id; + + /// Start date of the trip + @override + final DateTime startDate; + + /// End date of the trip + @override + final DateTime endDate; + + /// Destination of the trip + @override + final Destination destination; + + /// List of chosen activities + final List _activity; + + /// List of chosen activities + @override + List get activity { + if (_activity is EqualUnmodifiableListView) return _activity; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_activity); + } + + @override + String toString() { + return 'Booking(id: $id, startDate: $startDate, endDate: $endDate, destination: $destination, activity: $activity)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$BookingImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.startDate, startDate) || + other.startDate == startDate) && + (identical(other.endDate, endDate) || other.endDate == endDate) && + (identical(other.destination, destination) || + other.destination == destination) && + const DeepCollectionEquality().equals(other._activity, _activity)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, id, startDate, endDate, + destination, const DeepCollectionEquality().hash(_activity)); + + /// Create a copy of Booking + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$BookingImplCopyWith<_$BookingImpl> get copyWith => + __$$BookingImplCopyWithImpl<_$BookingImpl>(this, _$identity); + + @override + Map toJson() { + return _$$BookingImplToJson( + this, + ); + } +} + +abstract class _Booking implements Booking { + const factory _Booking( + {final int? id, + required final DateTime startDate, + required final DateTime endDate, + required final Destination destination, + required final List activity}) = _$BookingImpl; + + factory _Booking.fromJson(Map json) = _$BookingImpl.fromJson; + + /// Optional ID of the booking. + /// May be null if the booking is not yet stored. + @override + int? get id; + + /// Start date of the trip + @override + DateTime get startDate; + + /// End date of the trip + @override + DateTime get endDate; + + /// Destination of the trip + @override + Destination get destination; + + /// List of chosen activities + @override + List get activity; + + /// Create a copy of Booking + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$BookingImplCopyWith<_$BookingImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/app/lib/domain/models/booking/booking.g.dart b/compass_app/app/lib/domain/models/booking/booking.g.dart new file mode 100644 index 000000000..65a1990f9 --- /dev/null +++ b/compass_app/app/lib/domain/models/booking/booking.g.dart @@ -0,0 +1,28 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'booking.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$BookingImpl _$$BookingImplFromJson(Map json) => + _$BookingImpl( + id: (json['id'] as num?)?.toInt(), + startDate: DateTime.parse(json['startDate'] as String), + endDate: DateTime.parse(json['endDate'] as String), + destination: + Destination.fromJson(json['destination'] as Map), + activity: (json['activity'] as List) + .map((e) => Activity.fromJson(e as Map)) + .toList(), + ); + +Map _$$BookingImplToJson(_$BookingImpl instance) => + { + 'id': instance.id, + 'startDate': instance.startDate.toIso8601String(), + 'endDate': instance.endDate.toIso8601String(), + 'destination': instance.destination, + 'activity': instance.activity, + }; diff --git a/compass_app/app/lib/domain/models/booking/booking_summary.dart b/compass_app/app/lib/domain/models/booking/booking_summary.dart new file mode 100644 index 000000000..4836e5ec5 --- /dev/null +++ b/compass_app/app/lib/domain/models/booking/booking_summary.dart @@ -0,0 +1,34 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'booking_summary.freezed.dart'; +part 'booking_summary.g.dart'; + +/// BookingSummary contains the necessary data to display a booking +/// in the user home screen, but lacks the rest of the booking data +/// like activitities or destination. +/// +/// Use the [BookingRepository] to obtain a full [Booking] +/// using the [BookingSummary.id]. +@freezed +class BookingSummary with _$BookingSummary { + const factory BookingSummary({ + /// Booking id + required int id, + + /// Name to be displayed + required String name, + + /// Start date of the booking + required DateTime startDate, + + /// End date of the booking + required DateTime endDate, + }) = _BookingSummary; + + factory BookingSummary.fromJson(Map json) => + _$BookingSummaryFromJson(json); +} diff --git a/compass_app/app/lib/domain/models/booking/booking_summary.freezed.dart b/compass_app/app/lib/domain/models/booking/booking_summary.freezed.dart new file mode 100644 index 000000000..ddfe78ae7 --- /dev/null +++ b/compass_app/app/lib/domain/models/booking/booking_summary.freezed.dart @@ -0,0 +1,243 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'booking_summary.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +BookingSummary _$BookingSummaryFromJson(Map json) { + return _BookingSummary.fromJson(json); +} + +/// @nodoc +mixin _$BookingSummary { + /// Booking id + int get id => throw _privateConstructorUsedError; + + /// Name to be displayed + String get name => throw _privateConstructorUsedError; + + /// Start date of the booking + DateTime get startDate => throw _privateConstructorUsedError; + + /// End date of the booking + DateTime get endDate => throw _privateConstructorUsedError; + + /// Serializes this BookingSummary to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of BookingSummary + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $BookingSummaryCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $BookingSummaryCopyWith<$Res> { + factory $BookingSummaryCopyWith( + BookingSummary value, $Res Function(BookingSummary) then) = + _$BookingSummaryCopyWithImpl<$Res, BookingSummary>; + @useResult + $Res call({int id, String name, DateTime startDate, DateTime endDate}); +} + +/// @nodoc +class _$BookingSummaryCopyWithImpl<$Res, $Val extends BookingSummary> + implements $BookingSummaryCopyWith<$Res> { + _$BookingSummaryCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of BookingSummary + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? name = null, + Object? startDate = null, + Object? endDate = null, + }) { + return _then(_value.copyWith( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + startDate: null == startDate + ? _value.startDate + : startDate // ignore: cast_nullable_to_non_nullable + as DateTime, + endDate: null == endDate + ? _value.endDate + : endDate // ignore: cast_nullable_to_non_nullable + as DateTime, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$BookingSummaryImplCopyWith<$Res> + implements $BookingSummaryCopyWith<$Res> { + factory _$$BookingSummaryImplCopyWith(_$BookingSummaryImpl value, + $Res Function(_$BookingSummaryImpl) then) = + __$$BookingSummaryImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({int id, String name, DateTime startDate, DateTime endDate}); +} + +/// @nodoc +class __$$BookingSummaryImplCopyWithImpl<$Res> + extends _$BookingSummaryCopyWithImpl<$Res, _$BookingSummaryImpl> + implements _$$BookingSummaryImplCopyWith<$Res> { + __$$BookingSummaryImplCopyWithImpl( + _$BookingSummaryImpl _value, $Res Function(_$BookingSummaryImpl) _then) + : super(_value, _then); + + /// Create a copy of BookingSummary + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? name = null, + Object? startDate = null, + Object? endDate = null, + }) { + return _then(_$BookingSummaryImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + startDate: null == startDate + ? _value.startDate + : startDate // ignore: cast_nullable_to_non_nullable + as DateTime, + endDate: null == endDate + ? _value.endDate + : endDate // ignore: cast_nullable_to_non_nullable + as DateTime, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$BookingSummaryImpl implements _BookingSummary { + const _$BookingSummaryImpl( + {required this.id, + required this.name, + required this.startDate, + required this.endDate}); + + factory _$BookingSummaryImpl.fromJson(Map json) => + _$$BookingSummaryImplFromJson(json); + + /// Booking id + @override + final int id; + + /// Name to be displayed + @override + final String name; + + /// Start date of the booking + @override + final DateTime startDate; + + /// End date of the booking + @override + final DateTime endDate; + + @override + String toString() { + return 'BookingSummary(id: $id, name: $name, startDate: $startDate, endDate: $endDate)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$BookingSummaryImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.name, name) || other.name == name) && + (identical(other.startDate, startDate) || + other.startDate == startDate) && + (identical(other.endDate, endDate) || other.endDate == endDate)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, id, name, startDate, endDate); + + /// Create a copy of BookingSummary + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$BookingSummaryImplCopyWith<_$BookingSummaryImpl> get copyWith => + __$$BookingSummaryImplCopyWithImpl<_$BookingSummaryImpl>( + this, _$identity); + + @override + Map toJson() { + return _$$BookingSummaryImplToJson( + this, + ); + } +} + +abstract class _BookingSummary implements BookingSummary { + const factory _BookingSummary( + {required final int id, + required final String name, + required final DateTime startDate, + required final DateTime endDate}) = _$BookingSummaryImpl; + + factory _BookingSummary.fromJson(Map json) = + _$BookingSummaryImpl.fromJson; + + /// Booking id + @override + int get id; + + /// Name to be displayed + @override + String get name; + + /// Start date of the booking + @override + DateTime get startDate; + + /// End date of the booking + @override + DateTime get endDate; + + /// Create a copy of BookingSummary + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$BookingSummaryImplCopyWith<_$BookingSummaryImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/app/lib/domain/models/booking/booking_summary.g.dart b/compass_app/app/lib/domain/models/booking/booking_summary.g.dart new file mode 100644 index 000000000..456acf50b --- /dev/null +++ b/compass_app/app/lib/domain/models/booking/booking_summary.g.dart @@ -0,0 +1,24 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'booking_summary.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$BookingSummaryImpl _$$BookingSummaryImplFromJson(Map json) => + _$BookingSummaryImpl( + id: (json['id'] as num).toInt(), + name: json['name'] as String, + startDate: DateTime.parse(json['startDate'] as String), + endDate: DateTime.parse(json['endDate'] as String), + ); + +Map _$$BookingSummaryImplToJson( + _$BookingSummaryImpl instance) => + { + 'id': instance.id, + 'name': instance.name, + 'startDate': instance.startDate.toIso8601String(), + 'endDate': instance.endDate.toIso8601String(), + }; diff --git a/compass_app/app/lib/domain/models/continent/continent.dart b/compass_app/app/lib/domain/models/continent/continent.dart new file mode 100644 index 000000000..e0a309d59 --- /dev/null +++ b/compass_app/app/lib/domain/models/continent/continent.dart @@ -0,0 +1,23 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'continent.freezed.dart'; + +part 'continent.g.dart'; + +@freezed +class Continent with _$Continent { + const factory Continent({ + /// e.g. 'Europe' + required String name, + + /// e.g. 'https://rstr.in/google/tripedia/TmR12QdlVTT' + required String imageUrl, + }) = _Continent; + + factory Continent.fromJson(Map json) => + _$ContinentFromJson(json); +} diff --git a/compass_app/app/lib/domain/models/continent/continent.freezed.dart b/compass_app/app/lib/domain/models/continent/continent.freezed.dart new file mode 100644 index 000000000..f69d01046 --- /dev/null +++ b/compass_app/app/lib/domain/models/continent/continent.freezed.dart @@ -0,0 +1,191 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'continent.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +Continent _$ContinentFromJson(Map json) { + return _Continent.fromJson(json); +} + +/// @nodoc +mixin _$Continent { + /// e.g. 'Europe' + String get name => throw _privateConstructorUsedError; + + /// e.g. 'https://rstr.in/google/tripedia/TmR12QdlVTT' + String get imageUrl => throw _privateConstructorUsedError; + + /// Serializes this Continent to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Continent + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $ContinentCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ContinentCopyWith<$Res> { + factory $ContinentCopyWith(Continent value, $Res Function(Continent) then) = + _$ContinentCopyWithImpl<$Res, Continent>; + @useResult + $Res call({String name, String imageUrl}); +} + +/// @nodoc +class _$ContinentCopyWithImpl<$Res, $Val extends Continent> + implements $ContinentCopyWith<$Res> { + _$ContinentCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Continent + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = null, + Object? imageUrl = null, + }) { + return _then(_value.copyWith( + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + imageUrl: null == imageUrl + ? _value.imageUrl + : imageUrl // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$ContinentImplCopyWith<$Res> + implements $ContinentCopyWith<$Res> { + factory _$$ContinentImplCopyWith( + _$ContinentImpl value, $Res Function(_$ContinentImpl) then) = + __$$ContinentImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String name, String imageUrl}); +} + +/// @nodoc +class __$$ContinentImplCopyWithImpl<$Res> + extends _$ContinentCopyWithImpl<$Res, _$ContinentImpl> + implements _$$ContinentImplCopyWith<$Res> { + __$$ContinentImplCopyWithImpl( + _$ContinentImpl _value, $Res Function(_$ContinentImpl) _then) + : super(_value, _then); + + /// Create a copy of Continent + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = null, + Object? imageUrl = null, + }) { + return _then(_$ContinentImpl( + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + imageUrl: null == imageUrl + ? _value.imageUrl + : imageUrl // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$ContinentImpl implements _Continent { + const _$ContinentImpl({required this.name, required this.imageUrl}); + + factory _$ContinentImpl.fromJson(Map json) => + _$$ContinentImplFromJson(json); + + /// e.g. 'Europe' + @override + final String name; + + /// e.g. 'https://rstr.in/google/tripedia/TmR12QdlVTT' + @override + final String imageUrl; + + @override + String toString() { + return 'Continent(name: $name, imageUrl: $imageUrl)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ContinentImpl && + (identical(other.name, name) || other.name == name) && + (identical(other.imageUrl, imageUrl) || + other.imageUrl == imageUrl)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, name, imageUrl); + + /// Create a copy of Continent + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$ContinentImplCopyWith<_$ContinentImpl> get copyWith => + __$$ContinentImplCopyWithImpl<_$ContinentImpl>(this, _$identity); + + @override + Map toJson() { + return _$$ContinentImplToJson( + this, + ); + } +} + +abstract class _Continent implements Continent { + const factory _Continent( + {required final String name, + required final String imageUrl}) = _$ContinentImpl; + + factory _Continent.fromJson(Map json) = + _$ContinentImpl.fromJson; + + /// e.g. 'Europe' + @override + String get name; + + /// e.g. 'https://rstr.in/google/tripedia/TmR12QdlVTT' + @override + String get imageUrl; + + /// Create a copy of Continent + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$ContinentImplCopyWith<_$ContinentImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/app/lib/domain/models/continent/continent.g.dart b/compass_app/app/lib/domain/models/continent/continent.g.dart new file mode 100644 index 000000000..41aba78b6 --- /dev/null +++ b/compass_app/app/lib/domain/models/continent/continent.g.dart @@ -0,0 +1,19 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'continent.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$ContinentImpl _$$ContinentImplFromJson(Map json) => + _$ContinentImpl( + name: json['name'] as String, + imageUrl: json['imageUrl'] as String, + ); + +Map _$$ContinentImplToJson(_$ContinentImpl instance) => + { + 'name': instance.name, + 'imageUrl': instance.imageUrl, + }; diff --git a/compass_app/app/lib/domain/models/destination/destination.dart b/compass_app/app/lib/domain/models/destination/destination.dart new file mode 100644 index 000000000..457a12533 --- /dev/null +++ b/compass_app/app/lib/domain/models/destination/destination.dart @@ -0,0 +1,38 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'destination.freezed.dart'; + +part 'destination.g.dart'; + +@freezed +class Destination with _$Destination { + const factory Destination({ + /// e.g. 'alaska' + required String ref, + + /// e.g. 'Alaska' + required String name, + + /// e.g. 'United States' + required String country, + + /// e.g. 'North America' + required String continent, + + /// e.g. 'Alaska is a haven for outdoor enthusiasts ...' + required String knownFor, + + /// e.g. ['Mountain', 'Off-the-beaten-path', 'Wildlife watching'] + required List tags, + + /// e.g. 'https://storage.googleapis.com/tripedia-images/destinations/alaska.jpg' + required String imageUrl, + }) = _Destination; + + factory Destination.fromJson(Map json) => + _$DestinationFromJson(json); +} diff --git a/compass_app/app/lib/domain/models/destination/destination.freezed.dart b/compass_app/app/lib/domain/models/destination/destination.freezed.dart new file mode 100644 index 000000000..faaec5902 --- /dev/null +++ b/compass_app/app/lib/domain/models/destination/destination.freezed.dart @@ -0,0 +1,339 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'destination.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +Destination _$DestinationFromJson(Map json) { + return _Destination.fromJson(json); +} + +/// @nodoc +mixin _$Destination { + /// e.g. 'alaska' + String get ref => throw _privateConstructorUsedError; + + /// e.g. 'Alaska' + String get name => throw _privateConstructorUsedError; + + /// e.g. 'United States' + String get country => throw _privateConstructorUsedError; + + /// e.g. 'North America' + String get continent => throw _privateConstructorUsedError; + + /// e.g. 'Alaska is a haven for outdoor enthusiasts ...' + String get knownFor => throw _privateConstructorUsedError; + + /// e.g. ['Mountain', 'Off-the-beaten-path', 'Wildlife watching'] + List get tags => throw _privateConstructorUsedError; + + /// e.g. 'https://storage.googleapis.com/tripedia-images/destinations/alaska.jpg' + String get imageUrl => throw _privateConstructorUsedError; + + /// Serializes this Destination to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Destination + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $DestinationCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $DestinationCopyWith<$Res> { + factory $DestinationCopyWith( + Destination value, $Res Function(Destination) then) = + _$DestinationCopyWithImpl<$Res, Destination>; + @useResult + $Res call( + {String ref, + String name, + String country, + String continent, + String knownFor, + List tags, + String imageUrl}); +} + +/// @nodoc +class _$DestinationCopyWithImpl<$Res, $Val extends Destination> + implements $DestinationCopyWith<$Res> { + _$DestinationCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Destination + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? ref = null, + Object? name = null, + Object? country = null, + Object? continent = null, + Object? knownFor = null, + Object? tags = null, + Object? imageUrl = null, + }) { + return _then(_value.copyWith( + ref: null == ref + ? _value.ref + : ref // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + country: null == country + ? _value.country + : country // ignore: cast_nullable_to_non_nullable + as String, + continent: null == continent + ? _value.continent + : continent // ignore: cast_nullable_to_non_nullable + as String, + knownFor: null == knownFor + ? _value.knownFor + : knownFor // ignore: cast_nullable_to_non_nullable + as String, + tags: null == tags + ? _value.tags + : tags // ignore: cast_nullable_to_non_nullable + as List, + imageUrl: null == imageUrl + ? _value.imageUrl + : imageUrl // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$DestinationImplCopyWith<$Res> + implements $DestinationCopyWith<$Res> { + factory _$$DestinationImplCopyWith( + _$DestinationImpl value, $Res Function(_$DestinationImpl) then) = + __$$DestinationImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String ref, + String name, + String country, + String continent, + String knownFor, + List tags, + String imageUrl}); +} + +/// @nodoc +class __$$DestinationImplCopyWithImpl<$Res> + extends _$DestinationCopyWithImpl<$Res, _$DestinationImpl> + implements _$$DestinationImplCopyWith<$Res> { + __$$DestinationImplCopyWithImpl( + _$DestinationImpl _value, $Res Function(_$DestinationImpl) _then) + : super(_value, _then); + + /// Create a copy of Destination + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? ref = null, + Object? name = null, + Object? country = null, + Object? continent = null, + Object? knownFor = null, + Object? tags = null, + Object? imageUrl = null, + }) { + return _then(_$DestinationImpl( + ref: null == ref + ? _value.ref + : ref // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + country: null == country + ? _value.country + : country // ignore: cast_nullable_to_non_nullable + as String, + continent: null == continent + ? _value.continent + : continent // ignore: cast_nullable_to_non_nullable + as String, + knownFor: null == knownFor + ? _value.knownFor + : knownFor // ignore: cast_nullable_to_non_nullable + as String, + tags: null == tags + ? _value._tags + : tags // ignore: cast_nullable_to_non_nullable + as List, + imageUrl: null == imageUrl + ? _value.imageUrl + : imageUrl // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$DestinationImpl implements _Destination { + const _$DestinationImpl( + {required this.ref, + required this.name, + required this.country, + required this.continent, + required this.knownFor, + required final List tags, + required this.imageUrl}) + : _tags = tags; + + factory _$DestinationImpl.fromJson(Map json) => + _$$DestinationImplFromJson(json); + + /// e.g. 'alaska' + @override + final String ref; + + /// e.g. 'Alaska' + @override + final String name; + + /// e.g. 'United States' + @override + final String country; + + /// e.g. 'North America' + @override + final String continent; + + /// e.g. 'Alaska is a haven for outdoor enthusiasts ...' + @override + final String knownFor; + + /// e.g. ['Mountain', 'Off-the-beaten-path', 'Wildlife watching'] + final List _tags; + + /// e.g. ['Mountain', 'Off-the-beaten-path', 'Wildlife watching'] + @override + List get tags { + if (_tags is EqualUnmodifiableListView) return _tags; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_tags); + } + + /// e.g. 'https://storage.googleapis.com/tripedia-images/destinations/alaska.jpg' + @override + final String imageUrl; + + @override + String toString() { + return 'Destination(ref: $ref, name: $name, country: $country, continent: $continent, knownFor: $knownFor, tags: $tags, imageUrl: $imageUrl)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$DestinationImpl && + (identical(other.ref, ref) || other.ref == ref) && + (identical(other.name, name) || other.name == name) && + (identical(other.country, country) || other.country == country) && + (identical(other.continent, continent) || + other.continent == continent) && + (identical(other.knownFor, knownFor) || + other.knownFor == knownFor) && + const DeepCollectionEquality().equals(other._tags, _tags) && + (identical(other.imageUrl, imageUrl) || + other.imageUrl == imageUrl)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, ref, name, country, continent, + knownFor, const DeepCollectionEquality().hash(_tags), imageUrl); + + /// Create a copy of Destination + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$DestinationImplCopyWith<_$DestinationImpl> get copyWith => + __$$DestinationImplCopyWithImpl<_$DestinationImpl>(this, _$identity); + + @override + Map toJson() { + return _$$DestinationImplToJson( + this, + ); + } +} + +abstract class _Destination implements Destination { + const factory _Destination( + {required final String ref, + required final String name, + required final String country, + required final String continent, + required final String knownFor, + required final List tags, + required final String imageUrl}) = _$DestinationImpl; + + factory _Destination.fromJson(Map json) = + _$DestinationImpl.fromJson; + + /// e.g. 'alaska' + @override + String get ref; + + /// e.g. 'Alaska' + @override + String get name; + + /// e.g. 'United States' + @override + String get country; + + /// e.g. 'North America' + @override + String get continent; + + /// e.g. 'Alaska is a haven for outdoor enthusiasts ...' + @override + String get knownFor; + + /// e.g. ['Mountain', 'Off-the-beaten-path', 'Wildlife watching'] + @override + List get tags; + + /// e.g. 'https://storage.googleapis.com/tripedia-images/destinations/alaska.jpg' + @override + String get imageUrl; + + /// Create a copy of Destination + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$DestinationImplCopyWith<_$DestinationImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/app/lib/domain/models/destination/destination.g.dart b/compass_app/app/lib/domain/models/destination/destination.g.dart new file mode 100644 index 000000000..796e2bbbd --- /dev/null +++ b/compass_app/app/lib/domain/models/destination/destination.g.dart @@ -0,0 +1,29 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'destination.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$DestinationImpl _$$DestinationImplFromJson(Map json) => + _$DestinationImpl( + ref: json['ref'] as String, + name: json['name'] as String, + country: json['country'] as String, + continent: json['continent'] as String, + knownFor: json['knownFor'] as String, + tags: (json['tags'] as List).map((e) => e as String).toList(), + imageUrl: json['imageUrl'] as String, + ); + +Map _$$DestinationImplToJson(_$DestinationImpl instance) => + { + 'ref': instance.ref, + 'name': instance.name, + 'country': instance.country, + 'continent': instance.continent, + 'knownFor': instance.knownFor, + 'tags': instance.tags, + 'imageUrl': instance.imageUrl, + }; diff --git a/compass_app/app/lib/domain/models/itinerary_config/itinerary_config.dart b/compass_app/app/lib/domain/models/itinerary_config/itinerary_config.dart new file mode 100644 index 000000000..7d55b7c64 --- /dev/null +++ b/compass_app/app/lib/domain/models/itinerary_config/itinerary_config.dart @@ -0,0 +1,35 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'itinerary_config.freezed.dart'; + +part 'itinerary_config.g.dart'; + +@freezed +class ItineraryConfig with _$ItineraryConfig { + const factory ItineraryConfig({ + /// [Continent] name + String? continent, + + /// Start date (check in) of itinerary + DateTime? startDate, + + /// End date (check out) of itinerary + DateTime? endDate, + + /// Number of guests + int? guests, + + /// Selected [Destination] reference + String? destination, + + /// Selected [Activity] references + @Default([]) List activities, + }) = _ItineraryConfig; + + factory ItineraryConfig.fromJson(Map json) => + _$ItineraryConfigFromJson(json); +} diff --git a/compass_app/app/lib/domain/models/itinerary_config/itinerary_config.freezed.dart b/compass_app/app/lib/domain/models/itinerary_config/itinerary_config.freezed.dart new file mode 100644 index 000000000..38facb873 --- /dev/null +++ b/compass_app/app/lib/domain/models/itinerary_config/itinerary_config.freezed.dart @@ -0,0 +1,316 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'itinerary_config.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +ItineraryConfig _$ItineraryConfigFromJson(Map json) { + return _ItineraryConfig.fromJson(json); +} + +/// @nodoc +mixin _$ItineraryConfig { + /// [Continent] name + String? get continent => throw _privateConstructorUsedError; + + /// Start date (check in) of itinerary + DateTime? get startDate => throw _privateConstructorUsedError; + + /// End date (check out) of itinerary + DateTime? get endDate => throw _privateConstructorUsedError; + + /// Number of guests + int? get guests => throw _privateConstructorUsedError; + + /// Selected [Destination] reference + String? get destination => throw _privateConstructorUsedError; + + /// Selected [Activity] references + List get activities => throw _privateConstructorUsedError; + + /// Serializes this ItineraryConfig to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of ItineraryConfig + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $ItineraryConfigCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ItineraryConfigCopyWith<$Res> { + factory $ItineraryConfigCopyWith( + ItineraryConfig value, $Res Function(ItineraryConfig) then) = + _$ItineraryConfigCopyWithImpl<$Res, ItineraryConfig>; + @useResult + $Res call( + {String? continent, + DateTime? startDate, + DateTime? endDate, + int? guests, + String? destination, + List activities}); +} + +/// @nodoc +class _$ItineraryConfigCopyWithImpl<$Res, $Val extends ItineraryConfig> + implements $ItineraryConfigCopyWith<$Res> { + _$ItineraryConfigCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of ItineraryConfig + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? continent = freezed, + Object? startDate = freezed, + Object? endDate = freezed, + Object? guests = freezed, + Object? destination = freezed, + Object? activities = null, + }) { + return _then(_value.copyWith( + continent: freezed == continent + ? _value.continent + : continent // ignore: cast_nullable_to_non_nullable + as String?, + startDate: freezed == startDate + ? _value.startDate + : startDate // ignore: cast_nullable_to_non_nullable + as DateTime?, + endDate: freezed == endDate + ? _value.endDate + : endDate // ignore: cast_nullable_to_non_nullable + as DateTime?, + guests: freezed == guests + ? _value.guests + : guests // ignore: cast_nullable_to_non_nullable + as int?, + destination: freezed == destination + ? _value.destination + : destination // ignore: cast_nullable_to_non_nullable + as String?, + activities: null == activities + ? _value.activities + : activities // ignore: cast_nullable_to_non_nullable + as List, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$ItineraryConfigImplCopyWith<$Res> + implements $ItineraryConfigCopyWith<$Res> { + factory _$$ItineraryConfigImplCopyWith(_$ItineraryConfigImpl value, + $Res Function(_$ItineraryConfigImpl) then) = + __$$ItineraryConfigImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String? continent, + DateTime? startDate, + DateTime? endDate, + int? guests, + String? destination, + List activities}); +} + +/// @nodoc +class __$$ItineraryConfigImplCopyWithImpl<$Res> + extends _$ItineraryConfigCopyWithImpl<$Res, _$ItineraryConfigImpl> + implements _$$ItineraryConfigImplCopyWith<$Res> { + __$$ItineraryConfigImplCopyWithImpl( + _$ItineraryConfigImpl _value, $Res Function(_$ItineraryConfigImpl) _then) + : super(_value, _then); + + /// Create a copy of ItineraryConfig + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? continent = freezed, + Object? startDate = freezed, + Object? endDate = freezed, + Object? guests = freezed, + Object? destination = freezed, + Object? activities = null, + }) { + return _then(_$ItineraryConfigImpl( + continent: freezed == continent + ? _value.continent + : continent // ignore: cast_nullable_to_non_nullable + as String?, + startDate: freezed == startDate + ? _value.startDate + : startDate // ignore: cast_nullable_to_non_nullable + as DateTime?, + endDate: freezed == endDate + ? _value.endDate + : endDate // ignore: cast_nullable_to_non_nullable + as DateTime?, + guests: freezed == guests + ? _value.guests + : guests // ignore: cast_nullable_to_non_nullable + as int?, + destination: freezed == destination + ? _value.destination + : destination // ignore: cast_nullable_to_non_nullable + as String?, + activities: null == activities + ? _value._activities + : activities // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$ItineraryConfigImpl implements _ItineraryConfig { + const _$ItineraryConfigImpl( + {this.continent, + this.startDate, + this.endDate, + this.guests, + this.destination, + final List activities = const []}) + : _activities = activities; + + factory _$ItineraryConfigImpl.fromJson(Map json) => + _$$ItineraryConfigImplFromJson(json); + + /// [Continent] name + @override + final String? continent; + + /// Start date (check in) of itinerary + @override + final DateTime? startDate; + + /// End date (check out) of itinerary + @override + final DateTime? endDate; + + /// Number of guests + @override + final int? guests; + + /// Selected [Destination] reference + @override + final String? destination; + + /// Selected [Activity] references + final List _activities; + + /// Selected [Activity] references + @override + @JsonKey() + List get activities { + if (_activities is EqualUnmodifiableListView) return _activities; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_activities); + } + + @override + String toString() { + return 'ItineraryConfig(continent: $continent, startDate: $startDate, endDate: $endDate, guests: $guests, destination: $destination, activities: $activities)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ItineraryConfigImpl && + (identical(other.continent, continent) || + other.continent == continent) && + (identical(other.startDate, startDate) || + other.startDate == startDate) && + (identical(other.endDate, endDate) || other.endDate == endDate) && + (identical(other.guests, guests) || other.guests == guests) && + (identical(other.destination, destination) || + other.destination == destination) && + const DeepCollectionEquality() + .equals(other._activities, _activities)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, continent, startDate, endDate, + guests, destination, const DeepCollectionEquality().hash(_activities)); + + /// Create a copy of ItineraryConfig + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$ItineraryConfigImplCopyWith<_$ItineraryConfigImpl> get copyWith => + __$$ItineraryConfigImplCopyWithImpl<_$ItineraryConfigImpl>( + this, _$identity); + + @override + Map toJson() { + return _$$ItineraryConfigImplToJson( + this, + ); + } +} + +abstract class _ItineraryConfig implements ItineraryConfig { + const factory _ItineraryConfig( + {final String? continent, + final DateTime? startDate, + final DateTime? endDate, + final int? guests, + final String? destination, + final List activities}) = _$ItineraryConfigImpl; + + factory _ItineraryConfig.fromJson(Map json) = + _$ItineraryConfigImpl.fromJson; + + /// [Continent] name + @override + String? get continent; + + /// Start date (check in) of itinerary + @override + DateTime? get startDate; + + /// End date (check out) of itinerary + @override + DateTime? get endDate; + + /// Number of guests + @override + int? get guests; + + /// Selected [Destination] reference + @override + String? get destination; + + /// Selected [Activity] references + @override + List get activities; + + /// Create a copy of ItineraryConfig + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$ItineraryConfigImplCopyWith<_$ItineraryConfigImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/app/lib/domain/models/itinerary_config/itinerary_config.g.dart b/compass_app/app/lib/domain/models/itinerary_config/itinerary_config.g.dart new file mode 100644 index 000000000..1176e4239 --- /dev/null +++ b/compass_app/app/lib/domain/models/itinerary_config/itinerary_config.g.dart @@ -0,0 +1,36 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'itinerary_config.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$ItineraryConfigImpl _$$ItineraryConfigImplFromJson( + Map json) => + _$ItineraryConfigImpl( + continent: json['continent'] as String?, + startDate: json['startDate'] == null + ? null + : DateTime.parse(json['startDate'] as String), + endDate: json['endDate'] == null + ? null + : DateTime.parse(json['endDate'] as String), + guests: (json['guests'] as num?)?.toInt(), + destination: json['destination'] as String?, + activities: (json['activities'] as List?) + ?.map((e) => e as String) + .toList() ?? + const [], + ); + +Map _$$ItineraryConfigImplToJson( + _$ItineraryConfigImpl instance) => + { + 'continent': instance.continent, + 'startDate': instance.startDate?.toIso8601String(), + 'endDate': instance.endDate?.toIso8601String(), + 'guests': instance.guests, + 'destination': instance.destination, + 'activities': instance.activities, + }; diff --git a/compass_app/app/lib/domain/models/user/user.dart b/compass_app/app/lib/domain/models/user/user.dart new file mode 100644 index 000000000..001a5ad06 --- /dev/null +++ b/compass_app/app/lib/domain/models/user/user.dart @@ -0,0 +1,21 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'user.freezed.dart'; +part 'user.g.dart'; + +@freezed +abstract class User with _$User { + const factory User({ + /// The user's name. + required String name, + + /// The user's picture URL. + required String picture, + }) = _User; + + factory User.fromJson(Map json) => _$UserFromJson(json); +} diff --git a/compass_app/app/lib/domain/models/user/user.freezed.dart b/compass_app/app/lib/domain/models/user/user.freezed.dart new file mode 100644 index 000000000..214f6d8b4 --- /dev/null +++ b/compass_app/app/lib/domain/models/user/user.freezed.dart @@ -0,0 +1,185 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'user.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +User _$UserFromJson(Map json) { + return _User.fromJson(json); +} + +/// @nodoc +mixin _$User { + /// The user's name. + String get name => throw _privateConstructorUsedError; + + /// The user's picture URL. + String get picture => throw _privateConstructorUsedError; + + /// Serializes this User to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of User + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $UserCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $UserCopyWith<$Res> { + factory $UserCopyWith(User value, $Res Function(User) then) = + _$UserCopyWithImpl<$Res, User>; + @useResult + $Res call({String name, String picture}); +} + +/// @nodoc +class _$UserCopyWithImpl<$Res, $Val extends User> + implements $UserCopyWith<$Res> { + _$UserCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of User + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = null, + Object? picture = null, + }) { + return _then(_value.copyWith( + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + picture: null == picture + ? _value.picture + : picture // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$UserImplCopyWith<$Res> implements $UserCopyWith<$Res> { + factory _$$UserImplCopyWith( + _$UserImpl value, $Res Function(_$UserImpl) then) = + __$$UserImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String name, String picture}); +} + +/// @nodoc +class __$$UserImplCopyWithImpl<$Res> + extends _$UserCopyWithImpl<$Res, _$UserImpl> + implements _$$UserImplCopyWith<$Res> { + __$$UserImplCopyWithImpl(_$UserImpl _value, $Res Function(_$UserImpl) _then) + : super(_value, _then); + + /// Create a copy of User + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = null, + Object? picture = null, + }) { + return _then(_$UserImpl( + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + picture: null == picture + ? _value.picture + : picture // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$UserImpl implements _User { + const _$UserImpl({required this.name, required this.picture}); + + factory _$UserImpl.fromJson(Map json) => + _$$UserImplFromJson(json); + + /// The user's name. + @override + final String name; + + /// The user's picture URL. + @override + final String picture; + + @override + String toString() { + return 'User(name: $name, picture: $picture)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$UserImpl && + (identical(other.name, name) || other.name == name) && + (identical(other.picture, picture) || other.picture == picture)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, name, picture); + + /// Create a copy of User + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$UserImplCopyWith<_$UserImpl> get copyWith => + __$$UserImplCopyWithImpl<_$UserImpl>(this, _$identity); + + @override + Map toJson() { + return _$$UserImplToJson( + this, + ); + } +} + +abstract class _User implements User { + const factory _User( + {required final String name, required final String picture}) = _$UserImpl; + + factory _User.fromJson(Map json) = _$UserImpl.fromJson; + + /// The user's name. + @override + String get name; + + /// The user's picture URL. + @override + String get picture; + + /// Create a copy of User + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$UserImplCopyWith<_$UserImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/app/lib/domain/models/user/user.g.dart b/compass_app/app/lib/domain/models/user/user.g.dart new file mode 100644 index 000000000..5493bf822 --- /dev/null +++ b/compass_app/app/lib/domain/models/user/user.g.dart @@ -0,0 +1,18 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$UserImpl _$$UserImplFromJson(Map json) => _$UserImpl( + name: json['name'] as String, + picture: json['picture'] as String, + ); + +Map _$$UserImplToJson(_$UserImpl instance) => + { + 'name': instance.name, + 'picture': instance.picture, + }; diff --git a/compass_app/app/lib/domain/use_cases/booking/booking_create_use_case.dart b/compass_app/app/lib/domain/use_cases/booking/booking_create_use_case.dart new file mode 100644 index 000000000..eff951159 --- /dev/null +++ b/compass_app/app/lib/domain/use_cases/booking/booking_create_use_case.dart @@ -0,0 +1,106 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:logging/logging.dart'; + +import '../../../data/repositories/activity/activity_repository.dart'; +import '../../../data/repositories/booking/booking_repository.dart'; +import '../../../data/repositories/destination/destination_repository.dart'; +import '../../../utils/result.dart'; +import '../../models/activity/activity.dart'; +import '../../models/booking/booking.dart'; +import '../../models/destination/destination.dart'; +import '../../models/itinerary_config/itinerary_config.dart'; + +/// UseCase for creating [Booking] objects from [ItineraryConfig]. +/// +/// Fetches [Destination] and [Activity] objects from repositories, +/// checks if dates are set and creates a [Booking] object. +class BookingCreateUseCase { + BookingCreateUseCase({ + required DestinationRepository destinationRepository, + required ActivityRepository activityRepository, + required BookingRepository bookingRepository, + }) : _destinationRepository = destinationRepository, + _activityRepository = activityRepository, + _bookingRepository = bookingRepository; + + final DestinationRepository _destinationRepository; + final ActivityRepository _activityRepository; + final BookingRepository _bookingRepository; + final _log = Logger('BookingCreateUseCase'); + + /// Create [Booking] from a stored [ItineraryConfig] + Future> createFrom(ItineraryConfig itineraryConfig) async { + // Get Destination object from repository + if (itineraryConfig.destination == null) { + _log.warning('Destination is not set'); + return Result.error(Exception('Destination is not set')); + } + final destinationResult = + await _fetchDestination(itineraryConfig.destination!); + if (destinationResult is Error) { + _log.warning('Error fetching destination: ${destinationResult.error}'); + return Result.error(destinationResult.error); + } + _log.fine('Destination loaded: ${destinationResult.asOk.value.ref}'); + + // Get Activity objects from repository + if (itineraryConfig.activities.isEmpty) { + _log.warning('Activities are not set'); + return Result.error(Exception('Activities are not set')); + } + final activitiesResult = await _activityRepository.getByDestination( + itineraryConfig.destination!, + ); + if (activitiesResult is Error>) { + _log.warning('Error fetching activities: ${activitiesResult.error}'); + return Result.error(activitiesResult.error); + } + final activities = activitiesResult.asOk.value + .where( + (activity) => itineraryConfig.activities.contains(activity.ref), + ) + .toList(); + _log.fine('Activities loaded (${activities.length})'); + + // Check if dates are set + if (itineraryConfig.startDate == null || itineraryConfig.endDate == null) { + _log.warning('Dates are not set'); + return Result.error(Exception('Dates are not set')); + } + + final booking = Booking( + startDate: itineraryConfig.startDate!, + endDate: itineraryConfig.endDate!, + destination: destinationResult.asOk.value, + activity: activities, + ); + + final saveBookingResult = await _bookingRepository.createBooking(booking); + switch (saveBookingResult) { + case Ok(): + _log.fine('Booking saved successfully'); + break; + case Error(): + _log.warning('Failed to save booking', saveBookingResult.error); + return Result.error(saveBookingResult.error); + } + + // Create Booking object + return Result.ok(booking); + } + + Future> _fetchDestination(String destinationRef) async { + final result = await _destinationRepository.getDestinations(); + switch (result) { + case Ok>(): + final destination = result.value + .firstWhere((destination) => destination.ref == destinationRef); + return Ok(destination); + case Error>(): + return Result.error(result.error); + } + } +} diff --git a/compass_app/app/lib/domain/use_cases/booking/booking_share_use_case.dart b/compass_app/app/lib/domain/use_cases/booking/booking_share_use_case.dart new file mode 100644 index 000000000..cff2f852b --- /dev/null +++ b/compass_app/app/lib/domain/use_cases/booking/booking_share_use_case.dart @@ -0,0 +1,46 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:logging/logging.dart'; +import 'package:share_plus/share_plus.dart'; + +import '../../../utils/result.dart'; +import '../../../ui/core/ui/date_format_start_end.dart'; +import '../../models/booking/booking.dart'; + +typedef ShareFunction = Future Function(String text); + +/// UseCase for sharing a booking. +class BookingShareUseCase { + BookingShareUseCase._(this._share); + + /// Create a [BookingShareUseCase] that uses `share_plus` package. + factory BookingShareUseCase.withSharePlus() => + BookingShareUseCase._(Share.share); + + /// Create a [BookingShareUseCase] with a custom share function. + factory BookingShareUseCase.custom(ShareFunction share) => + BookingShareUseCase._(share); + + final ShareFunction _share; + final _log = Logger('BookingShareUseCase'); + + Future> shareBooking(Booking booking) async { + final text = 'Trip to ${booking.destination.name}\n' + 'on ${dateFormatStartEnd(DateTimeRange(start: booking.startDate, end: booking.endDate))}\n' + 'Activities:\n' + '${booking.activity.map((a) => ' - ${a.name}').join('\n')}.'; + + _log.info('Sharing booking: $text'); + try { + await _share(text); + _log.fine('Shared booking'); + return Result.ok(null); + } on Exception catch (error) { + _log.severe('Failed to share booking', error); + return Result.error(error); + } + } +} diff --git a/compass_app/app/lib/main.dart b/compass_app/app/lib/main.dart new file mode 100644 index 000000000..65b39e0d4 --- /dev/null +++ b/compass_app/app/lib/main.dart @@ -0,0 +1,40 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:provider/provider.dart'; + +import 'ui/core/localization/applocalization.dart'; +import 'ui/core/themes/theme.dart'; +import 'routing/router.dart'; +import 'package:flutter/material.dart'; + +import 'ui/core/ui/scroll_behavior.dart'; +import 'main_development.dart' as development; + +/// Default main method +void main() { + // Launch development config by default + development.main(); +} + +class MainApp extends StatelessWidget { + const MainApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp.router( + localizationsDelegates: [ + GlobalWidgetsLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + AppLocalizationDelegate(), + ], + scrollBehavior: AppCustomScrollBehavior(), + theme: AppTheme.lightTheme, + darkTheme: AppTheme.darkTheme, + themeMode: ThemeMode.system, + routerConfig: router(context.read()), + ); + } +} diff --git a/compass_app/app/lib/main_development.dart b/compass_app/app/lib/main_development.dart new file mode 100644 index 000000000..4754e22cd --- /dev/null +++ b/compass_app/app/lib/main_development.dart @@ -0,0 +1,24 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:logging/logging.dart'; +import 'package:provider/provider.dart'; + +import 'config/dependencies.dart'; +import 'main.dart'; + +/// Development config entry point. +/// Launch with `flutter run --target lib/main_development.dart`. +/// Uses local data. +void main() { + Logger.root.level = Level.ALL; + + runApp( + MultiProvider( + providers: providersLocal, + child: const MainApp(), + ), + ); +} diff --git a/compass_app/app/lib/main_staging.dart b/compass_app/app/lib/main_staging.dart new file mode 100644 index 000000000..d6d87ba99 --- /dev/null +++ b/compass_app/app/lib/main_staging.dart @@ -0,0 +1,24 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:logging/logging.dart'; +import 'package:provider/provider.dart'; + +import 'config/dependencies.dart'; +import 'main.dart'; + +/// Staging config entry point. +/// Launch with `flutter run --target lib/main_staging.dart`. +/// Uses remote data from a server. +void main() { + Logger.root.level = Level.ALL; + + runApp( + MultiProvider( + providers: providersRemote, + child: const MainApp(), + ), + ); +} diff --git a/compass_app/app/lib/routing/router.dart b/compass_app/app/lib/routing/router.dart new file mode 100644 index 000000000..e0e085b43 --- /dev/null +++ b/compass_app/app/lib/routing/router.dart @@ -0,0 +1,154 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/cupertino.dart'; +import 'package:go_router/go_router.dart'; +import 'package:provider/provider.dart'; + +import '../data/repositories/auth/auth_repository.dart'; +import '../ui/activities/view_models/activities_viewmodel.dart'; +import '../ui/activities/widgets/activities_screen.dart'; +import '../ui/auth/login/view_models/login_viewmodel.dart'; +import '../ui/auth/login/widgets/login_screen.dart'; +import '../ui/booking/widgets/booking_screen.dart'; +import '../ui/booking/view_models/booking_viewmodel.dart'; +import '../ui/home/view_models/home_viewmodel.dart'; +import '../ui/home/widgets/home_screen.dart'; +import '../ui/results/view_models/results_viewmodel.dart'; +import '../ui/results/widgets/results_screen.dart'; +import '../ui/search_form/view_models/search_form_viewmodel.dart'; +import '../ui/search_form/widgets/search_form_screen.dart'; +import 'routes.dart'; + +/// Top go_router entry point. +/// +/// Listens to changes in [AuthTokenRepository] to redirect the user +/// to /login when the user logs out. +GoRouter router( + AuthRepository authRepository, +) => + GoRouter( + initialLocation: Routes.home, + debugLogDiagnostics: true, + redirect: _redirect, + refreshListenable: authRepository, + routes: [ + GoRoute( + path: Routes.login, + builder: (context, state) { + return LoginScreen( + viewModel: LoginViewModel( + authRepository: context.read(), + ), + ); + }, + ), + GoRoute( + path: Routes.home, + builder: (context, state) { + final viewModel = HomeViewModel( + bookingRepository: context.read(), + userRepository: context.read(), + ); + return HomeScreen(viewModel: viewModel); + }, + routes: [ + GoRoute( + path: Routes.searchRelative, + builder: (context, state) { + final viewModel = SearchFormViewModel( + continentRepository: context.read(), + itineraryConfigRepository: context.read(), + ); + return SearchFormScreen(viewModel: viewModel); + }, + ), + GoRoute( + path: Routes.resultsRelative, + builder: (context, state) { + final viewModel = ResultsViewModel( + destinationRepository: context.read(), + itineraryConfigRepository: context.read(), + ); + return ResultsScreen( + viewModel: viewModel, + ); + }, + ), + GoRoute( + path: Routes.activitiesRelative, + builder: (context, state) { + final viewModel = ActivitiesViewModel( + activityRepository: context.read(), + itineraryConfigRepository: context.read(), + ); + return ActivitiesScreen( + viewModel: viewModel, + ); + }, + ), + GoRoute( + path: Routes.bookingRelative, + builder: (context, state) { + final viewModel = BookingViewModel( + itineraryConfigRepository: context.read(), + createBookingUseCase: context.read(), + shareBookingUseCase: context.read(), + bookingRepository: context.read(), + ); + + // When opening the booking screen directly + // create a new booking from the stored ItineraryConfig. + viewModel.createBooking.execute(); + + return BookingScreen( + viewModel: viewModel, + ); + }, + routes: [ + GoRoute( + path: ':id', + builder: (context, state) { + final id = int.parse(state.pathParameters['id']!); + final viewModel = BookingViewModel( + itineraryConfigRepository: context.read(), + createBookingUseCase: context.read(), + shareBookingUseCase: context.read(), + bookingRepository: context.read(), + ); + + // When opening the booking screen with an existing id + // load and display that booking. + viewModel.loadBooking.execute(id); + + return BookingScreen( + viewModel: viewModel, + ); + }, + ), + ], + ), + ], + ), + ], + ); + +// From https://github.com/flutter/packages/blob/main/packages/go_router/example/lib/redirection.dart +Future _redirect(BuildContext context, GoRouterState state) async { + // if the user is not logged in, they need to login + final bool loggedIn = await context.read().isAuthenticated; + final bool loggingIn = state.matchedLocation == Routes.login; + if (!loggedIn) { + return Routes.login; + } + + // if the user is logged in but still on the login page, send them to + // the home page + if (loggingIn) { + return Routes.home; + } + + // no need to redirect at all + return null; +} diff --git a/compass_app/app/lib/routing/routes.dart b/compass_app/app/lib/routing/routes.dart new file mode 100644 index 000000000..bba607532 --- /dev/null +++ b/compass_app/app/lib/routing/routes.dart @@ -0,0 +1,17 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +class Routes { + static const home = '/'; + static const login = '/login'; + static const search = '/$searchRelative'; + static const searchRelative = 'search'; + static const results = '/$resultsRelative'; + static const resultsRelative = 'results'; + static const activities = '/$activitiesRelative'; + static const activitiesRelative = 'activities'; + static const booking = '/$bookingRelative'; + static const bookingRelative = 'booking'; + static String bookingWithId(int id) => '$booking/$id'; +} diff --git a/compass_app/app/lib/ui/activities/view_models/activities_viewmodel.dart b/compass_app/app/lib/ui/activities/view_models/activities_viewmodel.dart new file mode 100644 index 000000000..dc86b6f48 --- /dev/null +++ b/compass_app/app/lib/ui/activities/view_models/activities_viewmodel.dart @@ -0,0 +1,142 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/foundation.dart'; +import 'package:logging/logging.dart'; + +import '../../../data/repositories/activity/activity_repository.dart'; +import '../../../data/repositories/itinerary_config/itinerary_config_repository.dart'; +import '../../../domain/models/activity/activity.dart'; +import '../../../utils/command.dart'; +import '../../../utils/result.dart'; + +class ActivitiesViewModel extends ChangeNotifier { + ActivitiesViewModel({ + required ActivityRepository activityRepository, + required ItineraryConfigRepository itineraryConfigRepository, + }) : _activityRepository = activityRepository, + _itineraryConfigRepository = itineraryConfigRepository { + loadActivities = Command0(_loadActivities)..execute(); + saveActivities = Command0(_saveActivities); + } + + final _log = Logger('ActivitiesViewModel'); + final ActivityRepository _activityRepository; + final ItineraryConfigRepository _itineraryConfigRepository; + List _daytimeActivities = []; + List _eveningActivities = []; + final Set _selectedActivities = {}; + + /// List of daytime [Activity] per destination. + List get daytimeActivities => _daytimeActivities; + + /// List of evening [Activity] per destination. + List get eveningActivities => _eveningActivities; + + /// Selected [Activity] by ref. + Set get selectedActivities => _selectedActivities; + + /// Load list of [Activity] for a [Destination] by ref. + late final Command0 loadActivities; + + /// Save list [selectedActivities] into itinerary configuration. + late final Command0 saveActivities; + + Future> _loadActivities() async { + final result = await _itineraryConfigRepository.getItineraryConfig(); + if (result is Error) { + _log.warning( + 'Failed to load stored ItineraryConfig', + result.asError.error, + ); + return result; + } + + final destinationRef = result.asOk.value.destination; + if (destinationRef == null) { + _log.severe('Destination missing in ItineraryConfig'); + return Result.error(Exception('Destination not found')); + } + + _selectedActivities.addAll(result.asOk.value.activities); + + final resultActivities = + await _activityRepository.getByDestination(destinationRef); + switch (resultActivities) { + case Ok(): + { + _daytimeActivities = resultActivities.value + .where((activity) => [ + TimeOfDay.any, + TimeOfDay.morning, + TimeOfDay.afternoon, + ].contains(activity.timeOfDay)) + .toList(); + + _eveningActivities = resultActivities.value + .where((activity) => [ + TimeOfDay.evening, + TimeOfDay.night, + ].contains(activity.timeOfDay)) + .toList(); + + _log.fine('Activities (daytime: ${_daytimeActivities.length}, ' + 'evening: ${_eveningActivities.length}) loaded'); + } + case Error(): + { + _log.warning('Failed to load activities', resultActivities.error); + } + } + + notifyListeners(); + return resultActivities; + } + + /// Add [Activity] to selected list. + void addActivity(String activityRef) { + assert( + (_daytimeActivities + _eveningActivities) + .any((activity) => activity.ref == activityRef), + "Activity $activityRef not found", + ); + _selectedActivities.add(activityRef); + _log.finest('Activity $activityRef added'); + notifyListeners(); + } + + /// Remove [Activity] from selected list. + void removeActivity(String activityRef) { + assert( + (_daytimeActivities + _eveningActivities) + .any((activity) => activity.ref == activityRef), + "Activity $activityRef not found", + ); + _selectedActivities.remove(activityRef); + _log.finest('Activity $activityRef removed'); + notifyListeners(); + } + + Future> _saveActivities() async { + final resultConfig = await _itineraryConfigRepository.getItineraryConfig(); + if (resultConfig is Error) { + _log.warning( + 'Failed to load stored ItineraryConfig', + resultConfig.asError.error, + ); + return resultConfig; + } + + final itineraryConfig = resultConfig.asOk.value; + final result = await _itineraryConfigRepository.setItineraryConfig( + itineraryConfig.copyWith(activities: _selectedActivities.toList())); + if (result is Error) { + _log.warning( + 'Failed to store ItineraryConfig', + result.asError.error, + ); + } + return result; + } +} diff --git a/compass_app/app/lib/ui/activities/widgets/activities_header.dart b/compass_app/app/lib/ui/activities/widgets/activities_header.dart new file mode 100644 index 000000000..3e91c10fe --- /dev/null +++ b/compass_app/app/lib/ui/activities/widgets/activities_header.dart @@ -0,0 +1,48 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../routing/routes.dart'; +import '../../core/localization/applocalization.dart'; +import '../../core/themes/dimens.dart'; +import '../../core/ui/back_button.dart'; +import '../../core/ui/home_button.dart'; + +class ActivitiesHeader extends StatelessWidget { + const ActivitiesHeader({super.key}); + + @override + Widget build(BuildContext context) { + return SafeArea( + top: true, + bottom: false, + child: Padding( + padding: EdgeInsets.only( + left: Dimens.of(context).paddingScreenHorizontal, + right: Dimens.of(context).paddingScreenHorizontal, + top: Dimens.of(context).paddingScreenVertical, + bottom: Dimens.paddingVertical, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + CustomBackButton( + onTap: () { + // Navigate to ResultsScreen and edit search + context.go(Routes.results); + }, + ), + Text( + AppLocalization.of(context).activities, + style: Theme.of(context).textTheme.titleLarge, + ), + const HomeButton(), + ], + ), + ), + ); + } +} diff --git a/compass_app/app/lib/ui/activities/widgets/activities_list.dart b/compass_app/app/lib/ui/activities/widgets/activities_list.dart new file mode 100644 index 000000000..dcb0b69eb --- /dev/null +++ b/compass_app/app/lib/ui/activities/widgets/activities_list.dart @@ -0,0 +1,61 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +import '../../core/themes/dimens.dart'; +import '../view_models/activities_viewmodel.dart'; +import 'activity_entry.dart'; +import 'activity_time_of_day.dart'; + +class ActivitiesList extends StatelessWidget { + const ActivitiesList({ + super.key, + required this.viewModel, + required this.activityTimeOfDay, + }); + + final ActivitiesViewModel viewModel; + final ActivityTimeOfDay activityTimeOfDay; + + @override + Widget build(BuildContext context) { + final list = switch (activityTimeOfDay) { + ActivityTimeOfDay.daytime => viewModel.daytimeActivities, + ActivityTimeOfDay.evening => viewModel.eveningActivities, + }; + return SliverPadding( + padding: EdgeInsets.only( + top: Dimens.paddingVertical, + left: Dimens.of(context).paddingScreenHorizontal, + right: Dimens.of(context).paddingScreenHorizontal, + bottom: Dimens.paddingVertical, + ), + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + final activity = list[index]; + return Padding( + padding: + EdgeInsets.only(bottom: index < list.length - 1 ? 20 : 0), + child: ActivityEntry( + key: ValueKey(activity.ref), + activity: activity, + selected: viewModel.selectedActivities.contains(activity.ref), + onChanged: (value) { + if (value!) { + viewModel.addActivity(activity.ref); + } else { + viewModel.removeActivity(activity.ref); + } + }, + ), + ); + }, + childCount: list.length, + ), + ), + ); + } +} diff --git a/compass_app/app/lib/ui/activities/widgets/activities_screen.dart b/compass_app/app/lib/ui/activities/widgets/activities_screen.dart new file mode 100644 index 000000000..00565e74a --- /dev/null +++ b/compass_app/app/lib/ui/activities/widgets/activities_screen.dart @@ -0,0 +1,188 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../routing/routes.dart'; +import '../../core/localization/applocalization.dart'; +import '../../core/themes/dimens.dart'; +import '../../core/ui/error_indicator.dart'; +import '../view_models/activities_viewmodel.dart'; +import 'activities_header.dart'; +import 'activities_list.dart'; +import 'activities_title.dart'; +import 'activity_time_of_day.dart'; + +const String confirmButtonKey = 'confirm-button'; + +class ActivitiesScreen extends StatefulWidget { + const ActivitiesScreen({ + super.key, + required this.viewModel, + }); + + final ActivitiesViewModel viewModel; + + @override + State createState() => _ActivitiesScreenState(); +} + +class _ActivitiesScreenState extends State { + @override + void initState() { + super.initState(); + widget.viewModel.saveActivities.addListener(_onResult); + } + + @override + void didUpdateWidget(covariant ActivitiesScreen oldWidget) { + super.didUpdateWidget(oldWidget); + oldWidget.viewModel.saveActivities.removeListener(_onResult); + widget.viewModel.saveActivities.addListener(_onResult); + } + + @override + void dispose() { + widget.viewModel.saveActivities.removeListener(_onResult); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, r) { + if (!didPop) context.go(Routes.results); + }, + child: Scaffold( + body: ListenableBuilder( + listenable: widget.viewModel.loadActivities, + builder: (context, child) { + if (widget.viewModel.loadActivities.completed) { + return child!; + } + return Column( + children: [ + const ActivitiesHeader(), + if (widget.viewModel.loadActivities.running) + const Expanded( + child: Center(child: CircularProgressIndicator())), + if (widget.viewModel.loadActivities.error) + Expanded( + child: Center( + child: ErrorIndicator( + title: AppLocalization.of(context) + .errorWhileLoadingActivities, + label: AppLocalization.of(context).tryAgain, + onPressed: widget.viewModel.loadActivities.execute, + ), + ), + ), + ], + ); + }, + child: ListenableBuilder( + listenable: widget.viewModel, + builder: (context, child) { + return Column( + children: [ + Expanded( + child: CustomScrollView( + slivers: [ + const SliverToBoxAdapter( + child: ActivitiesHeader(), + ), + ActivitiesTitle( + viewModel: widget.viewModel, + activityTimeOfDay: ActivityTimeOfDay.daytime, + ), + ActivitiesList( + viewModel: widget.viewModel, + activityTimeOfDay: ActivityTimeOfDay.daytime, + ), + ActivitiesTitle( + viewModel: widget.viewModel, + activityTimeOfDay: ActivityTimeOfDay.evening, + ), + ActivitiesList( + viewModel: widget.viewModel, + activityTimeOfDay: ActivityTimeOfDay.evening, + ), + ], + ), + ), + _BottomArea(viewModel: widget.viewModel), + ], + ); + }, + ), + ), + ), + ); + } + + void _onResult() { + if (widget.viewModel.saveActivities.completed) { + widget.viewModel.saveActivities.clearResult(); + context.go(Routes.booking); + } + + if (widget.viewModel.saveActivities.error) { + widget.viewModel.saveActivities.clearResult(); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(AppLocalization.of(context).errorWhileSavingActivities), + action: SnackBarAction( + label: AppLocalization.of(context).tryAgain, + onPressed: widget.viewModel.saveActivities.execute, + ), + ), + ); + } + } +} + +class _BottomArea extends StatelessWidget { + const _BottomArea({ + required this.viewModel, + }); + + final ActivitiesViewModel viewModel; + + @override + Widget build(BuildContext context) { + return SafeArea( + bottom: true, + child: Material( + elevation: 8, + child: Padding( + padding: EdgeInsets.only( + left: Dimens.of(context).paddingScreenHorizontal, + right: Dimens.of(context).paddingScreenVertical, + top: Dimens.paddingVertical, + bottom: Dimens.of(context).paddingScreenVertical, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + AppLocalization.of(context) + .selected(viewModel.selectedActivities.length), + style: Theme.of(context).textTheme.labelLarge, + ), + FilledButton( + key: const Key(confirmButtonKey), + onPressed: viewModel.selectedActivities.isNotEmpty + ? viewModel.saveActivities.execute + : null, + child: Text(AppLocalization.of(context).confirm), + ), + ], + ), + ), + ), + ); + } +} diff --git a/compass_app/app/lib/ui/activities/widgets/activities_title.dart b/compass_app/app/lib/ui/activities/widgets/activities_title.dart new file mode 100644 index 000000000..9319db4f1 --- /dev/null +++ b/compass_app/app/lib/ui/activities/widgets/activities_title.dart @@ -0,0 +1,43 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +import '../../core/localization/applocalization.dart'; +import '../../core/themes/dimens.dart'; +import '../view_models/activities_viewmodel.dart'; +import 'activity_time_of_day.dart'; + +class ActivitiesTitle extends StatelessWidget { + const ActivitiesTitle({ + super.key, + required this.activityTimeOfDay, + required this.viewModel, + }); + + final ActivitiesViewModel viewModel; + final ActivityTimeOfDay activityTimeOfDay; + + @override + Widget build(BuildContext context) { + final list = switch (activityTimeOfDay) { + ActivityTimeOfDay.daytime => viewModel.daytimeActivities, + ActivityTimeOfDay.evening => viewModel.eveningActivities, + }; + if (list.isEmpty) { + return const SliverToBoxAdapter(child: SizedBox()); + } + return SliverToBoxAdapter( + child: Padding( + padding: Dimens.of(context).edgeInsetsScreenHorizontal, + child: Text(_label(context)), + ), + ); + } + + String _label(BuildContext context) => switch (activityTimeOfDay) { + ActivityTimeOfDay.daytime => AppLocalization.of(context).daytime, + ActivityTimeOfDay.evening => AppLocalization.of(context).evening, + }; +} diff --git a/compass_app/app/lib/ui/activities/widgets/activity_entry.dart b/compass_app/app/lib/ui/activities/widgets/activity_entry.dart new file mode 100644 index 000000000..884919603 --- /dev/null +++ b/compass_app/app/lib/ui/activities/widgets/activity_entry.dart @@ -0,0 +1,68 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; + +import '../../../domain/models/activity/activity.dart'; +import '../../../utils/image_error_listener.dart'; +import '../../core/ui/custom_checkbox.dart'; + +class ActivityEntry extends StatelessWidget { + const ActivityEntry({ + super.key, + required this.activity, + required this.selected, + required this.onChanged, + }); + + final Activity activity; + final bool selected; + final ValueChanged onChanged; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 80, + child: Row( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(8), + child: CachedNetworkImage( + imageUrl: activity.imageUrl, + height: 80, + width: 80, + errorListener: imageErrorListener, + ), + ), + const SizedBox(width: 20), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + activity.timeOfDay.name.toUpperCase(), + style: Theme.of(context).textTheme.labelSmall, + ), + Text( + activity.name, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: Theme.of(context).textTheme.bodyMedium, + ), + ], + ), + ), + const SizedBox(width: 20), + CustomCheckbox( + key: ValueKey('${activity.ref}-checkbox'), + value: selected, + onChanged: onChanged, + ) + ], + ), + ); + } +} diff --git a/compass_app/app/lib/ui/activities/widgets/activity_time_of_day.dart b/compass_app/app/lib/ui/activities/widgets/activity_time_of_day.dart new file mode 100644 index 000000000..04cf7df59 --- /dev/null +++ b/compass_app/app/lib/ui/activities/widgets/activity_time_of_day.dart @@ -0,0 +1,5 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +enum ActivityTimeOfDay { daytime, evening } diff --git a/compass_app/app/lib/ui/auth/login/view_models/login_viewmodel.dart b/compass_app/app/lib/ui/auth/login/view_models/login_viewmodel.dart new file mode 100644 index 000000000..f81d1e774 --- /dev/null +++ b/compass_app/app/lib/ui/auth/login/view_models/login_viewmodel.dart @@ -0,0 +1,34 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:logging/logging.dart'; + +import '../../../../data/repositories/auth/auth_repository.dart'; +import '../../../../utils/command.dart'; +import '../../../../utils/result.dart'; + +class LoginViewModel { + LoginViewModel({ + required AuthRepository authRepository, + }) : _authRepository = authRepository { + login = Command1(_login); + } + + final AuthRepository _authRepository; + final _log = Logger('LoginViewModel'); + + late Command1 login; + + Future> _login((String, String) credentials) async { + final (email, password) = credentials; + final result = await _authRepository.login( + email: email, + password: password, + ); + if (result is Error) { + _log.warning('Login failed! ${result.error}'); + } + return result; + } +} diff --git a/compass_app/app/lib/ui/auth/login/widgets/login_screen.dart b/compass_app/app/lib/ui/auth/login/widgets/login_screen.dart new file mode 100644 index 000000000..8734f2271 --- /dev/null +++ b/compass_app/app/lib/ui/auth/login/widgets/login_screen.dart @@ -0,0 +1,113 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../../routing/routes.dart'; +import '../../../core/localization/applocalization.dart'; +import '../../../core/themes/dimens.dart'; +import '../view_models/login_viewmodel.dart'; +import 'tilted_cards.dart'; + +class LoginScreen extends StatefulWidget { + const LoginScreen({ + super.key, + required this.viewModel, + }); + + final LoginViewModel viewModel; + + @override + State createState() => _LoginScreenState(); +} + +class _LoginScreenState extends State { + final TextEditingController _email = + TextEditingController(text: 'email@example.com'); + final TextEditingController _password = + TextEditingController(text: 'password'); + + @override + void initState() { + super.initState(); + widget.viewModel.login.addListener(_onResult); + } + + @override + void didUpdateWidget(covariant LoginScreen oldWidget) { + super.didUpdateWidget(oldWidget); + oldWidget.viewModel.login.removeListener(_onResult); + widget.viewModel.login.addListener(_onResult); + } + + @override + void dispose() { + widget.viewModel.login.removeListener(_onResult); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + const TiltedCards(), + Padding( + padding: Dimens.of(context).edgeInsetsScreenSymmetric, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + TextField( + controller: _email, + ), + const SizedBox(height: Dimens.paddingVertical), + TextField( + controller: _password, + obscureText: true, + ), + const SizedBox(height: Dimens.paddingVertical), + ListenableBuilder( + listenable: widget.viewModel.login, + builder: (context, _) { + return FilledButton( + onPressed: () { + widget.viewModel.login + .execute((_email.value.text, _password.value.text)); + }, + child: Text(AppLocalization.of(context).login), + ); + }, + ), + ], + ), + ), + ], + ), + ); + } + + void _onResult() { + if (widget.viewModel.login.completed) { + widget.viewModel.login.clearResult(); + context.go(Routes.home); + } + + if (widget.viewModel.login.error) { + widget.viewModel.login.clearResult(); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(AppLocalization.of(context).errorWhileLogin), + action: SnackBarAction( + label: AppLocalization.of(context).tryAgain, + onPressed: () => widget.viewModel.login + .execute((_email.value.text, _password.value.text)), + ), + ), + ); + } + } +} diff --git a/compass_app/app/lib/ui/auth/login/widgets/tilted_cards.dart b/compass_app/app/lib/ui/auth/login/widgets/tilted_cards.dart new file mode 100644 index 000000000..5acb08673 --- /dev/null +++ b/compass_app/app/lib/ui/auth/login/widgets/tilted_cards.dart @@ -0,0 +1,97 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +import '../../../../utils/image_error_listener.dart'; + +class TiltedCards extends StatelessWidget { + const TiltedCards({super.key}); + + @override + Widget build(BuildContext context) { + return ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 300), + child: const AspectRatio( + aspectRatio: 1, + child: Stack( + alignment: Alignment.center, + children: [ + Positioned( + left: 0, + child: _Card( + imageUrl: 'https://rstr.in/google/tripedia/g2i0BsYPKW-', + width: 200, + height: 273, + tilt: -3.83 / 360, + ), + ), + Positioned( + right: 0, + child: _Card( + imageUrl: 'https://rstr.in/google/tripedia/980sqNgaDRK', + width: 180, + height: 230, + tilt: 3.46 / 360, + ), + ), + _Card( + imageUrl: 'https://rstr.in/google/tripedia/pHfPmf3o5NU', + width: 225, + height: 322, + tilt: 0, + showTitle: true, + ), + ], + ), + ), + ); + } +} + +class _Card extends StatelessWidget { + const _Card({ + required this.imageUrl, + required this.width, + required this.height, + required this.tilt, + this.showTitle = false, + }); + + final double tilt; + final double width; + final double height; + final String imageUrl; + final bool showTitle; + + @override + Widget build(BuildContext context) { + return RotationTransition( + turns: AlwaysStoppedAnimation(tilt), + child: SizedBox( + width: width, + height: height, + child: ClipRRect( + borderRadius: BorderRadius.circular(20), + child: Stack( + fit: StackFit.expand, + alignment: Alignment.center, + children: [ + CachedNetworkImage( + imageUrl: imageUrl, + fit: BoxFit.cover, + color: showTitle ? Colors.black.withOpacity(0.5) : null, + colorBlendMode: showTitle ? BlendMode.darken : null, + errorListener: imageErrorListener, + ), + if (showTitle) Center(child: SvgPicture.asset('assets/logo.svg')), + ], + ), + ), + ), + ); + } +} diff --git a/compass_app/app/lib/ui/auth/logout/view_models/logout_viewmodel.dart b/compass_app/app/lib/ui/auth/logout/view_models/logout_viewmodel.dart new file mode 100644 index 000000000..0effd434d --- /dev/null +++ b/compass_app/app/lib/ui/auth/logout/view_models/logout_viewmodel.dart @@ -0,0 +1,34 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../../../../data/repositories/auth/auth_repository.dart'; +import '../../../../data/repositories/itinerary_config/itinerary_config_repository.dart'; +import '../../../../domain/models/itinerary_config/itinerary_config.dart'; +import '../../../../utils/command.dart'; +import '../../../../utils/result.dart'; + +class LogoutViewModel { + LogoutViewModel({ + required AuthRepository authRepository, + required ItineraryConfigRepository itineraryConfigRepository, + }) : _authLogoutRepository = authRepository, + _itineraryConfigRepository = itineraryConfigRepository { + logout = Command0(_logout); + } + final AuthRepository _authLogoutRepository; + final ItineraryConfigRepository _itineraryConfigRepository; + late Command0 logout; + + Future _logout() async { + var result = await _authLogoutRepository.logout(); + switch (result) { + case Ok(): + // clear stored itinerary config + return _itineraryConfigRepository + .setItineraryConfig(const ItineraryConfig()); + case Error(): + return result; + } + } +} diff --git a/compass_app/app/lib/ui/auth/logout/widgets/logout_button.dart b/compass_app/app/lib/ui/auth/logout/widgets/logout_button.dart new file mode 100644 index 000000000..ff500bed0 --- /dev/null +++ b/compass_app/app/lib/ui/auth/logout/widgets/logout_button.dart @@ -0,0 +1,88 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +import '../../../core/localization/applocalization.dart'; +import '../../../core/themes/colors.dart'; +import '../view_models/logout_viewmodel.dart'; + +class LogoutButton extends StatefulWidget { + const LogoutButton({ + super.key, + required this.viewModel, + }); + + final LogoutViewModel viewModel; + + @override + State createState() => _LogoutButtonState(); +} + +class _LogoutButtonState extends State { + @override + void initState() { + super.initState(); + widget.viewModel.logout.addListener(_onResult); + } + + @override + void didUpdateWidget(covariant LogoutButton oldWidget) { + super.didUpdateWidget(oldWidget); + oldWidget.viewModel.logout.removeListener(_onResult); + widget.viewModel.logout.addListener(_onResult); + } + + @override + void dispose() { + widget.viewModel.logout.removeListener(_onResult); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 40.0, + width: 40.0, + child: DecoratedBox( + decoration: BoxDecoration( + border: Border.all(color: AppColors.grey1), + borderRadius: BorderRadius.circular(8.0), + color: Colors.transparent, + ), + child: InkResponse( + borderRadius: BorderRadius.circular(8.0), + onTap: () { + widget.viewModel.logout.execute(); + }, + child: Center( + child: Icon( + size: 24.0, + Icons.logout, + color: Theme.of(context).colorScheme.onSurface, + ), + ), + ), + ), + ); + } + + void _onResult() { + // We do not need to navigate to `/login` on logout, + // it is done automatically by GoRouter. + + if (widget.viewModel.logout.error) { + widget.viewModel.logout.clearResult(); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(AppLocalization.of(context).errorWhileLogout), + action: SnackBarAction( + label: AppLocalization.of(context).tryAgain, + onPressed: widget.viewModel.logout.execute, + ), + ), + ); + } + } +} diff --git a/compass_app/app/lib/ui/booking/view_models/booking_viewmodel.dart b/compass_app/app/lib/ui/booking/view_models/booking_viewmodel.dart new file mode 100644 index 000000000..c2e44ead6 --- /dev/null +++ b/compass_app/app/lib/ui/booking/view_models/booking_viewmodel.dart @@ -0,0 +1,89 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/foundation.dart'; +import 'package:logging/logging.dart'; + +import '../../../data/repositories/booking/booking_repository.dart'; +import '../../../data/repositories/itinerary_config/itinerary_config_repository.dart'; +import '../../../domain/models/booking/booking.dart'; +import '../../../domain/models/itinerary_config/itinerary_config.dart'; +import '../../../utils/command.dart'; +import '../../../utils/result.dart'; +import '../../../domain/use_cases/booking/booking_create_use_case.dart'; +import '../../../domain/use_cases/booking/booking_share_use_case.dart'; + +class BookingViewModel extends ChangeNotifier { + BookingViewModel({ + required BookingCreateUseCase createBookingUseCase, + required BookingShareUseCase shareBookingUseCase, + required ItineraryConfigRepository itineraryConfigRepository, + required BookingRepository bookingRepository, + }) : _createUseCase = createBookingUseCase, + _shareUseCase = shareBookingUseCase, + _itineraryConfigRepository = itineraryConfigRepository, + _bookingRepository = bookingRepository { + createBooking = Command0(_createBooking); + shareBooking = Command0(() => _shareUseCase.shareBooking(_booking!)); + loadBooking = Command1(_load); + } + + final BookingCreateUseCase _createUseCase; + final BookingShareUseCase _shareUseCase; + final ItineraryConfigRepository _itineraryConfigRepository; + final BookingRepository _bookingRepository; + final _log = Logger('BookingViewModel'); + Booking? _booking; + + Booking? get booking => _booking; + + /// Creates a booking from the ItineraryConfig + /// and saves it to the user bookins + late final Command0 createBooking; + + /// Loads booking by id + late final Command1 loadBooking; + + /// Share the current booking using the OS share dialog. + late final Command0 shareBooking; + + Future> _createBooking() async { + _log.fine('Loading booking'); + final itineraryConfig = + await _itineraryConfigRepository.getItineraryConfig(); + switch (itineraryConfig) { + case Ok(): + _log.fine('Loaded stored ItineraryConfig'); + final result = await _createUseCase.createFrom(itineraryConfig.value); + switch (result) { + case Ok(): + _log.fine('Created Booking'); + _booking = result.value; + notifyListeners(); + return Result.ok(null); + case Error(): + _log.warning('Booking error: ${result.error}'); + notifyListeners(); + return Result.error(result.asError.error); + } + case Error(): + _log.warning('ItineraryConfig error: ${itineraryConfig.error}'); + notifyListeners(); + return Result.error(itineraryConfig.error); + } + } + + Future> _load(int id) async { + final result = await _bookingRepository.getBooking(id); + switch (result) { + case Ok(): + _log.fine('Loaded booking $id'); + _booking = result.value; + notifyListeners(); + case Error(): + _log.warning('Failed to load booking $id'); + } + return result; + } +} diff --git a/compass_app/app/lib/ui/booking/widgets/booking_body.dart b/compass_app/app/lib/ui/booking/widgets/booking_body.dart new file mode 100644 index 000000000..9d36ad1c8 --- /dev/null +++ b/compass_app/app/lib/ui/booking/widgets/booking_body.dart @@ -0,0 +1,104 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; + +import '../../../domain/models/activity/activity.dart'; +import '../../../utils/image_error_listener.dart'; +import '../../core/themes/dimens.dart'; +import '../view_models/booking_viewmodel.dart'; +import 'booking_header.dart'; + +class BookingBody extends StatelessWidget { + const BookingBody({ + super.key, + required this.viewModel, + }); + + final BookingViewModel viewModel; + + @override + Widget build(BuildContext context) { + return ListenableBuilder( + listenable: viewModel, + builder: (context, _) { + final booking = viewModel.booking; + if (booking == null) return const SizedBox(); + return CustomScrollView( + slivers: [ + SliverToBoxAdapter(child: BookingHeader(booking: booking)), + SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + final activity = booking.activity[index]; + return _Activity(activity: activity); + }, + childCount: booking.activity.length, + ), + ), + const SliverToBoxAdapter(child: SizedBox(height: 200)), + ], + ); + }, + ); + } +} + +class _Activity extends StatelessWidget { + const _Activity({ + required this.activity, + }); + + final Activity activity; + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.only( + top: Dimens.paddingVertical, + left: Dimens.of(context).paddingScreenHorizontal, + right: Dimens.of(context).paddingScreenHorizontal, + ), + child: Row( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(8), + child: CachedNetworkImage( + imageUrl: activity.imageUrl, + height: 80, + width: 80, + errorListener: imageErrorListener, + ), + ), + const SizedBox(width: 20), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + activity.timeOfDay.name.toUpperCase(), + style: Theme.of(context).textTheme.labelSmall, + ), + Text( + activity.name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: Theme.of(context).textTheme.bodyMedium, + ), + Text( + activity.description, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: Theme.of(context).textTheme.bodySmall, + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/compass_app/app/lib/ui/booking/widgets/booking_header.dart b/compass_app/app/lib/ui/booking/widgets/booking_header.dart new file mode 100644 index 000000000..e1d767857 --- /dev/null +++ b/compass_app/app/lib/ui/booking/widgets/booking_header.dart @@ -0,0 +1,191 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; + +import '../../../domain/models/booking/booking.dart'; +import '../../../utils/image_error_listener.dart'; +import '../../core/localization/applocalization.dart'; +import '../../core/themes/colors.dart'; +import '../../core/themes/dimens.dart'; +import '../../core/ui/date_format_start_end.dart'; +import '../../core/ui/home_button.dart'; +import '../../core/ui/tag_chip.dart'; + +class BookingHeader extends StatelessWidget { + const BookingHeader({ + super.key, + required this.booking, + }); + + final Booking booking; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _Top(booking: booking), + Padding( + padding: Dimens.of(context).edgeInsetsScreenHorizontal, + child: Text( + booking.destination.knownFor, + style: Theme.of(context).textTheme.bodyLarge, + ), + ), + const SizedBox(height: Dimens.paddingVertical), + _Tags(booking: booking), + const SizedBox(height: Dimens.paddingVertical), + Padding( + padding: Dimens.of(context).edgeInsetsScreenHorizontal, + child: Text( + AppLocalization.of(context).yourChosenActivities, + style: Theme.of(context).textTheme.headlineSmall, + ), + ), + ], + ); + } +} + +class _Top extends StatelessWidget { + const _Top({ + required this.booking, + }); + + final Booking booking; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 260, + child: Stack( + fit: StackFit.expand, + children: [ + _HeaderImage(booking: booking), + const _Gradient(), + _Headline(booking: booking), + Positioned( + right: Dimens.of(context).paddingScreenHorizontal, + top: Dimens.of(context).paddingScreenVertical, + child: const SafeArea( + top: true, + child: HomeButton(blur: true), + ), + ), + ], + ), + ); + } +} + +class _Tags extends StatelessWidget { + const _Tags({ + required this.booking, + }); + + final Booking booking; + + @override + Widget build(BuildContext context) { + final brightness = Theme.of(context).brightness; + final chipColor = switch (brightness) { + Brightness.dark => AppColors.whiteTransparent, + Brightness.light => AppColors.blackTransparent, + }; + return Padding( + padding: Dimens.of(context).edgeInsetsScreenHorizontal, + child: Wrap( + spacing: 6, + runSpacing: 6, + children: booking.destination.tags + .map( + (tag) => TagChip( + tag: tag, + fontSize: 16, + height: 32, + chipColor: chipColor, + onChipColor: Theme.of(context).colorScheme.onSurface, + ), + ) + .toList(), + ), + ); + } +} + +class _Headline extends StatelessWidget { + const _Headline({ + required this.booking, + }); + + final Booking booking; + + @override + Widget build(BuildContext context) { + return Align( + alignment: AlignmentDirectional.bottomStart, + child: Padding( + padding: Dimens.of(context).edgeInsetsScreenSymmetric, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + booking.destination.name, + style: Theme.of(context).textTheme.headlineLarge, + ), + Text( + dateFormatStartEnd( + DateTimeRange( + start: booking.startDate, + end: booking.endDate, + ), + ), + style: Theme.of(context).textTheme.headlineSmall, + ), + ], + ), + ), + ); + } +} + +class _HeaderImage extends StatelessWidget { + const _HeaderImage({ + required this.booking, + }); + + final Booking booking; + + @override + Widget build(BuildContext context) { + return CachedNetworkImage( + fit: BoxFit.fitWidth, + imageUrl: booking.destination.imageUrl, + errorListener: imageErrorListener, + ); + } +} + +class _Gradient extends StatelessWidget { + const _Gradient(); + + @override + Widget build(BuildContext context) { + return DecoratedBox( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Colors.transparent, + Theme.of(context).colorScheme.surface, + ], + ), + ), + ); + } +} diff --git a/compass_app/app/lib/ui/booking/widgets/booking_screen.dart b/compass_app/app/lib/ui/booking/widgets/booking_screen.dart new file mode 100644 index 000000000..1c87036fc --- /dev/null +++ b/compass_app/app/lib/ui/booking/widgets/booking_screen.dart @@ -0,0 +1,115 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../routing/routes.dart'; +import '../../core/localization/applocalization.dart'; +import '../../core/ui/error_indicator.dart'; +import '../view_models/booking_viewmodel.dart'; +import 'booking_body.dart'; + +class BookingScreen extends StatefulWidget { + const BookingScreen({ + super.key, + required this.viewModel, + }); + + final BookingViewModel viewModel; + + @override + State createState() => _BookingScreenState(); +} + +class _BookingScreenState extends State { + @override + void initState() { + super.initState(); + widget.viewModel.shareBooking.addListener(_listener); + } + + @override + void dispose() { + widget.viewModel.shareBooking.removeListener(_listener); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, r) { + // Back navigation always goes to home + if (!didPop) context.go(Routes.home); + }, + child: Scaffold( + floatingActionButton: ListenableBuilder( + listenable: widget.viewModel, + builder: (context, _) => FloatingActionButton.extended( + // Workaround for https://github.com/flutter/flutter/issues/115358#issuecomment-2117157419 + heroTag: null, + key: const ValueKey('share-button'), + onPressed: widget.viewModel.booking != null + ? widget.viewModel.shareBooking.execute + : null, + label: Text(AppLocalization.of(context).shareTrip), + icon: const Icon(Icons.share_outlined), + ), + ), + body: ListenableBuilder( + // Listen to changes in both commands + listenable: Listenable.merge([ + widget.viewModel.createBooking, + widget.viewModel.loadBooking, + ]), + builder: (context, child) { + // If either command is running, show progress indicator + if (widget.viewModel.createBooking.running || + widget.viewModel.loadBooking.running) { + return const Center( + child: CircularProgressIndicator(), + ); + } + // If fails to create booking, tap to try again + if (widget.viewModel.createBooking.error) { + return Center( + child: ErrorIndicator( + title: AppLocalization.of(context).errorWhileLoadingBooking, + label: AppLocalization.of(context).tryAgain, + onPressed: widget.viewModel.createBooking.execute, + ), + ); + } + // If existing booking fails to load, tap to go /home + if (widget.viewModel.loadBooking.error) { + return Center( + child: ErrorIndicator( + title: AppLocalization.of(context).errorWhileLoadingBooking, + label: AppLocalization.of(context).close, + onPressed: () => context.go(Routes.home), + ), + ); + } + return child!; + }, + child: BookingBody(viewModel: widget.viewModel), + ), + ), + ); + } + + void _listener() { + if (widget.viewModel.shareBooking.error) { + widget.viewModel.shareBooking.clearResult(); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(AppLocalization.of(context).errorWhileSharing), + action: SnackBarAction( + label: AppLocalization.of(context).tryAgain, + onPressed: widget.viewModel.shareBooking.execute, + ), + )); + } + } +} diff --git a/compass_app/app/lib/ui/core/localization/applocalization.dart b/compass_app/app/lib/ui/core/localization/applocalization.dart new file mode 100644 index 000000000..923796cbb --- /dev/null +++ b/compass_app/app/lib/ui/core/localization/applocalization.dart @@ -0,0 +1,121 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +/// Simple Localizations similar to +/// https://docs.flutter.dev/ui/accessibility-and-internationalization/internationalization#an-alternative-class-for-the-apps-localized-resources +class AppLocalization { + static AppLocalization of(BuildContext context) { + return Localizations.of(context, AppLocalization); + } + + static const _strings = { + 'activities': 'Activities', + 'addDates': 'Add Dates', + 'bookingDeleted': 'Booking deleted', + 'bookNewTrip': 'Book New Trip', + 'close': 'Close', + 'confirm': 'Confirm', + 'daytime': 'Daytime', + 'errorWhileDeletingBooking': 'Error while deleting booking', + 'errorWhileLoadingActivities': 'Error while loading activities', + 'errorWhileLoadingBooking': 'Error while loading booking', + 'errorWhileLoadingContinents': 'Error while loading continents', + 'errorWhileLoadingDestinations': 'Error while loading destinations', + 'errorWhileLoadingHome': 'Error while loading home', + 'errorWhileLogin': 'Error while trying to login', + 'errorWhileLogout': 'Error while trying to logout', + 'errorWhileSavingActivities': 'Error while saving activities', + 'errorWhileSavingItinerary': 'Error while saving itinerary', + 'errorWhileSharing': 'Error while sharing booking', + 'evening': 'Evening', + 'login': 'Login', + 'nameTrips': '{name}\'s Trips', + 'search': 'Search', + 'searchDestination': 'Search destination', + 'selected': '{1} selected', + 'shareTrip': 'Share Trip', + 'tryAgain': 'Try again', + 'yourChosenActivities': 'Your chosen activities', + 'when': 'When', + }; + + // If string for "label" does not exist, will show "[LABEL]" + static String _get(String label) => + _strings[label] ?? '[${label.toUpperCase()}]'; + + String get activities => _get('activities'); + + String get addDates => _get('addDates'); + + String get confirm => _get('confirm'); + + String get daytime => _get('daytime'); + + String get errorWhileLoadingActivities => _get('errorWhileLoadingActivities'); + + String get errorWhileLoadingBooking => _get('errorWhileLoadingBooking'); + + String get errorWhileLoadingContinents => _get('errorWhileLoadingContinents'); + + String get errorWhileLoadingDestinations => + _get('errorWhileLoadingDestinations'); + + String get errorWhileSavingActivities => _get('errorWhileSavingActivities'); + + String get errorWhileSavingItinerary => _get('errorWhileSavingItinerary'); + + String get evening => _get('evening'); + + String get search => _get('search'); + + String get searchDestination => _get('searchDestination'); + + String get shareTrip => _get('shareTrip'); + + String get tryAgain => _get('tryAgain'); + + String get yourChosenActivities => _get('yourChosenActivities'); + + String get when => _get('when'); + + String get errorWhileLogin => _get('errorWhileLogin'); + + String get login => _get('login'); + + String get errorWhileLogout => _get('errorWhileLogout'); + + String get close => _get('close'); + + String get errorWhileSharing => _get('errorWhileSharing'); + + String get bookNewTrip => _get('bookNewTrip'); + + String get errorWhileLoadingHome => _get('errorWhileLoadingHome'); + + String get bookingDeleted => _get('bookingDeleted'); + + String get errorWhileDeletingBooking => _get('errorWhileDeletingBooking'); + + String nameTrips(String name) => _get('nameTrips').replaceAll('{name}', name); + + String selected(int value) => + _get('selected').replaceAll('{1}', value.toString()); +} + +class AppLocalizationDelegate extends LocalizationsDelegate { + @override + bool isSupported(Locale locale) => locale.languageCode == 'en'; + + @override + Future load(Locale locale) { + return SynchronousFuture(AppLocalization()); + } + + @override + bool shouldReload(covariant LocalizationsDelegate old) => + false; +} diff --git a/compass_app/app/lib/ui/core/themes/colors.dart b/compass_app/app/lib/ui/core/themes/colors.dart new file mode 100644 index 000000000..9e42e36ec --- /dev/null +++ b/compass_app/app/lib/ui/core/themes/colors.dart @@ -0,0 +1,41 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +class AppColors { + static const black1 = Color(0xFF101010); + static const white1 = Color(0xFFFFF7FA); + static const grey1 = Color(0xFFF2F2F2); + static const grey2 = Color(0xFF4D4D4D); + static const grey3 = Color(0xFFA4A4A4); + static const whiteTransparent = + Color(0x4DFFFFFF); // Figma rgba(255, 255, 255, 0.3) + static const blackTransparent = Color(0x4D000000); + static const red1 = Color(0xFFE74C3C); + + static const lightColorScheme = ColorScheme( + brightness: Brightness.light, + primary: AppColors.black1, + onPrimary: AppColors.white1, + secondary: AppColors.black1, + onSecondary: AppColors.white1, + surface: Colors.white, + onSurface: AppColors.black1, + error: Colors.white, + onError: Colors.red, + ); + + static const darkColorScheme = ColorScheme( + brightness: Brightness.dark, + primary: AppColors.white1, + onPrimary: AppColors.black1, + secondary: AppColors.white1, + onSecondary: AppColors.black1, + surface: AppColors.black1, + onSurface: Colors.white, + error: Colors.black, + onError: AppColors.red1, + ); +} diff --git a/compass_app/app/lib/ui/core/themes/dimens.dart b/compass_app/app/lib/ui/core/themes/dimens.dart new file mode 100644 index 000000000..c2c895ae8 --- /dev/null +++ b/compass_app/app/lib/ui/core/themes/dimens.dart @@ -0,0 +1,65 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +sealed class Dimens { + const Dimens(); + + /// General horizontal padding used to separate UI items + static const paddingHorizontal = 20.0; + + /// General vertical padding used to separate UI items + static const paddingVertical = 24.0; + + /// Horizontal padding for screen edges + abstract final double paddingScreenHorizontal; + + /// Vertical padding for screen edges + abstract final double paddingScreenVertical; + + /// Horizontal symmetric padding for screen edges + EdgeInsets get edgeInsetsScreenHorizontal => + EdgeInsets.symmetric(horizontal: paddingScreenHorizontal); + + /// Symmetric padding for screen edges + EdgeInsets get edgeInsetsScreenSymmetric => EdgeInsets.symmetric( + horizontal: paddingScreenHorizontal, vertical: paddingScreenVertical); + + static final dimensDesktop = DimensDesktop(); + static final dimensMobile = DimensMobile(); + + /// Get dimensions definition based on screen size + factory Dimens.of(BuildContext context) => + switch (MediaQuery.sizeOf(context).width) { + > 600 => dimensDesktop, + _ => dimensMobile, + }; + + abstract final double profilePictureSize; +} + +/// Mobile dimensions +class DimensMobile extends Dimens { + @override + double paddingScreenHorizontal = Dimens.paddingHorizontal; + + @override + double paddingScreenVertical = Dimens.paddingVertical; + + @override + double get profilePictureSize => 64.0; +} + +/// Desktop/Web dimensions +class DimensDesktop extends Dimens { + @override + double paddingScreenHorizontal = 100.0; + + @override + double paddingScreenVertical = 64.0; + + @override + double get profilePictureSize => 128.0; +} diff --git a/compass_app/app/lib/ui/core/themes/theme.dart b/compass_app/app/lib/ui/core/themes/theme.dart new file mode 100644 index 000000000..34ae0c989 --- /dev/null +++ b/compass_app/app/lib/ui/core/themes/theme.dart @@ -0,0 +1,84 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'colors.dart'; +import '../ui/tag_chip.dart'; +import 'package:flutter/material.dart'; + +class AppTheme { + static const _textTheme = TextTheme( + headlineLarge: TextStyle( + fontSize: 32, + fontWeight: FontWeight.w500, + ), + headlineSmall: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w400, + ), + titleMedium: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w500, + ), + bodyLarge: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w400, + ), + bodyMedium: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w400, + ), + bodySmall: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w400, + color: AppColors.grey3, + ), + labelSmall: TextStyle( + fontSize: 10, + fontWeight: FontWeight.w500, + color: AppColors.grey3, + ), + labelLarge: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w400, + color: AppColors.grey3, + ), + ); + + static const _inputDecorationTheme = InputDecorationTheme( + hintStyle: TextStyle( + // grey3 works for both light and dark themes + color: AppColors.grey3, + fontSize: 18.0, + fontWeight: FontWeight.w400, + ), + ); + + static ThemeData lightTheme = ThemeData( + useMaterial3: true, + brightness: Brightness.light, + colorScheme: AppColors.lightColorScheme, + textTheme: _textTheme, + inputDecorationTheme: _inputDecorationTheme, + extensions: [ + TagChipTheme( + chipColor: AppColors.whiteTransparent, + onChipColor: Colors.white, + ), + ], + ); + + static ThemeData darkTheme = ThemeData( + useMaterial3: true, + brightness: Brightness.dark, + colorScheme: AppColors.darkColorScheme, + textTheme: _textTheme, + inputDecorationTheme: _inputDecorationTheme, + extensions: [ + TagChipTheme( + chipColor: AppColors.blackTransparent, + onChipColor: Colors.white, + ), + ], + ); +} diff --git a/compass_app/app/lib/ui/core/ui/back_button.dart b/compass_app/app/lib/ui/core/ui/back_button.dart new file mode 100644 index 000000000..5d0bf5f46 --- /dev/null +++ b/compass_app/app/lib/ui/core/ui/back_button.dart @@ -0,0 +1,63 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../themes/colors.dart'; +import 'blur_filter.dart'; + +/// Custom back button to pop navigation. +class CustomBackButton extends StatelessWidget { + const CustomBackButton({ + super.key, + this.onTap, + this.blur = false, + }); + + final bool blur; + final GestureTapCallback? onTap; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 40.0, + width: 40.0, + child: Stack( + children: [ + if (blur) + ClipRect( + child: BackdropFilter( + filter: kBlurFilter, + child: const SizedBox(height: 40.0, width: 40.0), + ), + ), + DecoratedBox( + decoration: BoxDecoration( + border: Border.all(color: AppColors.grey1), + borderRadius: BorderRadius.circular(8.0), + ), + child: InkWell( + borderRadius: BorderRadius.circular(8.0), + onTap: () { + if (onTap != null) { + onTap!(); + } else { + context.pop(); + } + }, + child: Center( + child: Icon( + size: 24.0, + Icons.arrow_back, + color: Theme.of(context).colorScheme.onSurface, + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/compass_app/app/lib/ui/core/ui/blur_filter.dart b/compass_app/app/lib/ui/core/ui/blur_filter.dart new file mode 100644 index 000000000..5ceccd6dd --- /dev/null +++ b/compass_app/app/lib/ui/core/ui/blur_filter.dart @@ -0,0 +1,7 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:ui'; + +final kBlurFilter = ImageFilter.blur(sigmaX: 2, sigmaY: 2); diff --git a/compass_app/app/lib/ui/core/ui/custom_checkbox.dart b/compass_app/app/lib/ui/core/ui/custom_checkbox.dart new file mode 100644 index 000000000..515e91a3d --- /dev/null +++ b/compass_app/app/lib/ui/core/ui/custom_checkbox.dart @@ -0,0 +1,50 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +import '../themes/colors.dart'; + +class CustomCheckbox extends StatelessWidget { + const CustomCheckbox({ + super.key, + required this.value, + required this.onChanged, + }); + + final bool value; + final ValueChanged onChanged; + + @override + Widget build(BuildContext context) { + return InkResponse( + radius: 24, + onTap: () => onChanged(!value), + child: DecoratedBox( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(24), + border: Border.all(color: AppColors.grey3), + ), + child: Material( + borderRadius: BorderRadius.circular(24), + color: value + ? Theme.of(context).colorScheme.primary + : Colors.transparent, + child: SizedBox( + width: 24, + height: 24, + child: Visibility( + visible: value, + child: Icon( + Icons.check, + size: 14, + color: Theme.of(context).colorScheme.onPrimary, + ), + ), + ), + ), + ), + ); + } +} diff --git a/compass_app/app/lib/ui/core/ui/date_format_start_end.dart b/compass_app/app/lib/ui/core/ui/date_format_start_end.dart new file mode 100644 index 000000000..2b2d00e45 --- /dev/null +++ b/compass_app/app/lib/ui/core/ui/date_format_start_end.dart @@ -0,0 +1,24 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +final _dateFormatDay = DateFormat('d'); +final _dateFormatDayMonth = DateFormat('d MMM'); + +String dateFormatStartEnd(DateTimeRange dateTimeRange) { + final start = dateTimeRange.start; + final end = dateTimeRange.end; + + final dayMonthEnd = _dateFormatDayMonth.format(end); + + if (start.month == end.month) { + final dayStart = _dateFormatDay.format(start); + return '$dayStart - $dayMonthEnd'; + } + + final dayMonthStart = _dateFormatDayMonth.format(start); + return '$dayMonthStart - $dayMonthEnd'; +} diff --git a/compass_app/app/lib/ui/core/ui/error_indicator.dart b/compass_app/app/lib/ui/core/ui/error_indicator.dart new file mode 100644 index 000000000..5e328546b --- /dev/null +++ b/compass_app/app/lib/ui/core/ui/error_indicator.dart @@ -0,0 +1,63 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +import '../themes/colors.dart'; + +class ErrorIndicator extends StatelessWidget { + const ErrorIndicator({ + super.key, + required this.title, + required this.label, + required this.onPressed, + }); + + final String title; + final String label; + final VoidCallback onPressed; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + IntrinsicWidth( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Center( + child: Row( + children: [ + Icon( + Icons.error_outline, + color: Theme.of(context).colorScheme.onError, + ), + const SizedBox(width: 10), + Text( + title, + style: TextStyle( + color: Theme.of(context).colorScheme.onError, + ), + ), + ], + ), + ), + ), + ), + const SizedBox( + height: 10, + ), + FilledButton( + onPressed: onPressed, + style: const ButtonStyle( + backgroundColor: WidgetStatePropertyAll(AppColors.red1), + foregroundColor: WidgetStatePropertyAll(Colors.white), + ), + child: Text(label), + ), + ], + ); + } +} diff --git a/compass_app/app/lib/ui/core/ui/home_button.dart b/compass_app/app/lib/ui/core/ui/home_button.dart new file mode 100644 index 000000000..460c6b301 --- /dev/null +++ b/compass_app/app/lib/ui/core/ui/home_button.dart @@ -0,0 +1,60 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../routing/routes.dart'; +import '../themes/colors.dart'; +import 'blur_filter.dart'; + +/// Home button to navigate back to the '/' path. +class HomeButton extends StatelessWidget { + const HomeButton({ + super.key, + this.blur = false, + }); + + final bool blur; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 40.0, + width: 40.0, + child: Stack( + fit: StackFit.expand, + children: [ + if (blur) + ClipRect( + child: BackdropFilter( + filter: kBlurFilter, + child: const SizedBox(height: 40.0, width: 40.0), + ), + ), + DecoratedBox( + decoration: BoxDecoration( + border: Border.all(color: AppColors.grey1), + borderRadius: BorderRadius.circular(8.0), + color: Colors.transparent, + ), + child: InkWell( + borderRadius: BorderRadius.circular(8.0), + onTap: () { + context.go(Routes.home); + }, + child: Center( + child: Icon( + size: 24.0, + Icons.home_outlined, + color: Theme.of(context).colorScheme.onSurface, + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/compass_app/app/lib/ui/core/ui/scroll_behavior.dart b/compass_app/app/lib/ui/core/ui/scroll_behavior.dart new file mode 100644 index 000000000..eda9d171c --- /dev/null +++ b/compass_app/app/lib/ui/core/ui/scroll_behavior.dart @@ -0,0 +1,17 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; + +/// Custom scroll behavior to allow dragging with mouse. +/// Necessary to allow dragging with mouse on Continents carousel. +class AppCustomScrollBehavior extends MaterialScrollBehavior { + @override + Set get dragDevices => { + PointerDeviceKind.touch, + // Allow to drag with mouse on Regions carousel + PointerDeviceKind.mouse, + }; +} diff --git a/compass_app/app/lib/ui/core/ui/search_bar.dart b/compass_app/app/lib/ui/core/ui/search_bar.dart new file mode 100644 index 000000000..18859d4d1 --- /dev/null +++ b/compass_app/app/lib/ui/core/ui/search_bar.dart @@ -0,0 +1,111 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +import '../../../domain/models/itinerary_config/itinerary_config.dart'; +import '../localization/applocalization.dart'; +import '../themes/colors.dart'; +import '../themes/dimens.dart'; +import 'date_format_start_end.dart'; +import 'home_button.dart'; + +/// Application top search bar. +/// +/// Displays a search bar with the current configuration. +/// Includes [HomeButton] to navigate back to the '/' path. +class AppSearchBar extends StatelessWidget { + const AppSearchBar({ + super.key, + this.config, + this.onTap, + }); + + final ItineraryConfig? config; + final GestureTapCallback? onTap; + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + child: InkWell( + borderRadius: BorderRadius.circular(16.0), + onTap: onTap, + child: Container( + height: 64, + decoration: BoxDecoration( + border: Border.all(color: AppColors.grey1), + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: Dimens.paddingHorizontal, + ), + child: Align( + alignment: AlignmentDirectional.centerStart, + child: _QueryText(config: config), + ), + ), + ), + ), + ), + const SizedBox(width: 10), + const HomeButton(), + ], + ); + } +} + +class _QueryText extends StatelessWidget { + const _QueryText({ + required this.config, + }); + + final ItineraryConfig? config; + + @override + Widget build(BuildContext context) { + if (config == null) { + return const _EmptySearch(); + } + + final ItineraryConfig(:continent, :startDate, :endDate, :guests) = config!; + if (startDate == null || + endDate == null || + guests == null || + continent == null) { + return const _EmptySearch(); + } + + return Text( + '$continent - ${dateFormatStartEnd(DateTimeRange(start: startDate, end: endDate))} - Guests: $guests', + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.bodyLarge, + ); + } +} + +class _EmptySearch extends StatelessWidget { + const _EmptySearch(); + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + const Icon(Icons.search), + const SizedBox(width: 12), + Expanded( + child: Text( + AppLocalization.of(context).searchDestination, + textAlign: TextAlign.start, + style: Theme.of(context).inputDecorationTheme.hintStyle, + ), + ), + ], + ); + } +} diff --git a/compass_app/app/lib/ui/core/ui/tag_chip.dart b/compass_app/app/lib/ui/core/ui/tag_chip.dart new file mode 100644 index 000000000..a06fea6f3 --- /dev/null +++ b/compass_app/app/lib/ui/core/ui/tag_chip.dart @@ -0,0 +1,144 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:ui'; + +import '../themes/colors.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class TagChip extends StatelessWidget { + const TagChip({ + super.key, + required this.tag, + this.fontSize = 10, + this.height = 20, + this.chipColor, + this.onChipColor, + }); + + final String tag; + + final double fontSize; + final double height; + final Color? chipColor; + final Color? onChipColor; + + @override + Widget build(BuildContext context) { + return ClipRRect( + borderRadius: BorderRadius.circular(height / 2), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 3, sigmaY: 3), + child: DecoratedBox( + decoration: BoxDecoration( + color: chipColor ?? + Theme.of(context).extension()?.chipColor ?? + AppColors.whiteTransparent, + ), + child: SizedBox( + height: height, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 6.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + _iconFrom(tag), + color: onChipColor ?? + Theme.of(context) + .extension() + ?.onChipColor ?? + Colors.white, + size: fontSize, + ), + const SizedBox(width: 4), + Text( + tag, + textAlign: TextAlign.center, + style: _textStyle(context), + ), + ], + ), + ), + ), + ), + ), + ); + } + + IconData? _iconFrom(String tag) { + return switch (tag) { + 'Adventure sports' => Icons.kayaking_outlined, + 'Beach' => Icons.beach_access_outlined, + 'City' => Icons.location_city_outlined, + 'Cultural experiences' => Icons.museum_outlined, + 'Foodie' || 'Food tours' => Icons.restaurant, + 'Hiking' => Icons.hiking, + 'Historic' => Icons.menu_book_outlined, + 'Island' || 'Coastal' || 'Lake' || 'River' => Icons.water, + 'Luxury' => Icons.attach_money_outlined, + 'Mountain' || 'Wildlife watching' => Icons.landscape_outlined, + 'Nightlife' => Icons.local_bar_outlined, + 'Off-the-beaten-path' => Icons.do_not_step_outlined, + 'Romantic' => Icons.favorite_border_outlined, + 'Rural' => Icons.agriculture_outlined, + 'Secluded' => Icons.church_outlined, + 'Sightseeing' => Icons.attractions_outlined, + 'Skiing' => Icons.downhill_skiing_outlined, + 'Wine tasting' => Icons.wine_bar_outlined, + 'Winter destination' => Icons.ac_unit, + _ => Icons.label_outlined, + }; + } + + // Note: original Figma file uses Google Sans + // which is not available on GoogleFonts + _textStyle(BuildContext context) => GoogleFonts.openSans( + textStyle: TextStyle( + fontWeight: FontWeight.w500, + fontSize: fontSize, + color: onChipColor ?? + Theme.of(context).extension()?.onChipColor ?? + Colors.white, + textBaseline: TextBaseline.alphabetic, + ), + ); +} + +class TagChipTheme extends ThemeExtension { + final Color chipColor; + final Color onChipColor; + + TagChipTheme({ + required this.chipColor, + required this.onChipColor, + }); + + @override + ThemeExtension copyWith({ + Color? chipColor, + Color? onChipColor, + }) { + return TagChipTheme( + chipColor: chipColor ?? this.chipColor, + onChipColor: onChipColor ?? this.onChipColor, + ); + } + + @override + ThemeExtension lerp( + covariant ThemeExtension other, + double t, + ) { + if (other is! TagChipTheme) { + return this; + } + return TagChipTheme( + chipColor: Color.lerp(chipColor, other.chipColor, t) ?? chipColor, + onChipColor: Color.lerp(onChipColor, other.onChipColor, t) ?? onChipColor, + ); + } +} diff --git a/compass_app/app/lib/ui/home/view_models/home_viewmodel.dart b/compass_app/app/lib/ui/home/view_models/home_viewmodel.dart new file mode 100644 index 000000000..093cb75fc --- /dev/null +++ b/compass_app/app/lib/ui/home/view_models/home_viewmodel.dart @@ -0,0 +1,95 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:logging/logging.dart'; + +import '../../../data/repositories/booking/booking_repository.dart'; +import '../../../data/repositories/user/user_repository.dart'; +import '../../../domain/models/booking/booking_summary.dart'; +import '../../../domain/models/user/user.dart'; +import '../../../utils/command.dart'; +import '../../../utils/result.dart'; + +class HomeViewModel extends ChangeNotifier { + HomeViewModel({ + required BookingRepository bookingRepository, + required UserRepository userRepository, + }) : _bookingRepository = bookingRepository, + _userRepository = userRepository { + load = Command0(_load)..execute(); + deleteBooking = Command1(_deleteBooking); + } + + final BookingRepository _bookingRepository; + final UserRepository _userRepository; + final _log = Logger('HomeViewModel'); + List _bookings = []; + User? _user; + + late Command0 load; + late Command1 deleteBooking; + + List get bookings => _bookings; + + User? get user => _user; + + Future _load() async { + try { + final result = await _bookingRepository.getBookingsList(); + switch (result) { + case Ok>(): + _bookings = result.value; + _log.fine('Loaded bookings'); + case Error>(): + _log.warning('Failed to load bookings', result.error); + return result; + } + + final userResult = await _userRepository.getUser(); + switch (userResult) { + case Ok(): + _user = userResult.value; + _log.fine('Loaded user'); + case Error(): + _log.warning('Failed to load user', userResult.error); + } + + return userResult; + } finally { + notifyListeners(); + } + } + + Future> _deleteBooking(int id) async { + try { + final resultDelete = await _bookingRepository.delete(id); + switch (resultDelete) { + case Ok(): + _log.fine('Deleted booking $id'); + case Error(): + _log.warning('Failed to delete booking $id', resultDelete.error); + return resultDelete; + } + + // After deleting the booking, we need to reload the bookings list. + // BookingRepository is the source of truth for bookings. + final resultLoadBookings = await _bookingRepository.getBookingsList(); + switch (resultLoadBookings) { + case Ok>(): + _bookings = resultLoadBookings.value; + _log.fine('Loaded bookings'); + case Error>(): + _log.warning('Failed to load bookings', resultLoadBookings.error); + return resultLoadBookings; + } + + return resultLoadBookings; + } finally { + notifyListeners(); + } + } +} diff --git a/compass_app/app/lib/ui/home/widgets/home_screen.dart b/compass_app/app/lib/ui/home/widgets/home_screen.dart new file mode 100644 index 000000000..5a3fce717 --- /dev/null +++ b/compass_app/app/lib/ui/home/widgets/home_screen.dart @@ -0,0 +1,198 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../domain/models/booking/booking_summary.dart'; +import '../../../routing/routes.dart'; +import '../../core/localization/applocalization.dart'; +import '../../core/themes/dimens.dart'; +import '../../core/ui/date_format_start_end.dart'; +import '../../core/ui/error_indicator.dart'; +import '../view_models/home_viewmodel.dart'; +import 'home_title.dart'; + +const String bookingButtonKey = 'booking-button'; + +class HomeScreen extends StatefulWidget { + const HomeScreen({ + super.key, + required this.viewModel, + }); + + final HomeViewModel viewModel; + + @override + State createState() => _HomeScreenState(); +} + +class _HomeScreenState extends State { + @override + void initState() { + super.initState(); + widget.viewModel.deleteBooking.addListener(_onResult); + } + + @override + void didUpdateWidget(covariant HomeScreen oldWidget) { + super.didUpdateWidget(oldWidget); + oldWidget.viewModel.deleteBooking.removeListener(_onResult); + widget.viewModel.deleteBooking.addListener(_onResult); + } + + @override + void dispose() { + widget.viewModel.deleteBooking.removeListener(_onResult); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + floatingActionButton: FloatingActionButton.extended( + // Workaround for https://github.com/flutter/flutter/issues/115358#issuecomment-2117157419 + heroTag: null, + key: const ValueKey(bookingButtonKey), + onPressed: () => context.go(Routes.search), + label: Text(AppLocalization.of(context).bookNewTrip), + icon: const Icon(Icons.add_location_outlined), + ), + body: SafeArea( + top: true, + bottom: true, + child: ListenableBuilder( + listenable: widget.viewModel.load, + builder: (context, child) { + if (widget.viewModel.load.running) { + return const Center( + child: CircularProgressIndicator(), + ); + } + + if (widget.viewModel.load.error) { + return ErrorIndicator( + title: AppLocalization.of(context).errorWhileLoadingHome, + label: AppLocalization.of(context).tryAgain, + onPressed: widget.viewModel.load.execute, + ); + } + + return child!; + }, + child: ListenableBuilder( + listenable: widget.viewModel, + builder: (context, _) { + return CustomScrollView( + slivers: [ + SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.symmetric( + vertical: Dimens.of(context).paddingScreenVertical, + horizontal: Dimens.of(context).paddingScreenHorizontal, + ), + child: HomeHeader(viewModel: widget.viewModel), + ), + ), + SliverList.builder( + itemCount: widget.viewModel.bookings.length, + itemBuilder: (_, index) => _Booking( + key: ValueKey(widget.viewModel.bookings[index].id), + booking: widget.viewModel.bookings[index], + onTap: () => context.push(Routes.bookingWithId( + widget.viewModel.bookings[index].id)), + confirmDismiss: (_) async { + // wait for command to complete + await widget.viewModel.deleteBooking.execute( + widget.viewModel.bookings[index].id, + ); + // if command completed successfully, return true + if (widget.viewModel.deleteBooking.completed) { + // removes the dismissable from the list + return true; + } else { + // the dismissable stays in the list + return false; + } + }, + ), + ) + ], + ); + }, + ), + ), + ), + ); + } + + void _onResult() { + if (widget.viewModel.deleteBooking.completed) { + widget.viewModel.deleteBooking.clearResult(); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(AppLocalization.of(context).bookingDeleted), + ), + ); + } + + if (widget.viewModel.deleteBooking.error) { + widget.viewModel.deleteBooking.clearResult(); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(AppLocalization.of(context).errorWhileDeletingBooking), + ), + ); + } + } +} + +class _Booking extends StatelessWidget { + const _Booking({ + super.key, + required this.booking, + required this.onTap, + required this.confirmDismiss, + }); + + final BookingSummary booking; + final GestureTapCallback onTap; + final ConfirmDismissCallback confirmDismiss; + + @override + Widget build(BuildContext context) { + return Dismissible( + key: ValueKey(booking.id), + direction: DismissDirection.endToStart, + confirmDismiss: confirmDismiss, + child: InkWell( + onTap: onTap, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: Dimens.of(context).paddingScreenHorizontal, + vertical: Dimens.paddingVertical, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + booking.name, + style: Theme.of(context).textTheme.titleLarge, + ), + Text( + dateFormatStartEnd( + DateTimeRange( + start: booking.startDate, + end: booking.endDate, + ), + ), + style: Theme.of(context).textTheme.bodyLarge, + ), + ], + ), + ), + ), + ); + } +} diff --git a/compass_app/app/lib/ui/home/widgets/home_title.dart b/compass_app/app/lib/ui/home/widgets/home_title.dart new file mode 100644 index 000000000..4d9dfacf5 --- /dev/null +++ b/compass_app/app/lib/ui/home/widgets/home_title.dart @@ -0,0 +1,89 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; + +import '../../auth/logout/view_models/logout_viewmodel.dart'; +import '../../auth/logout/widgets/logout_button.dart'; +import '../../core/localization/applocalization.dart'; +import '../../core/themes/dimens.dart'; +import '../view_models/home_viewmodel.dart'; + +class HomeHeader extends StatelessWidget { + const HomeHeader({ + super.key, + required this.viewModel, + }); + + final HomeViewModel viewModel; + + @override + Widget build(BuildContext context) { + final user = viewModel.user; + if (user == null) { + return const SizedBox(); + } + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ClipOval( + child: Image.asset( + user.picture, + width: Dimens.of(context).profilePictureSize, + height: Dimens.of(context).profilePictureSize, + ), + ), + LogoutButton( + viewModel: LogoutViewModel( + authRepository: context.read(), + itineraryConfigRepository: context.read(), + ), + ), + ], + ), + const SizedBox(height: Dimens.paddingVertical), + _Title( + text: AppLocalization.of(context).nameTrips(user.name), + ), + ], + ); + } +} + +class _Title extends StatelessWidget { + const _Title({ + required this.text, + }); + + final String text; + + @override + Widget build(BuildContext context) { + return ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (bounds) => RadialGradient( + center: Alignment.bottomLeft, + radius: 2, + colors: [ + Colors.purple.shade700, + Colors.purple.shade400, + ], + ).createShader( + Rect.fromLTWH(0, 0, bounds.width, bounds.height), + ), + child: Text( + text, + style: GoogleFonts.rubik( + textStyle: Theme.of(context).textTheme.headlineLarge, + ), + ), + ); + } +} diff --git a/compass_app/app/lib/ui/results/view_models/results_viewmodel.dart b/compass_app/app/lib/ui/results/view_models/results_viewmodel.dart new file mode 100644 index 000000000..5a2690ab9 --- /dev/null +++ b/compass_app/app/lib/ui/results/view_models/results_viewmodel.dart @@ -0,0 +1,111 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:logging/logging.dart'; + +import '../../../data/repositories/destination/destination_repository.dart'; +import '../../../data/repositories/itinerary_config/itinerary_config_repository.dart'; +import '../../../domain/models/destination/destination.dart'; +import '../../../domain/models/itinerary_config/itinerary_config.dart'; +import '../../../utils/command.dart'; +import '../../../utils/result.dart'; +import 'package:flutter/cupertino.dart'; + +/// Results screen view model +/// Based on https://docs.flutter.dev/get-started/fwe/state-management#using-mvvm-for-your-applications-architecture +class ResultsViewModel extends ChangeNotifier { + ResultsViewModel({ + required DestinationRepository destinationRepository, + required ItineraryConfigRepository itineraryConfigRepository, + }) : _destinationRepository = destinationRepository, + _itineraryConfigRepository = itineraryConfigRepository { + updateItineraryConfig = Command1(_updateItineraryConfig); + search = Command0(_search)..execute(); + } + + final _log = Logger('ResultsViewModel'); + + final DestinationRepository _destinationRepository; + + final ItineraryConfigRepository _itineraryConfigRepository; + + // Setters are private + List _destinations = []; + + /// List of destinations, may be empty but never null + List get destinations => _destinations; + + ItineraryConfig? _itineraryConfig; + + /// Filter options to display on search bar + ItineraryConfig get config => _itineraryConfig ?? const ItineraryConfig(); + + /// Perform search + late final Command0 search; + + /// Store ViewModel data into [ItineraryConfigRepository] before navigating. + late final Command1 updateItineraryConfig; + + Future> _search() async { + // Load current itinerary config + final resultConfig = await _itineraryConfigRepository.getItineraryConfig(); + if (resultConfig is Error) { + _log.warning( + 'Failed to load stored ItineraryConfig', + resultConfig.asError.error, + ); + return resultConfig; + } + _itineraryConfig = resultConfig.asOk.value; + notifyListeners(); + + final result = await _destinationRepository.getDestinations(); + switch (result) { + case Ok(): + { + // If the result is Ok, update the list of destinations + _destinations = result.value + .where((destination) => + destination.continent == _itineraryConfig!.continent) + .toList(); + _log.fine('Destinations (${_destinations.length}) loaded'); + } + case Error(): + { + _log.warning('Failed to load destinations', result.error); + } + } + + // After finish loading results, notify the view + notifyListeners(); + return result; + } + + Future> _updateItineraryConfig(String destinationRef) async { + assert(destinationRef.isNotEmpty, "destinationRef should not be empty"); + + final resultConfig = await _itineraryConfigRepository.getItineraryConfig(); + if (resultConfig is Error) { + _log.warning( + 'Failed to load stored ItineraryConfig', + resultConfig.asError.error, + ); + return resultConfig; + } + + final itineraryConfig = resultConfig.asOk.value; + final result = await _itineraryConfigRepository + .setItineraryConfig(itineraryConfig.copyWith( + destination: destinationRef, + activities: [], + )); + if (result is Error) { + _log.warning( + 'Failed to store ItineraryConfig', + result.asError.error, + ); + } + return result; + } +} diff --git a/compass_app/app/lib/ui/results/widgets/result_card.dart b/compass_app/app/lib/ui/results/widgets/result_card.dart new file mode 100644 index 000000000..7a3adc6a8 --- /dev/null +++ b/compass_app/app/lib/ui/results/widgets/result_card.dart @@ -0,0 +1,89 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import '../../../domain/models/destination/destination.dart'; +import '../../../utils/image_error_listener.dart'; +import '../../core/ui/tag_chip.dart'; + +class ResultCard extends StatelessWidget { + const ResultCard({ + super.key, + required this.destination, + required this.onTap, + }); + + final Destination destination; + final GestureTapCallback onTap; + + @override + Widget build(BuildContext context) { + return ClipRRect( + borderRadius: BorderRadius.circular(10.0), + child: Stack( + fit: StackFit.expand, + children: [ + CachedNetworkImage( + imageUrl: destination.imageUrl, + fit: BoxFit.fitHeight, + errorWidget: (context, url, error) => const Icon(Icons.error), + errorListener: imageErrorListener, + ), + Positioned( + bottom: 12.0, + left: 12.0, + right: 12.0, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + destination.name.toUpperCase(), + style: _cardTitleStyle, + ), + const SizedBox( + height: 6, + ), + Wrap( + spacing: 4.0, + runSpacing: 4.0, + direction: Axis.horizontal, + children: + destination.tags.map((e) => TagChip(tag: e)).toList(), + ), + ], + ), + ), + // Handle taps + Positioned.fill( + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: onTap, + ), + ), + ), + ], + ), + ); + } +} + +final _cardTitleStyle = GoogleFonts.rubik( + textStyle: const TextStyle( + fontWeight: FontWeight.w800, + fontSize: 15.0, + color: Colors.white, + letterSpacing: 1, + shadows: [ + // Helps to read the text a bit better + Shadow( + blurRadius: 3.0, + color: Colors.black, + ) + ], + ), +); diff --git a/compass_app/app/lib/ui/results/widgets/results_screen.dart b/compass_app/app/lib/ui/results/widgets/results_screen.dart new file mode 100644 index 000000000..cbe9778a5 --- /dev/null +++ b/compass_app/app/lib/ui/results/widgets/results_screen.dart @@ -0,0 +1,180 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../routing/routes.dart'; +import '../../core/localization/applocalization.dart'; +import '../../core/themes/dimens.dart'; +import '../../core/ui/error_indicator.dart'; +import '../../core/ui/search_bar.dart'; +import '../view_models/results_viewmodel.dart'; +import 'result_card.dart'; + +class ResultsScreen extends StatefulWidget { + const ResultsScreen({ + super.key, + required this.viewModel, + }); + + final ResultsViewModel viewModel; + + @override + State createState() => _ResultsScreenState(); +} + +class _ResultsScreenState extends State { + @override + void initState() { + super.initState(); + widget.viewModel.updateItineraryConfig.addListener(_onResult); + } + + @override + void didUpdateWidget(covariant ResultsScreen oldWidget) { + super.didUpdateWidget(oldWidget); + oldWidget.viewModel.updateItineraryConfig.removeListener(_onResult); + widget.viewModel.updateItineraryConfig.addListener(_onResult); + } + + @override + void dispose() { + widget.viewModel.updateItineraryConfig.removeListener(_onResult); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, r) { + if (!didPop) context.go(Routes.search); + }, + child: Scaffold( + body: ListenableBuilder( + listenable: widget.viewModel.search, + builder: (context, child) { + if (widget.viewModel.search.completed) { + return child!; + } + return Column( + children: [ + _AppSearchBar(widget: widget), + if (widget.viewModel.search.running) + const Expanded( + child: Center(child: CircularProgressIndicator())), + if (widget.viewModel.search.error) + Expanded( + child: Center( + child: ErrorIndicator( + title: AppLocalization.of(context) + .errorWhileLoadingDestinations, + label: AppLocalization.of(context).tryAgain, + onPressed: widget.viewModel.search.execute, + ), + ), + ), + ], + ); + }, + child: ListenableBuilder( + listenable: widget.viewModel, + builder: (context, child) { + return Padding( + padding: Dimens.of(context).edgeInsetsScreenHorizontal, + child: CustomScrollView( + slivers: [ + SliverToBoxAdapter( + child: _AppSearchBar(widget: widget), + ), + _Grid(viewModel: widget.viewModel), + ], + ), + ); + }, + ), + ), + ), + ); + } + + void _onResult() { + if (widget.viewModel.updateItineraryConfig.completed) { + widget.viewModel.updateItineraryConfig.clearResult(); + context.go(Routes.activities); + } + + if (widget.viewModel.updateItineraryConfig.error) { + widget.viewModel.updateItineraryConfig.clearResult(); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(AppLocalization.of(context).errorWhileSavingItinerary), + ), + ); + } + } +} + +class _AppSearchBar extends StatelessWidget { + const _AppSearchBar({ + required this.widget, + }); + + final ResultsScreen widget; + + @override + Widget build(BuildContext context) { + return SafeArea( + top: true, + bottom: false, + child: Padding( + padding: EdgeInsets.only( + top: Dimens.of(context).paddingScreenVertical, + bottom: Dimens.dimensMobile.paddingScreenVertical, + ), + child: AppSearchBar( + config: widget.viewModel.config, + onTap: () { + // Navigate to SearchFormScreen and edit search + context.pop(); + }, + ), + ), + ); + } +} + +class _Grid extends StatelessWidget { + const _Grid({ + required this.viewModel, + }); + + final ResultsViewModel viewModel; + + @override + Widget build(BuildContext context) { + return SliverGrid( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 8.0, + mainAxisSpacing: 8.0, + childAspectRatio: 182 / 222, + ), + delegate: SliverChildBuilderDelegate( + (context, index) { + final destination = viewModel.destinations[index]; + return ResultCard( + key: ValueKey(destination.ref), + destination: destination, + onTap: () { + viewModel.updateItineraryConfig.execute(destination.ref); + }, + ); + }, + childCount: viewModel.destinations.length, + ), + ); + } +} diff --git a/compass_app/app/lib/ui/search_form/view_models/search_form_viewmodel.dart b/compass_app/app/lib/ui/search_form/view_models/search_form_viewmodel.dart new file mode 100644 index 000000000..565e5fc0f --- /dev/null +++ b/compass_app/app/lib/ui/search_form/view_models/search_form_viewmodel.dart @@ -0,0 +1,162 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:logging/logging.dart'; + +import '../../../data/repositories/continent/continent_repository.dart'; +import '../../../data/repositories/itinerary_config/itinerary_config_repository.dart'; +import '../../../domain/models/continent/continent.dart'; +import '../../../domain/models/itinerary_config/itinerary_config.dart'; +import '../../../utils/command.dart'; +import '../../../utils/result.dart'; + +/// View model for the search form. +/// +/// Contains the form selected options +/// and the logic to load the list of regions. +class SearchFormViewModel extends ChangeNotifier { + SearchFormViewModel({ + required ContinentRepository continentRepository, + required ItineraryConfigRepository itineraryConfigRepository, + }) : _continentRepository = continentRepository, + _itineraryConfigRepository = itineraryConfigRepository { + updateItineraryConfig = Command0(_updateItineraryConfig); + load = Command0(_load)..execute(); + } + + final _log = Logger('SearchFormViewModel'); + final ContinentRepository _continentRepository; + final ItineraryConfigRepository _itineraryConfigRepository; + List _continents = []; + String? _selectedContinent; + DateTimeRange? _dateRange; + int _guests = 0; + + /// True if the form is valid and can be submitted + bool get valid => + _guests > 0 && _selectedContinent != null && _dateRange != null; + + /// List of continents. + /// Loaded in [load] command. + List get continents => _continents; + + /// Selected continent. + /// Null means no continent is selected. + String? get selectedContinent => _selectedContinent; + + /// Set selected continent. + /// Set to null to clear the selection. + set selectedContinent(String? continent) { + _selectedContinent = continent; + _log.finest('Selected continent: $continent'); + notifyListeners(); + } + + /// Date range. + /// Null means no range is selected. + DateTimeRange? get dateRange => _dateRange; + + /// Set date range. + /// Can be set to null to clear selection. + set dateRange(DateTimeRange? dateRange) { + _dateRange = dateRange; + _log.finest('Selected date range: $dateRange'); + notifyListeners(); + } + + /// Number of guests + int get guests => _guests; + + /// Set number of guests + /// If the quantity is negative, it will be set to 0 + set guests(int quantity) { + if (quantity < 0) { + _guests = 0; + } else { + _guests = quantity; + } + _log.finest('Set guests number: $_guests'); + notifyListeners(); + } + + /// Load the list of continents and current itinerary config. + late final Command0 load; + + /// Store ViewModel data into [ItineraryConfigRepository] before navigating. + late final Command0 updateItineraryConfig; + + Future> _load() async { + final result = await _loadContinents(); + if (result is Error) { + return result; + } + return await _loadItineraryConfig(); + } + + Future> _loadContinents() async { + final result = await _continentRepository.getContinents(); + switch (result) { + case Ok(): + { + _continents = result.value; + _log.fine('Continents (${_continents.length}) loaded'); + } + case Error(): + { + _log.warning('Failed to load continents', result.asError.error); + } + } + notifyListeners(); + return result; + } + + Future> _loadItineraryConfig() async { + final result = await _itineraryConfigRepository.getItineraryConfig(); + switch (result) { + case Ok(): + { + final itineraryConfig = result.value; + _selectedContinent = itineraryConfig.continent; + if (itineraryConfig.startDate != null && + itineraryConfig.endDate != null) { + _dateRange = DateTimeRange( + start: itineraryConfig.startDate!, + end: itineraryConfig.endDate!, + ); + } + _guests = itineraryConfig.guests ?? 0; + _log.fine('ItineraryConfig loaded'); + notifyListeners(); + } + case Error(): + { + _log.warning( + 'Failed to load stored ItineraryConfig', + result.asError.error, + ); + } + } + return result; + } + + Future> _updateItineraryConfig() async { + assert(valid, "called when valid was false"); + final result = await _itineraryConfigRepository.setItineraryConfig( + ItineraryConfig( + continent: _selectedContinent, + startDate: _dateRange!.start, + endDate: _dateRange!.end, + guests: _guests, + ), + ); + switch (result) { + case Ok(): + _log.fine('ItineraryConfig saved'); + case Error(): + _log.warning('Failed to store ItineraryConfig', result.error); + } + return result; + } +} diff --git a/compass_app/app/lib/ui/search_form/widgets/search_form_continent.dart b/compass_app/app/lib/ui/search_form/widgets/search_form_continent.dart new file mode 100644 index 000000000..d6fc65dd2 --- /dev/null +++ b/compass_app/app/lib/ui/search_form/widgets/search_form_continent.dart @@ -0,0 +1,168 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +import '../../../domain/models/continent/continent.dart'; +import '../../../utils/image_error_listener.dart'; +import '../../core/localization/applocalization.dart'; +import '../../core/themes/colors.dart'; +import '../../core/themes/dimens.dart'; +import '../../core/ui/error_indicator.dart'; +import '../view_models/search_form_viewmodel.dart'; + +/// Continent selection carousel +/// +/// Loads a list of continents in a horizontal carousel. +/// Users can tap one item to select it. +/// Tapping again the same item will deselect it. +class SearchFormContinent extends StatelessWidget { + const SearchFormContinent({ + super.key, + required this.viewModel, + }); + + final SearchFormViewModel viewModel; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 140, + child: ListenableBuilder( + listenable: viewModel.load, + builder: (context, child) { + if (viewModel.load.running) { + return const Center( + child: CircularProgressIndicator(), + ); + } + if (viewModel.load.error) { + return Center( + child: ErrorIndicator( + title: AppLocalization.of(context).errorWhileLoadingContinents, + label: AppLocalization.of(context).tryAgain, + onPressed: viewModel.load.execute, + ), + ); + } + return child!; + }, + child: ListenableBuilder( + listenable: viewModel, + builder: (context, child) { + return ListView.separated( + scrollDirection: Axis.horizontal, + itemCount: viewModel.continents.length, + padding: Dimens.of(context).edgeInsetsScreenHorizontal, + itemBuilder: (BuildContext context, int index) { + final Continent(:imageUrl, :name) = viewModel.continents[index]; + return _CarouselItem( + key: ValueKey(name), + imageUrl: imageUrl, + name: name, + viewModel: viewModel, + ); + }, + separatorBuilder: (BuildContext context, int index) { + return const SizedBox(width: 8); + }, + ); + }, + ), + ), + ); + } +} + +class _CarouselItem extends StatelessWidget { + const _CarouselItem({ + super.key, + required this.imageUrl, + required this.name, + required this.viewModel, + }); + + final String imageUrl; + final String name; + final SearchFormViewModel viewModel; + + bool _selected() => + viewModel.selectedContinent == null || + viewModel.selectedContinent == name; + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 140, + height: 140, + child: ClipRRect( + borderRadius: BorderRadius.circular(10), + child: Stack( + children: [ + CachedNetworkImage( + imageUrl: imageUrl, + fit: BoxFit.cover, + errorListener: imageErrorListener, + errorWidget: (context, url, error) { + // NOTE: Getting "invalid image data" error for some of the images + // e.g. https://rstr.in/google/tripedia/jlbgFDrSUVE + return const DecoratedBox( + decoration: BoxDecoration( + color: AppColors.grey3, + ), + child: SizedBox(width: 140, height: 140), + ); + }, + ), + Align( + alignment: Alignment.center, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + name, + textAlign: TextAlign.center, + style: GoogleFonts.openSans( + fontSize: 18, + fontWeight: FontWeight.w500, + color: AppColors.white1, + ), + ), + ), + ), + // Overlay when other continent is selected + Positioned.fill( + child: AnimatedOpacity( + opacity: _selected() ? 0 : 0.7, + duration: kThemeChangeDuration, + child: DecoratedBox( + decoration: BoxDecoration( + // Support dark-mode + color: Theme.of(context).colorScheme.onPrimary, + ), + ), + ), + ), + // Handle taps + Positioned.fill( + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: () { + if (viewModel.selectedContinent == name) { + viewModel.selectedContinent = null; + } else { + viewModel.selectedContinent = name; + } + }, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/compass_app/app/lib/ui/search_form/widgets/search_form_date.dart b/compass_app/app/lib/ui/search_form/widgets/search_form_date.dart new file mode 100644 index 000000000..1c9c4b954 --- /dev/null +++ b/compass_app/app/lib/ui/search_form/widgets/search_form_date.dart @@ -0,0 +1,82 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +import '../../core/localization/applocalization.dart'; +import '../../core/themes/dimens.dart'; +import '../../core/ui/date_format_start_end.dart'; +import '../../core/themes/colors.dart'; +import '../view_models/search_form_viewmodel.dart'; + +/// Date selection form field. +/// +/// Opens a date range picker dialog when tapped. +class SearchFormDate extends StatelessWidget { + const SearchFormDate({ + super.key, + required this.viewModel, + }); + + final SearchFormViewModel viewModel; + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.only( + top: Dimens.paddingVertical, + left: Dimens.of(context).paddingScreenHorizontal, + right: Dimens.of(context).paddingScreenHorizontal, + ), + child: InkWell( + borderRadius: BorderRadius.circular(16.0), + onTap: () { + showDateRangePicker( + context: context, + firstDate: DateTime.now(), + lastDate: DateTime.now().add(const Duration(days: 365)), + ).then((dateRange) => viewModel.dateRange = dateRange); + }, + child: Container( + height: 64, + decoration: BoxDecoration( + border: Border.all(color: AppColors.grey1), + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: Dimens.paddingHorizontal, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + AppLocalization.of(context).when, + style: Theme.of(context).textTheme.titleMedium, + ), + ListenableBuilder( + listenable: viewModel, + builder: (context, _) { + final dateRange = viewModel.dateRange; + if (dateRange != null) { + return Text( + dateFormatStartEnd(dateRange), + style: Theme.of(context).textTheme.bodyLarge, + ); + } else { + return Text( + AppLocalization.of(context).addDates, + style: Theme.of(context).inputDecorationTheme.hintStyle, + ); + } + }, + ) + ], + ), + ), + ), + ), + ); + } +} diff --git a/compass_app/app/lib/ui/search_form/widgets/search_form_guests.dart b/compass_app/app/lib/ui/search_form/widgets/search_form_guests.dart new file mode 100644 index 000000000..e803dd11d --- /dev/null +++ b/compass_app/app/lib/ui/search_form/widgets/search_form_guests.dart @@ -0,0 +1,105 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +import '../../core/themes/colors.dart'; +import '../../core/themes/dimens.dart'; +import '../view_models/search_form_viewmodel.dart'; + +const String removeGuestsKey = 'remove-guests'; +const String addGuestsKey = 'add-guests'; + +/// Number of guests selection form +/// +/// Users can tap the Plus and Minus icons to increase or decrease +/// the number of guests. +class SearchFormGuests extends StatelessWidget { + const SearchFormGuests({ + super.key, + required this.viewModel, + }); + + final SearchFormViewModel viewModel; + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.only( + top: Dimens.paddingVertical, + left: Dimens.of(context).paddingScreenHorizontal, + right: Dimens.of(context).paddingScreenHorizontal, + ), + child: Container( + height: 64, + decoration: BoxDecoration( + border: Border.all(color: AppColors.grey1), + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: Dimens.paddingHorizontal, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Who', + style: Theme.of(context).textTheme.titleMedium, + ), + _QuantitySelector(viewModel), + ], + ), + ), + ), + ); + } +} + +class _QuantitySelector extends StatelessWidget { + const _QuantitySelector(this.viewModel); + + final SearchFormViewModel viewModel; + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 90, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + InkWell( + key: const ValueKey(removeGuestsKey), + onTap: () { + viewModel.guests--; + }, + child: const Icon( + Icons.remove_circle_outline, + color: AppColors.grey3, + ), + ), + ListenableBuilder( + listenable: viewModel, + builder: (context, _) => Text( + viewModel.guests.toString(), + style: viewModel.guests == 0 + ? Theme.of(context).inputDecorationTheme.hintStyle + : Theme.of(context).textTheme.bodyMedium, + ), + ), + InkWell( + key: const ValueKey(addGuestsKey), + onTap: () { + viewModel.guests++; + }, + child: const Icon( + Icons.add_circle_outline, + color: AppColors.grey3, + ), + ), + ], + ), + ); + } +} diff --git a/compass_app/app/lib/ui/search_form/widgets/search_form_screen.dart b/compass_app/app/lib/ui/search_form/widgets/search_form_screen.dart new file mode 100644 index 000000000..fabd2a00f --- /dev/null +++ b/compass_app/app/lib/ui/search_form/widgets/search_form_screen.dart @@ -0,0 +1,65 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../routing/routes.dart'; +import '../../core/themes/dimens.dart'; +import '../../core/ui/search_bar.dart'; +import '../../results/widgets/results_screen.dart'; +import '../view_models/search_form_viewmodel.dart'; +import 'search_form_date.dart'; +import 'search_form_guests.dart'; +import 'search_form_continent.dart'; +import 'search_form_submit.dart'; + +/// Search form screen +/// +/// Displays a search form with continent, date and guests selection. +/// Tapping on the submit button opens the [ResultsScreen] screen +/// passing the search options as query parameters. +class SearchFormScreen extends StatelessWidget { + const SearchFormScreen({ + super.key, + required this.viewModel, + }); + + final SearchFormViewModel viewModel; + + @override + Widget build(BuildContext context) { + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, r) { + if (!didPop) context.go(Routes.home); + }, + child: Scaffold( + body: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + SafeArea( + top: true, + bottom: false, + child: Padding( + padding: EdgeInsets.only( + top: Dimens.of(context).paddingScreenVertical, + left: Dimens.of(context).paddingScreenHorizontal, + right: Dimens.of(context).paddingScreenHorizontal, + bottom: Dimens.paddingVertical, + ), + child: const AppSearchBar(), + ), + ), + SearchFormContinent(viewModel: viewModel), + SearchFormDate(viewModel: viewModel), + SearchFormGuests(viewModel: viewModel), + const Spacer(), + SearchFormSubmit(viewModel: viewModel), + ], + ), + ), + ); + } +} diff --git a/compass_app/app/lib/ui/search_form/widgets/search_form_submit.dart b/compass_app/app/lib/ui/search_form/widgets/search_form_submit.dart new file mode 100644 index 000000000..a1ebe35c8 --- /dev/null +++ b/compass_app/app/lib/ui/search_form/widgets/search_form_submit.dart @@ -0,0 +1,100 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../routing/routes.dart'; +import '../../core/localization/applocalization.dart'; +import '../../core/themes/dimens.dart'; +import '../../results/widgets/results_screen.dart'; +import '../view_models/search_form_viewmodel.dart'; + +const String searchFormSubmitButtonKey = 'submit-button'; + +/// Search form submit button +/// +/// The button is disabled when the form is data is incomplete. +/// When tapped, it navigates to the [ResultsScreen] +/// passing the search options as query parameters. +class SearchFormSubmit extends StatefulWidget { + const SearchFormSubmit({ + super.key, + required this.viewModel, + }); + + final SearchFormViewModel viewModel; + + @override + State createState() => _SearchFormSubmitState(); +} + +class _SearchFormSubmitState extends State { + @override + void initState() { + super.initState(); + widget.viewModel.updateItineraryConfig.addListener(_onResult); + } + + @override + void didUpdateWidget(covariant SearchFormSubmit oldWidget) { + oldWidget.viewModel.updateItineraryConfig.removeListener(_onResult); + widget.viewModel.updateItineraryConfig.addListener(_onResult); + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + widget.viewModel.updateItineraryConfig.removeListener(_onResult); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.only( + top: Dimens.paddingVertical, + left: Dimens.of(context).paddingScreenHorizontal, + right: Dimens.of(context).paddingScreenHorizontal, + bottom: Dimens.of(context).paddingScreenVertical, + ), + child: ListenableBuilder( + listenable: widget.viewModel, + child: SizedBox( + height: 52, + child: Center( + child: Text(AppLocalization.of(context).search), + ), + ), + builder: (context, child) { + return FilledButton( + key: const ValueKey(searchFormSubmitButtonKey), + onPressed: widget.viewModel.valid + ? widget.viewModel.updateItineraryConfig.execute + : null, + child: child, + ); + }, + ), + ); + } + + void _onResult() { + if (widget.viewModel.updateItineraryConfig.completed) { + widget.viewModel.updateItineraryConfig.clearResult(); + context.go(Routes.results); + } + + if (widget.viewModel.updateItineraryConfig.error) { + widget.viewModel.updateItineraryConfig.clearResult(); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(AppLocalization.of(context).errorWhileSavingItinerary), + action: SnackBarAction( + label: AppLocalization.of(context).tryAgain, + onPressed: widget.viewModel.updateItineraryConfig.execute, + ), + )); + } + } +} diff --git a/compass_app/app/lib/utils/command.dart b/compass_app/app/lib/utils/command.dart new file mode 100644 index 000000000..2e37434b9 --- /dev/null +++ b/compass_app/app/lib/utils/command.dart @@ -0,0 +1,97 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; + +import 'package:flutter/foundation.dart'; + +import 'result.dart'; + +typedef CommandAction0 = Future> Function(); +typedef CommandAction1 = Future> Function(A); + +/// Facilitates interaction with a ViewModel. +/// +/// Encapsulates an action, +/// exposes its running and error states, +/// and ensures that it can't be launched again until it finishes. +/// +/// Use [Command0] for actions without arguments. +/// Use [Command1] for actions with one argument. +/// +/// Actions must return a [Result]. +/// +/// Consume the action result by listening to changes, +/// then call to [clearResult] when the state is consumed. +abstract class Command extends ChangeNotifier { + Command(); + + bool _running = false; + + /// True when the action is running. + bool get running => _running; + + Result? _result; + + /// true if action completed with error + bool get error => _result is Error; + + /// true if action completed successfully + bool get completed => _result is Ok; + + /// Get last action result + Result? get result => _result; + + /// Clear last action result + void clearResult() { + _result = null; + notifyListeners(); + } + + /// Internal execute implementation + Future _execute(CommandAction0 action) async { + // Ensure the action can't launch multiple times. + // e.g. avoid multiple taps on button + if (_running) return; + + // Notify listeners. + // e.g. button shows loading state + _running = true; + _result = null; + notifyListeners(); + + try { + _result = await action(); + } finally { + _running = false; + notifyListeners(); + } + } +} + +/// [Command] without arguments. +/// Takes a [CommandAction0] as action. +class Command0 extends Command { + Command0(this._action); + + final CommandAction0 _action; + + /// Executes the action. + Future execute() async { + await _execute(() => _action()); + } +} + +/// [Command] with one argument. +/// Takes a [CommandAction1] as action. +class Command1 extends Command { + Command1(this._action); + + final CommandAction1 _action; + + /// Executes the action with the argument. + Future execute(A argument) async { + await _execute(() => _action(argument)); + } +} diff --git a/compass_app/app/lib/utils/image_error_listener.dart b/compass_app/app/lib/utils/image_error_listener.dart new file mode 100644 index 000000000..79c209283 --- /dev/null +++ b/compass_app/app/lib/utils/image_error_listener.dart @@ -0,0 +1,11 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:logging/logging.dart'; + +final _log = Logger('ImageErrorListener'); + +void imageErrorListener(Object error) { + _log.warning('Failed to load image', error); +} diff --git a/compass_app/app/lib/utils/result.dart b/compass_app/app/lib/utils/result.dart new file mode 100644 index 000000000..5370700b0 --- /dev/null +++ b/compass_app/app/lib/utils/result.dart @@ -0,0 +1,54 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/// Utility class to wrap result data +/// +/// Evaluate the result using a switch statement: +/// ```dart +/// switch (result) { +/// case Ok(): { +/// print(result.value); +/// } +/// case Error(): { +/// print(result.error); +/// } +/// } +/// ``` +sealed class Result { + const Result(); + + /// Creates an instance of Result containing a value + factory Result.ok(T value) => Ok(value); + + /// Create an instance of Result containing an error + factory Result.error(Exception error) => Error(error); + + /// Convenience method to cast to Ok + Ok get asOk => this as Ok; + + /// Convenience method to cast to Error + Error get asError => this as Error; +} + +/// Subclass of Result for values +final class Ok extends Result { + const Ok(this.value); + + /// Returned value in result + final T value; + + @override + String toString() => 'Result<$T>.ok($value)'; +} + +/// Subclass of Result for errors +final class Error extends Result { + const Error(this.error); + + /// Returned error in result + final Exception error; + + @override + String toString() => 'Result<$T>.error($error)'; +} diff --git a/compass_app/app/linux/.gitignore b/compass_app/app/linux/.gitignore new file mode 100644 index 000000000..d3896c984 --- /dev/null +++ b/compass_app/app/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/compass_app/app/linux/CMakeLists.txt b/compass_app/app/linux/CMakeLists.txt new file mode 100644 index 000000000..35574ddd4 --- /dev/null +++ b/compass_app/app/linux/CMakeLists.txt @@ -0,0 +1,145 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "compass_app") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.compass_app") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/compass_app/app/linux/flutter/CMakeLists.txt b/compass_app/app/linux/flutter/CMakeLists.txt new file mode 100644 index 000000000..d5bd01648 --- /dev/null +++ b/compass_app/app/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/compass_app/app/linux/flutter/generated_plugin_registrant.cc b/compass_app/app/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 000000000..f6f23bfe9 --- /dev/null +++ b/compass_app/app/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); +} diff --git a/compass_app/app/linux/flutter/generated_plugin_registrant.h b/compass_app/app/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 000000000..e0f0a47bc --- /dev/null +++ b/compass_app/app/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/compass_app/app/linux/flutter/generated_plugins.cmake b/compass_app/app/linux/flutter/generated_plugins.cmake new file mode 100644 index 000000000..f16b4c342 --- /dev/null +++ b/compass_app/app/linux/flutter/generated_plugins.cmake @@ -0,0 +1,24 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + url_launcher_linux +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/compass_app/app/linux/main.cc b/compass_app/app/linux/main.cc new file mode 100644 index 000000000..e7c5c5437 --- /dev/null +++ b/compass_app/app/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/compass_app/app/linux/my_application.cc b/compass_app/app/linux/my_application.cc new file mode 100644 index 000000000..5a3652971 --- /dev/null +++ b/compass_app/app/linux/my_application.cc @@ -0,0 +1,124 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "compass_app"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "compass_app"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/compass_app/app/linux/my_application.h b/compass_app/app/linux/my_application.h new file mode 100644 index 000000000..72271d5e4 --- /dev/null +++ b/compass_app/app/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/compass_app/app/macos/.gitignore b/compass_app/app/macos/.gitignore new file mode 100644 index 000000000..746adbb6b --- /dev/null +++ b/compass_app/app/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/compass_app/app/macos/Flutter/Flutter-Debug.xcconfig b/compass_app/app/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 000000000..4b81f9b2d --- /dev/null +++ b/compass_app/app/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/compass_app/app/macos/Flutter/Flutter-Release.xcconfig b/compass_app/app/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 000000000..5caa9d157 --- /dev/null +++ b/compass_app/app/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/compass_app/app/macos/Flutter/GeneratedPluginRegistrant.swift b/compass_app/app/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 000000000..db8fb0789 --- /dev/null +++ b/compass_app/app/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,18 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import path_provider_foundation +import share_plus +import shared_preferences_foundation +import sqflite + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) +} diff --git a/compass_app/app/macos/Podfile b/compass_app/app/macos/Podfile new file mode 100644 index 000000000..c795730db --- /dev/null +++ b/compass_app/app/macos/Podfile @@ -0,0 +1,43 @@ +platform :osx, '10.14' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/compass_app/app/macos/Runner.xcodeproj/project.pbxproj b/compass_app/app/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000..79cdc239e --- /dev/null +++ b/compass_app/app/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,801 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + C203960636D4F782F1839CCD /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 624CAC5D902868ED5B3541A6 /* Pods_Runner.framework */; }; + D9B813DBC6B840FC789B8BC8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3F947B2B2872CA43E01D9D3 /* Pods_RunnerTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 2A6019B907567C19CDA56577 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* compass_app.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = compass_app.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 4E966B71DA7CDEDDA1AC2EDF /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 614F996EF4C7B207997C69FB /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 624CAC5D902868ED5B3541A6 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 8094AA7203951A1D4ED31304 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + 9F59A18A4C705DE2978D2023 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + D3F947B2B2872CA43E01D9D3 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + ECE434935E45147DB18A8135 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D9B813DBC6B840FC789B8BC8 /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C203960636D4F782F1839CCD /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1D6CC27981A89B68E6FDD92F /* Pods */ = { + isa = PBXGroup; + children = ( + 2A6019B907567C19CDA56577 /* Pods-Runner.debug.xcconfig */, + 614F996EF4C7B207997C69FB /* Pods-Runner.release.xcconfig */, + ECE434935E45147DB18A8135 /* Pods-Runner.profile.xcconfig */, + 9F59A18A4C705DE2978D2023 /* Pods-RunnerTests.debug.xcconfig */, + 4E966B71DA7CDEDDA1AC2EDF /* Pods-RunnerTests.release.xcconfig */, + 8094AA7203951A1D4ED31304 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + 1D6CC27981A89B68E6FDD92F /* Pods */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* compass_app.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 624CAC5D902868ED5B3541A6 /* Pods_Runner.framework */, + D3F947B2B2872CA43E01D9D3 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 06AAD07EFF5D1E8FAB2A6247 /* [CP] Check Pods Manifest.lock */, + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 0DDEBBC387E6CED7A7451269 /* [CP] Check Pods Manifest.lock */, + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + 0C8C541B6AD305AF898FAB29 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* compass_app.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 06AAD07EFF5D1E8FAB2A6247 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 0C8C541B6AD305AF898FAB29 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 0DDEBBC387E6CED7A7451269 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9F59A18A4C705DE2978D2023 /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.compassApp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/compass_app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/compass_app"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4E966B71DA7CDEDDA1AC2EDF /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.compassApp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/compass_app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/compass_app"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8094AA7203951A1D4ED31304 /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.compassApp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/compass_app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/compass_app"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/compass_app/app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/compass_app/app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/compass_app/app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/compass_app/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/compass_app/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000..2da2d9a0a --- /dev/null +++ b/compass_app/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/compass_app/app/macos/Runner.xcworkspace/contents.xcworkspacedata b/compass_app/app/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..21a3cc14c --- /dev/null +++ b/compass_app/app/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/compass_app/app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/compass_app/app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/compass_app/app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/compass_app/app/macos/Runner/AppDelegate.swift b/compass_app/app/macos/Runner/AppDelegate.swift new file mode 100644 index 000000000..8e02df288 --- /dev/null +++ b/compass_app/app/macos/Runner/AppDelegate.swift @@ -0,0 +1,9 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..a2ec33f19 --- /dev/null +++ b/compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 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ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z 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 Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..13b35eba55c6dabc3aac36f33d859266c18fa0d0 GIT binary patch literal 5680 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 literal 0 HcmV?d00001 diff --git a/compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3f5fa40fb3d1e0710331a48de5d256da3f275d GIT binary patch literal 520 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 literal 0 HcmV?d00001 diff --git a/compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/compass_app/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1632cfddf3d9dade342351e627a0a75609fb46 GIT binary patch literal 2218 zcmV;b2vzrqP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91KmY&$07g+lumAuE6iGxuRCodHTWf3-RTMruyW6Fu zQYeUM04eX6D5c0FCjKKPrco1(K`<0SL=crI{PC3-^hZU0kQie$gh-5!7z6SH6Q0J% zqot*`H1q{R5fHFYS}dje@;kG=v$L0(yY0?wY2%*c?A&{2?!D*x?m71{of2gv!$5|C z3>qG_BW}7K_yUcT3A5C6QD<+{aq?x;MAUyAiJn#Jv8_zZtQ{P zTRzbL3U9!qVuZzS$xKU10KiW~Bgdcv1-!uAhQxf3a7q+dU6lj?yoO4Lq4TUN4}h{N z*fIM=SS8|C2$(T>w$`t@3Tka!(r!7W`x z-isCVgQD^mG-MJ;XtJuK3V{Vy72GQ83KRWsHU?e*wrhKk=ApIYeDqLi;JI1e zuvv}5^Dc=k7F7?nm3nIw$NVmU-+R>> zyqOR$-2SDpJ}Pt;^RkJytDVXNTsu|mI1`~G7yw`EJR?VkGfNdqK9^^8P`JdtTV&tX4CNcV4 z&N06nZa??Fw1AgQOUSE2AmPE@WO(Fvo`%m`cDgiv(fAeRA%3AGXUbsGw{7Q`cY;1BI#ac3iN$$Hw z0LT0;xc%=q)me?Y*$xI@GRAw?+}>=9D+KTk??-HJ4=A>`V&vKFS75@MKdSF1JTq{S zc1!^8?YA|t+uKigaq!sT;Z!&0F2=k7F0PIU;F$leJLaw2UI6FL^w}OG&!;+b%ya1c z1n+6-inU<0VM-Y_s5iTElq)ThyF?StVcebpGI znw#+zLx2@ah{$_2jn+@}(zJZ{+}_N9BM;z)0yr|gF-4=Iyu@hI*Lk=-A8f#bAzc9f z`Kd6K--x@t04swJVC3JK1cHY-Hq+=|PN-VO;?^_C#;coU6TDP7Bt`;{JTG;!+jj(` zw5cLQ-(Cz-Tlb`A^w7|R56Ce;Wmr0)$KWOUZ6ai0PhzPeHwdl0H(etP zUV`va_i0s-4#DkNM8lUlqI7>YQLf)(lz9Q3Uw`)nc(z3{m5ZE77Ul$V%m)E}3&8L0 z-XaU|eB~Is08eORPk;=<>!1w)Kf}FOVS2l&9~A+@R#koFJ$Czd%Y(ENTV&A~U(IPI z;UY+gf+&6ioZ=roly<0Yst8ck>(M=S?B-ys3mLdM&)ex!hbt+ol|T6CTS+Sc0jv(& z7ijdvFwBq;0a{%3GGwkDKTeG`b+lyj0jjS1OMkYnepCdoosNY`*zmBIo*981BU%%U z@~$z0V`OVtIbEx5pa|Tct|Lg#ZQf5OYMUMRD>Wdxm5SAqV2}3!ceE-M2 z@O~lQ0OiKQp}o9I;?uxCgYVV?FH|?Riri*U$Zi_`V2eiA>l zdSm6;SEm6#T+SpcE8Ro_f2AwxzI z44hfe^WE3!h@W3RDyA_H440cpmYkv*)6m1XazTqw%=E5Xv7^@^^T7Q2wxr+Z2kVYr + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/compass_app/app/macos/Runner/Configs/AppInfo.xcconfig b/compass_app/app/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 000000000..f56aaa1db --- /dev/null +++ b/compass_app/app/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = compass_app + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.compassApp + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. diff --git a/compass_app/app/macos/Runner/Configs/Debug.xcconfig b/compass_app/app/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 000000000..36b0fd946 --- /dev/null +++ b/compass_app/app/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/compass_app/app/macos/Runner/Configs/Release.xcconfig b/compass_app/app/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 000000000..dff4f4956 --- /dev/null +++ b/compass_app/app/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/compass_app/app/macos/Runner/Configs/Warnings.xcconfig b/compass_app/app/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 000000000..42bcbf478 --- /dev/null +++ b/compass_app/app/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/compass_app/app/macos/Runner/DebugProfile.entitlements b/compass_app/app/macos/Runner/DebugProfile.entitlements new file mode 100644 index 000000000..c946719a1 --- /dev/null +++ b/compass_app/app/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + com.apple.security.network.client + + + diff --git a/compass_app/app/macos/Runner/Info.plist b/compass_app/app/macos/Runner/Info.plist new file mode 100644 index 000000000..4789daa6a --- /dev/null +++ b/compass_app/app/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/compass_app/app/macos/Runner/MainFlutterWindow.swift b/compass_app/app/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 000000000..3cc05eb23 --- /dev/null +++ b/compass_app/app/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/compass_app/app/macos/Runner/Release.entitlements b/compass_app/app/macos/Runner/Release.entitlements new file mode 100644 index 000000000..852fa1a47 --- /dev/null +++ b/compass_app/app/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/compass_app/app/macos/RunnerTests/RunnerTests.swift b/compass_app/app/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 000000000..61f3bd1fc --- /dev/null +++ b/compass_app/app/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Cocoa +import FlutterMacOS +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/compass_app/app/pubspec.yaml b/compass_app/app/pubspec.yaml new file mode 100644 index 000000000..dcf6b96a2 --- /dev/null +++ b/compass_app/app/pubspec.yaml @@ -0,0 +1,45 @@ +name: compass_app +description: "A new Flutter project." +publish_to: 'none' +version: 0.1.0 + +environment: + sdk: '>=3.4.1 <4.0.0' + +dependencies: + cached_network_image: ^3.3.1 + collection: ^1.18.0 + flutter: + sdk: flutter + flutter_localizations: + sdk: flutter + flutter_svg: ^2.0.10+1 + freezed_annotation: ^2.4.4 + go_router: ^14.2.0 + google_fonts: ^6.2.1 + intl: any + json_annotation: ^4.9.0 + logging: ^1.2.0 + provider: ^6.1.2 + share_plus: ^7.2.2 + shared_preferences: ^2.3.1 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^4.0.0 + mocktail_image_network: ^1.2.0 + mocktail: ^1.0.4 + integration_test: + sdk: flutter + build_runner: ^2.4.12 + freezed: ^2.5.7 + json_serializable: ^6.8.0 + +flutter: + uses-material-design: true + assets: + - assets/activities.json + - assets/destinations.json + - assets/logo.svg + - assets/user.jpg diff --git a/compass_app/app/test/data/repositories/activity/activity_repository_local_test.dart b/compass_app/app/test/data/repositories/activity/activity_repository_local_test.dart new file mode 100644 index 000000000..739f35084 --- /dev/null +++ b/compass_app/app/test/data/repositories/activity/activity_repository_local_test.dart @@ -0,0 +1,30 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/repositories/activity/activity_repository_local.dart'; +import 'package:compass_app/data/services/local/local_data_service.dart'; +import 'package:compass_app/utils/result.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('ActivityRepositoryLocal tests', () { + // To load assets + TestWidgetsFlutterBinding.ensureInitialized(); + + final repository = ActivityRepositoryLocal( + localDataService: LocalDataService(), + ); + + test('should get by destination ref', () async { + final result = await repository.getByDestination('alaska'); + expect(result, isA()); + + final list = result.asOk.value; + expect(list.length, 20); + + final activity = list.first; + expect(activity.name, 'Glacier Trekking and Ice Climbing'); + }); + }); +} diff --git a/compass_app/app/test/data/repositories/activity/activity_repository_remote_test.dart b/compass_app/app/test/data/repositories/activity/activity_repository_remote_test.dart new file mode 100644 index 000000000..a75734e54 --- /dev/null +++ b/compass_app/app/test/data/repositories/activity/activity_repository_remote_test.dart @@ -0,0 +1,49 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/repositories/activity/activity_repository.dart'; +import 'package:compass_app/data/repositories/activity/activity_repository_remote.dart'; +import 'package:compass_app/utils/result.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../../../testing/fakes/services/fake_api_client.dart'; + +void main() { + group('ActivityRepositoryRemote tests', () { + late FakeApiClient apiClient; + late ActivityRepository repository; + + setUp(() { + apiClient = FakeApiClient(); + repository = ActivityRepositoryRemote(apiClient: apiClient); + }); + + test('should get activities for destination', () async { + final result = await repository.getByDestination('alaska'); + expect(result, isA()); + + final list = result.asOk.value; + expect(list.length, 1); + + final destination = list.first; + expect(destination.name, 'Glacier Trekking and Ice Climbing'); + + // Only one request happened + expect(apiClient.requestCount, 1); + }); + + test('should get destinations from cache', () async { + // Request destination once + var result = await repository.getByDestination('alaska'); + expect(result, isA()); + + // Request destination another time + result = await repository.getByDestination('alaska'); + expect(result, isA()); + + // Only one request happened + expect(apiClient.requestCount, 1); + }); + }); +} diff --git a/compass_app/app/test/data/repositories/auth/auth_repository_remote_test.dart b/compass_app/app/test/data/repositories/auth/auth_repository_remote_test.dart new file mode 100644 index 000000000..5d6934f91 --- /dev/null +++ b/compass_app/app/test/data/repositories/auth/auth_repository_remote_test.dart @@ -0,0 +1,102 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/repositories/auth/auth_repository_remote.dart'; +import 'package:compass_app/utils/result.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../../../testing/fakes/services/fake_api_client.dart'; +import '../../../../testing/fakes/services/fake_auth_api_client.dart'; +import '../../../../testing/fakes/services/fake_shared_preferences_service.dart'; + +void main() { + group('AuthRepositoryRemote tests', () { + late FakeApiClient apiClient; + late FakeAuthApiClient authApiClient; + late FakeSharedPreferencesService sharedPreferencesService; + late AuthRepositoryRemote repository; + + setUp(() { + apiClient = FakeApiClient(); + authApiClient = FakeAuthApiClient(); + sharedPreferencesService = FakeSharedPreferencesService(); + repository = AuthRepositoryRemote( + apiClient: apiClient, + authApiClient: authApiClient, + sharedPreferencesService: sharedPreferencesService, + ); + }); + + test('fetch on start, has token', () async { + // Stored token in shared preferences + sharedPreferencesService.token = 'TOKEN'; + + // Create an AuthRepository, should perform initial fetch + final repository = AuthRepositoryRemote( + apiClient: apiClient, + authApiClient: authApiClient, + sharedPreferencesService: sharedPreferencesService, + ); + + final isAuthenticated = await repository.isAuthenticated; + + // True because Token is SharedPreferences + expect(isAuthenticated, isTrue); + + // Check auth token + await expectAuthHeader(apiClient, 'Bearer TOKEN'); + }); + + test('fetch on start, no token', () async { + // Stored token in shared preferences + sharedPreferencesService.token = null; + + // Create an AuthRepository, should perform initial fetch + final repository = AuthRepositoryRemote( + apiClient: apiClient, + authApiClient: authApiClient, + sharedPreferencesService: sharedPreferencesService, + ); + + final isAuthenticated = await repository.isAuthenticated; + + // True because Token is SharedPreferences + expect(isAuthenticated, isFalse); + + // Check auth token + await expectAuthHeader(apiClient, null); + }); + + test('perform login', () async { + final result = await repository.login( + email: 'EMAIL', + password: 'PASSWORD', + ); + expect(result, isA()); + expect(await repository.isAuthenticated, isTrue); + expect(sharedPreferencesService.token, 'TOKEN'); + + // Check auth token + await expectAuthHeader(apiClient, 'Bearer TOKEN'); + }); + + test('perform logout', () async { + // logged in status + sharedPreferencesService.token = 'TOKEN'; + + final result = await repository.logout(); + expect(result, isA()); + expect(await repository.isAuthenticated, isFalse); + expect(sharedPreferencesService.token, null); + + // Check auth token + await expectAuthHeader(apiClient, null); + }); + }); +} + +Future expectAuthHeader(FakeApiClient apiClient, String? header) async { + final header = apiClient.authHeaderProvider?.call(); + expect(header, header); +} diff --git a/compass_app/app/test/data/repositories/booking/booking_repository_remote_test.dart b/compass_app/app/test/data/repositories/booking/booking_repository_remote_test.dart new file mode 100644 index 000000000..54b907c1d --- /dev/null +++ b/compass_app/app/test/data/repositories/booking/booking_repository_remote_test.dart @@ -0,0 +1,60 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/repositories/booking/booking_repository.dart'; +import 'package:compass_app/data/repositories/booking/booking_repository_remote.dart'; +import 'package:compass_app/utils/result.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../../../testing/fakes/services/fake_api_client.dart'; +import '../../../../testing/models/booking.dart'; + +void main() { + group('BookingRepositoryRemote tests', () { + late BookingRepository bookingRepository; + late FakeApiClient fakeApiClient; + + setUp(() { + fakeApiClient = FakeApiClient(); + bookingRepository = BookingRepositoryRemote( + apiClient: fakeApiClient, + ); + }); + + test('should get booking', () async { + final result = await bookingRepository.getBooking(0); + final booking = result.asOk.value; + expect(booking, kBooking.copyWith(id: 0)); + }); + + test('should create booking', () async { + expect(fakeApiClient.bookings, isEmpty); + final result = await bookingRepository.createBooking(kBooking); + expect(result, isA>()); + expect(fakeApiClient.bookings.first, kBookingApiModel); + }); + + test('should get list of booking', () async { + final result = await bookingRepository.getBookingsList(); + final list = result.asOk.value; + expect(list, [kBookingSummary]); + }); + + test('should delete booking', () async { + // Ensure no bookings exist + expect(fakeApiClient.bookings, isEmpty); + + // Add a booking + var result = await bookingRepository.createBooking(kBooking); + expect(result, isA>()); + + // Delete the booking + result = await bookingRepository.delete(0); + expect(result, isA>()); + + // Check if the booking was deleted from the server + expect(fakeApiClient.bookings, isEmpty); + }); + }); +} diff --git a/compass_app/app/test/data/repositories/continent/continent_repository_remote_test.dart b/compass_app/app/test/data/repositories/continent/continent_repository_remote_test.dart new file mode 100644 index 000000000..4a41120b7 --- /dev/null +++ b/compass_app/app/test/data/repositories/continent/continent_repository_remote_test.dart @@ -0,0 +1,49 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/repositories/continent/continent_repository.dart'; +import 'package:compass_app/data/repositories/continent/continent_repository_remote.dart'; +import 'package:compass_app/utils/result.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../../../testing/fakes/services/fake_api_client.dart'; + +void main() { + group('ContinentRepositoryRemote tests', () { + late FakeApiClient apiClient; + late ContinentRepository repository; + + setUp(() { + apiClient = FakeApiClient(); + repository = ContinentRepositoryRemote(apiClient: apiClient); + }); + + test('should get continents', () async { + final result = await repository.getContinents(); + expect(result, isA()); + + final list = result.asOk.value; + expect(list.length, 3); + + final destination = list.first; + expect(destination.name, 'CONTINENT'); + + // Only one request happened + expect(apiClient.requestCount, 1); + }); + + test('should get continents from cache', () async { + // Request continents once + var result = await repository.getContinents(); + expect(result, isA()); + + // Request continents another time + result = await repository.getContinents(); + expect(result, isA()); + + // Only one request happened + expect(apiClient.requestCount, 1); + }); + }); +} diff --git a/compass_app/app/test/data/repositories/destination/destination_repository_local_test.dart b/compass_app/app/test/data/repositories/destination/destination_repository_local_test.dart new file mode 100644 index 000000000..62fa01357 --- /dev/null +++ b/compass_app/app/test/data/repositories/destination/destination_repository_local_test.dart @@ -0,0 +1,33 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/services/local/local_data_service.dart'; +import 'package:compass_app/utils/result.dart'; +import 'package:compass_app/data/repositories/destination/destination_repository_local.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('DestinationRepositoryLocal tests', () { + // To load assets + TestWidgetsFlutterBinding.ensureInitialized(); + + final repository = DestinationRepositoryLocal( + localDataService: LocalDataService(), + ); + + test('should load and parse', () async { + // Should load the json and parse it + final result = await repository.getDestinations(); + expect(result, isA()); + + // Check that the list is complete + final list = result.asOk.value; + expect(list.length, 137); + + // Check first item + final destination = list.first; + expect(destination.name, 'Alaska'); + }); + }); +} diff --git a/compass_app/app/test/data/repositories/destination/destination_repository_remote_test.dart b/compass_app/app/test/data/repositories/destination/destination_repository_remote_test.dart new file mode 100644 index 000000000..2559f030e --- /dev/null +++ b/compass_app/app/test/data/repositories/destination/destination_repository_remote_test.dart @@ -0,0 +1,49 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/repositories/destination/destination_repository.dart'; +import 'package:compass_app/data/repositories/destination/destination_repository_remote.dart'; +import 'package:compass_app/utils/result.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../../../testing/fakes/services/fake_api_client.dart'; + +void main() { + group('DestinationRepositoryRemote tests', () { + late FakeApiClient apiClient; + late DestinationRepository repository; + + setUp(() { + apiClient = FakeApiClient(); + repository = DestinationRepositoryRemote(apiClient: apiClient); + }); + + test('should get destinations', () async { + final result = await repository.getDestinations(); + expect(result, isA()); + + final list = result.asOk.value; + expect(list.length, 2); + + final destination = list.first; + expect(destination.name, 'name1'); + + // Only one request happened + expect(apiClient.requestCount, 1); + }); + + test('should get destinations from cache', () async { + // Request destination once + var result = await repository.getDestinations(); + expect(result, isA()); + + // Request destination another time + result = await repository.getDestinations(); + expect(result, isA()); + + // Only one request happened + expect(apiClient.requestCount, 1); + }); + }); +} diff --git a/compass_app/app/test/data/services/api/api_client_test.dart b/compass_app/app/test/data/services/api/api_client_test.dart new file mode 100644 index 000000000..e3965e4e3 --- /dev/null +++ b/compass_app/app/test/data/services/api/api_client_test.dart @@ -0,0 +1,83 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/services/api/api_client.dart'; +import 'package:compass_app/domain/models/continent/continent.dart'; +import 'package:compass_app/utils/result.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../../../testing/mocks.dart'; +import '../../../../testing/models/activity.dart'; +import '../../../../testing/models/booking.dart'; +import '../../../../testing/models/destination.dart'; +import '../../../../testing/models/user.dart'; + +void main() { + group('ApiClient', () { + late MockHttpClient mockHttpClient; + late ApiClient apiClient; + + setUp(() { + mockHttpClient = MockHttpClient(); + apiClient = ApiClient(clientFactory: () => mockHttpClient); + }); + + test('should get continents', () async { + final continents = [const Continent(name: 'NAME', imageUrl: 'URL')]; + mockHttpClient.mockGet('/continent', continents); + final result = await apiClient.getContinents(); + expect(result.asOk.value, continents); + }); + + test('should get activities by destination', () async { + final activites = [kActivity]; + mockHttpClient.mockGet( + '/destination/${kDestination1.ref}/activity', + activites, + ); + final result = + await apiClient.getActivityByDestination(kDestination1.ref); + expect(result.asOk.value, activites); + }); + + test('should get booking', () async { + mockHttpClient.mockGet( + '/booking/${kBookingApiModel.id}', + kBookingApiModel, + ); + final result = await apiClient.getBooking(kBookingApiModel.id!); + expect(result.asOk.value, kBookingApiModel); + }); + + test('should get bookings', () async { + mockHttpClient.mockGet('/booking', [kBookingApiModel]); + final result = await apiClient.getBookings(); + expect(result.asOk.value, [kBookingApiModel]); + }); + + test('should get destinations', () async { + mockHttpClient.mockGet('/destination', [kDestination1]); + final result = await apiClient.getDestinations(); + expect(result.asOk.value, [kDestination1]); + }); + + test('should get user', () async { + mockHttpClient.mockGet('/user', userApiModel); + final result = await apiClient.getUser(); + expect(result.asOk.value, userApiModel); + }); + + test('should post booking', () async { + mockHttpClient.mockPost('/booking', kBookingApiModel); + final result = await apiClient.postBooking(kBookingApiModel); + expect(result.asOk.value, kBookingApiModel); + }); + + test('should delete booking', () async { + mockHttpClient.mockDelete('/booking/0'); + final result = await apiClient.deleteBooking(0); + expect(result, isA>()); + }); + }); +} diff --git a/compass_app/app/test/data/services/api/auth_api_client_test.dart b/compass_app/app/test/data/services/api/auth_api_client_test.dart new file mode 100644 index 000000000..50d20e561 --- /dev/null +++ b/compass_app/app/test/data/services/api/auth_api_client_test.dart @@ -0,0 +1,41 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/services/api/auth_api_client.dart'; +import 'package:compass_app/data/services/api/model/login_request/login_request.dart'; +import 'package:compass_app/data/services/api/model/login_response/login_response.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../../../testing/mocks.dart'; + +void main() { + group('AuthApiClient', () { + late MockHttpClient mockHttpClient; + late AuthApiClient apiClient; + + setUp(() { + mockHttpClient = MockHttpClient(); + apiClient = AuthApiClient(clientFactory: () => mockHttpClient); + }); + + test('should post login', () async { + const loginResponse = LoginResponse( + token: 'TOKEN', + userId: '123', + ); + mockHttpClient.mockPost( + '/login', + loginResponse, + 200, + ); + final result = await apiClient.login( + const LoginRequest( + email: 'EMAIL', + password: 'PASSWORD', + ), + ); + expect(result.asOk.value, loginResponse); + }); + }); +} diff --git a/compass_app/app/test/domain/use_cases/booking/booking_create_use_case_test.dart b/compass_app/app/test/domain/use_cases/booking/booking_create_use_case_test.dart new file mode 100644 index 000000000..e148eb582 --- /dev/null +++ b/compass_app/app/test/domain/use_cases/booking/booking_create_use_case_test.dart @@ -0,0 +1,37 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/domain/use_cases/booking/booking_create_use_case.dart'; +import 'package:compass_app/domain/models/itinerary_config/itinerary_config.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../../../testing/fakes/repositories/fake_activities_repository.dart'; +import '../../../../testing/fakes/repositories/fake_booking_repository.dart'; +import '../../../../testing/fakes/repositories/fake_destination_repository.dart'; +import '../../../../testing/models/activity.dart'; +import '../../../../testing/models/booking.dart'; +import '../../../../testing/models/destination.dart'; + +void main() { + group('BookingCreateUseCase tests', () { + test('Create booking', () async { + final useCase = BookingCreateUseCase( + activityRepository: FakeActivityRepository(), + destinationRepository: FakeDestinationRepository(), + bookingRepository: FakeBookingRepository(), + ); + + final booking = await useCase.createFrom( + ItineraryConfig( + startDate: DateTime(2024, 01, 01), + endDate: DateTime(2024, 02, 12), + destination: kDestination1.ref, + activities: [kActivity.ref], + ), + ); + + expect(booking.asOk.value, kBooking); + }); + }); +} diff --git a/compass_app/app/test/domain/use_cases/booking/booking_share_use_case_test.dart b/compass_app/app/test/domain/use_cases/booking/booking_share_use_case_test.dart new file mode 100644 index 000000000..4cb920e88 --- /dev/null +++ b/compass_app/app/test/domain/use_cases/booking/booking_share_use_case_test.dart @@ -0,0 +1,35 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/domain/use_cases/booking/booking_share_use_case.dart'; +import 'package:compass_app/domain/models/booking/booking.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../../../testing/models/activity.dart'; +import '../../../../testing/models/destination.dart'; + +void main() { + group('BookingShareUseCase tests', () { + test('Share booking', () async { + String? sharedText; + final useCase = BookingShareUseCase.custom((text) async { + sharedText = text; + }); + final booking = Booking( + startDate: DateTime(2024, 01, 01), + endDate: DateTime(2024, 02, 12), + destination: kDestination1, + activity: [kActivity], + ); + await useCase.shareBooking(booking); + expect( + sharedText, + 'Trip to name1\n' + 'on 1 Jan - 12 Feb\n' + 'Activities:\n' + ' - NAME.', + ); + }); + }); +} diff --git a/compass_app/app/test/ui/activities/activities_screen_test.dart b/compass_app/app/test/ui/activities/activities_screen_test.dart new file mode 100644 index 000000000..97ac3366c --- /dev/null +++ b/compass_app/app/test/ui/activities/activities_screen_test.dart @@ -0,0 +1,83 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/domain/models/itinerary_config/itinerary_config.dart'; +import 'package:compass_app/ui/activities/view_models/activities_viewmodel.dart'; +import 'package:compass_app/ui/activities/widgets/activities_screen.dart'; +import 'package:compass_app/ui/activities/widgets/activity_entry.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:mocktail_image_network/mocktail_image_network.dart'; + +import '../../../testing/app.dart'; +import '../../../testing/fakes/repositories/fake_activities_repository.dart'; +import '../../../testing/fakes/repositories/fake_itinerary_config_repository.dart'; +import '../../../testing/mocks.dart'; + +void main() { + group('ResultsScreen widget tests', () { + late ActivitiesViewModel viewModel; + late MockGoRouter goRouter; + + setUp(() { + viewModel = ActivitiesViewModel( + activityRepository: FakeActivityRepository(), + itineraryConfigRepository: FakeItineraryConfigRepository( + itineraryConfig: ItineraryConfig( + continent: 'Europe', + startDate: DateTime(2024, 01, 01), + endDate: DateTime(2024, 01, 31), + guests: 2, + destination: 'DESTINATION', + ), + ), + ); + goRouter = MockGoRouter(); + }); + + Future loadScreen(WidgetTester tester) async { + await testApp( + tester, + ActivitiesScreen(viewModel: viewModel), + goRouter: goRouter, + ); + } + + testWidgets('should load screen', (WidgetTester tester) async { + await mockNetworkImages(() async { + await loadScreen(tester); + expect(find.byType(ActivitiesScreen), findsOneWidget); + }); + }); + + testWidgets('should list activity', (WidgetTester tester) async { + await mockNetworkImages(() async { + await loadScreen(tester); + expect(find.byType(ActivityEntry), findsOneWidget); + expect(find.text('NAME'), findsOneWidget); + }); + }); + + testWidgets('should select activity and confirm', + (WidgetTester tester) async { + await mockNetworkImages(() async { + await loadScreen(tester); + // Select one activity + await tester.tap(find.byKey(const ValueKey('REF-checkbox'))); + expect(viewModel.selectedActivities, contains('REF')); + + // Text 1 selected should appear + await tester.pumpAndSettle(); + expect(find.text('1 selected'), findsOneWidget); + + // Submit selection + await tester.tap(find.byKey(const ValueKey('confirm-button'))); + + // Should navigate to results screen + verify(() => goRouter.go('/booking')).called(1); + }); + }); + }); +} diff --git a/compass_app/app/test/ui/auth/login_screen_test.dart b/compass_app/app/test/ui/auth/login_screen_test.dart new file mode 100644 index 000000000..f454ea625 --- /dev/null +++ b/compass_app/app/test/ui/auth/login_screen_test.dart @@ -0,0 +1,63 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/ui/auth/login/view_models/login_viewmodel.dart'; +import 'package:compass_app/ui/auth/login/widgets/login_screen.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:mocktail_image_network/mocktail_image_network.dart'; + +import '../../../testing/app.dart'; +import '../../../testing/fakes/repositories/fake_auth_repository.dart'; +import '../../../testing/mocks.dart'; + +void main() { + group('LoginScreen test', () { + late LoginViewModel viewModel; + late MockGoRouter goRouter; + late FakeAuthRepository fakeAuthRepository; + + setUp(() { + fakeAuthRepository = FakeAuthRepository(); + viewModel = LoginViewModel( + authRepository: fakeAuthRepository, + ); + goRouter = MockGoRouter(); + }); + + Future loadScreen(WidgetTester tester) async { + await testApp( + tester, + LoginScreen(viewModel: viewModel), + goRouter: goRouter, + ); + } + + testWidgets('should load screen', (WidgetTester tester) async { + await mockNetworkImages(() async { + await loadScreen(tester); + expect(find.byType(LoginScreen), findsOneWidget); + }); + }); + + testWidgets('should perform login', (WidgetTester tester) async { + await mockNetworkImages(() async { + await loadScreen(tester); + + // Repo should have no key + expect(fakeAuthRepository.token, null); + + // Perform login + await tester.tap(find.text('Login')); + await tester.pumpAndSettle(); + + // Repo should have key + expect(fakeAuthRepository.token, 'TOKEN'); + + // Should navigate to home screen + verify(() => goRouter.go('/')).called(1); + }); + }); + }); +} diff --git a/compass_app/app/test/ui/auth/logout_button_test.dart b/compass_app/app/test/ui/auth/logout_button_test.dart new file mode 100644 index 000000000..383ceadb7 --- /dev/null +++ b/compass_app/app/test/ui/auth/logout_button_test.dart @@ -0,0 +1,78 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/domain/models/itinerary_config/itinerary_config.dart'; +import 'package:compass_app/ui/auth/logout/view_models/logout_viewmodel.dart'; +import 'package:compass_app/ui/auth/logout/widgets/logout_button.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail_image_network/mocktail_image_network.dart'; + +import '../../../testing/app.dart'; +import '../../../testing/fakes/repositories/fake_auth_repository.dart'; +import '../../../testing/fakes/repositories/fake_itinerary_config_repository.dart'; +import '../../../testing/mocks.dart'; + +void main() { + group('LogoutButton test', () { + late MockGoRouter goRouter; + late FakeAuthRepository fakeAuthRepository; + late FakeItineraryConfigRepository fakeItineraryConfigRepository; + late LogoutViewModel viewModel; + + setUp(() { + goRouter = MockGoRouter(); + fakeAuthRepository = FakeAuthRepository(); + // Setup a token, should be cleared after logout + fakeAuthRepository.token = 'TOKEN'; + // Setup an ItineraryConfig with some data, should be cleared after logout + fakeItineraryConfigRepository = FakeItineraryConfigRepository( + itineraryConfig: const ItineraryConfig(continent: 'CONTINENT')); + viewModel = LogoutViewModel( + authRepository: fakeAuthRepository, + itineraryConfigRepository: fakeItineraryConfigRepository, + ); + }); + + Future loadScreen(WidgetTester tester) async { + await testApp( + tester, + LogoutButton(viewModel: viewModel), + goRouter: goRouter, + ); + } + + testWidgets('should load widget', (WidgetTester tester) async { + await mockNetworkImages(() async { + await loadScreen(tester); + expect(find.byType(LogoutButton), findsOneWidget); + }); + }); + + testWidgets('should perform logout', (WidgetTester tester) async { + await mockNetworkImages(() async { + await loadScreen(tester); + + // Repo should have a key + expect(fakeAuthRepository.token, 'TOKEN'); + // Itinerary config should have data + expect( + fakeItineraryConfigRepository.itineraryConfig, + const ItineraryConfig(continent: 'CONTINENT'), + ); + + // // Perform logout + await tester.tap(find.byType(LogoutButton)); + await tester.pumpAndSettle(); + + // Repo should have no key + expect(fakeAuthRepository.token, null); + // Itinerary config should be cleared + expect( + fakeItineraryConfigRepository.itineraryConfig, + const ItineraryConfig(), + ); + }); + }); + }); +} diff --git a/compass_app/app/test/ui/booking/booking_screen_test.dart b/compass_app/app/test/ui/booking/booking_screen_test.dart new file mode 100644 index 000000000..6ae3100de --- /dev/null +++ b/compass_app/app/test/ui/booking/booking_screen_test.dart @@ -0,0 +1,113 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/domain/use_cases/booking/booking_create_use_case.dart'; +import 'package:compass_app/domain/use_cases/booking/booking_share_use_case.dart'; +import 'package:compass_app/domain/models/itinerary_config/itinerary_config.dart'; +import 'package:compass_app/ui/booking/view_models/booking_viewmodel.dart'; +import 'package:compass_app/ui/booking/widgets/booking_screen.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../../testing/app.dart'; +import '../../../testing/fakes/repositories/fake_activities_repository.dart'; +import '../../../testing/fakes/repositories/fake_booking_repository.dart'; +import '../../../testing/fakes/repositories/fake_destination_repository.dart'; +import '../../../testing/fakes/repositories/fake_itinerary_config_repository.dart'; +import '../../../testing/mocks.dart'; +import '../../../testing/models/activity.dart'; +import '../../../testing/models/booking.dart'; +import '../../../testing/models/destination.dart'; + +void main() { + group('BookingScreen widget tests', () { + late MockGoRouter goRouter; + late BookingViewModel viewModel; + late bool shared; + late FakeBookingRepository bookingRepository; + + setUp(() { + shared = false; + bookingRepository = FakeBookingRepository(); + viewModel = BookingViewModel( + itineraryConfigRepository: FakeItineraryConfigRepository( + itineraryConfig: ItineraryConfig( + continent: 'Europe', + startDate: DateTime(2024, 01, 01), + endDate: DateTime(2024, 01, 31), + guests: 2, + destination: kDestination1.ref, + activities: [kActivity.ref], + ), + ), + createBookingUseCase: BookingCreateUseCase( + activityRepository: FakeActivityRepository(), + destinationRepository: FakeDestinationRepository(), + bookingRepository: bookingRepository, + ), + shareBookingUseCase: BookingShareUseCase.custom((text) async { + shared = true; + }), + bookingRepository: bookingRepository, + ); + goRouter = MockGoRouter(); + }); + + Future loadScreen(WidgetTester tester) async { + await testApp( + tester, + BookingScreen(viewModel: viewModel), + goRouter: goRouter, + ); + } + + testWidgets('should load screen', (WidgetTester tester) async { + await loadScreen(tester); + expect(find.byType(BookingScreen), findsOneWidget); + }); + + testWidgets('should display booking from ID', (WidgetTester tester) async { + // Add a booking to repository + bookingRepository.createBooking(kBooking); + + // Load screen + await loadScreen(tester); + + // Load booking with ID 0 + viewModel.loadBooking.execute(0); + + // Wait for booking to load + await tester.pumpAndSettle(); + + expect(find.text(kBooking.destination.name), findsOneWidget); + expect(find.text(kBooking.destination.tags.first), findsOneWidget); + }); + + testWidgets('should create booking from itinerary config', + (WidgetTester tester) async { + await loadScreen(tester); + + // Create a new booking from stored itinerary config + viewModel.createBooking.execute(); + + // Wait for booking to load + await tester.pumpAndSettle(); + + expect(find.text('name1'), findsOneWidget); + expect(find.text('tags1'), findsOneWidget); + + // Booking is saved + expect(bookingRepository.bookings.length, 1); + }); + + testWidgets('should share booking', (WidgetTester tester) async { + bookingRepository.createBooking(kBooking); + await loadScreen(tester); + viewModel.loadBooking.execute(0); + await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key('share-button'))); + expect(shared, true); + }); + }); +} diff --git a/compass_app/app/test/ui/home/widgets/home_screen_test.dart b/compass_app/app/test/ui/home/widgets/home_screen_test.dart new file mode 100644 index 000000000..330fc15a6 --- /dev/null +++ b/compass_app/app/test/ui/home/widgets/home_screen_test.dart @@ -0,0 +1,131 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/repositories/auth/auth_repository.dart'; +import 'package:compass_app/data/repositories/itinerary_config/itinerary_config_repository.dart'; +import 'package:compass_app/routing/routes.dart'; +import 'package:compass_app/ui/home/view_models/home_viewmodel.dart'; +import 'package:compass_app/ui/home/widgets/home_screen.dart'; +import 'package:compass_app/utils/result.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:provider/provider.dart'; + +import '../../../../testing/app.dart'; +import '../../../../testing/fakes/repositories/fake_auth_repository.dart'; +import '../../../../testing/fakes/repositories/fake_booking_repository.dart'; +import '../../../../testing/fakes/repositories/fake_itinerary_config_repository.dart'; +import '../../../../testing/fakes/repositories/fake_user_repository.dart'; +import '../../../../testing/mocks.dart'; +import '../../../../testing/models/booking.dart'; + +void main() { + group('HomeScreen tests', () { + late HomeViewModel viewModel; + late MockGoRouter goRouter; + late FakeBookingRepository bookingRepository; + + setUp(() { + bookingRepository = FakeBookingRepository()..createBooking(kBooking); + viewModel = HomeViewModel( + bookingRepository: bookingRepository, + userRepository: FakeUserRepository(), + ); + goRouter = MockGoRouter(); + when(() => goRouter.push(any())).thenAnswer((_) => Future.value(null)); + }); + + loadWidget(WidgetTester tester) async { + await testApp( + tester, + ChangeNotifierProvider.value( + value: FakeAuthRepository() as AuthRepository, + child: Provider.value( + value: FakeItineraryConfigRepository() as ItineraryConfigRepository, + child: HomeScreen(viewModel: viewModel), + ), + ), + goRouter: goRouter, + ); + } + + testWidgets('should load screen', (tester) async { + await loadWidget(tester); + await tester.pumpAndSettle(); + + expect(find.byType(HomeScreen), findsOneWidget); + }); + + testWidgets('should show user name', (tester) async { + await loadWidget(tester); + await tester.pumpAndSettle(); + + expect(find.text('NAME\'s Trips'), findsOneWidget); + }); + + testWidgets('should navigate to search', (tester) async { + await loadWidget(tester); + await tester.pumpAndSettle(); + + // Tap on create a booking FAB + await tester.tap(find.byKey(const ValueKey('booking-button'))); + await tester.pumpAndSettle(); + + // Should navigate to results screen + verify(() => goRouter.go(Routes.search)).called(1); + }); + + testWidgets('should open existing booking', (tester) async { + await loadWidget(tester); + await tester.pumpAndSettle(); + + // Tap on booking (created from kBooking) + await tester.tap(find.text('name1, Europe')); + await tester.pumpAndSettle(); + + // Should navigate to results screen + verify(() => goRouter.push(Routes.bookingWithId(0))).called(1); + }); + + testWidgets('should delete booking', (tester) async { + await loadWidget(tester); + await tester.pumpAndSettle(); + + // Swipe on booking (created from kBooking) + await tester.drag(find.text('name1, Europe'), const Offset(-1000, 0)); + await tester.pumpAndSettle(); + + // Existing booking should be gone + expect(find.text('name1, Europe'), findsNothing); + + // Booking should be deleted from repository + expect(bookingRepository.bookings, isEmpty); + }); + + testWidgets('fail to delete booking', (tester) async { + // Create a ViewModel with a repository that will fail to delete + viewModel = HomeViewModel( + bookingRepository: _BadFakeBookingRepository()..createBooking(kBooking), + userRepository: FakeUserRepository(), + ); + await loadWidget(tester); + await tester.pumpAndSettle(); + + // Swipe on booking (created from kBooking) + await tester.drag(find.text('name1, Europe'), const Offset(-1000, 0)); + await tester.pumpAndSettle(); + + // Existing booking should be there + expect(find.text('name1, Europe'), findsOneWidget); + }); + }); +} + +class _BadFakeBookingRepository extends FakeBookingRepository { + @override + Future> delete(int id) async { + return Result.error(Exception('Failed to delete booking')); + } +} diff --git a/compass_app/app/test/ui/results/results_screen_test.dart b/compass_app/app/test/ui/results/results_screen_test.dart new file mode 100644 index 000000000..f27383742 --- /dev/null +++ b/compass_app/app/test/ui/results/results_screen_test.dart @@ -0,0 +1,80 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/domain/models/itinerary_config/itinerary_config.dart'; +import 'package:compass_app/ui/results/view_models/results_viewmodel.dart'; +import 'package:compass_app/ui/results/widgets/results_screen.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:mocktail_image_network/mocktail_image_network.dart'; + +import '../../../testing/app.dart'; +import '../../../testing/fakes/repositories/fake_destination_repository.dart'; +import '../../../testing/fakes/repositories/fake_itinerary_config_repository.dart'; +import '../../../testing/mocks.dart'; + +void main() { + group('ResultsScreen widget tests', () { + late MockGoRouter goRouter; + late ResultsViewModel viewModel; + + setUp(() { + viewModel = ResultsViewModel( + destinationRepository: FakeDestinationRepository(), + itineraryConfigRepository: FakeItineraryConfigRepository( + itineraryConfig: ItineraryConfig( + continent: 'Europe', + startDate: DateTime(2024, 01, 01), + endDate: DateTime(2024, 01, 31), + guests: 2, + ), + ), + ); + goRouter = MockGoRouter(); + }); + + Future loadScreen(WidgetTester tester) async { + await testApp( + tester, + ResultsScreen(viewModel: viewModel), + goRouter: goRouter, + ); + } + + testWidgets('should load screen', (WidgetTester tester) async { + await mockNetworkImages(() async { + await loadScreen(tester); + expect(find.byType(ResultsScreen), findsOneWidget); + }); + }); + + testWidgets('should display destination', (WidgetTester tester) async { + await mockNetworkImages(() async { + await loadScreen(tester); + + // Wait for list to load + await tester.pumpAndSettle(); + + // Note: Name is converted to uppercase + expect(find.text('NAME1'), findsOneWidget); + expect(find.text('tags1'), findsOneWidget); + }); + }); + + testWidgets('should tap and navigate to activities', + (WidgetTester tester) async { + await mockNetworkImages(() async { + await loadScreen(tester); + + // Wait for list to load + await tester.pumpAndSettle(); + + // warnIfMissed false because false negative + await tester.tap(find.text('NAME1'), warnIfMissed: false); + + verify(() => goRouter.go('/activities')).called(1); + }); + }); + }); +} diff --git a/compass_app/app/test/ui/results/results_viewmodel_test.dart b/compass_app/app/test/ui/results/results_viewmodel_test.dart new file mode 100644 index 000000000..4031cc7b2 --- /dev/null +++ b/compass_app/app/test/ui/results/results_viewmodel_test.dart @@ -0,0 +1,32 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/domain/models/itinerary_config/itinerary_config.dart'; +import 'package:compass_app/ui/results/view_models/results_viewmodel.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../../testing/fakes/repositories/fake_destination_repository.dart'; +import '../../../testing/fakes/repositories/fake_itinerary_config_repository.dart'; + +void main() { + group('ResultsViewModel tests', () { + final viewModel = ResultsViewModel( + destinationRepository: FakeDestinationRepository(), + itineraryConfigRepository: FakeItineraryConfigRepository( + itineraryConfig: ItineraryConfig( + continent: 'Europe', + startDate: DateTime(2024, 01, 01), + endDate: DateTime(2024, 01, 31), + guests: 2, + ), + ), + ); + + // perform a simple test + // verifies that the list of items is properly loaded + test('should load items', () async { + expect(viewModel.destinations.length, 2); + }); + }); +} diff --git a/compass_app/app/test/ui/search_form/view_models/search_form_viewmodel_test.dart b/compass_app/app/test/ui/search_form/view_models/search_form_viewmodel_test.dart new file mode 100644 index 000000000..f9e57b708 --- /dev/null +++ b/compass_app/app/test/ui/search_form/view_models/search_form_viewmodel_test.dart @@ -0,0 +1,73 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:compass_app/ui/search_form/view_models/search_form_viewmodel.dart'; + +import '../../../../testing/fakes/repositories/fake_continent_repository.dart'; +import '../../../../testing/fakes/repositories/fake_itinerary_config_repository.dart'; + +void main() { + group('SearchFormViewModel Tests', () { + late SearchFormViewModel viewModel; + + setUp(() { + viewModel = SearchFormViewModel( + continentRepository: FakeContinentRepository(), + itineraryConfigRepository: FakeItineraryConfigRepository(), + ); + }); + + test('Initial values are correct', () { + expect(viewModel.valid, false); + expect(viewModel.selectedContinent, null); + expect(viewModel.dateRange, null); + expect(viewModel.guests, 0); + }); + + test('Setting dateRange updates correctly', () { + final DateTimeRange newDateRange = DateTimeRange( + start: DateTime(2024, 1, 1), + end: DateTime(2024, 1, 31), + ); + viewModel.dateRange = newDateRange; + expect(viewModel.dateRange, newDateRange); + }); + + test('Setting selectedContinent updates correctly', () { + viewModel.selectedContinent = 'CONTINENT'; + expect(viewModel.selectedContinent, 'CONTINENT'); + + // Setting null should work + viewModel.selectedContinent = null; + expect(viewModel.selectedContinent, null); + }); + + test('Setting guests updates correctly', () { + viewModel.guests = 2; + expect(viewModel.guests, 2); + + // Guests number should not be negative + viewModel.guests = -1; + expect(viewModel.guests, 0); + }); + + test('Set all values and save', () async { + expect(viewModel.valid, false); + + viewModel.guests = 2; + viewModel.selectedContinent = 'CONTINENT'; + final DateTimeRange newDateRange = DateTimeRange( + start: DateTime(2024, 1, 1), + end: DateTime(2024, 1, 31), + ); + viewModel.dateRange = newDateRange; + + expect(viewModel.valid, true); + await viewModel.updateItineraryConfig.execute(); + expect(viewModel.updateItineraryConfig.completed, true); + }); + }); +} diff --git a/compass_app/app/test/ui/search_form/widgets/search_form_continent_test.dart b/compass_app/app/test/ui/search_form/widgets/search_form_continent_test.dart new file mode 100644 index 000000000..5b868b6ee --- /dev/null +++ b/compass_app/app/test/ui/search_form/widgets/search_form_continent_test.dart @@ -0,0 +1,39 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/ui/search_form/view_models/search_form_viewmodel.dart'; +import 'package:compass_app/ui/search_form/widgets/search_form_continent.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../../../testing/app.dart'; +import '../../../../testing/fakes/repositories/fake_continent_repository.dart'; +import '../../../../testing/fakes/repositories/fake_itinerary_config_repository.dart'; + +void main() { + group('SearchFormContinent widget tests', () { + late SearchFormViewModel viewModel; + + setUp(() { + viewModel = SearchFormViewModel( + continentRepository: FakeContinentRepository(), + itineraryConfigRepository: FakeItineraryConfigRepository(), + ); + }); + + loadWidget(WidgetTester tester) async { + await testApp(tester, SearchFormContinent(viewModel: viewModel)); + } + + testWidgets('Should load and select continent', + (WidgetTester tester) async { + await loadWidget(tester); + expect(find.byType(SearchFormContinent), findsOneWidget); + + // Select continent + await tester.tap(find.text('CONTINENT'), warnIfMissed: false); + + expect(viewModel.selectedContinent, 'CONTINENT'); + }); + }); +} diff --git a/compass_app/app/test/ui/search_form/widgets/search_form_date_test.dart b/compass_app/app/test/ui/search_form/widgets/search_form_date_test.dart new file mode 100644 index 000000000..d89a3fd96 --- /dev/null +++ b/compass_app/app/test/ui/search_form/widgets/search_form_date_test.dart @@ -0,0 +1,61 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/ui/search_form/view_models/search_form_viewmodel.dart'; +import 'package:compass_app/ui/search_form/widgets/search_form_date.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter/material.dart'; + +import '../../../../testing/app.dart'; +import '../../../../testing/fakes/repositories/fake_continent_repository.dart'; +import '../../../../testing/fakes/repositories/fake_itinerary_config_repository.dart'; + +void main() { + group('SearchFormDate widget tests', () { + late SearchFormViewModel viewModel; + + setUp(() { + viewModel = SearchFormViewModel( + continentRepository: FakeContinentRepository(), + itineraryConfigRepository: FakeItineraryConfigRepository(), + ); + }); + + loadWidget(WidgetTester tester) async { + await testApp(tester, SearchFormDate(viewModel: viewModel)); + } + + testWidgets('should display date in different month', + (WidgetTester tester) async { + await loadWidget(tester); + expect(find.byType(SearchFormDate), findsOneWidget); + + // Initial state + expect(find.text('Add Dates'), findsOneWidget); + + // Simulate date picker input: + viewModel.dateRange = DateTimeRange( + start: DateTime(2024, 6, 12), end: DateTime(2024, 7, 23)); + await tester.pumpAndSettle(); + + expect(find.text('12 Jun - 23 Jul'), findsOneWidget); + }); + + testWidgets('should display date in same month', + (WidgetTester tester) async { + await loadWidget(tester); + expect(find.byType(SearchFormDate), findsOneWidget); + + // Initial state + expect(find.text('Add Dates'), findsOneWidget); + + // Simulate date picker input: + viewModel.dateRange = DateTimeRange( + start: DateTime(2024, 6, 12), end: DateTime(2024, 6, 23)); + await tester.pumpAndSettle(); + + expect(find.text('12 - 23 Jun'), findsOneWidget); + }); + }); +} diff --git a/compass_app/app/test/ui/search_form/widgets/search_form_guests_test.dart b/compass_app/app/test/ui/search_form/widgets/search_form_guests_test.dart new file mode 100644 index 000000000..64aa16cf8 --- /dev/null +++ b/compass_app/app/test/ui/search_form/widgets/search_form_guests_test.dart @@ -0,0 +1,68 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/ui/search_form/view_models/search_form_viewmodel.dart'; +import 'package:compass_app/ui/search_form/widgets/search_form_guests.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter/material.dart'; + +import '../../../../testing/app.dart'; +import '../../../../testing/fakes/repositories/fake_continent_repository.dart'; +import '../../../../testing/fakes/repositories/fake_itinerary_config_repository.dart'; + +void main() { + group('SearchFormGuests widget tests', () { + late SearchFormViewModel viewModel; + + setUp(() { + viewModel = SearchFormViewModel( + continentRepository: FakeContinentRepository(), + itineraryConfigRepository: FakeItineraryConfigRepository(), + ); + }); + + loadWidget(WidgetTester tester) async { + await testApp(tester, SearchFormGuests(viewModel: viewModel)); + } + + testWidgets('Increase number of guests', (WidgetTester tester) async { + await loadWidget(tester); + expect(find.byType(SearchFormGuests), findsOneWidget); + + // Initial state + expect(find.text('0'), findsOneWidget); + + await tester.tap(find.byKey(const ValueKey(addGuestsKey))); + await tester.pumpAndSettle(); + + expect(find.text('1'), findsOneWidget); + }); + + testWidgets('Decrease number of guests', (WidgetTester tester) async { + await loadWidget(tester); + expect(find.byType(SearchFormGuests), findsOneWidget); + + // Initial state + expect(find.text('0'), findsOneWidget); + + await tester.tap(find.byKey(const ValueKey(removeGuestsKey))); + await tester.pumpAndSettle(); + + // Should remain at 0 + expect(find.text('0'), findsOneWidget); + + await tester.tap(find.byKey(const ValueKey(addGuestsKey))); + await tester.pumpAndSettle(); + + // Increase to 1 + expect(find.text('1'), findsOneWidget); + + await tester.tap(find.byKey(const ValueKey(removeGuestsKey))); + await tester.pumpAndSettle(); + + // Back to 0 + expect(find.text('0'), findsOneWidget); + }); + }); +} diff --git a/compass_app/app/test/ui/search_form/widgets/search_form_screen_test.dart b/compass_app/app/test/ui/search_form/widgets/search_form_screen_test.dart new file mode 100644 index 000000000..5071b163b --- /dev/null +++ b/compass_app/app/test/ui/search_form/widgets/search_form_screen_test.dart @@ -0,0 +1,74 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/repositories/auth/auth_repository.dart'; +import 'package:compass_app/data/repositories/itinerary_config/itinerary_config_repository.dart'; +import 'package:compass_app/ui/search_form/view_models/search_form_viewmodel.dart'; +import 'package:compass_app/ui/search_form/widgets/search_form_guests.dart'; +import 'package:compass_app/ui/search_form/widgets/search_form_screen.dart'; +import 'package:compass_app/ui/search_form/widgets/search_form_submit.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:provider/provider.dart'; + +import '../../../../testing/app.dart'; +import '../../../../testing/fakes/repositories/fake_auth_repository.dart'; +import '../../../../testing/fakes/repositories/fake_continent_repository.dart'; +import '../../../../testing/fakes/repositories/fake_itinerary_config_repository.dart'; +import '../../../../testing/mocks.dart'; + +void main() { + group('SearchFormScreen widget tests', () { + late SearchFormViewModel viewModel; + late MockGoRouter goRouter; + + setUp(() { + viewModel = SearchFormViewModel( + continentRepository: FakeContinentRepository(), + itineraryConfigRepository: FakeItineraryConfigRepository(), + ); + goRouter = MockGoRouter(); + }); + + loadWidget(WidgetTester tester) async { + await testApp( + tester, + ChangeNotifierProvider.value( + value: FakeAuthRepository() as AuthRepository, + child: Provider.value( + value: FakeItineraryConfigRepository() as ItineraryConfigRepository, + child: SearchFormScreen(viewModel: viewModel), + ), + ), + goRouter: goRouter, + ); + } + + testWidgets('Should fill form and perform search', + (WidgetTester tester) async { + await loadWidget(tester); + expect(find.byType(SearchFormScreen), findsOneWidget); + + // Select continent + await tester.tap(find.text('CONTINENT'), warnIfMissed: false); + + // Select date + viewModel.dateRange = DateTimeRange( + start: DateTime(2024, 6, 12), end: DateTime(2024, 7, 23)); + + // Select guests + await tester.tap(find.byKey(const ValueKey(addGuestsKey))); + + // Refresh screen state + await tester.pumpAndSettle(); + + // Perform search + await tester.tap(find.byKey(const ValueKey(searchFormSubmitButtonKey))); + + // Should navigate to results screen + verify(() => goRouter.go('/results')).called(1); + }); + }); +} diff --git a/compass_app/app/test/ui/search_form/widgets/search_form_submit_test.dart b/compass_app/app/test/ui/search_form/widgets/search_form_submit_test.dart new file mode 100644 index 000000000..4a7d30aed --- /dev/null +++ b/compass_app/app/test/ui/search_form/widgets/search_form_submit_test.dart @@ -0,0 +1,62 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/ui/search_form/view_models/search_form_viewmodel.dart'; +import 'package:compass_app/ui/search_form/widgets/search_form_submit.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; + +import '../../../../testing/app.dart'; +import '../../../../testing/fakes/repositories/fake_continent_repository.dart'; +import '../../../../testing/fakes/repositories/fake_itinerary_config_repository.dart'; +import '../../../../testing/mocks.dart'; + +void main() { + group('SearchFormSubmit widget tests', () { + late SearchFormViewModel viewModel; + late MockGoRouter goRouter; + + setUp(() { + viewModel = SearchFormViewModel( + continentRepository: FakeContinentRepository(), + itineraryConfigRepository: FakeItineraryConfigRepository(), + ); + goRouter = MockGoRouter(); + }); + + loadWidget(WidgetTester tester) async { + await testApp( + tester, + SearchFormSubmit(viewModel: viewModel), + goRouter: goRouter, + ); + } + + testWidgets('Should be enabled and allow tap', (WidgetTester tester) async { + await loadWidget(tester); + expect(find.byType(SearchFormSubmit), findsOneWidget); + + // Tap should not navigate + await tester.tap(find.byKey(const ValueKey(searchFormSubmitButtonKey))); + verifyNever(() => goRouter.go(any())); + + // Fill in data + viewModel.guests = 2; + viewModel.selectedContinent = 'CONTINENT'; + final DateTimeRange newDateRange = DateTimeRange( + start: DateTime(2024, 1, 1), + end: DateTime(2024, 1, 31), + ); + viewModel.dateRange = newDateRange; + await tester.pumpAndSettle(); + + // Perform search + await tester.tap(find.byKey(const ValueKey(searchFormSubmitButtonKey))); + + // Should navigate to results screen + verify(() => goRouter.go('/results')).called(1); + }); + }); +} diff --git a/compass_app/app/test/utils/command_test.dart b/compass_app/app/test/utils/command_test.dart new file mode 100644 index 000000000..a2b1c8870 --- /dev/null +++ b/compass_app/app/test/utils/command_test.dart @@ -0,0 +1,102 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/utils/command.dart'; +import 'package:compass_app/utils/result.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('Command0 tests', () { + test('should complete void command', () async { + // Void action + final command = Command0(() => Future.value(Result.ok(null))); + + // Run void action + await command.execute(); + + // Action completed + expect(command.completed, true); + }); + + test('should complete bool command', () async { + // Action that returns bool + final command = Command0(() => Future.value(Result.ok(true))); + + // Run action with result + await command.execute(); + + // Action completed + expect(command.completed, true); + expect(command.result!.asOk.value, true); + }); + + test('running should be true', () async { + final command = Command0(() => Future.value(Result.ok(null))); + final future = command.execute(); + + // Action is running + expect(command.running, true); + + // Await execution + await future; + + // Action finished running + expect(command.running, false); + }); + + test('should only run once', () async { + int count = 0; + final command = Command0(() => Future.value(Result.ok(count++))); + final future = command.execute(); + + // Run multiple times + command.execute(); + command.execute(); + command.execute(); + command.execute(); + + // Await execution + await future; + + // Action is called once + expect(count, 1); + }); + + test('should handle errors', () async { + final command = + Command0(() => Future.value(Result.error(Exception('ERROR!')))); + await command.execute(); + expect(command.error, true); + expect(command.result, isA()); + }); + }); + + group('Command1 tests', () { + test('should complete void command, bool argument', () async { + // Void action with bool argument + final command = Command1((a) { + expect(a, true); + return Future.value(Result.ok(null)); + }); + + // Run void action, ignore void return + await command.execute(true); + + expect(command.completed, true); + }); + + test('should complete bool command, bool argument', () async { + // Action that returns bool argument + final command = + Command1((a) => Future.value(Result.ok(true))); + + // Run action with result and argument + await command.execute(true); + + // Argument was passed to onComplete + expect(command.completed, true); + expect(command.result!.asOk.value, true); + }); + }); +} diff --git a/compass_app/app/testing/app.dart b/compass_app/app/testing/app.dart new file mode 100644 index 000000000..2650a757d --- /dev/null +++ b/compass_app/app/testing/app.dart @@ -0,0 +1,40 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/ui/core/localization/applocalization.dart'; +import 'package:compass_app/ui/core/themes/theme.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:go_router/go_router.dart'; +import 'package:mocktail_image_network/mocktail_image_network.dart'; + +import 'mocks.dart'; + +testApp( + WidgetTester tester, + Widget body, { + GoRouter? goRouter, +}) async { + tester.view.devicePixelRatio = 1.0; + await tester.binding.setSurfaceSize(const Size(1200, 800)); + await mockNetworkImages(() async { + await tester.pumpWidget( + MaterialApp( + localizationsDelegates: [ + GlobalWidgetsLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + AppLocalizationDelegate(), + ], + theme: AppTheme.lightTheme, + home: InheritedGoRouter( + goRouter: goRouter ?? MockGoRouter(), + child: Scaffold( + body: body, + ), + ), + ), + ); + }); +} diff --git a/compass_app/app/testing/fakes/repositories/fake_activities_repository.dart b/compass_app/app/testing/fakes/repositories/fake_activities_repository.dart new file mode 100644 index 000000000..84c8173d1 --- /dev/null +++ b/compass_app/app/testing/fakes/repositories/fake_activities_repository.dart @@ -0,0 +1,23 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/repositories/activity/activity_repository.dart'; +import 'package:compass_app/domain/models/activity/activity.dart'; +import 'package:compass_app/utils/result.dart'; +import 'package:flutter/foundation.dart'; + +import '../../models/activity.dart'; +import '../../models/destination.dart'; + +class FakeActivityRepository implements ActivityRepository { + Map> activities = { + "DESTINATION": [kActivity], + kDestination1.ref: [kActivity], + }; + + @override + Future>> getByDestination(String ref) { + return SynchronousFuture(Result.ok(activities[ref]!)); + } +} diff --git a/compass_app/app/testing/fakes/repositories/fake_auth_repository.dart b/compass_app/app/testing/fakes/repositories/fake_auth_repository.dart new file mode 100644 index 000000000..55b8d1afe --- /dev/null +++ b/compass_app/app/testing/fakes/repositories/fake_auth_repository.dart @@ -0,0 +1,30 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/repositories/auth/auth_repository.dart'; +import 'package:compass_app/utils/result.dart'; + +class FakeAuthRepository extends AuthRepository { + String? token; + + @override + Future get isAuthenticated async => token != null; + + @override + Future> login({ + required String email, + required String password, + }) async { + token = 'TOKEN'; + notifyListeners(); + return Result.ok(null); + } + + @override + Future> logout() async { + token = null; + notifyListeners(); + return Result.ok(null); + } +} diff --git a/compass_app/app/testing/fakes/repositories/fake_booking_repository.dart b/compass_app/app/testing/fakes/repositories/fake_booking_repository.dart new file mode 100644 index 000000000..d6c3302de --- /dev/null +++ b/compass_app/app/testing/fakes/repositories/fake_booking_repository.dart @@ -0,0 +1,50 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/repositories/booking/booking_repository.dart'; +import 'package:compass_app/domain/models/booking/booking.dart'; +import 'package:compass_app/domain/models/booking/booking_summary.dart'; +import 'package:compass_app/utils/result.dart'; + +class FakeBookingRepository implements BookingRepository { + List bookings = List.empty(growable: true); + int sequentialId = 0; + + @override + Future> createBooking(Booking booking) async { + final bookingWithId = booking.copyWith(id: sequentialId++); + bookings.add(bookingWithId); + return Result.ok(null); + } + + @override + Future> getBooking(int id) async { + return Result.ok(bookings[id]); + } + + @override + Future>> getBookingsList() async { + return Result.ok(_createSummaries()); + } + + List _createSummaries() { + return bookings + .map( + (booking) => BookingSummary( + id: booking.id!, + name: + '${booking.destination.name}, ${booking.destination.continent}', + startDate: booking.startDate, + endDate: booking.endDate, + ), + ) + .toList(); + } + + @override + Future> delete(int id) async { + bookings.removeWhere((booking) => booking.id == id); + return Result.ok(null); + } +} diff --git a/compass_app/app/testing/fakes/repositories/fake_continent_repository.dart b/compass_app/app/testing/fakes/repositories/fake_continent_repository.dart new file mode 100644 index 000000000..1021cc023 --- /dev/null +++ b/compass_app/app/testing/fakes/repositories/fake_continent_repository.dart @@ -0,0 +1,19 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/repositories/continent/continent_repository.dart'; +import 'package:compass_app/domain/models/continent/continent.dart'; +import 'package:compass_app/utils/result.dart'; +import 'package:flutter/foundation.dart'; + +class FakeContinentRepository implements ContinentRepository { + @override + Future>> getContinents() { + return SynchronousFuture(Result.ok([ + const Continent(name: 'CONTINENT', imageUrl: 'URL'), + const Continent(name: 'CONTINENT2', imageUrl: 'URL'), + const Continent(name: 'CONTINENT3', imageUrl: 'URL'), + ])); + } +} diff --git a/compass_app/app/testing/fakes/repositories/fake_destination_repository.dart b/compass_app/app/testing/fakes/repositories/fake_destination_repository.dart new file mode 100644 index 000000000..65ec4d545 --- /dev/null +++ b/compass_app/app/testing/fakes/repositories/fake_destination_repository.dart @@ -0,0 +1,17 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/repositories/destination/destination_repository.dart'; +import 'package:compass_app/domain/models/destination/destination.dart'; +import 'package:compass_app/utils/result.dart'; +import 'package:flutter/foundation.dart'; + +import '../../models/destination.dart'; + +class FakeDestinationRepository implements DestinationRepository { + @override + Future>> getDestinations() { + return SynchronousFuture(Result.ok([kDestination1, kDestination2])); + } +} diff --git a/compass_app/app/testing/fakes/repositories/fake_itinerary_config_repository.dart b/compass_app/app/testing/fakes/repositories/fake_itinerary_config_repository.dart new file mode 100644 index 000000000..d59d1318e --- /dev/null +++ b/compass_app/app/testing/fakes/repositories/fake_itinerary_config_repository.dart @@ -0,0 +1,26 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/repositories/itinerary_config/itinerary_config_repository.dart'; +import 'package:compass_app/domain/models/itinerary_config/itinerary_config.dart'; +import 'package:compass_app/utils/result.dart'; +import 'package:flutter/foundation.dart'; + +class FakeItineraryConfigRepository implements ItineraryConfigRepository { + FakeItineraryConfigRepository({this.itineraryConfig}); + + ItineraryConfig? itineraryConfig; + + @override + Future> getItineraryConfig() { + return SynchronousFuture( + Result.ok(itineraryConfig ?? const ItineraryConfig())); + } + + @override + Future> setItineraryConfig(ItineraryConfig itineraryConfig) { + this.itineraryConfig = itineraryConfig; + return SynchronousFuture(Result.ok(null)); + } +} diff --git a/compass_app/app/testing/fakes/repositories/fake_user_repository.dart b/compass_app/app/testing/fakes/repositories/fake_user_repository.dart new file mode 100644 index 000000000..ef354d01c --- /dev/null +++ b/compass_app/app/testing/fakes/repositories/fake_user_repository.dart @@ -0,0 +1,16 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/repositories/user/user_repository.dart'; +import 'package:compass_app/domain/models/user/user.dart'; +import 'package:compass_app/utils/result.dart'; + +import '../../models/user.dart'; + +class FakeUserRepository implements UserRepository { + @override + Future> getUser() async { + return Result.ok(user); + } +} diff --git a/compass_app/app/testing/fakes/services/fake_api_client.dart b/compass_app/app/testing/fakes/services/fake_api_client.dart new file mode 100644 index 000000000..9f053e57e --- /dev/null +++ b/compass_app/app/testing/fakes/services/fake_api_client.dart @@ -0,0 +1,120 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/services/api/api_client.dart'; +import 'package:compass_app/data/services/api/model/booking/booking_api_model.dart'; +import 'package:compass_app/data/services/api/model/user/user_api_model.dart'; +import 'package:compass_app/domain/models/activity/activity.dart'; +import 'package:compass_app/domain/models/continent/continent.dart'; +import 'package:compass_app/domain/models/destination/destination.dart'; +import 'package:compass_app/utils/result.dart'; + +import '../../models/activity.dart'; +import '../../models/booking.dart'; +import '../../models/user.dart'; + +class FakeApiClient implements ApiClient { + // Should not increase when using cached data + int requestCount = 0; + + @override + Future>> getContinents() async { + requestCount++; + return Result.ok([ + const Continent(name: 'CONTINENT', imageUrl: 'URL'), + const Continent(name: 'CONTINENT2', imageUrl: 'URL'), + const Continent(name: 'CONTINENT3', imageUrl: 'URL'), + ]); + } + + @override + Future>> getDestinations() async { + requestCount++; + return Result.ok( + [ + const Destination( + ref: 'ref1', + name: 'name1', + country: 'country1', + continent: 'Europe', + knownFor: 'knownFor1', + tags: ['tags1'], + imageUrl: 'imageUrl1', + ), + const Destination( + ref: 'ref2', + name: 'name2', + country: 'country2', + continent: 'Europe', + knownFor: 'knownFor2', + tags: ['tags2'], + imageUrl: 'imageUrl2', + ), + ], + ); + } + + @override + Future>> getActivityByDestination(String ref) async { + requestCount++; + + if (ref == 'alaska') { + return Result.ok([ + const Activity( + name: 'Glacier Trekking and Ice Climbing', + description: + 'Embark on a thrilling adventure exploring the awe-inspiring glaciers of Alaska. Hike across the icy terrain, marvel at the deep blue crevasses, and even try your hand at ice climbing for an unforgettable experience.', + locationName: 'Matanuska Glacier or Mendenhall Glacier', + duration: 8, + timeOfDay: TimeOfDay.morning, + familyFriendly: false, + price: 4, + destinationRef: 'alaska', + ref: 'glacier-trekking-and-ice-climbing', + imageUrl: + 'https://storage.googleapis.com/tripedia-images/activities/alaska_glacier-trekking-and-ice-climbing.jpg', + ), + ]); + } + + if (ref == kBooking.destination.ref) { + return Result.ok([kActivity]); + } + + return Result.ok([]); + } + + @override + AuthHeaderProvider? authHeaderProvider; + + @override + Future> getBooking(int id) async { + return Result.ok(kBookingApiModel); + } + + @override + Future>> getBookings() async { + return Result.ok([kBookingApiModel]); + } + + List bookings = []; + + @override + Future> postBooking(BookingApiModel booking) async { + final bookingWithId = booking.copyWith(id: bookings.length); + bookings.add(bookingWithId); + return Result.ok(bookingWithId); + } + + @override + Future> getUser() async { + return Result.ok(userApiModel); + } + + @override + Future> deleteBooking(int id) async { + bookings.removeWhere((booking) => booking.id == id); + return Result.ok(null); + } +} diff --git a/compass_app/app/testing/fakes/services/fake_auth_api_client.dart b/compass_app/app/testing/fakes/services/fake_auth_api_client.dart new file mode 100644 index 000000000..714e2e7c3 --- /dev/null +++ b/compass_app/app/testing/fakes/services/fake_auth_api_client.dart @@ -0,0 +1,18 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/services/api/auth_api_client.dart'; +import 'package:compass_app/data/services/api/model/login_request/login_request.dart'; +import 'package:compass_app/data/services/api/model/login_response/login_response.dart'; +import 'package:compass_app/utils/result.dart'; + +class FakeAuthApiClient implements AuthApiClient { + @override + Future> login(LoginRequest loginRequest) async { + if (loginRequest.email == 'EMAIL' && loginRequest.password == 'PASSWORD') { + return Result.ok(const LoginResponse(token: 'TOKEN', userId: '123')); + } + return Result.error(Exception('ERROR!')); + } +} diff --git a/compass_app/app/testing/fakes/services/fake_shared_preferences_service.dart b/compass_app/app/testing/fakes/services/fake_shared_preferences_service.dart new file mode 100644 index 000000000..277869204 --- /dev/null +++ b/compass_app/app/testing/fakes/services/fake_shared_preferences_service.dart @@ -0,0 +1,21 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/services/shared_preferences_service.dart'; +import 'package:compass_app/utils/result.dart'; + +class FakeSharedPreferencesService implements SharedPreferencesService { + String? token; + + @override + Future> fetchToken() async { + return Result.ok(token); + } + + @override + Future> saveToken(String? token) async { + this.token = token; + return Result.ok(null); + } +} diff --git a/compass_app/app/testing/mocks.dart b/compass_app/app/testing/mocks.dart new file mode 100644 index 000000000..429ed99d9 --- /dev/null +++ b/compass_app/app/testing/mocks.dart @@ -0,0 +1,58 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; +import 'dart:io'; + +import 'package:go_router/go_router.dart'; +import 'package:mocktail/mocktail.dart'; + +class MockGoRouter extends Mock implements GoRouter {} + +class MockHttpClient extends Mock implements HttpClient {} + +class MockHttpHeaders extends Mock implements HttpHeaders {} + +class MockHttpClientRequest extends Mock implements HttpClientRequest {} + +class MockHttpClientResponse extends Mock implements HttpClientResponse {} + +extension HttpMethodMocks on MockHttpClient { + void mockGet(String path, Object object) { + when(() => get(any(), any(), path)).thenAnswer((invocation) { + final request = MockHttpClientRequest(); + final response = MockHttpClientResponse(); + when(() => request.close()).thenAnswer((_) => Future.value(response)); + when(() => request.headers).thenReturn(MockHttpHeaders()); + when(() => response.statusCode).thenReturn(200); + when(() => response.transform(utf8.decoder)) + .thenAnswer((_) => Stream.value(jsonEncode(object))); + return Future.value(request); + }); + } + + void mockPost(String path, Object object, [int statusCode = 201]) { + when(() => post(any(), any(), path)).thenAnswer((invocation) { + final request = MockHttpClientRequest(); + final response = MockHttpClientResponse(); + when(() => request.close()).thenAnswer((_) => Future.value(response)); + when(() => request.headers).thenReturn(MockHttpHeaders()); + when(() => response.statusCode).thenReturn(statusCode); + when(() => response.transform(utf8.decoder)) + .thenAnswer((_) => Stream.value(jsonEncode(object))); + return Future.value(request); + }); + } + + void mockDelete(String path) { + when(() => delete(any(), any(), path)).thenAnswer((invocation) { + final request = MockHttpClientRequest(); + final response = MockHttpClientResponse(); + when(() => request.close()).thenAnswer((_) => Future.value(response)); + when(() => request.headers).thenReturn(MockHttpHeaders()); + when(() => response.statusCode).thenReturn(204); + return Future.value(request); + }); + } +} diff --git a/compass_app/app/testing/models/activity.dart b/compass_app/app/testing/models/activity.dart new file mode 100644 index 000000000..a8e482a88 --- /dev/null +++ b/compass_app/app/testing/models/activity.dart @@ -0,0 +1,18 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/domain/models/activity/activity.dart'; + +const kActivity = Activity( + description: 'DESCRIPTION', + destinationRef: 'DESTINATION', + duration: 3, + familyFriendly: true, + imageUrl: 'http://example.com/img.png', + locationName: 'LOCATION NAME', + name: 'NAME', + price: 3, + ref: 'REF', + timeOfDay: TimeOfDay.afternoon, +); diff --git a/compass_app/app/testing/models/booking.dart b/compass_app/app/testing/models/booking.dart new file mode 100644 index 000000000..9e3a34bfe --- /dev/null +++ b/compass_app/app/testing/models/booking.dart @@ -0,0 +1,33 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/services/api/model/booking/booking_api_model.dart'; +import 'package:compass_app/domain/models/booking/booking.dart'; +import 'package:compass_app/domain/models/booking/booking_summary.dart'; + +import 'activity.dart'; +import 'destination.dart'; + +final kBooking = Booking( + startDate: DateTime(2024, 01, 01), + endDate: DateTime(2024, 02, 12), + destination: kDestination1, + activity: [kActivity], +); + +final kBookingSummary = BookingSummary( + id: 0, + startDate: kBooking.startDate, + endDate: kBooking.endDate, + name: '${kDestination1.name}, ${kDestination1.continent}', +); + +final kBookingApiModel = BookingApiModel( + id: 0, + startDate: kBooking.startDate, + endDate: kBooking.endDate, + name: '${kDestination1.name}, ${kDestination1.continent}', + destinationRef: kDestination1.ref, + activitiesRef: [kActivity.ref], +); diff --git a/compass_app/app/testing/models/destination.dart b/compass_app/app/testing/models/destination.dart new file mode 100644 index 000000000..9844cb07d --- /dev/null +++ b/compass_app/app/testing/models/destination.dart @@ -0,0 +1,25 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/domain/models/destination/destination.dart'; + +const kDestination1 = Destination( + ref: 'ref1', + name: 'name1', + country: 'country1', + continent: 'Europe', + knownFor: 'knownFor1', + tags: ['tags1'], + imageUrl: 'imageUrl1', +); + +const kDestination2 = Destination( + ref: 'ref2', + name: 'name2', + country: 'country2', + continent: 'Europe', + knownFor: 'knownFor2', + tags: ['tags2'], + imageUrl: 'imageUrl2', +); diff --git a/compass_app/app/testing/models/user.dart b/compass_app/app/testing/models/user.dart new file mode 100644 index 000000000..a49b3413e --- /dev/null +++ b/compass_app/app/testing/models/user.dart @@ -0,0 +1,18 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:compass_app/data/services/api/model/user/user_api_model.dart'; +import 'package:compass_app/domain/models/user/user.dart'; + +const userApiModel = UserApiModel( + id: 'ID', + name: 'NAME', + email: 'EMAIL', + picture: 'assets/user.jpg', +); + +const user = User( + name: 'NAME', + picture: 'assets/user.jpg', +); diff --git a/compass_app/app/web/favicon.png b/compass_app/app/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/compass_app/app/web/icons/Icon-192.png b/compass_app/app/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/compass_app/app/web/icons/Icon-512.png b/compass_app/app/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/compass_app/app/web/icons/Icon-maskable-192.png b/compass_app/app/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/compass_app/app/web/icons/Icon-maskable-512.png b/compass_app/app/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/compass_app/app/web/index.html b/compass_app/app/web/index.html new file mode 100644 index 000000000..39a66ceff --- /dev/null +++ b/compass_app/app/web/index.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + compass_app + + + + + + diff --git a/compass_app/app/web/manifest.json b/compass_app/app/web/manifest.json new file mode 100644 index 000000000..36e3af0d1 --- /dev/null +++ b/compass_app/app/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "compass_app", + "short_name": "compass_app", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/compass_app/app/windows/.gitignore b/compass_app/app/windows/.gitignore new file mode 100644 index 000000000..d492d0d98 --- /dev/null +++ b/compass_app/app/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/compass_app/app/windows/CMakeLists.txt b/compass_app/app/windows/CMakeLists.txt new file mode 100644 index 000000000..492d7ff09 --- /dev/null +++ b/compass_app/app/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(compass_app LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "compass_app") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/compass_app/app/windows/flutter/CMakeLists.txt b/compass_app/app/windows/flutter/CMakeLists.txt new file mode 100644 index 000000000..903f4899d --- /dev/null +++ b/compass_app/app/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/compass_app/app/windows/flutter/generated_plugin_registrant.cc b/compass_app/app/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 000000000..c3384ec52 --- /dev/null +++ b/compass_app/app/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,17 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + SharePlusWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); +} diff --git a/compass_app/app/windows/flutter/generated_plugin_registrant.h b/compass_app/app/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 000000000..dc139d85a --- /dev/null +++ b/compass_app/app/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/compass_app/app/windows/flutter/generated_plugins.cmake b/compass_app/app/windows/flutter/generated_plugins.cmake new file mode 100644 index 000000000..01d383628 --- /dev/null +++ b/compass_app/app/windows/flutter/generated_plugins.cmake @@ -0,0 +1,25 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + share_plus + url_launcher_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/compass_app/app/windows/runner/CMakeLists.txt b/compass_app/app/windows/runner/CMakeLists.txt new file mode 100644 index 000000000..394917c05 --- /dev/null +++ b/compass_app/app/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/compass_app/app/windows/runner/Runner.rc b/compass_app/app/windows/runner/Runner.rc new file mode 100644 index 000000000..7eb0a402b --- /dev/null +++ b/compass_app/app/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.example" "\0" + VALUE "FileDescription", "compass_app" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "compass_app" "\0" + VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "compass_app.exe" "\0" + VALUE "ProductName", "compass_app" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/compass_app/app/windows/runner/flutter_window.cpp b/compass_app/app/windows/runner/flutter_window.cpp new file mode 100644 index 000000000..955ee3038 --- /dev/null +++ b/compass_app/app/windows/runner/flutter_window.cpp @@ -0,0 +1,71 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/compass_app/app/windows/runner/flutter_window.h b/compass_app/app/windows/runner/flutter_window.h new file mode 100644 index 000000000..6da0652f0 --- /dev/null +++ b/compass_app/app/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/compass_app/app/windows/runner/main.cpp b/compass_app/app/windows/runner/main.cpp new file mode 100644 index 000000000..6f64c30e6 --- /dev/null +++ b/compass_app/app/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"compass_app", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/compass_app/app/windows/runner/resource.h b/compass_app/app/windows/runner/resource.h new file mode 100644 index 000000000..66a65d1e4 --- /dev/null +++ b/compass_app/app/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/compass_app/app/windows/runner/resources/app_icon.ico b/compass_app/app/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 diff --git a/compass_app/app/windows/runner/runner.exe.manifest b/compass_app/app/windows/runner/runner.exe.manifest new file mode 100644 index 000000000..a42ea7687 --- /dev/null +++ b/compass_app/app/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/compass_app/app/windows/runner/utils.cpp b/compass_app/app/windows/runner/utils.cpp new file mode 100644 index 000000000..3a0b46511 --- /dev/null +++ b/compass_app/app/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + unsigned int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/compass_app/app/windows/runner/utils.h b/compass_app/app/windows/runner/utils.h new file mode 100644 index 000000000..3879d5475 --- /dev/null +++ b/compass_app/app/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/compass_app/app/windows/runner/win32_window.cpp b/compass_app/app/windows/runner/win32_window.cpp new file mode 100644 index 000000000..60608d0fe --- /dev/null +++ b/compass_app/app/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/compass_app/app/windows/runner/win32_window.h b/compass_app/app/windows/runner/win32_window.h new file mode 100644 index 000000000..e901dde68 --- /dev/null +++ b/compass_app/app/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/compass_app/docs/Global — Splash.png b/compass_app/docs/Global — Splash.png new file mode 100644 index 0000000000000000000000000000000000000000..aa6339692257643fef42c5e2a54bfd7ef5c92236 GIT binary patch literal 343623 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 z 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 HMkm=SZl*B%xB$bc*HF4m4 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

0aXu0SM;g4e%RrtIG~Q`Tl9XD0@a9<(tO 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

SJMiWK)nv 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

*CLL@ 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 literal 0 HcmV?d00001 diff --git a/compass_app/docs/Legacy — Activities.png b/compass_app/docs/Legacy — Activities.png new file mode 100644 index 0000000000000000000000000000000000000000..5f4ca98ff0fcadaa764d184f9363617b5c19b0a9 GIT binary patch literal 93753 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℞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 PAmDRf8>&^IVHNrx^vxDL literal 0 HcmV?d00001 diff --git a/compass_app/docs/Legacy — Book.png b/compass_app/docs/Legacy — Book.png new file mode 100644 index 0000000000000000000000000000000000000000..77debae347c2bbb95e5f6f6f372120c79508051e GIT binary patch literal 384480 zcmV)1K+V62P)UB00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yPFY-Bpzp8S&!9J@=e*-+dbXUwmDd zvtrEv9%wY{L!oYVbI2 z{_W*YOx@zw8Z3)P;NScb;zUf?=Occ{(B#L6FZmuzp1QaM@fPuy_#N@JDL$7UrZ+5} znkGL}Q)42|SDrK9D=x`0#b?;ZfI5a41D9zZ$FzTH|4#dD(B-*W@?1C~5W}XvkY^1| zea{r1ZME)+uB#Ik-{X75n2X~WVhqJkEc?B>IA_iNT=_X_ti{-fF_72HKhM5-6QBRx zFQJ^tqgKiz+B1YgA%$=xjBI?J@8LxTgYa28-t+jKnB2Yx58rc0o|AJ;_UDRIveY$d z?F((aOmWfjJY4cz)tG8%otr!%@o#AAnzVNuM&I&Ta%k+^07H$))<1vUOW!h%t#fux zyRw4fnSTqn?@^RiQdqwEB4#&kq2COkZ~q9gi6m+X5BeYfS(IIVEZtg0aWjs3rGjd8 z5vk0x=nVBBs8!Lu|2?Qxk|=M?BVD_Ru$JbBbtBp}3QwvVahC_3l`sOO5&}^Vn$0lI zRg*X}wvERr%xtJgx*>w~8w1|txLi_cXio<$KsL_8ie;!803 zJx>8}R|}}ahk7%Ebh8WHo&cJDA0MI(#QYk{S_HZ;2zOTpnwc>4&IYPM9X`E*>8rP} zi8(at^9Z>kNSI!PEiW2+8Eg3(Rx7>eZdB2s2T-a5C9MJ7G!e9_*cMA8qVsMBwqbDR zLvYn8dcVcnwO`eYrdY$K8EOPvTNT`8~Kg;iTz+bCiv(STFqs05! zgxBRlUE_81M$s8Pg@>Me42gwBTz>735nr9+vyn$7(8*_0=X2jc(~9DrhkqLR`M2=q z)$_;=?ZPiT_6W{ix`v|@+i~^97jP}Ul)0F1%nukHnXcmx&%gVjLko+4_W75l=L;8q z=?{K0ga4OaF8n|Ex{$VFyvGkPXx`88@FeHMxOf^Zg9FZo)sRoR9ZY0k(?wvnK|-9U z9Sk9X#16Kcz?uLfNFZn`pb@CN&w1h#F1H z4l;fbLiqi<0x6dzf{-o)PSY~g`Pt`Xh%fo4#&6ic9xAvifUzLYPlPx_22a?ZDPudY zQCHtrv0j1~&szjRdD@!R4u1Tch7)|%7(s!H1r<>3pW5HoEC~bxv|XkR3gTy0I|j?Y z=9XNaXO`JYAg=4#R+sAYcsm4)LV_<)z`pov}w0`D%-vMoLEZu<#l?;e` z-nvK5F<{RpO&!Vsoxkp7;lKT}cf3!%snIAyORU3p;Iml!>IGD%=djl3g6?@2I=Vs_ z`rwlYmOubWA-`5Y)l)|xu?A0O8416RRAmXC#vlV|5e@##S2f@nco)IzO$08jqpN#A z#&;c`CMA@AtNC6?u4PU*A#Bv^n&joiZL;$Fx z81uttg!rrmF`wAv090XmgFq?|Jy(HMGEuf%$ZH*ZPnGjA27gBoo>KHVmGJ08S5LoczJiIE<))rG%f?S4PTJVo)~u9C*>GHxaIRks`2| z1m~#6G1EB4-7E08vZ&NN2oQ{`)tZ1j_^mQRd}bM7Jx4LZg$w=0la^G*}-*=JsFW_x{akXznF+@cGEreeyXp8*#=- zH)5V%&c7mVzxGv*O%`r{17VI^aN7~=S>iqD+Kq>Q^&XsDS&GfP`tsptF29cDi{HeT zufN25Z2p>$*YvBO{=mFH(*2U5Y2R#KO}_NGm%j1;7yudgf8cdyt^UAg|H;4njizb+ zCWGo{82C<-oy4Ho;9%+s1T+>_XKz;V9@yu1MNsBz)XkDDC&09w=-W(086k80UofKmZ5@|0F_pz zEDvJ`N1Nf;=hjrnVaG|`{tWRRCx*5HU^~k<1oKgm&Q!pxDd4a(Y0YL^@_h;nv~~ct z)bC4nCf{q?W2>&pYB4KIf}N%SLu;MAeSW53c=ipjaa@g;eN>y>NR|dW;GVs zqj~-;N=xgQefe!H7b_^Fvj`IW-9{d6Zx?1uZmi9fk*R8kG8om;Y1EKo*3-bk$`XNw zY~I87>viPwGtg7>2xxu;({6YesA}a7WUg)?x3R|0t-@d6HDwwwm{kd0qIpuV`VM30 z-iJ8fb*!8@gUt)S#mw3R%hd(b$1x`uxat*D7%UqED8USTz7BXi5&kR%m(PUD9|hG2 zcw+%c7_{hSto+|3)A{B}>d|?efvm4hIi%6uh9A%GW zRLy2LtY#3+qMM&%@L4ON?%P1A=|^AC!X3xg(Ge)~T6)may%X8w2Jejr)lvg)0&Uad zB@mfNuT%L**2%i+$m$+mUlskj3zmj->4$KwuaMBJr654 zg>YpJerCsBj$HsDo?Sqy6cvr&%=;ayhhdbPXmY#^s~d%~h%XJ!yE;Q=Asrtt(qwr5p?%Fo~zQd#1i`V9F;ve|+ z55{nWTviE~zrZp6MJh)zO@W7LV}b$)`)L&{#L4spi?E0gLMn4JsEI%?f}cl$j$kgD zX-T=uP_mkc;4Z#b07?_4%?NZG$Ru#_SPe%egOl;9&od1Bvqd(qq#=Q2QeG3E?MQgy zw=5eIYYH1%a+xOBlO6E3A~*q70+C=0Eih5+Nld~P#;WrIZ28LuRZWeF{r)EGz-p-I zD&Jw+EJ={KtxA~qo~EuFD&T6CEhD;|V=1O(DYoLAn|PU~I+qsBfX$SwcgkGOOZz?` zuvAhYj_d8|LD_G}dl3kDk!GN^_%LP*d6+JpQU@o8%L}t-5H3!X`d38q&WMYi0g3P4<+}BUulT>Q>#*Xb1@+6l3iNr`U^RVMyV3|$GYs} zZMj}KR^qcc*DN(3C402gSiNIRw%iXd1IHZ?q43>r!mKf4&#c2A>n8!IF+&|ieWVMG zE32qpo`S(lw>TU?ElL1sCSZizyq`ka<@vgTFqz>FSb}};WMHB^)9pfTiSHx(>EGFb zKo{A-bxKxwf`?Z_sLO+ay+<%~*N5=xpS^|dJL}k3zJ}$qe*lxeV?=f!XC`3IoQ65v zM6uC9X0eIxDCbFmz*x?qJFw2ru5!K*oD45nd;x)o3&Y*pk*g4xC>OZ{1T3?{fJ~XH zVo=iA#Ol%t4ifN!u@M*^4rWAX&rCANAk1cj;K?y22#DmZQe~3O`B4$Gi8QKS3ZZJI z9r`KdCgHeomwOEWNi^Q;m}t`xmHBXEuJL;s1ZQ6QsB>< zNKvkfc}uwY-0vVxU~IZ8l=Dq=Rx1ehbilX$VX4Q&ii>18ei)5a%wPTns78K{6c>=Id=E`uZEO9l0YpPy48 zzpSGx5<$6~`Ap8xKJ!nWc<=nOKlm>rFkbqtFMVkq{{XMQcZMT?=Ewf&=YF;6w!XxJ zKgIy*vomR}mHFDTjvcUdnT^|lK?FsY1R1_ZJ-|Y@Y{~b^zYr%a*#hh!p*ymg03kzf zY3?Gh*}+~h3nk6CbWJiFrLssF4(d4VEV=!)^U{>0=VZK^%H|zE!;$_h#Waj9DC4jl zeXBR2qN*cR>FP6D5|yTaWa~M=9yjMbW-GX3i;QLixUPr=ifk!9a&q>wZRX*w4A}x)CzKmIJ1a4atvZtqe0JL2MR=?Vj+ug zYzV6>)7Zal44%Od4opt)K5A|1peZ13F&C{3Nb2jY=j6zb@?1?v^3z&#qEceEOdm;S z#-~fIvnjz?{6d9Ub9i+VdL%%z!6oP4JH}tr+N{y}qqWCx>q}SXAm@mi!GvB(J!8R7 z38n69q9J6aavkMZgwl==MFwdRc)P~CVRUz+=3=&A%)!`PhC!Jq!1n~q5W0;qgcv9q z1n2@i0)vvYualX5(BPN{P+>qPJ|M`T+jsal0^MD>a&a0H`zCPX%!}Aue-^3K>&)t7 z1ehcO%+%8K5~`Us}8ni0Gw^BqT$m5g!6e?s%J`Y(6pSETNxj57D8p9S< zA2-=az3f7o&)>zV3uInpj5m5InT5!b2z(4~I;ADeQz6KEL|O=6w+@e+auT_mkteu> z$X4jdSSTZ1O7osF7Bq-_MLtVRDuevm6ZBG+OCyygu=)9;dJTax6P8k#;E+Lu0lQdr zGwPIi&cJpuvVlGZTrG|!LCOgGkxw$Q;raK6`pK#WP$biCmUt~yi+&ZEIHjvPSy|R^ zqM*}f;l0!SZcJx3kr(&FBDgfme4hv=1Z!rSCHhaA=|}(21YGpJe13wbt3f8ugsUh3 zrG^^EIbkhQ5VOc#I|=kfj7E;2!DIT|^fwz!k_bL2G8sd!qCqh0=lS)c8+BI%A%0GC zZ5C5kpTW7yPcbn#gLL+3?C1<(WA!Eyr@w=IE{<}xj)rR!ezHX`y{RC*Q{e!V8~i@! zzn3hn#`$DbJScdhl>H2zkxwKAG0o?DlDF&0qbKi`UKBG}1nQnw9#=lAVEr2ZC6 ziNV2R+LDu{fW|qVe4o-n?7{)GOyi~s?7AaSskk8mZu1?6x&3|VwqIU z47PM-2ST@{*okhlAt6aAOQ{8H4(Qq-=6vn29&HOi+UH_!iEoaLA^jZ1&=ii^AP2>I zwj9He5}nW93T|3UW)#1#!x=ekOVGDkfUBvicFx0oPm>?^jc=dE=IW9hGm|EEI21;M z4?vZAd%alW!`ehHpCr>H2<_a#V>WT@z#auS*z#&aX6rkeosdW%*V>7T!vGzcVJ9T~ zDdm}JE|2_r4&}u~bae{3i*ibSgE9!&j!0W(c&-;#;SSRD9q4GWqP9$GpM$AnS$rS( zv_5;w%f7!f{}cZfeM66;xt@@~W4g0&g|gVJFJtz`Ic#K?$VT=dwreN!G=DLkr}wkW zOqdycHN=1vkRTH93?Rs$*rd7c_XlCsQpk~6bj29RlNp-vJ_P$i7#tbFdTJAwmKLyF zcj2y&d=|k-2FsVf!qa4cW@fLu13bTOvP&-$vL-_Ghcd+yDuoe06I{O1_foL=}u{>l){;X73lO^MwyMr+yruhjHe-ho`CAAky(0> z<~<9#IcvzKn#}4w-YkP)kRTt1#-yae!06VqD5n_ADRudSet7)4OjL`tCgNnrxpJ8d zmaK?qr)va6jbqg0n7GPlGGdD2imr}2dICP|>Dhru*HJ`z`%qY3C*$hme2XJy?B)IK z0Y4CBSDNvOpe-T|CAd_08kJBT5wDBDkwSr9PpsNNmwyC1?|TBC7$vv$E7;_?#|T{A z+a5sB8zDpLWKy8fyIg^f0PQMdD9zD}D$OBJIn>36zR7Vv6xqxBOOJ<4c3|9%LN$*{ z-6TMAoXiHY1Wlh&$1t6TNS)Ue$RQVLBAZ^7nOVK=rF=-hVN}kMdDe8wdkrQ%WJyd1uvQO}32{D}TFhl- z9yok>|7VULJd{0u`RYadJ-z;3BsBufIG?F6@ShK8sya+(rXwUJ5fGZnkeAFuFd7cJ zKwR;)sUBFt2I`jC%CQA#n3nxh-AU0cttC}Z_2lp9QhH+^DjAXV4c5f-xWXWvV@r1;=pv5vA$;}Rg(o51TRVimk zkHiVg5*%TBKW?iXES&&n$#GGvOPz^0mXm2~>bjcFH~}pnbL27s)~$jBbsc8Q(@`0^ zsen>_ZOc$L_u(CcQ#>I4YpTzL)qbz|y{6U%W$~)<--*R}{;b0LFF==>U?$DrqA{Ch zCdTZ!GaSRV{kw4K%tZ#V1a|nkRMnfNm^@@(r$N*}KYs}0Il<#^F`*scD z_UHc)y}dh`F%vj)0hD-OYgPskZ71q(GLt?^t;+>8DVNQzk%17L^b|d#o&qYyI!ZZ$ zk1GT(NkG%<=QO5Q;nD~&M-d2ejG7JfGKsjIDPuER#!goNMly+bkip*-qihq#8bNk} zS-yuJPFK`KzUJpxA^TWg}coI{ntyptMPwD%D2!x6-0 z&m!*`0rFI`B4xO;1I+XrXi(<#QuZo@b|MstAvQe9@u2a~F$nA%4aOt#G!ZKVU|Mb|pIT%*4HxA)Zv@43D z2N-a5A{J>N6rRLLc?HN8Ng}wP~PeFrjf-(!VZJ?yOJ}oijZcV=yT&!3gVuSs8GVrJ4rEhk#fY6@8R4 z&5{o#uQlFdR=)7dAAR=|O|9dXe)I1^X8WIJIB&!)`ZVU3m_hCq51319KZ?4NsT?EO z$wH-$uD8D@UZ!qWk%^$Gy`!Ah&Y#^XQ>`nAl8L--e^2}^z{)O()g-HGNgtYBHtmui zrpe=ozdf*nfvnt8#=ZP33tP&m@lKOk0G(!M|4yl~#=EII<+Xxgi^#9pzJQd~^tSD8 z843^-bJG;v(=4r3@#a)eIWm_CYzb|a{T>nAbxl>xZ2=8c7VM0<002XQl&mz<&;m2< z`+}srH_Cu_-e>=9f5T=omI}9M$)l1z>iS>tZ^U_(`7nO><+I4n%#ukk8)eqH^T;u5 zt}Vl2pli52l4eEv$7pOW!50i-eE)9jnH=Q=1(+m2#nAc`Q*A%5W!Vl~P$nGDX)-b8j`9hwLVxdIz82ea%D3_8rgFb#Xkeal5Y3G|^dNI;{>A7v)&BP(-72Y5e9 z*!AA`5#&m^{pKQBEu&U93{#6!WnY zb$S>%X32gAazBC4N7hmCQSx&q8IbAW=sOWllkIrcp%+Tns4}QCfCcF;1t?>AgG~m$ zJhF`<0;8h5c@+tICo4r7=rtPpOgO6aaGIjLli5&>5006pbd{$pNJ**WD?vnNBiKXL z!h;RUL$ezT2sdhQh3Shk8_)7#@QFEDk5i`dAjjh+$go#4WN!p%UpMa;^+0cuQsg@Q7{Bz0EBySx=n(q%oPswrK-n)!AAT6+ zyj$J}Kbb+5!97`|InVo+U$}x!{}3X1ljkZb+$a(zY6w#btkcI?Uf#e`<2I7+pp-Ga zR*{lk4im9$h)j$V3|;W&dJ&@E;w^jV$M8AOV^n&xl+oy`nKi14If8)?@mfMo#9%#2 zFPYj!Vo?5Wh4&V{l@A-+dsHI(F~Y3(2>UgH0mBNHt2cX|k> zVn$8ds}Vn|Yj*N&*eEAIPyAj(6%*Jlim6zGkjCtFI}JsBY{QyBrj9>V#o~PZRd%nCcuIHYl&h zIYkFV?So=`8?($Cmzb5A2!|usm|vCesWBKD)Zc5&TwSRZdA%O$-qW*7e6Xx7K&ZDs z?E7C^y&LBoo$rf(isMXw`wOUD`w!I5nc-!pvG8UDU7z^>P%3#IT?4dG^E%GwGW0{z zi0t%WvjUXpAq=mq!8^dQ?4U$3KZE?-a|DQa&XXc>Q>?{cfEm0GksbTt@qOQ8;6H)<#tHDps7{KgQo;syai!wxdT99dDEKokoIRUnIq(aGzp zAVlAz5hxJUyeJt$((6D!0i^0Lq3EuYVTE{ad-&GNSl~UanN1q}2Gyz(B^@%84h@Ty z4W!eYISB(%UgypZ;k$&;$_aPDB-zy zP96qzji6FZ_;_s`vN+jNun+qOyOAx-)3q|O8Y^N#DT(?x|d!}%7#fG2@K z!A+p)!UTb@PDV`gi7I3eouMG-mKUK6KWC`OF))#2lHscPu%4&D#zdeRDj`r0q1hm4 zRqC;lr}~ADzxzXn{_L5r{Sy8MU;jgZBP28i_ODYWJM0+P&ciMe7MIe@n@wBx5^Gi( zLb5WgR>mzKM9mJ+Vo{~0GSa4cT21+dDJ2yF9s;}sixECeQ!|w;!Qf4p8ZBS1n(=TE3{C{Oe9hdX0$ZK9+cow_oKZ@vmkHBA@L;A(jsLgCL8?>;# znxOnPjggoa*HSqg?b?9~rJ=d6eF(MUGz@wYZkc4*Qf^Hj#^%t+(f_`Gf@o(HTk9O~ zS1{5}eimPO0Y0*Uc$Lh9fdfHm{#KL^eo{(AAzwcy0wp5?Ps0eJIJ3@sL0={XtTRjM z?j~64)a{v?3br06yBO&UU^>Mt+w4JCvme=9j9_CwZ%bFskwuW{Rd_7Qxo#4NV&NV% zBg3%frx*n5&^CCFdneJT=jq>M;0`cw`8*8L^btxP^ydlI5S~CMWn?!ctS~*D9J;G9 zP=SNN`?j-li0H&|r+<`Xc5HD18E!Wvz@11|7SJrvD zt84VDjB(Wcl=diNy2vn#9H&OM$!ETSQnQ5aP$y0FD8jvqsL!~V7Gw!%%<4IZ>QPEh z#Sr#0sR@xO#xI=1t#g;L?bHX*o7hC*)xTiS4l;n(=pFVVGnBw`DT~o)3|Y-flfNpZ zyDDWti=bKe5Ipi^a0|RI1d1F3bY`W1fhY}p2IP>t2kyQQ-03tb%_h97X=uX%; zb7T1M6ZrTC-$Vb50A4OZr!3mh*DV8${Wvk|HU*fG#U@hNxHW@Yr>|mWa|)UA8uHZ& z&)*|Uy>)N$7k}`H_dZb5N+0~jH(r{@f9LDJTT&BX!!vx5&-Lz>wE{@SBBUupvn4A# zINA#u9bckp%kg$_S4>6x*sZm_0ZT28lyaPM4H{6Hw`3bl1#WhhufbWv;+XM*wODr0 zx9qhtO(n}nwacNB8ZCVPp6-U{SWTC#Mz7-EYg zWvc5GV*}G!oC&pH(`G$_nKbQ7YAtAWsrCYvj#luJ5~6*Hc1Hx8lC*%vSsZCO5}G=u zEf;ES&jm_8RKFu7F~!Wp`{g}!fYxCRXcrHN-)%*GO&RyFeL4G7Y#>`oz*f~bO#r2K?1)zPMTVI-U z5#oxKc_l!;R$`EjpJ%|^U~piH*%b0X5rs+;on;!tSHD47FA87ZB))s@4OG2V%&cru zyJkK~FC*SeVK}ydjfmB<}Vb9@xIDhp9KQBzc@nK=!#E$LTu~NvQnG53nCqIm;7Qx9+{xoh} zoFW(%;LUqE2VA^o9t`^iv1-YEIwnQMSDJuVEhC>@gXX5+>vG{TrK(zE zlL451St5;SaFEv*f!-TMk^$b^H%MtS19LOMK+GUtF2l>uaQBcECyUHvd7b1bc{70m z{j*+tSL#0HItLS5HMgPf_ zffi5EXQAK2b1rA-({T=J9sC*3IYws7lm>-}K_*s$hX554-XzbVo|>kDMDK+_BK)FV zLt$*&b{w1eDvpmIMCjm2?AzsF*%0q zcOS>0d+x_@$2KfX-C)94=5_GB%>d<1tv}q791Ka8O;uQH765SEAi#u zu!FZ`7n&W3q>R_JI}kXFB%Q^bnq?OiG-W2Qw}P%XuFLUQbo*z5X*i8hbSLxITUt%4 zeT^frwZK4YXZTLpwCogM**}wjVyJK|&V?C;?P)nztHw{WWve#MIM>ql1)R#Y*4NNl z-3;J(SBgQ|oeC`5cvqEs2HJoxgQC@5$Ma6Upg9Qgj?7)#0yZ+2d;aPtYKpVae`1Wu}DB5XAFiJ@aPRNAmwO~9+=#QSS&-=s1BXtgX_mv zUpa%@t8<7(8&VFgGsEl%2I#XiC{>gxv5aG*P{Cj~B@@aXM$n7S!4oKLF#DuoOYw

+5yI=>6n*$1`a+ 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

KS(EvVn=7rYF9#%aAYr{c98(~LlC<2ejh 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

b|b9!joA(yXZ>g%PgS^75HJ6(XQ>AN&w` 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%0AV6?(EWqnMEKfTyn`* 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 cd?utA*MV?;? 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%0Aopv-pw>yDv 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%0Af0PM=0X&$Z(RQ5w0w+u7>d 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 literal 0 HcmV?d00001 diff --git a/compass_app/server/.gitignore b/compass_app/server/.gitignore new file mode 100644 index 000000000..3a8579040 --- /dev/null +++ b/compass_app/server/.gitignore @@ -0,0 +1,3 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ diff --git a/compass_app/server/analysis_options.yaml b/compass_app/server/analysis_options.yaml new file mode 100644 index 000000000..dee8927aa --- /dev/null +++ b/compass_app/server/analysis_options.yaml @@ -0,0 +1,30 @@ +# This file configures the static analysis results for your project (errors, +# warnings, and lints). +# +# This enables the 'recommended' set of lints from `package:lints`. +# This set helps identify many issues that may lead to problems when running +# or consuming Dart code, and enforces writing Dart using a single, idiomatic +# style and format. +# +# If you want a smaller set of lints you can change this to specify +# 'package:lints/core.yaml'. These are just the most critical lints +# (the recommended set includes the core lints). +# The core lints are also what is used by pub.dev for scoring packages. + +include: package:lints/recommended.yaml + +# Uncomment the following section to specify additional rules. + +# linter: +# rules: +# - camel_case_types + +# analyzer: +# exclude: +# - path/to/excluded/files/** + +# For more information about the core and recommended set of lints, see +# https://dart.dev/go/core-lints + +# For additional information about configuring this file, see +# https://dart.dev/guides/language/analysis-options diff --git a/compass_app/server/bin/compass_server.dart b/compass_app/server/bin/compass_server.dart new file mode 100644 index 000000000..7f2011552 --- /dev/null +++ b/compass_app/server/bin/compass_server.dart @@ -0,0 +1,39 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:compass_server/middleware/auth.dart'; +import 'package:compass_server/routes/booking.dart'; +import 'package:compass_server/routes/continent.dart'; +import 'package:compass_server/routes/destination.dart'; +import 'package:compass_server/routes/login.dart'; +import 'package:compass_server/routes/user.dart'; +import 'package:shelf/shelf.dart'; +import 'package:shelf/shelf_io.dart'; +import 'package:shelf_router/shelf_router.dart'; + +// Configure routes. +final _router = Router() + ..get('/continent', continentHandler) + ..mount('/destination', DestinationApi().router.call) + ..mount('/booking', BookingApi().router.call) + ..mount('/user', UserApi().router.call) + ..mount('/login', LoginApi().router.call); + +void main(List args) async { + // Use any available host or container IP (usually `0.0.0.0`). + final ip = InternetAddress.anyIPv4; + + // Configure a pipeline that logs requests. + final handler = Pipeline() + .addMiddleware(logRequests()) + .addMiddleware(authRequests()) + .addHandler(_router.call); + + // For running in containers, we respect the PORT environment variable. + final port = int.parse(Platform.environment['PORT'] ?? '8080'); + final server = await serve(handler, ip, port); + print('Server listening on port ${server.port}'); +} diff --git a/compass_app/server/lib/config/assets.dart b/compass_app/server/lib/config/assets.dart new file mode 100644 index 000000000..6ee55cf86 --- /dev/null +++ b/compass_app/server/lib/config/assets.dart @@ -0,0 +1,23 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; +import 'dart:io'; + +import '../model/activity/activity.dart'; +import '../model/destination/destination.dart'; + +class Assets { + static const _activities = '../app/assets/activities.json'; + static const _destinations = '../app/assets/destinations.json'; + + static final List destinations = + (json.decode(File(Assets._destinations).readAsStringSync()) as List) + .map((element) => Destination.fromJson(element)) + .toList(); + static final List activities = + (json.decode(File(Assets._activities).readAsStringSync()) as List) + .map((element) => Activity.fromJson(element)) + .toList(); +} diff --git a/compass_app/server/lib/config/constants.dart b/compass_app/server/lib/config/constants.dart new file mode 100644 index 000000000..60f35b40d --- /dev/null +++ b/compass_app/server/lib/config/constants.dart @@ -0,0 +1,34 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../model/user/user.dart'; + +class Constants { + /// Email for the hardcoded login. + static const email = 'email@example.com'; + + /// Password for the hardcoded login. + static const password = 'password'; + + /// Token to be returned on successful login. + static const token = + ' e1c37dfd973353b78bb71df050e2c6e72d53034e148920383968ae49b96f1fd2'; + + /// User id to be returned on successful login. + static const userId = '123'; + + /// User name for the hardcoded user. + static const name = 'Sofie'; + + /// For demo purposes we use a local asset. + static const picture = 'assets/user.jpg'; + + /// Hardcoded user. + static const user = User( + id: Constants.userId, + name: Constants.name, + email: Constants.email, + picture: Constants.picture, + ); +} diff --git a/compass_app/server/lib/middleware/auth.dart b/compass_app/server/lib/middleware/auth.dart new file mode 100644 index 000000000..4ee13c6ff --- /dev/null +++ b/compass_app/server/lib/middleware/auth.dart @@ -0,0 +1,30 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:shelf/shelf.dart'; + +import '../config/constants.dart'; + +/// Implements a simple auth Middleware. +/// +/// This is provided as an example for Flutter architectural purposes only +/// and shouldn't be used as example on how to implement authentication +/// in production. +/// +/// This Middleware checks if the token is present in the request headers, +/// otherwise returns a 401 Unauthorized response. +/// +/// This token does not expire and is not secure. +Middleware authRequests() => (innerHandler) { + return (Request request) async { + if (request.url.path != 'login' && + request.headers['Authorization'] != 'Bearer ${Constants.token}') { + // If the request is not a login request and the token is not present, + // return a 401 Unauthorized response. + return Response.unauthorized('Unauthorized'); + } + + return innerHandler(request); + }; + }; diff --git a/compass_app/server/lib/model/activity/activity.dart b/compass_app/server/lib/model/activity/activity.dart new file mode 100644 index 000000000..eef66e8dc --- /dev/null +++ b/compass_app/server/lib/model/activity/activity.dart @@ -0,0 +1,56 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'activity.freezed.dart'; + +part 'activity.g.dart'; + +enum TimeOfDay { + any, + morning, + afternoon, + evening, + night, +} + +@freezed +class Activity with _$Activity { + const factory Activity({ + /// e.g. 'Glacier Trekking and Ice Climbing' + required String name, + + /// e.g. 'Embark on a thrilling adventure exploring the awe-inspiring glaciers of Alaska. Hike across the icy terrain, marvel at the deep blue crevasses, and even try your hand at ice climbing for an unforgettable experience.' + required String description, + + /// e.g. 'Matanuska Glacier or Mendenhall Glacier' + required String locationName, + + /// Duration in days. + /// e.g. 8 + required int duration, + + /// e.g. 'morning' + required TimeOfDay timeOfDay, + + /// e.g. false + required bool familyFriendly, + + /// e.g. 4 + required int price, + + /// e.g. 'alaska' + required String destinationRef, + + /// e.g. 'glacier-trekking-and-ice-climbing' + required String ref, + + /// e.g. 'https://storage.googleapis.com/tripedia-images/activities/alaska_glacier-trekking-and-ice-climbing.jpg' + required String imageUrl, + }) = _Activity; + + factory Activity.fromJson(Map json) => + _$ActivityFromJson(json); +} diff --git a/compass_app/server/lib/model/activity/activity.freezed.dart b/compass_app/server/lib/model/activity/activity.freezed.dart new file mode 100644 index 000000000..6e277d0bc --- /dev/null +++ b/compass_app/server/lib/model/activity/activity.freezed.dart @@ -0,0 +1,425 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'activity.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +Activity _$ActivityFromJson(Map json) { + return _Activity.fromJson(json); +} + +/// @nodoc +mixin _$Activity { + /// e.g. 'Glacier Trekking and Ice Climbing' + String get name => throw _privateConstructorUsedError; + + /// e.g. 'Embark on a thrilling adventure exploring the awe-inspiring glaciers of Alaska. Hike across the icy terrain, marvel at the deep blue crevasses, and even try your hand at ice climbing for an unforgettable experience.' + String get description => throw _privateConstructorUsedError; + + /// e.g. 'Matanuska Glacier or Mendenhall Glacier' + String get locationName => throw _privateConstructorUsedError; + + /// Duration in days. + /// e.g. 8 + int get duration => throw _privateConstructorUsedError; + + /// e.g. 'morning' + TimeOfDay get timeOfDay => throw _privateConstructorUsedError; + + /// e.g. false + bool get familyFriendly => throw _privateConstructorUsedError; + + /// e.g. 4 + int get price => throw _privateConstructorUsedError; + + /// e.g. 'alaska' + String get destinationRef => throw _privateConstructorUsedError; + + /// e.g. 'glacier-trekking-and-ice-climbing' + String get ref => throw _privateConstructorUsedError; + + /// e.g. 'https://storage.googleapis.com/tripedia-images/activities/alaska_glacier-trekking-and-ice-climbing.jpg' + String get imageUrl => throw _privateConstructorUsedError; + + /// Serializes this Activity to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Activity + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $ActivityCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ActivityCopyWith<$Res> { + factory $ActivityCopyWith(Activity value, $Res Function(Activity) then) = + _$ActivityCopyWithImpl<$Res, Activity>; + @useResult + $Res call( + {String name, + String description, + String locationName, + int duration, + TimeOfDay timeOfDay, + bool familyFriendly, + int price, + String destinationRef, + String ref, + String imageUrl}); +} + +/// @nodoc +class _$ActivityCopyWithImpl<$Res, $Val extends Activity> + implements $ActivityCopyWith<$Res> { + _$ActivityCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Activity + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = null, + Object? description = null, + Object? locationName = null, + Object? duration = null, + Object? timeOfDay = null, + Object? familyFriendly = null, + Object? price = null, + Object? destinationRef = null, + Object? ref = null, + Object? imageUrl = null, + }) { + return _then(_value.copyWith( + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + description: null == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + locationName: null == locationName + ? _value.locationName + : locationName // ignore: cast_nullable_to_non_nullable + as String, + duration: null == duration + ? _value.duration + : duration // ignore: cast_nullable_to_non_nullable + as int, + timeOfDay: null == timeOfDay + ? _value.timeOfDay + : timeOfDay // ignore: cast_nullable_to_non_nullable + as TimeOfDay, + familyFriendly: null == familyFriendly + ? _value.familyFriendly + : familyFriendly // ignore: cast_nullable_to_non_nullable + as bool, + price: null == price + ? _value.price + : price // ignore: cast_nullable_to_non_nullable + as int, + destinationRef: null == destinationRef + ? _value.destinationRef + : destinationRef // ignore: cast_nullable_to_non_nullable + as String, + ref: null == ref + ? _value.ref + : ref // ignore: cast_nullable_to_non_nullable + as String, + imageUrl: null == imageUrl + ? _value.imageUrl + : imageUrl // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$ActivityImplCopyWith<$Res> + implements $ActivityCopyWith<$Res> { + factory _$$ActivityImplCopyWith( + _$ActivityImpl value, $Res Function(_$ActivityImpl) then) = + __$$ActivityImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String name, + String description, + String locationName, + int duration, + TimeOfDay timeOfDay, + bool familyFriendly, + int price, + String destinationRef, + String ref, + String imageUrl}); +} + +/// @nodoc +class __$$ActivityImplCopyWithImpl<$Res> + extends _$ActivityCopyWithImpl<$Res, _$ActivityImpl> + implements _$$ActivityImplCopyWith<$Res> { + __$$ActivityImplCopyWithImpl( + _$ActivityImpl _value, $Res Function(_$ActivityImpl) _then) + : super(_value, _then); + + /// Create a copy of Activity + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = null, + Object? description = null, + Object? locationName = null, + Object? duration = null, + Object? timeOfDay = null, + Object? familyFriendly = null, + Object? price = null, + Object? destinationRef = null, + Object? ref = null, + Object? imageUrl = null, + }) { + return _then(_$ActivityImpl( + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + description: null == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + locationName: null == locationName + ? _value.locationName + : locationName // ignore: cast_nullable_to_non_nullable + as String, + duration: null == duration + ? _value.duration + : duration // ignore: cast_nullable_to_non_nullable + as int, + timeOfDay: null == timeOfDay + ? _value.timeOfDay + : timeOfDay // ignore: cast_nullable_to_non_nullable + as TimeOfDay, + familyFriendly: null == familyFriendly + ? _value.familyFriendly + : familyFriendly // ignore: cast_nullable_to_non_nullable + as bool, + price: null == price + ? _value.price + : price // ignore: cast_nullable_to_non_nullable + as int, + destinationRef: null == destinationRef + ? _value.destinationRef + : destinationRef // ignore: cast_nullable_to_non_nullable + as String, + ref: null == ref + ? _value.ref + : ref // ignore: cast_nullable_to_non_nullable + as String, + imageUrl: null == imageUrl + ? _value.imageUrl + : imageUrl // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$ActivityImpl implements _Activity { + const _$ActivityImpl( + {required this.name, + required this.description, + required this.locationName, + required this.duration, + required this.timeOfDay, + required this.familyFriendly, + required this.price, + required this.destinationRef, + required this.ref, + required this.imageUrl}); + + factory _$ActivityImpl.fromJson(Map json) => + _$$ActivityImplFromJson(json); + + /// e.g. 'Glacier Trekking and Ice Climbing' + @override + final String name; + + /// e.g. 'Embark on a thrilling adventure exploring the awe-inspiring glaciers of Alaska. Hike across the icy terrain, marvel at the deep blue crevasses, and even try your hand at ice climbing for an unforgettable experience.' + @override + final String description; + + /// e.g. 'Matanuska Glacier or Mendenhall Glacier' + @override + final String locationName; + + /// Duration in days. + /// e.g. 8 + @override + final int duration; + + /// e.g. 'morning' + @override + final TimeOfDay timeOfDay; + + /// e.g. false + @override + final bool familyFriendly; + + /// e.g. 4 + @override + final int price; + + /// e.g. 'alaska' + @override + final String destinationRef; + + /// e.g. 'glacier-trekking-and-ice-climbing' + @override + final String ref; + + /// e.g. 'https://storage.googleapis.com/tripedia-images/activities/alaska_glacier-trekking-and-ice-climbing.jpg' + @override + final String imageUrl; + + @override + String toString() { + return 'Activity(name: $name, description: $description, locationName: $locationName, duration: $duration, timeOfDay: $timeOfDay, familyFriendly: $familyFriendly, price: $price, destinationRef: $destinationRef, ref: $ref, imageUrl: $imageUrl)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ActivityImpl && + (identical(other.name, name) || other.name == name) && + (identical(other.description, description) || + other.description == description) && + (identical(other.locationName, locationName) || + other.locationName == locationName) && + (identical(other.duration, duration) || + other.duration == duration) && + (identical(other.timeOfDay, timeOfDay) || + other.timeOfDay == timeOfDay) && + (identical(other.familyFriendly, familyFriendly) || + other.familyFriendly == familyFriendly) && + (identical(other.price, price) || other.price == price) && + (identical(other.destinationRef, destinationRef) || + other.destinationRef == destinationRef) && + (identical(other.ref, ref) || other.ref == ref) && + (identical(other.imageUrl, imageUrl) || + other.imageUrl == imageUrl)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + name, + description, + locationName, + duration, + timeOfDay, + familyFriendly, + price, + destinationRef, + ref, + imageUrl); + + /// Create a copy of Activity + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$ActivityImplCopyWith<_$ActivityImpl> get copyWith => + __$$ActivityImplCopyWithImpl<_$ActivityImpl>(this, _$identity); + + @override + Map toJson() { + return _$$ActivityImplToJson( + this, + ); + } +} + +abstract class _Activity implements Activity { + const factory _Activity( + {required final String name, + required final String description, + required final String locationName, + required final int duration, + required final TimeOfDay timeOfDay, + required final bool familyFriendly, + required final int price, + required final String destinationRef, + required final String ref, + required final String imageUrl}) = _$ActivityImpl; + + factory _Activity.fromJson(Map json) = + _$ActivityImpl.fromJson; + + /// e.g. 'Glacier Trekking and Ice Climbing' + @override + String get name; + + /// e.g. 'Embark on a thrilling adventure exploring the awe-inspiring glaciers of Alaska. Hike across the icy terrain, marvel at the deep blue crevasses, and even try your hand at ice climbing for an unforgettable experience.' + @override + String get description; + + /// e.g. 'Matanuska Glacier or Mendenhall Glacier' + @override + String get locationName; + + /// Duration in days. + /// e.g. 8 + @override + int get duration; + + /// e.g. 'morning' + @override + TimeOfDay get timeOfDay; + + /// e.g. false + @override + bool get familyFriendly; + + /// e.g. 4 + @override + int get price; + + /// e.g. 'alaska' + @override + String get destinationRef; + + /// e.g. 'glacier-trekking-and-ice-climbing' + @override + String get ref; + + /// e.g. 'https://storage.googleapis.com/tripedia-images/activities/alaska_glacier-trekking-and-ice-climbing.jpg' + @override + String get imageUrl; + + /// Create a copy of Activity + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$ActivityImplCopyWith<_$ActivityImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/server/lib/model/activity/activity.g.dart b/compass_app/server/lib/model/activity/activity.g.dart new file mode 100644 index 000000000..8ad67d674 --- /dev/null +++ b/compass_app/server/lib/model/activity/activity.g.dart @@ -0,0 +1,43 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'activity.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$ActivityImpl _$$ActivityImplFromJson(Map json) => + _$ActivityImpl( + name: json['name'] as String, + description: json['description'] as String, + locationName: json['locationName'] as String, + duration: (json['duration'] as num).toInt(), + timeOfDay: $enumDecode(_$TimeOfDayEnumMap, json['timeOfDay']), + familyFriendly: json['familyFriendly'] as bool, + price: (json['price'] as num).toInt(), + destinationRef: json['destinationRef'] as String, + ref: json['ref'] as String, + imageUrl: json['imageUrl'] as String, + ); + +Map _$$ActivityImplToJson(_$ActivityImpl instance) => + { + 'name': instance.name, + 'description': instance.description, + 'locationName': instance.locationName, + 'duration': instance.duration, + 'timeOfDay': _$TimeOfDayEnumMap[instance.timeOfDay]!, + 'familyFriendly': instance.familyFriendly, + 'price': instance.price, + 'destinationRef': instance.destinationRef, + 'ref': instance.ref, + 'imageUrl': instance.imageUrl, + }; + +const _$TimeOfDayEnumMap = { + TimeOfDay.any: 'any', + TimeOfDay.morning: 'morning', + TimeOfDay.afternoon: 'afternoon', + TimeOfDay.evening: 'evening', + TimeOfDay.night: 'night', +}; diff --git a/compass_app/server/lib/model/booking/booking.dart b/compass_app/server/lib/model/booking/booking.dart new file mode 100644 index 000000000..faf6b023d --- /dev/null +++ b/compass_app/server/lib/model/booking/booking.dart @@ -0,0 +1,35 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'booking.freezed.dart'; +part 'booking.g.dart'; + +@freezed +class Booking with _$Booking { + const factory Booking({ + /// Booking ID. Generated when stored in server. + int? id, + + /// Start date of the trip + required DateTime startDate, + + /// End date of the trip + required DateTime endDate, + + /// Booking name + /// Should be "Destination, Continent" + required String name, + + /// Destination of the trip + required String destinationRef, + + /// List of chosen activities + required List activitiesRef, + }) = _Booking; + + factory Booking.fromJson(Map json) => + _$BookingFromJson(json); +} diff --git a/compass_app/server/lib/model/booking/booking.freezed.dart b/compass_app/server/lib/model/booking/booking.freezed.dart new file mode 100644 index 000000000..848015f73 --- /dev/null +++ b/compass_app/server/lib/model/booking/booking.freezed.dart @@ -0,0 +1,312 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'booking.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +Booking _$BookingFromJson(Map json) { + return _Booking.fromJson(json); +} + +/// @nodoc +mixin _$Booking { + /// Booking ID. Generated when stored in server. + int? get id => throw _privateConstructorUsedError; + + /// Start date of the trip + DateTime get startDate => throw _privateConstructorUsedError; + + /// End date of the trip + DateTime get endDate => throw _privateConstructorUsedError; + + /// Booking name + /// Should be "Destination, Continent" + String get name => throw _privateConstructorUsedError; + + /// Destination of the trip + String get destinationRef => throw _privateConstructorUsedError; + + /// List of chosen activities + List get activitiesRef => throw _privateConstructorUsedError; + + /// Serializes this Booking to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Booking + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $BookingCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $BookingCopyWith<$Res> { + factory $BookingCopyWith(Booking value, $Res Function(Booking) then) = + _$BookingCopyWithImpl<$Res, Booking>; + @useResult + $Res call( + {int? id, + DateTime startDate, + DateTime endDate, + String name, + String destinationRef, + List activitiesRef}); +} + +/// @nodoc +class _$BookingCopyWithImpl<$Res, $Val extends Booking> + implements $BookingCopyWith<$Res> { + _$BookingCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Booking + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = freezed, + Object? startDate = null, + Object? endDate = null, + Object? name = null, + Object? destinationRef = null, + Object? activitiesRef = null, + }) { + return _then(_value.copyWith( + id: freezed == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int?, + startDate: null == startDate + ? _value.startDate + : startDate // ignore: cast_nullable_to_non_nullable + as DateTime, + endDate: null == endDate + ? _value.endDate + : endDate // ignore: cast_nullable_to_non_nullable + as DateTime, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + destinationRef: null == destinationRef + ? _value.destinationRef + : destinationRef // ignore: cast_nullable_to_non_nullable + as String, + activitiesRef: null == activitiesRef + ? _value.activitiesRef + : activitiesRef // ignore: cast_nullable_to_non_nullable + as List, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$BookingImplCopyWith<$Res> implements $BookingCopyWith<$Res> { + factory _$$BookingImplCopyWith( + _$BookingImpl value, $Res Function(_$BookingImpl) then) = + __$$BookingImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {int? id, + DateTime startDate, + DateTime endDate, + String name, + String destinationRef, + List activitiesRef}); +} + +/// @nodoc +class __$$BookingImplCopyWithImpl<$Res> + extends _$BookingCopyWithImpl<$Res, _$BookingImpl> + implements _$$BookingImplCopyWith<$Res> { + __$$BookingImplCopyWithImpl( + _$BookingImpl _value, $Res Function(_$BookingImpl) _then) + : super(_value, _then); + + /// Create a copy of Booking + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = freezed, + Object? startDate = null, + Object? endDate = null, + Object? name = null, + Object? destinationRef = null, + Object? activitiesRef = null, + }) { + return _then(_$BookingImpl( + id: freezed == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int?, + startDate: null == startDate + ? _value.startDate + : startDate // ignore: cast_nullable_to_non_nullable + as DateTime, + endDate: null == endDate + ? _value.endDate + : endDate // ignore: cast_nullable_to_non_nullable + as DateTime, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + destinationRef: null == destinationRef + ? _value.destinationRef + : destinationRef // ignore: cast_nullable_to_non_nullable + as String, + activitiesRef: null == activitiesRef + ? _value._activitiesRef + : activitiesRef // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$BookingImpl implements _Booking { + const _$BookingImpl( + {this.id, + required this.startDate, + required this.endDate, + required this.name, + required this.destinationRef, + required final List activitiesRef}) + : _activitiesRef = activitiesRef; + + factory _$BookingImpl.fromJson(Map json) => + _$$BookingImplFromJson(json); + + /// Booking ID. Generated when stored in server. + @override + final int? id; + + /// Start date of the trip + @override + final DateTime startDate; + + /// End date of the trip + @override + final DateTime endDate; + + /// Booking name + /// Should be "Destination, Continent" + @override + final String name; + + /// Destination of the trip + @override + final String destinationRef; + + /// List of chosen activities + final List _activitiesRef; + + /// List of chosen activities + @override + List get activitiesRef { + if (_activitiesRef is EqualUnmodifiableListView) return _activitiesRef; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_activitiesRef); + } + + @override + String toString() { + return 'Booking(id: $id, startDate: $startDate, endDate: $endDate, name: $name, destinationRef: $destinationRef, activitiesRef: $activitiesRef)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$BookingImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.startDate, startDate) || + other.startDate == startDate) && + (identical(other.endDate, endDate) || other.endDate == endDate) && + (identical(other.name, name) || other.name == name) && + (identical(other.destinationRef, destinationRef) || + other.destinationRef == destinationRef) && + const DeepCollectionEquality() + .equals(other._activitiesRef, _activitiesRef)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, id, startDate, endDate, name, + destinationRef, const DeepCollectionEquality().hash(_activitiesRef)); + + /// Create a copy of Booking + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$BookingImplCopyWith<_$BookingImpl> get copyWith => + __$$BookingImplCopyWithImpl<_$BookingImpl>(this, _$identity); + + @override + Map toJson() { + return _$$BookingImplToJson( + this, + ); + } +} + +abstract class _Booking implements Booking { + const factory _Booking( + {final int? id, + required final DateTime startDate, + required final DateTime endDate, + required final String name, + required final String destinationRef, + required final List activitiesRef}) = _$BookingImpl; + + factory _Booking.fromJson(Map json) = _$BookingImpl.fromJson; + + /// Booking ID. Generated when stored in server. + @override + int? get id; + + /// Start date of the trip + @override + DateTime get startDate; + + /// End date of the trip + @override + DateTime get endDate; + + /// Booking name + /// Should be "Destination, Continent" + @override + String get name; + + /// Destination of the trip + @override + String get destinationRef; + + /// List of chosen activities + @override + List get activitiesRef; + + /// Create a copy of Booking + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$BookingImplCopyWith<_$BookingImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/server/lib/model/booking/booking.g.dart b/compass_app/server/lib/model/booking/booking.g.dart new file mode 100644 index 000000000..829d766bf --- /dev/null +++ b/compass_app/server/lib/model/booking/booking.g.dart @@ -0,0 +1,29 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'booking.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$BookingImpl _$$BookingImplFromJson(Map json) => + _$BookingImpl( + id: (json['id'] as num?)?.toInt(), + startDate: DateTime.parse(json['startDate'] as String), + endDate: DateTime.parse(json['endDate'] as String), + name: json['name'] as String, + destinationRef: json['destinationRef'] as String, + activitiesRef: (json['activitiesRef'] as List) + .map((e) => e as String) + .toList(), + ); + +Map _$$BookingImplToJson(_$BookingImpl instance) => + { + 'id': instance.id, + 'startDate': instance.startDate.toIso8601String(), + 'endDate': instance.endDate.toIso8601String(), + 'name': instance.name, + 'destinationRef': instance.destinationRef, + 'activitiesRef': instance.activitiesRef, + }; diff --git a/compass_app/server/lib/model/continent/continent.dart b/compass_app/server/lib/model/continent/continent.dart new file mode 100644 index 000000000..e0a309d59 --- /dev/null +++ b/compass_app/server/lib/model/continent/continent.dart @@ -0,0 +1,23 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'continent.freezed.dart'; + +part 'continent.g.dart'; + +@freezed +class Continent with _$Continent { + const factory Continent({ + /// e.g. 'Europe' + required String name, + + /// e.g. 'https://rstr.in/google/tripedia/TmR12QdlVTT' + required String imageUrl, + }) = _Continent; + + factory Continent.fromJson(Map json) => + _$ContinentFromJson(json); +} diff --git a/compass_app/server/lib/model/continent/continent.freezed.dart b/compass_app/server/lib/model/continent/continent.freezed.dart new file mode 100644 index 000000000..f69d01046 --- /dev/null +++ b/compass_app/server/lib/model/continent/continent.freezed.dart @@ -0,0 +1,191 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'continent.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +Continent _$ContinentFromJson(Map json) { + return _Continent.fromJson(json); +} + +/// @nodoc +mixin _$Continent { + /// e.g. 'Europe' + String get name => throw _privateConstructorUsedError; + + /// e.g. 'https://rstr.in/google/tripedia/TmR12QdlVTT' + String get imageUrl => throw _privateConstructorUsedError; + + /// Serializes this Continent to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Continent + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $ContinentCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ContinentCopyWith<$Res> { + factory $ContinentCopyWith(Continent value, $Res Function(Continent) then) = + _$ContinentCopyWithImpl<$Res, Continent>; + @useResult + $Res call({String name, String imageUrl}); +} + +/// @nodoc +class _$ContinentCopyWithImpl<$Res, $Val extends Continent> + implements $ContinentCopyWith<$Res> { + _$ContinentCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Continent + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = null, + Object? imageUrl = null, + }) { + return _then(_value.copyWith( + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + imageUrl: null == imageUrl + ? _value.imageUrl + : imageUrl // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$ContinentImplCopyWith<$Res> + implements $ContinentCopyWith<$Res> { + factory _$$ContinentImplCopyWith( + _$ContinentImpl value, $Res Function(_$ContinentImpl) then) = + __$$ContinentImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String name, String imageUrl}); +} + +/// @nodoc +class __$$ContinentImplCopyWithImpl<$Res> + extends _$ContinentCopyWithImpl<$Res, _$ContinentImpl> + implements _$$ContinentImplCopyWith<$Res> { + __$$ContinentImplCopyWithImpl( + _$ContinentImpl _value, $Res Function(_$ContinentImpl) _then) + : super(_value, _then); + + /// Create a copy of Continent + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = null, + Object? imageUrl = null, + }) { + return _then(_$ContinentImpl( + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + imageUrl: null == imageUrl + ? _value.imageUrl + : imageUrl // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$ContinentImpl implements _Continent { + const _$ContinentImpl({required this.name, required this.imageUrl}); + + factory _$ContinentImpl.fromJson(Map json) => + _$$ContinentImplFromJson(json); + + /// e.g. 'Europe' + @override + final String name; + + /// e.g. 'https://rstr.in/google/tripedia/TmR12QdlVTT' + @override + final String imageUrl; + + @override + String toString() { + return 'Continent(name: $name, imageUrl: $imageUrl)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ContinentImpl && + (identical(other.name, name) || other.name == name) && + (identical(other.imageUrl, imageUrl) || + other.imageUrl == imageUrl)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, name, imageUrl); + + /// Create a copy of Continent + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$ContinentImplCopyWith<_$ContinentImpl> get copyWith => + __$$ContinentImplCopyWithImpl<_$ContinentImpl>(this, _$identity); + + @override + Map toJson() { + return _$$ContinentImplToJson( + this, + ); + } +} + +abstract class _Continent implements Continent { + const factory _Continent( + {required final String name, + required final String imageUrl}) = _$ContinentImpl; + + factory _Continent.fromJson(Map json) = + _$ContinentImpl.fromJson; + + /// e.g. 'Europe' + @override + String get name; + + /// e.g. 'https://rstr.in/google/tripedia/TmR12QdlVTT' + @override + String get imageUrl; + + /// Create a copy of Continent + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$ContinentImplCopyWith<_$ContinentImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/server/lib/model/continent/continent.g.dart b/compass_app/server/lib/model/continent/continent.g.dart new file mode 100644 index 000000000..41aba78b6 --- /dev/null +++ b/compass_app/server/lib/model/continent/continent.g.dart @@ -0,0 +1,19 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'continent.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$ContinentImpl _$$ContinentImplFromJson(Map json) => + _$ContinentImpl( + name: json['name'] as String, + imageUrl: json['imageUrl'] as String, + ); + +Map _$$ContinentImplToJson(_$ContinentImpl instance) => + { + 'name': instance.name, + 'imageUrl': instance.imageUrl, + }; diff --git a/compass_app/server/lib/model/destination/destination.dart b/compass_app/server/lib/model/destination/destination.dart new file mode 100644 index 000000000..457a12533 --- /dev/null +++ b/compass_app/server/lib/model/destination/destination.dart @@ -0,0 +1,38 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'destination.freezed.dart'; + +part 'destination.g.dart'; + +@freezed +class Destination with _$Destination { + const factory Destination({ + /// e.g. 'alaska' + required String ref, + + /// e.g. 'Alaska' + required String name, + + /// e.g. 'United States' + required String country, + + /// e.g. 'North America' + required String continent, + + /// e.g. 'Alaska is a haven for outdoor enthusiasts ...' + required String knownFor, + + /// e.g. ['Mountain', 'Off-the-beaten-path', 'Wildlife watching'] + required List tags, + + /// e.g. 'https://storage.googleapis.com/tripedia-images/destinations/alaska.jpg' + required String imageUrl, + }) = _Destination; + + factory Destination.fromJson(Map json) => + _$DestinationFromJson(json); +} diff --git a/compass_app/server/lib/model/destination/destination.freezed.dart b/compass_app/server/lib/model/destination/destination.freezed.dart new file mode 100644 index 000000000..faaec5902 --- /dev/null +++ b/compass_app/server/lib/model/destination/destination.freezed.dart @@ -0,0 +1,339 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'destination.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +Destination _$DestinationFromJson(Map json) { + return _Destination.fromJson(json); +} + +/// @nodoc +mixin _$Destination { + /// e.g. 'alaska' + String get ref => throw _privateConstructorUsedError; + + /// e.g. 'Alaska' + String get name => throw _privateConstructorUsedError; + + /// e.g. 'United States' + String get country => throw _privateConstructorUsedError; + + /// e.g. 'North America' + String get continent => throw _privateConstructorUsedError; + + /// e.g. 'Alaska is a haven for outdoor enthusiasts ...' + String get knownFor => throw _privateConstructorUsedError; + + /// e.g. ['Mountain', 'Off-the-beaten-path', 'Wildlife watching'] + List get tags => throw _privateConstructorUsedError; + + /// e.g. 'https://storage.googleapis.com/tripedia-images/destinations/alaska.jpg' + String get imageUrl => throw _privateConstructorUsedError; + + /// Serializes this Destination to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Destination + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $DestinationCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $DestinationCopyWith<$Res> { + factory $DestinationCopyWith( + Destination value, $Res Function(Destination) then) = + _$DestinationCopyWithImpl<$Res, Destination>; + @useResult + $Res call( + {String ref, + String name, + String country, + String continent, + String knownFor, + List tags, + String imageUrl}); +} + +/// @nodoc +class _$DestinationCopyWithImpl<$Res, $Val extends Destination> + implements $DestinationCopyWith<$Res> { + _$DestinationCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Destination + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? ref = null, + Object? name = null, + Object? country = null, + Object? continent = null, + Object? knownFor = null, + Object? tags = null, + Object? imageUrl = null, + }) { + return _then(_value.copyWith( + ref: null == ref + ? _value.ref + : ref // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + country: null == country + ? _value.country + : country // ignore: cast_nullable_to_non_nullable + as String, + continent: null == continent + ? _value.continent + : continent // ignore: cast_nullable_to_non_nullable + as String, + knownFor: null == knownFor + ? _value.knownFor + : knownFor // ignore: cast_nullable_to_non_nullable + as String, + tags: null == tags + ? _value.tags + : tags // ignore: cast_nullable_to_non_nullable + as List, + imageUrl: null == imageUrl + ? _value.imageUrl + : imageUrl // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$DestinationImplCopyWith<$Res> + implements $DestinationCopyWith<$Res> { + factory _$$DestinationImplCopyWith( + _$DestinationImpl value, $Res Function(_$DestinationImpl) then) = + __$$DestinationImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String ref, + String name, + String country, + String continent, + String knownFor, + List tags, + String imageUrl}); +} + +/// @nodoc +class __$$DestinationImplCopyWithImpl<$Res> + extends _$DestinationCopyWithImpl<$Res, _$DestinationImpl> + implements _$$DestinationImplCopyWith<$Res> { + __$$DestinationImplCopyWithImpl( + _$DestinationImpl _value, $Res Function(_$DestinationImpl) _then) + : super(_value, _then); + + /// Create a copy of Destination + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? ref = null, + Object? name = null, + Object? country = null, + Object? continent = null, + Object? knownFor = null, + Object? tags = null, + Object? imageUrl = null, + }) { + return _then(_$DestinationImpl( + ref: null == ref + ? _value.ref + : ref // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + country: null == country + ? _value.country + : country // ignore: cast_nullable_to_non_nullable + as String, + continent: null == continent + ? _value.continent + : continent // ignore: cast_nullable_to_non_nullable + as String, + knownFor: null == knownFor + ? _value.knownFor + : knownFor // ignore: cast_nullable_to_non_nullable + as String, + tags: null == tags + ? _value._tags + : tags // ignore: cast_nullable_to_non_nullable + as List, + imageUrl: null == imageUrl + ? _value.imageUrl + : imageUrl // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$DestinationImpl implements _Destination { + const _$DestinationImpl( + {required this.ref, + required this.name, + required this.country, + required this.continent, + required this.knownFor, + required final List tags, + required this.imageUrl}) + : _tags = tags; + + factory _$DestinationImpl.fromJson(Map json) => + _$$DestinationImplFromJson(json); + + /// e.g. 'alaska' + @override + final String ref; + + /// e.g. 'Alaska' + @override + final String name; + + /// e.g. 'United States' + @override + final String country; + + /// e.g. 'North America' + @override + final String continent; + + /// e.g. 'Alaska is a haven for outdoor enthusiasts ...' + @override + final String knownFor; + + /// e.g. ['Mountain', 'Off-the-beaten-path', 'Wildlife watching'] + final List _tags; + + /// e.g. ['Mountain', 'Off-the-beaten-path', 'Wildlife watching'] + @override + List get tags { + if (_tags is EqualUnmodifiableListView) return _tags; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_tags); + } + + /// e.g. 'https://storage.googleapis.com/tripedia-images/destinations/alaska.jpg' + @override + final String imageUrl; + + @override + String toString() { + return 'Destination(ref: $ref, name: $name, country: $country, continent: $continent, knownFor: $knownFor, tags: $tags, imageUrl: $imageUrl)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$DestinationImpl && + (identical(other.ref, ref) || other.ref == ref) && + (identical(other.name, name) || other.name == name) && + (identical(other.country, country) || other.country == country) && + (identical(other.continent, continent) || + other.continent == continent) && + (identical(other.knownFor, knownFor) || + other.knownFor == knownFor) && + const DeepCollectionEquality().equals(other._tags, _tags) && + (identical(other.imageUrl, imageUrl) || + other.imageUrl == imageUrl)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, ref, name, country, continent, + knownFor, const DeepCollectionEquality().hash(_tags), imageUrl); + + /// Create a copy of Destination + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$DestinationImplCopyWith<_$DestinationImpl> get copyWith => + __$$DestinationImplCopyWithImpl<_$DestinationImpl>(this, _$identity); + + @override + Map toJson() { + return _$$DestinationImplToJson( + this, + ); + } +} + +abstract class _Destination implements Destination { + const factory _Destination( + {required final String ref, + required final String name, + required final String country, + required final String continent, + required final String knownFor, + required final List tags, + required final String imageUrl}) = _$DestinationImpl; + + factory _Destination.fromJson(Map json) = + _$DestinationImpl.fromJson; + + /// e.g. 'alaska' + @override + String get ref; + + /// e.g. 'Alaska' + @override + String get name; + + /// e.g. 'United States' + @override + String get country; + + /// e.g. 'North America' + @override + String get continent; + + /// e.g. 'Alaska is a haven for outdoor enthusiasts ...' + @override + String get knownFor; + + /// e.g. ['Mountain', 'Off-the-beaten-path', 'Wildlife watching'] + @override + List get tags; + + /// e.g. 'https://storage.googleapis.com/tripedia-images/destinations/alaska.jpg' + @override + String get imageUrl; + + /// Create a copy of Destination + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$DestinationImplCopyWith<_$DestinationImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/server/lib/model/destination/destination.g.dart b/compass_app/server/lib/model/destination/destination.g.dart new file mode 100644 index 000000000..796e2bbbd --- /dev/null +++ b/compass_app/server/lib/model/destination/destination.g.dart @@ -0,0 +1,29 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'destination.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$DestinationImpl _$$DestinationImplFromJson(Map json) => + _$DestinationImpl( + ref: json['ref'] as String, + name: json['name'] as String, + country: json['country'] as String, + continent: json['continent'] as String, + knownFor: json['knownFor'] as String, + tags: (json['tags'] as List).map((e) => e as String).toList(), + imageUrl: json['imageUrl'] as String, + ); + +Map _$$DestinationImplToJson(_$DestinationImpl instance) => + { + 'ref': instance.ref, + 'name': instance.name, + 'country': instance.country, + 'continent': instance.continent, + 'knownFor': instance.knownFor, + 'tags': instance.tags, + 'imageUrl': instance.imageUrl, + }; diff --git a/compass_app/server/lib/model/login_request/login_request.dart b/compass_app/server/lib/model/login_request/login_request.dart new file mode 100644 index 000000000..e30ec7cf6 --- /dev/null +++ b/compass_app/server/lib/model/login_request/login_request.dart @@ -0,0 +1,24 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'login_request.freezed.dart'; + +part 'login_request.g.dart'; + +/// Simple data class to hold login request data. +@freezed +class LoginRequest with _$LoginRequest { + const factory LoginRequest({ + /// Email address. + required String email, + + /// Plain text password. + required String password, + }) = _LoginRequest; + + factory LoginRequest.fromJson(Map json) => + _$LoginRequestFromJson(json); +} diff --git a/compass_app/server/lib/model/login_request/login_request.freezed.dart b/compass_app/server/lib/model/login_request/login_request.freezed.dart new file mode 100644 index 000000000..d130b9a4f --- /dev/null +++ b/compass_app/server/lib/model/login_request/login_request.freezed.dart @@ -0,0 +1,192 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'login_request.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +LoginRequest _$LoginRequestFromJson(Map json) { + return _LoginRequest.fromJson(json); +} + +/// @nodoc +mixin _$LoginRequest { + /// Email address. + String get email => throw _privateConstructorUsedError; + + /// Plain text password. + String get password => throw _privateConstructorUsedError; + + /// Serializes this LoginRequest to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of LoginRequest + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $LoginRequestCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $LoginRequestCopyWith<$Res> { + factory $LoginRequestCopyWith( + LoginRequest value, $Res Function(LoginRequest) then) = + _$LoginRequestCopyWithImpl<$Res, LoginRequest>; + @useResult + $Res call({String email, String password}); +} + +/// @nodoc +class _$LoginRequestCopyWithImpl<$Res, $Val extends LoginRequest> + implements $LoginRequestCopyWith<$Res> { + _$LoginRequestCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of LoginRequest + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? email = null, + Object? password = null, + }) { + return _then(_value.copyWith( + email: null == email + ? _value.email + : email // ignore: cast_nullable_to_non_nullable + as String, + password: null == password + ? _value.password + : password // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$LoginRequestImplCopyWith<$Res> + implements $LoginRequestCopyWith<$Res> { + factory _$$LoginRequestImplCopyWith( + _$LoginRequestImpl value, $Res Function(_$LoginRequestImpl) then) = + __$$LoginRequestImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String email, String password}); +} + +/// @nodoc +class __$$LoginRequestImplCopyWithImpl<$Res> + extends _$LoginRequestCopyWithImpl<$Res, _$LoginRequestImpl> + implements _$$LoginRequestImplCopyWith<$Res> { + __$$LoginRequestImplCopyWithImpl( + _$LoginRequestImpl _value, $Res Function(_$LoginRequestImpl) _then) + : super(_value, _then); + + /// Create a copy of LoginRequest + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? email = null, + Object? password = null, + }) { + return _then(_$LoginRequestImpl( + email: null == email + ? _value.email + : email // ignore: cast_nullable_to_non_nullable + as String, + password: null == password + ? _value.password + : password // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$LoginRequestImpl implements _LoginRequest { + const _$LoginRequestImpl({required this.email, required this.password}); + + factory _$LoginRequestImpl.fromJson(Map json) => + _$$LoginRequestImplFromJson(json); + + /// Email address. + @override + final String email; + + /// Plain text password. + @override + final String password; + + @override + String toString() { + return 'LoginRequest(email: $email, password: $password)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoginRequestImpl && + (identical(other.email, email) || other.email == email) && + (identical(other.password, password) || + other.password == password)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, email, password); + + /// Create a copy of LoginRequest + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$LoginRequestImplCopyWith<_$LoginRequestImpl> get copyWith => + __$$LoginRequestImplCopyWithImpl<_$LoginRequestImpl>(this, _$identity); + + @override + Map toJson() { + return _$$LoginRequestImplToJson( + this, + ); + } +} + +abstract class _LoginRequest implements LoginRequest { + const factory _LoginRequest( + {required final String email, + required final String password}) = _$LoginRequestImpl; + + factory _LoginRequest.fromJson(Map json) = + _$LoginRequestImpl.fromJson; + + /// Email address. + @override + String get email; + + /// Plain text password. + @override + String get password; + + /// Create a copy of LoginRequest + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$LoginRequestImplCopyWith<_$LoginRequestImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/server/lib/model/login_request/login_request.g.dart b/compass_app/server/lib/model/login_request/login_request.g.dart new file mode 100644 index 000000000..0a11bd9f2 --- /dev/null +++ b/compass_app/server/lib/model/login_request/login_request.g.dart @@ -0,0 +1,19 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'login_request.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$LoginRequestImpl _$$LoginRequestImplFromJson(Map json) => + _$LoginRequestImpl( + email: json['email'] as String, + password: json['password'] as String, + ); + +Map _$$LoginRequestImplToJson(_$LoginRequestImpl instance) => + { + 'email': instance.email, + 'password': instance.password, + }; diff --git a/compass_app/server/lib/model/login_response/login_response.dart b/compass_app/server/lib/model/login_response/login_response.dart new file mode 100644 index 000000000..bc17d6a9f --- /dev/null +++ b/compass_app/server/lib/model/login_response/login_response.dart @@ -0,0 +1,24 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'login_response.freezed.dart'; + +part 'login_response.g.dart'; + +/// LoginResponse model. +@freezed +class LoginResponse with _$LoginResponse { + const factory LoginResponse({ + /// The token to be used for authentication. + required String token, + + /// The user id. + required String userId, + }) = _LoginResponse; + + factory LoginResponse.fromJson(Map json) => + _$LoginResponseFromJson(json); +} diff --git a/compass_app/server/lib/model/login_response/login_response.freezed.dart b/compass_app/server/lib/model/login_response/login_response.freezed.dart new file mode 100644 index 000000000..bfc5829a6 --- /dev/null +++ b/compass_app/server/lib/model/login_response/login_response.freezed.dart @@ -0,0 +1,191 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'login_response.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +LoginResponse _$LoginResponseFromJson(Map json) { + return _LoginResponse.fromJson(json); +} + +/// @nodoc +mixin _$LoginResponse { + /// The token to be used for authentication. + String get token => throw _privateConstructorUsedError; + + /// The user id. + String get userId => throw _privateConstructorUsedError; + + /// Serializes this LoginResponse to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of LoginResponse + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $LoginResponseCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $LoginResponseCopyWith<$Res> { + factory $LoginResponseCopyWith( + LoginResponse value, $Res Function(LoginResponse) then) = + _$LoginResponseCopyWithImpl<$Res, LoginResponse>; + @useResult + $Res call({String token, String userId}); +} + +/// @nodoc +class _$LoginResponseCopyWithImpl<$Res, $Val extends LoginResponse> + implements $LoginResponseCopyWith<$Res> { + _$LoginResponseCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of LoginResponse + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? token = null, + Object? userId = null, + }) { + return _then(_value.copyWith( + token: null == token + ? _value.token + : token // ignore: cast_nullable_to_non_nullable + as String, + userId: null == userId + ? _value.userId + : userId // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$LoginResponseImplCopyWith<$Res> + implements $LoginResponseCopyWith<$Res> { + factory _$$LoginResponseImplCopyWith( + _$LoginResponseImpl value, $Res Function(_$LoginResponseImpl) then) = + __$$LoginResponseImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String token, String userId}); +} + +/// @nodoc +class __$$LoginResponseImplCopyWithImpl<$Res> + extends _$LoginResponseCopyWithImpl<$Res, _$LoginResponseImpl> + implements _$$LoginResponseImplCopyWith<$Res> { + __$$LoginResponseImplCopyWithImpl( + _$LoginResponseImpl _value, $Res Function(_$LoginResponseImpl) _then) + : super(_value, _then); + + /// Create a copy of LoginResponse + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? token = null, + Object? userId = null, + }) { + return _then(_$LoginResponseImpl( + token: null == token + ? _value.token + : token // ignore: cast_nullable_to_non_nullable + as String, + userId: null == userId + ? _value.userId + : userId // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$LoginResponseImpl implements _LoginResponse { + const _$LoginResponseImpl({required this.token, required this.userId}); + + factory _$LoginResponseImpl.fromJson(Map json) => + _$$LoginResponseImplFromJson(json); + + /// The token to be used for authentication. + @override + final String token; + + /// The user id. + @override + final String userId; + + @override + String toString() { + return 'LoginResponse(token: $token, userId: $userId)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoginResponseImpl && + (identical(other.token, token) || other.token == token) && + (identical(other.userId, userId) || other.userId == userId)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, token, userId); + + /// Create a copy of LoginResponse + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$LoginResponseImplCopyWith<_$LoginResponseImpl> get copyWith => + __$$LoginResponseImplCopyWithImpl<_$LoginResponseImpl>(this, _$identity); + + @override + Map toJson() { + return _$$LoginResponseImplToJson( + this, + ); + } +} + +abstract class _LoginResponse implements LoginResponse { + const factory _LoginResponse( + {required final String token, + required final String userId}) = _$LoginResponseImpl; + + factory _LoginResponse.fromJson(Map json) = + _$LoginResponseImpl.fromJson; + + /// The token to be used for authentication. + @override + String get token; + + /// The user id. + @override + String get userId; + + /// Create a copy of LoginResponse + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$LoginResponseImplCopyWith<_$LoginResponseImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/server/lib/model/login_response/login_response.g.dart b/compass_app/server/lib/model/login_response/login_response.g.dart new file mode 100644 index 000000000..f1ee1db63 --- /dev/null +++ b/compass_app/server/lib/model/login_response/login_response.g.dart @@ -0,0 +1,19 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'login_response.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$LoginResponseImpl _$$LoginResponseImplFromJson(Map json) => + _$LoginResponseImpl( + token: json['token'] as String, + userId: json['userId'] as String, + ); + +Map _$$LoginResponseImplToJson(_$LoginResponseImpl instance) => + { + 'token': instance.token, + 'userId': instance.userId, + }; diff --git a/compass_app/server/lib/model/user/user.dart b/compass_app/server/lib/model/user/user.dart new file mode 100644 index 000000000..26ad338b3 --- /dev/null +++ b/compass_app/server/lib/model/user/user.dart @@ -0,0 +1,27 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'user.freezed.dart'; +part 'user.g.dart'; + +@freezed +abstract class User with _$User { + const factory User({ + /// The user's ID. + required String id, + + /// The user's name. + required String name, + + /// The user's email. + required String email, + + /// The user's picture URL. + required String picture, + }) = _User; + + factory User.fromJson(Map json) => _$UserFromJson(json); +} diff --git a/compass_app/server/lib/model/user/user.freezed.dart b/compass_app/server/lib/model/user/user.freezed.dart new file mode 100644 index 000000000..a0e0ed628 --- /dev/null +++ b/compass_app/server/lib/model/user/user.freezed.dart @@ -0,0 +1,236 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'user.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +User _$UserFromJson(Map json) { + return _User.fromJson(json); +} + +/// @nodoc +mixin _$User { + /// The user's ID. + String get id => throw _privateConstructorUsedError; + + /// The user's name. + String get name => throw _privateConstructorUsedError; + + /// The user's email. + String get email => throw _privateConstructorUsedError; + + /// The user's picture URL. + String get picture => throw _privateConstructorUsedError; + + /// Serializes this User to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of User + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $UserCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $UserCopyWith<$Res> { + factory $UserCopyWith(User value, $Res Function(User) then) = + _$UserCopyWithImpl<$Res, User>; + @useResult + $Res call({String id, String name, String email, String picture}); +} + +/// @nodoc +class _$UserCopyWithImpl<$Res, $Val extends User> + implements $UserCopyWith<$Res> { + _$UserCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of User + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? name = null, + Object? email = null, + Object? picture = null, + }) { + return _then(_value.copyWith( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + email: null == email + ? _value.email + : email // ignore: cast_nullable_to_non_nullable + as String, + picture: null == picture + ? _value.picture + : picture // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$UserImplCopyWith<$Res> implements $UserCopyWith<$Res> { + factory _$$UserImplCopyWith( + _$UserImpl value, $Res Function(_$UserImpl) then) = + __$$UserImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String id, String name, String email, String picture}); +} + +/// @nodoc +class __$$UserImplCopyWithImpl<$Res> + extends _$UserCopyWithImpl<$Res, _$UserImpl> + implements _$$UserImplCopyWith<$Res> { + __$$UserImplCopyWithImpl(_$UserImpl _value, $Res Function(_$UserImpl) _then) + : super(_value, _then); + + /// Create a copy of User + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? name = null, + Object? email = null, + Object? picture = null, + }) { + return _then(_$UserImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + email: null == email + ? _value.email + : email // ignore: cast_nullable_to_non_nullable + as String, + picture: null == picture + ? _value.picture + : picture // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$UserImpl implements _User { + const _$UserImpl( + {required this.id, + required this.name, + required this.email, + required this.picture}); + + factory _$UserImpl.fromJson(Map json) => + _$$UserImplFromJson(json); + + /// The user's ID. + @override + final String id; + + /// The user's name. + @override + final String name; + + /// The user's email. + @override + final String email; + + /// The user's picture URL. + @override + final String picture; + + @override + String toString() { + return 'User(id: $id, name: $name, email: $email, picture: $picture)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$UserImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.name, name) || other.name == name) && + (identical(other.email, email) || other.email == email) && + (identical(other.picture, picture) || other.picture == picture)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, id, name, email, picture); + + /// Create a copy of User + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$UserImplCopyWith<_$UserImpl> get copyWith => + __$$UserImplCopyWithImpl<_$UserImpl>(this, _$identity); + + @override + Map toJson() { + return _$$UserImplToJson( + this, + ); + } +} + +abstract class _User implements User { + const factory _User( + {required final String id, + required final String name, + required final String email, + required final String picture}) = _$UserImpl; + + factory _User.fromJson(Map json) = _$UserImpl.fromJson; + + /// The user's ID. + @override + String get id; + + /// The user's name. + @override + String get name; + + /// The user's email. + @override + String get email; + + /// The user's picture URL. + @override + String get picture; + + /// Create a copy of User + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$UserImplCopyWith<_$UserImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/compass_app/server/lib/model/user/user.g.dart b/compass_app/server/lib/model/user/user.g.dart new file mode 100644 index 000000000..f13122846 --- /dev/null +++ b/compass_app/server/lib/model/user/user.g.dart @@ -0,0 +1,22 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$UserImpl _$$UserImplFromJson(Map json) => _$UserImpl( + id: json['id'] as String, + name: json['name'] as String, + email: json['email'] as String, + picture: json['picture'] as String, + ); + +Map _$$UserImplToJson(_$UserImpl instance) => + { + 'id': instance.id, + 'name': instance.name, + 'email': instance.email, + 'picture': instance.picture, + }; diff --git a/compass_app/server/lib/routes/booking.dart b/compass_app/server/lib/routes/booking.dart new file mode 100644 index 000000000..90519c41d --- /dev/null +++ b/compass_app/server/lib/routes/booking.dart @@ -0,0 +1,116 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; + +import 'package:collection/collection.dart'; +import 'package:shelf/shelf.dart'; +import 'package:shelf_router/shelf_router.dart'; + +import '../config/assets.dart'; +import '../model/booking/booking.dart'; + +/// Allows the user to save and restore bookings. +/// +/// Bookings are stored in memory for demo purposes, +/// so they are lost when the server stops. +/// +/// For demo purposes, this API includes a default pre-generated booking. +/// +/// The [Booking.id] is also the index in the bookings list. +class BookingApi { + BookingApi() { + // Create a default booking + var destination = Assets.destinations.first; + final activitiesRef = Assets.activities + .where((activity) => activity.destinationRef == destination.ref) + .map((activity) => activity.ref) + .toList(); + _bookings.add( + Booking( + id: _sequentialId++, + name: '${destination.name}, ${destination.continent}', + startDate: DateTime(2024, 7, 20), + endDate: DateTime(2024, 8, 15), + destinationRef: destination.ref, + activitiesRef: activitiesRef, + ), + ); + } + + // Bookings are kept in memory for demo purposes. + // To keep things simple, the id is also the index in the list. + final List _bookings = List.empty(growable: true); + + // Used to generate IDs for bookings + int _sequentialId = 0; + + Router get router { + final router = Router(); + + // Get User bookings + router.get('/', (Request request) { + return Response.ok( + json.encode(_bookings), + headers: {'Content-Type': 'application/json'}, + ); + }); + + // Get a booking by id + router.get('/', (Request request, String id) { + final bookingId = int.parse(id); + final booking = + _bookings.firstWhereOrNull((booking) => booking.id == bookingId); + + if (booking == null) { + return Response.notFound('Invalid id'); + } + + return Response.ok( + json.encode(booking), + headers: {'Content-Type': 'application/json'}, + ); + }); + + // Save a new booking + router.post('/', (Request request) async { + final body = await request.readAsString(); + final booking = Booking.fromJson(json.decode(body)); + + if (booking.id != null) { + // POST endpoint only allows newly created bookings + return Response.badRequest( + body: 'Booking already has id, use PUT instead.'); + } + + // Add ID to new booking + final bookingWithId = booking.copyWith(id: _sequentialId++); + + // Store booking + _bookings.add(bookingWithId); + + // Respond with newly created booking + return Response( + 201, // created + body: json.encode(bookingWithId), + headers: {'Content-Type': 'application/json'}, + ); + }); + + // Delete booking + router.delete('/', (Request request, String id) async { + final bookingId = int.parse(id); + final booking = + _bookings.firstWhereOrNull((booking) => booking.id == bookingId); + if (booking == null) { + return Response.notFound('Invalid id'); + } + _bookings.remove(booking); + // 240: no content + return Response(204); + }); + + return router; + } +} diff --git a/compass_app/server/lib/routes/continent.dart b/compass_app/server/lib/routes/continent.dart new file mode 100644 index 000000000..2a5ebd7c2 --- /dev/null +++ b/compass_app/server/lib/routes/continent.dart @@ -0,0 +1,44 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; + +import 'package:shelf/shelf.dart'; + +import '../model/continent/continent.dart'; + +final _continents = [ + Continent( + name: 'Europe', + imageUrl: 'https://rstr.in/google/tripedia/TmR12QdlVTT', + ), + Continent( + name: 'Asia', + imageUrl: 'https://rstr.in/google/tripedia/VJ8BXlQg8O1', + ), + Continent( + name: 'South America', + imageUrl: 'https://rstr.in/google/tripedia/flm_-o1aI8e', + ), + Continent( + name: 'Africa', + imageUrl: 'https://rstr.in/google/tripedia/-nzi8yFOBpF', + ), + Continent( + name: 'North America', + imageUrl: 'https://rstr.in/google/tripedia/jlbgFDrSUVE', + ), + Continent( + name: 'Oceania', + imageUrl: 'https://rstr.in/google/tripedia/vxyrDE-fZVL', + ), + Continent( + name: 'Australia', + imageUrl: 'https://rstr.in/google/tripedia/z6vy6HeRyvZ', + ), +]; + +Response continentHandler(Request req) { + return Response.ok(jsonEncode(_continents)); +} diff --git a/compass_app/server/lib/routes/destination.dart b/compass_app/server/lib/routes/destination.dart new file mode 100644 index 000000000..7d63ca577 --- /dev/null +++ b/compass_app/server/lib/routes/destination.dart @@ -0,0 +1,35 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; + +import 'package:shelf/shelf.dart'; +import 'package:shelf_router/shelf_router.dart'; + +import '../config/assets.dart'; + +class DestinationApi { + Router get router { + final router = Router(); + + router.get('/', (Request request) { + return Response.ok( + json.encode(Assets.destinations), + headers: {'Content-Type': 'application/json'}, + ); + }); + + router.get('//activity', (Request request, String id) { + final list = Assets.activities + .where((activity) => activity.destinationRef == id) + .toList(); + return Response.ok( + json.encode(list), + headers: {'Content-Type': 'application/json'}, + ); + }); + + return router; + } +} diff --git a/compass_app/server/lib/routes/login.dart b/compass_app/server/lib/routes/login.dart new file mode 100644 index 000000000..f5939fe77 --- /dev/null +++ b/compass_app/server/lib/routes/login.dart @@ -0,0 +1,50 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; + +import 'package:compass_server/config/constants.dart'; +import 'package:shelf/shelf.dart'; +import 'package:shelf_router/shelf_router.dart'; + +import '../model/login_request/login_request.dart'; +import '../model/login_response/login_response.dart'; + +/// Implements a simple login API. +/// +/// This is provided as an example for Flutter architectural purposes only +/// and shouldn't be used as example on how to implement authentication +/// in production. +/// +/// This API only accepts a fixed email and password for demonstration purposes, +/// then returns a hardcoded token and a user id. +/// +/// This token does not expire and is not secure. +class LoginApi { + Router get router { + final router = Router(); + + router.post('/', (Request request) async { + final body = await request.readAsString(); + final loginRequest = LoginRequest.fromJson(json.decode(body)); + + if (loginRequest.email == Constants.email && + loginRequest.password == Constants.password) { + return Response.ok( + json.encode( + LoginResponse( + token: Constants.token, + userId: Constants.userId, + ), + ), + headers: {'Content-Type': 'application/json'}, + ); + } + + return Response.unauthorized('Invalid credentials'); + }); + + return router; + } +} diff --git a/compass_app/server/lib/routes/user.dart b/compass_app/server/lib/routes/user.dart new file mode 100644 index 000000000..534d8f8ff --- /dev/null +++ b/compass_app/server/lib/routes/user.dart @@ -0,0 +1,27 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; + +import 'package:compass_server/config/constants.dart'; +import 'package:shelf/shelf.dart'; +import 'package:shelf_router/shelf_router.dart'; + +/// Implements a simple user API. +/// +/// This API only returns a hardcoded user for demonstration purposes. +class UserApi { + Router get router { + final router = Router(); + + router.get('/', (Request request) async { + return Response.ok( + json.encode(Constants.user), + headers: {'Content-Type': 'application/json'}, + ); + }); + + return router; + } +} diff --git a/compass_app/server/pubspec.yaml b/compass_app/server/pubspec.yaml new file mode 100644 index 000000000..44bbfec46 --- /dev/null +++ b/compass_app/server/pubspec.yaml @@ -0,0 +1,23 @@ +name: compass_server +description: A server app using the shelf package and Docker. +publish_to: 'none' +version: 1.0.0 + +environment: + sdk: ^3.4.3 + +dependencies: + args: ^2.4.0 + shelf: ^1.4.0 + shelf_router: ^1.1.0 + freezed_annotation: ^2.4.4 + json_annotation: ^4.9.0 + collection: ^1.19.0 + +dev_dependencies: + http: ^1.1.0 + lints: ^3.0.0 + test: ^1.24.0 + build_runner: ^2.4.11 + freezed: ^2.5.7 + json_serializable: ^6.8.0 diff --git a/compass_app/server/test/server_test.dart b/compass_app/server/test/server_test.dart new file mode 100644 index 000000000..20140d9f1 --- /dev/null +++ b/compass_app/server/test/server_test.dart @@ -0,0 +1,230 @@ +// Copyright 2024 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; +import 'dart:io'; + +import 'package:compass_server/config/constants.dart'; +import 'package:compass_server/model/activity/activity.dart'; +import 'package:compass_server/model/booking/booking.dart'; +import 'package:compass_server/model/continent/continent.dart'; +import 'package:compass_server/model/destination/destination.dart'; +import 'package:compass_server/model/login_request/login_request.dart'; +import 'package:compass_server/model/login_response/login_response.dart'; +import 'package:compass_server/model/user/user.dart'; +import 'package:http/http.dart'; +import 'package:test/test.dart'; + +void main() { + final port = '8080'; + final host = 'http://127.0.0.1:$port'; + late Process p; + + var headers = { + 'Authorization': 'Bearer ${Constants.token}', + }; + + setUp(() async { + p = await Process.start( + 'dart', + ['run', 'bin/compass_server.dart'], + environment: {'PORT': port}, + ); + // Wait for server to start and print to stdout. + await p.stdout.first; + }); + + tearDown(() => p.kill()); + + test('Get Continent end-point', () async { + // Query /continent end-point + final response = await get( + Uri.parse('$host/continent'), + headers: headers, + ); + + expect(response.statusCode, 200); + // Parse json response list + final list = jsonDecode(response.body) as List; + // Parse items + final continents = list.map((element) => Continent.fromJson(element)); + expect(continents.length, 7); + expect(continents.first.name, 'Europe'); + }); + + test('Get Destination end-point', () async { + // Query /destination end-point + final response = await get( + Uri.parse('$host/destination'), + headers: headers, + ); + expect(response.statusCode, 200); + // Parse json response list + final list = jsonDecode(response.body) as List; + // Parse items + final destination = list.map((element) => Destination.fromJson(element)); + expect(destination.length, 137); + expect(destination.first.name, 'Alaska'); + }); + + test('Get Activities end-point', () async { + // Query /destination/alaska/activity end-point + final response = await get( + Uri.parse('$host/destination/alaska/activity'), + headers: headers, + ); + expect(response.statusCode, 200); + // Parse json response list + final list = jsonDecode(response.body) as List; + // Parse items + final activity = list.map((element) => Activity.fromJson(element)); + expect(activity.length, 20); + expect(activity.first.name, 'Glacier Trekking and Ice Climbing'); + }); + + test('Get bookings end-point', () async { + final response = await get( + Uri.parse('$host/booking'), + headers: headers, + ); + expect(response.statusCode, 200); + // Parse json response list + final list = jsonDecode(response.body) as List; + // Parse items + final bookings = list.map((element) => Booking.fromJson(element)); + expect(bookings.length, 1); + expect(bookings.first.id, 0); + }); + + test('Get booking with id 0', () async { + final response = await get( + Uri.parse('$host/booking/0'), + headers: headers, + ); + + expect(response.statusCode, 200); + final booking = Booking.fromJson(jsonDecode(response.body)); + + // Got booking with id 0 + expect(booking.id, 0); + }); + + test('Store a booking', () async { + final response = await post( + Uri.parse('$host/booking'), + headers: headers, + body: jsonEncode( + Booking( + name: "DESTINATION, CONTINENT", + startDate: DateTime(2024, 1, 1), + endDate: DateTime(2024, 2, 2), + destinationRef: 'REF', + activitiesRef: ['ACT1', 'ACT2'], + ), + ), + ); + + expect(response.statusCode, 201); + final booking = Booking.fromJson(jsonDecode(response.body)); + + // New ID should be 1 + expect(booking.id, 1); + }); + + test('Delete a booking', () async { + // First create a booking + final response = await post( + Uri.parse('$host/booking'), + headers: headers, + body: jsonEncode( + Booking( + name: "DESTINATION, CONTINENT", + startDate: DateTime(2024, 1, 1), + endDate: DateTime(2024, 2, 2), + destinationRef: 'REF', + activitiesRef: ['ACT1', 'ACT2'], + ), + ), + ); + expect(response.statusCode, 201); + final booking = Booking.fromJson(jsonDecode(response.body)); + + // Then delete it + final deleteResponse = await delete( + Uri.parse('$host/booking/${booking.id}'), + headers: headers, + ); + + expect(deleteResponse.statusCode, 204); + }); + + test('Delete a booking is not found', () async { + final response = await delete( + Uri.parse('$host/booking/42'), + headers: headers, + ); + + expect(response.statusCode, 404); + }); + + test('Get user', () async { + final response = await get( + Uri.parse('$host/user'), + headers: headers, + ); + + expect(response.statusCode, 200); + final user = User.fromJson(jsonDecode(response.body)); + + // Should get the hardcoded user + expect(user, Constants.user); + }); + + test('404', () async { + final response = await get( + Uri.parse('$host/foobar'), + headers: headers, + ); + expect(response.statusCode, 404); + }); + + test('Login with valid credentials', () async { + final response = await post( + Uri.parse('$host/login'), + body: jsonEncode( + LoginRequest( + email: Constants.email, + password: Constants.password, + ), + ), + ); + expect(response.statusCode, 200); + final loginResponse = LoginResponse.fromJson(jsonDecode(response.body)); + expect(loginResponse.token, Constants.token); + expect(loginResponse.userId, Constants.userId); + }); + + test('Login with wrong credentials', () async { + final response = await post( + Uri.parse('$host/login'), + body: jsonEncode( + LoginRequest( + email: 'INVALID', + password: 'INVALID', + ), + ), + ); + expect(response.statusCode, 401); + }); + + test('Unauthorized request', () async { + // Query /continent end-point + // No auth headers + final response = await get( + Uri.parse('$host/continent'), + ); + + expect(response.statusCode, 401); + }); +} diff --git a/tool/flutter_ci_script_beta.sh b/tool/flutter_ci_script_beta.sh index 2d15ba518..c4ec8959e 100755 --- a/tool/flutter_ci_script_beta.sh +++ b/tool/flutter_ci_script_beta.sh @@ -23,6 +23,9 @@ declare -ar PROJECT_NAMES=( "code_sharing/client" "code_sharing/server" "code_sharing/shared" +# @ewindmill: withOpacity is deprecated +# "compass_app/app" +# "compass_app/server" "context_menus" "deeplink_store_example" "desktop_photo_search/fluent_ui" diff --git a/tool/flutter_ci_script_master.sh b/tool/flutter_ci_script_master.sh index d00d720e1..bdf61f62e 100755 --- a/tool/flutter_ci_script_master.sh +++ b/tool/flutter_ci_script_master.sh @@ -23,6 +23,9 @@ declare -ar PROJECT_NAMES=( "code_sharing/client" "code_sharing/server" "code_sharing/shared" +# @ewindmill: withOpacity is deprecated +# "compass_app/app" +# "compass_app/server" "context_menus" "deeplink_store_example" "desktop_photo_search/fluent_ui" diff --git a/tool/flutter_ci_script_stable.sh b/tool/flutter_ci_script_stable.sh index 8eb245196..b1171a4d4 100755 --- a/tool/flutter_ci_script_stable.sh +++ b/tool/flutter_ci_script_stable.sh @@ -23,6 +23,8 @@ declare -ar PROJECT_NAMES=( "code_sharing/client" "code_sharing/server" "code_sharing/shared" + "compass_app/app" + "compass_app/server" "context_menus" "deeplink_store_example" "desktop_photo_search/fluent_ui"

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