@withpotter/pages-bookings 0.13.0-next.101

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 (270) hide show
  1. package/dist/dashboard/(bookings)/attendees/page.js +8 -0
  2. package/dist/dashboard/(bookings)/attendees/page.js.map +1 -0
  3. package/dist/dashboard/(bookings)/availability/_components/availability-screen.js +714 -0
  4. package/dist/dashboard/(bookings)/availability/_components/availability-screen.js.map +1 -0
  5. package/dist/dashboard/(bookings)/availability/_components/month-availability.js +130 -0
  6. package/dist/dashboard/(bookings)/availability/_components/month-availability.js.map +1 -0
  7. package/dist/dashboard/(bookings)/availability/page.js +10 -0
  8. package/dist/dashboard/(bookings)/availability/page.js.map +1 -0
  9. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/assign-resource-modal.js +133 -0
  10. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/assign-resource-modal.js.map +1 -0
  11. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-constants.js +26 -0
  12. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-constants.js.map +1 -0
  13. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-desktop-layout.js +194 -0
  14. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-desktop-layout.js.map +1 -0
  15. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-layout-props.js +1 -0
  16. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-layout-props.js.map +1 -0
  17. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-lede.js +189 -0
  18. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-lede.js.map +1 -0
  19. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-meta.js +38 -0
  20. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-meta.js.map +1 -0
  21. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-mobile-layout.js +315 -0
  22. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-mobile-layout.js.map +1 -0
  23. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-mobile-screen.js +94 -0
  24. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-mobile-screen.js.map +1 -0
  25. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-money.js +54 -0
  26. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-money.js.map +1 -0
  27. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-split.js +71 -0
  28. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-split.js.map +1 -0
  29. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/cancel-booking-modal.js +102 -0
  30. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/cancel-booking-modal.js.map +1 -0
  31. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/cancellation-notice.js +33 -0
  32. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/cancellation-notice.js.map +1 -0
  33. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/customer-info-card.js +65 -0
  34. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/customer-info-card.js.map +1 -0
  35. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/index.js +23 -0
  36. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/index.js.map +1 -0
  37. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/intake-answers-card.js +19 -0
  38. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/intake-answers-card.js.map +1 -0
  39. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/refund-booking-modal.js +156 -0
  40. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/refund-booking-modal.js.map +1 -0
  41. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/reschedule-booking-modal.js +120 -0
  42. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/reschedule-booking-modal.js.map +1 -0
  43. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/security-deposit-card.js +63 -0
  44. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/security-deposit-card.js.map +1 -0
  45. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/settle-deposit-modal.js +141 -0
  46. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/settle-deposit-modal.js.map +1 -0
  47. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/ticket-row-actions.js +49 -0
  48. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/ticket-row-actions.js.map +1 -0
  49. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/waiting-queue-notice.js +42 -0
  50. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/waiting-queue-notice.js.map +1 -0
  51. package/dist/dashboard/(bookings)/bookings/[bookingId]/_components.js +1 -0
  52. package/dist/dashboard/(bookings)/bookings/[bookingId]/_hooks/index.js +19 -0
  53. package/dist/dashboard/(bookings)/bookings/[bookingId]/_hooks/index.js.map +1 -0
  54. package/dist/dashboard/(bookings)/bookings/[bookingId]/_hooks/use-booking-detail-data.js +352 -0
  55. package/dist/dashboard/(bookings)/bookings/[bookingId]/_hooks/use-booking-detail-data.js.map +1 -0
  56. package/dist/dashboard/(bookings)/bookings/[bookingId]/_hooks.js +1 -0
  57. package/dist/dashboard/(bookings)/bookings/[bookingId]/layout.js +33 -0
  58. package/dist/dashboard/(bookings)/bookings/[bookingId]/layout.js.map +1 -0
  59. package/dist/dashboard/(bookings)/bookings/[bookingId]/page.js +356 -0
  60. package/dist/dashboard/(bookings)/bookings/[bookingId]/page.js.map +1 -0
  61. package/dist/dashboard/(bookings)/bookings/_components/appointment-calendar-layout.js +34 -0
  62. package/dist/dashboard/(bookings)/bookings/_components/appointment-calendar-layout.js.map +1 -0
  63. package/dist/dashboard/(bookings)/bookings/_components/booking-constants.js +92 -0
  64. package/dist/dashboard/(bookings)/bookings/_components/booking-constants.js.map +1 -0
  65. package/dist/dashboard/(bookings)/bookings/_components/booking-tab-hints.js +32 -0
  66. package/dist/dashboard/(bookings)/bookings/_components/booking-tab-hints.js.map +1 -0
  67. package/dist/dashboard/(bookings)/bookings/_components/bookings-filter-bar.js +131 -0
  68. package/dist/dashboard/(bookings)/bookings/_components/bookings-filter-bar.js.map +1 -0
  69. package/dist/dashboard/(bookings)/bookings/_components/bookings-mobile-controls.js +119 -0
  70. package/dist/dashboard/(bookings)/bookings/_components/bookings-mobile-controls.js.map +1 -0
  71. package/dist/dashboard/(bookings)/bookings/_components/bookings-screen.js +414 -0
  72. package/dist/dashboard/(bookings)/bookings/_components/bookings-screen.js.map +1 -0
  73. package/dist/dashboard/(bookings)/bookings/_components/bookings-table.js +192 -0
  74. package/dist/dashboard/(bookings)/bookings/_components/bookings-table.js.map +1 -0
  75. package/dist/dashboard/(bookings)/bookings/_components/cannot-take-bookings.js +34 -0
  76. package/dist/dashboard/(bookings)/bookings/_components/cannot-take-bookings.js.map +1 -0
  77. package/dist/dashboard/(bookings)/bookings/_components/demo-data.js +176 -0
  78. package/dist/dashboard/(bookings)/bookings/_components/demo-data.js.map +1 -0
  79. package/dist/dashboard/(bookings)/bookings/_components/index.js +9 -0
  80. package/dist/dashboard/(bookings)/bookings/_components/index.js.map +1 -0
  81. package/dist/dashboard/(bookings)/bookings/_components/today/booking-card.js +126 -0
  82. package/dist/dashboard/(bookings)/bookings/_components/today/booking-card.js.map +1 -0
  83. package/dist/dashboard/(bookings)/bookings/_components/today/demo-data.js +142 -0
  84. package/dist/dashboard/(bookings)/bookings/_components/today/demo-data.js.map +1 -0
  85. package/dist/dashboard/(bookings)/bookings/_components/today/handover.js +128 -0
  86. package/dist/dashboard/(bookings)/bookings/_components/today/handover.js.map +1 -0
  87. package/dist/dashboard/(bookings)/bookings/_components/today/index.js +17 -0
  88. package/dist/dashboard/(bookings)/bookings/_components/today/index.js.map +1 -0
  89. package/dist/dashboard/(bookings)/bookings/_components/today/past-band.js +69 -0
  90. package/dist/dashboard/(bookings)/bookings/_components/today/past-band.js.map +1 -0
  91. package/dist/dashboard/(bookings)/bookings/_components/today/resource-board.js +111 -0
  92. package/dist/dashboard/(bookings)/bookings/_components/today/resource-board.js.map +1 -0
  93. package/dist/dashboard/(bookings)/bookings/_components/today/today-band.js +61 -0
  94. package/dist/dashboard/(bookings)/bookings/_components/today/today-band.js.map +1 -0
  95. package/dist/dashboard/(bookings)/bookings/_components/today/upcoming-band.js +113 -0
  96. package/dist/dashboard/(bookings)/bookings/_components/today/upcoming-band.js.map +1 -0
  97. package/dist/dashboard/(bookings)/bookings/_components/today/waiting-queue.js +62 -0
  98. package/dist/dashboard/(bookings)/bookings/_components/today/waiting-queue.js.map +1 -0
  99. package/dist/dashboard/(bookings)/bookings/_components/today-board.js +192 -0
  100. package/dist/dashboard/(bookings)/bookings/_components/today-board.js.map +1 -0
  101. package/dist/dashboard/(bookings)/bookings/_components/today.js +1 -0
  102. package/dist/dashboard/(bookings)/bookings/_components.js +1 -0
  103. package/dist/dashboard/(bookings)/bookings/_hooks/index.js +5 -0
  104. package/dist/dashboard/(bookings)/bookings/_hooks/index.js.map +1 -0
  105. package/dist/dashboard/(bookings)/bookings/_hooks/use-bookings-data.js +331 -0
  106. package/dist/dashboard/(bookings)/bookings/_hooks/use-bookings-data.js.map +1 -0
  107. package/dist/dashboard/(bookings)/bookings/_hooks/use-today-data.js +309 -0
  108. package/dist/dashboard/(bookings)/bookings/_hooks/use-today-data.js.map +1 -0
  109. package/dist/dashboard/(bookings)/bookings/_hooks.js +1 -0
  110. package/dist/dashboard/(bookings)/bookings/_lib/booking-link.js +13 -0
  111. package/dist/dashboard/(bookings)/bookings/_lib/booking-link.js.map +1 -0
  112. package/dist/dashboard/(bookings)/bookings/attendees/_components/attendee-cards.js +60 -0
  113. package/dist/dashboard/(bookings)/bookings/attendees/_components/attendee-cards.js.map +1 -0
  114. package/dist/dashboard/(bookings)/bookings/attendees/_components/qr-scanner-modal.js +225 -0
  115. package/dist/dashboard/(bookings)/bookings/attendees/_components/qr-scanner-modal.js.map +1 -0
  116. package/dist/dashboard/(bookings)/bookings/attendees/demo-data.js +195 -0
  117. package/dist/dashboard/(bookings)/bookings/attendees/demo-data.js.map +1 -0
  118. package/dist/dashboard/(bookings)/bookings/attendees/page.js +341 -0
  119. package/dist/dashboard/(bookings)/bookings/attendees/page.js.map +1 -0
  120. package/dist/dashboard/(bookings)/bookings/new/page.js +129 -0
  121. package/dist/dashboard/(bookings)/bookings/new/page.js.map +1 -0
  122. package/dist/dashboard/(bookings)/bookings/page.js +10 -0
  123. package/dist/dashboard/(bookings)/bookings/page.js.map +1 -0
  124. package/dist/dashboard/(bookings)/bookings/sessions/new/_components/save-buttons.js +36 -0
  125. package/dist/dashboard/(bookings)/bookings/sessions/new/_components/save-buttons.js.map +1 -0
  126. package/dist/dashboard/(bookings)/bookings/sessions/new/_components/session-creator.js +386 -0
  127. package/dist/dashboard/(bookings)/bookings/sessions/new/_components/session-creator.js.map +1 -0
  128. package/dist/dashboard/(bookings)/bookings/sessions/new/_lib/session-payload.js +62 -0
  129. package/dist/dashboard/(bookings)/bookings/sessions/new/_lib/session-payload.js.map +1 -0
  130. package/dist/dashboard/(bookings)/bookings/sessions/new/page.js +10 -0
  131. package/dist/dashboard/(bookings)/bookings/sessions/new/page.js.map +1 -0
  132. package/dist/dashboard/(bookings)/calendar/_components/calendar-nav.js +84 -0
  133. package/dist/dashboard/(bookings)/calendar/_components/calendar-nav.js.map +1 -0
  134. package/dist/dashboard/(bookings)/calendar/_components/calendar-range.js +84 -0
  135. package/dist/dashboard/(bookings)/calendar/_components/calendar-range.js.map +1 -0
  136. package/dist/dashboard/(bookings)/calendar/_components/day-board-view.js +279 -0
  137. package/dist/dashboard/(bookings)/calendar/_components/day-board-view.js.map +1 -0
  138. package/dist/dashboard/(bookings)/calendar/_components/event-detail-modal.js +113 -0
  139. package/dist/dashboard/(bookings)/calendar/_components/event-detail-modal.js.map +1 -0
  140. package/dist/dashboard/(bookings)/calendar/_components/format.js +22 -0
  141. package/dist/dashboard/(bookings)/calendar/_components/format.js.map +1 -0
  142. package/dist/dashboard/(bookings)/calendar/_components/month-grid.js +109 -0
  143. package/dist/dashboard/(bookings)/calendar/_components/month-grid.js.map +1 -0
  144. package/dist/dashboard/(bookings)/calendar/_components/resource-day-grid.js +325 -0
  145. package/dist/dashboard/(bookings)/calendar/_components/resource-day-grid.js.map +1 -0
  146. package/dist/dashboard/(bookings)/calendar/_components/slot-action-sheet.js +209 -0
  147. package/dist/dashboard/(bookings)/calendar/_components/slot-action-sheet.js.map +1 -0
  148. package/dist/dashboard/(bookings)/calendar/_components/use-block-drag.js +77 -0
  149. package/dist/dashboard/(bookings)/calendar/_components/use-block-drag.js.map +1 -0
  150. package/dist/dashboard/(bookings)/calendar/_components/use-calendar-nav.js +69 -0
  151. package/dist/dashboard/(bookings)/calendar/_components/use-calendar-nav.js.map +1 -0
  152. package/dist/dashboard/(bookings)/calendar/_components/week-grid.js +202 -0
  153. package/dist/dashboard/(bookings)/calendar/_components/week-grid.js.map +1 -0
  154. package/dist/dashboard/(bookings)/calendar/_components/year-grid.js +111 -0
  155. package/dist/dashboard/(bookings)/calendar/_components/year-grid.js.map +1 -0
  156. package/dist/dashboard/(bookings)/calendar/page.js +8 -0
  157. package/dist/dashboard/(bookings)/calendar/page.js.map +1 -0
  158. package/dist/dashboard/(bookings)/calendar-sync/_components/channel-feed-modal.js +126 -0
  159. package/dist/dashboard/(bookings)/calendar-sync/_components/channel-feed-modal.js.map +1 -0
  160. package/dist/dashboard/(bookings)/calendar-sync/_components/channel-feeds-section.js +99 -0
  161. package/dist/dashboard/(bookings)/calendar-sync/_components/channel-feeds-section.js.map +1 -0
  162. package/dist/dashboard/(bookings)/calendar-sync/demo-data.js +64 -0
  163. package/dist/dashboard/(bookings)/calendar-sync/demo-data.js.map +1 -0
  164. package/dist/dashboard/(bookings)/calendar-sync/page.js +15 -0
  165. package/dist/dashboard/(bookings)/calendar-sync/page.js.map +1 -0
  166. package/dist/dashboard/(bookings)/check-in/page.js +252 -0
  167. package/dist/dashboard/(bookings)/check-in/page.js.map +1 -0
  168. package/dist/dashboard/(bookings)/events/[eventId]/_components/event-attendees.js +108 -0
  169. package/dist/dashboard/(bookings)/events/[eventId]/_components/event-attendees.js.map +1 -0
  170. package/dist/dashboard/(bookings)/events/[eventId]/_components/event-share.js +73 -0
  171. package/dist/dashboard/(bookings)/events/[eventId]/_components/event-share.js.map +1 -0
  172. package/dist/dashboard/(bookings)/events/[eventId]/layout.js +10 -0
  173. package/dist/dashboard/(bookings)/events/[eventId]/layout.js.map +1 -0
  174. package/dist/dashboard/(bookings)/events/[eventId]/page.js +247 -0
  175. package/dist/dashboard/(bookings)/events/[eventId]/page.js.map +1 -0
  176. package/dist/dashboard/(bookings)/events/_components/event-grid.js +44 -0
  177. package/dist/dashboard/(bookings)/events/_components/event-grid.js.map +1 -0
  178. package/dist/dashboard/(bookings)/events/_components/event-poster.js +17 -0
  179. package/dist/dashboard/(bookings)/events/_components/event-poster.js.map +1 -0
  180. package/dist/dashboard/(bookings)/events/_hooks/use-events-data.js +55 -0
  181. package/dist/dashboard/(bookings)/events/_hooks/use-events-data.js.map +1 -0
  182. package/dist/dashboard/(bookings)/events/_lib/event-facts.js +68 -0
  183. package/dist/dashboard/(bookings)/events/_lib/event-facts.js.map +1 -0
  184. package/dist/dashboard/(bookings)/events/new/_components/event-composer.js +295 -0
  185. package/dist/dashboard/(bookings)/events/new/_components/event-composer.js.map +1 -0
  186. package/dist/dashboard/(bookings)/events/new/_components/event-poster.js +65 -0
  187. package/dist/dashboard/(bookings)/events/new/_components/event-poster.js.map +1 -0
  188. package/dist/dashboard/(bookings)/events/new/_components/ticket-tiers.js +75 -0
  189. package/dist/dashboard/(bookings)/events/new/_components/ticket-tiers.js.map +1 -0
  190. package/dist/dashboard/(bookings)/events/new/page.js +10 -0
  191. package/dist/dashboard/(bookings)/events/new/page.js.map +1 -0
  192. package/dist/dashboard/(bookings)/events/page.js +214 -0
  193. package/dist/dashboard/(bookings)/events/page.js.map +1 -0
  194. package/dist/dashboard/(bookings)/resources/[resourceId]/layout.js +36 -0
  195. package/dist/dashboard/(bookings)/resources/[resourceId]/layout.js.map +1 -0
  196. package/dist/dashboard/(bookings)/resources/[resourceId]/page.js +351 -0
  197. package/dist/dashboard/(bookings)/resources/[resourceId]/page.js.map +1 -0
  198. package/dist/dashboard/(bookings)/resources/_components/block-time-modal.js +130 -0
  199. package/dist/dashboard/(bookings)/resources/_components/block-time-modal.js.map +1 -0
  200. package/dist/dashboard/(bookings)/resources/_components/category-card.js +74 -0
  201. package/dist/dashboard/(bookings)/resources/_components/category-card.js.map +1 -0
  202. package/dist/dashboard/(bookings)/resources/_components/category-form-dialog.js +197 -0
  203. package/dist/dashboard/(bookings)/resources/_components/category-form-dialog.js.map +1 -0
  204. package/dist/dashboard/(bookings)/resources/_components/day-editor.js +194 -0
  205. package/dist/dashboard/(bookings)/resources/_components/day-editor.js.map +1 -0
  206. package/dist/dashboard/(bookings)/resources/_components/group-dialog.js +170 -0
  207. package/dist/dashboard/(bookings)/resources/_components/group-dialog.js.map +1 -0
  208. package/dist/dashboard/(bookings)/resources/_components/group-header.js +90 -0
  209. package/dist/dashboard/(bookings)/resources/_components/group-header.js.map +1 -0
  210. package/dist/dashboard/(bookings)/resources/_components/index.js +22 -0
  211. package/dist/dashboard/(bookings)/resources/_components/index.js.map +1 -0
  212. package/dist/dashboard/(bookings)/resources/_components/mobile-category-form-sheet.js +256 -0
  213. package/dist/dashboard/(bookings)/resources/_components/mobile-category-form-sheet.js.map +1 -0
  214. package/dist/dashboard/(bookings)/resources/_components/resource-form.js +420 -0
  215. package/dist/dashboard/(bookings)/resources/_components/resource-form.js.map +1 -0
  216. package/dist/dashboard/(bookings)/resources/_components/resource-picker.js +144 -0
  217. package/dist/dashboard/(bookings)/resources/_components/resource-picker.js.map +1 -0
  218. package/dist/dashboard/(bookings)/resources/_components/resource-type-picker-empty.js +109 -0
  219. package/dist/dashboard/(bookings)/resources/_components/resource-type-picker-empty.js.map +1 -0
  220. package/dist/dashboard/(bookings)/resources/_components/roster-empty.js +103 -0
  221. package/dist/dashboard/(bookings)/resources/_components/roster-empty.js.map +1 -0
  222. package/dist/dashboard/(bookings)/resources/_components/roster-grid.js +160 -0
  223. package/dist/dashboard/(bookings)/resources/_components/roster-grid.js.map +1 -0
  224. package/dist/dashboard/(bookings)/resources/_components/schedule-editor.js +244 -0
  225. package/dist/dashboard/(bookings)/resources/_components/schedule-editor.js.map +1 -0
  226. package/dist/dashboard/(bookings)/resources/_components/schedule-timezone-field.js +25 -0
  227. package/dist/dashboard/(bookings)/resources/_components/schedule-timezone-field.js.map +1 -0
  228. package/dist/dashboard/(bookings)/resources/_components/solo-schedule-view.js +146 -0
  229. package/dist/dashboard/(bookings)/resources/_components/solo-schedule-view.js.map +1 -0
  230. package/dist/dashboard/(bookings)/resources/_components/team-onboarding-dialog.js +161 -0
  231. package/dist/dashboard/(bookings)/resources/_components/team-onboarding-dialog.js.map +1 -0
  232. package/dist/dashboard/(bookings)/resources/_components/week-grid.js +175 -0
  233. package/dist/dashboard/(bookings)/resources/_components/week-grid.js.map +1 -0
  234. package/dist/dashboard/(bookings)/resources/_components.js +1 -0
  235. package/dist/dashboard/(bookings)/resources/_hooks/index.js +8 -0
  236. package/dist/dashboard/(bookings)/resources/_hooks/index.js.map +1 -0
  237. package/dist/dashboard/(bookings)/resources/_hooks/use-resource-categories-data.js +86 -0
  238. package/dist/dashboard/(bookings)/resources/_hooks/use-resource-categories-data.js.map +1 -0
  239. package/dist/dashboard/(bookings)/resources/_hooks/use-roster-page.js +138 -0
  240. package/dist/dashboard/(bookings)/resources/_hooks/use-roster-page.js.map +1 -0
  241. package/dist/dashboard/(bookings)/resources/_hooks/use-roster.js +182 -0
  242. package/dist/dashboard/(bookings)/resources/_hooks/use-roster.js.map +1 -0
  243. package/dist/dashboard/(bookings)/resources/_hooks.js +1 -0
  244. package/dist/dashboard/(bookings)/resources/_lib/presets.js +147 -0
  245. package/dist/dashboard/(bookings)/resources/_lib/presets.js.map +1 -0
  246. package/dist/dashboard/(bookings)/resources/_lib/schedule-timezone.js +17 -0
  247. package/dist/dashboard/(bookings)/resources/_lib/schedule-timezone.js.map +1 -0
  248. package/dist/dashboard/(bookings)/resources/_lib/shapes.js +105 -0
  249. package/dist/dashboard/(bookings)/resources/_lib/shapes.js.map +1 -0
  250. package/dist/dashboard/(bookings)/resources/_lib/week.js +122 -0
  251. package/dist/dashboard/(bookings)/resources/_lib/week.js.map +1 -0
  252. package/dist/dashboard/(bookings)/resources/page.js +391 -0
  253. package/dist/dashboard/(bookings)/resources/page.js.map +1 -0
  254. package/dist/dashboard/(bookings)/schedule/page.js +8 -0
  255. package/dist/dashboard/(bookings)/schedule/page.js.map +1 -0
  256. package/dist/dashboard/(bookings)/today/page.js +14 -0
  257. package/dist/dashboard/(bookings)/today/page.js.map +1 -0
  258. package/dist/dashboard/(bookings)/waitlist/_components/demo-data.js +99 -0
  259. package/dist/dashboard/(bookings)/waitlist/_components/demo-data.js.map +1 -0
  260. package/dist/dashboard/(bookings)/waitlist/_components/offer-spot-modal.js +71 -0
  261. package/dist/dashboard/(bookings)/waitlist/_components/offer-spot-modal.js.map +1 -0
  262. package/dist/dashboard/(bookings)/waitlist/_components/waitlist-entry-editor.js +150 -0
  263. package/dist/dashboard/(bookings)/waitlist/_components/waitlist-entry-editor.js.map +1 -0
  264. package/dist/dashboard/(bookings)/waitlist/new/page.js +59 -0
  265. package/dist/dashboard/(bookings)/waitlist/new/page.js.map +1 -0
  266. package/dist/dashboard/(bookings)/waitlist/page.js +317 -0
  267. package/dist/dashboard/(bookings)/waitlist/page.js.map +1 -0
  268. package/dist/index.js +1 -0
  269. package/dist/index.js.map +1 -0
  270. package/package.json +60 -0
