@uptrademedia/site-kit 1.0.5 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/dist/analytics/index.js +7 -7
  2. package/dist/analytics/index.mjs +3 -3
  3. package/dist/api-QUIPJJCX.js +77 -0
  4. package/dist/api-QUIPJJCX.js.map +1 -0
  5. package/dist/api-V3BA5PMX.mjs +4 -0
  6. package/dist/api-V3BA5PMX.mjs.map +1 -0
  7. package/dist/blog/index.d.mts +2 -2
  8. package/dist/blog/index.d.ts +2 -2
  9. package/dist/blog/index.js +40 -6
  10. package/dist/blog/index.js.map +1 -1
  11. package/dist/blog/index.mjs +40 -6
  12. package/dist/blog/index.mjs.map +1 -1
  13. package/dist/blog/server.d.mts +3 -2
  14. package/dist/blog/server.d.ts +3 -2
  15. package/dist/blog/server.js +13 -6
  16. package/dist/blog/server.js.map +1 -1
  17. package/dist/blog/server.mjs +13 -6
  18. package/dist/blog/server.mjs.map +1 -1
  19. package/dist/{chunk-FKVJOT2F.mjs → chunk-42EXHJTC.mjs} +196 -7
  20. package/dist/chunk-42EXHJTC.mjs.map +1 -0
  21. package/dist/{scanner-AZV5I6US.mjs → chunk-44OMJFCG.mjs} +354 -14
  22. package/dist/chunk-44OMJFCG.mjs.map +1 -0
  23. package/dist/chunk-4TGJYNHV.js +981 -0
  24. package/dist/chunk-4TGJYNHV.js.map +1 -0
  25. package/dist/chunk-4XPGGLVP.mjs +53 -0
  26. package/dist/{chunk-NYKRE2FL.mjs.map → chunk-4XPGGLVP.mjs.map} +1 -1
  27. package/dist/{generators-TO2FKJR6.mjs → chunk-6ONUXZDO.mjs} +26 -9
  28. package/dist/chunk-6ONUXZDO.mjs.map +1 -0
  29. package/dist/chunk-CG53ASWX.mjs +729 -0
  30. package/dist/chunk-CG53ASWX.mjs.map +1 -0
  31. package/dist/{scanner-ETJAMIT7.js → chunk-DERI27QC.js} +448 -102
  32. package/dist/chunk-DERI27QC.js.map +1 -0
  33. package/dist/chunk-DYM5ML2V.mjs +1518 -0
  34. package/dist/chunk-DYM5ML2V.mjs.map +1 -0
  35. package/dist/chunk-FLZZOX44.js +1526 -0
  36. package/dist/chunk-FLZZOX44.js.map +1 -0
  37. package/dist/{chunk-7H6I3ECV.mjs → chunk-FQVGK746.mjs} +63 -3
  38. package/dist/chunk-FQVGK746.mjs.map +1 -0
  39. package/dist/{chunk-GQ6ZOU2N.mjs → chunk-JGQPAXTL.mjs} +4 -4
  40. package/dist/{chunk-GQ6ZOU2N.mjs.map → chunk-JGQPAXTL.mjs.map} +1 -1
  41. package/dist/{chunk-V3F5J6CV.js → chunk-JUEVN4Q4.js} +196 -7
  42. package/dist/chunk-JUEVN4Q4.js.map +1 -0
  43. package/dist/chunk-KKMGTT7F.mjs +968 -0
  44. package/dist/chunk-KKMGTT7F.mjs.map +1 -0
  45. package/dist/{chunk-XQJX252G.mjs → chunk-MB3WR5KJ.mjs} +28 -18
  46. package/dist/chunk-MB3WR5KJ.mjs.map +1 -0
  47. package/dist/{chunk-2IHTEKHU.mjs → chunk-QD5CN2OI.mjs} +16 -7
  48. package/dist/chunk-QD5CN2OI.mjs.map +1 -0
  49. package/dist/{chunk-SBVEYCSV.js → chunk-QQB4FO4Q.js} +7 -7
  50. package/dist/{chunk-SBVEYCSV.js.map → chunk-QQB4FO4Q.js.map} +1 -1
  51. package/dist/{generators-YZWIGHCO.js → chunk-S2GXR5HY.js} +26 -9
  52. package/dist/chunk-S2GXR5HY.js.map +1 -0
  53. package/dist/{chunk-O2OHHBUD.js → chunk-TDK7DLCH.js} +30 -20
  54. package/dist/chunk-TDK7DLCH.js.map +1 -0
  55. package/dist/{chunk-QP5NCO2E.js → chunk-VDI7KYME.js} +67 -2
  56. package/dist/chunk-VDI7KYME.js.map +1 -0
  57. package/dist/chunk-VOR53RUR.js +753 -0
  58. package/dist/chunk-VOR53RUR.js.map +1 -0
  59. package/dist/{chunk-GAJLEDRD.js → chunk-ZKJ7JKFV.js} +16 -7
  60. package/dist/chunk-ZKJ7JKFV.js.map +1 -0
  61. package/dist/chunk-ZSMWDLMK.js +63 -0
  62. package/dist/{chunk-EQCVQC35.js.map → chunk-ZSMWDLMK.js.map} +1 -1
  63. package/dist/cli/index.js +37269 -0
  64. package/dist/cli/index.js.map +1 -0
  65. package/dist/cli/index.mjs +37233 -0
  66. package/dist/cli/index.mjs.map +1 -0
  67. package/dist/commerce/index.js +1 -1
  68. package/dist/commerce/index.mjs +1 -1
  69. package/dist/commerce/server.d.mts +12 -3
  70. package/dist/commerce/server.d.ts +12 -3
  71. package/dist/commerce/server.js +71 -70
  72. package/dist/commerce/server.js.map +1 -1
  73. package/dist/commerce/server.mjs +71 -70
  74. package/dist/commerce/server.mjs.map +1 -1
  75. package/dist/engage/index.d.mts +6 -4
  76. package/dist/engage/index.d.ts +6 -4
  77. package/dist/engage/index.js +8 -4
  78. package/dist/engage/index.mjs +2 -2
  79. package/dist/forms/index.js +1 -1
  80. package/dist/forms/index.mjs +1 -1
  81. package/dist/generators-5EU4PTVF.js +33 -0
  82. package/dist/generators-5EU4PTVF.js.map +1 -0
  83. package/dist/generators-TYPILCWD.mjs +4 -0
  84. package/dist/generators-TYPILCWD.mjs.map +1 -0
  85. package/dist/images/index.js +11 -11
  86. package/dist/images/index.mjs +4 -4
  87. package/dist/index.d.mts +154 -5
  88. package/dist/index.d.ts +154 -5
  89. package/dist/index.js +940 -24
  90. package/dist/index.js.map +1 -1
  91. package/dist/index.mjs +819 -7
  92. package/dist/index.mjs.map +1 -1
  93. package/dist/llms/index.d.mts +657 -0
  94. package/dist/llms/index.d.ts +657 -0
  95. package/dist/llms/index.js +101 -0
  96. package/dist/llms/index.js.map +1 -0
  97. package/dist/llms/index.mjs +4 -0
  98. package/dist/llms/index.mjs.map +1 -0
  99. package/dist/migrator-ARLHUNB3.mjs +4 -0
  100. package/dist/migrator-ARLHUNB3.mjs.map +1 -0
  101. package/dist/migrator-VZLBH3VY.js +37 -0
  102. package/dist/migrator-VZLBH3VY.js.map +1 -0
  103. package/dist/redirects/index.js +1 -1
  104. package/dist/redirects/index.mjs +1 -1
  105. package/dist/reputation/index.js +1 -1
  106. package/dist/reputation/index.mjs +1 -1
  107. package/dist/{routing-BWjUF7lp.d.ts → routing-CF91y6NO.d.ts} +1 -1
  108. package/dist/{routing-CgmRi9tD.d.mts → routing-CIOFpFCB.d.mts} +1 -1
  109. package/dist/scanner-7ZMUM2P5.mjs +4 -0
  110. package/dist/scanner-7ZMUM2P5.mjs.map +1 -0
  111. package/dist/scanner-OY7UF3WA.js +53 -0
  112. package/dist/scanner-OY7UF3WA.js.map +1 -0
  113. package/dist/seo/index.d.mts +267 -7
  114. package/dist/seo/index.d.ts +267 -7
  115. package/dist/seo/index.js +432 -24
  116. package/dist/seo/index.js.map +1 -1
  117. package/dist/seo/index.mjs +400 -11
  118. package/dist/seo/index.mjs.map +1 -1
  119. package/dist/seo/server.d.mts +11 -4
  120. package/dist/seo/server.d.ts +11 -4
  121. package/dist/seo/server.js +17 -17
  122. package/dist/seo/server.mjs +3 -3
  123. package/dist/setup/client.js +1 -1
  124. package/dist/setup/client.mjs +1 -1
  125. package/dist/setup/index.js +3 -3
  126. package/dist/setup/index.mjs +2 -2
  127. package/dist/setup/server.js +3 -3
  128. package/dist/setup/server.mjs +2 -2
  129. package/dist/sitemap/index.js +2 -2
  130. package/dist/sitemap/index.js.map +1 -1
  131. package/dist/sitemap/index.mjs +2 -2
  132. package/dist/sitemap/index.mjs.map +1 -1
  133. package/dist/{types-C0pJGfbH.d.mts → types-D6FHAVWX.d.mts} +99 -3
  134. package/dist/{types-C0pJGfbH.d.ts → types-D6FHAVWX.d.ts} +99 -3
  135. package/dist/{types-BN4OwtCO.d.mts → types-DI0jnhjJ.d.mts} +2 -0
  136. package/dist/{types-BN4OwtCO.d.ts → types-DI0jnhjJ.d.ts} +2 -0
  137. package/dist/{types-BmzutFwy.d.ts → types-j8X4vUhB.d.mts} +19 -2
  138. package/dist/{types-BmzutFwy.d.mts → types-j8X4vUhB.d.ts} +19 -2
  139. package/dist/{web-vitals-BH55V7EJ.js → web-vitals-444RLW3B.js} +11 -11
  140. package/dist/{web-vitals-BH55V7EJ.js.map → web-vitals-444RLW3B.js.map} +1 -1
  141. package/dist/{web-vitals-RJYPWAR3.mjs → web-vitals-KPICZIEF.mjs} +3 -3
  142. package/dist/{web-vitals-RJYPWAR3.mjs.map → web-vitals-KPICZIEF.mjs.map} +1 -1
  143. package/package.json +9 -2
  144. package/dist/api-N35S3EES.js +0 -57
  145. package/dist/api-N35S3EES.js.map +0 -1
  146. package/dist/api-SYBTK7Z7.mjs +0 -4
  147. package/dist/api-SYBTK7Z7.mjs.map +0 -1
  148. package/dist/chunk-2IHTEKHU.mjs.map +0 -1
  149. package/dist/chunk-7H6I3ECV.mjs.map +0 -1
  150. package/dist/chunk-BGJLOJ7T.mjs +0 -605
  151. package/dist/chunk-BGJLOJ7T.mjs.map +0 -1
  152. package/dist/chunk-EQCVQC35.js +0 -35
  153. package/dist/chunk-FKVJOT2F.mjs.map +0 -1
  154. package/dist/chunk-GAJLEDRD.js.map +0 -1
  155. package/dist/chunk-NYKRE2FL.mjs +0 -31
  156. package/dist/chunk-O2OHHBUD.js.map +0 -1
  157. package/dist/chunk-QAYJV4KK.js +0 -608
  158. package/dist/chunk-QAYJV4KK.js.map +0 -1
  159. package/dist/chunk-QP5NCO2E.js.map +0 -1
  160. package/dist/chunk-V3F5J6CV.js.map +0 -1
  161. package/dist/chunk-XQJX252G.mjs.map +0 -1
  162. package/dist/generators-TO2FKJR6.mjs.map +0 -1
  163. package/dist/generators-YZWIGHCO.js.map +0 -1
  164. package/dist/migrator-V6KS75EA.mjs +0 -265
  165. package/dist/migrator-V6KS75EA.mjs.map +0 -1
  166. package/dist/migrator-XKM7YQCY.js +0 -272
  167. package/dist/migrator-XKM7YQCY.js.map +0 -1
  168. package/dist/scanner-AZV5I6US.mjs.map +0 -1
  169. package/dist/scanner-ETJAMIT7.js.map +0 -1
