@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,244 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { Plus, Trash2 } from "lucide-react";
4
+ import { useState } from "react";
5
+ import { DAY_LABELS } from "@withpotter/lib/resource-types";
6
+ import { TimeField, Checkbox } from "@withpotter/ui-kit";
7
+ function getDefaultSchedule() {
8
+ const schedule = {};
9
+ for (let i = 0; i < 7; i++) {
10
+ schedule[i] = {
11
+ available: i >= 1 && i <= 5,
12
+ // Mon-Fri
13
+ slots: i >= 1 && i <= 5 ? [{ start: "09:00", end: "17:00" }] : []
14
+ };
15
+ }
16
+ return schedule;
17
+ }
18
+ function ScheduleEditor({
19
+ schedule,
20
+ onChange,
21
+ title = "The week it works",
22
+ layout = "rows"
23
+ }) {
24
+ const [selectedDay, setSelectedDay] = useState(1);
25
+ const toggleDay = (dayIndex) => {
26
+ const day = schedule[dayIndex] ?? { available: false, slots: [] };
27
+ const newAvailable = !day.available;
28
+ onChange({
29
+ ...schedule,
30
+ [dayIndex]: {
31
+ available: newAvailable,
32
+ slots: newAvailable && (!day.slots || day.slots.length === 0) ? [{ start: "09:00", end: "17:00" }] : day.slots ?? []
33
+ }
34
+ });
35
+ };
36
+ const updateSlot = (dayIndex, slotIndex, field, value) => {
37
+ const day = schedule[dayIndex];
38
+ if (!day?.slots) return;
39
+ const newSlots = [...day.slots];
40
+ newSlots[slotIndex] = { ...newSlots[slotIndex], [field]: value };
41
+ onChange({
42
+ ...schedule,
43
+ [dayIndex]: { ...day, slots: newSlots }
44
+ });
45
+ };
46
+ const addSlot = (dayIndex) => {
47
+ const day = schedule[dayIndex];
48
+ if (!day) return;
49
+ const slots = day.slots ?? [];
50
+ const lastSlot = slots[slots.length - 1];
51
+ const newStart = lastSlot ? lastSlot.end : "09:00";
52
+ onChange({
53
+ ...schedule,
54
+ [dayIndex]: {
55
+ ...day,
56
+ slots: [...slots, { start: newStart, end: "17:00" }]
57
+ }
58
+ });
59
+ };
60
+ const removeSlot = (dayIndex, slotIndex) => {
61
+ const day = schedule[dayIndex];
62
+ if (!day?.slots) return;
63
+ const newSlots = day.slots.filter((_, i) => i !== slotIndex);
64
+ onChange({
65
+ ...schedule,
66
+ [dayIndex]: {
67
+ ...day,
68
+ available: newSlots.length > 0,
69
+ slots: newSlots
70
+ }
71
+ });
72
+ };
73
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
74
+ title && /* @__PURE__ */ jsx("p", { className: "mb-2 block text-sm font-medium text-[var(--text-primary)]", children: title }),
75
+ layout === "week-grid" ? /* @__PURE__ */ jsxs(Fragment, { children: [
76
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-4 gap-2 sm:grid-cols-7", children: DAY_LABELS.map((dayLabel, dayIndex) => {
77
+ const day = schedule[dayIndex] ?? {
78
+ available: false,
79
+ slots: []
80
+ };
81
+ return /* @__PURE__ */ jsxs(
82
+ "button",
83
+ {
84
+ type: "button",
85
+ "aria-pressed": selectedDay === dayIndex,
86
+ onClick: () => setSelectedDay(dayIndex),
87
+ className: `min-h-16 rounded-lg border p-2 text-left transition-colors ${selectedDay === dayIndex ? "border-brand-500 bg-[var(--accent-secondary)]" : "border-[var(--border-default)] bg-[var(--bg-base)]"}`,
88
+ children: [
89
+ /* @__PURE__ */ jsx(
90
+ "span",
91
+ {
92
+ className: `block text-xs font-medium ${selectedDay === dayIndex ? "text-[var(--accent-secondary-ink)]" : "text-[var(--text-primary)]"}`,
93
+ children: dayLabel.slice(0, 3)
94
+ }
95
+ ),
96
+ /* @__PURE__ */ jsx(
97
+ "span",
98
+ {
99
+ className: `mt-2 block text-xs ${day.available ? "text-[var(--accent-secondary-ink)]" : "text-[var(--text-muted)]"}`,
100
+ children: day.available ? "Open" : "Off"
101
+ }
102
+ )
103
+ ]
104
+ },
105
+ dayIndex
106
+ );
107
+ }) }),
108
+ (() => {
109
+ const dayIndex = selectedDay;
110
+ const dayLabel = DAY_LABELS[dayIndex];
111
+ const day = schedule[dayIndex] ?? {
112
+ available: false,
113
+ slots: []
114
+ };
115
+ return /* @__PURE__ */ jsxs("div", { className: "surface-inset !border-brand-500/40 p-3", children: [
116
+ /* @__PURE__ */ jsxs("div", { className: "mb-3 flex items-center justify-between", children: [
117
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-[var(--text-primary)]", children: dayLabel }),
118
+ /* @__PURE__ */ jsx(
119
+ Checkbox,
120
+ {
121
+ checked: day.available,
122
+ onChange: () => toggleDay(dayIndex),
123
+ label: /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-[var(--text-primary)]", children: day.available ? "Open" : "Off" })
124
+ }
125
+ )
126
+ ] }),
127
+ day.available ? /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
128
+ (day.slots ?? []).map((slot, slotIndex) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
129
+ /* @__PURE__ */ jsx(
130
+ TimeField,
131
+ {
132
+ value: slot.start,
133
+ onChange: (value) => updateSlot(dayIndex, slotIndex, "start", value)
134
+ }
135
+ ),
136
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-[var(--text-primary)]", children: "to" }),
137
+ /* @__PURE__ */ jsx(
138
+ TimeField,
139
+ {
140
+ value: slot.end,
141
+ onChange: (value) => updateSlot(dayIndex, slotIndex, "end", value)
142
+ }
143
+ ),
144
+ /* @__PURE__ */ jsx(
145
+ "button",
146
+ {
147
+ type: "button",
148
+ "aria-label": `Remove ${dayLabel} time slot`,
149
+ onClick: () => removeSlot(dayIndex, slotIndex),
150
+ className: "cursor-pointer p-1 text-[var(--text-muted)] hover:text-[var(--error)]",
151
+ children: /* @__PURE__ */ jsx(Trash2, {})
152
+ }
153
+ )
154
+ ] }, slotIndex)),
155
+ /* @__PURE__ */ jsxs(
156
+ "button",
157
+ {
158
+ type: "button",
159
+ onClick: () => addSlot(dayIndex),
160
+ className: "flex cursor-pointer items-center gap-1 text-xs text-[var(--accent-secondary-ink)] hover:text-[var(--text-primary)]",
161
+ children: [
162
+ /* @__PURE__ */ jsx(Plus, {}),
163
+ "Add time slot"
164
+ ]
165
+ }
166
+ )
167
+ ] }) : /* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--text-muted)]", children: "Customers cannot book this day." })
168
+ ] });
169
+ })()
170
+ ] }) : DAY_LABELS.map((dayLabel, dayIndex) => {
171
+ const day = schedule[dayIndex] ?? { available: false, slots: [] };
172
+ return /* @__PURE__ */ jsxs(
173
+ "div",
174
+ {
175
+ className: `flex items-start gap-3 p-3 rounded-md border transition-colors ${day.available ? "border-[var(--border-default)] bg-[var(--bg-base)]" : "border-[var(--border-default)] bg-[var(--bg-subtle)]"}`,
176
+ children: [
177
+ /* @__PURE__ */ jsx("div", { className: "min-w-[100px] pt-2", children: /* @__PURE__ */ jsx(
178
+ Checkbox,
179
+ {
180
+ checked: day.available,
181
+ onChange: () => toggleDay(dayIndex),
182
+ label: /* @__PURE__ */ jsx(
183
+ "span",
184
+ {
185
+ className: `text-sm font-medium ${day.available ? "text-[var(--text-primary)]" : "text-[var(--text-muted)]"}`,
186
+ children: dayLabel
187
+ }
188
+ )
189
+ }
190
+ ) }),
191
+ day.available && /* @__PURE__ */ jsxs("div", { className: "flex-1 space-y-2", children: [
192
+ (day.slots ?? []).map((slot, slotIndex) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
193
+ /* @__PURE__ */ jsx(
194
+ TimeField,
195
+ {
196
+ value: slot.start,
197
+ onChange: (value) => updateSlot(dayIndex, slotIndex, "start", value)
198
+ }
199
+ ),
200
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-[var(--text-tertiary)]", children: "to" }),
201
+ /* @__PURE__ */ jsx(
202
+ TimeField,
203
+ {
204
+ value: slot.end,
205
+ onChange: (value) => updateSlot(dayIndex, slotIndex, "end", value)
206
+ }
207
+ ),
208
+ /* @__PURE__ */ jsx(
209
+ "button",
210
+ {
211
+ "aria-label": "Delete",
212
+ type: "button",
213
+ onClick: () => removeSlot(dayIndex, slotIndex),
214
+ className: "p-1 text-[var(--text-muted)] hover:text-[var(--error)] cursor-pointer",
215
+ children: /* @__PURE__ */ jsx(Trash2, {})
216
+ }
217
+ )
218
+ ] }, slotIndex)),
219
+ /* @__PURE__ */ jsxs(
220
+ "button",
221
+ {
222
+ type: "button",
223
+ onClick: () => addSlot(dayIndex),
224
+ className: "flex items-center gap-1 text-xs text-brand-500 hover:text-brand-600 cursor-pointer",
225
+ children: [
226
+ /* @__PURE__ */ jsx(Plus, {}),
227
+ "Add time slot"
228
+ ]
229
+ }
230
+ )
231
+ ] }),
232
+ !day.available && /* @__PURE__ */ jsx("span", { className: "text-sm text-[var(--text-muted)] pt-2", children: "Off" })
233
+ ]
234
+ },
235
+ dayIndex
236
+ );
237
+ })
238
+ ] });
239
+ }
240
+ export {
241
+ ScheduleEditor,
242
+ getDefaultSchedule
243
+ };
244
+ //# sourceMappingURL=schedule-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/dashboard/%28bookings%29/resources/_components/schedule-editor.tsx"],"sourcesContent":["'use client';\n\nimport { Plus, Trash2 } from 'lucide-react';\nimport { useState } from 'react';\nimport type { WeeklySchedule, ScheduleSlot } from '@withpotter/lib/resource-types';\nimport { DAY_LABELS } from '@withpotter/lib/resource-types';\nimport { TimeField, Checkbox } from '@withpotter/ui-kit';\n\n// ─── Props ───────────────────────────────────────────────────────────────────\n\ninterface ScheduleEditorProps {\n schedule: WeeklySchedule;\n onChange: (schedule: WeeklySchedule) => void;\n /** Null when the surface around it already names the section. */\n title?: string | null;\n layout?: 'rows' | 'week-grid';\n}\n\n// ─── Default Schedule ────────────────────────────────────────────────────────\n\nexport function getDefaultSchedule(): WeeklySchedule {\n const schedule: WeeklySchedule = {};\n for (let i = 0; i < 7; i++) {\n schedule[i] = {\n available: i >= 1 && i <= 5, // Mon-Fri\n slots: i >= 1 && i <= 5 ? [{ start: '09:00', end: '17:00' }] : [],\n };\n }\n return schedule;\n}\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\nexport function ScheduleEditor({\n schedule,\n onChange,\n title = 'The week it works',\n layout = 'rows',\n}: ScheduleEditorProps) {\n const [selectedDay, setSelectedDay] = useState(1);\n const toggleDay = (dayIndex: number) => {\n const day = schedule[dayIndex] ?? { available: false, slots: [] };\n const newAvailable = !day.available;\n onChange({\n ...schedule,\n [dayIndex]: {\n available: newAvailable,\n slots:\n newAvailable && (!day.slots || day.slots.length === 0)\n ? [{ start: '09:00', end: '17:00' }]\n : (day.slots ?? []),\n },\n });\n };\n\n const updateSlot = (\n dayIndex: number,\n slotIndex: number,\n field: keyof ScheduleSlot,\n value: string,\n ) => {\n const day = schedule[dayIndex];\n if (!day?.slots) return;\n const newSlots = [...day.slots];\n newSlots[slotIndex] = { ...newSlots[slotIndex], [field]: value };\n onChange({\n ...schedule,\n [dayIndex]: { ...day, slots: newSlots },\n });\n };\n\n const addSlot = (dayIndex: number) => {\n const day = schedule[dayIndex];\n if (!day) return;\n const slots = day.slots ?? [];\n const lastSlot = slots[slots.length - 1];\n const newStart = lastSlot ? lastSlot.end : '09:00';\n onChange({\n ...schedule,\n [dayIndex]: {\n ...day,\n slots: [...slots, { start: newStart, end: '17:00' }],\n },\n });\n };\n\n const removeSlot = (dayIndex: number, slotIndex: number) => {\n const day = schedule[dayIndex];\n if (!day?.slots) return;\n const newSlots = day.slots.filter((_, i) => i !== slotIndex);\n onChange({\n ...schedule,\n [dayIndex]: {\n ...day,\n available: newSlots.length > 0,\n slots: newSlots,\n },\n });\n };\n\n return (\n <div className=\"space-y-2\">\n {/* Null where the section around it already carries the name: a heading\n that ships under another heading saying the same thing is the\n \"section heading ships alone\" rule, twice over. */}\n {title && (\n <p className=\"mb-2 block text-sm font-medium text-[var(--text-primary)]\">\n {title}\n </p>\n )}\n\n {layout === 'week-grid' ? (\n <>\n <div className=\"grid grid-cols-4 gap-2 sm:grid-cols-7\">\n {DAY_LABELS.map((dayLabel, dayIndex) => {\n const day = schedule[dayIndex] ?? {\n available: false,\n slots: [],\n };\n return (\n <button\n key={dayIndex}\n type=\"button\"\n aria-pressed={selectedDay === dayIndex}\n onClick={() => setSelectedDay(dayIndex)}\n className={`min-h-16 rounded-lg border p-2 text-left transition-colors ${\n selectedDay === dayIndex\n ? 'border-brand-500 bg-[var(--accent-secondary)]'\n : 'border-[var(--border-default)] bg-[var(--bg-base)]'\n }`}\n >\n <span\n className={`block text-xs font-medium ${\n selectedDay === dayIndex\n ? 'text-[var(--accent-secondary-ink)]'\n : 'text-[var(--text-primary)]'\n }`}\n >\n {dayLabel.slice(0, 3)}\n </span>\n <span\n className={`mt-2 block text-xs ${\n day.available\n ? 'text-[var(--accent-secondary-ink)]'\n : 'text-[var(--text-muted)]'\n }`}\n >\n {day.available ? 'Open' : 'Off'}\n </span>\n </button>\n );\n })}\n </div>\n {(() => {\n const dayIndex = selectedDay;\n const dayLabel = DAY_LABELS[dayIndex];\n const day = schedule[dayIndex] ?? {\n available: false,\n slots: [],\n };\n return (\n <div className=\"surface-inset !border-brand-500/40 p-3\">\n <div className=\"mb-3 flex items-center justify-between\">\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">\n {dayLabel}\n </span>\n <Checkbox\n checked={day.available}\n onChange={() => toggleDay(dayIndex)}\n label={\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">\n {day.available ? 'Open' : 'Off'}\n </span>\n }\n />\n </div>\n {day.available ? (\n <div className=\"space-y-2\">\n {(day.slots ?? []).map((slot, slotIndex) => (\n <div key={slotIndex} className=\"flex items-center gap-2\">\n <TimeField\n value={slot.start}\n onChange={(value) =>\n updateSlot(dayIndex, slotIndex, 'start', value)\n }\n />\n <span className=\"text-sm text-[var(--text-primary)]\">\n to\n </span>\n <TimeField\n value={slot.end}\n onChange={(value) =>\n updateSlot(dayIndex, slotIndex, 'end', value)\n }\n />\n <button\n type=\"button\"\n aria-label={`Remove ${dayLabel} time slot`}\n onClick={() => removeSlot(dayIndex, slotIndex)}\n className=\"cursor-pointer p-1 text-[var(--text-muted)] hover:text-[var(--error)]\"\n >\n <Trash2 />\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n onClick={() => addSlot(dayIndex)}\n className=\"flex cursor-pointer items-center gap-1 text-xs text-[var(--accent-secondary-ink)] hover:text-[var(--text-primary)]\"\n >\n <Plus />\n Add time slot\n </button>\n </div>\n ) : (\n <p className=\"text-xs text-[var(--text-muted)]\">\n Customers cannot book this day.\n </p>\n )}\n </div>\n );\n })()}\n </>\n ) : (\n DAY_LABELS.map((dayLabel, dayIndex) => {\n const day = schedule[dayIndex] ?? { available: false, slots: [] };\n\n return (\n <div\n key={dayIndex}\n className={`flex items-start gap-3 p-3 rounded-md border transition-colors ${\n day.available\n ? 'border-[var(--border-default)] bg-[var(--bg-base)]'\n : 'border-[var(--border-default)] bg-[var(--bg-subtle)]'\n }`}\n >\n {/* Day toggle */}\n {/* The wrapper keeps the column width and top offset the row is\n laid out against; Checkbox owns everything inside it. */}\n <div className=\"min-w-[100px] pt-2\">\n <Checkbox\n checked={day.available}\n onChange={() => toggleDay(dayIndex)}\n label={\n <span\n className={`text-sm font-medium ${\n day.available\n ? 'text-[var(--text-primary)]'\n : 'text-[var(--text-muted)]'\n }`}\n >\n {dayLabel}\n </span>\n }\n />\n </div>\n\n {/* Slots */}\n {day.available && (\n <div className=\"flex-1 space-y-2\">\n {(day.slots ?? []).map((slot, slotIndex) => (\n <div key={slotIndex} className=\"flex items-center gap-2\">\n <TimeField\n value={slot.start}\n onChange={(value) =>\n updateSlot(dayIndex, slotIndex, 'start', value)\n }\n />\n <span className=\"text-sm text-[var(--text-tertiary)]\">\n to\n </span>\n <TimeField\n value={slot.end}\n onChange={(value) =>\n updateSlot(dayIndex, slotIndex, 'end', value)\n }\n />\n <button\n aria-label=\"Delete\"\n type=\"button\"\n onClick={() => removeSlot(dayIndex, slotIndex)}\n className=\"p-1 text-[var(--text-muted)] hover:text-[var(--error)] cursor-pointer\"\n >\n <Trash2 />\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n onClick={() => addSlot(dayIndex)}\n className=\"flex items-center gap-1 text-xs text-brand-500 hover:text-brand-600 cursor-pointer\"\n >\n <Plus />\n Add time slot\n </button>\n </div>\n )}\n\n {/* Off indicator */}\n {!day.available && (\n <span className=\"text-sm text-[var(--text-muted)] pt-2\">\n Off\n </span>\n )}\n </div>\n );\n })\n )}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,25 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Select } from "@withpotter/ui-kit";
4
+ import { timezoneOptions } from "../_lib/schedule-timezone";
5
+ function ScheduleTimezoneField({
6
+ value,
7
+ onChange
8
+ }) {
9
+ return /* @__PURE__ */ jsxs("div", { children: [
10
+ /* @__PURE__ */ jsx("label", { className: "text-ink mb-1 block text-sm font-medium", children: "Those hours are in" }),
11
+ /* @__PURE__ */ jsx(
12
+ Select,
13
+ {
14
+ value,
15
+ onChange,
16
+ options: timezoneOptions(value)
17
+ }
18
+ ),
19
+ /* @__PURE__ */ jsx("p", { className: "text-ink-subtle mt-1 text-xs", children: "Every time you offer is read against this clock." })
20
+ ] });
21
+ }
22
+ export {
23
+ ScheduleTimezoneField
24
+ };
25
+ //# sourceMappingURL=schedule-timezone-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/dashboard/%28bookings%29/resources/_components/schedule-timezone-field.tsx"],"sourcesContent":["'use client';\n\nimport { Select } from '@withpotter/ui-kit';\nimport { timezoneOptions } from '../_lib/schedule-timezone';\n\n/**\n * The clock the week above is written against.\n *\n * Sits with the schedule because it is the schedule's other half: \"09:00 to\n * 17:00\" is not a time until you say where.\n */\nexport function ScheduleTimezoneField({\n value,\n onChange,\n}: {\n value: string;\n onChange: (value: string) => void;\n}) {\n return (\n <div>\n <label className=\"text-ink mb-1 block text-sm font-medium\">\n Those hours are in\n </label>\n <Select\n value={value}\n onChange={onChange}\n options={timezoneOptions(value)}\n />\n <p className=\"text-ink-subtle mt-1 text-xs\">\n Every time you offer is read against this clock.\n </p>\n </div>\n );\n}\n"],"mappings":";AAmBI,SACE,KADF;AAjBJ,SAAS,cAAc;AACvB,SAAS,uBAAuB;AAQzB,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AACF,GAGG;AACD,SACE,qBAAC,SACC;AAAA,wBAAC,WAAM,WAAU,2CAA0C,gCAE3D;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,SAAS,gBAAgB,KAAK;AAAA;AAAA,IAChC;AAAA,IACA,oBAAC,OAAE,WAAU,gCAA+B,8DAE5C;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,146 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState, useEffect, useCallback, useRef } from "react";
4
+ import { Save, Loader2, UserPlus } from "lucide-react";
5
+ import { useAuth } from "@withpotter/lib/auth-context";
6
+ import { resourcesApi } from "@withpotter/lib/api";
7
+ import {
8
+ ScheduleEditor,
9
+ getDefaultSchedule
10
+ } from "@withpotter/components/resource-scheduling/schedule-editor";
11
+ function SoloScheduleView({ onAddTeamMember }) {
12
+ const { tenant, user } = useAuth();
13
+ const [resource, setResource] = useState(null);
14
+ const [schedule, setSchedule] = useState(getDefaultSchedule());
15
+ const [loading, setLoading] = useState(true);
16
+ const [saving, setSaving] = useState(false);
17
+ const [saved, setSaved] = useState(false);
18
+ const [error, setError] = useState(null);
19
+ const initRef = useRef(false);
20
+ const slug = tenant?.slug ?? "";
21
+ const loadOrCreateSoloResource = useCallback(async () => {
22
+ if (!slug) return;
23
+ if (initRef.current) return;
24
+ initRef.current = true;
25
+ setLoading(true);
26
+ setError(null);
27
+ try {
28
+ const res = await resourcesApi.listFull(slug, { type: "staff" });
29
+ const resources = res?.data ?? [];
30
+ const soloResource = resources.find((r) => !r.categoryId);
31
+ if (soloResource) {
32
+ setResource(soloResource);
33
+ if (soloResource.schedule) {
34
+ setSchedule(soloResource.schedule);
35
+ }
36
+ } else {
37
+ const created = await resourcesApi.create(slug, {
38
+ type: "staff",
39
+ name: user?.name || tenant?.businessName || "Provider",
40
+ schedule: getDefaultSchedule(),
41
+ defaultDurationMinutes: 60,
42
+ bufferMinutes: 15,
43
+ advanceBookingDays: 30
44
+ });
45
+ setResource(created);
46
+ if (created.schedule) {
47
+ setSchedule(created.schedule);
48
+ }
49
+ }
50
+ } catch {
51
+ setError("Failed to load schedule. Please try again.");
52
+ initRef.current = false;
53
+ } finally {
54
+ setLoading(false);
55
+ }
56
+ }, [slug, user?.name, tenant?.businessName]);
57
+ useEffect(() => {
58
+ loadOrCreateSoloResource();
59
+ }, [loadOrCreateSoloResource]);
60
+ const handleSave = async () => {
61
+ if (!resource || !slug) return;
62
+ setSaving(true);
63
+ setSaved(false);
64
+ try {
65
+ await resourcesApi.updateSchedule(slug, resource.id, schedule);
66
+ setSaved(true);
67
+ setTimeout(() => setSaved(false), 2e3);
68
+ } catch {
69
+ setError("Failed to save schedule. Please try again.");
70
+ } finally {
71
+ setSaving(false);
72
+ }
73
+ };
74
+ if (loading) {
75
+ return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-64", children: /* @__PURE__ */ jsx(Loader2, { className: "w-6 h-6 animate-spin text-[var(--text-muted)]" }) });
76
+ }
77
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
78
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-3", children: [
79
+ /* @__PURE__ */ jsxs(
80
+ "button",
81
+ {
82
+ onClick: onAddTeamMember,
83
+ className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-[var(--text-secondary)] border border-[var(--border-default)] rounded-md hover:bg-[var(--interactive-hover)] cursor-pointer transition-colors",
84
+ children: [
85
+ /* @__PURE__ */ jsx(UserPlus, { className: "w-4 h-4" }),
86
+ "Add team member"
87
+ ]
88
+ }
89
+ ),
90
+ /* @__PURE__ */ jsxs(
91
+ "button",
92
+ {
93
+ onClick: handleSave,
94
+ disabled: saving,
95
+ className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-[var(--text-inverse)] bg-brand-500 rounded-md hover:bg-brand-600 cursor-pointer transition-colors disabled:opacity-50",
96
+ children: [
97
+ saving ? /* @__PURE__ */ jsx(Loader2, { className: "w-4 h-4 animate-spin" }) : /* @__PURE__ */ jsx(Save, { className: "w-4 h-4" }),
98
+ saved ? "Saved" : saving ? "Saving..." : "Save Schedule"
99
+ ]
100
+ }
101
+ )
102
+ ] }),
103
+ error && /* @__PURE__ */ jsx("div", { className: "px-4 py-3 text-sm text-[var(--error)] bg-[var(--error-bg)] border border-[var(--error)]/20 rounded-md", children: error }),
104
+ /* @__PURE__ */ jsxs("div", { className: "bg-[var(--bg-base)] border border-[var(--border-default)] rounded-md p-6", children: [
105
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4 mb-6", children: [
106
+ /* @__PURE__ */ jsx("div", { className: "w-12 h-12 rounded-full bg-[var(--accent-secondary)] flex items-center justify-center text-lg font-medium text-brand-600", children: resource?.name?.charAt(0)?.toUpperCase() || "?" }),
107
+ /* @__PURE__ */ jsxs("div", { children: [
108
+ /* @__PURE__ */ jsx("h2", { className: "text-base font-medium text-[var(--text-primary)]", children: resource?.name || "Provider" }),
109
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--text-secondary)]", children: "You\u2019re the only provider \u2014 customers book directly with you" })
110
+ ] })
111
+ ] }),
112
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-4 mb-6", children: [
113
+ /* @__PURE__ */ jsxs("div", { children: [
114
+ /* @__PURE__ */ jsx("label", { className: "block text-xs font-medium text-[var(--text-secondary)] mb-1.5", children: "Default duration" }),
115
+ /* @__PURE__ */ jsxs("div", { className: "text-sm text-[var(--text-primary)]", children: [
116
+ resource?.defaultDurationMinutes || 60,
117
+ " min"
118
+ ] })
119
+ ] }),
120
+ /* @__PURE__ */ jsxs("div", { children: [
121
+ /* @__PURE__ */ jsx("label", { className: "block text-xs font-medium text-[var(--text-secondary)] mb-1.5", children: "Buffer between bookings" }),
122
+ /* @__PURE__ */ jsxs("div", { className: "text-sm text-[var(--text-primary)]", children: [
123
+ resource?.bufferMinutes || 15,
124
+ " min"
125
+ ] })
126
+ ] }),
127
+ /* @__PURE__ */ jsxs("div", { children: [
128
+ /* @__PURE__ */ jsx("label", { className: "block text-xs font-medium text-[var(--text-secondary)] mb-1.5", children: "Advance booking" }),
129
+ /* @__PURE__ */ jsxs("div", { className: "text-sm text-[var(--text-primary)]", children: [
130
+ "Up to ",
131
+ resource?.advanceBookingDays || 30,
132
+ " days"
133
+ ] })
134
+ ] })
135
+ ] }),
136
+ /* @__PURE__ */ jsxs("div", { className: "border-t border-[var(--border-subtle)] pt-6", children: [
137
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-medium text-[var(--text-primary)] mb-4", children: "Working hours" }),
138
+ /* @__PURE__ */ jsx(ScheduleEditor, { schedule, onChange: setSchedule })
139
+ ] })
140
+ ] })
141
+ ] });
142
+ }
143
+ export {
144
+ SoloScheduleView
145
+ };
146
+ //# sourceMappingURL=solo-schedule-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/dashboard/%28bookings%29/resources/_components/solo-schedule-view.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { Save, Loader2, UserPlus } from 'lucide-react';\nimport { useAuth } from '@withpotter/lib/auth-context';\nimport { resourcesApi } from '@withpotter/lib/api';\nimport type { Resource, WeeklySchedule } from '@withpotter/lib/resource-types';\nimport {\n ScheduleEditor,\n getDefaultSchedule,\n} from '@withpotter/components/resource-scheduling/schedule-editor';\n\ninterface SoloScheduleViewProps {\n onAddTeamMember: () => void;\n}\n\nexport function SoloScheduleView({ onAddTeamMember }: SoloScheduleViewProps) {\n const { tenant, user } = useAuth();\n const [resource, setResource] = useState<Resource | null>(null);\n const [schedule, setSchedule] =\n useState<WeeklySchedule>(getDefaultSchedule());\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [saved, setSaved] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Guard against concurrent/duplicate creation (React StrictMode fires effects twice)\n const initRef = useRef(false);\n\n const slug = tenant?.slug ?? '';\n\n // Load or auto-create the solo provider resource\n const loadOrCreateSoloResource = useCallback(async () => {\n if (!slug) return;\n // Prevent concurrent calls from creating duplicates\n if (initRef.current) return;\n initRef.current = true;\n\n setLoading(true);\n setError(null);\n\n try {\n const res = await resourcesApi.listFull(slug, { type: 'staff' });\n const resources = res?.data ?? [];\n const soloResource = resources.find((r) => !r.categoryId);\n\n if (soloResource) {\n setResource(soloResource);\n if (soloResource.schedule) {\n setSchedule(soloResource.schedule);\n }\n } else {\n const created = await resourcesApi.create(slug, {\n type: 'staff',\n name: user?.name || tenant?.businessName || 'Provider',\n schedule: getDefaultSchedule(),\n defaultDurationMinutes: 60,\n bufferMinutes: 15,\n advanceBookingDays: 30,\n });\n setResource(created);\n if (created.schedule) {\n setSchedule(created.schedule);\n }\n }\n } catch {\n setError('Failed to load schedule. Please try again.');\n // Allow retry on error\n initRef.current = false;\n } finally {\n setLoading(false);\n }\n }, [slug, user?.name, tenant?.businessName]);\n\n useEffect(() => {\n loadOrCreateSoloResource();\n }, [loadOrCreateSoloResource]);\n\n const handleSave = async () => {\n if (!resource || !slug) return;\n setSaving(true);\n setSaved(false);\n try {\n await resourcesApi.updateSchedule(slug, resource.id, schedule);\n setSaved(true);\n setTimeout(() => setSaved(false), 2000);\n } catch {\n setError('Failed to save schedule. Please try again.');\n } finally {\n setSaving(false);\n }\n };\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-64\">\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--text-muted)]\" />\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Actions */}\n <div className=\"flex items-center justify-end gap-3\">\n <button\n onClick={onAddTeamMember}\n className=\"flex items-center gap-2 px-4 py-2 text-sm font-medium text-[var(--text-secondary)] border border-[var(--border-default)] rounded-md hover:bg-[var(--interactive-hover)] cursor-pointer transition-colors\"\n >\n <UserPlus className=\"w-4 h-4\" />\n Add team member\n </button>\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"flex items-center gap-2 px-4 py-2 text-sm font-medium text-[var(--text-inverse)] bg-brand-500 rounded-md hover:bg-brand-600 cursor-pointer transition-colors disabled:opacity-50\"\n >\n {saving ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Save className=\"w-4 h-4\" />\n )}\n {saved ? 'Saved' : saving ? 'Saving...' : 'Save Schedule'}\n </button>\n </div>\n\n {error && (\n <div className=\"px-4 py-3 text-sm text-[var(--error)] bg-[var(--error-bg)] border border-[var(--error)]/20 rounded-md\">\n {error}\n </div>\n )}\n\n {/* Provider Card */}\n <div className=\"bg-[var(--bg-base)] border border-[var(--border-default)] rounded-md p-6\">\n <div className=\"flex items-center gap-4 mb-6\">\n <div className=\"w-12 h-12 rounded-full bg-[var(--accent-secondary)] flex items-center justify-center text-lg font-medium text-brand-600\">\n {resource?.name?.charAt(0)?.toUpperCase() || '?'}\n </div>\n <div>\n <h2 className=\"text-base font-medium text-[var(--text-primary)]\">\n {resource?.name || 'Provider'}\n </h2>\n <p className=\"text-sm text-[var(--text-secondary)]\">\n You&rsquo;re the only provider &mdash; customers book directly\n with you\n </p>\n </div>\n </div>\n\n {/* Booking defaults */}\n <div className=\"grid grid-cols-3 gap-4 mb-6\">\n <div>\n <label className=\"block text-xs font-medium text-[var(--text-secondary)] mb-1.5\">\n Default duration\n </label>\n <div className=\"text-sm text-[var(--text-primary)]\">\n {resource?.defaultDurationMinutes || 60} min\n </div>\n </div>\n <div>\n <label className=\"block text-xs font-medium text-[var(--text-secondary)] mb-1.5\">\n Buffer between bookings\n </label>\n <div className=\"text-sm text-[var(--text-primary)]\">\n {resource?.bufferMinutes || 15} min\n </div>\n </div>\n <div>\n <label className=\"block text-xs font-medium text-[var(--text-secondary)] mb-1.5\">\n Advance booking\n </label>\n <div className=\"text-sm text-[var(--text-primary)]\">\n Up to {resource?.advanceBookingDays || 30} days\n </div>\n </div>\n </div>\n\n <div className=\"border-t border-[var(--border-subtle)] pt-6\">\n <h3 className=\"text-sm font-medium text-[var(--text-primary)] mb-4\">\n Working hours\n </h3>\n <ScheduleEditor schedule={schedule} onChange={setSchedule} />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,161 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { X, Users, Loader2, ArrowRight } from "lucide-react";
5
+ import { KIND_OPTIONS } from "@withpotter/lib/resource-types";
6
+ function TeamOnboardingDialog({
7
+ open,
8
+ onClose,
9
+ onComplete
10
+ }) {
11
+ const [step, setStep] = useState("intro");
12
+ const [kind, setKind] = useState("person");
13
+ const [label, setLabel] = useState("");
14
+ const [labelPlural, setLabelPlural] = useState("");
15
+ const [saving, setSaving] = useState(false);
16
+ const [error, setError] = useState(null);
17
+ const handleLabelChange = (value) => {
18
+ setLabel(value);
19
+ if (!labelPlural || labelPlural === label + "s" || labelPlural === label + "es") {
20
+ setLabelPlural(
21
+ value.endsWith("s") || value.endsWith("sh") || value.endsWith("ch") ? value + "es" : value + "s"
22
+ );
23
+ }
24
+ };
25
+ const handleComplete = async () => {
26
+ if (!label.trim()) return;
27
+ setSaving(true);
28
+ setError(null);
29
+ try {
30
+ const kindOption = KIND_OPTIONS.find((k) => k.value === kind);
31
+ await onComplete({
32
+ label: label.trim(),
33
+ labelPlural: labelPlural.trim() || label.trim() + "s",
34
+ kind,
35
+ icon: kindOption?.emoji || "\u{1F464}"
36
+ });
37
+ } catch {
38
+ setError("Something went wrong. Please try again.");
39
+ setSaving(false);
40
+ }
41
+ };
42
+ const reset = () => {
43
+ setStep("intro");
44
+ setKind("person");
45
+ setLabel("");
46
+ setLabelPlural("");
47
+ setSaving(false);
48
+ setError(null);
49
+ };
50
+ const handleClose = () => {
51
+ reset();
52
+ onClose();
53
+ };
54
+ if (!open) return null;
55
+ return /* @__PURE__ */ jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center", children: [
56
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-black/40", onClick: handleClose }),
57
+ /* @__PURE__ */ jsxs("div", { className: "relative bg-[var(--bg-base)] rounded-md shadow-xl w-full max-w-lg mx-4", children: [
58
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-6 py-4 border-b border-[var(--border-default)]", children: [
59
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold text-[var(--text-primary)]", children: step === "intro" ? "Growing your team?" : "Set up your team" }),
60
+ /* @__PURE__ */ jsx(
61
+ "button",
62
+ {
63
+ "aria-label": "Close",
64
+ onClick: handleClose,
65
+ className: "p-1 text-[var(--text-tertiary)] hover:text-[var(--text-primary)] cursor-pointer",
66
+ children: /* @__PURE__ */ jsx(X, { className: "w-5 h-5" })
67
+ }
68
+ )
69
+ ] }),
70
+ /* @__PURE__ */ jsx("div", { className: "px-6 py-5", children: step === "intro" ? /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
71
+ /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center w-16 h-16 mx-auto rounded-full bg-[var(--accent-secondary)]", children: /* @__PURE__ */ jsx(Users, { className: "w-8 h-8 text-brand-500" }) }),
72
+ /* @__PURE__ */ jsxs("div", { className: "text-center space-y-2", children: [
73
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--text-secondary)] leading-relaxed", children: "Right now, customers book directly with you. Adding team members lets you organize providers into groups (e.g. \u201CStylists\u201D, \u201CTherapists\u201D) with individual schedules." }),
74
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--text-secondary)] leading-relaxed", children: "Your existing schedule and bookings will be preserved \u2014 you\u2019ll just be organizing them under a team." })
75
+ ] })
76
+ ] }) : /* @__PURE__ */ jsxs("div", { className: "space-y-5", children: [
77
+ /* @__PURE__ */ jsxs("div", { children: [
78
+ /* @__PURE__ */ jsx("label", { className: "block text-sm font-medium text-[var(--text-primary)] mb-2", children: "What type of team?" }),
79
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-2", children: KIND_OPTIONS.map((option) => /* @__PURE__ */ jsxs(
80
+ "button",
81
+ {
82
+ onClick: () => setKind(option.value),
83
+ className: `flex items-center gap-3 p-3 rounded-md border text-left cursor-pointer transition-colors ${kind === option.value ? "border-brand-500 bg-[var(--accent-secondary)] text-brand-700" : "border-[var(--border-default)] hover:bg-[var(--interactive-hover)] text-[var(--text-secondary)]"}`,
84
+ children: [
85
+ /* @__PURE__ */ jsx("span", { className: "text-xl", children: option.emoji }),
86
+ /* @__PURE__ */ jsxs("div", { children: [
87
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-medium", children: option.label }),
88
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-[var(--text-tertiary)]", children: option.description })
89
+ ] })
90
+ ]
91
+ },
92
+ option.value
93
+ )) })
94
+ ] }),
95
+ /* @__PURE__ */ jsxs("div", { children: [
96
+ /* @__PURE__ */ jsx("label", { className: "block text-sm font-medium text-[var(--text-primary)] mb-1.5", children: "What do you call them?" }),
97
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--text-tertiary)] mb-2", children: "e.g. \u201CStylist\u201D / \u201CStylists\u201D, \u201CRoom\u201D / \u201CRooms\u201D" }),
98
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
99
+ /* @__PURE__ */ jsx(
100
+ "input",
101
+ {
102
+ type: "text",
103
+ value: label,
104
+ onChange: (e) => handleLabelChange(e.target.value),
105
+ placeholder: "Singular (e.g. Stylist)",
106
+ className: "w-full px-3 py-2 text-sm border border-[var(--border-default)] rounded-md bg-[var(--bg-base)] text-[var(--text-primary)] placeholder:text-[var(--text-muted)] focus:outline-none focus:ring-2 focus:ring-brand-500/30 focus:border-brand-500"
107
+ }
108
+ ),
109
+ /* @__PURE__ */ jsx(
110
+ "input",
111
+ {
112
+ type: "text",
113
+ value: labelPlural,
114
+ onChange: (e) => setLabelPlural(e.target.value),
115
+ placeholder: "Plural (e.g. Stylists)",
116
+ className: "w-full px-3 py-2 text-sm border border-[var(--border-default)] rounded-md bg-[var(--bg-base)] text-[var(--text-primary)] placeholder:text-[var(--text-muted)] focus:outline-none focus:ring-2 focus:ring-brand-500/30 focus:border-brand-500"
117
+ }
118
+ )
119
+ ] })
120
+ ] }),
121
+ error && /* @__PURE__ */ jsx("div", { className: "text-sm text-[var(--error)]", children: error })
122
+ ] }) }),
123
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-3 px-6 py-4 border-t border-[var(--border-default)]", children: [
124
+ /* @__PURE__ */ jsx(
125
+ "button",
126
+ {
127
+ onClick: handleClose,
128
+ className: "px-4 py-2 text-sm font-medium text-[var(--text-secondary)] hover:text-[var(--text-primary)] cursor-pointer",
129
+ children: "Cancel"
130
+ }
131
+ ),
132
+ step === "intro" ? /* @__PURE__ */ jsxs(
133
+ "button",
134
+ {
135
+ onClick: () => setStep("setup"),
136
+ className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-[var(--text-inverse)] bg-brand-500 rounded-md hover:bg-brand-600 cursor-pointer transition-colors",
137
+ children: [
138
+ "Let\u2019s set it up",
139
+ /* @__PURE__ */ jsx(ArrowRight, { className: "w-4 h-4" })
140
+ ]
141
+ }
142
+ ) : /* @__PURE__ */ jsxs(
143
+ "button",
144
+ {
145
+ onClick: handleComplete,
146
+ disabled: !label.trim() || saving,
147
+ className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-[var(--text-inverse)] bg-brand-500 rounded-md hover:bg-brand-600 cursor-pointer transition-colors disabled:opacity-50",
148
+ children: [
149
+ saving ? /* @__PURE__ */ jsx(Loader2, { className: "w-4 h-4 animate-spin" }) : null,
150
+ saving ? "Setting up..." : "Create Team"
151
+ ]
152
+ }
153
+ )
154
+ ] })
155
+ ] })
156
+ ] });
157
+ }
158
+ export {
159
+ TeamOnboardingDialog
160
+ };
161
+ //# sourceMappingURL=team-onboarding-dialog.js.map