@@ -0,0 +1,414 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useItemLinks } from "@withpotter/lib/use-item-links";
4
+ import { FLAT_CONTROL, TOOLBAR_H } from "@withpotter/ui-kit/toolbar-parts";
5
+ import { useCallback, useMemo, useState } from "react";
6
+ import { useRouter, useSearchParams, usePathname } from "next/navigation";
7
+ import { motion, useReducedMotion } from "motion/react";
8
+ import { durations, springs } from "@withpotter/lib/motion";
9
+ import {
10
+ Calendar,
11
+ CalendarDays,
12
+ CalendarClock,
13
+ Columns3,
14
+ Plus
15
+ } from "lucide-react";
16
+ import { Button } from "@withpotter/ui-kit/button";
17
+ import { ListPage } from "@withpotter/ui-kit/list-page";
18
+ import { useDemoMode } from "@withpotter/hooks/use-demo-mode";
19
+ import { ListFrame } from "@withpotter/ui-kit/list-frame";
20
+ import { CannotTakeBookings } from "./cannot-take-bookings";
21
+ import { ListStates } from "@withpotter/ui-kit/list-states";
22
+ import { TableEmptyState } from "@withpotter/ui-kit/table-empty-state";
23
+ import { TablePagination } from "@withpotter/ui-kit/table-pagination";
24
+ import { BookingsTable } from "./index";
25
+ import { TodayBoard } from "./today-board";
26
+ import { BookingsMobileControls } from "./bookings-mobile-controls";
27
+ import { BookingsFilterBar } from "./bookings-filter-bar";
28
+ import { ViewSwitch } from "@withpotter/ui-kit/view-switch";
29
+ import { DayBoardView } from "@withpotter/pages-bookings/dashboard/(bookings)/calendar/_components/day-board-view";
30
+ import { CalendarTail } from "@withpotter/pages-bookings/dashboard/(bookings)/calendar/_components/calendar-nav";
31
+ import { useCalendarNav } from "@withpotter/pages-bookings/dashboard/(bookings)/calendar/_components/use-calendar-nav";
32
+ import { DEMO_BOOKINGS, DEMO_STATS } from "./demo-data";
33
+ import { useBookingsData } from "../_hooks";
34
+ import { useIntentConfig } from "@withpotter/lib/intents/use-intent-config";
35
+ import { resolveBookingQueryStyle } from "@withpotter/lib/intents/booking-query-style";
36
+ import { useEntityLabel } from "@withpotter/lib/intents/use-entity-label";
37
+ import { MobilePageHeader } from "@withpotter/components/mobile/mobile-page-header";
38
+ import { useRegisterRefresh } from "@withpotter/components/mobile/pull-to-refresh-context";
39
+ import { AvailabilityScreen } from "@withpotter/pages-bookings/dashboard/(bookings)/availability/_components/availability-screen";
40
+ import { useApiQuery } from "@withpotter/hooks/use-api-query";
41
+ import { tenantApi } from "@withpotter/lib/api/tenant";
42
+ const VIEW_ORDER = ["today", "list", "calendar", "availability"];
43
+ function asView(param) {
44
+ if (param === "overview") return "today";
45
+ if (param === "list") return "list";
46
+ return param === "calendar" || param === "today" || param === "availability" ? param : "today";
47
+ }
48
+ function BookingsScreen({
49
+ queryStyle
50
+ }) {
51
+ const router = useRouter();
52
+ const links = useItemLinks();
53
+ const pathname = usePathname();
54
+ const searchParams = useSearchParams();
55
+ const [view, setViewState] = useState(
56
+ () => asView(searchParams.get("view"))
57
+ );
58
+ const [travel, setTravel] = useState(0);
59
+ const urlView = asView(searchParams.get("view"));
60
+ const [seenUrlView, setSeenUrlView] = useState(urlView);
61
+ if (seenUrlView !== urlView) {
62
+ setSeenUrlView(urlView);
63
+ setViewState(urlView);
64
+ }
65
+ const setView = useCallback(
66
+ (next) => {
67
+ setTravel(VIEW_ORDER.indexOf(next) - VIEW_ORDER.indexOf(view));
68
+ setViewState(next);
69
+ const params = new URLSearchParams(searchParams.toString());
70
+ params.set("view", next);
71
+ const qs = params.toString();
72
+ window.history.replaceState(
73
+ null,
74
+ "",
75
+ qs ? `${pathname}?${qs}` : pathname
76
+ );
77
+ },
78
+ [pathname, searchParams, view]
79
+ );
80
+ const calendarNav = useCalendarNav();
81
+ const reduceMotion = useReducedMotion() ?? false;
82
+ const intentConfig = useIntentConfig();
83
+ const { data: readiness } = useApiQuery(
84
+ ["bookings-readiness"],
85
+ (slug) => tenantApi.readiness(slug)
86
+ );
87
+ const bookingQueryStyle = queryStyle ?? resolveBookingQueryStyle(intentConfig.active);
88
+ const {
89
+ bookings,
90
+ stats,
91
+ loading,
92
+ error,
93
+ activeTab,
94
+ searchQuery,
95
+ setSearchQuery,
96
+ statusFilter,
97
+ dateFrom,
98
+ setDateFrom,
99
+ dateTo,
100
+ setDateTo,
101
+ page,
102
+ setPage,
103
+ totalCount,
104
+ totalPages,
105
+ limit,
106
+ TABS,
107
+ modeFilter,
108
+ setModeFilter,
109
+ originFilter,
110
+ setOriginFilter,
111
+ actorFilter,
112
+ setActorFilter,
113
+ MODE_FILTERS,
114
+ ORIGIN_FILTERS,
115
+ ACTOR_FILTERS,
116
+ loadBookings,
117
+ handleTabChange,
118
+ formatCurrency,
119
+ formatDate,
120
+ formatTime
121
+ } = useBookingsData({ queryStyle: bookingQueryStyle });
122
+ useRegisterRefresh(loadBookings);
123
+ const isCalendar = view === "calendar";
124
+ const viewOptions = useMemo(
125
+ () => [
126
+ { value: "today", label: "Overview", icon: Columns3 },
127
+ { value: "calendar", label: "Calendar", icon: CalendarDays },
128
+ {
129
+ value: "availability",
130
+ label: "Availability",
131
+ icon: CalendarClock
132
+ }
133
+ ],
134
+ []
135
+ );
136
+ const modeOptions = useMemo(
137
+ () => MODE_FILTERS.map((f) => ({ value: f.key, label: f.label })),
138
+ [MODE_FILTERS]
139
+ );
140
+ const originOptions = useMemo(
141
+ () => ORIGIN_FILTERS.map((f) => ({ value: f.key, label: f.label })),
142
+ [ORIGIN_FILTERS]
143
+ );
144
+ const actorOptions = useMemo(
145
+ () => ACTOR_FILTERS.map((f) => ({ value: f.key, label: f.label })),
146
+ [ACTOR_FILTERS]
147
+ );
148
+ const bookingLabel = useEntityLabel("booking");
149
+ const bookingSingular = bookingLabel.singular;
150
+ const bookingPlural = bookingLabel.plural;
151
+ const pageTitle = bookingPlural;
152
+ const bookingTabs = useMemo(
153
+ () => TABS.map(
154
+ (tab) => tab.key === "all" ? { ...tab, label: `All ${bookingPlural}` } : tab
155
+ ),
156
+ [TABS, bookingPlural]
157
+ );
158
+ const demoActive = useDemoMode();
159
+ const displayBookings = demoActive ? DEMO_BOOKINGS : bookings;
160
+ const displayStats = demoActive ? DEMO_STATS : stats;
161
+ const displayLoading = demoActive ? false : loading;
162
+ const displayError = demoActive ? null : error;
163
+ const displayTotalCount = demoActive ? DEMO_BOOKINGS.length : totalCount;
164
+ const displayTotalPages = demoActive ? 1 : totalPages;
165
+ const setupBlockers = readiness?.blockers ?? [];
166
+ const needsSession = setupBlockers.some((b) => b.key === "bookable");
167
+ const needsAvailability = setupBlockers.some((b) => b.key === "schedulable");
168
+ const setupIncomplete = needsSession || needsAvailability;
169
+ const primaryAction = needsSession ? {
170
+ label: "Create session",
171
+ href: "/dashboard/catalog/new?intent=take-bookings"
172
+ } : needsAvailability ? {
173
+ label: "Set availability",
174
+ href: "/dashboard/bookings?view=availability"
175
+ } : {
176
+ label: `Add ${bookingSingular.toLowerCase()}`,
177
+ href: "/dashboard/bookings/new"
178
+ };
179
+ const tabCounts = useMemo(() => {
180
+ const by = displayStats?.byStatus;
181
+ if (!by) return {};
182
+ return {
183
+ confirmed: by.confirmed,
184
+ completed: by.completed,
185
+ cancelled: by.cancelled
186
+ };
187
+ }, [displayStats]);
188
+ const statusOptions = useMemo(
189
+ () => bookingTabs.map((tab) => ({
190
+ value: tab.key,
191
+ label: tab.label,
192
+ description: tab.description,
193
+ count: tabCounts[tab.key]
194
+ })),
195
+ [bookingTabs, tabCounts]
196
+ );
197
+ const activeFilterCount = (activeTab !== "all" ? 1 : 0) + (modeFilter !== "all" ? 1 : 0) + (originFilter !== "all" ? 1 : 0) + (actorFilter !== "all" ? 1 : 0) + (dateFrom || dateTo ? 1 : 0);
198
+ const clearAllFilters = () => {
199
+ handleTabChange("all");
200
+ setModeFilter("all");
201
+ setOriginFilter("all");
202
+ setActorFilter("all");
203
+ setDateFrom("");
204
+ setDateTo("");
205
+ setPage(1);
206
+ };
207
+ const hasActiveQuery = Boolean(
208
+ searchQuery || statusFilter || dateFrom || dateTo || modeFilter !== "all" || originFilter !== "all" || actorFilter !== "all"
209
+ );
210
+ if (view === "availability") {
211
+ return /* @__PURE__ */ jsxs(
212
+ ListPage,
213
+ {
214
+ largeTitle: true,
215
+ title: pageTitle,
216
+ mobileHeader: /* @__PURE__ */ jsx(MobilePageHeader, { title: pageTitle }),
217
+ actions: /* @__PURE__ */ jsx(
218
+ ViewSwitch,
219
+ {
220
+ className: `${TOOLBAR_H} ${FLAT_CONTROL}`,
221
+ options: viewOptions,
222
+ value: view,
223
+ onChange: setView,
224
+ "aria-label": "Appointments views",
225
+ compactLabels: true
226
+ }
227
+ ),
228
+ children: [
229
+ /* @__PURE__ */ jsx("div", { className: "lg:hidden", children: /* @__PURE__ */ jsx(
230
+ ViewSwitch,
231
+ {
232
+ options: viewOptions,
233
+ value: view,
234
+ onChange: setView,
235
+ "aria-label": "Appointments views",
236
+ className: "h-[calc(2.75rem-1px)] w-full justify-between"
237
+ }
238
+ ) }),
239
+ /* @__PURE__ */ jsx(AvailabilityScreen, { embedded: true })
240
+ ]
241
+ }
242
+ );
243
+ }
244
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
245
+ ListPage,
246
+ {
247
+ largeTitle: true,
248
+ title: pageTitle,
249
+ mobileHeader: /* @__PURE__ */ jsx(
250
+ MobilePageHeader,
251
+ {
252
+ title: pageTitle,
253
+ action: setupIncomplete ? void 0 : {
254
+ label: primaryAction.label,
255
+ onClick: () => router.push(primaryAction.href)
256
+ }
257
+ }
258
+ ),
259
+ actions: /* @__PURE__ */ jsxs(Fragment, { children: [
260
+ /* @__PURE__ */ jsx(
261
+ ViewSwitch,
262
+ {
263
+ className: `${TOOLBAR_H} ${FLAT_CONTROL}`,
264
+ options: viewOptions,
265
+ value: view,
266
+ onChange: setView,
267
+ "aria-label": `Show ${bookingPlural.toLowerCase()} as a list or a calendar`,
268
+ size: "large",
269
+ compactLabels: true,
270
+ trailing: isCalendar ? /* @__PURE__ */ jsx(CalendarTail, { nav: calendarNav }) : void 0
271
+ }
272
+ ),
273
+ !setupIncomplete && /* @__PURE__ */ jsx(
274
+ Button,
275
+ {
276
+ variant: "primary",
277
+ className: `${TOOLBAR_H} ${FLAT_CONTROL}`,
278
+ onClick: () => router.push(primaryAction.href),
279
+ icon: /* @__PURE__ */ jsx(Plus, { className: "size-4" }),
280
+ iconReveal: true,
281
+ children: /* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: primaryAction.label })
282
+ }
283
+ )
284
+ ] }),
285
+ children: [
286
+ /* @__PURE__ */ jsx("div", { className: "lg:hidden", children: /* @__PURE__ */ jsx(
287
+ ViewSwitch,
288
+ {
289
+ options: viewOptions,
290
+ value: view,
291
+ onChange: setView,
292
+ "aria-label": "Appointments views",
293
+ className: "h-11 w-full justify-between"
294
+ }
295
+ ) }),
296
+ view === "today" ? /* @__PURE__ */ jsx(CannotTakeBookings, {}) : null,
297
+ /* @__PURE__ */ jsx(
298
+ motion.div,
299
+ {
300
+ className: "space-y-3 lg:space-y-4",
301
+ initial: reduceMotion ? false : { opacity: 0, x: travel >= 0 ? 24 : -24, scale: 0.99 },
302
+ animate: { opacity: 1, x: 0, scale: 1 },
303
+ transition: reduceMotion ? { duration: durations.fast } : { ...springs.gentle, opacity: { duration: durations.normal } },
304
+ children: view === "today" ? setupIncomplete ? null : /* @__PURE__ */ jsx(TodayBoard, { types: bookingQueryStyle?.bookingTypes }) : isCalendar ? /* @__PURE__ */ jsx(DayBoardView, { nav: calendarNav }) : /* @__PURE__ */ jsxs(Fragment, { children: [
305
+ /* @__PURE__ */ jsx(
306
+ BookingsMobileControls,
307
+ {
308
+ bookingPlural,
309
+ statusOptions,
310
+ activeTab,
311
+ onTabChange: handleTabChange,
312
+ searchQuery,
313
+ onSearchChange: setSearchQuery,
314
+ modeFilter,
315
+ setModeFilter,
316
+ originFilter,
317
+ setOriginFilter,
318
+ actorFilter,
319
+ setActorFilter,
320
+ modeOptions,
321
+ originOptions,
322
+ actorOptions,
323
+ setPage,
324
+ activeFilterCount,
325
+ onClearFilters: clearAllFilters
326
+ }
327
+ ),
328
+ /* @__PURE__ */ jsx(
329
+ ListFrame,
330
+ {
331
+ toolbar: /* @__PURE__ */ jsx(
332
+ BookingsFilterBar,
333
+ {
334
+ searchQuery,
335
+ setSearchQuery,
336
+ bookingPlural,
337
+ activeFilterCount,
338
+ clearAllFilters,
339
+ activeTab,
340
+ handleTabChange,
341
+ statusOptions,
342
+ modeFilter,
343
+ setModeFilter,
344
+ modeOptions,
345
+ originFilter,
346
+ setOriginFilter,
347
+ originOptions,
348
+ actorFilter,
349
+ setActorFilter,
350
+ actorOptions,
351
+ dateFrom,
352
+ dateTo,
353
+ setDateFrom,
354
+ setDateTo,
355
+ setPage
356
+ }
357
+ ),
358
+ children: /* @__PURE__ */ jsx(
359
+ ListStates,
360
+ {
361
+ framed: true,
362
+ loading: displayLoading && displayBookings.length === 0,
363
+ isEmpty: displayBookings.length === 0,
364
+ error: displayError,
365
+ onRetry: () => loadBookings(),
366
+ empty: /* @__PURE__ */ jsx(
367
+ TableEmptyState,
368
+ {
369
+ icon: Calendar,
370
+ title: `No ${bookingPlural.toLowerCase()} found`,
371
+ description: hasActiveQuery ? "Try adjusting your search or filters" : `${bookingPlural} will appear here when customers make reservations`,
372
+ action: hasActiveQuery ? void 0 : {
373
+ label: "Create a session",
374
+ href: "/dashboard/catalog/new?intent=take-bookings"
375
+ }
376
+ }
377
+ ),
378
+ children: /* @__PURE__ */ jsx(
379
+ BookingsTable,
380
+ {
381
+ bookings: displayBookings,
382
+ formatCurrency,
383
+ formatDate,
384
+ formatTime,
385
+ onSelectRow: (b) => router.push(links.bookingDetail(b.id)),
386
+ footer: /* @__PURE__ */ jsx(
387
+ TablePagination,
388
+ {
389
+ page,
390
+ totalPages: displayTotalPages,
391
+ pageSize: limit,
392
+ totalItems: displayTotalCount,
393
+ entityName: "bookings",
394
+ onPageChange: setPage
395
+ }
396
+ )
397
+ }
398
+ )
399
+ }
400
+ )
401
+ }
402
+ )
403
+ ] })
404
+ },
405
+ view
406
+ )
407
+ ]
408
+ }
409
+ ) });
410
+ }
411
+ export {
412
+ BookingsScreen
413
+ };
414
+ //# sourceMappingURL=bookings-screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/dashboard/%28bookings%29/bookings/_components/bookings-screen.tsx"],"sourcesContent":["'use client';\n\nimport { useItemLinks } from '@withpotter/lib/use-item-links';\nimport { FLAT_CONTROL, TOOLBAR_H } from '@withpotter/ui-kit/toolbar-parts';\nimport { useCallback, useMemo, useState } from 'react';\nimport { useRouter, useSearchParams, usePathname } from 'next/navigation';\nimport { motion, useReducedMotion } from 'motion/react';\nimport { durations, springs } from '@withpotter/lib/motion';\nimport {\n Calendar,\n CalendarDays,\n CalendarClock,\n Columns3,\n Plus,\n} from 'lucide-react';\nimport { Button } from '@withpotter/ui-kit/button';\nimport { ListPage } from '@withpotter/ui-kit/list-page';\nimport { useDemoMode } from '@withpotter/hooks/use-demo-mode';\nimport { ListFrame } from '@withpotter/ui-kit/list-frame';\nimport { CannotTakeBookings } from './cannot-take-bookings';\nimport { ListStates } from '@withpotter/ui-kit/list-states';\nimport { TableEmptyState } from '@withpotter/ui-kit/table-empty-state';\nimport { TablePagination } from '@withpotter/ui-kit/table-pagination';\nimport { BookingsTable } from './index';\nimport { TodayBoard } from './today-board';\nimport { BookingsMobileControls } from './bookings-mobile-controls';\nimport { BookingsFilterBar } from './bookings-filter-bar';\nimport { ViewSwitch } from '@withpotter/ui-kit/view-switch';\nimport { DayBoardView } from '@withpotter/pages-bookings/dashboard/(bookings)/calendar/_components/day-board-view';\nimport { CalendarTail } from '@withpotter/pages-bookings/dashboard/(bookings)/calendar/_components/calendar-nav';\nimport { useCalendarNav } from '@withpotter/pages-bookings/dashboard/(bookings)/calendar/_components/use-calendar-nav';\nimport { DEMO_BOOKINGS, DEMO_STATS } from './demo-data';\nimport { useBookingsData } from '../_hooks';\nimport { useIntentConfig } from '@withpotter/lib/intents/use-intent-config';\nimport { resolveBookingQueryStyle } from '@withpotter/lib/intents/booking-query-style';\nimport type { BookingQueryStyle } from '@withpotter/lib/intents';\nimport { useEntityLabel } from '@withpotter/lib/intents/use-entity-label';\nimport { MobilePageHeader } from '@withpotter/components/mobile/mobile-page-header';\nimport { useRegisterRefresh } from '@withpotter/components/mobile/pull-to-refresh-context';\nimport { AvailabilityScreen } from '@withpotter/pages-bookings/dashboard/(bookings)/availability/_components/availability-screen';\nimport { useApiQuery } from '@withpotter/hooks/use-api-query';\nimport { tenantApi } from '@withpotter/lib/api/tenant';\nimport type { StorefrontReadiness } from '@withpotter/lib/api/types';\n\ntype BookingView = 'today' | 'list' | 'calendar' | 'availability';\n\n/** Left to right, as the switch draws them; the overview leads. */\nconst VIEW_ORDER: BookingView[] = ['today', 'list', 'calendar', 'availability'];\n\n/* `overview` is the control's word, `today` the URL token the redirect and\n the mobile route contract use. */\nfunction asView(param: string | null): BookingView {\n if (param === 'overview') return 'today';\n if (param === 'list') return 'list';\n return param === 'calendar' || param === 'today' || param === 'availability'\n ? param\n : 'today';\n}\n\nexport function BookingsScreen({\n queryStyle,\n}: {\n /** The bookings to list, declared by the route. Absent on /dashboard/bookings. */\n queryStyle?: BookingQueryStyle;\n}) {\n const router = useRouter();\n const links = useItemLinks();\n const pathname = usePathname();\n const searchParams = useSearchParams();\n\n /**\n * WHICH VIEW. It lives in the URL (/dashboard/calendar redirects here with\n * ?view=calendar, and a shared link must open where it was shared), but is\n * held as state: deriving it from `useSearchParams` made every press of the\n * switch an App Router navigation with a visible wait. The URL is brought up\n * to date with `history.replaceState`, and the effect adopts changes that\n * come from outside (back, forward, a link landing here).\n */\n const [view, setViewState] = useState<BookingView>(() =>\n asView(searchParams.get('view')),\n );\n /**\n * Which way the switch was pressed, so the board TRAVELS that way.\n *\n * A crossfade with a four-pixel rise said only \"something changed\". These\n * three views sit in a row and you pick one by pressing left or right along\n * it, so the content arriving from the side you pressed is the same gesture\n * continued: the thumb slides right, the calendar comes in from the right.\n * Held as state rather than derived, because the direction is a property of\n * the LAST press, not of the current view.\n */\n const [travel, setTravel] = useState(0);\n /* Adopted DURING RENDER, React's own shape for \"a prop changed and this\n state derives from it\" — not in an effect, which would paint the old view\n for a frame first and is what `react-hooks/set-state-in-effect` is there to\n stop. Same pattern `RollingNumber` uses. */\n const urlView = asView(searchParams.get('view'));\n const [seenUrlView, setSeenUrlView] = useState(urlView);\n if (seenUrlView !== urlView) {\n setSeenUrlView(urlView);\n setViewState(urlView);\n }\n\n const setView = useCallback(\n (next: BookingView) => {\n setTravel(VIEW_ORDER.indexOf(next) - VIEW_ORDER.indexOf(view));\n setViewState(next);\n const params = new URLSearchParams(searchParams.toString());\n params.set('view', next);\n const qs = params.toString();\n window.history.replaceState(\n null,\n '',\n qs ? `${pathname}?${qs}` : pathname,\n );\n },\n [pathname, searchParams, view],\n );\n /* The calendar's own controls sit on the page header row, so where the\n calendar is pointed is held here rather than inside the board. */\n const calendarNav = useCalendarNav();\n const reduceMotion = useReducedMotion() ?? false;\n\n const intentConfig = useIntentConfig();\n const { data: readiness } = useApiQuery<StorefrontReadiness>(\n ['bookings-readiness'],\n (slug) => tenantApi.readiness(slug),\n );\n // Every archetype on screen, not `primary`. These are query FILTERS, so the\n // wrong archetype does not mislabel the diary — it empties it.\n const bookingQueryStyle =\n queryStyle ?? resolveBookingQueryStyle(intentConfig.active);\n const {\n bookings,\n stats,\n loading,\n error,\n activeTab,\n searchQuery,\n setSearchQuery,\n statusFilter,\n dateFrom,\n setDateFrom,\n dateTo,\n setDateTo,\n page,\n setPage,\n totalCount,\n totalPages,\n limit,\n TABS,\n modeFilter,\n setModeFilter,\n originFilter,\n setOriginFilter,\n actorFilter,\n setActorFilter,\n MODE_FILTERS,\n ORIGIN_FILTERS,\n ACTOR_FILTERS,\n loadBookings,\n handleTabChange,\n formatCurrency,\n formatDate,\n formatTime,\n } = useBookingsData({ queryStyle: bookingQueryStyle });\n useRegisterRefresh(loadBookings);\n\n const isCalendar = view === 'calendar';\n\n /**\n * Three ways to read the same bookings, and the icon is the SHAPE of each.\n *\n * Today wore a `Calendar` beside Calendar's `CalendarDays` — two calendar\n * glyphs in one three-option control, the only difference a row of dots. The\n * desk board is lanes, the list is rows, the calendar is a grid; the labels\n * carry the meaning and the marks now carry the shape.\n */\n const viewOptions = useMemo(\n () => [\n { value: 'today' as const, label: 'Overview', icon: Columns3 },\n { value: 'calendar' as const, label: 'Calendar', icon: CalendarDays },\n {\n value: 'availability' as const,\n label: 'Availability',\n icon: CalendarClock,\n },\n ],\n [],\n );\n\n const modeOptions = useMemo(\n () => MODE_FILTERS.map((f) => ({ value: f.key, label: f.label })),\n [MODE_FILTERS],\n );\n const originOptions = useMemo(\n () => ORIGIN_FILTERS.map((f) => ({ value: f.key, label: f.label })),\n [ORIGIN_FILTERS],\n );\n const actorOptions = useMemo(\n () => ACTOR_FILTERS.map((f) => ({ value: f.key, label: f.label })),\n [ACTOR_FILTERS],\n );\n\n // One resolver, so the merchant's own rename survives an active archetype.\n // This used to branch: with an intent active it read the archetype noun and\n // ignored `moduleLabels` entirely, so a club that renamed Bookings to\n // \"Sessions\" got Sessions in the sidebar and \"Appointments\" on the page.\n const bookingLabel = useEntityLabel('booking');\n const bookingSingular = bookingLabel.singular;\n const bookingPlural = bookingLabel.plural;\n const pageTitle = bookingPlural;\n const bookingTabs = useMemo(\n () =>\n TABS.map((tab) =>\n tab.key === 'all' ? { ...tab, label: `All ${bookingPlural}` } : tab,\n ),\n [TABS, bookingPlural],\n );\n\n // The shared hook, not a seventh copy of the same twenty lines. It also\n // fixes the setState-in-effect this local version carried.\n const demoActive = useDemoMode();\n\n const displayBookings = demoActive ? DEMO_BOOKINGS : bookings;\n const displayStats = demoActive ? DEMO_STATS : stats;\n const displayLoading = demoActive ? false : loading;\n const displayError = demoActive ? null : error;\n const displayTotalCount = demoActive ? DEMO_BOOKINGS.length : totalCount;\n const displayTotalPages = demoActive ? 1 : totalPages;\n const setupBlockers = readiness?.blockers ?? [];\n const needsSession = setupBlockers.some((b) => b.key === 'bookable');\n const needsAvailability = setupBlockers.some((b) => b.key === 'schedulable');\n const setupIncomplete = needsSession || needsAvailability;\n const primaryAction = needsSession\n ? {\n label: 'Create session',\n href: '/dashboard/catalog/new?intent=take-bookings',\n }\n : needsAvailability\n ? {\n label: 'Set availability',\n href: '/dashboard/bookings?view=availability',\n }\n : {\n label: `Add ${bookingSingular.toLowerCase()}`,\n href: '/dashboard/bookings/new',\n };\n\n /**\n * Tab key → how many sit behind it. Derived from the same status counts the\n * six stat cards used to show, so nothing was lost when they went. The\n * payment tabs have no status count to draw on, which is why they carry none\n * rather than a zero.\n *\n * `upcoming` and `past` carry none for the same reason: they are date\n * filters, and the stats endpoint only counts by status. `upcoming` used to\n * show pending + confirmed, which is what it used to select — now that it\n * means \"from today onward\" the sum would be a number the list disagrees\n * with, and a count that contradicts the rows under it is worse than no\n * count.\n */\n const tabCounts = useMemo<Record<string, number | undefined>>(() => {\n const by = displayStats?.byStatus;\n if (!by) return {};\n return {\n confirmed: by.confirmed,\n completed: by.completed,\n cancelled: by.cancelled,\n };\n }, [displayStats]);\n\n /**\n * Status now lives in the Filters panel with everything else, rather than as\n * a tab row above the table. Two filtering mechanisms side by side made the\n * surface read as if they did different kinds of work; they did not. The\n * counts survive by riding on the option labels, so the pipeline is still\n * legible without a second control.\n */\n const statusOptions = useMemo(\n () =>\n bookingTabs.map((tab) => ({\n value: tab.key,\n label: tab.label,\n description: tab.description,\n count: tabCounts[tab.key],\n })),\n [bookingTabs, tabCounts],\n );\n\n // Secondary filters (mode/origin/actor/date) fold into a Filters panel, the\n // customers pattern — the tabs stay as the primary axis on the row.\n const activeFilterCount =\n (activeTab !== 'all' ? 1 : 0) +\n (modeFilter !== 'all' ? 1 : 0) +\n (originFilter !== 'all' ? 1 : 0) +\n (actorFilter !== 'all' ? 1 : 0) +\n (dateFrom || dateTo ? 1 : 0);\n\n const clearAllFilters = () => {\n handleTabChange('all');\n setModeFilter('all');\n setOriginFilter('all');\n setActorFilter('all');\n setDateFrom('');\n setDateTo('');\n setPage(1);\n };\n const hasActiveQuery = Boolean(\n searchQuery ||\n statusFilter ||\n dateFrom ||\n dateTo ||\n modeFilter !== 'all' ||\n originFilter !== 'all' ||\n actorFilter !== 'all',\n );\n\n if (view === 'availability') {\n return (\n <ListPage\n largeTitle\n title={pageTitle}\n mobileHeader={<MobilePageHeader title={pageTitle} />}\n actions={\n <ViewSwitch\n className={`${TOOLBAR_H} ${FLAT_CONTROL}`}\n options={viewOptions}\n value={view}\n onChange={setView}\n aria-label=\"Appointments views\"\n compactLabels\n />\n }\n >\n <div className=\"lg:hidden\">\n <ViewSwitch\n options={viewOptions}\n value={view}\n onChange={setView}\n aria-label=\"Appointments views\"\n className=\"h-[calc(2.75rem-1px)] w-full justify-between\"\n />\n </div>\n <AvailabilityScreen embedded />\n </ListPage>\n );\n }\n\n return (\n <>\n <ListPage\n largeTitle\n title={pageTitle}\n mobileHeader={\n <MobilePageHeader\n title={pageTitle}\n action={\n setupIncomplete\n ? undefined\n : {\n label: primaryAction.label,\n onClick: () => router.push(primaryAction.href),\n }\n }\n />\n }\n // Everything you do TO the list on one row; the frame below is the list.\n actions={\n <>\n {/* No Waitlist button here. It was the seventh control on this row\n and pushed the page title down to \"App…\". The queue is a sub-nav\n under this surface in the sidebar instead, which is where a\n smaller surface attached to a bigger one belongs. */}\n {/*\n * ONE CONTROL, NOT THREE. The range and the date position are not\n * peers of the three views — they are what the Calendar view is\n * showing, and where — so both ride inside the switch's own track,\n * behind a hairline, and open and close with the view that owns\n * them. See `CalendarTail`.\n */}\n <ViewSwitch\n className={`${TOOLBAR_H} ${FLAT_CONTROL}`}\n options={viewOptions}\n value={view}\n onChange={setView}\n aria-label={`Show ${bookingPlural.toLowerCase()} as a list or a calendar`}\n size=\"large\"\n compactLabels\n trailing={\n isCalendar ? <CalendarTail nav={calendarNav} /> : undefined\n }\n />\n {/* One door. \"Quick walk-in\" and \"Add appointment\" opened the same\n slide-over in two moods, which read as two things to learn and\n was two places to fix anything. Walk-in is a choice on the\n create screen now, and the desk board links straight to it with\n that choice already made. */}\n {!setupIncomplete && (\n <Button\n variant=\"primary\"\n className={`${TOOLBAR_H} ${FLAT_CONTROL}`}\n onClick={() => router.push(primaryAction.href)}\n icon={<Plus className=\"size-4\" />}\n iconReveal\n >\n <span className=\"hidden sm:inline\">{primaryAction.label}</span>\n </Button>\n )}\n </>\n }\n >\n <div className=\"lg:hidden\">\n <ViewSwitch\n options={viewOptions}\n value={view}\n onChange={setView}\n aria-label=\"Appointments views\"\n className=\"h-11 w-full justify-between\"\n />\n </div>\n {/* The view choice belongs immediately below the page title. Setup\n status then explains what the selected view needs before it can\n show useful appointment data. */}\n {view === 'today' ? <CannotTakeBookings /> : null}\n\n {/*\n * THE SWAP TRAVELS. Keyed on the view, so React mounts the new board\n * and motion runs its entrance: in from the side the switch moved\n * toward, on the house's gentle spring, with a hair of scale so the\n * board reads as coming forward rather than sliding past.\n *\n * No exit animation. Waiting for the old view to leave before the new\n * one starts is exactly the delay the switch was rewritten to remove,\n * and a view you asked for should already be arriving. The old one is\n * simply replaced under the new one's entrance.\n */}\n <motion.div\n key={view}\n className=\"space-y-3 lg:space-y-4\"\n initial={\n reduceMotion\n ? false\n : { opacity: 0, x: travel >= 0 ? 24 : -24, scale: 0.99 }\n }\n animate={{ opacity: 1, x: 0, scale: 1 }}\n transition={\n reduceMotion\n ? { duration: durations.fast }\n : { ...springs.gentle, opacity: { duration: durations.normal } }\n }\n >\n {view === 'today' ? (\n setupIncomplete ? null : (\n <TodayBoard types={bookingQueryStyle?.bookingTypes} />\n )\n ) : isCalendar ? (\n <DayBoardView nav={calendarNav} />\n ) : (\n <>\n <BookingsMobileControls\n bookingPlural={bookingPlural}\n statusOptions={statusOptions}\n activeTab={activeTab}\n onTabChange={handleTabChange}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n modeFilter={modeFilter}\n setModeFilter={setModeFilter}\n originFilter={originFilter}\n setOriginFilter={setOriginFilter}\n actorFilter={actorFilter}\n setActorFilter={setActorFilter}\n modeOptions={modeOptions}\n originOptions={originOptions}\n actorOptions={actorOptions}\n setPage={setPage}\n activeFilterCount={activeFilterCount}\n onClearFilters={clearAllFilters}\n />\n <ListFrame\n /* One filter row, the app's own — after orders and customers,\n * the third and last of the hand-rolled ones. `FilterBar` owns\n * the search field, the toggle, the disclosure state and the\n * panel together; this page had all four as separate pieces,\n * with search and the button passed down to the table and the\n * panel placed from up here. */\n toolbar={\n <BookingsFilterBar\n searchQuery={searchQuery}\n setSearchQuery={setSearchQuery}\n bookingPlural={bookingPlural}\n activeFilterCount={activeFilterCount}\n clearAllFilters={clearAllFilters}\n activeTab={activeTab}\n handleTabChange={handleTabChange}\n statusOptions={statusOptions}\n modeFilter={modeFilter}\n setModeFilter={setModeFilter}\n modeOptions={modeOptions}\n originFilter={originFilter}\n setOriginFilter={setOriginFilter}\n originOptions={originOptions}\n actorFilter={actorFilter}\n setActorFilter={setActorFilter}\n actorOptions={actorOptions}\n dateFrom={dateFrom}\n dateTo={dateTo}\n setDateFrom={setDateFrom}\n setDateTo={setDateTo}\n setPage={setPage}\n />\n }\n >\n <ListStates\n framed\n loading={displayLoading && displayBookings.length === 0}\n isEmpty={displayBookings.length === 0}\n error={displayError}\n onRetry={() => loadBookings()}\n empty={\n <TableEmptyState\n icon={Calendar}\n title={`No ${bookingPlural.toLowerCase()} found`}\n description={\n hasActiveQuery\n ? 'Try adjusting your search or filters'\n : `${bookingPlural} will appear here when customers make reservations`\n }\n /* On a first run the header's act is the useless one:\n nobody can be booked in until there is something to\n book. A filtered empty gets nothing, because arriving\n at an empty search is not wanting to build a session. */\n action={\n hasActiveQuery\n ? undefined\n : {\n label: 'Create a session',\n href: '/dashboard/catalog/new?intent=take-bookings',\n }\n }\n />\n }\n >\n <BookingsTable\n bookings={displayBookings}\n formatCurrency={formatCurrency}\n formatDate={formatDate}\n formatTime={formatTime}\n onSelectRow={(b) => router.push(links.bookingDetail(b.id))}\n footer={\n <TablePagination\n page={page}\n totalPages={displayTotalPages}\n pageSize={limit}\n totalItems={displayTotalCount}\n entityName=\"bookings\"\n onPageChange={setPage}\n />\n }\n />\n </ListStates>\n </ListFrame>\n </>\n )}\n </motion.div>\n </ListPage>\n </>\n );\n}\n"],"mappings":"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","names":[]}