package/dist/index.mjs CHANGED
@@ -1,15 +1,16 @@
1
1
  export { TestimonialSection, fetchReviewStats, fetchReviews } from './chunk-QD66FTXZ.mjs';
2
+ export { AEOBlock, AEOCitedContent, AEOClaim, AEOComparison, AEODefinition, AEOEntity, AEOProvenanceList, AEOStep, AEOSteps, AEOSummary, DEFAULT_SPEAKABLE_SELECTORS, SpeakableSchema, createLLMsFullTxtHandler, createLLMsTxtHandler, createSpeakableSchema, generateLLMsFullTxt, generateLLMsTxt, getBusinessInfo, getFAQItems as getLLMFAQItems, getServices as getLLMServices, getLLMsData, getPageSummaries, getSpeakableSelectorsForPage } from './chunk-CG53ASWX.mjs';
2
3
  export { CalendarView, CheckoutForm, EventCalendar, EventEmbed, EventModal, EventTile, OfferingCard, OfferingList, ProductEmbed, RegistrationForm, UpcomingEvents, createCheckoutSession, fetchNextEvent, fetchOffering, fetchOfferings, fetchProducts, fetchServices, fetchUpcomingEvents, formatDate, formatDateTime, formatPrice, getOfferingUrl, registerForEvent, useEventModal } from './chunk-DOHML47I.mjs';
