@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,214 @@
1
+ /** Inline SVG strings for Lucide icons - used in generated booking page HTML */
2
+ const svgBase = 'xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"';
3
+ export const BOOKING_PAGE_ICONS = {
4
+ clock: `<svg ${svgBase}><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg>`,
5
+ "dollar-sign": `<svg ${svgBase}><line x1="12" x2="12" y1="2" y2="22"/><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/></svg>`,
6
+ "arrow-right": `<svg ${svgBase}><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg>`,
7
+ tag: `<svg ${svgBase}><path d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z"/><circle cx="7.5" cy="7.5" r=".5" fill="currentColor"/></svg>`,
8
+ scissors: `<svg ${svgBase}><circle cx="6" cy="6" r="3"/><path d="M8.12 8.12 12 12"/><path d="M20 4 8.12 15.88"/><circle cx="6" cy="18" r="3"/><path d="M8.12 8.12 12 12"/><path d="M14.88 8.12 12 12"/><path d="M20 4 8.12 15.88"/><path d="M12 12 12 12"/></svg>`,
9
+ sparkles: `<svg ${svgBase}><path d="m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275L12 3Z"/><path d="M5 3v4"/><path d="M19 17v4"/><path d="M3 5h4"/><path d="M17 19h4"/></svg>`,
10
+ heart: `<svg ${svgBase}><path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z"/></svg>`,
11
+ star: `<svg ${svgBase}><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>`,
12
+ palette: `<svg ${svgBase}><circle cx="13.5" cy="6.5" r=".5"/><circle cx="17.5" cy="10.5" r=".5"/><circle cx="8.5" cy="7.5" r=".5"/><circle cx="6.5" cy="12.5" r=".5"/><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.648 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.555C21.965 6.012 17.461 2 12 2z"/></svg>`,
13
+ camera: `<svg ${svgBase}><path d="M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z"/><circle cx="12" cy="13" r="3"/></svg>`,
14
+ music: `<svg ${svgBase}><path d="M9 18V5l12-2v13"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="16" r="3"/></svg>`,
15
+ briefcase: `<svg ${svgBase}><rect width="20" height="14" x="2" y="7" rx="2" ry="2"/><path d="M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"/></svg>`,
16
+ dumbbell: `<svg ${svgBase}><path d="M14.4 14.4 9.6 9.6"/><path d="M18.657 21.485a2 2 0 1 1-2.829-2.828l-1.767 1.768a2 2 0 1 1-2.829-2.829l6.364-6.364a2 2 0 1 1 2.829 2.829l-1.768 1.767"/><path d="m21.5 21.5-1.4-1.4"/><path d="M3.9 3.9 2.5 2.5"/><path d="m6.404 12.768 1.414-1.414"/><path d="m12.768 6.404 1.414-1.414"/><path d="m18.657 2.929 1.414-1.414"/><path d="m2.929 18.657 1.414-1.414"/></svg>`,
17
+ car: `<svg ${svgBase}><path d="M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9C2.5 10.2 2 11.5 2 13v3c0 .6.4 1 1 1h2"/><circle cx="7" cy="17" r="2"/><path d="M9 17h6"/><circle cx="17" cy="17" r="2"/></svg>`,
18
+ home: `<svg ${svgBase}><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>`,
19
+ utensils: `<svg ${svgBase}><path d="M3 2v7c0 1.1.9 2 2 2h4a2 2 0 0 0 2-2V2"/><path d="M7 2v20"/><path d="M21 15V2v0a5 5 0 0 0-5 5v6c0 1.1.9 2 2 2h3Zm0 0v7"/></svg>`,
20
+ coffee: `<svg ${svgBase}><path d="M17 8h1a4 4 0 1 1 0 8h-1"/><path d="M3 8h14v9a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4Z"/><line x1="6" x2="6" y1="2" y2="4"/><line x1="10" x2="10" y1="2" y2="4"/><line x1="14" x2="14" y1="2" y2="4"/></svg>`,
21
+ package: `<svg ${svgBase}><path d="m7.5 4.27 9 5.15"/><path d="M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z"/><path d="m3.3 7 8.7 5 8.7-5"/><path d="M12 22V12"/></svg>`,
22
+ "map-pin": `<svg ${svgBase}><path d="M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0Z"/><circle cx="12" cy="10" r="3"/></svg>`,
23
+ calendar: `<svg ${svgBase}><path d="M8 2v4"/><path d="M16 2v4"/><rect width="18" height="18" x="3" y="4" rx="2"/><path d="M3 10h18"/></svg>`,
24
+ phone: `<svg ${svgBase}><path d="M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384"/></svg>`,
25
+ mail: `<svg ${svgBase}><path d="m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7"/><rect x="2" y="4" width="20" height="16" rx="2"/></svg>`,
26
+ video: `<svg ${svgBase}><path d="m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5"/><rect x="2" y="6" width="14" height="12" rx="2"/></svg>`,
27
+ stethoscope: `<svg ${svgBase}><path d="M11 2v2"/><path d="M5 2v2"/><path d="M5 3H4a2 2 0 0 0-2 2v4a6 6 0 0 0 12 0V5a2 2 0 0 0-2-2h-1"/><path d="M8 15a6 6 0 0 0 12 0v-3"/><circle cx="20" cy="10" r="2"/></svg>`,
28
+ "book-open": `<svg ${svgBase}><path d="M12 7v14"/><path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"/></svg>`,
29
+ wrench: `<svg ${svgBase}><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z"/></svg>`,
30
+ gift: `<svg ${svgBase}><path d="M12 7v14"/><path d="M20 11v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-8"/><path d="M7.5 7a1 1 0 0 1 0-5A4.8 8 0 0 1 12 7a4.8 8 0 0 1 4.5-5 1 1 0 0 1 0 5"/><rect x="3" y="7" width="18" height="4" rx="1"/></svg>`,
31
+ };
32
+ export function getServiceIconSvg(iconId) {
33
+ const key = iconId && BOOKING_PAGE_ICONS[iconId] ? iconId : "tag";
34
+ return BOOKING_PAGE_ICONS[key];
35
+ }
36
+ export const PRESET_ACCENTS = [
37
+ {
38
+ value: "emerald",
39
+ label: "Emerald",
40
+ class: "from-emerald-500 to-teal-600",
41
+ hoverBorder: "hover:border-emerald-500/50",
42
+ hoverText: "group-hover:text-emerald-500",
43
+ active: "border-emerald-500 bg-emerald-500/10 text-emerald-500",
44
+ proseLink: "[&_a]:text-emerald-500 [&_a:hover]:text-emerald-600",
45
+ link: "text-emerald-500 hover:text-emerald-600",
46
+ },
47
+ {
48
+ value: "violet",
49
+ label: "Violet",
50
+ class: "from-violet-500 to-purple-600",
51
+ hoverBorder: "hover:border-violet-500/50",
52
+ hoverText: "group-hover:text-violet-500",
53
+ active: "border-violet-500 bg-violet-500/10 text-violet-500",
54
+ proseLink: "[&_a]:text-violet-500 [&_a:hover]:text-violet-600",
55
+ link: "text-violet-500 hover:text-violet-600",
56
+ },
57
+ {
58
+ value: "blue",
59
+ label: "Blue",
60
+ class: "from-blue-500 to-indigo-600",
61
+ hoverBorder: "hover:border-blue-500/50",
62
+ hoverText: "group-hover:text-blue-500",
63
+ active: "border-blue-500 bg-blue-500/10 text-blue-500",
64
+ proseLink: "[&_a]:text-blue-500 [&_a:hover]:text-blue-600",
65
+ link: "text-blue-500 hover:text-blue-600",
66
+ },
67
+ {
68
+ value: "cyan",
69
+ label: "Cyan",
70
+ class: "from-cyan-500 to-teal-600",
71
+ hoverBorder: "hover:border-cyan-500/50",
72
+ hoverText: "group-hover:text-cyan-500",
73
+ active: "border-cyan-500 bg-cyan-500/10 text-cyan-500",
74
+ proseLink: "[&_a]:text-cyan-500 [&_a:hover]:text-cyan-600",
75
+ link: "text-cyan-500 hover:text-cyan-600",
76
+ },
77
+ {
78
+ value: "sky",
79
+ label: "Sky",
80
+ class: "from-sky-500 to-blue-600",
81
+ hoverBorder: "hover:border-sky-500/50",
82
+ hoverText: "group-hover:text-sky-500",
83
+ active: "border-sky-500 bg-sky-500/10 text-sky-500",
84
+ proseLink: "[&_a]:text-sky-500 [&_a:hover]:text-sky-600",
85
+ link: "text-sky-500 hover:text-sky-600",
86
+ },
87
+ {
88
+ value: "indigo",
89
+ label: "Indigo",
90
+ class: "from-indigo-500 to-violet-600",
91
+ hoverBorder: "hover:border-indigo-500/50",
92
+ hoverText: "group-hover:text-indigo-500",
93
+ active: "border-indigo-500 bg-indigo-500/10 text-indigo-500",
94
+ proseLink: "[&_a]:text-indigo-500 [&_a:hover]:text-indigo-600",
95
+ link: "text-indigo-500 hover:text-indigo-600",
96
+ },
97
+ {
98
+ value: "fuchsia",
99
+ label: "Fuchsia",
100
+ class: "from-fuchsia-500 to-pink-600",
101
+ hoverBorder: "hover:border-fuchsia-500/50",
102
+ hoverText: "group-hover:text-fuchsia-500",
103
+ active: "border-fuchsia-500 bg-fuchsia-500/10 text-fuchsia-500",
104
+ proseLink: "[&_a]:text-fuchsia-500 [&_a:hover]:text-fuchsia-600",
105
+ link: "text-fuchsia-500 hover:text-fuchsia-600",
106
+ },
107
+ {
108
+ value: "rose",
109
+ label: "Rose",
110
+ class: "from-rose-500 to-pink-600",
111
+ hoverBorder: "hover:border-rose-500/50",
112
+ hoverText: "group-hover:text-rose-500",
113
+ active: "border-rose-500 bg-rose-500/10 text-rose-500",
114
+ proseLink: "[&_a]:text-rose-500 [&_a:hover]:text-rose-600",
115
+ link: "text-rose-500 hover:text-rose-600",
116
+ },
117
+ {
118
+ value: "amber",
119
+ label: "Amber",
120
+ class: "from-amber-500 to-orange-600",
121
+ hoverBorder: "hover:border-amber-500/50",
122
+ hoverText: "group-hover:text-amber-500",
123
+ active: "border-amber-500 bg-amber-500/10 text-amber-500",
124
+ proseLink: "[&_a]:text-amber-500 [&_a:hover]:text-amber-600",
125
+ link: "text-amber-500 hover:text-amber-600",
126
+ },
127
+ {
128
+ value: "orange",
129
+ label: "Orange",
130
+ class: "from-orange-500 to-amber-600",
131
+ hoverBorder: "hover:border-orange-500/50",
132
+ hoverText: "group-hover:text-orange-500",
133
+ active: "border-orange-500 bg-orange-500/10 text-orange-500",
134
+ proseLink: "[&_a]:text-orange-500 [&_a:hover]:text-orange-600",
135
+ link: "text-orange-500 hover:text-orange-600",
136
+ },
137
+ {
138
+ value: "red",
139
+ label: "Red",
140
+ class: "from-red-500 to-rose-600",
141
+ hoverBorder: "hover:border-red-500/50",
142
+ hoverText: "group-hover:text-red-500",
143
+ active: "border-red-500 bg-red-500/10 text-red-500",
144
+ proseLink: "[&_a]:text-red-500 [&_a:hover]:text-red-600",
145
+ link: "text-red-500 hover:text-red-600",
146
+ },
147
+ {
148
+ value: "lime",
149
+ label: "Lime",
150
+ class: "from-lime-500 to-green-600",
151
+ hoverBorder: "hover:border-lime-500/50",
152
+ hoverText: "group-hover:text-lime-500",
153
+ active: "border-lime-500 bg-lime-500/10 text-lime-500",
154
+ proseLink: "[&_a]:text-lime-500 [&_a:hover]:text-lime-600",
155
+ link: "text-lime-500 hover:text-lime-600",
156
+ },
157
+ {
158
+ value: "slate",
159
+ label: "Slate",
160
+ class: "from-slate-500 to-slate-700",
161
+ hoverBorder: "hover:border-slate-500/50",
162
+ hoverText: "group-hover:text-slate-500",
163
+ active: "border-slate-500 bg-slate-500/10 text-slate-500",
164
+ proseLink: "[&_a]:text-slate-500 [&_a:hover]:text-slate-600",
165
+ link: "text-slate-500 hover:text-slate-600",
166
+ },
167
+ ];
168
+ export const ACCENT_PRESETS = {
169
+ emerald: { class: "bg-emerald-500 from-emerald-500 to-teal-600", link: "text-emerald-500 hover:text-emerald-600", border: "border-emerald-500 hover:border-emerald-600", hoverBg: "hover:bg-emerald-50" },
170
+ violet: { class: "bg-violet-500 from-violet-500 to-purple-600", link: "text-violet-500 hover:text-violet-600", border: "border-violet-500 hover:border-violet-600", hoverBg: "hover:bg-violet-50" },
171
+ blue: { class: "bg-blue-500 from-blue-500 to-indigo-600", link: "text-blue-500 hover:text-blue-600", border: "border-blue-500 hover:border-blue-600", hoverBg: "hover:bg-blue-50" },
172
+ cyan: { class: "bg-cyan-500 from-cyan-500 to-teal-600", link: "text-cyan-500 hover:text-cyan-600", border: "border-cyan-500 hover:border-cyan-600", hoverBg: "hover:bg-cyan-50" },
173
+ sky: { class: "bg-sky-500 from-sky-500 to-blue-600", link: "text-sky-500 hover:text-sky-600", border: "border-sky-500 hover:border-sky-600", hoverBg: "hover:bg-sky-50" },
174
+ indigo: { class: "bg-indigo-500 from-indigo-500 to-violet-600", link: "text-indigo-500 hover:text-indigo-600", border: "border-indigo-500 hover:border-indigo-600", hoverBg: "hover:bg-indigo-50" },
175
+ fuchsia: { class: "bg-fuchsia-500 from-fuchsia-500 to-pink-600", link: "text-fuchsia-500 hover:text-fuchsia-600", border: "border-fuchsia-500 hover:border-fuchsia-600", hoverBg: "hover:bg-fuchsia-50" },
176
+ rose: { class: "bg-rose-500 from-rose-500 to-pink-600", link: "text-rose-500 hover:text-rose-600", border: "border-rose-500 hover:border-rose-600", hoverBg: "hover:bg-rose-50" },
177
+ amber: { class: "bg-amber-500 from-amber-500 to-orange-600", link: "text-amber-500 hover:text-amber-600", border: "border-amber-500 hover:border-amber-600", hoverBg: "hover:bg-amber-50" },
178
+ orange: { class: "bg-orange-500 from-orange-500 to-amber-600", link: "text-orange-500 hover:text-orange-600", border: "border-orange-500 hover:border-orange-600", hoverBg: "hover:bg-orange-50" },
179
+ red: { class: "bg-red-500 from-red-500 to-rose-600", link: "text-red-500 hover:text-red-600", border: "border-red-500 hover:border-red-600", hoverBg: "hover:bg-red-50" },
180
+ lime: { class: "bg-lime-500 from-lime-500 to-green-600", link: "text-lime-500 hover:text-lime-600", border: "border-lime-500 hover:border-lime-600", hoverBg: "hover:bg-lime-50" },
181
+ slate: { class: "bg-slate-500 from-slate-500 to-slate-700", link: "text-slate-500 hover:text-slate-600", border: "border-slate-500 hover:border-slate-600", hoverBg: "hover:bg-slate-50" },
182
+ };
183
+ /** Hex gradients for accent swatches - Tailwind v4 may not include from-/to- utilities */
184
+ export const ACCENT_GRADIENT_STYLES = {
185
+ emerald: "linear-gradient(135deg, #10b981, #0d9488)",
186
+ violet: "linear-gradient(135deg, #8b5cf6, #9333ea)",
187
+ blue: "linear-gradient(135deg, #3b82f6, #4f46e5)",
188
+ cyan: "linear-gradient(135deg, #06b6d4, #0d9488)",
189
+ sky: "linear-gradient(135deg, #0ea5e9, #2563eb)",
190
+ indigo: "linear-gradient(135deg, #6366f1, #8b5cf6)",
191
+ fuchsia: "linear-gradient(135deg, #d946ef, #db2777)",
192
+ rose: "linear-gradient(135deg, #f43f5e, #ec4899)",
193
+ amber: "linear-gradient(135deg, #f59e0b, #ea580c)",
194
+ orange: "linear-gradient(135deg, #f97316, #f59e0b)",
195
+ red: "linear-gradient(135deg, #ef4444, #f43f5e)",
196
+ lime: "linear-gradient(135deg, #84cc16, #16a34a)",
197
+ slate: "linear-gradient(135deg, #64748b, #475569)",
198
+ };
199
+ /** Primary hex for each preset - used for grid layout CSS variables */
200
+ export const ACCENT_HEX = {
201
+ emerald: "#10b981",
202
+ violet: "#8b5cf6",
203
+ blue: "#3b82f6",
204
+ cyan: "#06b6d4",
205
+ sky: "#0ea5e9",
206
+ indigo: "#6366f1",
207
+ fuchsia: "#d946ef",
208
+ rose: "#f43f5e",
209
+ amber: "#f59e0b",
210
+ orange: "#f97316",
211
+ red: "#ef4444",
212
+ lime: "#84cc16",
213
+ slate: "#64748b",
214
+ };
@@ -0,0 +1,25 @@
1
+ import type { Booking } from "../types/db.booking.js";
2
+ /** Booking row may still carry legacy `providerId` (singular) from older records. */
3
+ export type BookingWithLegacyProviders = Pick<Booking, "providerIds"> & {
4
+ providerId?: string;
5
+ };
6
+ /** Effective staff IDs assigned to the booking (deduped, non-empty strings). */
7
+ export declare function normalizeBookingProviderIds(booking: BookingWithLegacyProviders): string[];
8
+ /** Minimal user shape for building booking provider labels in list APIs. */
9
+ export type UserProfileForProviderDisplay = {
10
+ email?: string;
11
+ cognitoRecord?: {
12
+ firstName?: string;
13
+ lastName?: string;
14
+ picture?: string;
15
+ };
16
+ };
17
+ /**
18
+ * Parallel display arrays aligned with `orderedProviderIds` (same order as
19
+ * {@link normalizeBookingProviderIds} when that array is passed through).
20
+ */
21
+ export declare function bookingProviderDisplayFields(orderedProviderIds: string[], userById: Map<string, UserProfileForProviderDisplay | undefined>): {
22
+ providerNames: string[];
23
+ providerPictureUrls: (string | undefined)[];
24
+ };
25
+ //# sourceMappingURL=bookingProviders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bookingProviders.d.ts","sourceRoot":"","sources":["../../src/utils/bookingProviders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEtD,qFAAqF;AACrF,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,GAAG;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,gFAAgF;AAChF,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,0BAA0B,GAClC,MAAM,EAAE,CAQV;AAED,4EAA4E;AAC5E,MAAM,MAAM,6BAA6B,GAAG;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,kBAAkB,EAAE,MAAM,EAAE,EAC5B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,6BAA6B,GAAG,SAAS,CAAC,GAC/D;IACD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,mBAAmB,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;CAC7C,CAYA"}
@@ -0,0 +1,23 @@
1
+ /** Effective staff IDs assigned to the booking (deduped, non-empty strings). */
2
+ export function normalizeBookingProviderIds(booking) {
3
+ const raw = booking.providerIds?.filter((id) => typeof id === "string" && id.length > 0) ?? [];
4
+ if (raw.length)
5
+ return [...new Set(raw)];
6
+ const legacy = booking.providerId?.trim();
7
+ return legacy ? [legacy] : [];
8
+ }
9
+ /**
10
+ * Parallel display arrays aligned with `orderedProviderIds` (same order as
11
+ * {@link normalizeBookingProviderIds} when that array is passed through).
12
+ */
13
+ export function bookingProviderDisplayFields(orderedProviderIds, userById) {
14
+ const providerNames = orderedProviderIds.map((pid) => {
15
+ const u = userById.get(pid);
16
+ if (!u)
17
+ return pid;
18
+ const name = `${u.cognitoRecord?.firstName ?? ""} ${u.cognitoRecord?.lastName ?? ""}`.trim();
19
+ return name || u.email || pid;
20
+ });
21
+ const providerPictureUrls = orderedProviderIds.map((pid) => userById.get(pid)?.cognitoRecord?.picture?.trim() || undefined);
22
+ return { providerNames, providerPictureUrls };
23
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Currencies supported by Stripe for payments.
3
+ * @see https://stripe.com/docs/currencies
4
+ */
5
+ export declare const currencies: readonly ["AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN", "BAM", "BBD", "BDT", "BGN", "BIF", "BMD", "BND", "BOB", "BRL", "BSD", "BWP", "BZD", "CAD", "CDF", "CHF", "CLP", "CNY", "COP", "CRC", "CVE", "CZK", "DJF", "DKK", "DOP", "DZD", "EEK", "EGP", "ETB", "EUR", "FJD", "FKP", "GBP", "GEL", "GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL", "HRK", "HTG", "HUF", "IDR", "ILS", "INR", "ISK", "JMD", "JPY", "KES", "KGS", "KHR", "KMF", "KRW", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD", "LSL", "LTL", "LVL", "MAD", "MDL", "MGA", "MKD", "MNT", "MOP", "MRO", "MUR", "MVR", "MWK", "MXN", "MYR", "MZN", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", "QAR", "RON", "RSD", "RUB", "RWF", "SAR", "SBD", "SCR", "SEK", "SGD", "SHP", "SLL", "SOS", "SRD", "STD", "SVC", "SZL", "THB", "TJS", "TOP", "TRY", "TTD", "TWD", "TZS", "UAH", "UGX", "USD", "UYU", "UZS", "VEF", "VND", "VUV", "WST", "XAF", "XCD", "XOF", "XPF", "YER", "ZAR", "ZMW"];
6
+ //# sourceMappingURL=currencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currencies.d.ts","sourceRoot":"","sources":["../../src/utils/currencies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,UAAU,w9BA4Ib,CAAC"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Currencies supported by Stripe for payments.
3
+ * @see https://stripe.com/docs/currencies
4
+ */
5
+ export const currencies = [
6
+ "AED",
7
+ "AFN",
8
+ "ALL",
9
+ "AMD",
10
+ "ANG",
11
+ "AOA",
12
+ "ARS",
13
+ "AUD",
14
+ "AWG",
15
+ "AZN",
16
+ "BAM",
17
+ "BBD",
18
+ "BDT",
19
+ "BGN",
20
+ "BIF",
21
+ "BMD",
22
+ "BND",
23
+ "BOB",
24
+ "BRL",
25
+ "BSD",
26
+ "BWP",
27
+ "BZD",
28
+ "CAD",
29
+ "CDF",
30
+ "CHF",
31
+ "CLP",
32
+ "CNY",
33
+ "COP",
34
+ "CRC",
35
+ "CVE",
36
+ "CZK",
37
+ "DJF",
38
+ "DKK",
39
+ "DOP",
40
+ "DZD",
41
+ "EEK",
42
+ "EGP",
43
+ "ETB",
44
+ "EUR",
45
+ "FJD",
46
+ "FKP",
47
+ "GBP",
48
+ "GEL",
49
+ "GIP",
50
+ "GMD",
51
+ "GNF",
52
+ "GTQ",
53
+ "GYD",
54
+ "HKD",
55
+ "HNL",
56
+ "HRK",
57
+ "HTG",
58
+ "HUF",
59
+ "IDR",
60
+ "ILS",
61
+ "INR",
62
+ "ISK",
63
+ "JMD",
64
+ "JPY",
65
+ "KES",
66
+ "KGS",
67
+ "KHR",
68
+ "KMF",
69
+ "KRW",
70
+ "KYD",
71
+ "KZT",
72
+ "LAK",
73
+ "LBP",
74
+ "LKR",
75
+ "LRD",
76
+ "LSL",
77
+ "LTL",
78
+ "LVL",
79
+ "MAD",
80
+ "MDL",
81
+ "MGA",
82
+ "MKD",
83
+ "MNT",
84
+ "MOP",
85
+ "MRO",
86
+ "MUR",
87
+ "MVR",
88
+ "MWK",
89
+ "MXN",
90
+ "MYR",
91
+ "MZN",
92
+ "NAD",
93
+ "NGN",
94
+ "NIO",
95
+ "NOK",
96
+ "NPR",
97
+ "NZD",
98
+ "PAB",
99
+ "PEN",
100
+ "PGK",
101
+ "PHP",
102
+ "PKR",
103
+ "PLN",
104
+ "PYG",
105
+ "QAR",
106
+ "RON",
107
+ "RSD",
108
+ "RUB",
109
+ "RWF",
110
+ "SAR",
111
+ "SBD",
112
+ "SCR",
113
+ "SEK",
114
+ "SGD",
115
+ "SHP",
116
+ "SLL",
117
+ "SOS",
118
+ "SRD",
119
+ "STD",
120
+ "SVC",
121
+ "SZL",
122
+ "THB",
123
+ "TJS",
124
+ "TOP",
125
+ "TRY",
126
+ "TTD",
127
+ "TWD",
128
+ "TZS",
129
+ "UAH",
130
+ "UGX",
131
+ "USD",
132
+ "UYU",
133
+ "UZS",
134
+ "VEF",
135
+ "VND",
136
+ "VUV",
137
+ "WST",
138
+ "XAF",
139
+ "XCD",
140
+ "XOF",
141
+ "XPF",
142
+ "YER",
143
+ "ZAR",
144
+ "ZMW",
145
+ ];
@@ -0,0 +1,57 @@
1
+ import dayjs from "dayjs";
2
+ export declare const dateFormat = "YYYY-MM-DD";
3
+ export declare const defaultDateFormat = "YYYY-MM-DD HH:mm:ss";
4
+ export declare const thisYear: () => string;
5
+ export declare const thisMonth: (timezone?: string) => string;
6
+ export declare const beginningOfThisWeek: (timezone?: string) => string;
7
+ export declare const endOfThisWeek: (timezone?: string) => string;
8
+ export declare const beginningOfLastWeek: (timezone?: string) => string;
9
+ export declare const endOfLastWeek: (timezone?: string) => string;
10
+ export declare const beginningOfNextWeek: (timezone?: string) => string;
11
+ export declare const endOfNextWeek: (timezone?: string) => string;
12
+ export declare const beginningOfThisMonth: (timezone?: string) => string;
13
+ export declare const endOfThisMonth: (timezone?: string) => string;
14
+ export declare const beginningOfLastMonth: (timezone?: string) => string;
15
+ export declare const lastMonth: () => string;
16
+ export declare const today: (timezone?: string) => string;
17
+ export declare const yesterday: () => string;
18
+ export declare const getUTCTimestamp: () => number;
19
+ /**
20
+ * @returns current date time in utc
21
+ */
22
+ export declare const currentFullDate: () => string;
23
+ export declare const formatDate: (date: string, format?: string) => string;
24
+ /**
25
+ * converts UTC datetime to user's locale
26
+ */
27
+ export declare const convertTimeToLocale: (date: string, timezoneName: string, format?: string) => string;
28
+ export declare const convertLocaleToUTC: (date: string, timezoneName: string, format?: string) => string;
29
+ export declare const getLastXDays: (numDays: number, startFrom?: string) => string[];
30
+ export declare const getLastXMonths: (months: number, startFrom?: string) => string[];
31
+ export type DayjsUnit = "year" | "month" | "week" | "day" | "hour" | "minute";
32
+ export declare const dateIsBetween: (from: string, to: string, granularity?: DayjsUnit, now?: dayjs.Dayjs) => boolean;
33
+ export declare const timeExpired: (date: string, now?: dayjs.Dayjs, inclusive?: boolean) => boolean;
34
+ export declare const getDaysInArray: (startDate: string, endDate: string, format?: string) => string[];
35
+ export declare const getHoursInArray: (startDate: string, endDate: string) => string[];
36
+ export declare const getDayjs: typeof dayjs;
37
+ export declare const getDayjsFuncUTC: (inp?: string | Date | dayjs.Dayjs) => dayjs.Dayjs;
38
+ export declare const getDayjsFunc: (inp?: string | Date | dayjs.Dayjs) => dayjs.Dayjs;
39
+ export declare const addToDate: (creationDate: string, total: number, unit?: dayjs.ManipulateType, format?: string) => string;
40
+ export declare const isValidDateTime: (value: string) => boolean;
41
+ /** Convert 24h "HH:mm" to 12h { hour: 1-12, period: "AM"|"PM" } */
42
+ export declare const to12h: (time24: string) => {
43
+ hour: number;
44
+ period: "AM" | "PM";
45
+ };
46
+ /** Convert 12h to 24h "HH:mm" */
47
+ export declare const to24h: (hour: number, period: "AM" | "PM") => string;
48
+ export declare const howManyDaysInMonth: (year: number, month: number) => number;
49
+ export declare const dayOfWeek: (date: string) => number;
50
+ export declare const validYearMonth: (yearMonth: string) => boolean;
51
+ export declare const validateDate: (date: string) => boolean;
52
+ /**
53
+ * Returns an array of 7 dates (Sunday → Saturday for the current week)
54
+ * formatted as YYYY-MM-DD using the tenant's timezone (fallback to UTC).
55
+ */
56
+ export declare const getCurrentWeekDatesSundayToSaturday: (timezone?: string) => string[];
57
+ //# sourceMappingURL=dateTime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dateTime.d.ts","sourceRoot":"","sources":["../../src/utils/dateTime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAiB1B,eAAO,MAAM,UAAU,eAAe,CAAC;AACvC,eAAO,MAAM,iBAAiB,wBAAwB,CAAC;AACvD,eAAO,MAAM,QAAQ,cAAqC,CAAC;AAC3D,eAAO,MAAM,SAAS,GAAI,iBAAgB,WAA2C,CAAC;AACtF,eAAO,MAAM,mBAAmB,GAAI,iBAAgB,WAA8D,CAAC;AACnH,eAAO,MAAM,aAAa,GAAI,iBAAgB,WAA4D,CAAC;AAC3G,eAAO,MAAM,mBAAmB,GAAI,iBAAgB,WAAkF,CAAC;AACvI,eAAO,MAAM,aAAa,GAAI,iBAAgB,WAAgF,CAAC;AAC/H,eAAO,MAAM,mBAAmB,GAAI,iBAAgB,WAA6E,CAAC;AAClI,eAAO,MAAM,aAAa,GAAI,iBAAgB,WAA2E,CAAC;AAC1H,eAAO,MAAM,oBAAoB,GAAI,iBAAgB,WAA+D,CAAC;AACrH,eAAO,MAAM,cAAc,GAAI,iBAAgB,WAA6D,CAAC;AAC7G,eAAO,MAAM,oBAAoB,GAAI,iBAAgB,WAAoF,CAAC;AAC1I,eAAO,MAAM,SAAS,cACiD,CAAC;AACxE,eAAO,MAAM,KAAK,GAAI,iBAAgB,WAA4C,CAAC;AACnF,eAAO,MAAM,SAAS,cACiC,CAAC;AACxD,eAAO,MAAM,eAAe,cAAgC,CAAC;AAE7D;;GAEG;AACH,eAAO,MAAM,eAAe,cACe,CAAC;AAC5C,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,eAAwB,WACnC,CAAC;AAE/B;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAC5B,MAAM,MAAM,EACZ,cAAc,MAAM,EACpB,eAA0B,KAC3B,MAGF,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC3B,MAAM,MAAM,EACZ,cAAc,MAAM,EACpB,eAA0B,KAC3B,MAEF,CAAC;AAEF,eAAO,MAAM,YAAY,GACrB,SAAS,MAAM,EACf,YAAY,MAAM,KACnB,MAAM,EAQR,CAAC;AAEF,eAAO,MAAM,cAAc,GACvB,QAAQ,MAAM,EACd,YAAY,MAAM,KACnB,MAAM,EAQR,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE9E,eAAO,MAAM,aAAa,GACtB,MAAM,MAAM,EACZ,IAAI,MAAM,EACV,cAAa,SAAiB,EAC9B,MAAM,KAAK,CAAC,KAAK,KAClB,OAKF,CAAC;AAEF,eAAO,MAAM,WAAW,GACpB,MAAM,MAAM,EACZ,MAAM,KAAK,CAAC,KAAK,EACjB,mBAAiB,KAClB,OAIF,CAAC;AAEF,eAAO,MAAM,cAAc,GACvB,WAAW,MAAM,EACjB,SAAS,MAAM,EACf,eAAmB,aAWtB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,WAAW,MAAM,EAAE,SAAS,MAAM,aAUjE,CAAC;AAEF,eAAO,MAAM,QAAQ,cAAQ,CAAC;AAC9B,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC,KAAK,gBAC/C,CAAC;AACnB,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC,KAAK,gBAAe,CAAC;AAC9E,eAAO,MAAM,SAAS,GAClB,cAAc,MAAM,EACpB,OAAO,MAAM,EACb,OAAM,KAAK,CAAC,cAAyB,EACrC,eAA0B,KAC3B,MAA6D,CAAC;AACjE,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,YAA2B,CAAC;AAEzE,mEAAmE;AACnE,eAAO,MAAM,KAAK,GAAI,QAAQ,MAAM,KAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,IAAI,GAAG,IAAI,CAAA;CAOzE,CAAA;AAED,iCAAiC;AACjC,eAAO,MAAM,KAAK,GAAI,MAAM,MAAM,EAAE,QAAQ,IAAI,GAAG,IAAI,KAAG,MAQzD,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,KAAG,MAEhE,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,MAExC,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,WAAW,MAAM,KAAG,OAIlD,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,OAE3C,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mCAAmC,GAAI,iBAAgB,KAAG,MAAM,EAQ5E,CAAA"}
@@ -0,0 +1,150 @@
1
+ import dayjs from "dayjs";
2
+ import utc from "dayjs/plugin/utc.js";
3
+ import timezone from "dayjs/plugin/timezone.js";
4
+ import customParseFormat from "dayjs/plugin/customParseFormat.js";
5
+ import advancedFormat from "dayjs/plugin/advancedFormat.js";
6
+ import isBetween from "dayjs/plugin/isBetween.js";
7
+ import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js";
8
+ import isSameOrBefore from "dayjs/plugin/isSameOrBefore.js";
9
+ dayjs.extend(utc);
10
+ dayjs.extend(timezone);
11
+ dayjs.extend(customParseFormat);
12
+ dayjs.extend(advancedFormat);
13
+ dayjs.extend(isBetween);
14
+ dayjs.extend(isSameOrAfter);
15
+ dayjs.extend(isSameOrBefore);
16
+ export const dateFormat = "YYYY-MM-DD";
17
+ export const defaultDateFormat = "YYYY-MM-DD HH:mm:ss";
18
+ export const thisYear = () => dayjs().utc().format("YYYY");
19
+ export const thisMonth = (timezone = "UTC") => dayjs().tz(timezone).format("YYYY-MM");
20
+ export const beginningOfThisWeek = (timezone = "UTC") => dayjs().tz(timezone).startOf("week").format("YYYY-MM-DD");
21
+ export const endOfThisWeek = (timezone = "UTC") => dayjs().tz(timezone).endOf("week").format("YYYY-MM-DD");
22
+ export const beginningOfLastWeek = (timezone = "UTC") => dayjs().tz(timezone).subtract(1, "week").startOf("week").format("YYYY-MM-DD");
23
+ export const endOfLastWeek = (timezone = "UTC") => dayjs().tz(timezone).subtract(1, "week").endOf("week").format("YYYY-MM-DD");
24
+ export const beginningOfNextWeek = (timezone = "UTC") => dayjs().tz(timezone).add(1, "week").startOf("week").format("YYYY-MM-DD");
25
+ export const endOfNextWeek = (timezone = "UTC") => dayjs().tz(timezone).add(1, "week").endOf("week").format("YYYY-MM-DD");
26
+ export const beginningOfThisMonth = (timezone = "UTC") => dayjs().tz(timezone).startOf("month").format("YYYY-MM-DD");
27
+ export const endOfThisMonth = (timezone = "UTC") => dayjs().tz(timezone).endOf("month").format("YYYY-MM-DD");
28
+ export const beginningOfLastMonth = (timezone = "UTC") => dayjs().tz(timezone).subtract(1, "month").startOf("month").format("YYYY-MM-DD");
29
+ export const lastMonth = () => dayjs().subtract(1, "month").endOf("month").utc().format("YYYY-MM");
30
+ export const today = (timezone = "UTC") => dayjs().tz(timezone).format(dateFormat);
31
+ export const yesterday = () => dayjs().subtract(1, "day").utc().format(dateFormat);
32
+ export const getUTCTimestamp = () => dayjs().utc().valueOf();
33
+ /**
34
+ * @returns current date time in utc
35
+ */
36
+ export const currentFullDate = () => dayjs().utc().format(defaultDateFormat);
37
+ export const formatDate = (date, format = "Do MMM., YYYY") => dayjs(date).format(format);
38
+ /**
39
+ * converts UTC datetime to user's locale
40
+ */
41
+ export const convertTimeToLocale = (date, timezoneName, format = defaultDateFormat) => {
42
+ const d = dayjs.utc(date);
43
+ return d.tz(timezoneName).format(format);
44
+ };
45
+ export const convertLocaleToUTC = (date, timezoneName, format = defaultDateFormat) => {
46
+ return dayjs.tz(date, format, timezoneName).utc().format(format);
47
+ };
48
+ export const getLastXDays = (numDays, startFrom) => {
49
+ const formattedDates = [];
50
+ for (let i = 0; i < numDays; i++) {
51
+ formattedDates.push(dayjs(startFrom).subtract(i, "day").format("YYYY-MM-DD"));
52
+ }
53
+ return formattedDates.reverse();
54
+ };
55
+ export const getLastXMonths = (months, startFrom) => {
56
+ const formattedDates = [];
57
+ for (let i = 0; i < months; i++) {
58
+ formattedDates.push(dayjs(startFrom).subtract(i, "month").format("YYYY-MM"));
59
+ }
60
+ return formattedDates.reverse();
61
+ };
62
+ export const dateIsBetween = (from, to, granularity = "day", now) => {
63
+ const check = now ?? dayjs().utc();
64
+ const exp = dayjs.utc(to);
65
+ const start = dayjs.utc(from);
66
+ return check.isBetween(start, exp, granularity, "[]");
67
+ };
68
+ export const timeExpired = (date, now, inclusive = false) => {
69
+ const check = now ?? dayjs().utc();
70
+ const exp = dayjs.utc(date);
71
+ return inclusive ? check.isSameOrAfter(exp) : check.isAfter(exp);
72
+ };
73
+ export const getDaysInArray = (startDate, endDate, format = dateFormat) => {
74
+ const end = dayjs.utc(dayjs(endDate).format(format));
75
+ const start = dayjs.utc(dayjs(startDate).format(format));
76
+ const days = [];
77
+ let current = start;
78
+ while (current.isSameOrBefore(end)) {
79
+ days.push(current.format(format));
80
+ current = current.add(1, "day");
81
+ }
82
+ return days;
83
+ };
84
+ export const getHoursInArray = (startDate, endDate) => {
85
+ const end = dayjs.utc(endDate);
86
+ const start = dayjs.utc(startDate);
87
+ const days = [];
88
+ let current = start;
89
+ while (current.isSameOrBefore(end)) {
90
+ days.push(current.format("YYYY-MM-DD HH:00:00"));
91
+ current = current.add(1, "hour");
92
+ }
93
+ return days;
94
+ };
95
+ export const getDayjs = dayjs;
96
+ export const getDayjsFuncUTC = (inp) => dayjs.utc(inp);
97
+ export const getDayjsFunc = (inp) => dayjs(inp);
98
+ export const addToDate = (creationDate, total, unit = "minute", format = defaultDateFormat) => dayjs(creationDate).add(total, unit).format(format);
99
+ export const isValidDateTime = (value) => dayjs(value).isValid();
100
+ /** Convert 24h "HH:mm" to 12h { hour: 1-12, period: "AM"|"PM" } */
101
+ export const to12h = (time24) => {
102
+ const [h] = time24.split(":").map(Number);
103
+ const hour24 = h ?? 0;
104
+ if (hour24 === 0)
105
+ return { hour: 12, period: "AM" };
106
+ if (hour24 === 12)
107
+ return { hour: 12, period: "PM" };
108
+ if (hour24 < 12)
109
+ return { hour: hour24, period: "AM" };
110
+ return { hour: hour24 - 12, period: "PM" };
111
+ };
112
+ /** Convert 12h to 24h "HH:mm" */
113
+ export const to24h = (hour, period) => {
114
+ let h = hour;
115
+ if (period === "AM") {
116
+ h = hour === 12 ? 0 : hour;
117
+ }
118
+ else {
119
+ h = hour === 12 ? 12 : hour + 12;
120
+ }
121
+ return `${String(h).padStart(2, "0")}:00`;
122
+ };
123
+ export const howManyDaysInMonth = (year, month) => {
124
+ return dayjs().month(month - 1).year(year).daysInMonth();
125
+ };
126
+ export const dayOfWeek = (date) => {
127
+ return dayjs(date).day();
128
+ };
129
+ export const validYearMonth = (yearMonth) => {
130
+ if (!yearMonth || !yearMonth.match(/^\d{4}-\d{2}$/))
131
+ return false;
132
+ const [year, month] = yearMonth.split("-").map(Number);
133
+ return year >= 1000 && year <= 9999 && month >= 1 && month <= 12;
134
+ };
135
+ export const validateDate = (date) => {
136
+ return dayjs(date).isValid();
137
+ };
138
+ /**
139
+ * Returns an array of 7 dates (Sunday → Saturday for the current week)
140
+ * formatted as YYYY-MM-DD using the tenant's timezone (fallback to UTC).
141
+ */
142
+ export const getCurrentWeekDatesSundayToSaturday = (timezone = "UTC") => {
143
+ // Start from "now" in the tenant's timezone, then take the week starting Sunday in that tz.
144
+ const startOfWeek = dayjs().tz(timezone).startOf("week"); // Sunday-start week
145
+ const days = [];
146
+ for (let i = 0; i < 7; i++) {
147
+ days.push(startOfWeek.add(i, "day").tz(timezone).format(dateFormat));
148
+ }
149
+ return days;
150
+ };