@planetaexo/design-system 0.52.0 → 0.52.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +442 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +60 -1
- package/dist/index.d.ts +60 -1
- package/dist/index.js +442 -3
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.d.cts
CHANGED
|
@@ -3480,4 +3480,63 @@ declare function LeadCapturePopup({ config: _config, }: {
|
|
|
3480
3480
|
config: LeadCapturePopupConfig;
|
|
3481
3481
|
}): react_jsx_runtime.JSX.Element | null;
|
|
3482
3482
|
|
|
3483
|
-
|
|
3483
|
+
interface ExoOrbProps {
|
|
3484
|
+
/** Side length in pixels. The orb is always square. @default 80 */
|
|
3485
|
+
size?: number;
|
|
3486
|
+
/** Path to the white-on-transparent EXO icon shown on top of the orb. */
|
|
3487
|
+
logoSrc?: string;
|
|
3488
|
+
/** Toggle the gentle breathing pulse. @default true */
|
|
3489
|
+
pulse?: boolean;
|
|
3490
|
+
/**
|
|
3491
|
+
* Toggle the cursor-tracking eyes effect (icon translates slightly
|
|
3492
|
+
* toward the pointer). Always disabled when the user prefers
|
|
3493
|
+
* reduced motion. @default true
|
|
3494
|
+
*/
|
|
3495
|
+
trackCursor?: boolean;
|
|
3496
|
+
/** Extra className applied to the wrapper. */
|
|
3497
|
+
className?: string;
|
|
3498
|
+
}
|
|
3499
|
+
declare function ExoOrb({ size, logoSrc, pulse, trackCursor, className, }: ExoOrbProps): react_jsx_runtime.JSX.Element;
|
|
3500
|
+
|
|
3501
|
+
interface AskExoSuggestion {
|
|
3502
|
+
/** Short label shown on the pill chip. */
|
|
3503
|
+
label: string;
|
|
3504
|
+
/** Full question text sent to the concierge when clicked. */
|
|
3505
|
+
ask: string;
|
|
3506
|
+
}
|
|
3507
|
+
interface AskExoProps {
|
|
3508
|
+
/** Concierge base URL. Submitting opens `?q=…&source=…` in a new tab. */
|
|
3509
|
+
baseUrl?: string;
|
|
3510
|
+
/** Layout variant. Defaults to "suggestions". */
|
|
3511
|
+
variant?: "suggestions" | "compose";
|
|
3512
|
+
/** Eyebrow above the title. Defaults to "PLANETAEXO". */
|
|
3513
|
+
eyebrow?: string;
|
|
3514
|
+
/** Panel title. Defaults to "Ask EXO". */
|
|
3515
|
+
title?: string;
|
|
3516
|
+
/** Subtitle line under the title. Pass an empty string to hide it. */
|
|
3517
|
+
subtitle?: string;
|
|
3518
|
+
/** Pill suggestions (only rendered when variant === "suggestions"). */
|
|
3519
|
+
suggestions?: AskExoSuggestion[];
|
|
3520
|
+
/** Composer placeholder. */
|
|
3521
|
+
inputPlaceholder?: string;
|
|
3522
|
+
/** Submit button label. */
|
|
3523
|
+
submitLabel?: string;
|
|
3524
|
+
/** Path to the white-on-transparent EXO icon shown on top of the orb. */
|
|
3525
|
+
logoSrc?: string;
|
|
3526
|
+
/** Extra className applied to the panel. */
|
|
3527
|
+
className?: string;
|
|
3528
|
+
/**
|
|
3529
|
+
* Speech-bubble nudge that appears next to the orb after `teaserDelayMs`,
|
|
3530
|
+
* stays visible for `teaserDurationMs`, then quietly fades out. Clicking
|
|
3531
|
+
* the bubble opens the panel. Pass `false` or an empty string to disable.
|
|
3532
|
+
* @default "Need help?"
|
|
3533
|
+
*/
|
|
3534
|
+
teaser?: string | false;
|
|
3535
|
+
/** Delay before the teaser appears, in milliseconds. @default 2500 */
|
|
3536
|
+
teaserDelayMs?: number;
|
|
3537
|
+
/** How long the teaser stays visible before fading out. @default 6000 */
|
|
3538
|
+
teaserDurationMs?: number;
|
|
3539
|
+
}
|
|
3540
|
+
declare function AskExo({ baseUrl, variant, eyebrow, title, subtitle, suggestions, inputPlaceholder, submitLabel, logoSrc, className, teaser, teaserDelayMs, teaserDurationMs, }: AskExoProps): react_jsx_runtime.JSX.Element;
|
|
3541
|
+
|
|
3542
|
+
export { ActivityCard, type ActivityCardProps, type ActivityCardSize, AgentContactCard, type AgentContactCardProps, Alert, type AlertProps, type AlertVariant, AskExo, type AskExoProps, type AskExoSuggestion, BirthDateField, type BirthDateFieldProps, type BookingAdventure, BookingAdventureCard, type BookingAdventureCardLabels, type BookingAdventureCardLineItem, type BookingAdventureCardProps, type BookingAdventureCardSlots, type BookingAdventureCardTraveller, type BookingCancellationAdventure, type BookingCancellationAgentContactLinks, BookingCancellationEmail, type BookingCancellationEmailLabels, type BookingCancellationEmailProps, BookingConfirmedCard, type BookingConfirmedCardProps, type BookingContact, BookingCreatedEmail, type BookingCreatedEmailLabels, type BookingCreatedEmailProps, type BookingDepositInfo, BookingDetails, type BookingDetailsLabels, type BookingDetailsProps, BookingForm, type BookingFormProps, type BookingFormValues, BookingOtpEmail, type BookingOtpEmailProps, BookingPaymentConfirmationEmail, type BookingPaymentConfirmationEmailLabels, type BookingPaymentConfirmationEmailProps, BookingShell, type BookingShellProps, type BookingStatus, BookingSummary, type BookingSummaryLineItem, type BookingSummaryProps, type BookingSummaryRow, type BookingTraveller, Button, type ButtonProps, COUNTRIES, type ConfirmationAdventure, type ConfirmationDepositInfo, type ConfirmationLineItem, type ConfirmationTraveller, CounterField, type CounterFieldProps, type CountryOption, CountrySearchField, type CountrySearchFieldProps, type CurrencyEstimate, DEFAULT_HEADER_LINKS, DEFAULT_LANGUAGES, DatePickerField, type DatePickerFieldProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, type EmailTokens, ExoOrb, type ExoOrbProps, type FilterGroup, type FilterItem, FilterPanel, type FilterPanelProps, FloatingInput, type FloatingInputProps, FloatingSelect, type FloatingSelectProps, Itinerary, ItineraryDay, type ItineraryDayPhoto, type ItineraryDayPhotoLayout, type ItineraryDayProps, type ItineraryDaySpec, type ItineraryProps, type ItineraryRoute, type ItineraryStop, LOGO_PLANETAEXO_DATA_URI, LeadCapturePopup, type LeadCapturePopupConfig, MenuTrip, type MenuTripProps, type MenuTripSection, type MenuTripVariant, OTPCodeInput, type OTPCodeInputProps, Offer, OfferAdventureCard, type OfferAdventureItem, type OfferAgentInfo, type OfferConfirmedState, type OfferDepositInfo, type OfferLabels, type OfferOptionalItem, type OfferProps, type OfferSummaryLineItem, type PartnerBookingCreatedAgentContactLinks, PartnerBookingCreatedEmail, type PartnerBookingCreatedEmailLabels, type PartnerBookingCreatedEmailProps, type PartnerRegistrationCompleteAgentContactLinks, PartnerRegistrationCompleteEmail, type PartnerRegistrationCompleteEmailExpectationRow, type PartnerRegistrationCompleteEmailLabels, type PartnerRegistrationCompleteEmailProps, PaymentAmountSelector, type PaymentAmountSelectorProps, PaymentDetailsBlock, type PaymentDetailsBlockFooterBanner, type PaymentDetailsBlockLabels, type PaymentDetailsBlockProps, type PaymentDetailsBlockRow, type PaymentMethodOption, PaymentMethodSelector, type PaymentMethodSelectorProps, PaymentModalShell, type PaymentModalShellProps, type PaymentReceiptAdventure, type PaymentReceiptAdventureLineItem, PaymentReceiptEmail, type PaymentReceiptEmailLabels, type PaymentReceiptEmailProps, type PaymentReminderAgentContactLinks, PaymentReminderEmail, type PaymentReminderEmailAdventure, type PaymentReminderEmailLabels, type PaymentReminderEmailLineItem, type PaymentReminderEmailProps, type PaymentReminderEmailVariantLabels, type PaymentReminderVariant, PhoneCountrySelect, PhotoGallery, type PhotoGalleryPhoto, type PhotoGalleryProps, type PhotoGalleryVariant, PricingTrip, type PricingTripProps, type PricingTripVariant, type RegistrationAdventure, type RegistrationBooking, type RegistrationEmergencyContactValue, type RegistrationField, type RegistrationFieldOption, type RegistrationFieldType, type RegistrationFieldValue, RegistrationForm, type RegistrationFormLabels, type RegistrationFormProps, type RegistrationFormValues, type RegistrationNameValue, type RegistrationPhoneValue, RegistrationProgressBar, type RegistrationProgressBarProps, type RegistrationProgressTone, type RegistrationReminderAdventureBlock, type RegistrationReminderAgentContactLinks, RegistrationReminderEmail, type RegistrationReminderEmailLabels, type RegistrationReminderEmailProps, type RegistrationReminderEmailVariantLabels, type RegistrationReminderIndividualAgentContactLinks, RegistrationReminderIndividualEmail, type RegistrationReminderIndividualEmailLabels, type RegistrationReminderIndividualEmailProps, type RegistrationReminderIndividualRoute, type RegistrationReminderIndividualSlug, type RegistrationReminderIndividualVariantLabels, type RegistrationReminderSlug, RegistrationSuccessCard, type RegistrationSuccessCardProps, type RegistrationTerms, type RegistrationTraveller, SiteHeader, type SiteHeaderLanguage, type SiteHeaderLink, type SiteHeaderProps, type SiteHeaderSubItem, type SiteHeaderVariant, type StripeAppearance, type SuggestedTraveller, TERMS_ACCEPT_KEY, TermsSection, type TermsSectionProps, ThemeToggle, Toast, type ToastProps, type ToastVariant, TransferDetailsBlock, type TransferDetailsBlockProps, type TravellerFormConfig, type TravellerFormData, TravellerFormInviteEmail, type TravellerFormInviteEmailLabels, type TravellerFormInviteEmailProps, type TravellerFormInviteLink, type TravellerFormLabels, TripCard, type TripCardCta, type TripCardProps, type TripCardSize, type TripCardStatus, type TripDuration, type TripFaq, TripHeader, type TripHeaderProps, type TripHighlight, type TripInfoGroup, type TripItineraryDay, type TripItineraryStep, type TripMeetingPoint, type TripOverviewHighlight, TripPage, type TripPageLabels, type TripPageProps, type TripReview, type TripSectionIcons, type TripSiteHeaderConfig, type TripTrustpilotWidget, TrustpilotEmbed, type TrustpilotWidgetConfig, buttonVariants, cn, emailTokens, formatCpf, getStripeAppearance, itineraryDaySpecIcons, stripeAppearance, validateCpf, wrapEmailHtml };
|
package/dist/index.d.ts
CHANGED
|
@@ -3480,4 +3480,63 @@ declare function LeadCapturePopup({ config: _config, }: {
|
|
|
3480
3480
|
config: LeadCapturePopupConfig;
|
|
3481
3481
|
}): react_jsx_runtime.JSX.Element | null;
|
|
3482
3482
|
|
|
3483
|
-
|
|
3483
|
+
interface ExoOrbProps {
|
|
3484
|
+
/** Side length in pixels. The orb is always square. @default 80 */
|
|
3485
|
+
size?: number;
|
|
3486
|
+
/** Path to the white-on-transparent EXO icon shown on top of the orb. */
|
|
3487
|
+
logoSrc?: string;
|
|
3488
|
+
/** Toggle the gentle breathing pulse. @default true */
|
|
3489
|
+
pulse?: boolean;
|
|
3490
|
+
/**
|
|
3491
|
+
* Toggle the cursor-tracking eyes effect (icon translates slightly
|
|
3492
|
+
* toward the pointer). Always disabled when the user prefers
|
|
3493
|
+
* reduced motion. @default true
|
|
3494
|
+
*/
|
|
3495
|
+
trackCursor?: boolean;
|
|
3496
|
+
/** Extra className applied to the wrapper. */
|
|
3497
|
+
className?: string;
|
|
3498
|
+
}
|
|
3499
|
+
declare function ExoOrb({ size, logoSrc, pulse, trackCursor, className, }: ExoOrbProps): react_jsx_runtime.JSX.Element;
|
|
3500
|
+
|
|
3501
|
+
interface AskExoSuggestion {
|
|
3502
|
+
/** Short label shown on the pill chip. */
|
|
3503
|
+
label: string;
|
|
3504
|
+
/** Full question text sent to the concierge when clicked. */
|
|
3505
|
+
ask: string;
|
|
3506
|
+
}
|
|
3507
|
+
interface AskExoProps {
|
|
3508
|
+
/** Concierge base URL. Submitting opens `?q=…&source=…` in a new tab. */
|
|
3509
|
+
baseUrl?: string;
|
|
3510
|
+
/** Layout variant. Defaults to "suggestions". */
|
|
3511
|
+
variant?: "suggestions" | "compose";
|
|
3512
|
+
/** Eyebrow above the title. Defaults to "PLANETAEXO". */
|
|
3513
|
+
eyebrow?: string;
|
|
3514
|
+
/** Panel title. Defaults to "Ask EXO". */
|
|
3515
|
+
title?: string;
|
|
3516
|
+
/** Subtitle line under the title. Pass an empty string to hide it. */
|
|
3517
|
+
subtitle?: string;
|
|
3518
|
+
/** Pill suggestions (only rendered when variant === "suggestions"). */
|
|
3519
|
+
suggestions?: AskExoSuggestion[];
|
|
3520
|
+
/** Composer placeholder. */
|
|
3521
|
+
inputPlaceholder?: string;
|
|
3522
|
+
/** Submit button label. */
|
|
3523
|
+
submitLabel?: string;
|
|
3524
|
+
/** Path to the white-on-transparent EXO icon shown on top of the orb. */
|
|
3525
|
+
logoSrc?: string;
|
|
3526
|
+
/** Extra className applied to the panel. */
|
|
3527
|
+
className?: string;
|
|
3528
|
+
/**
|
|
3529
|
+
* Speech-bubble nudge that appears next to the orb after `teaserDelayMs`,
|
|
3530
|
+
* stays visible for `teaserDurationMs`, then quietly fades out. Clicking
|
|
3531
|
+
* the bubble opens the panel. Pass `false` or an empty string to disable.
|
|
3532
|
+
* @default "Need help?"
|
|
3533
|
+
*/
|
|
3534
|
+
teaser?: string | false;
|
|
3535
|
+
/** Delay before the teaser appears, in milliseconds. @default 2500 */
|
|
3536
|
+
teaserDelayMs?: number;
|
|
3537
|
+
/** How long the teaser stays visible before fading out. @default 6000 */
|
|
3538
|
+
teaserDurationMs?: number;
|
|
3539
|
+
}
|
|
3540
|
+
declare function AskExo({ baseUrl, variant, eyebrow, title, subtitle, suggestions, inputPlaceholder, submitLabel, logoSrc, className, teaser, teaserDelayMs, teaserDurationMs, }: AskExoProps): react_jsx_runtime.JSX.Element;
|
|
3541
|
+
|
|
3542
|
+
export { ActivityCard, type ActivityCardProps, type ActivityCardSize, AgentContactCard, type AgentContactCardProps, Alert, type AlertProps, type AlertVariant, AskExo, type AskExoProps, type AskExoSuggestion, BirthDateField, type BirthDateFieldProps, type BookingAdventure, BookingAdventureCard, type BookingAdventureCardLabels, type BookingAdventureCardLineItem, type BookingAdventureCardProps, type BookingAdventureCardSlots, type BookingAdventureCardTraveller, type BookingCancellationAdventure, type BookingCancellationAgentContactLinks, BookingCancellationEmail, type BookingCancellationEmailLabels, type BookingCancellationEmailProps, BookingConfirmedCard, type BookingConfirmedCardProps, type BookingContact, BookingCreatedEmail, type BookingCreatedEmailLabels, type BookingCreatedEmailProps, type BookingDepositInfo, BookingDetails, type BookingDetailsLabels, type BookingDetailsProps, BookingForm, type BookingFormProps, type BookingFormValues, BookingOtpEmail, type BookingOtpEmailProps, BookingPaymentConfirmationEmail, type BookingPaymentConfirmationEmailLabels, type BookingPaymentConfirmationEmailProps, BookingShell, type BookingShellProps, type BookingStatus, BookingSummary, type BookingSummaryLineItem, type BookingSummaryProps, type BookingSummaryRow, type BookingTraveller, Button, type ButtonProps, COUNTRIES, type ConfirmationAdventure, type ConfirmationDepositInfo, type ConfirmationLineItem, type ConfirmationTraveller, CounterField, type CounterFieldProps, type CountryOption, CountrySearchField, type CountrySearchFieldProps, type CurrencyEstimate, DEFAULT_HEADER_LINKS, DEFAULT_LANGUAGES, DatePickerField, type DatePickerFieldProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, type EmailTokens, ExoOrb, type ExoOrbProps, type FilterGroup, type FilterItem, FilterPanel, type FilterPanelProps, FloatingInput, type FloatingInputProps, FloatingSelect, type FloatingSelectProps, Itinerary, ItineraryDay, type ItineraryDayPhoto, type ItineraryDayPhotoLayout, type ItineraryDayProps, type ItineraryDaySpec, type ItineraryProps, type ItineraryRoute, type ItineraryStop, LOGO_PLANETAEXO_DATA_URI, LeadCapturePopup, type LeadCapturePopupConfig, MenuTrip, type MenuTripProps, type MenuTripSection, type MenuTripVariant, OTPCodeInput, type OTPCodeInputProps, Offer, OfferAdventureCard, type OfferAdventureItem, type OfferAgentInfo, type OfferConfirmedState, type OfferDepositInfo, type OfferLabels, type OfferOptionalItem, type OfferProps, type OfferSummaryLineItem, type PartnerBookingCreatedAgentContactLinks, PartnerBookingCreatedEmail, type PartnerBookingCreatedEmailLabels, type PartnerBookingCreatedEmailProps, type PartnerRegistrationCompleteAgentContactLinks, PartnerRegistrationCompleteEmail, type PartnerRegistrationCompleteEmailExpectationRow, type PartnerRegistrationCompleteEmailLabels, type PartnerRegistrationCompleteEmailProps, PaymentAmountSelector, type PaymentAmountSelectorProps, PaymentDetailsBlock, type PaymentDetailsBlockFooterBanner, type PaymentDetailsBlockLabels, type PaymentDetailsBlockProps, type PaymentDetailsBlockRow, type PaymentMethodOption, PaymentMethodSelector, type PaymentMethodSelectorProps, PaymentModalShell, type PaymentModalShellProps, type PaymentReceiptAdventure, type PaymentReceiptAdventureLineItem, PaymentReceiptEmail, type PaymentReceiptEmailLabels, type PaymentReceiptEmailProps, type PaymentReminderAgentContactLinks, PaymentReminderEmail, type PaymentReminderEmailAdventure, type PaymentReminderEmailLabels, type PaymentReminderEmailLineItem, type PaymentReminderEmailProps, type PaymentReminderEmailVariantLabels, type PaymentReminderVariant, PhoneCountrySelect, PhotoGallery, type PhotoGalleryPhoto, type PhotoGalleryProps, type PhotoGalleryVariant, PricingTrip, type PricingTripProps, type PricingTripVariant, type RegistrationAdventure, type RegistrationBooking, type RegistrationEmergencyContactValue, type RegistrationField, type RegistrationFieldOption, type RegistrationFieldType, type RegistrationFieldValue, RegistrationForm, type RegistrationFormLabels, type RegistrationFormProps, type RegistrationFormValues, type RegistrationNameValue, type RegistrationPhoneValue, RegistrationProgressBar, type RegistrationProgressBarProps, type RegistrationProgressTone, type RegistrationReminderAdventureBlock, type RegistrationReminderAgentContactLinks, RegistrationReminderEmail, type RegistrationReminderEmailLabels, type RegistrationReminderEmailProps, type RegistrationReminderEmailVariantLabels, type RegistrationReminderIndividualAgentContactLinks, RegistrationReminderIndividualEmail, type RegistrationReminderIndividualEmailLabels, type RegistrationReminderIndividualEmailProps, type RegistrationReminderIndividualRoute, type RegistrationReminderIndividualSlug, type RegistrationReminderIndividualVariantLabels, type RegistrationReminderSlug, RegistrationSuccessCard, type RegistrationSuccessCardProps, type RegistrationTerms, type RegistrationTraveller, SiteHeader, type SiteHeaderLanguage, type SiteHeaderLink, type SiteHeaderProps, type SiteHeaderSubItem, type SiteHeaderVariant, type StripeAppearance, type SuggestedTraveller, TERMS_ACCEPT_KEY, TermsSection, type TermsSectionProps, ThemeToggle, Toast, type ToastProps, type ToastVariant, TransferDetailsBlock, type TransferDetailsBlockProps, type TravellerFormConfig, type TravellerFormData, TravellerFormInviteEmail, type TravellerFormInviteEmailLabels, type TravellerFormInviteEmailProps, type TravellerFormInviteLink, type TravellerFormLabels, TripCard, type TripCardCta, type TripCardProps, type TripCardSize, type TripCardStatus, type TripDuration, type TripFaq, TripHeader, type TripHeaderProps, type TripHighlight, type TripInfoGroup, type TripItineraryDay, type TripItineraryStep, type TripMeetingPoint, type TripOverviewHighlight, TripPage, type TripPageLabels, type TripPageProps, type TripReview, type TripSectionIcons, type TripSiteHeaderConfig, type TripTrustpilotWidget, TrustpilotEmbed, type TrustpilotWidgetConfig, buttonVariants, cn, emailTokens, formatCpf, getStripeAppearance, itineraryDaySpecIcons, stripeAppearance, validateCpf, wrapEmailHtml };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React28 from 'react';
|
|
2
|
-
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
2
|
+
import { useState, useRef, useCallback, useEffect, useId } from 'react';
|
|
3
3
|
import { cva } from 'class-variance-authority';
|
|
4
4
|
import { clsx } from 'clsx';
|
|
5
5
|
import { twMerge } from 'tailwind-merge';
|
|
@@ -13270,7 +13270,7 @@ function TripPage({
|
|
|
13270
13270
|
(sectionIcons == null ? void 0 : sectionIcons.weather) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.weather }) : /* @__PURE__ */ jsx(SunIcon, { className: "h-5 w-5 text-primary" }),
|
|
13271
13271
|
(_k = labels == null ? void 0 : labels.weather) != null ? _k : "Weather"
|
|
13272
13272
|
] }) }),
|
|
13273
|
-
/* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsx("div", { className: "
|
|
13273
|
+
/* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: weather }) })
|
|
13274
13274
|
]
|
|
13275
13275
|
}
|
|
13276
13276
|
),
|
|
@@ -14277,7 +14277,446 @@ function LeadCapturePopup({
|
|
|
14277
14277
|
}
|
|
14278
14278
|
);
|
|
14279
14279
|
}
|
|
14280
|
+
function ExoOrb({
|
|
14281
|
+
size = 80,
|
|
14282
|
+
logoSrc = "/white_transparent_exo.png",
|
|
14283
|
+
pulse = true,
|
|
14284
|
+
trackCursor = true,
|
|
14285
|
+
className
|
|
14286
|
+
}) {
|
|
14287
|
+
const uid = useId().replace(/:/g, "");
|
|
14288
|
+
const id = (name) => `exo-orb-${uid}-${name}`;
|
|
14289
|
+
const rootRef = useRef(null);
|
|
14290
|
+
const pupilRef = useRef(null);
|
|
14291
|
+
useEffect(() => {
|
|
14292
|
+
if (!trackCursor) return;
|
|
14293
|
+
if (typeof window === "undefined") return;
|
|
14294
|
+
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
|
|
14295
|
+
const root = rootRef.current;
|
|
14296
|
+
const pupil = pupilRef.current;
|
|
14297
|
+
if (!root || !pupil) return;
|
|
14298
|
+
const MAX_OFFSET = 3.5;
|
|
14299
|
+
const REACH_PX = 260;
|
|
14300
|
+
const EASE = 0.18;
|
|
14301
|
+
let targetX = 0, targetY = 0, curX = 0, curY = 0;
|
|
14302
|
+
let raf = 0;
|
|
14303
|
+
const onMove = (e) => {
|
|
14304
|
+
const r = root.getBoundingClientRect();
|
|
14305
|
+
const cx = r.left + r.width / 2;
|
|
14306
|
+
const cy = r.top + r.height / 2;
|
|
14307
|
+
const dx = e.clientX - cx;
|
|
14308
|
+
const dy = e.clientY - cy;
|
|
14309
|
+
const dist = Math.hypot(dx, dy) || 1;
|
|
14310
|
+
const factor = Math.min(dist, REACH_PX) / REACH_PX;
|
|
14311
|
+
targetX = dx / dist * MAX_OFFSET * factor;
|
|
14312
|
+
targetY = dy / dist * MAX_OFFSET * factor;
|
|
14313
|
+
};
|
|
14314
|
+
const onLeave = () => {
|
|
14315
|
+
targetX = 0;
|
|
14316
|
+
targetY = 0;
|
|
14317
|
+
};
|
|
14318
|
+
const tick = () => {
|
|
14319
|
+
curX += (targetX - curX) * EASE;
|
|
14320
|
+
curY += (targetY - curY) * EASE;
|
|
14321
|
+
pupil.setAttribute(
|
|
14322
|
+
"transform",
|
|
14323
|
+
`translate(${curX.toFixed(2)} ${curY.toFixed(2)})`
|
|
14324
|
+
);
|
|
14325
|
+
raf = requestAnimationFrame(tick);
|
|
14326
|
+
};
|
|
14327
|
+
window.addEventListener("pointermove", onMove, { passive: true });
|
|
14328
|
+
window.addEventListener("pointerleave", onLeave);
|
|
14329
|
+
window.addEventListener("blur", onLeave);
|
|
14330
|
+
raf = requestAnimationFrame(tick);
|
|
14331
|
+
return () => {
|
|
14332
|
+
cancelAnimationFrame(raf);
|
|
14333
|
+
window.removeEventListener("pointermove", onMove);
|
|
14334
|
+
window.removeEventListener("pointerleave", onLeave);
|
|
14335
|
+
window.removeEventListener("blur", onLeave);
|
|
14336
|
+
};
|
|
14337
|
+
}, [trackCursor]);
|
|
14338
|
+
return /* @__PURE__ */ jsxs(
|
|
14339
|
+
"span",
|
|
14340
|
+
{
|
|
14341
|
+
ref: rootRef,
|
|
14342
|
+
"aria-hidden": "true",
|
|
14343
|
+
className: cn("inline-block leading-none", className),
|
|
14344
|
+
style: { width: size, height: size },
|
|
14345
|
+
children: [
|
|
14346
|
+
/* @__PURE__ */ jsxs(
|
|
14347
|
+
"svg",
|
|
14348
|
+
{
|
|
14349
|
+
width: size,
|
|
14350
|
+
height: size,
|
|
14351
|
+
viewBox: "0 0 100 100",
|
|
14352
|
+
fill: "none",
|
|
14353
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
14354
|
+
className: cn(
|
|
14355
|
+
"block overflow-visible",
|
|
14356
|
+
pulse && "motion-safe:animate-[exo-orb-pulse_3.6s_ease-in-out_infinite]"
|
|
14357
|
+
),
|
|
14358
|
+
children: [
|
|
14359
|
+
/* @__PURE__ */ jsxs("defs", { children: [
|
|
14360
|
+
/* @__PURE__ */ jsxs("radialGradient", { id: id("body"), cx: "35%", cy: "30%", r: "75%", children: [
|
|
14361
|
+
/* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: "#a8efe2" }),
|
|
14362
|
+
/* @__PURE__ */ jsx("stop", { offset: "35%", stopColor: "#5bd3bf" }),
|
|
14363
|
+
/* @__PURE__ */ jsx("stop", { offset: "70%", stopColor: "#47bca9" }),
|
|
14364
|
+
/* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: "#155b52" })
|
|
14365
|
+
] }),
|
|
14366
|
+
/* @__PURE__ */ jsxs("radialGradient", { id: id("highlight"), cx: "30%", cy: "22%", r: "35%", children: [
|
|
14367
|
+
/* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: "#ffffff", stopOpacity: "0.85" }),
|
|
14368
|
+
/* @__PURE__ */ jsx("stop", { offset: "60%", stopColor: "#ffffff", stopOpacity: "0.10" }),
|
|
14369
|
+
/* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: "#ffffff", stopOpacity: "0" })
|
|
14370
|
+
] }),
|
|
14371
|
+
/* @__PURE__ */ jsxs("radialGradient", { id: id("rim"), cx: "60%", cy: "85%", r: "65%", children: [
|
|
14372
|
+
/* @__PURE__ */ jsx("stop", { offset: "60%", stopColor: "#000000", stopOpacity: "0" }),
|
|
14373
|
+
/* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: "#000000", stopOpacity: "0.35" })
|
|
14374
|
+
] }),
|
|
14375
|
+
/* @__PURE__ */ jsxs(
|
|
14376
|
+
"filter",
|
|
14377
|
+
{
|
|
14378
|
+
id: id("glow"),
|
|
14379
|
+
x: "-60%",
|
|
14380
|
+
y: "-60%",
|
|
14381
|
+
width: "220%",
|
|
14382
|
+
height: "220%",
|
|
14383
|
+
children: [
|
|
14384
|
+
/* @__PURE__ */ jsx("feGaussianBlur", { in: "SourceGraphic", stdDeviation: "6", result: "blur" }),
|
|
14385
|
+
/* @__PURE__ */ jsx(
|
|
14386
|
+
"feColorMatrix",
|
|
14387
|
+
{
|
|
14388
|
+
in: "blur",
|
|
14389
|
+
type: "matrix",
|
|
14390
|
+
values: "0 0 0 0 0.28\n 0 0 0 0 0.74\n 0 0 0 0 0.66\n 0 0 0 1 0",
|
|
14391
|
+
result: "tinted"
|
|
14392
|
+
}
|
|
14393
|
+
),
|
|
14394
|
+
/* @__PURE__ */ jsx("feComponentTransfer", { in: "tinted", result: "strong", children: /* @__PURE__ */ jsx("feFuncA", { type: "linear", slope: 1.6 }) }),
|
|
14395
|
+
/* @__PURE__ */ jsxs("feMerge", { children: [
|
|
14396
|
+
/* @__PURE__ */ jsx("feMergeNode", { in: "strong" }),
|
|
14397
|
+
/* @__PURE__ */ jsx("feMergeNode", { in: "SourceGraphic" })
|
|
14398
|
+
] })
|
|
14399
|
+
]
|
|
14400
|
+
}
|
|
14401
|
+
),
|
|
14402
|
+
/* @__PURE__ */ jsx("clipPath", { id: id("clip"), children: /* @__PURE__ */ jsx("circle", { cx: "50", cy: "50", r: "22" }) })
|
|
14403
|
+
] }),
|
|
14404
|
+
/* @__PURE__ */ jsx(
|
|
14405
|
+
"circle",
|
|
14406
|
+
{
|
|
14407
|
+
cx: "50",
|
|
14408
|
+
cy: "50",
|
|
14409
|
+
r: "30",
|
|
14410
|
+
fill: "#47bca9",
|
|
14411
|
+
opacity: "0.18",
|
|
14412
|
+
filter: `url(#${id("glow")})`
|
|
14413
|
+
}
|
|
14414
|
+
),
|
|
14415
|
+
/* @__PURE__ */ jsxs("g", { filter: `url(#${id("glow")})`, children: [
|
|
14416
|
+
/* @__PURE__ */ jsx("circle", { cx: "50", cy: "50", r: "22", fill: `url(#${id("body")})` }),
|
|
14417
|
+
/* @__PURE__ */ jsx("circle", { cx: "50", cy: "50", r: "22", fill: `url(#${id("highlight")})` }),
|
|
14418
|
+
/* @__PURE__ */ jsx("circle", { cx: "50", cy: "50", r: "22", fill: `url(#${id("rim")})` })
|
|
14419
|
+
] }),
|
|
14420
|
+
/* @__PURE__ */ jsx(
|
|
14421
|
+
"path",
|
|
14422
|
+
{
|
|
14423
|
+
d: "M 34 38 Q 50 28 66 38",
|
|
14424
|
+
stroke: "#ffffff",
|
|
14425
|
+
strokeOpacity: "0.45",
|
|
14426
|
+
strokeWidth: "1.4",
|
|
14427
|
+
strokeLinecap: "round",
|
|
14428
|
+
fill: "none"
|
|
14429
|
+
}
|
|
14430
|
+
),
|
|
14431
|
+
/* @__PURE__ */ jsx("g", { clipPath: `url(#${id("clip")})`, children: /* @__PURE__ */ jsx("g", { ref: pupilRef, children: /* @__PURE__ */ jsx(
|
|
14432
|
+
"image",
|
|
14433
|
+
{
|
|
14434
|
+
href: logoSrc,
|
|
14435
|
+
x: "33.8",
|
|
14436
|
+
y: "33.8",
|
|
14437
|
+
width: "32.4",
|
|
14438
|
+
height: "32.4",
|
|
14439
|
+
preserveAspectRatio: "xMidYMid meet"
|
|
14440
|
+
}
|
|
14441
|
+
) }) })
|
|
14442
|
+
]
|
|
14443
|
+
}
|
|
14444
|
+
),
|
|
14445
|
+
/* @__PURE__ */ jsx("style", { children: `@keyframes exo-orb-pulse{0%,100%{transform:scale(1)}50%{transform:scale(1.04)}}` })
|
|
14446
|
+
]
|
|
14447
|
+
}
|
|
14448
|
+
);
|
|
14449
|
+
}
|
|
14450
|
+
function Textarea(_a) {
|
|
14451
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
14452
|
+
return /* @__PURE__ */ jsx(
|
|
14453
|
+
"textarea",
|
|
14454
|
+
__spreadValues({
|
|
14455
|
+
"data-slot": "textarea",
|
|
14456
|
+
className: cn(
|
|
14457
|
+
"flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
|
|
14458
|
+
className
|
|
14459
|
+
)
|
|
14460
|
+
}, props)
|
|
14461
|
+
);
|
|
14462
|
+
}
|
|
14463
|
+
var DEFAULT_BASE_URL = "https://staging.ask.planetaexo.com";
|
|
14464
|
+
var DEFAULT_SUGGESTIONS = [
|
|
14465
|
+
{ label: "Where do I start?", ask: "I am new to PlanetaEXO, what should I check out first?" },
|
|
14466
|
+
{ label: "Destinations", ask: "What destinations does PlanetaEXO offer?" },
|
|
14467
|
+
{ label: "5 days in the Amazon", ask: "Plan a 5-day trip to the Amazon for two travelers." },
|
|
14468
|
+
{ label: "Mount Roraima trek", ask: "What is included in the Mount Roraima trek?" },
|
|
14469
|
+
{ label: "Best time for Pantanal", ask: "Best time of year to visit the Pantanal?" },
|
|
14470
|
+
{ label: "Fitness level needed", ask: "How fit do I need to be for an EXO trek?" }
|
|
14471
|
+
];
|
|
14472
|
+
function AskExo({
|
|
14473
|
+
baseUrl = DEFAULT_BASE_URL,
|
|
14474
|
+
variant = "suggestions",
|
|
14475
|
+
eyebrow = "PLANETAEXO",
|
|
14476
|
+
title = "Ask EXO",
|
|
14477
|
+
subtitle = "Our AI travel concierge will answer in seconds.",
|
|
14478
|
+
suggestions = DEFAULT_SUGGESTIONS,
|
|
14479
|
+
inputPlaceholder,
|
|
14480
|
+
submitLabel = "Ask",
|
|
14481
|
+
logoSrc = "/white_transparent_exo.png",
|
|
14482
|
+
className,
|
|
14483
|
+
teaser = "Need help?",
|
|
14484
|
+
teaserDelayMs = 2500,
|
|
14485
|
+
teaserDurationMs = 6e3
|
|
14486
|
+
}) {
|
|
14487
|
+
const [open, setOpen] = useState(false);
|
|
14488
|
+
const [question, setQuestion] = useState("");
|
|
14489
|
+
const [teaserVisible, setTeaserVisible] = useState(false);
|
|
14490
|
+
const teaserEnabled = !!teaser && teaser !== "";
|
|
14491
|
+
const inputRef = useRef(null);
|
|
14492
|
+
const textareaRef = useRef(null);
|
|
14493
|
+
useEffect(() => {
|
|
14494
|
+
if (!open) {
|
|
14495
|
+
setQuestion("");
|
|
14496
|
+
return;
|
|
14497
|
+
}
|
|
14498
|
+
const t = setTimeout(() => {
|
|
14499
|
+
var _a, _b;
|
|
14500
|
+
if (variant === "compose") (_a = textareaRef.current) == null ? void 0 : _a.focus();
|
|
14501
|
+
else (_b = inputRef.current) == null ? void 0 : _b.focus();
|
|
14502
|
+
}, 200);
|
|
14503
|
+
return () => clearTimeout(t);
|
|
14504
|
+
}, [open, variant]);
|
|
14505
|
+
useEffect(() => {
|
|
14506
|
+
if (!open) return;
|
|
14507
|
+
const onKey = (e) => {
|
|
14508
|
+
if (e.key === "Escape") setOpen(false);
|
|
14509
|
+
};
|
|
14510
|
+
document.addEventListener("keydown", onKey);
|
|
14511
|
+
return () => document.removeEventListener("keydown", onKey);
|
|
14512
|
+
}, [open]);
|
|
14513
|
+
useEffect(() => {
|
|
14514
|
+
if (!teaserEnabled || open) return;
|
|
14515
|
+
if (typeof window === "undefined") return;
|
|
14516
|
+
const showTimer = setTimeout(() => setTeaserVisible(true), teaserDelayMs);
|
|
14517
|
+
const hideTimer = setTimeout(
|
|
14518
|
+
() => setTeaserVisible(false),
|
|
14519
|
+
teaserDelayMs + teaserDurationMs
|
|
14520
|
+
);
|
|
14521
|
+
return () => {
|
|
14522
|
+
clearTimeout(showTimer);
|
|
14523
|
+
clearTimeout(hideTimer);
|
|
14524
|
+
};
|
|
14525
|
+
}, [teaserEnabled, teaserDelayMs, teaserDurationMs, open]);
|
|
14526
|
+
useEffect(() => {
|
|
14527
|
+
if (open) setTeaserVisible(false);
|
|
14528
|
+
}, [open]);
|
|
14529
|
+
const askExo = (q) => {
|
|
14530
|
+
const trimmed = q.trim();
|
|
14531
|
+
if (!trimmed) return;
|
|
14532
|
+
const url = baseUrl.replace(/\/+$/, "") + "/?q=" + encodeURIComponent(trimmed) + "&source=" + encodeURIComponent(window.location.href);
|
|
14533
|
+
window.open(url, "_blank", "noopener,noreferrer");
|
|
14534
|
+
setOpen(false);
|
|
14535
|
+
};
|
|
14536
|
+
const placeholder = inputPlaceholder != null ? inputPlaceholder : variant === "compose" ? "Type your question\u2026" : "Ask your own question\u2026";
|
|
14537
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
14538
|
+
teaserEnabled && /* @__PURE__ */ jsx(
|
|
14539
|
+
"button",
|
|
14540
|
+
{
|
|
14541
|
+
type: "button",
|
|
14542
|
+
"aria-hidden": !teaserVisible,
|
|
14543
|
+
tabIndex: teaserVisible ? 0 : -1,
|
|
14544
|
+
onClick: () => setOpen(true),
|
|
14545
|
+
className: cn(
|
|
14546
|
+
// shape + tone
|
|
14547
|
+
"fixed right-24 bottom-13 z-40 cursor-pointer rounded-full border border-border bg-card px-3.5 py-1.5",
|
|
14548
|
+
"font-sans text-[12.5px] leading-none font-normal whitespace-nowrap text-muted-foreground",
|
|
14549
|
+
"shadow-[0_6px_18px_oklch(0.20_0.002_60_/_0.12)]",
|
|
14550
|
+
// entrance / exit animation
|
|
14551
|
+
"transition-[opacity,transform,color] duration-300 ease-out",
|
|
14552
|
+
teaserVisible ? "translate-x-0 scale-100 opacity-100" : "pointer-events-none translate-x-1 scale-95 opacity-0",
|
|
14553
|
+
// hover
|
|
14554
|
+
"hover:text-foreground",
|
|
14555
|
+
// a11y
|
|
14556
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50 focus-visible:ring-offset-2",
|
|
14557
|
+
"max-[480px]:hidden"
|
|
14558
|
+
),
|
|
14559
|
+
children: teaser
|
|
14560
|
+
}
|
|
14561
|
+
),
|
|
14562
|
+
/* @__PURE__ */ jsx(
|
|
14563
|
+
"button",
|
|
14564
|
+
{
|
|
14565
|
+
type: "button",
|
|
14566
|
+
"aria-label": open ? "Close Ask EXO" : "Open Ask EXO",
|
|
14567
|
+
"aria-expanded": open,
|
|
14568
|
+
"aria-controls": "ask-exo-panel",
|
|
14569
|
+
onClick: () => setOpen((v) => !v),
|
|
14570
|
+
className: cn(
|
|
14571
|
+
"fixed right-5 bottom-6 z-40 size-20 cursor-pointer border-0 bg-transparent p-0",
|
|
14572
|
+
"transition-transform duration-200 ease-out hover:-translate-y-px hover:scale-[1.04] active:translate-y-0 active:scale-[0.98]",
|
|
14573
|
+
"focus-visible:outline-none [-webkit-tap-highlight-color:transparent]"
|
|
14574
|
+
),
|
|
14575
|
+
children: /* @__PURE__ */ jsx(ExoOrb, { size: 80, logoSrc })
|
|
14576
|
+
}
|
|
14577
|
+
),
|
|
14578
|
+
/* @__PURE__ */ jsxs(
|
|
14579
|
+
"aside",
|
|
14580
|
+
{
|
|
14581
|
+
id: "ask-exo-panel",
|
|
14582
|
+
role: "dialog",
|
|
14583
|
+
"aria-labelledby": "ask-exo-title",
|
|
14584
|
+
"aria-hidden": !open,
|
|
14585
|
+
"data-open": open,
|
|
14586
|
+
className: cn(
|
|
14587
|
+
"fixed right-5 bottom-30 z-50 w-[400px] max-h-[min(640px,80vh)]",
|
|
14588
|
+
variant === "compose" && "max-h-[min(560px,82vh)]",
|
|
14589
|
+
"flex flex-col overflow-hidden rounded-2xl border border-border bg-card text-card-foreground",
|
|
14590
|
+
"shadow-[0_40px_100px_oklch(0.20_0.002_60_/_0.35)]",
|
|
14591
|
+
"transition-[opacity,transform] duration-200 ease-out",
|
|
14592
|
+
"data-[open=false]:pointer-events-none data-[open=false]:translate-y-4 data-[open=false]:scale-[0.985] data-[open=false]:opacity-0",
|
|
14593
|
+
"data-[open=true]:pointer-events-auto data-[open=true]:translate-y-0 data-[open=true]:scale-100 data-[open=true]:opacity-100",
|
|
14594
|
+
"max-[480px]:right-2 max-[480px]:bottom-28 max-[480px]:w-[calc(100%-1rem)] max-[480px]:rounded-xl",
|
|
14595
|
+
className
|
|
14596
|
+
),
|
|
14597
|
+
children: [
|
|
14598
|
+
/* @__PURE__ */ jsxs("header", { className: "relative border-b border-border bg-gradient-to-b from-primary-300/20 to-transparent px-5 py-4", children: [
|
|
14599
|
+
/* @__PURE__ */ jsx("p", { className: "m-0 mb-1 font-ui text-[10.5px] font-bold tracking-[1.4px] text-primary-800 uppercase", children: eyebrow }),
|
|
14600
|
+
/* @__PURE__ */ jsx(
|
|
14601
|
+
"h2",
|
|
14602
|
+
{
|
|
14603
|
+
id: "ask-exo-title",
|
|
14604
|
+
className: "m-0 font-heading text-[20px] font-bold tracking-[-0.3px] text-foreground",
|
|
14605
|
+
children: title
|
|
14606
|
+
}
|
|
14607
|
+
),
|
|
14608
|
+
subtitle && /* @__PURE__ */ jsx("p", { className: "mt-1.5 mb-0 font-sans text-[13.5px] leading-relaxed text-muted-foreground", children: subtitle }),
|
|
14609
|
+
/* @__PURE__ */ jsx(
|
|
14610
|
+
"button",
|
|
14611
|
+
{
|
|
14612
|
+
type: "button",
|
|
14613
|
+
"aria-label": "Close",
|
|
14614
|
+
onClick: () => setOpen(false),
|
|
14615
|
+
className: cn(
|
|
14616
|
+
"absolute top-3 right-3 inline-flex size-8 cursor-pointer items-center justify-center rounded-full border-0 bg-transparent text-muted-foreground transition-colors",
|
|
14617
|
+
"hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50"
|
|
14618
|
+
),
|
|
14619
|
+
children: /* @__PURE__ */ jsx(XIcon, { className: "size-4" })
|
|
14620
|
+
}
|
|
14621
|
+
)
|
|
14622
|
+
] }),
|
|
14623
|
+
variant === "compose" ? (
|
|
14624
|
+
/* — Compose variant: just a big textarea — */
|
|
14625
|
+
/* @__PURE__ */ jsxs(
|
|
14626
|
+
"form",
|
|
14627
|
+
{
|
|
14628
|
+
className: "flex flex-1 flex-col gap-2.5 overflow-y-auto p-5",
|
|
14629
|
+
onSubmit: (e) => {
|
|
14630
|
+
e.preventDefault();
|
|
14631
|
+
askExo(question);
|
|
14632
|
+
},
|
|
14633
|
+
children: [
|
|
14634
|
+
/* @__PURE__ */ jsx(
|
|
14635
|
+
Textarea,
|
|
14636
|
+
{
|
|
14637
|
+
ref: textareaRef,
|
|
14638
|
+
placeholder,
|
|
14639
|
+
value: question,
|
|
14640
|
+
onChange: (e) => setQuestion(e.target.value),
|
|
14641
|
+
maxLength: 500,
|
|
14642
|
+
className: "min-h-[220px] flex-1 resize-y bg-muted/50 px-4 py-3.5 font-sans text-[15px] leading-relaxed placeholder:italic focus-visible:bg-card"
|
|
14643
|
+
}
|
|
14644
|
+
),
|
|
14645
|
+
/* @__PURE__ */ jsx(
|
|
14646
|
+
Button2,
|
|
14647
|
+
{
|
|
14648
|
+
type: "submit",
|
|
14649
|
+
disabled: !question.trim(),
|
|
14650
|
+
className: "h-11 w-full font-ui text-[13px] font-bold tracking-[0.5px] uppercase",
|
|
14651
|
+
children: submitLabel
|
|
14652
|
+
}
|
|
14653
|
+
),
|
|
14654
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 mb-0 text-center font-ui text-[10.5px] font-bold tracking-[0.5px] text-muted-foreground uppercase", children: "Opens in a new tab" })
|
|
14655
|
+
]
|
|
14656
|
+
}
|
|
14657
|
+
)
|
|
14658
|
+
) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
14659
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col gap-3.5 overflow-y-auto px-5 py-4", children: [
|
|
14660
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 mb-0 font-ui text-[10.5px] font-bold tracking-[1.2px] text-muted-foreground uppercase", children: "Suggested questions" }),
|
|
14661
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: suggestions.map((s) => /* @__PURE__ */ jsx(
|
|
14662
|
+
"button",
|
|
14663
|
+
{
|
|
14664
|
+
type: "button",
|
|
14665
|
+
onClick: () => askExo(s.ask),
|
|
14666
|
+
className: cn(
|
|
14667
|
+
"cursor-pointer rounded-full border border-border bg-muted/60 px-3.5 py-2 text-left font-ui text-[12.5px] font-bold leading-tight text-foreground",
|
|
14668
|
+
"transition-colors hover:border-primary hover:bg-primary-100 hover:text-primary-800",
|
|
14669
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50"
|
|
14670
|
+
),
|
|
14671
|
+
children: s.label
|
|
14672
|
+
},
|
|
14673
|
+
s.label
|
|
14674
|
+
)) })
|
|
14675
|
+
] }),
|
|
14676
|
+
/* @__PURE__ */ jsxs("footer", { className: "border-t border-border bg-card px-4 py-3.5", children: [
|
|
14677
|
+
/* @__PURE__ */ jsxs(
|
|
14678
|
+
"form",
|
|
14679
|
+
{
|
|
14680
|
+
className: "flex items-stretch gap-2",
|
|
14681
|
+
onSubmit: (e) => {
|
|
14682
|
+
e.preventDefault();
|
|
14683
|
+
askExo(question);
|
|
14684
|
+
},
|
|
14685
|
+
children: [
|
|
14686
|
+
/* @__PURE__ */ jsx(
|
|
14687
|
+
Input,
|
|
14688
|
+
{
|
|
14689
|
+
ref: inputRef,
|
|
14690
|
+
type: "text",
|
|
14691
|
+
placeholder,
|
|
14692
|
+
value: question,
|
|
14693
|
+
onChange: (e) => setQuestion(e.target.value),
|
|
14694
|
+
maxLength: 500,
|
|
14695
|
+
"aria-label": "Ask EXO",
|
|
14696
|
+
className: "h-10 flex-1 rounded-xl bg-muted/50 px-3.5 py-2.5 font-sans text-[14.5px] focus-visible:bg-card"
|
|
14697
|
+
}
|
|
14698
|
+
),
|
|
14699
|
+
/* @__PURE__ */ jsx(
|
|
14700
|
+
Button2,
|
|
14701
|
+
{
|
|
14702
|
+
type: "submit",
|
|
14703
|
+
disabled: !question.trim(),
|
|
14704
|
+
className: "h-10 min-w-[86px] rounded-xl font-ui text-[12px] font-bold tracking-[0.5px] uppercase",
|
|
14705
|
+
children: submitLabel
|
|
14706
|
+
}
|
|
14707
|
+
)
|
|
14708
|
+
]
|
|
14709
|
+
}
|
|
14710
|
+
),
|
|
14711
|
+
/* @__PURE__ */ jsx("p", { className: "mt-2.5 mb-0 text-center font-ui text-[10.5px] font-bold tracking-[0.5px] text-muted-foreground uppercase", children: "Opens in a new tab" })
|
|
14712
|
+
] })
|
|
14713
|
+
] })
|
|
14714
|
+
]
|
|
14715
|
+
}
|
|
14716
|
+
)
|
|
14717
|
+
] });
|
|
14718
|
+
}
|
|
14280
14719
|
|
|
14281
|
-
export { ActivityCard, AgentContactCard, Alert, BirthDateField, BookingAdventureCard, BookingCancellationEmail, BookingConfirmedCard, BookingCreatedEmail, BookingDetails, BookingForm, BookingOtpEmail, BookingPaymentConfirmationEmail, BookingShell, BookingSummary, Button, COUNTRIES, CounterField, CountrySearchField, DEFAULT_HEADER_LINKS, DEFAULT_LANGUAGES, DatePickerField, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, FilterPanel, FloatingInput, FloatingSelect, Itinerary, ItineraryDay, LOGO_PLANETAEXO_DATA_URI, LeadCapturePopup, MenuTrip, OTPCodeInput, Offer, OfferAdventureCard, PartnerBookingCreatedEmail, PartnerRegistrationCompleteEmail, PaymentAmountSelector, PaymentDetailsBlock, PaymentMethodSelector, PaymentModalShell, PaymentReceiptEmail, PaymentReminderEmail, PhoneCountrySelect, PhotoGallery, PricingTrip, RegistrationForm, RegistrationProgressBar, RegistrationReminderEmail, RegistrationReminderIndividualEmail, RegistrationSuccessCard, SiteHeader, TERMS_ACCEPT_KEY, TermsSection, ThemeToggle, Toast, TransferDetailsBlock, TravellerFormInviteEmail, TripCard, TripHeader, TripPage, TrustpilotEmbed, buttonVariants, cn, emailTokens, formatCpf, getStripeAppearance, itineraryDaySpecIcons, stripeAppearance, validateCpf, wrapEmailHtml };
|
|
14720
|
+
export { ActivityCard, AgentContactCard, Alert, AskExo, BirthDateField, BookingAdventureCard, BookingCancellationEmail, BookingConfirmedCard, BookingCreatedEmail, BookingDetails, BookingForm, BookingOtpEmail, BookingPaymentConfirmationEmail, BookingShell, BookingSummary, Button, COUNTRIES, CounterField, CountrySearchField, DEFAULT_HEADER_LINKS, DEFAULT_LANGUAGES, DatePickerField, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, ExoOrb, FilterPanel, FloatingInput, FloatingSelect, Itinerary, ItineraryDay, LOGO_PLANETAEXO_DATA_URI, LeadCapturePopup, MenuTrip, OTPCodeInput, Offer, OfferAdventureCard, PartnerBookingCreatedEmail, PartnerRegistrationCompleteEmail, PaymentAmountSelector, PaymentDetailsBlock, PaymentMethodSelector, PaymentModalShell, PaymentReceiptEmail, PaymentReminderEmail, PhoneCountrySelect, PhotoGallery, PricingTrip, RegistrationForm, RegistrationProgressBar, RegistrationReminderEmail, RegistrationReminderIndividualEmail, RegistrationSuccessCard, SiteHeader, TERMS_ACCEPT_KEY, TermsSection, ThemeToggle, Toast, TransferDetailsBlock, TravellerFormInviteEmail, TripCard, TripHeader, TripPage, TrustpilotEmbed, buttonVariants, cn, emailTokens, formatCpf, getStripeAppearance, itineraryDaySpecIcons, stripeAppearance, validateCpf, wrapEmailHtml };
|
|
14282
14721
|
//# sourceMappingURL=index.js.map
|
|
14283
14722
|
//# sourceMappingURL=index.js.map
|