3
4
  export { SetupWizard } from './chunk-XFRPT5ZX.mjs';
4
5
  export { clearRedirectCache, fetchRedirectRules, generateNextRedirects, handleManagedRedirects } from './chunk-VDMZZL2O.mjs';
5
- import { useSignalExperiment, useSignalEvent } from './chunk-XQJX252G.mjs';
6
- export { ManagedImage, SignalBridge, SiteKitProvider, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome, useSiteKit } from './chunk-XQJX252G.mjs';
6
+ import { useSignalExperiment, useSignalEvent } from './chunk-MB3WR5KJ.mjs';
7
+ export { ManagedImage, SignalBridge, SiteKitProvider, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome, useSiteKit } from './chunk-MB3WR5KJ.mjs';
7
8
  import './chunk-WPSRS352.mjs';
8
- import './chunk-FKVJOT2F.mjs';
9
- import './chunk-BGJLOJ7T.mjs';
9
+ import './chunk-42EXHJTC.mjs';
10
+ import './chunk-DYM5ML2V.mjs';
10
11
  import './chunk-SMUFNQLM.mjs';
11
- import './chunk-NYKRE2FL.mjs';
12
- import React, { useState, useEffect, useRef, useCallback } from 'react';
12
+ import './chunk-4XPGGLVP.mjs';
13
+ import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react';
13
14
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
14
15
 
15
16
  // src/affiliates/api.ts
