@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,109 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ CalendarClock,
5
+ Users,
6
+ DoorOpen,
7
+ Wrench,
8
+ Building2
9
+ } from "lucide-react";
10
+ const RESOURCE_TYPE_CARDS = [
11
+ {
12
+ kind: "person",
13
+ title: "Solo",
14
+ description: "Manage your own schedule, appointments, and availability",
15
+ icon: CalendarClock,
16
+ color: "text-brand-500 bg-[var(--accent-secondary)]",
17
+ examples: "Freelancer, solo practitioner, consultant"
18
+ },
19
+ {
20
+ kind: "person",
21
+ title: "Staff / team",
22
+ description: "Organize service providers with individual schedules and skills",
23
+ icon: Users,
24
+ color: "text-violet-600 bg-violet-50",
25
+ examples: "Stylists, therapists, instructors, doctors",
26
+ defaultLabel: "Staff",
27
+ defaultLabelPlural: "Staff"
28
+ },
29
+ {
30
+ kind: "space",
31
+ title: "Spaces & rooms",
32
+ description: "Shared spaces with variable capacity and operating hours",
33
+ icon: DoorOpen,
34
+ color: "text-[var(--success)] bg-[var(--success-bg)]",
35
+ examples: "Studios, meeting rooms, courts, tables",
36
+ defaultLabel: "Room",
37
+ defaultLabelPlural: "Rooms"
38
+ },
39
+ {
40
+ kind: "equipment",
41
+ title: "Equipment",
42
+ description: "Physical equipment with availability windows",
43
+ icon: Wrench,
44
+ color: "text-amber-600 bg-amber-50",
45
+ examples: "Projectors, cameras, vehicles, tools",
46
+ defaultLabel: "Equipment",
47
+ defaultLabelPlural: "Equipment"
48
+ },
49
+ {
50
+ kind: "unit",
51
+ title: "Units / properties",
52
+ description: "Date-range units for nightly or weekly bookings",
53
+ icon: Building2,
54
+ color: "text-rose-600 bg-rose-50",
55
+ examples: "Apartments, vacation rentals, hotel rooms",
56
+ defaultLabel: "Unit",
57
+ defaultLabelPlural: "Units"
58
+ }
59
+ ];
60
+ const INDUSTRY_CARD_FILTER = {
61
+ beauty: ["Solo", "Staff / Team", "Spaces & Rooms"],
62
+ wellness: ["Solo", "Staff / Team", "Spaces & Rooms"],
63
+ professional: ["Solo", "Staff / Team", "Spaces & Rooms"],
64
+ fitness: ["Staff / Team", "Spaces & Rooms"],
65
+ hospitality: ["Staff / Team", "Units / Properties"],
66
+ creative: ["Solo", "Staff / Team", "Equipment"]
67
+ };
68
+ function ResourceTypePickerEmpty({
69
+ onPick,
70
+ industryKey
71
+ }) {
72
+ const allowedTitles = industryKey ? INDUSTRY_CARD_FILTER[industryKey] : null;
73
+ const visibleCards = allowedTitles ? RESOURCE_TYPE_CARDS.filter((card) => allowedTitles.includes(card.title)) : RESOURCE_TYPE_CARDS;
74
+ return /* @__PURE__ */ jsxs("div", { className: "py-8", children: [
75
+ /* @__PURE__ */ jsxs("div", { className: "text-center mb-8", children: [
76
+ /* @__PURE__ */ jsx("div", { className: "inline-flex items-center justify-center w-14 h-14 rounded-full bg-[var(--bg-subtle)] mb-4", children: /* @__PURE__ */ jsx(CalendarClock, { className: "w-7 h-7 text-[var(--text-muted)]" }) }),
77
+ /* @__PURE__ */ jsx("h2", { className: "text-base font-semibold text-[var(--text-primary)] mb-1", children: "What would you like to manage?" }),
78
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--text-tertiary)] max-w-md mx-auto mb-2", children: "Resources are the people, rooms or equipment that get booked. Add one, set its schedule, and a service that needs it cannot be double-booked." }),
79
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--text-tertiary)] max-w-md mx-auto", children: "Choose the type of resource you need. Each one creates a dedicated section in your sidebar for quick access." })
80
+ ] }),
81
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 max-w-4xl mx-auto", children: visibleCards.map((card) => /* @__PURE__ */ jsxs(
82
+ "button",
83
+ {
84
+ type: "button",
85
+ onClick: () => onPick(
86
+ card.kind === "person" && card.title === "Solo" ? "solo" : card.kind
87
+ ),
88
+ className: "group flex flex-col items-start text-left p-5 bg-[var(--bg-base)] border border-[var(--border-default)] rounded-md hover:border-brand-300 transition-all cursor-pointer",
89
+ children: [
90
+ /* @__PURE__ */ jsx(
91
+ "div",
92
+ {
93
+ className: `flex items-center justify-center w-10 h-10 rounded-full ${card.color} mb-3`,
94
+ children: /* @__PURE__ */ jsx(card.icon, { className: "w-5 h-5" })
95
+ }
96
+ ),
97
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-[var(--text-primary)] mb-1", children: card.title }),
98
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--text-secondary)] leading-relaxed mb-3", children: card.description }),
99
+ /* @__PURE__ */ jsx("p", { className: "text-[11px] text-[var(--text-muted)] italic", children: card.examples })
100
+ ]
101
+ },
102
+ card.title
103
+ )) })
104
+ ] });
105
+ }
106
+ export {
107
+ ResourceTypePickerEmpty
108
+ };
109
+ //# sourceMappingURL=resource-type-picker-empty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/dashboard/%28bookings%29/resources/_components/resource-type-picker-empty.tsx"],"sourcesContent":["'use client';\n\nimport {\n CalendarClock,\n Users,\n DoorOpen,\n Wrench,\n Building2,\n} from 'lucide-react';\n\nconst RESOURCE_TYPE_CARDS = [\n {\n kind: 'person',\n title: 'Solo',\n description: 'Manage your own schedule, appointments, and availability',\n icon: CalendarClock,\n color: 'text-brand-500 bg-[var(--accent-secondary)]',\n examples: 'Freelancer, solo practitioner, consultant',\n },\n {\n kind: 'person',\n title: 'Staff / team',\n description:\n 'Organize service providers with individual schedules and skills',\n icon: Users,\n color: 'text-violet-600 bg-violet-50',\n examples: 'Stylists, therapists, instructors, doctors',\n defaultLabel: 'Staff',\n defaultLabelPlural: 'Staff',\n },\n {\n kind: 'space',\n title: 'Spaces & rooms',\n description: 'Shared spaces with variable capacity and operating hours',\n icon: DoorOpen,\n color: 'text-[var(--success)] bg-[var(--success-bg)]',\n examples: 'Studios, meeting rooms, courts, tables',\n defaultLabel: 'Room',\n defaultLabelPlural: 'Rooms',\n },\n {\n kind: 'equipment',\n title: 'Equipment',\n description: 'Physical equipment with availability windows',\n icon: Wrench,\n color: 'text-amber-600 bg-amber-50',\n examples: 'Projectors, cameras, vehicles, tools',\n defaultLabel: 'Equipment',\n defaultLabelPlural: 'Equipment',\n },\n {\n kind: 'unit',\n title: 'Units / properties',\n description: 'Date-range units for nightly or weekly bookings',\n icon: Building2,\n color: 'text-rose-600 bg-rose-50',\n examples: 'Apartments, vacation rentals, hotel rooms',\n defaultLabel: 'Unit',\n defaultLabelPlural: 'Units',\n },\n];\n\ninterface ResourceTypePickerEmptyProps {\n onPick: (kindValue: string) => void;\n industryKey?: string | null;\n}\n\n// Cards to show per industry. Titles must match RESOURCE_TYPE_CARDS entries.\nconst INDUSTRY_CARD_FILTER: Record<string, string[]> = {\n beauty: ['Solo', 'Staff / Team', 'Spaces & Rooms'],\n wellness: ['Solo', 'Staff / Team', 'Spaces & Rooms'],\n professional: ['Solo', 'Staff / Team', 'Spaces & Rooms'],\n fitness: ['Staff / Team', 'Spaces & Rooms'],\n hospitality: ['Staff / Team', 'Units / Properties'],\n creative: ['Solo', 'Staff / Team', 'Equipment'],\n};\n\nexport function ResourceTypePickerEmpty({\n onPick,\n industryKey,\n}: ResourceTypePickerEmptyProps) {\n const allowedTitles = industryKey ? INDUSTRY_CARD_FILTER[industryKey] : null;\n const visibleCards = allowedTitles\n ? RESOURCE_TYPE_CARDS.filter((card) => allowedTitles.includes(card.title))\n : RESOURCE_TYPE_CARDS;\n return (\n <div className=\"py-8\">\n <div className=\"text-center mb-8\">\n <div className=\"inline-flex items-center justify-center w-14 h-14 rounded-full bg-[var(--bg-subtle)] mb-4\">\n <CalendarClock className=\"w-7 h-7 text-[var(--text-muted)]\" />\n </div>\n <h2 className=\"text-base font-semibold text-[var(--text-primary)] mb-1\">\n What would you like to manage?\n </h2>\n <p className=\"text-sm text-[var(--text-tertiary)] max-w-md mx-auto mb-2\">\n Resources are the people, rooms or equipment that get booked. Add\n one, set its schedule, and a service that needs it cannot be\n double-booked.\n </p>\n <p className=\"text-sm text-[var(--text-tertiary)] max-w-md mx-auto\">\n Choose the type of resource you need. Each one creates a dedicated\n section in your sidebar for quick access.\n </p>\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 max-w-4xl mx-auto\">\n {visibleCards.map((card) => (\n <button\n type=\"button\"\n key={card.title}\n onClick={() =>\n onPick(\n card.kind === 'person' && card.title === 'Solo'\n ? 'solo'\n : card.kind,\n )\n }\n className=\"group flex flex-col items-start text-left p-5 bg-[var(--bg-base)] border border-[var(--border-default)] rounded-md hover:border-brand-300 transition-all cursor-pointer\"\n >\n <div\n className={`flex items-center justify-center w-10 h-10 rounded-full ${card.color} mb-3`}\n >\n <card.icon className=\"w-5 h-5\" />\n </div>\n <h3 className=\"text-sm font-semibold text-[var(--text-primary)] mb-1\">\n {card.title}\n </h3>\n <p className=\"text-xs text-[var(--text-secondary)] leading-relaxed mb-3\">\n {card.description}\n </p>\n <p className=\"text-[11px] text-[var(--text-muted)] italic\">\n {card.examples}\n </p>\n </button>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":";AAuFM,SAEI,KAFJ;AArFN;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,MAAM,sBAAsB;AAAA,EAC1B;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aACE;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,IACd,oBAAoB;AAAA,EACtB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,IACd,oBAAoB;AAAA,EACtB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,IACd,oBAAoB;AAAA,EACtB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,IACd,oBAAoB;AAAA,EACtB;AACF;AAQA,MAAM,uBAAiD;AAAA,EACrD,QAAQ,CAAC,QAAQ,gBAAgB,gBAAgB;AAAA,EACjD,UAAU,CAAC,QAAQ,gBAAgB,gBAAgB;AAAA,EACnD,cAAc,CAAC,QAAQ,gBAAgB,gBAAgB;AAAA,EACvD,SAAS,CAAC,gBAAgB,gBAAgB;AAAA,EAC1C,aAAa,CAAC,gBAAgB,oBAAoB;AAAA,EAClD,UAAU,CAAC,QAAQ,gBAAgB,WAAW;AAChD;AAEO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AACF,GAAiC;AAC/B,QAAM,gBAAgB,cAAc,qBAAqB,WAAW,IAAI;AACxE,QAAM,eAAe,gBACjB,oBAAoB,OAAO,CAAC,SAAS,cAAc,SAAS,KAAK,KAAK,CAAC,IACvE;AACJ,SACE,qBAAC,SAAI,WAAU,QACb;AAAA,yBAAC,SAAI,WAAU,oBACb;AAAA,0BAAC,SAAI,WAAU,6FACb,8BAAC,iBAAc,WAAU,oCAAmC,GAC9D;AAAA,MACA,oBAAC,QAAG,WAAU,2DAA0D,4CAExE;AAAA,MACA,oBAAC,OAAE,WAAU,6DAA4D,2JAIzE;AAAA,MACA,oBAAC,OAAE,WAAU,wDAAuD,0HAGpE;AAAA,OACF;AAAA,IAEA,oBAAC,SAAI,WAAU,0EACZ,uBAAa,IAAI,CAAC,SACjB;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QAEL,SAAS,MACP;AAAA,UACE,KAAK,SAAS,YAAY,KAAK,UAAU,SACrC,SACA,KAAK;AAAA,QACX;AAAA,QAEF,WAAU;AAAA,QAEV;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,2DAA2D,KAAK,KAAK;AAAA,cAEhF,8BAAC,KAAK,MAAL,EAAU,WAAU,WAAU;AAAA;AAAA,UACjC;AAAA,UACA,oBAAC,QAAG,WAAU,yDACX,eAAK,OACR;AAAA,UACA,oBAAC,OAAE,WAAU,6DACV,eAAK,aACR;AAAA,UACA,oBAAC,OAAE,WAAU,+CACV,eAAK,UACR;AAAA;AAAA;AAAA,MAvBK,KAAK;AAAA,IAwBZ,CACD,GACH;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,103 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { Users } from "lucide-react";
5
+ import { Button } from "@withpotter/ui-kit/button";
6
+ import { Card } from "@withpotter/ui-kit/card";
7
+ import { FormDialog } from "@withpotter/ui-kit/form-dialog";
8
+ import { StateView } from "@withpotter/ui-kit/state-view";
9
+ import { useIntentConfig } from "@withpotter/lib/intents/use-intent-config";
10
+ import { ResourcePicker } from "./resource-picker";
11
+ function RosterEmpty({
12
+ saving,
13
+ showEmptyState = true,
14
+ pickerOpen: controlledPickerOpen,
15
+ onPickerOpenChange,
16
+ onCreateCategory
17
+ }) {
18
+ const intentConfig = useIntentConfig();
19
+ const intentKeys = intentConfig.all.map((i) => i.key);
20
+ const [pickerOpen, setPickerOpen] = useState(false);
21
+ const [pickerStep, setPickerStep] = useState(
22
+ null
23
+ );
24
+ const [selectedPreset, setSelectedPreset] = useState(
25
+ null
26
+ );
27
+ const pickerIsOpen = controlledPickerOpen ?? pickerOpen;
28
+ const changePickerOpen = (open) => {
29
+ setPickerOpen(open);
30
+ if (!open) {
31
+ setPickerStep(null);
32
+ setSelectedPreset(null);
33
+ }
34
+ onPickerOpenChange?.(open);
35
+ };
36
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
37
+ showEmptyState && /* @__PURE__ */ jsx("div", { className: "mx-auto max-w-2xl", children: /* @__PURE__ */ jsx(
38
+ StateView,
39
+ {
40
+ kind: "empty",
41
+ icon: Users,
42
+ title: "No resources yet",
43
+ description: "Create staff, spaces, equipment, or anything else your bookings need.",
44
+ action: {
45
+ label: "Create resource",
46
+ onClick: () => changePickerOpen(true)
47
+ }
48
+ }
49
+ ) }),
50
+ /* @__PURE__ */ jsx(
51
+ FormDialog,
52
+ {
53
+ open: pickerIsOpen,
54
+ title: selectedPreset ? `Create ${selectedPreset.plural}?` : pickerStep ? `Choose a ${pickerStep === "person" ? "people" : pickerStep} type` : "Create a resource",
55
+ titleSize: "xl",
56
+ motionPreset: "quick",
57
+ onBack: selectedPreset ? () => setSelectedPreset(null) : pickerStep ? () => setPickerStep(null) : void 0,
58
+ onClose: () => changePickerOpen(false),
59
+ children: selectedPreset ? /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
60
+ /* @__PURE__ */ jsxs(
61
+ Card,
62
+ {
63
+ padding: "lg",
64
+ className: "flex flex-col items-center gap-3 text-center",
65
+ children: [
66
+ /* @__PURE__ */ jsx("span", { className: "flex size-10 items-center justify-center rounded-lg bg-[var(--bg-subtle)] text-[var(--text-secondary)]", children: /* @__PURE__ */ jsx(Users, { className: "size-5" }) }),
67
+ /* @__PURE__ */ jsxs("p", { className: "text-sm text-[var(--text-primary)]", children: [
68
+ "Create a space for your ",
69
+ selectedPreset.plural.toLowerCase(),
70
+ "."
71
+ ] })
72
+ ]
73
+ }
74
+ ),
75
+ /* @__PURE__ */ jsx(
76
+ Button,
77
+ {
78
+ type: "button",
79
+ className: "w-full",
80
+ onClick: () => void onCreateCategory(selectedPreset),
81
+ disabled: saving,
82
+ children: saving ? "Creating\u2026" : `Set up ${selectedPreset.plural}`
83
+ }
84
+ )
85
+ ] }) : /* @__PURE__ */ jsx(
86
+ ResourcePicker,
87
+ {
88
+ category: pickerStep,
89
+ intentKeys,
90
+ selectedId: null,
91
+ showingAll: false,
92
+ onPick: setSelectedPreset,
93
+ onCategoryChange: setPickerStep
94
+ }
95
+ )
96
+ }
97
+ )
98
+ ] });
99
+ }
100
+ export {
101
+ RosterEmpty
102
+ };
103
+ //# sourceMappingURL=roster-empty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/dashboard/%28bookings%29/resources/_components/roster-empty.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport { Users } from 'lucide-react';\nimport { Button } from '@withpotter/ui-kit/button';\nimport { Card } from '@withpotter/ui-kit/card';\nimport { FormDialog } from '@withpotter/ui-kit/form-dialog';\nimport { StateView } from '@withpotter/ui-kit/state-view';\nimport { useIntentConfig } from '@withpotter/lib/intents/use-intent-config';\nimport type { EntityLabel } from '@withpotter/lib/intents/types';\nimport type { ResourceCategoryKind } from '@withpotter/lib/resource-types';\nimport { ResourcePicker } from './resource-picker';\nimport type { ResourcePreset } from '../_lib/presets';\n\nexport function RosterEmpty({\n saving,\n showEmptyState = true,\n pickerOpen: controlledPickerOpen,\n onPickerOpenChange,\n onCreateCategory,\n}: {\n resourceLabel: EntityLabel;\n saving: boolean;\n showEmptyState?: boolean;\n pickerOpen?: boolean;\n onPickerOpenChange?: (open: boolean) => void;\n onCreateCategory: (preset: ResourcePreset) => void | Promise<void>;\n}) {\n const intentConfig = useIntentConfig();\n const intentKeys = intentConfig.all.map((i) => i.key);\n const [pickerOpen, setPickerOpen] = useState(false);\n const [pickerStep, setPickerStep] = useState<ResourceCategoryKind | null>(\n null,\n );\n const [selectedPreset, setSelectedPreset] = useState<ResourcePreset | null>(\n null,\n );\n const pickerIsOpen = controlledPickerOpen ?? pickerOpen;\n\n const changePickerOpen = (open: boolean) => {\n setPickerOpen(open);\n if (!open) {\n setPickerStep(null);\n setSelectedPreset(null);\n }\n onPickerOpenChange?.(open);\n };\n\n return (\n <>\n {showEmptyState && (\n <div className=\"mx-auto max-w-2xl\">\n <StateView\n kind=\"empty\"\n icon={Users}\n title=\"No resources yet\"\n description=\"Create staff, spaces, equipment, or anything else your bookings need.\"\n action={{\n label: 'Create resource',\n onClick: () => changePickerOpen(true),\n }}\n />\n </div>\n )}\n\n <FormDialog\n open={pickerIsOpen}\n title={\n selectedPreset\n ? `Create ${selectedPreset.plural}?`\n : pickerStep\n ? `Choose a ${pickerStep === 'person' ? 'people' : pickerStep} type`\n : 'Create a resource'\n }\n titleSize=\"xl\"\n motionPreset=\"quick\"\n onBack={\n selectedPreset\n ? () => setSelectedPreset(null)\n : pickerStep\n ? () => setPickerStep(null)\n : undefined\n }\n onClose={() => changePickerOpen(false)}\n >\n {selectedPreset ? (\n <div className=\"space-y-4\">\n <Card\n padding=\"lg\"\n className=\"flex flex-col items-center gap-3 text-center\"\n >\n <span className=\"flex size-10 items-center justify-center rounded-lg bg-[var(--bg-subtle)] text-[var(--text-secondary)]\">\n <Users className=\"size-5\" />\n </span>\n <p className=\"text-sm text-[var(--text-primary)]\">\n Create a space for your {selectedPreset.plural.toLowerCase()}.\n </p>\n </Card>\n <Button\n type=\"button\"\n className=\"w-full\"\n onClick={() => void onCreateCategory(selectedPreset)}\n disabled={saving}\n >\n {saving ? 'Creating…' : `Set up ${selectedPreset.plural}`}\n </Button>\n </div>\n ) : (\n <ResourcePicker\n category={pickerStep}\n intentKeys={intentKeys}\n selectedId={null}\n showingAll={false}\n onPick={setSelectedPreset}\n onCategoryChange={setPickerStep}\n />\n )}\n </FormDialog>\n </>\n );\n}\n"],"mappings":";AAiDI,mBAGM,KA0CI,YA7CV;AA/CJ,SAAS,gBAAgB;AACzB,SAAS,aAAa;AACtB,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAC3B,SAAS,iBAAiB;AAC1B,SAAS,uBAAuB;AAGhC,SAAS,sBAAsB;AAGxB,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ;AAAA,EACA;AACF,GAOG;AACD,QAAM,eAAe,gBAAgB;AACrC,QAAM,aAAa,aAAa,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG;AACpD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,CAAC,YAAY,aAAa,IAAI;AAAA,IAClC;AAAA,EACF;AACA,QAAM,CAAC,gBAAgB,iBAAiB,IAAI;AAAA,IAC1C;AAAA,EACF;AACA,QAAM,eAAe,wBAAwB;AAE7C,QAAM,mBAAmB,CAAC,SAAkB;AAC1C,kBAAc,IAAI;AAClB,QAAI,CAAC,MAAM;AACT,oBAAc,IAAI;AAClB,wBAAkB,IAAI;AAAA,IACxB;AACA,yBAAqB,IAAI;AAAA,EAC3B;AAEA,SACE,iCACG;AAAA,sBACC,oBAAC,SAAI,WAAU,qBACb;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAM;AAAA,QACN,aAAY;AAAA,QACZ,QAAQ;AAAA,UACN,OAAO;AAAA,UACP,SAAS,MAAM,iBAAiB,IAAI;AAAA,QACtC;AAAA;AAAA,IACF,GACF;AAAA,IAGF;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,OACE,iBACI,UAAU,eAAe,MAAM,MAC/B,aACE,YAAY,eAAe,WAAW,WAAW,UAAU,UAC3D;AAAA,QAER,WAAU;AAAA,QACV,cAAa;AAAA,QACb,QACE,iBACI,MAAM,kBAAkB,IAAI,IAC5B,aACE,MAAM,cAAc,IAAI,IACxB;AAAA,QAER,SAAS,MAAM,iBAAiB,KAAK;AAAA,QAEpC,2BACC,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,WAAU;AAAA,cAEV;AAAA,oCAAC,UAAK,WAAU,0GACd,8BAAC,SAAM,WAAU,UAAS,GAC5B;AAAA,gBACA,qBAAC,OAAE,WAAU,sCAAqC;AAAA;AAAA,kBACvB,eAAe,OAAO,YAAY;AAAA,kBAAE;AAAA,mBAC/D;AAAA;AAAA;AAAA,UACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,MAAM,KAAK,iBAAiB,cAAc;AAAA,cACnD,UAAU;AAAA,cAET,mBAAS,mBAAc,UAAU,eAAe,MAAM;AAAA;AAAA,UACzD;AAAA,WACF,IAEA;AAAA,UAAC;AAAA;AAAA,YACC,UAAU;AAAA,YACV;AAAA,YACA,YAAY;AAAA,YACZ,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,kBAAkB;AAAA;AAAA,QACpB;AAAA;AAAA,IAEJ;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,160 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Building2, DoorOpen, Stethoscope, Users, Wrench } from "lucide-react";
4
+ import Link from "next/link";
5
+ import { CalendarOff, Power, Trash2 } from "lucide-react";
6
+ import { IdentityCell } from "@withpotter/ui-kit/table-cells";
7
+ import { StatusBadge } from "@withpotter/components/shared/status-badge";
8
+ import { OverflowMenu, OverflowItem } from "@withpotter/ui-kit/overflow-menu";
9
+ import { TableEmptyState } from "@withpotter/ui-kit/table-empty-state";
10
+ import { GroupHeading } from "./group-header";
11
+ import { availabilityWords } from "../_lib/shapes";
12
+ import { blocksOn, isoDay, weekStates } from "../_lib/week";
13
+ import { resolveIcon } from "@withpotter/lib/icon-resolver";
14
+ function RosterGrid({
15
+ sections,
16
+ showHeadings,
17
+ hours,
18
+ blocks,
19
+ locations,
20
+ onAddTo,
21
+ onBlockTime,
22
+ onToggleStatus,
23
+ onDelete
24
+ }) {
25
+ const now = /* @__PURE__ */ new Date();
26
+ const today = isoDay(now);
27
+ const todayDow = now.getDay();
28
+ return /* @__PURE__ */ jsx("div", { className: "space-y-4", children: sections.map(({ category, rows }) => /* @__PURE__ */ jsxs(
29
+ "section",
30
+ {
31
+ className: "surface overflow-hidden",
32
+ children: [
33
+ showHeadings && /* @__PURE__ */ jsx("div", { className: "px-4 pt-3", children: /* @__PURE__ */ jsx(
34
+ GroupHeading,
35
+ {
36
+ category,
37
+ count: rows.length,
38
+ onAdd: onAddTo
39
+ }
40
+ ) }),
41
+ rows.length > 0 && /* @__PURE__ */ jsx("ul", { className: "grid grid-cols-2 gap-3 px-3 pb-3 pt-1", children: rows.map((row) => /* @__PURE__ */ jsx(
42
+ ResourceCard,
43
+ {
44
+ row,
45
+ hours,
46
+ blocks,
47
+ locations,
48
+ today,
49
+ todayDow,
50
+ onBlockTime,
51
+ onToggleStatus,
52
+ onDelete
53
+ },
54
+ row.id
55
+ )) }),
56
+ rows.length === 0 && category && /* @__PURE__ */ jsx("div", { className: "flex min-h-48 items-center px-4 pb-3", children: /* @__PURE__ */ jsx("div", { className: "w-full", children: /* @__PURE__ */ jsx(
57
+ TableEmptyState,
58
+ {
59
+ icon: categoryEmptyIcon(category),
60
+ title: `No ${category.labelPlural.toLowerCase()} yet`,
61
+ description: `Add the ${category.labelPlural.toLowerCase()} customers can book.`
62
+ }
63
+ ) }) })
64
+ ]
65
+ },
66
+ category?.id ?? "ungrouped"
67
+ )) });
68
+ }
69
+ const DEFAULT_CATEGORY_ICONS = {
70
+ person: Users,
71
+ space: DoorOpen,
72
+ equipment: Wrench,
73
+ unit: Building2
74
+ };
75
+ function categoryEmptyIcon(category) {
76
+ if (category.icon) return resolveIcon(category.icon);
77
+ if (category.label.toLowerCase() === "doctor") return Stethoscope;
78
+ return DEFAULT_CATEGORY_ICONS[category.kind];
79
+ }
80
+ function ResourceCard({
81
+ row,
82
+ hours,
83
+ blocks,
84
+ locations,
85
+ today,
86
+ todayDow,
87
+ onBlockTime,
88
+ onToggleStatus,
89
+ onDelete
90
+ }) {
91
+ const dayOff = blocksOn(blocks, row.id, today);
92
+ const week = weekStates(
93
+ row.schedule,
94
+ hours,
95
+ new Set(dayOff.length ? [todayDow] : [])
96
+ );
97
+ const todayState = week.find((d) => d.dow === todayDow);
98
+ const inactive = row.status !== "active";
99
+ const words = availabilityWords(row.category?.kind);
100
+ const shared = (row.maxBookingsPerSlot ?? 1) > 1 ? row.maxBookingsPerSlot : null;
101
+ const branch = locations.length ? locations.find((l) => l.id === row.locationId)?.name ?? "Main" : null;
102
+ const secondary = [
103
+ row.category?.label,
104
+ row.skills?.length ? row.skills.join(", ") : null,
105
+ shared ? `Holds ${shared}` : null,
106
+ branch,
107
+ !row.skills?.length && !shared && !branch ? row.description : null
108
+ ].filter(Boolean).join(" \xB7 ") || void 0;
109
+ return /* @__PURE__ */ jsxs("li", { className: "group relative", children: [
110
+ /* @__PURE__ */ jsxs(
111
+ Link,
112
+ {
113
+ href: `/dashboard/resources/${row.id}`,
114
+ className: "surface block p-4 transition-colors hover:border-[var(--border-strong)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500",
115
+ children: [
116
+ /* @__PURE__ */ jsx("div", { className: "pr-7", children: /* @__PURE__ */ jsx(
117
+ IdentityCell,
118
+ {
119
+ name: row.name,
120
+ secondary,
121
+ image: row.imageUrl ?? void 0,
122
+ avatarSeed: row.name,
123
+ size: "lg"
124
+ }
125
+ ) }),
126
+ /* @__PURE__ */ jsxs("div", { className: "mt-4 flex items-end justify-between gap-3", children: [
127
+ /* @__PURE__ */ jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm", children: inactive ? /* @__PURE__ */ jsx("span", { className: "text-[var(--text-muted)]", children: "Not on the board" }) : dayOff.length ? /* @__PURE__ */ jsxs("span", { className: "text-[var(--text-tertiary)]", children: [
128
+ words.byTheNight ? "Not letting" : "Time off",
129
+ dayOff[0].title && dayOff[0].title !== "Blocked" && /* @__PURE__ */ jsxs("span", { className: "text-[var(--text-muted)]", children: [
130
+ " ",
131
+ dayOff[0].title
132
+ ] })
133
+ ] }) : words.open ? /* @__PURE__ */ jsx("span", { className: "text-[var(--text-primary)]", children: words.open }) : todayState?.hours ? /* @__PURE__ */ jsxs("span", { className: "text-[var(--text-primary)] tabular-nums", children: [
134
+ "Today ",
135
+ todayState.hours
136
+ ] }) : /* @__PURE__ */ jsx("span", { className: "text-[var(--text-muted)]", children: words.closed }) }) }),
137
+ /* @__PURE__ */ jsx(StatusBadge, { status: inactive ? "inactive" : "active" })
138
+ ] })
139
+ ]
140
+ }
141
+ ),
142
+ /* @__PURE__ */ jsx("div", { className: "absolute right-2 top-2", children: /* @__PURE__ */ jsxs(OverflowMenu, { children: [
143
+ /* @__PURE__ */ jsx(OverflowItem, { icon: /* @__PURE__ */ jsx(CalendarOff, {}), onClick: () => onBlockTime(row), children: "Add time off" }),
144
+ /* @__PURE__ */ jsx(OverflowItem, { icon: /* @__PURE__ */ jsx(Power, {}), onClick: () => onToggleStatus(row), children: inactive ? "Make bookable" : "Take off the board" }),
145
+ /* @__PURE__ */ jsx(
146
+ OverflowItem,
147
+ {
148
+ destructive: true,
149
+ icon: /* @__PURE__ */ jsx(Trash2, {}),
150
+ onClick: () => onDelete(row),
151
+ children: "Delete"
152
+ }
153
+ )
154
+ ] }) })
155
+ ] });
156
+ }
157
+ export {
158
+ RosterGrid
159
+ };
160
+ //# sourceMappingURL=roster-grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/dashboard/%28bookings%29/resources/_components/roster-grid.tsx"],"sourcesContent":["'use client';\n\nimport { Building2, DoorOpen, Stethoscope, Users, Wrench } from 'lucide-react';\nimport Link from 'next/link';\nimport { CalendarOff, Power, Trash2 } from 'lucide-react';\nimport { IdentityCell } from '@withpotter/ui-kit/table-cells';\nimport { StatusBadge } from '@withpotter/components/shared/status-badge';\nimport { OverflowMenu, OverflowItem } from '@withpotter/ui-kit/overflow-menu';\nimport { TableEmptyState } from '@withpotter/ui-kit/table-empty-state';\nimport type { WeeklyHours } from '@withpotter/hooks/use-hours-data';\nimport type { CalendarEventItem } from '@withpotter/lib/api/types';\nimport type { CategoryUsage, ResourceCategory } from '@withpotter/lib/resource-types';\nimport type { RosterSection } from '../_hooks/use-roster-page';\nimport type { RosterRow } from '../_hooks/use-roster';\nimport { GroupHeading } from './group-header';\nimport { availabilityWords } from '../_lib/shapes';\nimport { blocksOn, isoDay, weekStates } from '../_lib/week';\nimport { resolveIcon } from '@withpotter/lib/icon-resolver';\n\n/**\n * The roster as cards. John, 2026-08-25: *\"can we have the resources as a grid\n * instead of lists\"* — and *\"ive said this alot\"*, which it had.\n *\n * IT IS NOT THE OLD CARD COMING BACK. The grid this replaced a table with was\n * an initial and a name, three to a line, and it could not answer the only\n * question this page is opened with: can this be booked, and when. Every answer\n * was two clicks in — the week on the record, the business's hours on a second\n * tab, the day off on a third — which is why it lost to a table.\n *\n * So the card carries what the row carried. The week strip and today's hours\n * are on the face of it, and the difference from the table is only that a\n * court, a room and a person are things you recognise rather than lines you\n * read: a photograph is the fastest way to tell one treatment room from\n * another, and a table gives it 28px.\n */\nexport function RosterGrid({\n sections,\n showHeadings,\n hours,\n blocks,\n locations,\n onAddTo,\n onBlockTime,\n onToggleStatus,\n onDelete,\n}: {\n sections: RosterSection[];\n /** Whether the groups are worth naming — one group is the page title. */\n showHeadings: boolean;\n usage: CategoryUsage[];\n hours: WeeklyHours;\n blocks: CalendarEventItem[];\n /** Named branches, when there is more than one. */\n locations: Array<{ id: string; name: string }>;\n onAddTo: (category: ResourceCategory) => void;\n onBlockTime: (row: RosterRow) => void;\n onToggleStatus: (row: RosterRow) => void;\n onDelete: (row: RosterRow) => void;\n}) {\n const now = new Date();\n const today = isoDay(now);\n const todayDow = now.getDay();\n\n return (\n <div className=\"space-y-4\">\n {sections.map(({ category, rows }) => (\n <section\n key={category?.id ?? 'ungrouped'}\n className=\"surface overflow-hidden\"\n >\n {showHeadings && (\n <div className=\"px-4 pt-3\">\n <GroupHeading\n category={category}\n count={rows.length}\n onAdd={onAddTo}\n />\n </div>\n )}\n {rows.length > 0 && (\n <ul className=\"grid grid-cols-2 gap-3 px-3 pb-3 pt-1\">\n {rows.map((row) => (\n <ResourceCard\n key={row.id}\n row={row}\n hours={hours}\n blocks={blocks}\n locations={locations}\n today={today}\n todayDow={todayDow}\n onBlockTime={onBlockTime}\n onToggleStatus={onToggleStatus}\n onDelete={onDelete}\n />\n ))}\n </ul>\n )}\n {rows.length === 0 && category && (\n <div className=\"flex min-h-48 items-center px-4 pb-3\">\n <div className=\"w-full\">\n <TableEmptyState\n icon={categoryEmptyIcon(category)}\n title={`No ${category.labelPlural.toLowerCase()} yet`}\n description={`Add the ${category.labelPlural.toLowerCase()} customers can book.`}\n />\n </div>\n </div>\n )}\n </section>\n ))}\n </div>\n );\n}\n\nconst DEFAULT_CATEGORY_ICONS = {\n person: Users,\n space: DoorOpen,\n equipment: Wrench,\n unit: Building2,\n} as const;\n\nfunction categoryEmptyIcon(category: ResourceCategory) {\n if (category.icon) return resolveIcon(category.icon);\n if (category.label.toLowerCase() === 'doctor') return Stethoscope;\n return DEFAULT_CATEGORY_ICONS[category.kind];\n}\n\nfunction ResourceCard({\n row,\n hours,\n blocks,\n locations,\n today,\n todayDow,\n onBlockTime,\n onToggleStatus,\n onDelete,\n}: {\n row: RosterRow;\n hours: WeeklyHours;\n blocks: CalendarEventItem[];\n locations: Array<{ id: string; name: string }>;\n today: string;\n todayDow: number;\n onBlockTime: (row: RosterRow) => void;\n onToggleStatus: (row: RosterRow) => void;\n onDelete: (row: RosterRow) => void;\n}) {\n const dayOff = blocksOn(blocks, row.id, today);\n const week = weekStates(\n row.schedule,\n hours,\n new Set(dayOff.length ? [todayDow] : []),\n );\n const todayState = week.find((d) => d.dow === todayDow);\n const inactive = row.status !== 'active';\n const words = availabilityWords(row.category?.kind);\n /**\n * Two capacities, one number. `maxBookingsPerSlot` is what can share it, and\n * it is worth saying only when it is more than one — a treatment room that\n * takes one booking is every other card on the screen, a studio that takes\n * twenty is not.\n */\n const shared =\n (row.maxBookingsPerSlot ?? 1) > 1 ? row.maxBookingsPerSlot : null;\n const branch = locations.length\n ? (locations.find((l) => l.id === row.locationId)?.name ?? 'Main')\n : null;\n\n const secondary =\n [\n row.category?.label,\n row.skills?.length ? row.skills.join(', ') : null,\n shared ? `Holds ${shared}` : null,\n branch,\n !row.skills?.length && !shared && !branch ? row.description : null,\n ]\n .filter(Boolean)\n .join(' · ') || undefined;\n\n return (\n <li className=\"group relative\">\n {/* The whole card is the door. A resting card casts no shadow, so this is\n the plain `surface` and the hover is said by the edge alone, the way\n `Card hover` says it — not `surface-interactive`, whose lift is a\n box-shadow. */}\n <Link\n href={`/dashboard/resources/${row.id}`}\n className=\"surface block p-4 transition-colors hover:border-[var(--border-strong)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500\"\n >\n {/* Room for the ⋯, which sits above this in the stack rather than\n inside the link — a menu nested in an anchor navigates on its way\n to opening. */}\n <div className=\"pr-7\">\n <IdentityCell\n name={row.name}\n secondary={secondary}\n image={row.imageUrl ?? undefined}\n avatarSeed={row.name}\n size=\"lg\"\n />\n </div>\n\n <div className=\"mt-4 flex items-end justify-between gap-3\">\n <div className=\"min-w-0\">\n {/* A let is by the night. Seven day-pips over an apartment says it\n closes at five, which is not a fact about an apartment. */}\n <p className=\"mt-2 text-sm\">\n {inactive ? (\n <span className=\"text-[var(--text-muted)]\">\n Not on the board\n </span>\n ) : dayOff.length ? (\n <span className=\"text-[var(--text-tertiary)]\">\n {words.byTheNight ? 'Not letting' : 'Time off'}\n {/* The reason, when there is one worth reading. The API\n titles a bare block \"Blocked\", and \"Time off Blocked\" is\n the same word twice. */}\n {dayOff[0].title && dayOff[0].title !== 'Blocked' && (\n <span className=\"text-[var(--text-muted)]\">\n {' '}\n {dayOff[0].title}\n </span>\n )}\n </span>\n ) : words.open ? (\n <span className=\"text-[var(--text-primary)]\">{words.open}</span>\n ) : todayState?.hours ? (\n <span className=\"text-[var(--text-primary)] tabular-nums\">\n Today {todayState.hours}\n </span>\n ) : (\n <span className=\"text-[var(--text-muted)]\">{words.closed}</span>\n )}\n </p>\n </div>\n\n <StatusBadge status={inactive ? 'inactive' : 'active'} />\n </div>\n </Link>\n\n <div className=\"absolute right-2 top-2\">\n {/* No Edit item. The whole card opens the record, so a menu row that\n does what pressing the card does is the noise this pass is here to\n remove. The table needed it because a table row's click target is\n ambiguous; a card's is the card. */}\n <OverflowMenu>\n <OverflowItem icon={<CalendarOff />} onClick={() => onBlockTime(row)}>\n Add time off\n </OverflowItem>\n <OverflowItem icon={<Power />} onClick={() => onToggleStatus(row)}>\n {inactive ? 'Make bookable' : 'Take off the board'}\n </OverflowItem>\n <OverflowItem\n destructive\n icon={<Trash2 />}\n onClick={() => onDelete(row)}\n >\n Delete\n </OverflowItem>\n </OverflowMenu>\n </div>\n </li>\n );\n}\n"],"mappings":"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","names":[]}