@foxscheduling/shared 0.1.0

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 (260) hide show
  1. package/README.md +56 -0
  2. package/dist/cjs/constants/emailUnsubscribeReasons.cjs +13 -0
  3. package/dist/cjs/constants/emailUnsubscribeReasons.d.ts +4 -0
  4. package/dist/cjs/constants/emailUnsubscribeReasons.d.ts.map +1 -0
  5. package/dist/cjs/index.cjs +24 -0
  6. package/dist/cjs/index.d.ts +9 -0
  7. package/dist/cjs/index.d.ts.map +1 -0
  8. package/dist/cjs/types/db.availability.cjs +12 -0
  9. package/dist/cjs/types/db.availability.d.ts +33 -0
  10. package/dist/cjs/types/db.availability.d.ts.map +1 -0
  11. package/dist/cjs/types/db.booking.cjs +2 -0
  12. package/dist/cjs/types/db.booking.d.ts +101 -0
  13. package/dist/cjs/types/db.booking.d.ts.map +1 -0
  14. package/dist/cjs/types/db.cjs +2 -0
  15. package/dist/cjs/types/db.customers.cjs +2 -0
  16. package/dist/cjs/types/db.customers.d.ts +14 -0
  17. package/dist/cjs/types/db.customers.d.ts.map +1 -0
  18. package/dist/cjs/types/db.d.ts +11 -0
  19. package/dist/cjs/types/db.d.ts.map +1 -0
  20. package/dist/cjs/types/db.directory.cjs +2 -0
  21. package/dist/cjs/types/db.directory.d.ts +38 -0
  22. package/dist/cjs/types/db.directory.d.ts.map +1 -0
  23. package/dist/cjs/types/db.emailFlow.cjs +2 -0
  24. package/dist/cjs/types/db.emailFlow.d.ts +29 -0
  25. package/dist/cjs/types/db.emailFlow.d.ts.map +1 -0
  26. package/dist/cjs/types/db.mcpUserContext.cjs +2 -0
  27. package/dist/cjs/types/db.mcpUserContext.d.ts +29 -0
  28. package/dist/cjs/types/db.mcpUserContext.d.ts.map +1 -0
  29. package/dist/cjs/types/db.notification.cjs +2 -0
  30. package/dist/cjs/types/db.notification.d.ts +27 -0
  31. package/dist/cjs/types/db.notification.d.ts.map +1 -0
  32. package/dist/cjs/types/db.oauth.cjs +2 -0
  33. package/dist/cjs/types/db.oauth.d.ts +55 -0
  34. package/dist/cjs/types/db.oauth.d.ts.map +1 -0
  35. package/dist/cjs/types/db.partnerApiKey.cjs +2 -0
  36. package/dist/cjs/types/db.partnerApiKey.d.ts +15 -0
  37. package/dist/cjs/types/db.partnerApiKey.d.ts.map +1 -0
  38. package/dist/cjs/types/db.paymentPending.cjs +2 -0
  39. package/dist/cjs/types/db.paymentPending.d.ts +16 -0
  40. package/dist/cjs/types/db.paymentPending.d.ts.map +1 -0
  41. package/dist/cjs/types/db.service.cjs +15 -0
  42. package/dist/cjs/types/db.service.d.ts +145 -0
  43. package/dist/cjs/types/db.service.d.ts.map +1 -0
  44. package/dist/cjs/types/db.tax.cjs +2 -0
  45. package/dist/cjs/types/db.tax.d.ts.map +1 -0
  46. package/dist/cjs/types/db.tenant.cjs +2 -0
  47. package/dist/cjs/types/db.tenant.d.ts +118 -0
  48. package/dist/cjs/types/db.tenant.d.ts.map +1 -0
  49. package/dist/cjs/types/db.tenantGroupedStat.cjs +2 -0
  50. package/dist/cjs/types/db.tenantGroupedStat.d.ts +13 -0
  51. package/dist/cjs/types/db.tenantGroupedStat.d.ts.map +1 -0
  52. package/dist/cjs/types/db.user.cjs +7 -0
  53. package/dist/cjs/types/db.user.d.ts +81 -0
  54. package/dist/cjs/types/db.user.d.ts.map +1 -0
  55. package/dist/cjs/types/db.userConfirmation.cjs +2 -0
  56. package/dist/cjs/types/db.userConfirmation.d.ts +17 -0
  57. package/dist/cjs/types/db.userConfirmation.d.ts.map +1 -0
  58. package/dist/cjs/types/db.userLoginSession.cjs +2 -0
  59. package/dist/cjs/types/db.userLoginSession.d.ts +28 -0
  60. package/dist/cjs/types/db.userLoginSession.d.ts.map +1 -0
  61. package/dist/cjs/types/db.webhook.cjs +10 -0
  62. package/dist/cjs/types/db.webhook.d.ts +16 -0
  63. package/dist/cjs/types/db.webhook.d.ts.map +1 -0
  64. package/dist/cjs/types/discover.cjs +2 -0
  65. package/dist/cjs/types/discover.d.ts +45 -0
  66. package/dist/cjs/types/discover.d.ts.map +1 -0
  67. package/dist/cjs/types/errorCodes.cjs +150 -0
  68. package/dist/cjs/types/errorCodes.d.ts +147 -0
  69. package/dist/cjs/types/errorCodes.d.ts.map +1 -0
  70. package/dist/cjs/types/index.cjs +44 -0
  71. package/dist/cjs/types/index.d.ts +84 -0
  72. package/dist/cjs/types/index.d.ts.map +1 -0
  73. package/dist/cjs/types/oauthScopes.cjs +33 -0
  74. package/dist/cjs/types/oauthScopes.d.ts +7 -0
  75. package/dist/cjs/types/oauthScopes.d.ts.map +1 -0
  76. package/dist/cjs/types/partnerDto.cjs +2 -0
  77. package/dist/cjs/types/partnerDto.d.ts +69 -0
  78. package/dist/cjs/types/partnerDto.d.ts.map +1 -0
  79. package/dist/cjs/types/pricing.cjs +2 -0
  80. package/dist/cjs/types/pricing.d.ts +31 -0
  81. package/dist/cjs/types/pricing.d.ts.map +1 -0
  82. package/dist/cjs/types/requestResponse.cjs +2 -0
  83. package/dist/cjs/types/requestResponse.d.ts +93 -0
  84. package/dist/cjs/types/requestResponse.d.ts.map +1 -0
  85. package/dist/cjs/types/subscription.cjs +2 -0
  86. package/dist/cjs/types/subscription.d.ts +50 -0
  87. package/dist/cjs/types/subscription.d.ts.map +1 -0
  88. package/dist/cjs/utils/bookingEmbed.cjs +178 -0
  89. package/dist/cjs/utils/bookingEmbed.d.ts +61 -0
  90. package/dist/cjs/utils/bookingEmbed.d.ts.map +1 -0
  91. package/dist/cjs/utils/bookingPageIcons.cjs +218 -0
  92. package/dist/cjs/utils/bookingPageIcons.d.ts +160 -0
  93. package/dist/cjs/utils/bookingPageIcons.d.ts.map +1 -0
  94. package/dist/cjs/utils/bookingProviders.cjs +27 -0
  95. package/dist/cjs/utils/bookingProviders.d.ts +25 -0
  96. package/dist/cjs/utils/bookingProviders.d.ts.map +1 -0
  97. package/dist/cjs/utils/currencies.cjs +148 -0
  98. package/dist/cjs/utils/currencies.d.ts +6 -0
  99. package/dist/cjs/utils/currencies.d.ts.map +1 -0
  100. package/dist/cjs/utils/dateTime.cjs +192 -0
  101. package/dist/cjs/utils/dateTime.d.ts +57 -0
  102. package/dist/cjs/utils/dateTime.d.ts.map +1 -0
  103. package/dist/cjs/utils/embedFrameLoader.cjs +76 -0
  104. package/dist/cjs/utils/embedFrameLoader.d.ts +15 -0
  105. package/dist/cjs/utils/embedFrameLoader.d.ts.map +1 -0
  106. package/dist/cjs/utils/extensionToContentType.cjs +24 -0
  107. package/dist/cjs/utils/extensionToContentType.d.ts +21 -0
  108. package/dist/cjs/utils/extensionToContentType.d.ts.map +1 -0
  109. package/dist/cjs/utils/generateUsername.cjs +7 -0
  110. package/dist/cjs/utils/generateUsername.d.ts.map +1 -0
  111. package/dist/cjs/utils/index.cjs +65 -0
  112. package/dist/cjs/utils/index.d.ts +26 -0
  113. package/dist/cjs/utils/index.d.ts.map +1 -0
  114. package/dist/cjs/utils/random.cjs +13 -0
  115. package/dist/cjs/utils/random.d.ts +3 -0
  116. package/dist/cjs/utils/random.d.ts.map +1 -0
  117. package/dist/cjs/utils/serviceReminderLabels.cjs +22 -0
  118. package/dist/cjs/utils/serviceReminderLabels.d.ts +5 -0
  119. package/dist/cjs/utils/serviceReminderLabels.d.ts.map +1 -0
  120. package/dist/cjs/utils/tenantSlug.cjs +299 -0
  121. package/dist/cjs/utils/tenantSlug.d.ts +7 -0
  122. package/dist/cjs/utils/tenantSlug.d.ts.map +1 -0
  123. package/dist/cjs/utils/textSlug.cjs +14 -0
  124. package/dist/cjs/utils/textSlug.d.ts +3 -0
  125. package/dist/cjs/utils/textSlug.d.ts.map +1 -0
  126. package/dist/cjs/utils/timezone.cjs +96 -0
  127. package/dist/cjs/utils/timezone.d.ts +2 -0
  128. package/dist/cjs/utils/timezone.d.ts.map +1 -0
  129. package/dist/cjs/utils/ucfirst.cjs +9 -0
  130. package/dist/cjs/utils/ucfirst.d.ts +2 -0
  131. package/dist/cjs/utils/ucfirst.d.ts.map +1 -0
  132. package/dist/constants/emailUnsubscribeReasons.d.ts +4 -0
  133. package/dist/constants/emailUnsubscribeReasons.d.ts.map +1 -0
  134. package/dist/constants/emailUnsubscribeReasons.js +10 -0
  135. package/dist/index.d.ts +9 -0
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +8 -0
  138. package/dist/types/db.availability.d.ts +33 -0
  139. package/dist/types/db.availability.d.ts.map +1 -0
  140. package/dist/types/db.availability.js +9 -0
  141. package/dist/types/db.booking.d.ts +101 -0
  142. package/dist/types/db.booking.d.ts.map +1 -0
  143. package/dist/types/db.booking.js +1 -0
  144. package/dist/types/db.customers.d.ts +14 -0
  145. package/dist/types/db.customers.d.ts.map +1 -0
  146. package/dist/types/db.customers.js +1 -0
  147. package/dist/types/db.d.ts +11 -0
  148. package/dist/types/db.d.ts.map +1 -0
  149. package/dist/types/db.directory.d.ts +38 -0
  150. package/dist/types/db.directory.d.ts.map +1 -0
  151. package/dist/types/db.directory.js +1 -0
  152. package/dist/types/db.emailFlow.d.ts +29 -0
  153. package/dist/types/db.emailFlow.d.ts.map +1 -0
  154. package/dist/types/db.emailFlow.js +1 -0
  155. package/dist/types/db.js +1 -0
  156. package/dist/types/db.mcpUserContext.d.ts +29 -0
  157. package/dist/types/db.mcpUserContext.d.ts.map +1 -0
  158. package/dist/types/db.mcpUserContext.js +1 -0
  159. package/dist/types/db.notification.d.ts +27 -0
  160. package/dist/types/db.notification.d.ts.map +1 -0
  161. package/dist/types/db.notification.js +1 -0
  162. package/dist/types/db.oauth.d.ts +55 -0
  163. package/dist/types/db.oauth.d.ts.map +1 -0
  164. package/dist/types/db.oauth.js +1 -0
  165. package/dist/types/db.partnerApiKey.d.ts +15 -0
  166. package/dist/types/db.partnerApiKey.d.ts.map +1 -0
  167. package/dist/types/db.partnerApiKey.js +1 -0
  168. package/dist/types/db.paymentPending.d.ts +16 -0
  169. package/dist/types/db.paymentPending.d.ts.map +1 -0
  170. package/dist/types/db.paymentPending.js +1 -0
  171. package/dist/types/db.service.d.ts +145 -0
  172. package/dist/types/db.service.d.ts.map +1 -0
  173. package/dist/types/db.service.js +12 -0
  174. package/dist/types/db.tax.d.ts.map +1 -0
  175. package/dist/types/db.tenant.d.ts +118 -0
  176. package/dist/types/db.tenant.d.ts.map +1 -0
  177. package/dist/types/db.tenant.js +1 -0
  178. package/dist/types/db.tenantGroupedStat.d.ts +13 -0
  179. package/dist/types/db.tenantGroupedStat.d.ts.map +1 -0
  180. package/dist/types/db.tenantGroupedStat.js +1 -0
  181. package/dist/types/db.user.d.ts +81 -0
  182. package/dist/types/db.user.d.ts.map +1 -0
  183. package/dist/types/db.user.js +4 -0
  184. package/dist/types/db.userConfirmation.d.ts +17 -0
  185. package/dist/types/db.userConfirmation.d.ts.map +1 -0
  186. package/dist/types/db.userConfirmation.js +1 -0
  187. package/dist/types/db.userLoginSession.d.ts +28 -0
  188. package/dist/types/db.userLoginSession.d.ts.map +1 -0
  189. package/dist/types/db.userLoginSession.js +1 -0
  190. package/dist/types/db.webhook.d.ts +16 -0
  191. package/dist/types/db.webhook.d.ts.map +1 -0
  192. package/dist/types/db.webhook.js +7 -0
  193. package/dist/types/discover.d.ts +45 -0
  194. package/dist/types/discover.d.ts.map +1 -0
  195. package/dist/types/discover.js +1 -0
  196. package/dist/types/errorCodes.d.ts +147 -0
  197. package/dist/types/errorCodes.d.ts.map +1 -0
  198. package/dist/types/errorCodes.js +147 -0
  199. package/dist/types/index.d.ts +84 -0
  200. package/dist/types/index.d.ts.map +1 -0
  201. package/dist/types/index.js +28 -0
  202. package/dist/types/oauthScopes.d.ts +7 -0
  203. package/dist/types/oauthScopes.d.ts.map +1 -0
  204. package/dist/types/oauthScopes.js +28 -0
  205. package/dist/types/partnerDto.d.ts +69 -0
  206. package/dist/types/partnerDto.d.ts.map +1 -0
  207. package/dist/types/partnerDto.js +1 -0
  208. package/dist/types/pricing.d.ts +31 -0
  209. package/dist/types/pricing.d.ts.map +1 -0
  210. package/dist/types/pricing.js +1 -0
  211. package/dist/types/requestResponse.d.ts +93 -0
  212. package/dist/types/requestResponse.d.ts.map +1 -0
  213. package/dist/types/requestResponse.js +1 -0
  214. package/dist/types/subscription.d.ts +50 -0
  215. package/dist/types/subscription.d.ts.map +1 -0
  216. package/dist/types/subscription.js +1 -0
  217. package/dist/utils/bookingEmbed.d.ts +61 -0
  218. package/dist/utils/bookingEmbed.d.ts.map +1 -0
  219. package/dist/utils/bookingEmbed.js +161 -0
  220. package/dist/utils/bookingPageIcons.d.ts +160 -0
  221. package/dist/utils/bookingPageIcons.d.ts.map +1 -0
  222. package/dist/utils/bookingPageIcons.js +214 -0
  223. package/dist/utils/bookingProviders.d.ts +25 -0
  224. package/dist/utils/bookingProviders.d.ts.map +1 -0
  225. package/dist/utils/bookingProviders.js +23 -0
  226. package/dist/utils/currencies.d.ts +6 -0
  227. package/dist/utils/currencies.d.ts.map +1 -0
  228. package/dist/utils/currencies.js +145 -0
  229. package/dist/utils/dateTime.d.ts +57 -0
  230. package/dist/utils/dateTime.d.ts.map +1 -0
  231. package/dist/utils/dateTime.js +150 -0
  232. package/dist/utils/embedFrameLoader.d.ts +15 -0
  233. package/dist/utils/embedFrameLoader.d.ts.map +1 -0
  234. package/dist/utils/embedFrameLoader.js +70 -0
  235. package/dist/utils/extensionToContentType.d.ts +21 -0
  236. package/dist/utils/extensionToContentType.d.ts.map +1 -0
  237. package/dist/utils/extensionToContentType.js +20 -0
  238. package/dist/utils/generateUsername.d.ts.map +1 -0
  239. package/dist/utils/index.d.ts +26 -0
  240. package/dist/utils/index.d.ts.map +1 -0
  241. package/dist/utils/index.js +45 -0
  242. package/dist/utils/random.d.ts +3 -0
  243. package/dist/utils/random.d.ts.map +1 -0
  244. package/dist/utils/random.js +8 -0
  245. package/dist/utils/serviceReminderLabels.d.ts +5 -0
  246. package/dist/utils/serviceReminderLabels.d.ts.map +1 -0
  247. package/dist/utils/serviceReminderLabels.js +18 -0
  248. package/dist/utils/tenantSlug.d.ts +7 -0
  249. package/dist/utils/tenantSlug.d.ts.map +1 -0
  250. package/dist/utils/tenantSlug.js +293 -0
  251. package/dist/utils/textSlug.d.ts +3 -0
  252. package/dist/utils/textSlug.d.ts.map +1 -0
  253. package/dist/utils/textSlug.js +10 -0
  254. package/dist/utils/timezone.d.ts +2 -0
  255. package/dist/utils/timezone.d.ts.map +1 -0
  256. package/dist/utils/timezone.js +93 -0
  257. package/dist/utils/ucfirst.d.ts +2 -0
  258. package/dist/utils/ucfirst.d.ts.map +1 -0
  259. package/dist/utils/ucfirst.js +5 -0
  260. package/package.json +46 -0