@@ -1384,6 +1385,817 @@ ${moduleConfigs.join("\n")}
1384
1385
  }`;
1385
1386
  }
1386
1387
 
1387
- export { AffiliateCard, AffiliatesWidget, ExperimentConversion, SetupAssistant, SignalExperiment, fetchAffiliates, getTrackingUrl, useAffiliates, useExperimentVariant };
1388
+ // src/sync/api.ts
1389
+ var DEFAULT_API_URL = "https://api.uptrademedia.com";
1390
+ async function fetchBookingTypes(orgSlug, apiUrl = DEFAULT_API_URL) {
1391
+ const response = await fetch(`${apiUrl}/sync/public/${orgSlug}/types`);
1392
+ if (!response.ok) {
1393
+ throw new Error(`Failed to fetch booking types: ${response.statusText}`);
1394
+ }
1395
+ const data = await response.json();
1396
+ return data.types || [];
1397
+ }
1398
+ async function fetchBookingTypeDetails(orgSlug, typeSlug, apiUrl = DEFAULT_API_URL) {
1399
+ const response = await fetch(`${apiUrl}/sync/public/${orgSlug}/types/${typeSlug}`);
1400
+ if (!response.ok) {
1401
+ throw new Error(`Failed to fetch booking type: ${response.statusText}`);
1402
+ }
1403
+ return response.json();
1404
+ }
1405
+ async function fetchAvailability(orgSlug, typeSlug, date, apiUrl = DEFAULT_API_URL, timezone, hostId) {
1406
+ const params = new URLSearchParams({ date });
1407
+ if (timezone) params.append("timezone", timezone);
1408
+ if (hostId) params.append("hostId", hostId);
1409
+ const response = await fetch(
1410
+ `${apiUrl}/sync/public/${orgSlug}/availability/${typeSlug}?${params}`
1411
+ );
1412
+ if (!response.ok) {
1413
+ throw new Error(`Failed to fetch availability: ${response.statusText}`);
1414
+ }
1415
+ const data = await response.json();
1416
+ return data.slots || [];
1417
+ }
1418
+ async function createSlotHold(bookingTypeId, startTime, hostId, guestTimezone, apiUrl = DEFAULT_API_URL) {
1419
+ const response = await fetch(`${apiUrl}/sync/public/hold`, {
1420
+ method: "POST",
1421
+ headers: { "Content-Type": "application/json" },
1422
+ body: JSON.stringify({
1423
+ booking_type_id: bookingTypeId,
1424
+ start_time: startTime,
1425
+ host_id: hostId,
1426
+ guest_timezone: guestTimezone
1427
+ })
1428
+ });
1429
+ if (!response.ok) {
1430
+ throw new Error(`Failed to hold slot: ${response.statusText}`);
1431
+ }
1432
+ return response.json();
1433
+ }
1434
+ async function releaseSlotHold(holdId, apiUrl = DEFAULT_API_URL) {
1435
+ await fetch(`${apiUrl}/sync/public/hold/${holdId}`, {
1436
+ method: "DELETE"
1437
+ });
1438
+ }
1439
+ async function createBooking(bookingTypeId, startTime, guest, timezone, hostId, holdId, apiUrl = DEFAULT_API_URL) {
1440
+ const response = await fetch(`${apiUrl}/sync/public/booking`, {
1441
+ method: "POST",
1442
+ headers: { "Content-Type": "application/json" },
1443
+ body: JSON.stringify({
1444
+ booking_type_id: bookingTypeId,
1445
+ start_time: startTime,
1446
+ guest_name: guest.name,
1447
+ guest_email: guest.email,
1448
+ guest_phone: guest.phone,
1449
+ guest_notes: guest.notes,
1450
+ timezone,
1451
+ host_id: hostId,
1452
+ hold_id: holdId
1453
+ })
1454
+ });
1455
+ if (!response.ok) {
1456
+ const errorData = await response.json().catch(() => ({}));
1457
+ throw new Error(errorData.message || `Failed to create booking: ${response.statusText}`);
1458
+ }
1459
+ return response.json();
1460
+ }
1461
+ async function fetchAvailableDates(orgSlug, typeSlug, startDate, endDate, apiUrl = DEFAULT_API_URL, timezone) {
1462
+ const availableDates = [];
1463
+ const start = new Date(startDate);
1464
+ const end = new Date(endDate);
1465
+ const current = new Date(start);
1466
+ while (current <= end) {
1467
+ const dateStr = current.toISOString().split("T")[0];
1468
+ try {
1469
+ const slots = await fetchAvailability(orgSlug, typeSlug, dateStr, apiUrl, timezone);
1470
+ if (slots.some((s) => s.available)) {
1471
+ availableDates.push(dateStr);
1472
+ }
1473
+ } catch {
1474
+ }
1475
+ current.setDate(current.getDate() + 1);
1476
+ }
1477
+ return availableDates;
1478
+ }
1479
+ function detectTimezone() {
1480
+ try {
1481
+ return Intl.DateTimeFormat().resolvedOptions().timeZone;
1482
+ } catch {
1483
+ return "America/New_York";
1484
+ }
1485
+ }
1486
+ function formatTime(isoString, timezone) {
1487
+ const date = new Date(isoString);
1488
+ return date.toLocaleTimeString("en-US", {
1489
+ hour: "numeric",
1490
+ minute: "2-digit",
1491
+ hour12: true,
1492
+ timeZone: timezone
1493
+ });
1494
+ }
1495
+ function formatDate2(isoString, timezone) {
1496
+ const date = new Date(isoString);
1497
+ return date.toLocaleDateString("en-US", {
1498
+ weekday: "long",
1499
+ month: "long",
1500
+ day: "numeric",
1501
+ year: "numeric",
1502
+ timeZone: timezone
1503
+ });
1504
+ }
1505
+ function formatDuration(minutes) {
1506
+ if (minutes < 60) {
1507
+ return `${minutes} min`;
1508
+ }
1509
+ const hours = Math.floor(minutes / 60);
1510
+ const mins = minutes % 60;
1511
+ if (mins === 0) {
1512
+ return `${hours} hour${hours > 1 ? "s" : ""}`;
1513
+ }
1514
+ return `${hours}h ${mins}m`;
1515
+ }
1516
+ var DEFAULT_API_URL2 = "https://api.uptrademedia.com";
1517
+ function BookingWidget({
1518
+ orgSlug,
1519
+ apiUrl = DEFAULT_API_URL2,
1520
+ bookingTypeSlug,
1521
+ timezone: propTimezone,
1522
+ className = "",
1523
+ daysToShow = 14,
1524
+ onBookingComplete,
1525
+ onError,
1526
+ hideTypeSelector = false,
1527
+ styles: styles2 = {}
1528
+ }) {
1529
+ const [step, setStep] = useState(bookingTypeSlug ? "datetime" : "type");
1530
+ const [loading, setLoading] = useState(false);
1531
+ const [error, setError] = useState(null);
1532
+ const [bookingTypes, setBookingTypes] = useState([]);
1533
+ const [selectedType, setSelectedType] = useState(null);
1534
+ const [selectedDate, setSelectedDate] = useState(null);
1535
+ const [slots, setSlots] = useState([]);
1536
+ const [selectedSlot, setSelectedSlot] = useState(null);
1537
+ const [hold, setHold] = useState(null);
1538
+ const [guestInfo, setGuestInfo] = useState({ name: "", email: "" });
1539
+ const [bookingResult, setBookingResult] = useState(null);
1540
+ const timezone = useMemo(() => propTimezone || detectTimezone(), [propTimezone]);
1541
+ const availableDates = useMemo(() => {
1542
+ const dates = [];
1543
+ const today = /* @__PURE__ */ new Date();
1544
+ today.setHours(0, 0, 0, 0);
1545
+ for (let i = 0; i < daysToShow; i++) {
1546
+ const date = new Date(today);
1547
+ date.setDate(date.getDate() + i);
1548
+ if (date.getDay() !== 0 && date.getDay() !== 6) {
1549
+ dates.push(date);
1550
+ }
1551
+ }
1552
+ return dates;
1553
+ }, [daysToShow]);
1554
+ useEffect(() => {
1555
+ if (bookingTypeSlug) {
1556
+ fetchBookingTypeDetails(orgSlug, bookingTypeSlug, apiUrl).then((type) => {
1557
+ setSelectedType(type);
1558
+ setStep("datetime");
1559
+ }).catch((err) => {
1560
+ setError(err.message);
1561
+ onError?.(err);
1562
+ });
1563
+ } else {
1564
+ fetchBookingTypes(orgSlug, apiUrl).then((types) => setBookingTypes(types.filter((t) => t.is_active))).catch((err) => {
1565
+ setError(err.message);
1566
+ onError?.(err);
1567
+ });
1568
+ }
1569
+ }, [orgSlug, bookingTypeSlug, apiUrl, onError]);
1570
+ useEffect(() => {
1571
+ if (!selectedDate || !selectedType) return;
1572
+ const dateStr = selectedDate.toISOString().split("T")[0];
1573
+ setLoading(true);
1574
+ setSlots([]);
1575
+ setSelectedSlot(null);
1576
+ fetchAvailability(orgSlug, selectedType.slug, dateStr, apiUrl, timezone).then((s) => setSlots(s.filter((slot) => slot.available))).catch((err) => {
1577
+ setError(err.message);
1578
+ onError?.(err);
1579
+ }).finally(() => setLoading(false));
1580
+ }, [selectedDate, selectedType, orgSlug, apiUrl, timezone, onError]);
1581
+ const handleSlotSelect = useCallback(async (slot) => {
1582
+ if (!selectedType) return;
1583
+ if (hold) {
1584
+ await releaseSlotHold(hold.holdId, apiUrl).catch(() => {
1585
+ });
1586
+ }
1587
+ setSelectedSlot(slot);
1588
+ setLoading(true);
1589
+ try {
1590
+ const newHold = await createSlotHold(
1591
+ selectedType.id,
1592
+ slot.start,
1593
+ slot.hostId,
1594
+ timezone,
1595
+ apiUrl
1596
+ );
1597
+ setHold(newHold);
1598
+ setStep("form");
1599
+ } catch (err) {
1600
+ setError(err.message);
1601
+ onError?.(err);
1602
+ } finally {
1603
+ setLoading(false);
1604
+ }
1605
+ }, [selectedType, hold, timezone, apiUrl, onError]);
1606
+ const handleBookingSubmit = useCallback(async (e) => {
1607
+ e.preventDefault();
1608
+ if (!selectedType || !selectedSlot) return;
1609
+ setLoading(true);
1610
+ setError(null);
1611
+ try {
1612
+ const result = await createBooking(
1613
+ selectedType.id,
1614
+ selectedSlot.start,
1615
+ guestInfo,
1616
+ timezone,
1617
+ selectedSlot.hostId,
1618
+ hold?.holdId,
1619
+ apiUrl
1620
+ );
1621
+ setBookingResult(result);
1622
+ setStep("success");
1623
+ onBookingComplete?.(result);
1624
+ } catch (err) {
1625
+ setError(err.message);
1626
+ onError?.(err);
1627
+ } finally {
1628
+ setLoading(false);
1629
+ }
1630
+ }, [selectedType, selectedSlot, guestInfo, timezone, hold, apiUrl, onBookingComplete, onError]);
1631
+ useEffect(() => {
1632
+ return () => {
1633
+ if (hold) {
1634
+ releaseSlotHold(hold.holdId, apiUrl).catch(() => {
1635
+ });
1636
+ }
1637
+ };
1638
+ }, [hold, apiUrl]);
1639
+ const cssVars = {
1640
+ "--booking-primary": styles2.primaryColor || "#4bbf39",
1641
+ "--booking-radius": styles2.borderRadius || "8px",
1642
+ "--booking-font": styles2.fontFamily || "inherit"
1643
+ };
1644
+ return /* @__PURE__ */ jsxs(
1645
+ "div",
1646
+ {
1647
+ className: `uptrade-booking-widget ${className}`,
1648
+ style: cssVars,
1649
+ children: [
1650
+ error && /* @__PURE__ */ jsxs("div", { className: "uptrade-booking-error", children: [
1651
+ error,
1652
+ /* @__PURE__ */ jsx("button", { onClick: () => setError(null), children: "Dismiss" })
1653
+ ] }),
1654
+ step === "type" && !hideTypeSelector && /* @__PURE__ */ jsxs("div", { className: "uptrade-booking-types", children: [
1655
+ /* @__PURE__ */ jsx("h3", { className: "uptrade-booking-title", children: "Select a Service" }),
1656
+ /* @__PURE__ */ jsx("div", { className: "uptrade-booking-type-list", children: bookingTypes.map((type) => /* @__PURE__ */ jsxs(
1657
+ "button",
1658
+ {
1659
+ className: "uptrade-booking-type-card",
1660
+ onClick: () => {
1661
+ setSelectedType(type);
1662
+ setStep("datetime");
1663
+ },
1664
+ children: [
1665
+ /* @__PURE__ */ jsx("div", { className: "uptrade-booking-type-name", children: type.name }),
1666
+ type.description && /* @__PURE__ */ jsx("div", { className: "uptrade-booking-type-desc", children: type.description }),
1667
+ /* @__PURE__ */ jsxs("div", { className: "uptrade-booking-type-meta", children: [
1668
+ /* @__PURE__ */ jsx("span", { children: formatDuration(type.duration_minutes) }),
1669
+ type.price_cents ? /* @__PURE__ */ jsxs("span", { children: [
1670
+ "$",
1671
+ (type.price_cents / 100).toFixed(2)
1672
+ ] }) : /* @__PURE__ */ jsx("span", { children: "Free" })
1673
+ ] })
1674
+ ]
1675
+ },
1676
+ type.id
1677
+ )) })
1678
+ ] }),
1679
+ step === "datetime" && selectedType && /* @__PURE__ */ jsxs("div", { className: "uptrade-booking-datetime", children: [
1680
+ /* @__PURE__ */ jsx(
1681
+ "button",
1682
+ {
1683
+ className: "uptrade-booking-back",
1684
+ onClick: () => {
1685
+ if (bookingTypeSlug) return;
1686
+ setSelectedType(null);
1687
+ setStep("type");
1688
+ },
1689
+ disabled: !!bookingTypeSlug,
1690
+ children: "\u2190 Back"
1691
+ }
1692
+ ),
1693
+ /* @__PURE__ */ jsx("h3", { className: "uptrade-booking-title", children: selectedType.name }),
1694
+ /* @__PURE__ */ jsxs("p", { className: "uptrade-booking-subtitle", children: [
1695
+ formatDuration(selectedType.duration_minutes),
1696
+ " \u2022 ",
1697
+ selectedType.location_type
1698
+ ] }),
1699
+ /* @__PURE__ */ jsxs("div", { className: "uptrade-booking-dates", children: [
1700
+ /* @__PURE__ */ jsx("h4", { children: "Select a Date" }),
1701
+ /* @__PURE__ */ jsx("div", { className: "uptrade-booking-date-grid", children: availableDates.map((date) => {
1702
+ const dateStr = date.toISOString().split("T")[0];
1703
+ const isSelected = selectedDate?.toISOString().split("T")[0] === dateStr;
1704
+ return /* @__PURE__ */ jsxs(
1705
+ "button",
1706
+ {
1707
+ className: `uptrade-booking-date ${isSelected ? "selected" : ""}`,
1708
+ onClick: () => setSelectedDate(date),
1709
+ children: [
1710
+ /* @__PURE__ */ jsx("span", { className: "uptrade-booking-date-day", children: date.toLocaleDateString("en-US", { weekday: "short" }) }),
1711
+ /* @__PURE__ */ jsx("span", { className: "uptrade-booking-date-num", children: date.getDate() })
1712
+ ]
1713
+ },
1714
+ dateStr
1715
+ );
1716
+ }) })
1717
+ ] }),
1718
+ selectedDate && /* @__PURE__ */ jsxs("div", { className: "uptrade-booking-times", children: [
1719
+ /* @__PURE__ */ jsx("h4", { children: "Select a Time" }),
1720
+ loading ? /* @__PURE__ */ jsx("div", { className: "uptrade-booking-loading", children: "Loading available times..." }) : slots.length === 0 ? /* @__PURE__ */ jsx("div", { className: "uptrade-booking-empty", children: "No times available on this date" }) : /* @__PURE__ */ jsx("div", { className: "uptrade-booking-time-grid", children: slots.map((slot) => /* @__PURE__ */ jsx(
1721
+ "button",
1722
+ {
1723
+ className: `uptrade-booking-time ${selectedSlot?.start === slot.start ? "selected" : ""}`,
1724
+ onClick: () => handleSlotSelect(slot),
1725
+ disabled: loading,
1726
+ children: formatTime(slot.start, timezone)
1727
+ },
1728
+ slot.start
1729
+ )) })
1730
+ ] })
1731
+ ] }),
1732
+ step === "form" && selectedType && selectedSlot && /* @__PURE__ */ jsxs("div", { className: "uptrade-booking-form", children: [
1733
+ /* @__PURE__ */ jsx(
1734
+ "button",
1735
+ {
1736
+ className: "uptrade-booking-back",
1737
+ onClick: () => setStep("datetime"),
1738
+ children: "\u2190 Back"
1739
+ }
1740
+ ),
1741
+ /* @__PURE__ */ jsx("h3", { className: "uptrade-booking-title", children: "Your Information" }),
1742
+ /* @__PURE__ */ jsxs("p", { className: "uptrade-booking-subtitle", children: [
1743
+ selectedType.name,
1744
+ " on ",
1745
+ formatDate2(selectedSlot.start, timezone),
1746
+ " at ",
1747
+ formatTime(selectedSlot.start, timezone)
1748
+ ] }),
1749
+ hold && /* @__PURE__ */ jsxs("p", { className: "uptrade-booking-hold-notice", children: [
1750
+ "This time is held for you for ",
1751
+ Math.floor((new Date(hold.expiresAt).getTime() - Date.now()) / 6e4),
1752
+ " minutes"
1753
+ ] }),
1754
+ /* @__PURE__ */ jsxs("form", { onSubmit: handleBookingSubmit, children: [
1755
+ /* @__PURE__ */ jsxs("div", { className: "uptrade-booking-field", children: [
1756
+ /* @__PURE__ */ jsx("label", { htmlFor: "guest-name", children: "Name *" }),
1757
+ /* @__PURE__ */ jsx(
1758
+ "input",
1759
+ {
1760
+ id: "guest-name",
1761
+ type: "text",
1762
+ required: true,
1763
+ value: guestInfo.name,
1764
+ onChange: (e) => setGuestInfo((prev) => ({ ...prev, name: e.target.value })),
1765
+ placeholder: "Your full name"
1766
+ }
1767
+ )
1768
+ ] }),
1769
+ /* @__PURE__ */ jsxs("div", { className: "uptrade-booking-field", children: [
1770
+ /* @__PURE__ */ jsx("label", { htmlFor: "guest-email", children: "Email *" }),
1771
+ /* @__PURE__ */ jsx(
1772
+ "input",
1773
+ {
1774
+ id: "guest-email",
1775
+ type: "email",
1776
+ required: true,
1777
+ value: guestInfo.email,
1778
+ onChange: (e) => setGuestInfo((prev) => ({ ...prev, email: e.target.value })),
1779
+ placeholder: "your@email.com"
1780
+ }
1781
+ )
1782
+ ] }),
1783
+ /* @__PURE__ */ jsxs("div", { className: "uptrade-booking-field", children: [
1784
+ /* @__PURE__ */ jsx("label", { htmlFor: "guest-phone", children: "Phone" }),
1785
+ /* @__PURE__ */ jsx(
1786
+ "input",
1787
+ {
1788
+ id: "guest-phone",
1789
+ type: "tel",
1790
+ value: guestInfo.phone || "",
1791
+ onChange: (e) => setGuestInfo((prev) => ({ ...prev, phone: e.target.value })),
1792
+ placeholder: "(555) 123-4567"
1793
+ }
1794
+ )
1795
+ ] }),
1796
+ /* @__PURE__ */ jsxs("div", { className: "uptrade-booking-field", children: [
1797
+ /* @__PURE__ */ jsx("label", { htmlFor: "guest-notes", children: "Additional Notes" }),
1798
+ /* @__PURE__ */ jsx(
1799
+ "textarea",
1800
+ {
1801
+ id: "guest-notes",
1802
+ value: guestInfo.notes || "",
1803
+ onChange: (e) => setGuestInfo((prev) => ({ ...prev, notes: e.target.value })),
1804
+ placeholder: "Anything you'd like us to know...",
1805
+ rows: 3
1806
+ }
1807
+ )
1808
+ ] }),
1809
+ /* @__PURE__ */ jsx(
1810
+ "button",
1811
+ {
1812
+ type: "submit",
1813
+ className: "uptrade-booking-submit",
1814
+ disabled: loading,
1815
+ children: loading ? "Booking..." : "Confirm Booking"
1816
+ }
1817
+ )
1818
+ ] })
1819
+ ] }),
1820
+ step === "success" && bookingResult && /* @__PURE__ */ jsxs("div", { className: "uptrade-booking-success", children: [
1821
+ /* @__PURE__ */ jsx("div", { className: "uptrade-booking-success-icon", children: "\u2713" }),
1822
+ /* @__PURE__ */ jsx("h3", { className: "uptrade-booking-title", children: "Booking Confirmed!" }),
1823
+ /* @__PURE__ */ jsxs("p", { className: "uptrade-booking-confirmation-code", children: [
1824
+ "Confirmation: ",
1825
+ bookingResult.booking.confirmationCode
1826
+ ] }),
1827
+ /* @__PURE__ */ jsxs("div", { className: "uptrade-booking-details", children: [
1828
+ /* @__PURE__ */ jsxs("p", { children: [
1829
+ /* @__PURE__ */ jsx("strong", { children: "When:" }),
1830
+ " ",
1831
+ formatDate2(bookingResult.booking.scheduledAt, timezone),
1832
+ " at ",
1833
+ formatTime(bookingResult.booking.scheduledAt, timezone)
1834
+ ] }),
1835
+ /* @__PURE__ */ jsxs("p", { children: [
1836
+ /* @__PURE__ */ jsx("strong", { children: "Duration:" }),
1837
+ " ",
1838
+ formatDuration(bookingResult.booking.durationMinutes)
1839
+ ] }),
1840
+ bookingResult.booking.hostName && /* @__PURE__ */ jsxs("p", { children: [
1841
+ /* @__PURE__ */ jsx("strong", { children: "With:" }),
1842
+ " ",
1843
+ bookingResult.booking.hostName
1844
+ ] })
1845
+ ] }),
1846
+ /* @__PURE__ */ jsxs("div", { className: "uptrade-booking-calendar-links", children: [
1847
+ /* @__PURE__ */ jsx("p", { children: "Add to calendar:" }),
1848
+ /* @__PURE__ */ jsxs("div", { className: "uptrade-booking-calendar-buttons", children: [
1849
+ /* @__PURE__ */ jsx(
1850
+ "a",
1851
+ {
1852
+ href: bookingResult.calendarLinks.google,
1853
+ target: "_blank",
1854
+ rel: "noopener noreferrer",
1855
+ className: "uptrade-booking-calendar-btn",
1856
+ children: "Google"
1857
+ }
1858
+ ),
1859
+ /* @__PURE__ */ jsx(
1860
+ "a",
1861
+ {
1862
+ href: bookingResult.calendarLinks.outlook,
1863
+ target: "_blank",
1864
+ rel: "noopener noreferrer",
1865
+ className: "uptrade-booking-calendar-btn",
1866
+ children: "Outlook"
1867
+ }
1868
+ ),
1869
+ /* @__PURE__ */ jsx(
1870
+ "a",
1871
+ {
1872
+ href: bookingResult.calendarLinks.ics,
1873
+ download: true,
1874
+ className: "uptrade-booking-calendar-btn",
1875
+ children: "Download .ics"
1876
+ }
1877
+ )
1878
+ ] })
1879
+ ] }),
1880
+ /* @__PURE__ */ jsx("p", { className: "uptrade-booking-email-notice", children: "A confirmation email has been sent to your email address." })
1881
+ ] }),
1882
+ /* @__PURE__ */ jsx("style", { children: `
1883
+ .uptrade-booking-widget {
1884
+ font-family: var(--booking-font);
1885
+ max-width: 480px;
1886
+ margin: 0 auto;
1887
+ padding: 24px;
1888
+ border: 1px solid #e5e5e5;
1889
+ border-radius: var(--booking-radius);
1890
+ background: #fff;
1891
+ }
1892
+
1893
+ .uptrade-booking-error {
1894
+ background: #fef2f2;
1895
+ border: 1px solid #fecaca;
1896
+ color: #b91c1c;
1897
+ padding: 12px;
1898
+ border-radius: var(--booking-radius);
1899
+ margin-bottom: 16px;
1900
+ display: flex;
1901
+ justify-content: space-between;
1902
+ align-items: center;
1903
+ }
1904
+
1905
+ .uptrade-booking-error button {
1906
+ background: none;
1907
+ border: none;
1908
+ color: inherit;
1909
+ cursor: pointer;
1910
+ text-decoration: underline;
1911
+ }
1912
+
1913
+ .uptrade-booking-title {
1914
+ font-size: 1.25rem;
1915
+ font-weight: 600;
1916
+ margin: 0 0 8px 0;
1917
+ }
1918
+
1919
+ .uptrade-booking-subtitle {
1920
+ color: #666;
1921
+ margin: 0 0 16px 0;
1922
+ }
1923
+
1924
+ .uptrade-booking-back {
1925
+ background: none;
1926
+ border: none;
1927
+ color: var(--booking-primary);
1928
+ cursor: pointer;
1929
+ padding: 0;
1930
+ margin-bottom: 16px;
1931
+ font-size: 0.875rem;
1932
+ }
1933
+
1934
+ .uptrade-booking-back:disabled {
1935
+ display: none;
1936
+ }
1937
+
1938
+ .uptrade-booking-type-list {
1939
+ display: flex;
1940
+ flex-direction: column;
1941
+ gap: 12px;
1942
+ }
1943
+
1944
+ .uptrade-booking-type-card {
1945
+ text-align: left;
1946
+ padding: 16px;
1947
+ border: 1px solid #e5e5e5;
1948
+ border-radius: var(--booking-radius);
1949
+ background: #fff;
1950
+ cursor: pointer;
1951
+ transition: border-color 0.2s, box-shadow 0.2s;
1952
+ }
1953
+
1954
+ .uptrade-booking-type-card:hover {
1955
+ border-color: var(--booking-primary);
1956
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--booking-primary) 15%, transparent);
1957
+ }
1958
+
1959
+ .uptrade-booking-type-name {
1960
+ font-weight: 600;
1961
+ margin-bottom: 4px;
1962
+ }
1963
+
1964
+ .uptrade-booking-type-desc {
1965
+ color: #666;
1966
+ font-size: 0.875rem;
1967
+ margin-bottom: 8px;
1968
+ }
1969
+
1970
+ .uptrade-booking-type-meta {
1971
+ display: flex;
1972
+ gap: 12px;
1973
+ font-size: 0.75rem;
1974
+ color: #888;
1975
+ }
1976
+
1977
+ .uptrade-booking-date-grid {
1978
+ display: flex;
1979
+ gap: 8px;
1980
+ flex-wrap: wrap;
1981
+ margin-bottom: 24px;
1982
+ }
1983
+
1984
+ .uptrade-booking-date {
1985
+ display: flex;
1986
+ flex-direction: column;
1987
+ align-items: center;
1988
+ padding: 8px 12px;
1989
+ border: 1px solid #e5e5e5;
1990
+ border-radius: var(--booking-radius);
1991
+ background: #fff;
1992
+ cursor: pointer;
1993
+ transition: all 0.2s;
1994
+ }
1995
+
1996
+ .uptrade-booking-date:hover {
1997
+ border-color: var(--booking-primary);
1998
+ }
1999
+
2000
+ .uptrade-booking-date.selected {
2001
+ background: var(--booking-primary);
2002
+ border-color: var(--booking-primary);
2003
+ color: #fff;
2004
+ }
2005
+
2006
+ .uptrade-booking-date-day {
2007
+ font-size: 0.625rem;
2008
+ text-transform: uppercase;
2009
+ }
2010
+
2011
+ .uptrade-booking-date-num {
2012
+ font-size: 1.125rem;
2013
+ font-weight: 600;
2014
+ }
2015
+
2016
+ .uptrade-booking-time-grid {
2017
+ display: grid;
2018
+ grid-template-columns: repeat(3, 1fr);
2019
+ gap: 8px;
2020
+ }
2021
+
2022
+ .uptrade-booking-time {
2023
+ padding: 10px;
2024
+ border: 1px solid #e5e5e5;
2025
+ border-radius: var(--booking-radius);
2026
+ background: #fff;
2027
+ cursor: pointer;
2028
+ font-size: 0.875rem;
2029
+ transition: all 0.2s;
2030
+ }
2031
+
2032
+ .uptrade-booking-time:hover:not(:disabled) {
2033
+ border-color: var(--booking-primary);
2034
+ }
2035
+
2036
+ .uptrade-booking-time.selected {
2037
+ background: var(--booking-primary);
2038
+ border-color: var(--booking-primary);
2039
+ color: #fff;
2040
+ }
2041
+
2042
+ .uptrade-booking-time:disabled {
2043
+ opacity: 0.5;
2044
+ cursor: not-allowed;
2045
+ }
2046
+
2047
+ .uptrade-booking-loading,
2048
+ .uptrade-booking-empty {
2049
+ text-align: center;
2050
+ padding: 24px;
2051
+ color: #666;
2052
+ }
2053
+
2054
+ .uptrade-booking-hold-notice {
2055
+ background: #fef3c7;
2056
+ border: 1px solid #fcd34d;
2057
+ color: #92400e;
2058
+ padding: 8px 12px;
2059
+ border-radius: var(--booking-radius);
2060
+ font-size: 0.875rem;
2061
+ margin-bottom: 16px;
2062
+ }
2063
+
2064
+ .uptrade-booking-field {
2065
+ margin-bottom: 16px;
2066
+ }
2067
+
2068
+ .uptrade-booking-field label {
2069
+ display: block;
2070
+ margin-bottom: 4px;
2071
+ font-size: 0.875rem;
2072
+ font-weight: 500;
2073
+ }
2074
+
2075
+ .uptrade-booking-field input,
2076
+ .uptrade-booking-field textarea {
2077
+ width: 100%;
2078
+ padding: 10px 12px;
2079
+ border: 1px solid #e5e5e5;
2080
+ border-radius: var(--booking-radius);
2081
+ font-size: 1rem;
2082
+ font-family: inherit;
2083
+ }
2084
+
2085
+ .uptrade-booking-field input:focus,
2086
+ .uptrade-booking-field textarea:focus {
2087
+ outline: none;
2088
+ border-color: var(--booking-primary);
2089
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--booking-primary) 15%, transparent);
2090
+ }
2091
+
2092
+ .uptrade-booking-submit {
2093
+ width: 100%;
2094
+ padding: 14px;
2095
+ background: var(--booking-primary);
2096
+ color: #fff;
2097
+ border: none;
2098
+ border-radius: var(--booking-radius);
2099
+ font-size: 1rem;
2100
+ font-weight: 600;
2101
+ cursor: pointer;
2102
+ transition: opacity 0.2s;
2103
+ }
2104
+
2105
+ .uptrade-booking-submit:hover:not(:disabled) {
2106
+ opacity: 0.9;
2107
+ }
2108
+
2109
+ .uptrade-booking-submit:disabled {
2110
+ opacity: 0.5;
2111
+ cursor: not-allowed;
2112
+ }
2113
+
2114
+ .uptrade-booking-success {
2115
+ text-align: center;
2116
+ }
2117
+
2118
+ .uptrade-booking-success-icon {
2119
+ width: 64px;
2120
+ height: 64px;
2121
+ margin: 0 auto 16px;
2122
+ background: var(--booking-primary);
2123
+ color: #fff;
2124
+ border-radius: 50%;
2125
+ display: flex;
2126
+ align-items: center;
2127
+ justify-content: center;
2128
+ font-size: 2rem;
2129
+ }
2130
+
2131
+ .uptrade-booking-confirmation-code {
2132
+ font-family: monospace;
2133
+ background: #f5f5f5;
2134
+ padding: 8px 16px;
2135
+ border-radius: var(--booking-radius);
2136
+ display: inline-block;
2137
+ margin-bottom: 24px;
2138
+ }
2139
+
2140
+ .uptrade-booking-details {
2141
+ text-align: left;
2142
+ background: #f9f9f9;
2143
+ padding: 16px;
2144
+ border-radius: var(--booking-radius);
2145
+ margin-bottom: 24px;
2146
+ }
2147
+
2148
+ .uptrade-booking-details p {
2149
+ margin: 0 0 8px 0;
2150
+ }
2151
+
2152
+ .uptrade-booking-details p:last-child {
2153
+ margin-bottom: 0;
2154
+ }
2155
+
2156
+ .uptrade-booking-calendar-links {
2157
+ margin-bottom: 24px;
2158
+ }
2159
+
2160
+ .uptrade-booking-calendar-buttons {
2161
+ display: flex;
2162
+ gap: 8px;
2163
+ justify-content: center;
2164
+ margin-top: 8px;
2165
+ }
2166
+
2167
+ .uptrade-booking-calendar-btn {
2168
+ padding: 8px 16px;
2169
+ border: 1px solid #e5e5e5;
2170
+ border-radius: var(--booking-radius);
2171
+ text-decoration: none;
2172
+ color: #333;
2173
+ font-size: 0.875rem;
2174
+ transition: all 0.2s;
2175
+ }
2176
+
2177
+ .uptrade-booking-calendar-btn:hover {
2178
+ border-color: var(--booking-primary);
2179
+ color: var(--booking-primary);
2180
+ }
2181
+
2182
+ .uptrade-booking-email-notice {
2183
+ color: #666;
2184
+ font-size: 0.875rem;
2185
+ }
2186
+
2187
+ h4 {
2188
+ font-size: 0.875rem;
2189
+ font-weight: 600;
2190
+ margin: 0 0 12px 0;
2191
+ color: #666;
2192
+ }
2193
+ ` })
2194
+ ]
2195
+ }
2196
+ );
2197
+ }
2198
+
2199
+ export { AffiliateCard, AffiliatesWidget, BookingWidget, ExperimentConversion, SetupAssistant, SignalExperiment, createBooking, createSlotHold, detectTimezone, fetchAffiliates, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate2 as formatBookingDate, formatTime as formatBookingTime, formatDuration, getTrackingUrl, releaseSlotHold, useAffiliates, useExperimentVariant };
1388
2200
  //# sourceMappingURL=index.mjs.map
1389
2201
  //# sourceMappingURL=index.mjs.map