@@ -0,0 +1,93 @@
1
+ import { DurationUnit, Service } from "./db.service.js";
2
+ import { Staff } from "./db.user.js";
3
+ import { Directory } from "./db.directory.js";
4
+ import { Notification } from "./db.notification.js";
5
+ export type ResponseStatusMessages = "SUCCESS" | "ERROR";
6
+ export interface RequestResponse<T> {
7
+ data: T;
8
+ statusMessage: ResponseStatusMessages;
9
+ }
10
+ export type AuthCodeResponseType = "WAIT" | "SENT";
11
+ export interface AvailabilityDay {
12
+ label: string;
13
+ date: string;
14
+ available: boolean;
15
+ }
16
+ export interface ServiceLookupResponse {
17
+ service: Service;
18
+ availability: {
19
+ days: AvailabilityDay[];
20
+ };
21
+ tenant: {
22
+ name: string;
23
+ logoUrl: string;
24
+ timezone: string;
25
+ id: string;
26
+ };
27
+ }
28
+ export type DaySlotsResponse = {
29
+ tenantId: string;
30
+ serviceId: string;
31
+ date: string;
32
+ timezone: string;
33
+ timezones: string[];
34
+ schedule: {
35
+ isOpen: boolean;
36
+ openWindows: Array<{
37
+ start: string;
38
+ end: string;
39
+ }>;
40
+ };
41
+ slotConfig: {
42
+ duration: number;
43
+ durationUnit: DurationUnit;
44
+ };
45
+ slots: Array<{
46
+ id: string;
47
+ start: string;
48
+ end: string;
49
+ label: string;
50
+ /** Canonical UTC start time (stable across timezone views) */
51
+ canonicalStartUtc?: string;
52
+ available: boolean;
53
+ reason?: "booked" | "buffer" | "closed" | "max_per_day_reached" | "past" | "staff_unavailable" | "too_far_in_advance" | "too_soon";
54
+ /** When service allows staff picking, lists staffs available for this slot */
55
+ availableStaffs: Staff[];
56
+ /** For group bookings: how many participants already booked for this exact slot (and provider, when applicable). */
57
+ bookedCount?: number;
58
+ /** For group bookings: max participants allowed for this slot (capacity). */
59
+ maxParticipants?: number;
60
+ /** For group bookings: maxParticipants - bookedCount. */
61
+ remainingSeats?: number;
62
+ /** For group bookings with provider selection: remaining seats per provider for this exact slot. */
63
+ remainingSeatsByStaffId?: Record<string, number>;
64
+ /** For group bookings with provider selection: booked count per provider for this exact slot. */
65
+ bookedCountByStaffId?: Record<string, number>;
66
+ }>;
67
+ warnings?: Array<{
68
+ code: "CLOSED" | "MAX_PER_DAY_REACHED" | "NO_SLOTS" | "INVALID_DATE" | "SERVICE_NOT_BOOKABLE";
69
+ message: string;
70
+ }>;
71
+ };
72
+ export interface DirectoryListItem {
73
+ id?: string;
74
+ tenantId: string;
75
+ serviceId: string;
76
+ createdAt?: string;
77
+ data: Directory["data"];
78
+ }
79
+ export interface DirectoryListResponse {
80
+ page: number;
81
+ pageSize: number;
82
+ total: number;
83
+ items: DirectoryListItem[];
84
+ }
85
+ export type { DiscoverItem, DiscoverResponse, DiscoverSort, DiscoverLocationFilter } from "./discover.js";
86
+ export interface NotificationListResponse {
87
+ page: number;
88
+ pageSize: number;
89
+ total: number;
90
+ items: Notification[];
91
+ unreadCount?: number;
92
+ }
93
+ //# sourceMappingURL=requestResponse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestResponse.d.ts","sourceRoot":"","sources":["../../src/types/requestResponse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,50 @@
1
+ export type SubscriptionTypes = "free" | "starter" | "teams" | "enterprise";
2
+ export interface Subscription {
3
+ rank: number;
4
+ prices: {
5
+ monthly: number;
6
+ yearly: number;
7
+ };
8
+ /**
9
+ * Number of seats/users in the subscription per business
10
+ */
11
+ seats: number;
12
+ /**
13
+ * Whether the subscription includes payment processing
14
+ */
15
+ payment: boolean;
16
+ /**
17
+ * Whether the system should show Powered by FoxScheduling branding
18
+ */
19
+ branding: boolean;
20
+ /**
21
+ * Number of services in the subscription per business
22
+ */
23
+ services: number;
24
+ /**
25
+ * Number of calendars/availability group in the subscription per business
26
+ */
27
+ calendars: number;
28
+ /**
29
+ * Number of businesses in the subscription
30
+ */
31
+ businesses: number;
32
+ /**
33
+ * Number of bookings per month
34
+ */
35
+ bookingsPerMonth: number;
36
+ /**
37
+ * Number of AI calls per day
38
+ */
39
+ aiCallsPerDay: number;
40
+ /**
41
+ * Whether the subscription includes services to be listed in directories
42
+ */
43
+ servicesToDirectories: boolean;
44
+ /**
45
+ * Max configurable email flow templates per business (all flow types combined)
46
+ */
47
+ emailFlows: number;
48
+ type: SubscriptionTypes;
49
+ }
50
+ //# sourceMappingURL=subscription.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/types/subscription.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,YAAY,CAAC;AAC5E,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAClB,CAAC;IACF;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,qBAAqB,EAAE,OAAO,CAAC;IAC/B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,iBAAiB,CAAC;CAC3B"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Booking page embed URL and snippet builders (iframe + popup widget).
3
+ * Used by dashboard UI and the hosted embed.js loader.
4
+ */
5
+ export { EMBED_FRAME_DEFAULT_HEIGHT_PX, EMBED_FRAME_LOAD_TIMEOUT_MS, EMBED_FRAME_LOADER_CLASS, EMBED_FRAME_LOADER_LABEL, EMBED_FRAME_WRAP_CLASS, getEmbedFrameLoaderCss, getEmbedFrameLoaderHtml, } from "./embedFrameLoader.js";
6
+ export type BookingEmbedTheme = "light" | "dark" | "auto";
7
+ export type BookingEmbedOptions = {
8
+ hidePageDetails?: boolean;
9
+ showBackLink?: boolean;
10
+ showThemeToggle?: boolean;
11
+ theme?: BookingEmbedTheme;
12
+ };
13
+ /** Popup widget max width on large viewports (full width on small phones). */
14
+ export declare const EMBED_MODAL_DEFAULT_MAX_WIDTH_PX = 1150;
15
+ export declare const EMBED_MODAL_MAX_WIDTH_CAP_PX = 1400;
16
+ export declare const EMBED_DEFAULT_HIDE_PAGE_DETAILS = false;
17
+ export declare const EMBED_DEFAULT_SHOW_THEME_TOGGLE = true;
18
+ export declare const EMBED_IFRAME_BORDER_RADIUS_PX: Record<string, string>;
19
+ export declare function buildBookingEmbedUrl(baseUrl: string, options?: BookingEmbedOptions): string;
20
+ export declare function resolveBookingEmbedBaseUrl(bookingBaseUrl: string, servicePath?: string): string;
21
+ export declare function buildInlineIframeEmbedCode(embedUrl: string, borderRadiusKey: string, heightPx?: number): string;
22
+ export type WidgetButtonStyle = {
23
+ text: string;
24
+ backgroundColor: string;
25
+ textColor: string;
26
+ borderRadiusPx: number;
27
+ fontSizePx?: number;
28
+ paddingXpx?: number;
29
+ paddingYpx?: number;
30
+ };
31
+ export type WidgetButtonMode = "create" | "existing";
32
+ export type WidgetOpenMode = "popup" | "newTab";
33
+ export type WidgetEmbedConfig = BookingEmbedOptions & {
34
+ scriptOrigin: string;
35
+ bookingBaseUrl: string;
36
+ servicePath?: string;
37
+ /** When `existing`, use `triggerId` and omit injected button styles from the snippet. */
38
+ buttonMode?: WidgetButtonMode;
39
+ /** HTML id of an element on the host page (without #). */
40
+ triggerId?: string;
41
+ /** Popup modal on the same page, or open booking URL in a new browser tab. */
42
+ openMode?: WidgetOpenMode;
43
+ button: WidgetButtonStyle;
44
+ /** Max popup width in px; smaller viewports use available width minus padding. */
45
+ modalMaxWidthPx?: number;
46
+ iframeBorderRadiusPx?: number;
47
+ };
48
+ /** Valid HTML id for data-trigger-id (no # prefix). */
49
+ export declare function isValidWidgetTriggerId(id: string): boolean;
50
+ export declare function escapeHtmlAttribute(value: string): string;
51
+ export declare function buildWidgetScriptSnippet(config: WidgetEmbedConfig): string;
52
+ /** Parse data-* attributes from the embed script tag (hosted embed.js). */
53
+ export declare function parseWidgetConfigFromScriptDataset(dataset: Record<string, string | undefined>): {
54
+ bookingUrl: string;
55
+ triggerId?: string;
56
+ openInNewTab: boolean;
57
+ button: WidgetButtonStyle;
58
+ modalMaxWidthPx: number;
59
+ iframeBorderRadiusPx: number;
60
+ } | null;
61
+ //# sourceMappingURL=bookingEmbed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bookingEmbed.d.ts","sourceRoot":"","sources":["../../src/utils/bookingEmbed.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,EAC3B,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1D,MAAM,MAAM,mBAAmB,GAAG;IAChC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,gCAAgC,OAAO,CAAC;AACrD,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD,eAAO,MAAM,+BAA+B,QAAQ,CAAC;AACrD,eAAO,MAAM,+BAA+B,OAAO,CAAC;AAEpD,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOhE,CAAC;AAKF,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,mBAAwB,GAChC,MAAM,CAiBR;AAED,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAKR;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,QAAQ,GAAE,MAAsC,GAC/C,MAAM,CASR;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAErD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhD,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,GAAG;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yFAAyF;IACzF,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,kFAAkF;IAClF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,uDAAuD;AACvD,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAG1D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKzD;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CA6D1E;AAED,2EAA2E;AAC3E,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAC1C;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;CAC9B,GAAG,IAAI,CA6CP"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Booking page embed URL and snippet builders (iframe + popup widget).
3
+ * Used by dashboard UI and the hosted embed.js loader.
4
+ */
5
+ import { buildEmbedFrameLoadInitScript, EMBED_FRAME_DEFAULT_HEIGHT_PX, EMBED_FRAME_WRAP_CLASS, getEmbedFrameLoaderCss, getEmbedFrameLoaderHtml, } from "./embedFrameLoader.js";
6
+ export { EMBED_FRAME_DEFAULT_HEIGHT_PX, EMBED_FRAME_LOAD_TIMEOUT_MS, EMBED_FRAME_LOADER_CLASS, EMBED_FRAME_LOADER_LABEL, EMBED_FRAME_WRAP_CLASS, getEmbedFrameLoaderCss, getEmbedFrameLoaderHtml, } from "./embedFrameLoader.js";
7
+ /** Popup widget max width on large viewports (full width on small phones). */
8
+ export const EMBED_MODAL_DEFAULT_MAX_WIDTH_PX = 1150;
9
+ export const EMBED_MODAL_MAX_WIDTH_CAP_PX = 1400;
10
+ export const EMBED_DEFAULT_HIDE_PAGE_DETAILS = false;
11
+ export const EMBED_DEFAULT_SHOW_THEME_TOGGLE = true;
12
+ export const EMBED_IFRAME_BORDER_RADIUS_PX = {
13
+ none: "0",
14
+ sm: "4",
15
+ medium: "8",
16
+ lg: "12",
17
+ xl: "16",
18
+ "2xl": "24",
19
+ };
20
+ const IFRAME_SANDBOX = "allow-forms allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox allow-top-navigation-by-user-activation";
21
+ export function buildBookingEmbedUrl(baseUrl, options = {}) {
22
+ const trimmed = baseUrl.trim().replace(/\/+$/, "");
23
+ if (!trimmed)
24
+ return "";
25
+ const params = new URLSearchParams();
26
+ if (options.hidePageDetails)
27
+ params.set("hidePageDetails", "true");
28
+ if (options.showBackLink === false)
29
+ params.set("showBackLink", "false");
30
+ else if (options.showBackLink)
31
+ params.set("showBackLink", "true");
32
+ if (options.showThemeToggle !== undefined) {
33
+ params.set("showThemeToggle", options.showThemeToggle ? "true" : "false");
34
+ }
35
+ if (options.theme && options.theme !== "auto") {
36
+ params.set("theme", options.theme);
37
+ }
38
+ const qs = params.toString();
39
+ return qs ? `${trimmed}?${qs}` : trimmed;
40
+ }
41
+ export function resolveBookingEmbedBaseUrl(bookingBaseUrl, servicePath) {
42
+ const base = bookingBaseUrl.trim().replace(/\/+$/, "");
43
+ if (!servicePath?.trim())
44
+ return base;
45
+ const segment = servicePath.trim().replace(/^\/+/, "");
46
+ return segment ? `${base}/${segment}` : base;
47
+ }
48
+ export function buildInlineIframeEmbedCode(embedUrl, borderRadiusKey, heightPx = EMBED_FRAME_DEFAULT_HEIGHT_PX) {
49
+ const radiusPx = EMBED_IFRAME_BORDER_RADIUS_PX[borderRadiusKey] ?? "8";
50
+ const safeUrl = escapeHtmlAttribute(embedUrl);
51
+ const height = Number.isFinite(heightPx) && heightPx > 0 ? Math.round(heightPx) : EMBED_FRAME_DEFAULT_HEIGHT_PX;
52
+ const wrapperStyle = `position:relative;border-radius:${radiusPx}px;overflow:hidden;min-height:${height}px;`;
53
+ const loaderCss = getEmbedFrameLoaderCss(`.${EMBED_FRAME_WRAP_CLASS}`);
54
+ const loaderHtml = getEmbedFrameLoaderHtml();
55
+ const initScript = buildEmbedFrameLoadInitScript();
56
+ return `<style>${loaderCss}</style><div class="${EMBED_FRAME_WRAP_CLASS}" style="${wrapperStyle}" aria-busy="true">${loaderHtml}<iframe src="${safeUrl}" width="100%" height="${height}" frameborder="0" loading="eager" referrerpolicy="no-referrer-when-downgrade" sandbox="${IFRAME_SANDBOX}" title="Book appointment"></iframe>${initScript}</div>`;
57
+ }
58
+ /** Valid HTML id for data-trigger-id (no # prefix). */
59
+ export function isValidWidgetTriggerId(id) {
60
+ const trimmed = id.trim();
61
+ return /^[A-Za-z][\w-]*$/.test(trimmed) && trimmed.length <= 100;
62
+ }
63
+ export function escapeHtmlAttribute(value) {
64
+ return value
65
+ .replace(/&/g, "&amp;")
66
+ .replace(/"/g, "&quot;")
67
+ .replace(/</g, "&lt;");
68
+ }
69
+ export function buildWidgetScriptSnippet(config) {
70
+ const bookingBase = resolveBookingEmbedBaseUrl(config.bookingBaseUrl, config.servicePath);
71
+ const embedUrl = buildBookingEmbedUrl(bookingBase, {
72
+ hidePageDetails: config.hidePageDetails ?? EMBED_DEFAULT_HIDE_PAGE_DETAILS,
73
+ showBackLink: config.showBackLink ?? true,
74
+ showThemeToggle: config.showThemeToggle ?? EMBED_DEFAULT_SHOW_THEME_TOGGLE,
75
+ theme: config.theme,
76
+ });
77
+ const scriptSrc = `${config.scriptOrigin.replace(/\/+$/, "")}/embed.js`;
78
+ const useExistingButton = config.buttonMode === "existing" &&
79
+ config.triggerId?.trim() &&
80
+ isValidWidgetTriggerId(config.triggerId);
81
+ const attrs = {
82
+ src: scriptSrc,
83
+ async: "",
84
+ "data-booking-url": embedUrl,
85
+ };
86
+ if (useExistingButton) {
87
+ attrs["data-trigger-id"] = config.triggerId.trim();
88
+ }
89
+ else {
90
+ attrs["data-button-text"] = config.button.text;
91
+ attrs["data-button-bg"] = config.button.backgroundColor;
92
+ attrs["data-button-color"] = config.button.textColor;
93
+ attrs["data-button-radius"] = String(config.button.borderRadiusPx);
94
+ if (config.button.fontSizePx != null) {
95
+ attrs["data-button-font-size"] = String(config.button.fontSizePx);
96
+ }
97
+ if (config.button.paddingXpx != null) {
98
+ attrs["data-button-padding-x"] = String(config.button.paddingXpx);
99
+ }
100
+ if (config.button.paddingYpx != null) {
101
+ attrs["data-button-padding-y"] = String(config.button.paddingYpx);
102
+ }
103
+ }
104
+ if (config.openMode === "newTab") {
105
+ attrs["data-open-mode"] = "new-tab";
106
+ }
107
+ else {
108
+ if (config.modalMaxWidthPx != null) {
109
+ attrs["data-modal-max-width"] = String(config.modalMaxWidthPx);
110
+ }
111
+ if (config.iframeBorderRadiusPx != null) {
112
+ attrs["data-iframe-radius"] = String(config.iframeBorderRadiusPx);
113
+ }
114
+ }
115
+ const attrString = Object.entries(attrs)
116
+ .map(([key, value]) => {
117
+ if (value === "")
118
+ return key;
119
+ return `${key}="${escapeHtmlAttribute(value)}"`;
120
+ })
121
+ .join("\n ");
122
+ return `<script\n ${attrString}\n></script>`;
123
+ }
124
+ /** Parse data-* attributes from the embed script tag (hosted embed.js). */
125
+ export function parseWidgetConfigFromScriptDataset(dataset) {
126
+ const bookingUrl = dataset.bookingUrl?.trim();
127
+ if (!bookingUrl)
128
+ return null;
129
+ const triggerRaw = dataset.triggerId?.trim();
130
+ const triggerId = triggerRaw && isValidWidgetTriggerId(triggerRaw) ? triggerRaw : undefined;
131
+ const text = dataset.buttonText?.trim() || "Book now";
132
+ const backgroundColor = dataset.buttonBg?.trim() || "#0ea5e9";
133
+ const textColor = dataset.buttonColor?.trim() || "#ffffff";
134
+ const borderRadiusPx = Number.parseInt(dataset.buttonRadius ?? "8", 10) || 8;
135
+ const fontSizePx = dataset.buttonFontSize
136
+ ? Number.parseInt(dataset.buttonFontSize, 10)
137
+ : undefined;
138
+ const paddingXpx = dataset.buttonPaddingX
139
+ ? Number.parseInt(dataset.buttonPaddingX, 10)
140
+ : undefined;
141
+ const paddingYpx = dataset.buttonPaddingY
142
+ ? Number.parseInt(dataset.buttonPaddingY, 10)
143
+ : undefined;
144
+ const openInNewTab = dataset.openMode === "new-tab";
145
+ return {
146
+ bookingUrl,
147
+ triggerId,
148
+ openInNewTab,
149
+ button: {
150
+ text,
151
+ backgroundColor,
152
+ textColor,
153
+ borderRadiusPx,
154
+ fontSizePx: Number.isFinite(fontSizePx) ? fontSizePx : undefined,
155
+ paddingXpx: Number.isFinite(paddingXpx) ? paddingXpx : undefined,
156
+ paddingYpx: Number.isFinite(paddingYpx) ? paddingYpx : undefined,
157
+ },
158
+ modalMaxWidthPx: Number.parseInt(dataset.modalMaxWidth ?? String(EMBED_MODAL_DEFAULT_MAX_WIDTH_PX), 10) || EMBED_MODAL_DEFAULT_MAX_WIDTH_PX,
159
+ iframeBorderRadiusPx: Number.parseInt(dataset.iframeRadius ?? "12", 10) || 12,
160
+ };
161
+ }
@@ -0,0 +1,160 @@
1
+ export declare const BOOKING_PAGE_ICONS: {
2
+ clock: string;
3
+ "dollar-sign": string;
4
+ "arrow-right": string;
5
+ tag: string;
6
+ scissors: string;
7
+ sparkles: string;
8
+ heart: string;
9
+ star: string;
10
+ palette: string;
11
+ camera: string;
12
+ music: string;
13
+ briefcase: string;
14
+ dumbbell: string;
15
+ car: string;
16
+ home: string;
17
+ utensils: string;
18
+ coffee: string;
19
+ package: string;
20
+ "map-pin": string;
21
+ calendar: string;
22
+ phone: string;
23
+ mail: string;
24
+ video: string;
25
+ stethoscope: string;
26
+ "book-open": string;
27
+ wrench: string;
28
+ gift: string;
29
+ };
30
+ export declare function getServiceIconSvg(iconId?: keyof typeof BOOKING_PAGE_ICONS | null): string;
31
+ export declare const PRESET_ACCENTS: readonly [{
32
+ readonly value: "emerald";
33
+ readonly label: "Emerald";
34
+ readonly class: "from-emerald-500 to-teal-600";
35
+ readonly hoverBorder: "hover:border-emerald-500/50";
36
+ readonly hoverText: "group-hover:text-emerald-500";
37
+ readonly active: "border-emerald-500 bg-emerald-500/10 text-emerald-500";
38
+ readonly proseLink: "[&_a]:text-emerald-500 [&_a:hover]:text-emerald-600";
39
+ readonly link: "text-emerald-500 hover:text-emerald-600";
40
+ }, {
41
+ readonly value: "violet";
42
+ readonly label: "Violet";
43
+ readonly class: "from-violet-500 to-purple-600";
44
+ readonly hoverBorder: "hover:border-violet-500/50";
45
+ readonly hoverText: "group-hover:text-violet-500";
46
+ readonly active: "border-violet-500 bg-violet-500/10 text-violet-500";
47
+ readonly proseLink: "[&_a]:text-violet-500 [&_a:hover]:text-violet-600";
48
+ readonly link: "text-violet-500 hover:text-violet-600";
49
+ }, {
50
+ readonly value: "blue";
51
+ readonly label: "Blue";
52
+ readonly class: "from-blue-500 to-indigo-600";
53
+ readonly hoverBorder: "hover:border-blue-500/50";
54
+ readonly hoverText: "group-hover:text-blue-500";
55
+ readonly active: "border-blue-500 bg-blue-500/10 text-blue-500";
56
+ readonly proseLink: "[&_a]:text-blue-500 [&_a:hover]:text-blue-600";
57
+ readonly link: "text-blue-500 hover:text-blue-600";
58
+ }, {
59
+ readonly value: "cyan";
60
+ readonly label: "Cyan";
61
+ readonly class: "from-cyan-500 to-teal-600";
62
+ readonly hoverBorder: "hover:border-cyan-500/50";
63
+ readonly hoverText: "group-hover:text-cyan-500";
64
+ readonly active: "border-cyan-500 bg-cyan-500/10 text-cyan-500";
65
+ readonly proseLink: "[&_a]:text-cyan-500 [&_a:hover]:text-cyan-600";
66
+ readonly link: "text-cyan-500 hover:text-cyan-600";
67
+ }, {
68
+ readonly value: "sky";
69
+ readonly label: "Sky";
70
+ readonly class: "from-sky-500 to-blue-600";
71
+ readonly hoverBorder: "hover:border-sky-500/50";
72
+ readonly hoverText: "group-hover:text-sky-500";
73
+ readonly active: "border-sky-500 bg-sky-500/10 text-sky-500";
74
+ readonly proseLink: "[&_a]:text-sky-500 [&_a:hover]:text-sky-600";
75
+ readonly link: "text-sky-500 hover:text-sky-600";
76
+ }, {
77
+ readonly value: "indigo";
78
+ readonly label: "Indigo";
79
+ readonly class: "from-indigo-500 to-violet-600";
80
+ readonly hoverBorder: "hover:border-indigo-500/50";
81
+ readonly hoverText: "group-hover:text-indigo-500";
82
+ readonly active: "border-indigo-500 bg-indigo-500/10 text-indigo-500";
83
+ readonly proseLink: "[&_a]:text-indigo-500 [&_a:hover]:text-indigo-600";
84
+ readonly link: "text-indigo-500 hover:text-indigo-600";
85
+ }, {
86
+ readonly value: "fuchsia";
87
+ readonly label: "Fuchsia";
88
+ readonly class: "from-fuchsia-500 to-pink-600";
89
+ readonly hoverBorder: "hover:border-fuchsia-500/50";
90
+ readonly hoverText: "group-hover:text-fuchsia-500";
91
+ readonly active: "border-fuchsia-500 bg-fuchsia-500/10 text-fuchsia-500";
92
+ readonly proseLink: "[&_a]:text-fuchsia-500 [&_a:hover]:text-fuchsia-600";
93
+ readonly link: "text-fuchsia-500 hover:text-fuchsia-600";
94
+ }, {
95
+ readonly value: "rose";
96
+ readonly label: "Rose";
97
+ readonly class: "from-rose-500 to-pink-600";
98
+ readonly hoverBorder: "hover:border-rose-500/50";
99
+ readonly hoverText: "group-hover:text-rose-500";
100
+ readonly active: "border-rose-500 bg-rose-500/10 text-rose-500";
101
+ readonly proseLink: "[&_a]:text-rose-500 [&_a:hover]:text-rose-600";
102
+ readonly link: "text-rose-500 hover:text-rose-600";
103
+ }, {
104
+ readonly value: "amber";
105
+ readonly label: "Amber";
106
+ readonly class: "from-amber-500 to-orange-600";
107
+ readonly hoverBorder: "hover:border-amber-500/50";
108
+ readonly hoverText: "group-hover:text-amber-500";
109
+ readonly active: "border-amber-500 bg-amber-500/10 text-amber-500";
110
+ readonly proseLink: "[&_a]:text-amber-500 [&_a:hover]:text-amber-600";
111
+ readonly link: "text-amber-500 hover:text-amber-600";
112
+ }, {
113
+ readonly value: "orange";
114
+ readonly label: "Orange";
115
+ readonly class: "from-orange-500 to-amber-600";
116
+ readonly hoverBorder: "hover:border-orange-500/50";
117
+ readonly hoverText: "group-hover:text-orange-500";
118
+ readonly active: "border-orange-500 bg-orange-500/10 text-orange-500";
119
+ readonly proseLink: "[&_a]:text-orange-500 [&_a:hover]:text-orange-600";
120
+ readonly link: "text-orange-500 hover:text-orange-600";
121
+ }, {
122
+ readonly value: "red";
123
+ readonly label: "Red";
124
+ readonly class: "from-red-500 to-rose-600";
125
+ readonly hoverBorder: "hover:border-red-500/50";
126
+ readonly hoverText: "group-hover:text-red-500";
127
+ readonly active: "border-red-500 bg-red-500/10 text-red-500";
128
+ readonly proseLink: "[&_a]:text-red-500 [&_a:hover]:text-red-600";
129
+ readonly link: "text-red-500 hover:text-red-600";
130
+ }, {
131
+ readonly value: "lime";
132
+ readonly label: "Lime";
133
+ readonly class: "from-lime-500 to-green-600";
134
+ readonly hoverBorder: "hover:border-lime-500/50";
135
+ readonly hoverText: "group-hover:text-lime-500";
136
+ readonly active: "border-lime-500 bg-lime-500/10 text-lime-500";
137
+ readonly proseLink: "[&_a]:text-lime-500 [&_a:hover]:text-lime-600";
138
+ readonly link: "text-lime-500 hover:text-lime-600";
139
+ }, {
140
+ readonly value: "slate";
141
+ readonly label: "Slate";
142
+ readonly class: "from-slate-500 to-slate-700";
143
+ readonly hoverBorder: "hover:border-slate-500/50";
144
+ readonly hoverText: "group-hover:text-slate-500";
145
+ readonly active: "border-slate-500 bg-slate-500/10 text-slate-500";
146
+ readonly proseLink: "[&_a]:text-slate-500 [&_a:hover]:text-slate-600";
147
+ readonly link: "text-slate-500 hover:text-slate-600";
148
+ }];
149
+ export type AccentValue = (typeof PRESET_ACCENTS)[number]["value"] | "custom";
150
+ export declare const ACCENT_PRESETS: Record<string, {
151
+ class: string;
152
+ link: string;
153
+ border: string;
154
+ hoverBg: string;
155
+ }>;
156
+ /** Hex gradients for accent swatches - Tailwind v4 may not include from-/to- utilities */
157
+ export declare const ACCENT_GRADIENT_STYLES: Record<string, string>;
158
+ /** Primary hex for each preset - used for grid layout CSS variables */
159
+ export declare const ACCENT_HEX: Record<string, string>;
160
+ //# sourceMappingURL=bookingPageIcons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bookingPageIcons.d.ts","sourceRoot":"","sources":["../../src/utils/bookingPageIcons.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4B9B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,OAAO,kBAAkB,GAAG,IAAI,GAAG,MAAM,CAGzF;AAED,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmIjB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC;AAE9E,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAc3G,CAAC;AAEF,0FAA0F;AAC1F,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAczD,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAc7C,CAAC"}