@withpotter/lib 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 (1341) hide show
  1. package/dist/__fixtures__/demo-content-server.json +484 -0
  2. package/dist/accessibility-context.d.ts +27 -0
  3. package/dist/accessibility-context.js +107 -0
  4. package/dist/accessibility-context.js.map +1 -0
  5. package/dist/active-workspace.d.ts +45 -0
  6. package/dist/active-workspace.js +34 -0
  7. package/dist/active-workspace.js.map +1 -0
  8. package/dist/admin-account-officer-api.d.ts +13 -0
  9. package/dist/admin-account-officer-api.js +12 -0
  10. package/dist/admin-account-officer-api.js.map +1 -0
  11. package/dist/admin-account-types.d.ts +122 -0
  12. package/dist/admin-account-types.js +1 -0
  13. package/dist/admin-account-types.js.map +1 -0
  14. package/dist/admin-adoption-api.d.ts +35 -0
  15. package/dist/admin-adoption-api.js +16 -0
  16. package/dist/admin-adoption-api.js.map +1 -0
  17. package/dist/admin-api.d.ts +1219 -0
  18. package/dist/admin-api.js +325 -0
  19. package/dist/admin-api.js.map +1 -0
  20. package/dist/admin-case-api.d.ts +32 -0
  21. package/dist/admin-case-api.js +63 -0
  22. package/dist/admin-case-api.js.map +1 -0
  23. package/dist/admin-case-types.d.ts +166 -0
  24. package/dist/admin-case-types.js +1 -0
  25. package/dist/admin-case-types.js.map +1 -0
  26. package/dist/admin-compliance-api.d.ts +31 -0
  27. package/dist/admin-compliance-api.js +20 -0
  28. package/dist/admin-compliance-api.js.map +1 -0
  29. package/dist/admin-country-api.d.ts +28 -0
  30. package/dist/admin-country-api.js +9 -0
  31. package/dist/admin-country-api.js.map +1 -0
  32. package/dist/admin-currency-types.d.ts +138 -0
  33. package/dist/admin-currency-types.js +1 -0
  34. package/dist/admin-currency-types.js.map +1 -0
  35. package/dist/admin-feedback-api.d.ts +215 -0
  36. package/dist/admin-feedback-api.js +63 -0
  37. package/dist/admin-feedback-api.js.map +1 -0
  38. package/dist/admin-inbox-seen.d.ts +22 -0
  39. package/dist/admin-inbox-seen.js +47 -0
  40. package/dist/admin-inbox-seen.js.map +1 -0
  41. package/dist/admin-ledger-api.d.ts +85 -0
  42. package/dist/admin-ledger-api.js +30 -0
  43. package/dist/admin-ledger-api.js.map +1 -0
  44. package/dist/admin-money-api.d.ts +127 -0
  45. package/dist/admin-money-api.js +125 -0
  46. package/dist/admin-money-api.js.map +1 -0
  47. package/dist/admin-newsletter-contacts-api.d.ts +70 -0
  48. package/dist/admin-newsletter-contacts-api.js +20 -0
  49. package/dist/admin-newsletter-contacts-api.js.map +1 -0
  50. package/dist/admin-newsletter-deliveries-api.d.ts +47 -0
  51. package/dist/admin-newsletter-deliveries-api.js +16 -0
  52. package/dist/admin-newsletter-deliveries-api.js.map +1 -0
  53. package/dist/admin-newsletters-api.d.ts +118 -0
  54. package/dist/admin-newsletters-api.js +47 -0
  55. package/dist/admin-newsletters-api.js.map +1 -0
  56. package/dist/admin-pos-api.d.ts +16 -0
  57. package/dist/admin-pos-api.js +35 -0
  58. package/dist/admin-pos-api.js.map +1 -0
  59. package/dist/admin-pos-query.d.ts +43 -0
  60. package/dist/admin-pos-query.js +55 -0
  61. package/dist/admin-pos-query.js.map +1 -0
  62. package/dist/admin-pos-types.d.ts +122 -0
  63. package/dist/admin-pos-types.js +1 -0
  64. package/dist/admin-pos-types.js.map +1 -0
  65. package/dist/admin-pricing-api.d.ts +88 -0
  66. package/dist/admin-pricing-api.js +66 -0
  67. package/dist/admin-pricing-api.js.map +1 -0
  68. package/dist/admin-readiness-api.d.ts +25 -0
  69. package/dist/admin-readiness-api.js +39 -0
  70. package/dist/admin-readiness-api.js.map +1 -0
  71. package/dist/admin-sales-api.d.ts +124 -0
  72. package/dist/admin-sales-api.js +41 -0
  73. package/dist/admin-sales-api.js.map +1 -0
  74. package/dist/admin-saved-replies-api.d.ts +35 -0
  75. package/dist/admin-saved-replies-api.js +70 -0
  76. package/dist/admin-saved-replies-api.js.map +1 -0
  77. package/dist/admin-service-operations-api.d.ts +142 -0
  78. package/dist/admin-service-operations-api.js +52 -0
  79. package/dist/admin-service-operations-api.js.map +1 -0
  80. package/dist/admin-signatures-api.d.ts +57 -0
  81. package/dist/admin-signatures-api.js +15 -0
  82. package/dist/admin-signatures-api.js.map +1 -0
  83. package/dist/admin-support-analytics-api.d.ts +36 -0
  84. package/dist/admin-support-analytics-api.js +71 -0
  85. package/dist/admin-support-analytics-api.js.map +1 -0
  86. package/dist/admin-tenant-setup-types.d.ts +85 -0
  87. package/dist/admin-tenant-setup-types.js +1 -0
  88. package/dist/admin-tenant-setup-types.js.map +1 -0
  89. package/dist/admin-tenants-query.d.ts +14 -0
  90. package/dist/admin-tenants-query.js +17 -0
  91. package/dist/admin-tenants-query.js.map +1 -0
  92. package/dist/analytics/PostHogProvider.d.ts +25 -0
  93. package/dist/analytics/PostHogProvider.js +44 -0
  94. package/dist/analytics/PostHogProvider.js.map +1 -0
  95. package/dist/analytics/index.d.ts +1 -0
  96. package/dist/analytics/index.js +11 -0
  97. package/dist/analytics/index.js.map +1 -0
  98. package/dist/analytics.d.ts +1 -0
  99. package/dist/analytics.js +1 -0
  100. package/dist/api/abandoned-cart.d.ts +18 -0
  101. package/dist/api/abandoned-cart.js +68 -0
  102. package/dist/api/abandoned-cart.js.map +1 -0
  103. package/dist/api/accounts.d.ts +176 -0
  104. package/dist/api/accounts.js +194 -0
  105. package/dist/api/accounts.js.map +1 -0
  106. package/dist/api/analytics-patterns.d.ts +18 -0
  107. package/dist/api/analytics-patterns.js +52 -0
  108. package/dist/api/analytics-patterns.js.map +1 -0
  109. package/dist/api/analytics.d.ts +143 -0
  110. package/dist/api/analytics.js +379 -0
  111. package/dist/api/analytics.js.map +1 -0
  112. package/dist/api/assignee-prefs.d.ts +7 -0
  113. package/dist/api/assignee-prefs.js +17 -0
  114. package/dist/api/assignee-prefs.js.map +1 -0
  115. package/dist/api/automations.d.ts +73 -0
  116. package/dist/api/automations.js +102 -0
  117. package/dist/api/automations.js.map +1 -0
  118. package/dist/api/behaviors.d.ts +15 -0
  119. package/dist/api/behaviors.js +15 -0
  120. package/dist/api/behaviors.js.map +1 -0
  121. package/dist/api/bio.d.ts +7 -0
  122. package/dist/api/bio.js +17 -0
  123. package/dist/api/bio.js.map +1 -0
  124. package/dist/api/booking-calendar.d.ts +14 -0
  125. package/dist/api/booking-calendar.js +33 -0
  126. package/dist/api/booking-calendar.js.map +1 -0
  127. package/dist/api/bookings.d.ts +199 -0
  128. package/dist/api/bookings.js +284 -0
  129. package/dist/api/bookings.js.map +1 -0
  130. package/dist/api/business-devices.d.ts +108 -0
  131. package/dist/api/business-devices.js +139 -0
  132. package/dist/api/business-devices.js.map +1 -0
  133. package/dist/api/business-locations.d.ts +26 -0
  134. package/dist/api/business-locations.js +39 -0
  135. package/dist/api/business-locations.js.map +1 -0
  136. package/dist/api/cache-bus.d.ts +56 -0
  137. package/dist/api/cache-bus.js +18 -0
  138. package/dist/api/cache-bus.js.map +1 -0
  139. package/dist/api/calendar-sync.d.ts +49 -0
  140. package/dist/api/calendar-sync.js +50 -0
  141. package/dist/api/calendar-sync.js.map +1 -0
  142. package/dist/api/campaign-initiatives.d.ts +115 -0
  143. package/dist/api/campaign-initiatives.js +42 -0
  144. package/dist/api/campaign-initiatives.js.map +1 -0
  145. package/dist/api/campaigns.d.ts +89 -0
  146. package/dist/api/campaigns.js +100 -0
  147. package/dist/api/campaigns.js.map +1 -0
  148. package/dist/api/capabilities.d.ts +12 -0
  149. package/dist/api/capabilities.js +16 -0
  150. package/dist/api/capabilities.js.map +1 -0
  151. package/dist/api/commerce.d.ts +19 -0
  152. package/dist/api/commerce.js +31 -0
  153. package/dist/api/commerce.js.map +1 -0
  154. package/dist/api/communications.d.ts +166 -0
  155. package/dist/api/communications.js +141 -0
  156. package/dist/api/communications.js.map +1 -0
  157. package/dist/api/connect.d.ts +72 -0
  158. package/dist/api/connect.js +50 -0
  159. package/dist/api/connect.js.map +1 -0
  160. package/dist/api/content.d.ts +146 -0
  161. package/dist/api/content.js +187 -0
  162. package/dist/api/content.js.map +1 -0
  163. package/dist/api/conversations.d.ts +79 -0
  164. package/dist/api/conversations.js +41 -0
  165. package/dist/api/conversations.js.map +1 -0
  166. package/dist/api/core.d.ts +62 -0
  167. package/dist/api/core.js +223 -0
  168. package/dist/api/core.js.map +1 -0
  169. package/dist/api/credentials.d.ts +65 -0
  170. package/dist/api/credentials.js +48 -0
  171. package/dist/api/credentials.js.map +1 -0
  172. package/dist/api/credits.d.ts +96 -0
  173. package/dist/api/credits.js +24 -0
  174. package/dist/api/credits.js.map +1 -0
  175. package/dist/api/crm-analytics.d.ts +10 -0
  176. package/dist/api/crm-analytics.js +22 -0
  177. package/dist/api/crm-analytics.js.map +1 -0
  178. package/dist/api/crm-segments.d.ts +14 -0
  179. package/dist/api/crm-segments.js +42 -0
  180. package/dist/api/crm-segments.js.map +1 -0
  181. package/dist/api/deliveries.d.ts +99 -0
  182. package/dist/api/deliveries.js +37 -0
  183. package/dist/api/deliveries.js.map +1 -0
  184. package/dist/api/demo-content.d.ts +104 -0
  185. package/dist/api/demo-content.js +36 -0
  186. package/dist/api/demo-content.js.map +1 -0
  187. package/dist/api/device-shifts.d.ts +56 -0
  188. package/dist/api/device-shifts.js +50 -0
  189. package/dist/api/device-shifts.js.map +1 -0
  190. package/dist/api/devices.d.ts +6 -0
  191. package/dist/api/devices.js +10 -0
  192. package/dist/api/devices.js.map +1 -0
  193. package/dist/api/digital-files.d.ts +22 -0
  194. package/dist/api/digital-files.js +55 -0
  195. package/dist/api/digital-files.js.map +1 -0
  196. package/dist/api/discounts.d.ts +29 -0
  197. package/dist/api/discounts.js +46 -0
  198. package/dist/api/discounts.js.map +1 -0
  199. package/dist/api/disputes.d.ts +47 -0
  200. package/dist/api/disputes.js +42 -0
  201. package/dist/api/disputes.js.map +1 -0
  202. package/dist/api/feature-locked.d.ts +11 -0
  203. package/dist/api/feature-locked.js +18 -0
  204. package/dist/api/feature-locked.js.map +1 -0
  205. package/dist/api/feedback-prompts.d.ts +45 -0
  206. package/dist/api/feedback-prompts.js +85 -0
  207. package/dist/api/feedback-prompts.js.map +1 -0
  208. package/dist/api/feedback.d.ts +254 -0
  209. package/dist/api/feedback.js +108 -0
  210. package/dist/api/feedback.js.map +1 -0
  211. package/dist/api/finance.d.ts +199 -0
  212. package/dist/api/finance.js +203 -0
  213. package/dist/api/finance.js.map +1 -0
  214. package/dist/api/gallery.d.ts +30 -0
  215. package/dist/api/gallery.js +48 -0
  216. package/dist/api/gallery.js.map +1 -0
  217. package/dist/api/geo.d.ts +18 -0
  218. package/dist/api/geo.js +19 -0
  219. package/dist/api/geo.js.map +1 -0
  220. package/dist/api/giftcards.d.ts +63 -0
  221. package/dist/api/giftcards.js +63 -0
  222. package/dist/api/giftcards.js.map +1 -0
  223. package/dist/api/hardware-orders.d.ts +40 -0
  224. package/dist/api/hardware-orders.js +37 -0
  225. package/dist/api/hardware-orders.js.map +1 -0
  226. package/dist/api/index.d.ts +71 -0
  227. package/dist/api/index.js +78 -0
  228. package/dist/api/index.js.map +1 -0
  229. package/dist/api/inquiries.d.ts +92 -0
  230. package/dist/api/inquiries.js +129 -0
  231. package/dist/api/inquiries.js.map +1 -0
  232. package/dist/api/inventory.d.ts +133 -0
  233. package/dist/api/inventory.js +203 -0
  234. package/dist/api/inventory.js.map +1 -0
  235. package/dist/api/invite-body.d.ts +19 -0
  236. package/dist/api/invite-body.js +8 -0
  237. package/dist/api/invite-body.js.map +1 -0
  238. package/dist/api/invoices.d.ts +19 -0
  239. package/dist/api/invoices.js +80 -0
  240. package/dist/api/invoices.js.map +1 -0
  241. package/dist/api/locations.d.ts +15 -0
  242. package/dist/api/locations.js +30 -0
  243. package/dist/api/locations.js.map +1 -0
  244. package/dist/api/loyalty.d.ts +68 -0
  245. package/dist/api/loyalty.js +112 -0
  246. package/dist/api/loyalty.js.map +1 -0
  247. package/dist/api/marketing-consent.d.ts +36 -0
  248. package/dist/api/marketing-consent.js +11 -0
  249. package/dist/api/marketing-consent.js.map +1 -0
  250. package/dist/api/marketing-suppressions.d.ts +81 -0
  251. package/dist/api/marketing-suppressions.js +65 -0
  252. package/dist/api/marketing-suppressions.js.map +1 -0
  253. package/dist/api/members.d.ts +79 -0
  254. package/dist/api/members.js +148 -0
  255. package/dist/api/members.js.map +1 -0
  256. package/dist/api/merchant-notifications.d.ts +27 -0
  257. package/dist/api/merchant-notifications.js +41 -0
  258. package/dist/api/merchant-notifications.js.map +1 -0
  259. package/dist/api/merchant-referrals.d.ts +23 -0
  260. package/dist/api/merchant-referrals.js +10 -0
  261. package/dist/api/merchant-referrals.js.map +1 -0
  262. package/dist/api/merchant-subscriptions.d.ts +117 -0
  263. package/dist/api/merchant-subscriptions.js +113 -0
  264. package/dist/api/merchant-subscriptions.js.map +1 -0
  265. package/dist/api/misc.d.ts +4 -0
  266. package/dist/api/misc.js +24 -0
  267. package/dist/api/misc.js.map +1 -0
  268. package/dist/api/odoo.d.ts +102 -0
  269. package/dist/api/odoo.js +36 -0
  270. package/dist/api/odoo.js.map +1 -0
  271. package/dist/api/onboarding.d.ts +48 -0
  272. package/dist/api/onboarding.js +78 -0
  273. package/dist/api/onboarding.js.map +1 -0
  274. package/dist/api/orders.d.ts +153 -0
  275. package/dist/api/orders.js +303 -0
  276. package/dist/api/orders.js.map +1 -0
  277. package/dist/api/organizations.d.ts +14 -0
  278. package/dist/api/organizations.js +19 -0
  279. package/dist/api/organizations.js.map +1 -0
  280. package/dist/api/packages.d.ts +16 -0
  281. package/dist/api/packages.js +25 -0
  282. package/dist/api/packages.js.map +1 -0
  283. package/dist/api/pages.d.ts +79 -0
  284. package/dist/api/pages.js +125 -0
  285. package/dist/api/pages.js.map +1 -0
  286. package/dist/api/payables.d.ts +34 -0
  287. package/dist/api/payables.js +70 -0
  288. package/dist/api/payables.js.map +1 -0
  289. package/dist/api/plan-refusal.d.ts +21 -0
  290. package/dist/api/plan-refusal.js +28 -0
  291. package/dist/api/plan-refusal.js.map +1 -0
  292. package/dist/api/pos.d.ts +66 -0
  293. package/dist/api/pos.js +115 -0
  294. package/dist/api/pos.js.map +1 -0
  295. package/dist/api/potter.d.ts +114 -0
  296. package/dist/api/potter.js +88 -0
  297. package/dist/api/potter.js.map +1 -0
  298. package/dist/api/push.d.ts +25 -0
  299. package/dist/api/push.js +23 -0
  300. package/dist/api/push.js.map +1 -0
  301. package/dist/api/referrals.d.ts +10 -0
  302. package/dist/api/referrals.js +16 -0
  303. package/dist/api/referrals.js.map +1 -0
  304. package/dist/api/resource-categories.d.ts +35 -0
  305. package/dist/api/resource-categories.js +76 -0
  306. package/dist/api/resource-categories.js.map +1 -0
  307. package/dist/api/resources.d.ts +54 -0
  308. package/dist/api/resources.js +92 -0
  309. package/dist/api/resources.js.map +1 -0
  310. package/dist/api/reviews.d.ts +18 -0
  311. package/dist/api/reviews.js +46 -0
  312. package/dist/api/reviews.js.map +1 -0
  313. package/dist/api/riders.d.ts +70 -0
  314. package/dist/api/riders.js +24 -0
  315. package/dist/api/riders.js.map +1 -0
  316. package/dist/api/role-permissions.d.ts +25 -0
  317. package/dist/api/role-permissions.js +47 -0
  318. package/dist/api/role-permissions.js.map +1 -0
  319. package/dist/api/sales-channels.d.ts +234 -0
  320. package/dist/api/sales-channels.js +119 -0
  321. package/dist/api/sales-channels.js.map +1 -0
  322. package/dist/api/service-missing.d.ts +10 -0
  323. package/dist/api/service-missing.js +19 -0
  324. package/dist/api/service-missing.js.map +1 -0
  325. package/dist/api/session-refresh.d.ts +18 -0
  326. package/dist/api/session-refresh.js +37 -0
  327. package/dist/api/session-refresh.js.map +1 -0
  328. package/dist/api/session-scope.d.ts +35 -0
  329. package/dist/api/session-scope.js +53 -0
  330. package/dist/api/session-scope.js.map +1 -0
  331. package/dist/api/settlements.d.ts +106 -0
  332. package/dist/api/settlements.js +114 -0
  333. package/dist/api/settlements.js.map +1 -0
  334. package/dist/api/share-links.d.ts +46 -0
  335. package/dist/api/share-links.js +25 -0
  336. package/dist/api/share-links.js.map +1 -0
  337. package/dist/api/shift-notes.d.ts +19 -0
  338. package/dist/api/shift-notes.js +13 -0
  339. package/dist/api/shift-notes.js.map +1 -0
  340. package/dist/api/shipping.d.ts +42 -0
  341. package/dist/api/shipping.js +53 -0
  342. package/dist/api/shipping.js.map +1 -0
  343. package/dist/api/social-sources.d.ts +58 -0
  344. package/dist/api/social-sources.js +23 -0
  345. package/dist/api/social-sources.js.map +1 -0
  346. package/dist/api/tabs.d.ts +14 -0
  347. package/dist/api/tabs.js +39 -0
  348. package/dist/api/tabs.js.map +1 -0
  349. package/dist/api/team.d.ts +112 -0
  350. package/dist/api/team.js +144 -0
  351. package/dist/api/team.js.map +1 -0
  352. package/dist/api/template-settings.d.ts +26 -0
  353. package/dist/api/template-settings.js +36 -0
  354. package/dist/api/template-settings.js.map +1 -0
  355. package/dist/api/templates.d.ts +21 -0
  356. package/dist/api/templates.js +25 -0
  357. package/dist/api/templates.js.map +1 -0
  358. package/dist/api/tenant-slug.d.ts +13 -0
  359. package/dist/api/tenant-slug.js +18 -0
  360. package/dist/api/tenant-slug.js.map +1 -0
  361. package/dist/api/tenant.d.ts +33 -0
  362. package/dist/api/tenant.js +51 -0
  363. package/dist/api/tenant.js.map +1 -0
  364. package/dist/api/types/analytics-attribution.d.ts +43 -0
  365. package/dist/api/types/analytics-attribution.js +1 -0
  366. package/dist/api/types/analytics-attribution.js.map +1 -0
  367. package/dist/api/types/analytics.d.ts +465 -0
  368. package/dist/api/types/analytics.js +1 -0
  369. package/dist/api/types/analytics.js.map +1 -0
  370. package/dist/api/types/auth.d.ts +206 -0
  371. package/dist/api/types/auth.js +7 -0
  372. package/dist/api/types/auth.js.map +1 -0
  373. package/dist/api/types/automation-flow.d.ts +199 -0
  374. package/dist/api/types/automation-flow.js +1 -0
  375. package/dist/api/types/automation-flow.js.map +1 -0
  376. package/dist/api/types/bookings.d.ts +226 -0
  377. package/dist/api/types/bookings.js +1 -0
  378. package/dist/api/types/bookings.js.map +1 -0
  379. package/dist/api/types/campaigns.d.ts +262 -0
  380. package/dist/api/types/campaigns.js +1 -0
  381. package/dist/api/types/campaigns.js.map +1 -0
  382. package/dist/api/types/catalog.d.ts +273 -0
  383. package/dist/api/types/catalog.js +1 -0
  384. package/dist/api/types/catalog.js.map +1 -0
  385. package/dist/api/types/collections.d.ts +189 -0
  386. package/dist/api/types/collections.js +1 -0
  387. package/dist/api/types/collections.js.map +1 -0
  388. package/dist/api/types/crm.d.ts +264 -0
  389. package/dist/api/types/crm.js +1 -0
  390. package/dist/api/types/crm.js.map +1 -0
  391. package/dist/api/types/customers.d.ts +269 -0
  392. package/dist/api/types/customers.js +1 -0
  393. package/dist/api/types/customers.js.map +1 -0
  394. package/dist/api/types/devices.d.ts +390 -0
  395. package/dist/api/types/devices.js +1 -0
  396. package/dist/api/types/devices.js.map +1 -0
  397. package/dist/api/types/discounts.d.ts +237 -0
  398. package/dist/api/types/discounts.js +1 -0
  399. package/dist/api/types/discounts.js.map +1 -0
  400. package/dist/api/types/filters.d.ts +258 -0
  401. package/dist/api/types/filters.js +1 -0
  402. package/dist/api/types/filters.js.map +1 -0
  403. package/dist/api/types/index.d.ts +31 -0
  404. package/dist/api/types/index.js +25 -0
  405. package/dist/api/types/index.js.map +1 -0
  406. package/dist/api/types/inquiries.d.ts +266 -0
  407. package/dist/api/types/inquiries.js +1 -0
  408. package/dist/api/types/inquiries.js.map +1 -0
  409. package/dist/api/types/locations.d.ts +208 -0
  410. package/dist/api/types/locations.js +1 -0
  411. package/dist/api/types/locations.js.map +1 -0
  412. package/dist/api/types/onboarding.d.ts +311 -0
  413. package/dist/api/types/onboarding.js +1 -0
  414. package/dist/api/types/onboarding.js.map +1 -0
  415. package/dist/api/types/operations.d.ts +136 -0
  416. package/dist/api/types/operations.js +1 -0
  417. package/dist/api/types/operations.js.map +1 -0
  418. package/dist/api/types/orders.d.ts +242 -0
  419. package/dist/api/types/orders.js +1 -0
  420. package/dist/api/types/orders.js.map +1 -0
  421. package/dist/api/types/payables.d.ts +140 -0
  422. package/dist/api/types/payables.js +1 -0
  423. package/dist/api/types/payables.js.map +1 -0
  424. package/dist/api/types/pos.d.ts +121 -0
  425. package/dist/api/types/pos.js +5 -0
  426. package/dist/api/types/pos.js.map +1 -0
  427. package/dist/api/types/record-analytics.d.ts +95 -0
  428. package/dist/api/types/record-analytics.js +1 -0
  429. package/dist/api/types/record-analytics.js.map +1 -0
  430. package/dist/api/types/sales-patterns.d.ts +58 -0
  431. package/dist/api/types/sales-patterns.js +1 -0
  432. package/dist/api/types/sales-patterns.js.map +1 -0
  433. package/dist/api/types/tabs.d.ts +210 -0
  434. package/dist/api/types/tabs.js +1 -0
  435. package/dist/api/types/tabs.js.map +1 -0
  436. package/dist/api/types/templates.d.ts +398 -0
  437. package/dist/api/types/templates.js +1 -0
  438. package/dist/api/types/templates.js.map +1 -0
  439. package/dist/api/types/waitlist.d.ts +324 -0
  440. package/dist/api/types/waitlist.js +1 -0
  441. package/dist/api/types/waitlist.js.map +1 -0
  442. package/dist/api/types.d.ts +1 -0
  443. package/dist/api/types.js +1 -0
  444. package/dist/api/unserved-routes.d.ts +4 -0
  445. package/dist/api/unserved-routes.js +15 -0
  446. package/dist/api/unserved-routes.js.map +1 -0
  447. package/dist/api/waitlist.d.ts +80 -0
  448. package/dist/api/waitlist.js +85 -0
  449. package/dist/api/waitlist.js.map +1 -0
  450. package/dist/api.d.ts +1 -0
  451. package/dist/api.js +1 -0
  452. package/dist/app-name.d.ts +29 -0
  453. package/dist/app-name.js +11 -0
  454. package/dist/app-name.js.map +1 -0
  455. package/dist/arrival.d.ts +48 -0
  456. package/dist/arrival.js +34 -0
  457. package/dist/arrival.js.map +1 -0
  458. package/dist/auth-context.d.ts +90 -0
  459. package/dist/auth-context.js +732 -0
  460. package/dist/auth-context.js.map +1 -0
  461. package/dist/auth-session.d.ts +1 -0
  462. package/dist/auth-session.js +25 -0
  463. package/dist/auth-session.js.map +1 -0
  464. package/dist/bank-phone.d.ts +2 -0
  465. package/dist/bank-phone.js +12 -0
  466. package/dist/bank-phone.js.map +1 -0
  467. package/dist/behavior-config-types.d.ts +49 -0
  468. package/dist/behavior-config-types.js +1 -0
  469. package/dist/behavior-config-types.js.map +1 -0
  470. package/dist/behavior-context.d.ts +15 -0
  471. package/dist/behavior-context.js +38 -0
  472. package/dist/behavior-context.js.map +1 -0
  473. package/dist/behavior-fields.d.ts +41 -0
  474. package/dist/behavior-fields.js +20 -0
  475. package/dist/behavior-fields.js.map +1 -0
  476. package/dist/blog/__fixtures__/paste-hygiene.d.ts +7 -0
  477. package/dist/blog/__fixtures__/paste-hygiene.js +36 -0
  478. package/dist/blog/__fixtures__/paste-hygiene.js.map +1 -0
  479. package/dist/blog/density.d.ts +65 -0
  480. package/dist/blog/density.js +126 -0
  481. package/dist/blog/density.js.map +1 -0
  482. package/dist/blog/paste-hygiene.d.ts +3 -0
  483. package/dist/blog/paste-hygiene.js +168 -0
  484. package/dist/blog/paste-hygiene.js.map +1 -0
  485. package/dist/booking-location-label.d.ts +10 -0
  486. package/dist/booking-location-label.js +24 -0
  487. package/dist/booking-location-label.js.map +1 -0
  488. package/dist/booking-meeting-link.d.ts +48 -0
  489. package/dist/booking-meeting-link.js +40 -0
  490. package/dist/booking-meeting-link.js.map +1 -0
  491. package/dist/box-channels.d.ts +22 -0
  492. package/dist/box-channels.js +16 -0
  493. package/dist/box-channels.js.map +1 -0
  494. package/dist/box-delivery.d.ts +10 -0
  495. package/dist/box-delivery.js +5 -0
  496. package/dist/box-delivery.js.map +1 -0
  497. package/dist/box-inbox.d.ts +11 -0
  498. package/dist/box-inbox.js +5 -0
  499. package/dist/box-inbox.js.map +1 -0
  500. package/dist/box-letting.d.ts +14 -0
  501. package/dist/box-letting.js +7 -0
  502. package/dist/box-letting.js.map +1 -0
  503. package/dist/box-mark-paths.d.ts +28 -0
  504. package/dist/box-mark-paths.js +23 -0
  505. package/dist/box-mark-paths.js.map +1 -0
  506. package/dist/box-media.d.ts +9 -0
  507. package/dist/box-media.js +5 -0
  508. package/dist/box-media.js.map +1 -0
  509. package/dist/box-products.d.ts +16 -0
  510. package/dist/box-products.js +9 -0
  511. package/dist/box-products.js.map +1 -0
  512. package/dist/box-splits.d.ts +12 -0
  513. package/dist/box-splits.js +5 -0
  514. package/dist/box-splits.js.map +1 -0
  515. package/dist/brand.d.ts +26 -0
  516. package/dist/brand.js +22 -0
  517. package/dist/brand.js.map +1 -0
  518. package/dist/business-categories.d.ts +50 -0
  519. package/dist/business-categories.js +378 -0
  520. package/dist/business-categories.js.map +1 -0
  521. package/dist/business-intents.d.ts +31 -0
  522. package/dist/business-intents.js +142 -0
  523. package/dist/business-intents.js.map +1 -0
  524. package/dist/capability-context.d.ts +63 -0
  525. package/dist/capability-context.js +84 -0
  526. package/dist/capability-context.js.map +1 -0
  527. package/dist/carriers.d.ts +83 -0
  528. package/dist/carriers.js +124 -0
  529. package/dist/carriers.js.map +1 -0
  530. package/dist/commerce-build/api.d.ts +29 -0
  531. package/dist/commerce-build/api.js +152 -0
  532. package/dist/commerce-build/api.js.map +1 -0
  533. package/dist/commerce-build/contracts-profile.d.ts +83 -0
  534. package/dist/commerce-build/contracts-profile.js +1 -0
  535. package/dist/commerce-build/contracts-profile.js.map +1 -0
  536. package/dist/commerce-build/contracts-spec.d.ts +217 -0
  537. package/dist/commerce-build/contracts-spec.js +1 -0
  538. package/dist/commerce-build/contracts-spec.js.map +1 -0
  539. package/dist/commerce-build/contracts.d.ts +2 -0
  540. package/dist/commerce-build/contracts.js +1 -0
  541. package/dist/commerce-build/contracts.js.map +1 -0
  542. package/dist/commerce-build/launch-state.d.ts +20 -0
  543. package/dist/commerce-build/launch-state.js +72 -0
  544. package/dist/commerce-build/launch-state.js.map +1 -0
  545. package/dist/commerce-build/profile-utils.d.ts +5 -0
  546. package/dist/commerce-build/profile-utils.js +14 -0
  547. package/dist/commerce-build/profile-utils.js.map +1 -0
  548. package/dist/commerce-build/setup-flow.d.ts +10 -0
  549. package/dist/commerce-build/setup-flow.js +24 -0
  550. package/dist/commerce-build/setup-flow.js.map +1 -0
  551. package/dist/commerce-build/setup-session.d.ts +26 -0
  552. package/dist/commerce-build/setup-session.js +70 -0
  553. package/dist/commerce-build/setup-session.js.map +1 -0
  554. package/dist/commerce-build/turn-streaming.d.ts +21 -0
  555. package/dist/commerce-build/turn-streaming.js +113 -0
  556. package/dist/commerce-build/turn-streaming.js.map +1 -0
  557. package/dist/commerce-build/workspace-components.d.ts +23 -0
  558. package/dist/commerce-build/workspace-components.js +66 -0
  559. package/dist/commerce-build/workspace-components.js.map +1 -0
  560. package/dist/commerce-build/workspace-config.d.ts +7 -0
  561. package/dist/commerce-build/workspace-config.js +74 -0
  562. package/dist/commerce-build/workspace-config.js.map +1 -0
  563. package/dist/companion/config.d.ts +31 -0
  564. package/dist/companion/config.js +59 -0
  565. package/dist/companion/config.js.map +1 -0
  566. package/dist/connect/catalog.d.ts +32 -0
  567. package/dist/connect/catalog.js +268 -0
  568. package/dist/connect/catalog.js.map +1 -0
  569. package/dist/connect/fixtures/commands.d.ts +8 -0
  570. package/dist/connect/fixtures/commands.js +146 -0
  571. package/dist/connect/fixtures/commands.js.map +1 -0
  572. package/dist/connect/fixtures/connections.d.ts +21 -0
  573. package/dist/connect/fixtures/connections.js +370 -0
  574. package/dist/connect/fixtures/connections.js.map +1 -0
  575. package/dist/connect/fixtures/identities.d.ts +10 -0
  576. package/dist/connect/fixtures/identities.js +61 -0
  577. package/dist/connect/fixtures/identities.js.map +1 -0
  578. package/dist/connect/fixtures/index.d.ts +11 -0
  579. package/dist/connect/fixtures/index.js +11 -0
  580. package/dist/connect/fixtures/index.js.map +1 -0
  581. package/dist/connect/fixtures/usage.d.ts +2 -0
  582. package/dist/connect/fixtures/usage.js +21 -0
  583. package/dist/connect/fixtures/usage.js.map +1 -0
  584. package/dist/connect/fixtures.d.ts +1 -0
  585. package/dist/connect/fixtures.js +1 -0
  586. package/dist/connect/from-notifications.d.ts +3 -0
  587. package/dist/connect/from-notifications.js +78 -0
  588. package/dist/connect/from-notifications.js.map +1 -0
  589. package/dist/connect/identity.d.ts +67 -0
  590. package/dist/connect/identity.js +24 -0
  591. package/dist/connect/identity.js.map +1 -0
  592. package/dist/connect/index.d.ts +13 -0
  593. package/dist/connect/index.js +22 -0
  594. package/dist/connect/index.js.map +1 -0
  595. package/dist/connect/next-up.d.ts +18 -0
  596. package/dist/connect/next-up.js +45 -0
  597. package/dist/connect/next-up.js.map +1 -0
  598. package/dist/connect/types.d.ts +354 -0
  599. package/dist/connect/types.js +68 -0
  600. package/dist/connect/types.js.map +1 -0
  601. package/dist/connect/use-connect.d.ts +51 -0
  602. package/dist/connect/use-connect.js +85 -0
  603. package/dist/connect/use-connect.js.map +1 -0
  604. package/dist/connect.d.ts +1 -0
  605. package/dist/connect.js +1 -0
  606. package/dist/converted-tag.d.ts +7 -0
  607. package/dist/converted-tag.js +9 -0
  608. package/dist/converted-tag.js.map +1 -0
  609. package/dist/countries.d.ts +65 -0
  610. package/dist/countries.js +374 -0
  611. package/dist/countries.js.map +1 -0
  612. package/dist/country-regions.d.ts +12 -0
  613. package/dist/country-regions.js +36 -0
  614. package/dist/country-regions.js.map +1 -0
  615. package/dist/csv.d.ts +28 -0
  616. package/dist/csv.js +91 -0
  617. package/dist/csv.js.map +1 -0
  618. package/dist/currency.d.ts +5 -0
  619. package/dist/currency.js +25 -0
  620. package/dist/currency.js.map +1 -0
  621. package/dist/customer-helpers.d.ts +30 -0
  622. package/dist/customer-helpers.js +66 -0
  623. package/dist/customer-helpers.js.map +1 -0
  624. package/dist/customer-stage.d.ts +125 -0
  625. package/dist/customer-stage.js +113 -0
  626. package/dist/customer-stage.js.map +1 -0
  627. package/dist/dashboard-destinations.d.ts +5 -0
  628. package/dist/dashboard-destinations.js +29 -0
  629. package/dist/dashboard-destinations.js.map +1 -0
  630. package/dist/demo-content-mock.d.ts +22 -0
  631. package/dist/demo-content-mock.js +70 -0
  632. package/dist/demo-content-mock.js.map +1 -0
  633. package/dist/demo-content-poller.d.ts +33 -0
  634. package/dist/demo-content-poller.js +80 -0
  635. package/dist/demo-content-poller.js.map +1 -0
  636. package/dist/demo-content.d.ts +43 -0
  637. package/dist/demo-content.js +78 -0
  638. package/dist/demo-content.js.map +1 -0
  639. package/dist/describe-activity.d.ts +44 -0
  640. package/dist/describe-activity.js +16 -0
  641. package/dist/describe-activity.js.map +1 -0
  642. package/dist/describe-invite.d.ts +19 -0
  643. package/dist/describe-invite.js +46 -0
  644. package/dist/describe-invite.js.map +1 -0
  645. package/dist/design-schema.d.ts +76 -0
  646. package/dist/design-schema.js +47 -0
  647. package/dist/design-schema.js.map +1 -0
  648. package/dist/destination-alias.d.ts +43 -0
  649. package/dist/destination-alias.js +146 -0
  650. package/dist/destination-alias.js.map +1 -0
  651. package/dist/document-numbering.d.ts +40 -0
  652. package/dist/document-numbering.js +48 -0
  653. package/dist/document-numbering.js.map +1 -0
  654. package/dist/document-title.d.ts +22 -0
  655. package/dist/document-title.js +85 -0
  656. package/dist/document-title.js.map +1 -0
  657. package/dist/editor/row-ops.d.ts +39 -0
  658. package/dist/editor/row-ops.js +25 -0
  659. package/dist/editor/row-ops.js.map +1 -0
  660. package/dist/editor-agent/apply-proposal.d.ts +12 -0
  661. package/dist/editor-agent/apply-proposal.js +44 -0
  662. package/dist/editor-agent/apply-proposal.js.map +1 -0
  663. package/dist/editor-agent/contracts.d.ts +174 -0
  664. package/dist/editor-agent/contracts.js +1 -0
  665. package/dist/editor-agent/contracts.js.map +1 -0
  666. package/dist/editor-agent/converse.d.ts +34 -0
  667. package/dist/editor-agent/converse.js +141 -0
  668. package/dist/editor-agent/converse.js.map +1 -0
  669. package/dist/editor-agent/flag.d.ts +12 -0
  670. package/dist/editor-agent/flag.js +19 -0
  671. package/dist/editor-agent/flag.js.map +1 -0
  672. package/dist/editor-agent/template-document.d.ts +52 -0
  673. package/dist/editor-agent/template-document.js +50 -0
  674. package/dist/editor-agent/template-document.js.map +1 -0
  675. package/dist/editor-agent/use-converse.d.ts +30 -0
  676. package/dist/editor-agent/use-converse.js +130 -0
  677. package/dist/editor-agent/use-converse.js.map +1 -0
  678. package/dist/effective-module-labels.d.ts +17 -0
  679. package/dist/effective-module-labels.js +14 -0
  680. package/dist/effective-module-labels.js.map +1 -0
  681. package/dist/embedded-frame.d.ts +30 -0
  682. package/dist/embedded-frame.js +23 -0
  683. package/dist/embedded-frame.js.map +1 -0
  684. package/dist/empty-state-copy.d.ts +27 -0
  685. package/dist/empty-state-copy.js +167 -0
  686. package/dist/empty-state-copy.js.map +1 -0
  687. package/dist/end-session.d.ts +23 -0
  688. package/dist/end-session.js +30 -0
  689. package/dist/end-session.js.map +1 -0
  690. package/dist/file-intake.d.ts +65 -0
  691. package/dist/file-intake.js +162 -0
  692. package/dist/file-intake.js.map +1 -0
  693. package/dist/first-run.d.ts +5 -0
  694. package/dist/first-run.js +13 -0
  695. package/dist/first-run.js.map +1 -0
  696. package/dist/form-answers.d.ts +57 -0
  697. package/dist/form-answers.js +79 -0
  698. package/dist/form-answers.js.map +1 -0
  699. package/dist/form-draft.d.ts +30 -0
  700. package/dist/form-draft.js +73 -0
  701. package/dist/form-draft.js.map +1 -0
  702. package/dist/format.d.ts +29 -0
  703. package/dist/format.js +21 -0
  704. package/dist/format.js.map +1 -0
  705. package/dist/fulfilment-nav.d.ts +79 -0
  706. package/dist/fulfilment-nav.js +18 -0
  707. package/dist/fulfilment-nav.js.map +1 -0
  708. package/dist/go-live-gate.d.ts +55 -0
  709. package/dist/go-live-gate.js +17 -0
  710. package/dist/go-live-gate.js.map +1 -0
  711. package/dist/group-activity.d.ts +37 -0
  712. package/dist/group-activity.js +43 -0
  713. package/dist/group-activity.js.map +1 -0
  714. package/dist/haptic.d.ts +5 -0
  715. package/dist/haptic.js +16 -0
  716. package/dist/haptic.js.map +1 -0
  717. package/dist/help-topics.d.ts +77 -0
  718. package/dist/help-topics.js +308 -0
  719. package/dist/help-topics.js.map +1 -0
  720. package/dist/icon-resolver.d.ts +45 -0
  721. package/dist/icon-resolver.js +40 -0
  722. package/dist/icon-resolver.js.map +1 -0
  723. package/dist/icons/commerce.d.ts +9 -0
  724. package/dist/icons/commerce.js +168 -0
  725. package/dist/icons/commerce.js.map +1 -0
  726. package/dist/icons/core.d.ts +9 -0
  727. package/dist/icons/core.js +173 -0
  728. package/dist/icons/core.js.map +1 -0
  729. package/dist/icons/making.d.ts +9 -0
  730. package/dist/icons/making.js +209 -0
  731. package/dist/icons/making.js.map +1 -0
  732. package/dist/icons/places.d.ts +9 -0
  733. package/dist/icons/places.js +232 -0
  734. package/dist/icons/places.js.map +1 -0
  735. package/dist/icons/world.d.ts +9 -0
  736. package/dist/icons/world.js +87 -0
  737. package/dist/icons/world.js.map +1 -0
  738. package/dist/index.d.ts +9 -0
  739. package/dist/index.js +2 -0
  740. package/dist/index.js.map +1 -0
  741. package/dist/industry-configs/beauty.d.ts +2 -0
  742. package/dist/industry-configs/beauty.js +152 -0
  743. package/dist/industry-configs/beauty.js.map +1 -0
  744. package/dist/industry-configs/creative.d.ts +2 -0
  745. package/dist/industry-configs/creative.js +131 -0
  746. package/dist/industry-configs/creative.js.map +1 -0
  747. package/dist/industry-configs/default.d.ts +2 -0
  748. package/dist/industry-configs/default.js +77 -0
  749. package/dist/industry-configs/default.js.map +1 -0
  750. package/dist/industry-configs/education.d.ts +2 -0
  751. package/dist/industry-configs/education.js +137 -0
  752. package/dist/industry-configs/education.js.map +1 -0
  753. package/dist/industry-configs/events.d.ts +2 -0
  754. package/dist/industry-configs/events.js +118 -0
  755. package/dist/industry-configs/events.js.map +1 -0
  756. package/dist/industry-configs/fashion.d.ts +2 -0
  757. package/dist/industry-configs/fashion.js +128 -0
  758. package/dist/industry-configs/fashion.js.map +1 -0
  759. package/dist/industry-configs/fitness.d.ts +2 -0
  760. package/dist/industry-configs/fitness.js +128 -0
  761. package/dist/industry-configs/fitness.js.map +1 -0
  762. package/dist/industry-configs/food.d.ts +2 -0
  763. package/dist/industry-configs/food.js +138 -0
  764. package/dist/industry-configs/food.js.map +1 -0
  765. package/dist/industry-configs/hospitality.d.ts +2 -0
  766. package/dist/industry-configs/hospitality.js +157 -0
  767. package/dist/industry-configs/hospitality.js.map +1 -0
  768. package/dist/industry-configs/index.d.ts +25 -0
  769. package/dist/industry-configs/index.js +77 -0
  770. package/dist/industry-configs/index.js.map +1 -0
  771. package/dist/industry-configs/professional.d.ts +2 -0
  772. package/dist/industry-configs/professional.js +129 -0
  773. package/dist/industry-configs/professional.js.map +1 -0
  774. package/dist/industry-configs/realestate.d.ts +2 -0
  775. package/dist/industry-configs/realestate.js +146 -0
  776. package/dist/industry-configs/realestate.js.map +1 -0
  777. package/dist/industry-configs/retail.d.ts +2 -0
  778. package/dist/industry-configs/retail.js +108 -0
  779. package/dist/industry-configs/retail.js.map +1 -0
  780. package/dist/industry-configs/services.d.ts +2 -0
  781. package/dist/industry-configs/services.js +120 -0
  782. package/dist/industry-configs/services.js.map +1 -0
  783. package/dist/industry-configs/technology.d.ts +2 -0
  784. package/dist/industry-configs/technology.js +120 -0
  785. package/dist/industry-configs/technology.js.map +1 -0
  786. package/dist/industry-configs/types.d.ts +99 -0
  787. package/dist/industry-configs/types.js +1 -0
  788. package/dist/industry-configs/types.js.map +1 -0
  789. package/dist/industry-configs/wellness.d.ts +2 -0
  790. package/dist/industry-configs/wellness.js +112 -0
  791. package/dist/industry-configs/wellness.js.map +1 -0
  792. package/dist/industry-configs.d.ts +1 -0
  793. package/dist/industry-configs.js +1 -0
  794. package/dist/intents/analytics-labels.d.ts +70 -0
  795. package/dist/intents/analytics-labels.js +39 -0
  796. package/dist/intents/analytics-labels.js.map +1 -0
  797. package/dist/intents/archetype-flow.d.ts +146 -0
  798. package/dist/intents/archetype-flow.js +185 -0
  799. package/dist/intents/archetype-flow.js.map +1 -0
  800. package/dist/intents/booking-query-style.d.ts +32 -0
  801. package/dist/intents/booking-query-style.js +22 -0
  802. package/dist/intents/booking-query-style.js.map +1 -0
  803. package/dist/intents/capture-leads.config.d.ts +31 -0
  804. package/dist/intents/capture-leads.config.js +231 -0
  805. package/dist/intents/capture-leads.config.js.map +1 -0
  806. package/dist/intents/catalog-stock.d.ts +43 -0
  807. package/dist/intents/catalog-stock.js +43 -0
  808. package/dist/intents/catalog-stock.js.map +1 -0
  809. package/dist/intents/collapse-shared-nav.d.ts +95 -0
  810. package/dist/intents/collapse-shared-nav.js +171 -0
  811. package/dist/intents/collapse-shared-nav.js.map +1 -0
  812. package/dist/intents/default-commerce.config.d.ts +6 -0
  813. package/dist/intents/default-commerce.config.js +281 -0
  814. package/dist/intents/default-commerce.config.js.map +1 -0
  815. package/dist/intents/digital-products.config.d.ts +2 -0
  816. package/dist/intents/digital-products.config.js +239 -0
  817. package/dist/intents/digital-products.config.js.map +1 -0
  818. package/dist/intents/dine-in.config.d.ts +15 -0
  819. package/dist/intents/dine-in.config.js +331 -0
  820. package/dist/intents/dine-in.config.js.map +1 -0
  821. package/dist/intents/event-tickets.config.d.ts +2 -0
  822. package/dist/intents/event-tickets.config.js +368 -0
  823. package/dist/intents/event-tickets.config.js.map +1 -0
  824. package/dist/intents/food-orders.config.d.ts +2 -0
  825. package/dist/intents/food-orders.config.js +299 -0
  826. package/dist/intents/food-orders.config.js.map +1 -0
  827. package/dist/intents/icon-map.d.ts +15 -0
  828. package/dist/intents/icon-map.js +104 -0
  829. package/dist/intents/icon-map.js.map +1 -0
  830. package/dist/intents/index.d.ts +12 -0
  831. package/dist/intents/index.js +50 -0
  832. package/dist/intents/index.js.map +1 -0
  833. package/dist/intents/infer-intents.d.ts +10 -0
  834. package/dist/intents/infer-intents.js +23 -0
  835. package/dist/intents/infer-intents.js.map +1 -0
  836. package/dist/intents/intent-chips.d.ts +47 -0
  837. package/dist/intents/intent-chips.js +38 -0
  838. package/dist/intents/intent-chips.js.map +1 -0
  839. package/dist/intents/intent-nav.d.ts +95 -0
  840. package/dist/intents/intent-nav.js +423 -0
  841. package/dist/intents/intent-nav.js.map +1 -0
  842. package/dist/intents/intent-scope.d.ts +52 -0
  843. package/dist/intents/intent-scope.js +19 -0
  844. package/dist/intents/intent-scope.js.map +1 -0
  845. package/dist/intents/nav-coverage.d.ts +71 -0
  846. package/dist/intents/nav-coverage.js +132 -0
  847. package/dist/intents/nav-coverage.js.map +1 -0
  848. package/dist/intents/operating-shell.d.ts +45 -0
  849. package/dist/intents/operating-shell.js +142 -0
  850. package/dist/intents/operating-shell.js.map +1 -0
  851. package/dist/intents/order-display.d.ts +21 -0
  852. package/dist/intents/order-display.js +110 -0
  853. package/dist/intents/order-display.js.map +1 -0
  854. package/dist/intents/order-intent.d.ts +18 -0
  855. package/dist/intents/order-intent.js +14 -0
  856. package/dist/intents/order-intent.js.map +1 -0
  857. package/dist/intents/order-progress.d.ts +81 -0
  858. package/dist/intents/order-progress.js +91 -0
  859. package/dist/intents/order-progress.js.map +1 -0
  860. package/dist/intents/order-sections.d.ts +173 -0
  861. package/dist/intents/order-sections.js +188 -0
  862. package/dist/intents/order-sections.js.map +1 -0
  863. package/dist/intents/order-stats.d.ts +24 -0
  864. package/dist/intents/order-stats.js +16 -0
  865. package/dist/intents/order-stats.js.map +1 -0
  866. package/dist/intents/order-transitions.d.ts +19 -0
  867. package/dist/intents/order-transitions.js +66 -0
  868. package/dist/intents/order-transitions.js.map +1 -0
  869. package/dist/intents/product-editor-config.d.ts +23 -0
  870. package/dist/intents/product-editor-config.js +13 -0
  871. package/dist/intents/product-editor-config.js.map +1 -0
  872. package/dist/intents/product-intent.d.ts +38 -0
  873. package/dist/intents/product-intent.js +19 -0
  874. package/dist/intents/product-intent.js.map +1 -0
  875. package/dist/intents/registry.d.ts +32 -0
  876. package/dist/intents/registry.js +41 -0
  877. package/dist/intents/registry.js.map +1 -0
  878. package/dist/intents/rent-property.config.d.ts +2 -0
  879. package/dist/intents/rent-property.config.js +284 -0
  880. package/dist/intents/rent-property.config.js.map +1 -0
  881. package/dist/intents/resolve-stats.d.ts +7 -0
  882. package/dist/intents/resolve-stats.js +29 -0
  883. package/dist/intents/resolve-stats.js.map +1 -0
  884. package/dist/intents/resolve-tenant-intents.d.ts +11 -0
  885. package/dist/intents/resolve-tenant-intents.js +61 -0
  886. package/dist/intents/resolve-tenant-intents.js.map +1 -0
  887. package/dist/intents/resolvers.d.ts +52 -0
  888. package/dist/intents/resolvers.js +177 -0
  889. package/dist/intents/resolvers.js.map +1 -0
  890. package/dist/intents/row-identity.d.ts +62 -0
  891. package/dist/intents/row-identity.js +25 -0
  892. package/dist/intents/row-identity.js.map +1 -0
  893. package/dist/intents/sales-verb.d.ts +8 -0
  894. package/dist/intents/sales-verb.js +12 -0
  895. package/dist/intents/sales-verb.js.map +1 -0
  896. package/dist/intents/scoped-config.d.ts +12 -0
  897. package/dist/intents/scoped-config.js +17 -0
  898. package/dist/intents/scoped-config.js.map +1 -0
  899. package/dist/intents/screen-title.d.ts +27 -0
  900. package/dist/intents/screen-title.js +59 -0
  901. package/dist/intents/screen-title.js.map +1 -0
  902. package/dist/intents/section-registry.d.ts +48 -0
  903. package/dist/intents/section-registry.js +33 -0
  904. package/dist/intents/section-registry.js.map +1 -0
  905. package/dist/intents/sell-products.config.d.ts +2 -0
  906. package/dist/intents/sell-products.config.js +275 -0
  907. package/dist/intents/sell-products.config.js.map +1 -0
  908. package/dist/intents/send-invoices.config.d.ts +16 -0
  909. package/dist/intents/send-invoices.config.js +223 -0
  910. package/dist/intents/send-invoices.config.js.map +1 -0
  911. package/dist/intents/subscriptions.config.d.ts +2 -0
  912. package/dist/intents/subscriptions.config.js +260 -0
  913. package/dist/intents/subscriptions.config.js.map +1 -0
  914. package/dist/intents/take-bookings.config.d.ts +2 -0
  915. package/dist/intents/take-bookings.config.js +298 -0
  916. package/dist/intents/take-bookings.config.js.map +1 -0
  917. package/dist/intents/types.d.ts +246 -0
  918. package/dist/intents/types.js +1 -0
  919. package/dist/intents/types.js.map +1 -0
  920. package/dist/intents/use-active-intent.d.ts +27 -0
  921. package/dist/intents/use-active-intent.js +74 -0
  922. package/dist/intents/use-active-intent.js.map +1 -0
  923. package/dist/intents/use-destination-label.d.ts +18 -0
  924. package/dist/intents/use-destination-label.js +45 -0
  925. package/dist/intents/use-destination-label.js.map +1 -0
  926. package/dist/intents/use-entity-label.d.ts +32 -0
  927. package/dist/intents/use-entity-label.js +75 -0
  928. package/dist/intents/use-entity-label.js.map +1 -0
  929. package/dist/intents/use-intent-config.d.ts +20 -0
  930. package/dist/intents/use-intent-config.js +91 -0
  931. package/dist/intents/use-intent-config.js.map +1 -0
  932. package/dist/intents/use-intent-nav-rows.d.ts +26 -0
  933. package/dist/intents/use-intent-nav-rows.js +49 -0
  934. package/dist/intents/use-intent-nav-rows.js.map +1 -0
  935. package/dist/intents/use-resource-label.d.ts +10 -0
  936. package/dist/intents/use-resource-label.js +9 -0
  937. package/dist/intents/use-resource-label.js.map +1 -0
  938. package/dist/intents/use-row-noun.d.ts +19 -0
  939. package/dist/intents/use-row-noun.js +13 -0
  940. package/dist/intents/use-row-noun.js.map +1 -0
  941. package/dist/intents/use-screen-title.d.ts +9 -0
  942. package/dist/intents/use-screen-title.js +25 -0
  943. package/dist/intents/use-screen-title.js.map +1 -0
  944. package/dist/intents/what-it-adds.d.ts +70 -0
  945. package/dist/intents/what-it-adds.js +29 -0
  946. package/dist/intents/what-it-adds.js.map +1 -0
  947. package/dist/intents/workflow-shape.d.ts +66 -0
  948. package/dist/intents/workflow-shape.js +151 -0
  949. package/dist/intents/workflow-shape.js.map +1 -0
  950. package/dist/intents.d.ts +1 -0
  951. package/dist/intents.js +1 -0
  952. package/dist/invite-refusal.d.ts +37 -0
  953. package/dist/invite-refusal.js +26 -0
  954. package/dist/invite-refusal.js.map +1 -0
  955. package/dist/invoice-brand.d.ts +28 -0
  956. package/dist/invoice-brand.js +33 -0
  957. package/dist/invoice-brand.js.map +1 -0
  958. package/dist/ios-navigation-context.d.ts +11 -0
  959. package/dist/ios-navigation-context.js +52 -0
  960. package/dist/ios-navigation-context.js.map +1 -0
  961. package/dist/legal-links.d.ts +10 -0
  962. package/dist/legal-links.js +7 -0
  963. package/dist/legal-links.js.map +1 -0
  964. package/dist/letting-policy.d.ts +85 -0
  965. package/dist/letting-policy.js +47 -0
  966. package/dist/letting-policy.js.map +1 -0
  967. package/dist/list-page-size.d.ts +24 -0
  968. package/dist/list-page-size.js +5 -0
  969. package/dist/list-page-size.js.map +1 -0
  970. package/dist/live-events/sse-frames.d.ts +15 -0
  971. package/dist/live-events/sse-frames.js +37 -0
  972. package/dist/live-events/sse-frames.js.map +1 -0
  973. package/dist/location-options.d.ts +16 -0
  974. package/dist/location-options.js +94 -0
  975. package/dist/location-options.js.map +1 -0
  976. package/dist/location-scope-context.d.ts +47 -0
  977. package/dist/location-scope-context.js +85 -0
  978. package/dist/location-scope-context.js.map +1 -0
  979. package/dist/media-service.d.ts +97 -0
  980. package/dist/media-service.js +282 -0
  981. package/dist/media-service.js.map +1 -0
  982. package/dist/media-utils.d.ts +51 -0
  983. package/dist/media-utils.js +85 -0
  984. package/dist/media-utils.js.map +1 -0
  985. package/dist/member-presence.d.ts +40 -0
  986. package/dist/member-presence.js +77 -0
  987. package/dist/member-presence.js.map +1 -0
  988. package/dist/member-subscription-enrollment.d.ts +16 -0
  989. package/dist/member-subscription-enrollment.js +32 -0
  990. package/dist/member-subscription-enrollment.js.map +1 -0
  991. package/dist/membership-freshness.d.ts +31 -0
  992. package/dist/membership-freshness.js +21 -0
  993. package/dist/membership-freshness.js.map +1 -0
  994. package/dist/mobile-header-context.d.ts +32 -0
  995. package/dist/mobile-header-context.js +59 -0
  996. package/dist/mobile-header-context.js.map +1 -0
  997. package/dist/mobile-routes.d.ts +81 -0
  998. package/dist/mobile-routes.js +406 -0
  999. package/dist/mobile-routes.js.map +1 -0
  1000. package/dist/mobile-tab-config.d.ts +18 -0
  1001. package/dist/mobile-tab-config.js +43 -0
  1002. package/dist/mobile-tab-config.js.map +1 -0
  1003. package/dist/money-coming-soon.d.ts +16 -0
  1004. package/dist/money-coming-soon.js +22 -0
  1005. package/dist/money-coming-soon.js.map +1 -0
  1006. package/dist/money-minor.d.ts +17 -0
  1007. package/dist/money-minor.js +53 -0
  1008. package/dist/money-minor.js.map +1 -0
  1009. package/dist/money-visibility.d.ts +38 -0
  1010. package/dist/money-visibility.js +13 -0
  1011. package/dist/money-visibility.js.map +1 -0
  1012. package/dist/motion.d.ts +160 -0
  1013. package/dist/motion.js +130 -0
  1014. package/dist/motion.js.map +1 -0
  1015. package/dist/nav-pending.d.ts +42 -0
  1016. package/dist/nav-pending.js +84 -0
  1017. package/dist/nav-pending.js.map +1 -0
  1018. package/dist/navigation-groups.d.ts +52 -0
  1019. package/dist/navigation-groups.js +64 -0
  1020. package/dist/navigation-groups.js.map +1 -0
  1021. package/dist/onboarding-draft.d.ts +23 -0
  1022. package/dist/onboarding-draft.js +35 -0
  1023. package/dist/onboarding-draft.js.map +1 -0
  1024. package/dist/operating-model/index.d.ts +4 -0
  1025. package/dist/operating-model/index.js +13 -0
  1026. package/dist/operating-model/index.js.map +1 -0
  1027. package/dist/operating-model/order-display.d.ts +10 -0
  1028. package/dist/operating-model/order-display.js +24 -0
  1029. package/dist/operating-model/order-display.js.map +1 -0
  1030. package/dist/operating-model/resolver.d.ts +9 -0
  1031. package/dist/operating-model/resolver.js +110 -0
  1032. package/dist/operating-model/resolver.js.map +1 -0
  1033. package/dist/operating-model/types.d.ts +36 -0
  1034. package/dist/operating-model/types.js +1 -0
  1035. package/dist/operating-model/types.js.map +1 -0
  1036. package/dist/operating-model/use-operating-model.d.ts +7 -0
  1037. package/dist/operating-model/use-operating-model.js +65 -0
  1038. package/dist/operating-model/use-operating-model.js.map +1 -0
  1039. package/dist/operating-model.d.ts +1 -0
  1040. package/dist/operating-model.js +1 -0
  1041. package/dist/order-config.d.ts +30 -0
  1042. package/dist/order-config.js +56 -0
  1043. package/dist/order-config.js.map +1 -0
  1044. package/dist/order-discounts.d.ts +25 -0
  1045. package/dist/order-discounts.js +27 -0
  1046. package/dist/order-discounts.js.map +1 -0
  1047. package/dist/order-shipping.d.ts +33 -0
  1048. package/dist/order-shipping.js +49 -0
  1049. package/dist/order-shipping.js.map +1 -0
  1050. package/dist/order-tax.d.ts +28 -0
  1051. package/dist/order-tax.js +21 -0
  1052. package/dist/order-tax.js.map +1 -0
  1053. package/dist/page-intros.d.ts +78 -0
  1054. package/dist/page-intros.js +164 -0
  1055. package/dist/page-intros.js.map +1 -0
  1056. package/dist/page-transition.d.ts +20 -0
  1057. package/dist/page-transition.js +19 -0
  1058. package/dist/page-transition.js.map +1 -0
  1059. package/dist/pages-api-response.d.ts +8 -0
  1060. package/dist/pages-api-response.js +18 -0
  1061. package/dist/pages-api-response.js.map +1 -0
  1062. package/dist/payment-method-label.d.ts +6 -0
  1063. package/dist/payment-method-label.js +14 -0
  1064. package/dist/payment-method-label.js.map +1 -0
  1065. package/dist/permission-aliases.d.ts +18 -0
  1066. package/dist/permission-aliases.js +20 -0
  1067. package/dist/permission-aliases.js.map +1 -0
  1068. package/dist/permission-catalog-fallback.d.ts +17 -0
  1069. package/dist/permission-catalog-fallback.js +147 -0
  1070. package/dist/permission-catalog-fallback.js.map +1 -0
  1071. package/dist/permission-change.d.ts +42 -0
  1072. package/dist/permission-change.js +33 -0
  1073. package/dist/permission-change.js.map +1 -0
  1074. package/dist/phone.d.ts +16 -0
  1075. package/dist/phone.js +20 -0
  1076. package/dist/phone.js.map +1 -0
  1077. package/dist/plan-access.d.ts +39 -0
  1078. package/dist/plan-access.js +57 -0
  1079. package/dist/plan-access.js.map +1 -0
  1080. package/dist/plan-card-api.d.ts +34 -0
  1081. package/dist/plan-card-api.js +30 -0
  1082. package/dist/plan-card-api.js.map +1 -0
  1083. package/dist/plan-price.d.ts +34 -0
  1084. package/dist/plan-price.js +57 -0
  1085. package/dist/plan-price.js.map +1 -0
  1086. package/dist/post-login-target.d.ts +24 -0
  1087. package/dist/post-login-target.js +12 -0
  1088. package/dist/post-login-target.js.map +1 -0
  1089. package/dist/potter-mark-paths.d.ts +21 -0
  1090. package/dist/potter-mark-paths.js +9 -0
  1091. package/dist/potter-mark-paths.js.map +1 -0
  1092. package/dist/pricing-plans-types.d.ts +143 -0
  1093. package/dist/pricing-plans-types.js +1 -0
  1094. package/dist/pricing-plans-types.js.map +1 -0
  1095. package/dist/product-assignees.d.ts +1 -0
  1096. package/dist/product-assignees.js +18 -0
  1097. package/dist/product-assignees.js.map +1 -0
  1098. package/dist/product-collection-sync.d.ts +12 -0
  1099. package/dist/product-collection-sync.js +97 -0
  1100. package/dist/product-collection-sync.js.map +1 -0
  1101. package/dist/product-cost.d.ts +12 -0
  1102. package/dist/product-cost.js +24 -0
  1103. package/dist/product-cost.js.map +1 -0
  1104. package/dist/product-insights-api.d.ts +38 -0
  1105. package/dist/product-insights-api.js +51 -0
  1106. package/dist/product-insights-api.js.map +1 -0
  1107. package/dist/product-types.d.ts +311 -0
  1108. package/dist/product-types.js +38 -0
  1109. package/dist/product-types.js.map +1 -0
  1110. package/dist/promised-day.d.ts +33 -0
  1111. package/dist/promised-day.js +38 -0
  1112. package/dist/promised-day.js.map +1 -0
  1113. package/dist/proposals-api.d.ts +96 -0
  1114. package/dist/proposals-api.js +41 -0
  1115. package/dist/proposals-api.js.map +1 -0
  1116. package/dist/proxy-allowlist.d.ts +15 -0
  1117. package/dist/proxy-allowlist.js +153 -0
  1118. package/dist/proxy-allowlist.js.map +1 -0
  1119. package/dist/public-config-loader.d.ts +27 -0
  1120. package/dist/public-config-loader.js +12 -0
  1121. package/dist/public-config-loader.js.map +1 -0
  1122. package/dist/public-config-provider.d.ts +16 -0
  1123. package/dist/public-config-provider.js +14 -0
  1124. package/dist/public-config-provider.js.map +1 -0
  1125. package/dist/resolve-enabled-behaviors.d.ts +55 -0
  1126. package/dist/resolve-enabled-behaviors.js +134 -0
  1127. package/dist/resolve-enabled-behaviors.js.map +1 -0
  1128. package/dist/resource-types.d.ts +198 -0
  1129. package/dist/resource-types.js +96 -0
  1130. package/dist/resource-types.js.map +1 -0
  1131. package/dist/resume-screen.d.ts +31 -0
  1132. package/dist/resume-screen.js +25 -0
  1133. package/dist/resume-screen.js.map +1 -0
  1134. package/dist/rider-display.d.ts +37 -0
  1135. package/dist/rider-display.js +110 -0
  1136. package/dist/rider-display.js.map +1 -0
  1137. package/dist/rider-view.d.ts +37 -0
  1138. package/dist/rider-view.js +47 -0
  1139. package/dist/rider-view.js.map +1 -0
  1140. package/dist/roster-label.d.ts +27 -0
  1141. package/dist/roster-label.js +8 -0
  1142. package/dist/roster-label.js.map +1 -0
  1143. package/dist/route-pattern.d.ts +11 -0
  1144. package/dist/route-pattern.js +20 -0
  1145. package/dist/route-pattern.js.map +1 -0
  1146. package/dist/route-permission.d.ts +60 -0
  1147. package/dist/route-permission.js +48 -0
  1148. package/dist/route-permission.js.map +1 -0
  1149. package/dist/runtime-config.d.ts +33 -0
  1150. package/dist/runtime-config.js +23 -0
  1151. package/dist/runtime-config.js.map +1 -0
  1152. package/dist/schema-validation.d.ts +172 -0
  1153. package/dist/schema-validation.js +252 -0
  1154. package/dist/schema-validation.js.map +1 -0
  1155. package/dist/service-areas.d.ts +30 -0
  1156. package/dist/service-areas.js +24 -0
  1157. package/dist/service-areas.js.map +1 -0
  1158. package/dist/service-operations-api.d.ts +78 -0
  1159. package/dist/service-operations-api.js +37 -0
  1160. package/dist/service-operations-api.js.map +1 -0
  1161. package/dist/settings-relevance.d.ts +64 -0
  1162. package/dist/settings-relevance.js +25 -0
  1163. package/dist/settings-relevance.js.map +1 -0
  1164. package/dist/singularise.d.ts +16 -0
  1165. package/dist/singularise.js +37 -0
  1166. package/dist/singularise.js.map +1 -0
  1167. package/dist/site-address.d.ts +14 -0
  1168. package/dist/site-address.js +28 -0
  1169. package/dist/site-address.js.map +1 -0
  1170. package/dist/slug.d.ts +26 -0
  1171. package/dist/slug.js +15 -0
  1172. package/dist/slug.js.map +1 -0
  1173. package/dist/sound.d.ts +14 -0
  1174. package/dist/sound.js +166 -0
  1175. package/dist/sound.js.map +1 -0
  1176. package/dist/staff-arrival.d.ts +3 -0
  1177. package/dist/staff-arrival.js +11 -0
  1178. package/dist/staff-arrival.js.map +1 -0
  1179. package/dist/staff-home.d.ts +58 -0
  1180. package/dist/staff-home.js +90 -0
  1181. package/dist/staff-home.js.map +1 -0
  1182. package/dist/staff-landing.d.ts +1 -0
  1183. package/dist/staff-landing.js +15 -0
  1184. package/dist/staff-landing.js.map +1 -0
  1185. package/dist/stat-card-types.d.ts +19 -0
  1186. package/dist/stat-card-types.js +1 -0
  1187. package/dist/stat-card-types.js.map +1 -0
  1188. package/dist/stock-levels.d.ts +32 -0
  1189. package/dist/stock-levels.js +17 -0
  1190. package/dist/stock-levels.js.map +1 -0
  1191. package/dist/stored-token.d.ts +1 -0
  1192. package/dist/stored-token.js +11 -0
  1193. package/dist/stored-token.js.map +1 -0
  1194. package/dist/storefront-url.d.ts +31 -0
  1195. package/dist/storefront-url.js +40 -0
  1196. package/dist/storefront-url.js.map +1 -0
  1197. package/dist/storefront.d.ts +64 -0
  1198. package/dist/storefront.js +51 -0
  1199. package/dist/storefront.js.map +1 -0
  1200. package/dist/subscription-billing-api.d.ts +115 -0
  1201. package/dist/subscription-billing-api.js +27 -0
  1202. package/dist/subscription-billing-api.js.map +1 -0
  1203. package/dist/subscription-billing-model.d.ts +26 -0
  1204. package/dist/subscription-billing-model.js +58 -0
  1205. package/dist/subscription-billing-model.js.map +1 -0
  1206. package/dist/support-case-subject.d.ts +10 -0
  1207. package/dist/support-case-subject.js +13 -0
  1208. package/dist/support-case-subject.js.map +1 -0
  1209. package/dist/support-inbox.d.ts +6 -0
  1210. package/dist/support-inbox.js +5 -0
  1211. package/dist/support-inbox.js.map +1 -0
  1212. package/dist/support.d.ts +7 -0
  1213. package/dist/support.js +16 -0
  1214. package/dist/support.js.map +1 -0
  1215. package/dist/team-page.d.ts +9 -0
  1216. package/dist/team-page.js +5 -0
  1217. package/dist/team-page.js.map +1 -0
  1218. package/dist/team-roles.d.ts +140 -0
  1219. package/dist/team-roles.js +247 -0
  1220. package/dist/team-roles.js.map +1 -0
  1221. package/dist/team-successors.d.ts +20 -0
  1222. package/dist/team-successors.js +13 -0
  1223. package/dist/team-successors.js.map +1 -0
  1224. package/dist/template-asset-url.d.ts +11 -0
  1225. package/dist/template-asset-url.js +8 -0
  1226. package/dist/template-asset-url.js.map +1 -0
  1227. package/dist/template-capabilities.d.ts +2 -0
  1228. package/dist/template-capabilities.js +71 -0
  1229. package/dist/template-capabilities.js.map +1 -0
  1230. package/dist/template-context.d.ts +111 -0
  1231. package/dist/template-context.js +1278 -0
  1232. package/dist/template-context.js.map +1 -0
  1233. package/dist/template-filter.d.ts +29 -0
  1234. package/dist/template-filter.js +41 -0
  1235. package/dist/template-filter.js.map +1 -0
  1236. package/dist/template-preview/preview-author-patch.d.ts +24 -0
  1237. package/dist/template-preview/preview-author-patch.js +78 -0
  1238. package/dist/template-preview/preview-author-patch.js.map +1 -0
  1239. package/dist/template-preview/use-template-document.d.ts +38 -0
  1240. package/dist/template-preview/use-template-document.js +45 -0
  1241. package/dist/template-preview/use-template-document.js.map +1 -0
  1242. package/dist/template-requirements.d.ts +38 -0
  1243. package/dist/template-requirements.js +13 -0
  1244. package/dist/template-requirements.js.map +1 -0
  1245. package/dist/template-types.d.ts +317 -0
  1246. package/dist/template-types.js +1 -0
  1247. package/dist/template-types.js.map +1 -0
  1248. package/dist/templates.d.ts +22 -0
  1249. package/dist/templates.js +1 -0
  1250. package/dist/templates.js.map +1 -0
  1251. package/dist/theme-context.d.ts +58 -0
  1252. package/dist/theme-context.js +283 -0
  1253. package/dist/theme-context.js.map +1 -0
  1254. package/dist/theme-policy.d.ts +41 -0
  1255. package/dist/theme-policy.js +32 -0
  1256. package/dist/theme-policy.js.map +1 -0
  1257. package/dist/ticket-access.d.ts +20 -0
  1258. package/dist/ticket-access.js +39 -0
  1259. package/dist/ticket-access.js.map +1 -0
  1260. package/dist/timeline-copy.d.ts +65 -0
  1261. package/dist/timeline-copy.js +150 -0
  1262. package/dist/timeline-copy.js.map +1 -0
  1263. package/dist/url-params.d.ts +23 -0
  1264. package/dist/url-params.js +43 -0
  1265. package/dist/url-params.js.map +1 -0
  1266. package/dist/use-behaviors.d.ts +13 -0
  1267. package/dist/use-behaviors.js +41 -0
  1268. package/dist/use-behaviors.js.map +1 -0
  1269. package/dist/use-business-locations.d.ts +35 -0
  1270. package/dist/use-business-locations.js +71 -0
  1271. package/dist/use-business-locations.js.map +1 -0
  1272. package/dist/use-currency.d.ts +12 -0
  1273. package/dist/use-currency.js +16 -0
  1274. package/dist/use-currency.js.map +1 -0
  1275. package/dist/use-empty-state-copy.d.ts +12 -0
  1276. package/dist/use-empty-state-copy.js +13 -0
  1277. package/dist/use-empty-state-copy.js.map +1 -0
  1278. package/dist/use-geo-cities.d.ts +1 -0
  1279. package/dist/use-geo-cities.js +42 -0
  1280. package/dist/use-geo-cities.js.map +1 -0
  1281. package/dist/use-has-hardware.d.ts +13 -0
  1282. package/dist/use-has-hardware.js +14 -0
  1283. package/dist/use-has-hardware.js.map +1 -0
  1284. package/dist/use-industry-key.d.ts +10 -0
  1285. package/dist/use-industry-key.js +16 -0
  1286. package/dist/use-industry-key.js.map +1 -0
  1287. package/dist/use-item-links.d.ts +20 -0
  1288. package/dist/use-item-links.js +30 -0
  1289. package/dist/use-item-links.js.map +1 -0
  1290. package/dist/use-job-roles.d.ts +21 -0
  1291. package/dist/use-job-roles.js +76 -0
  1292. package/dist/use-job-roles.js.map +1 -0
  1293. package/dist/use-merchant-plan.d.ts +36 -0
  1294. package/dist/use-merchant-plan.js +78 -0
  1295. package/dist/use-merchant-plan.js.map +1 -0
  1296. package/dist/use-module-label.d.ts +12 -0
  1297. package/dist/use-module-label.js +13 -0
  1298. package/dist/use-module-label.js.map +1 -0
  1299. package/dist/use-money-visibility.d.ts +14 -0
  1300. package/dist/use-money-visibility.js +13 -0
  1301. package/dist/use-money-visibility.js.map +1 -0
  1302. package/dist/use-nav-groups.d.ts +27 -0
  1303. package/dist/use-nav-groups.js +141 -0
  1304. package/dist/use-nav-groups.js.map +1 -0
  1305. package/dist/use-pathname.d.ts +15 -0
  1306. package/dist/use-pathname.js +29 -0
  1307. package/dist/use-pathname.js.map +1 -0
  1308. package/dist/use-permissions.d.ts +43 -0
  1309. package/dist/use-permissions.js +158 -0
  1310. package/dist/use-permissions.js.map +1 -0
  1311. package/dist/use-platform-modules.d.ts +49 -0
  1312. package/dist/use-platform-modules.js +416 -0
  1313. package/dist/use-platform-modules.js.map +1 -0
  1314. package/dist/use-staff-home.d.ts +9 -0
  1315. package/dist/use-staff-home.js +24 -0
  1316. package/dist/use-staff-home.js.map +1 -0
  1317. package/dist/use-workspace-invite.d.ts +37 -0
  1318. package/dist/use-workspace-invite.js +69 -0
  1319. package/dist/use-workspace-invite.js.map +1 -0
  1320. package/dist/utils.d.ts +53 -0
  1321. package/dist/utils.js +161 -0
  1322. package/dist/utils.js.map +1 -0
  1323. package/dist/wallet-format.d.ts +8 -0
  1324. package/dist/wallet-format.js +36 -0
  1325. package/dist/wallet-format.js.map +1 -0
  1326. package/dist/wallet-settlement.d.ts +14 -0
  1327. package/dist/wallet-settlement.js +5 -0
  1328. package/dist/wallet-settlement.js.map +1 -0
  1329. package/dist/web-url.d.ts +1 -0
  1330. package/dist/web-url.js +50 -0
  1331. package/dist/web-url.js.map +1 -0
  1332. package/dist/whats-new.d.ts +59 -0
  1333. package/dist/whats-new.js +77 -0
  1334. package/dist/whats-new.js.map +1 -0
  1335. package/dist/workspace-recents.d.ts +30 -0
  1336. package/dist/workspace-recents.js +37 -0
  1337. package/dist/workspace-recents.js.map +1 -0
  1338. package/dist/workspace-slug.d.ts +1 -0
  1339. package/dist/workspace-slug.js +15 -0
  1340. package/dist/workspace-slug.js.map +1 -0
  1341. package/package.json +57 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/media-service.ts"],"sourcesContent":["import { BRAND_PRIMARY } from '@withpotter/lib/brand';\n\n/**\n * Media Service - Handles image uploads via Box API proxy.\n *\n * Uploads are sent to `/api/proxy/media/upload`, where the backend handles\n * storage + Cloudinary integration and usage metering.\n */\n\n// Cloudinary configuration\nexport const CLOUDINARY_CONFIG = {\n cloudName: process.env.NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME || '',\n uploadPreset: process.env.NEXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET || '',\n};\n\nexport const isCloudinaryEnabled = Boolean(CLOUDINARY_CONFIG.cloudName);\n\n// Cloudinary transformation presets\nexport const CLOUDINARY_TRANSFORMS = {\n thumbnail: 'w_200,h_200,c_fill,q_auto',\n preview: 'w_400,h_400,c_limit,q_auto',\n product: 'w_800,h_800,c_limit,q_auto',\n hero: 'w_1920,h_1080,c_fill,q_auto',\n full: 'q_auto',\n};\n\n/**\n * Build Cloudinary URL with transformations\n */\nexport function buildCloudinaryUrl(\n publicId: string,\n transform: keyof typeof CLOUDINARY_TRANSFORMS | string = 'preview',\n): string {\n if (!CLOUDINARY_CONFIG.cloudName) return publicId;\n\n const transformation =\n CLOUDINARY_TRANSFORMS[transform as keyof typeof CLOUDINARY_TRANSFORMS] ||\n transform;\n\n return `https://res.cloudinary.com/${CLOUDINARY_CONFIG.cloudName}/image/upload/${transformation}/${publicId}`;\n}\n\n/**\n * Derive a favicon URL from a logo URL.\n *\n * If the logo is hosted on Cloudinary (`res.cloudinary.com/<cloud>/image/upload/...`),\n * we inject a square padded transform so any logo shape (wide wordmark, tall mark)\n * renders cleanly at 32×32 in a browser tab. If the URL is not Cloudinary we return\n * it as-is — browsers will still accept it and downscale.\n *\n * The transform replaces any existing transform segment immediately after `/upload/`,\n * so calling this on an already-derived favicon URL is idempotent.\n */\nexport function deriveFaviconUrl(\n logoUrl: string | undefined | null,\n): string | undefined {\n if (!logoUrl) return undefined;\n\n // Match the Cloudinary upload URL shape and capture the transform segment (if any)\n // followed by the asset path.\n // e.g. https://res.cloudinary.com/<cloud>/image/upload/<transform>/v123/path.png\n // or https://res.cloudinary.com/<cloud>/image/upload/v123/path.png (no transform)\n const cloudinaryPattern =\n /^(https?:\\/\\/res\\.cloudinary\\.com\\/[^/]+\\/image\\/upload\\/)([^/]+\\/)?(.+)$/;\n const match = logoUrl.match(cloudinaryPattern);\n if (!match) return logoUrl;\n\n const [, prefix, maybeTransform, rest] = match;\n // A version segment looks like `v123456`. If the captured segment is a version\n // (not a transform), keep it as part of the asset path.\n const transformSegment = maybeTransform ?? '';\n const isVersion = /^v\\d+\\/$/.test(transformSegment);\n const assetPath = isVersion ? `${transformSegment}${rest}` : rest;\n\n const faviconTransform = 'w_180,h_180,c_pad,b_transparent,f_png,q_auto';\n return `${prefix}${faviconTransform}/${assetPath}`;\n}\n\n/**\n * Compress and resize image to prevent browser crashes from large base64 strings\n * Used as fallback when Cloudinary is not configured\n */\nexport async function compressImage(\n file: File,\n maxWidth = 1200,\n maxHeight = 1200,\n quality = 0.8,\n): Promise<string> {\n return new Promise((resolve, reject) => {\n const img = document.createElement('img');\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n img.onload = () => {\n URL.revokeObjectURL(img.src);\n\n let { width, height } = img;\n\n // Scale down if needed\n if (width > maxWidth || height > maxHeight) {\n const ratio = Math.min(maxWidth / width, maxHeight / height);\n width = Math.round(width * ratio);\n height = Math.round(height * ratio);\n }\n\n canvas.width = width;\n canvas.height = height;\n\n if (!ctx) {\n reject(new Error('Could not get canvas context'));\n return;\n }\n\n // Draw image on canvas\n ctx.drawImage(img, 0, 0, width, height);\n\n // Convert to compressed JPEG or keep PNG for transparency\n const mimeType = file.type === 'image/png' ? 'image/png' : 'image/jpeg';\n const dataUrl = canvas.toDataURL(mimeType, quality);\n\n resolve(dataUrl);\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(img.src);\n reject(new Error('Failed to load image'));\n };\n\n img.src = URL.createObjectURL(file);\n });\n}\n\n/**\n * Upload image result type\n */\nexport interface UploadResult {\n url: string;\n publicId?: string; // Cloudinary public ID for transformations\n width?: number;\n height?: number;\n resourceType?: 'image' | 'video';\n duration?: number;\n thumbnail?: string;\n format?: string;\n isCloudinary: boolean;\n}\n\nfunction getStoredTenantSlug(): string {\n if (typeof window === 'undefined') {\n return '';\n }\n\n const directKeys = ['pb_current_tenant', 'currentWorkspace'];\n for (const key of directKeys) {\n const value = localStorage.getItem(key)?.trim();\n if (value) {\n return value;\n }\n }\n\n const tenantJson = localStorage.getItem('tenant');\n if (tenantJson) {\n try {\n const tenant = JSON.parse(tenantJson) as { slug?: string };\n if (tenant.slug?.trim()) {\n return tenant.slug.trim();\n }\n } catch {\n // Ignore malformed persisted tenant state and keep falling back.\n }\n }\n\n return '';\n}\n\n/**\n * Upload image via Box API proxy.\n */\nexport async function uploadImage(file: File): Promise<UploadResult> {\n return uploadViaApi(file);\n}\n\n/**\n * Upload via Box API proxy with progress tracking\n */\nfunction uploadViaApi(\n file: File,\n onProgress?: (progress: number) => void,\n): Promise<UploadResult> {\n return new Promise((resolve, reject) => {\n const formData = new FormData();\n formData.append('file', file);\n\n const tenantSlug = getStoredTenantSlug();\n\n const xhr = new XMLHttpRequest();\n\n xhr.upload.addEventListener('progress', (event) => {\n if (event.lengthComputable && onProgress) {\n const progress = Math.round((event.loaded / event.total) * 100);\n onProgress(progress);\n }\n });\n\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const data = JSON.parse(xhr.responseText);\n resolve({\n url: data.url,\n publicId: data.publicId,\n width: data.width,\n height: data.height,\n resourceType: data.resourceType,\n duration: data.duration,\n thumbnail: data.thumbnail,\n isCloudinary: true,\n });\n } catch {\n reject(new Error('Failed to parse upload response'));\n }\n } else {\n let message = `Upload failed: ${xhr.status}`;\n try {\n const err = JSON.parse(xhr.responseText);\n if (err?.message) message = err.message;\n } catch {\n // Keep the status-based message when the response is not JSON.\n }\n reject(new UploadHttpError(xhr.status, message));\n }\n });\n\n xhr.addEventListener('error', () => {\n reject(new UploadHttpError(0, 'Upload failed - network error'));\n });\n\n xhr.open('POST', '/api/proxy/media/upload');\n if (tenantSlug) {\n xhr.setRequestHeader('x-tenant-slug', tenantSlug);\n }\n xhr.send(formData);\n });\n}\n\n/**\n * Upload image with progress tracking\n */\nexport async function uploadImageWithProgress(\n file: File,\n onProgress?: (progress: number) => void,\n): Promise<UploadResult> {\n return uploadViaApi(file, onProgress);\n}\n\nexport class UploadHttpError extends Error {\n constructor(public readonly status: number, message: string) {\n super(message);\n this.name = 'UploadHttpError';\n }\n}\n\n/** Say what went wrong: only a dropped connection is the merchant's to fix. */\nexport function voiceUploadProblem(error: unknown): string {\n if (error instanceof UploadHttpError) {\n if (error.status === 0) return 'Check your connection and try again.';\n if (error.status === 413) return 'The recording is too long. Try a shorter one.';\n if (error.status === 401 || error.status === 403)\n return 'Your session ended. Sign in again and retry.';\n return `The upload was refused (${error.status}). Try again, or type your message instead.`;\n }\n return 'Check your connection and try again.';\n}\n\nexport async function uploadImageWithAutoCompress(\n file: File,\n onProgress?: (progress: number) => void,\n): Promise<UploadResult> {\n if (!file.type.startsWith('image/')) {\n return uploadViaApi(file, onProgress);\n }\n\n const steps: Array<[number, number]> = [\n [1600, 0.85],\n [1280, 0.78],\n [1024, 0.72],\n [800, 0.65],\n ];\n const skipFirstCompress = file.size <= 500_000;\n let lastError: unknown;\n\n for (let index = 0; index < steps.length; index += 1) {\n let candidate = file;\n if (!(skipFirstCompress && index === 0)) {\n try {\n const [maxDimension, quality] = steps[index];\n const dataUrl = await compressImage(\n file,\n maxDimension,\n maxDimension,\n quality,\n );\n const blob = await (await fetch(dataUrl)).blob();\n candidate = new File([blob], file.name, { type: 'image/jpeg' });\n } catch {\n candidate = file;\n }\n }\n\n try {\n return await uploadViaApi(candidate, onProgress);\n } catch (error) {\n lastError = error;\n if (error instanceof UploadHttpError && error.status === 413) continue;\n throw error;\n }\n }\n\n if (lastError instanceof UploadHttpError && lastError.status === 413) {\n throw new UploadHttpError(\n 413,\n 'Image is too large to upload, even after compressing. Try a smaller photo or one with lower resolution.',\n );\n }\n throw lastError ?? new Error('Upload failed');\n}\n\n/**\n * Send a recorded voice note to the same media endpoint images use.\n *\n * A Blob is not a File, and the proxy reads a filename off the multipart part\n * to infer an extension, so the container has to be named rather than left to\n * whatever `blob` defaults to. The mimetype is the recorder's own — it varies\n * by browser (webm/opus on Chrome, mp4 on Safari) and the API matches on the\n * base type with parameters stripped.\n */\nexport async function uploadAudio(\n blob: Blob,\n mimeType: string,\n): Promise<UploadResult> {\n const ext = mimeType.includes('mp4')\n ? 'm4a'\n : mimeType.includes('ogg')\n ? 'ogg'\n : 'webm';\n // Parameters (\"audio/webm;codecs=opus\") are the recorder's detail; servers\n // that allow-list by exact type reject them, so send the base type only.\n const baseType = mimeType.split(';')[0].trim() || 'audio/webm';\n const file = new File([blob], `voice-note.${ext}`, { type: baseType });\n return uploadViaApi(file);\n}\n\n/**\n * Open Cloudinary Upload Widget\n * Requires the Cloudinary widget script to be loaded\n */\nexport interface CloudinaryWidgetOptions {\n onSuccess: (result: UploadResult) => void;\n onError?: (error: Error) => void;\n maxFiles?: number;\n resourceType?: 'image' | 'video' | 'auto';\n cropping?: boolean;\n croppingAspectRatio?: number;\n showAdvancedOptions?: boolean;\n sources?: ('local' | 'url' | 'camera')[];\n}\n\nexport function openCloudinaryWidget(options: CloudinaryWidgetOptions): void {\n // Check if Cloudinary widget is available\n\n const cloudinary = (\n window as unknown as {\n cloudinary?: {\n createUploadWidget: (...args: any[]) => {\n open: () => void;\n close: () => void;\n };\n };\n }\n ).cloudinary;\n\n if (!cloudinary || !isCloudinaryEnabled) {\n options.onError?.(new Error('Cloudinary widget not available'));\n return;\n }\n\n const widget = cloudinary.createUploadWidget(\n {\n cloudName: CLOUDINARY_CONFIG.cloudName,\n uploadPreset: CLOUDINARY_CONFIG.uploadPreset,\n sources: options.sources || ['local', 'url', 'camera'],\n multiple: (options.maxFiles || 1) > 1,\n maxFiles: options.maxFiles || 1,\n resourceType: options.resourceType || 'image',\n cropping: options.cropping ?? true,\n croppingAspectRatio: options.croppingAspectRatio,\n showAdvancedOptions: options.showAdvancedOptions ?? false,\n styles: {\n palette: {\n window: '#FFFFFF',\n windowBorder: '#90A0B3',\n tabIcon: BRAND_PRIMARY,\n menuIcons: '#5A616A',\n textDark: '#000000',\n textLight: '#FFFFFF',\n link: BRAND_PRIMARY,\n action: BRAND_PRIMARY,\n inactiveTabIcon: '#0E2F5A',\n error: '#F44235',\n inProgress: BRAND_PRIMARY,\n complete: '#20B832',\n sourceBg: '#F4F5F5',\n },\n },\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (error: Error | null, result: any) => {\n if (error) {\n options.onError?.(error);\n return;\n }\n\n if (result.event === 'success') {\n options.onSuccess({\n url: result.info.secure_url,\n publicId: result.info.public_id,\n width: result.info.width,\n height: result.info.height,\n format: result.info.format,\n isCloudinary: true,\n });\n widget.close();\n }\n },\n );\n\n widget.open();\n}\n\n/**\n * Script tag for Cloudinary widget - add to page if using widget\n */\nexport const CLOUDINARY_WIDGET_SCRIPT =\n 'https://widget.cloudinary.com/v2.0/global/all.js';\n"],"mappings":"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","names":[]}
@@ -0,0 +1,51 @@
1
+ import type { ProductMedia } from './product-types';
2
+ export interface ProductGalleryItem extends ProductMedia {
3
+ id: string;
4
+ }
5
+ export declare const MAX_GALLERY_ITEMS = 20;
6
+ export declare function normalizeMediaItem(input: unknown): ProductMedia | null;
7
+ /**
8
+ * Strip a payload of keys the media DTO will refuse.
9
+ *
10
+ * Reported from staging: creating an event failed with
11
+ * `image.id: property id should not exist`. `ProductGalleryItem` extends
12
+ * `ProductMedia` with an `id` so a local list can key its rows, and that id
13
+ * rides along when the cover is sent as `image`. The same trap is set for
14
+ * `publicId` and `isCloudinary`, which the gallery field also carries.
15
+ *
16
+ * Fixed at the boundary rather than at each field, because the failure is not
17
+ * one field's bug — it is the shape of the whole class: anything that hands a
18
+ * client-side media object straight to the API is one extra property away from
19
+ * a rejected request, and the rejection names a key nobody deliberately sent.
20
+ *
21
+ * Only objects that look like media are touched — a string `url` is the tell —
22
+ * so content's own free-form fields keep any ids they legitimately carry.
23
+ */
24
+ export declare function stripNonMediaKeys<T>(value: T): T;
25
+ export declare function normalizeMediaList(input: unknown): ProductMedia[];
26
+ export declare function createGalleryItemId(url: string): string;
27
+ export declare function toGalleryItems(media: ProductMedia[]): ProductGalleryItem[];
28
+ export declare function stripGalleryItemIds(items: ProductGalleryItem[]): ProductMedia[];
29
+ /**
30
+ * ONE LIST OF MEDIA, WHOSE FIRST IMAGE IS THE COVER.
31
+ *
32
+ * `image` and `gallery` are stored as separate fields and were edited as two
33
+ * separate controls — a hero dropzone above a gallery strip — with a "Hero"
34
+ * button on each gallery tile that *copied* the tile into the hero rather than
35
+ * moving it. Upload a picture as the hero and again into the gallery and you
36
+ * had it twice, with nothing on screen saying they were the same field's two
37
+ * halves. The merchant's question is "which picture do people see first", and
38
+ * two controls cannot answer it.
39
+ *
40
+ * So the editor works one list, and the storage stays exactly as it was: these
41
+ * two functions are the seam. `mergeCover` is the read — cover first, then the
42
+ * rest, deduped by url because an older product may well have its hero sitting
43
+ * in the gallery too. `coverOf`/`galleryWithoutCover` are the write.
44
+ *
45
+ * The cover is the first *image*, not simply the first item: a video cannot be
46
+ * a cover (nothing renders a poster frame for it), and a list that opens with
47
+ * one must still have a cover rather than silently losing it.
48
+ */
49
+ export declare function mergeCover(cover: ProductMedia | null, gallery: ProductMedia[]): ProductMedia[];
50
+ export declare function coverOf(items: ProductMedia[]): ProductMedia | null;
51
+ export declare function galleryWithoutCover(items: ProductGalleryItem[]): ProductGalleryItem[];
@@ -0,0 +1,85 @@
1
+ const MAX_GALLERY_ITEMS = 20;
2
+ function normalizeMediaItem(input) {
3
+ if (!input) return null;
4
+ if (typeof input === "string") {
5
+ return { url: input, type: "image" };
6
+ }
7
+ if (typeof input !== "object") return null;
8
+ const item = input;
9
+ if (typeof item.url !== "string" || item.url.trim().length === 0) return null;
10
+ return {
11
+ url: item.url,
12
+ type: item.type === "video" ? "video" : "image",
13
+ alt: typeof item.alt === "string" ? item.alt : void 0,
14
+ width: typeof item.width === "number" ? item.width : void 0,
15
+ height: typeof item.height === "number" ? item.height : void 0,
16
+ thumbnail: typeof item.thumbnail === "string" ? item.thumbnail : void 0,
17
+ duration: typeof item.duration === "number" ? item.duration : void 0
18
+ };
19
+ }
20
+ const MEDIA_KEYS = [
21
+ "url",
22
+ "type",
23
+ "alt",
24
+ "width",
25
+ "height",
26
+ "thumbnail",
27
+ "duration"
28
+ ];
29
+ function stripNonMediaKeys(value) {
30
+ if (Array.isArray(value)) {
31
+ return value.map((v) => stripNonMediaKeys(v));
32
+ }
33
+ if (!value || typeof value !== "object") return value;
34
+ const record = value;
35
+ const isMedia = typeof record.url === "string";
36
+ const out = {};
37
+ for (const [key, v] of Object.entries(record)) {
38
+ if (isMedia && !MEDIA_KEYS.includes(key)) continue;
39
+ out[key] = stripNonMediaKeys(v);
40
+ }
41
+ return out;
42
+ }
43
+ function normalizeMediaList(input) {
44
+ if (!Array.isArray(input)) return [];
45
+ return input.map((item) => normalizeMediaItem(item)).filter((item) => item !== null);
46
+ }
47
+ function createGalleryItemId(url) {
48
+ return `${url}-${Math.random().toString(36).slice(2, 10)}`;
49
+ }
50
+ function toGalleryItems(media) {
51
+ return media.map((item) => ({
52
+ ...item,
53
+ id: createGalleryItemId(item.url)
54
+ }));
55
+ }
56
+ function stripGalleryItemIds(items) {
57
+ return items.map(({ id, ...rest }) => rest);
58
+ }
59
+ function mergeCover(cover, gallery) {
60
+ if (!cover) return gallery;
61
+ const rest = gallery.filter((item) => item.url !== cover.url);
62
+ return [cover, ...rest];
63
+ }
64
+ function coverOf(items) {
65
+ return items.find((item) => item.type !== "video") ?? null;
66
+ }
67
+ function galleryWithoutCover(items) {
68
+ const cover = coverOf(items);
69
+ if (!cover) return items;
70
+ const index = items.findIndex((item) => item.url === cover.url);
71
+ return index < 0 ? items : items.filter((_, i) => i !== index);
72
+ }
73
+ export {
74
+ MAX_GALLERY_ITEMS,
75
+ coverOf,
76
+ createGalleryItemId,
77
+ galleryWithoutCover,
78
+ mergeCover,
79
+ normalizeMediaItem,
80
+ normalizeMediaList,
81
+ stripGalleryItemIds,
82
+ stripNonMediaKeys,
83
+ toGalleryItems
84
+ };
85
+ //# sourceMappingURL=media-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/media-utils.ts"],"sourcesContent":["import type { ProductMedia } from './product-types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ProductGalleryItem extends ProductMedia {\n id: string;\n}\n\nexport const MAX_GALLERY_ITEMS = 20;\n\n// ============================================================================\n// NORMALIZATION\n// ============================================================================\n\nexport function normalizeMediaItem(input: unknown): ProductMedia | null {\n if (!input) return null;\n if (typeof input === 'string') {\n return { url: input, type: 'image' };\n }\n\n if (typeof input !== 'object') return null;\n const item = input as Record<string, unknown>;\n if (typeof item.url !== 'string' || item.url.trim().length === 0) return null;\n\n return {\n url: item.url,\n type: item.type === 'video' ? 'video' : 'image',\n alt: typeof item.alt === 'string' ? item.alt : undefined,\n width: typeof item.width === 'number' ? item.width : undefined,\n height: typeof item.height === 'number' ? item.height : undefined,\n thumbnail: typeof item.thumbnail === 'string' ? item.thumbnail : undefined,\n duration: typeof item.duration === 'number' ? item.duration : undefined,\n };\n}\n\n/**\n * The only keys the API's media DTO accepts.\n *\n * `ContentMediaDto` declares url, type, alt, width, height, thumbnail and\n * duration — and the API runs `forbidNonWhitelisted: true`, so ANY other key\n * rejects the whole request rather than being ignored.\n */\nconst MEDIA_KEYS = [\n 'url',\n 'type',\n 'alt',\n 'width',\n 'height',\n 'thumbnail',\n 'duration',\n] as const;\n\n/**\n * Strip a payload of keys the media DTO will refuse.\n *\n * Reported from staging: creating an event failed with\n * `image.id: property id should not exist`. `ProductGalleryItem` extends\n * `ProductMedia` with an `id` so a local list can key its rows, and that id\n * rides along when the cover is sent as `image`. The same trap is set for\n * `publicId` and `isCloudinary`, which the gallery field also carries.\n *\n * Fixed at the boundary rather than at each field, because the failure is not\n * one field's bug — it is the shape of the whole class: anything that hands a\n * client-side media object straight to the API is one extra property away from\n * a rejected request, and the rejection names a key nobody deliberately sent.\n *\n * Only objects that look like media are touched — a string `url` is the tell —\n * so content's own free-form fields keep any ids they legitimately carry.\n */\nexport function stripNonMediaKeys<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((v) => stripNonMediaKeys(v)) as unknown as T;\n }\n if (!value || typeof value !== 'object') return value;\n\n const record = value as Record<string, unknown>;\n const isMedia = typeof record.url === 'string';\n\n const out: Record<string, unknown> = {};\n for (const [key, v] of Object.entries(record)) {\n if (isMedia && !(MEDIA_KEYS as readonly string[]).includes(key)) continue;\n out[key] = stripNonMediaKeys(v);\n }\n return out as T;\n}\n\nexport function normalizeMediaList(input: unknown): ProductMedia[] {\n if (!Array.isArray(input)) return [];\n return input\n .map((item) => normalizeMediaItem(item))\n .filter((item): item is ProductMedia => item !== null);\n}\n\n// ============================================================================\n// GALLERY ITEM HELPERS\n// ============================================================================\n\nexport function createGalleryItemId(url: string): string {\n return `${url}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function toGalleryItems(media: ProductMedia[]): ProductGalleryItem[] {\n return media.map((item) => ({\n ...item,\n id: createGalleryItemId(item.url),\n }));\n}\n\nexport function stripGalleryItemIds(\n items: ProductGalleryItem[],\n): ProductMedia[] {\n return items.map(({ id, ...rest }) => rest);\n}\n\n// ============================================================================\n// COVER\n// ============================================================================\n\n/**\n * ONE LIST OF MEDIA, WHOSE FIRST IMAGE IS THE COVER.\n *\n * `image` and `gallery` are stored as separate fields and were edited as two\n * separate controls — a hero dropzone above a gallery strip — with a \"Hero\"\n * button on each gallery tile that *copied* the tile into the hero rather than\n * moving it. Upload a picture as the hero and again into the gallery and you\n * had it twice, with nothing on screen saying they were the same field's two\n * halves. The merchant's question is \"which picture do people see first\", and\n * two controls cannot answer it.\n *\n * So the editor works one list, and the storage stays exactly as it was: these\n * two functions are the seam. `mergeCover` is the read — cover first, then the\n * rest, deduped by url because an older product may well have its hero sitting\n * in the gallery too. `coverOf`/`galleryWithoutCover` are the write.\n *\n * The cover is the first *image*, not simply the first item: a video cannot be\n * a cover (nothing renders a poster frame for it), and a list that opens with\n * one must still have a cover rather than silently losing it.\n */\nexport function mergeCover(\n cover: ProductMedia | null,\n gallery: ProductMedia[],\n): ProductMedia[] {\n if (!cover) return gallery;\n const rest = gallery.filter((item) => item.url !== cover.url);\n return [cover, ...rest];\n}\n\nexport function coverOf(items: ProductMedia[]): ProductMedia | null {\n return items.find((item) => item.type !== 'video') ?? null;\n}\n\nexport function galleryWithoutCover(\n items: ProductGalleryItem[],\n): ProductGalleryItem[] {\n const cover = coverOf(items);\n if (!cover) return items;\n // By identity of url — the cover is one of these objects, not a copy.\n const index = items.findIndex((item) => item.url === cover.url);\n return index < 0 ? items : items.filter((_, i) => i !== index);\n}\n"],"mappings":"AAUO,MAAM,oBAAoB;AAM1B,SAAS,mBAAmB,OAAqC;AACtE,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,EAAE,KAAK,OAAO,MAAM,QAAQ;AAAA,EACrC;AAEA,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,OAAO;AACb,MAAI,OAAO,KAAK,QAAQ,YAAY,KAAK,IAAI,KAAK,EAAE,WAAW,EAAG,QAAO;AAEzE,SAAO;AAAA,IACL,KAAK,KAAK;AAAA,IACV,MAAM,KAAK,SAAS,UAAU,UAAU;AAAA,IACxC,KAAK,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM;AAAA,IAC/C,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,IACrD,QAAQ,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;AAAA,IACxD,WAAW,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AAAA,IACjE,UAAU,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW;AAAA,EAChE;AACF;AASA,MAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAmBO,SAAS,kBAAqB,OAAa;AAChD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,MAAM,kBAAkB,CAAC,CAAC;AAAA,EAC9C;AACA,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAEhD,QAAM,SAAS;AACf,QAAM,UAAU,OAAO,OAAO,QAAQ;AAEtC,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,KAAK,CAAC,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC7C,QAAI,WAAW,CAAE,WAAiC,SAAS,GAAG,EAAG;AACjE,QAAI,GAAG,IAAI,kBAAkB,CAAC;AAAA,EAChC;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,OAAgC;AACjE,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,SAAO,MACJ,IAAI,CAAC,SAAS,mBAAmB,IAAI,CAAC,EACtC,OAAO,CAAC,SAA+B,SAAS,IAAI;AACzD;AAMO,SAAS,oBAAoB,KAAqB;AACvD,SAAO,GAAG,GAAG,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAC1D;AAEO,SAAS,eAAe,OAA6C;AAC1E,SAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IAC1B,GAAG;AAAA,IACH,IAAI,oBAAoB,KAAK,GAAG;AAAA,EAClC,EAAE;AACJ;AAEO,SAAS,oBACd,OACgB;AAChB,SAAO,MAAM,IAAI,CAAC,EAAE,IAAI,GAAG,KAAK,MAAM,IAAI;AAC5C;AA0BO,SAAS,WACd,OACA,SACgB;AAChB,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAO,QAAQ,OAAO,CAAC,SAAS,KAAK,QAAQ,MAAM,GAAG;AAC5D,SAAO,CAAC,OAAO,GAAG,IAAI;AACxB;AAEO,SAAS,QAAQ,OAA4C;AAClE,SAAO,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,OAAO,KAAK;AACxD;AAEO,SAAS,oBACd,OACsB;AACtB,QAAM,QAAQ,QAAQ,KAAK;AAC3B,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAQ,MAAM,UAAU,CAAC,SAAS,KAAK,QAAQ,MAAM,GAAG;AAC9D,SAAO,QAAQ,IAAI,QAAQ,MAAM,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK;AAC/D;","names":[]}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * What state a person on the team is actually in.
3
+ *
4
+ * The team page listed members and their roles, which answers "who has keys"
5
+ * and not "who is here" — and those are different questions. The second is the
6
+ * one a manager asks continuously, and could otherwise only answer by texting
7
+ * somebody.
8
+ *
9
+ * The state that matters most is the one nothing surfaced at all: an invite
10
+ * sent on Monday that nobody opened is, on Friday, indistinguishable from one
11
+ * sent an hour ago. That is the failure most worth noticing, and an owner
12
+ * currently discovers it by asking the person they hired why they never
13
+ * started.
14
+ *
15
+ * Pure, so the thresholds can be tested rather than eyeballed against a
16
+ * clock — and so `people-card.tsx`, already over the 500-line house limit,
17
+ * does not grow a second job.
18
+ */
19
+ export type MemberPresence = 'unknown' | 'here' | 'today' | 'away' | 'never' | 'invited' | 'invite-expiring' | 'invite-expired' | 'removed';
20
+ export interface PresenceReading {
21
+ state: MemberPresence;
22
+ /** One short phrase for the row. Empty when there is nothing worth saying. */
23
+ label: string;
24
+ /** True when this row is asking the manager to do something. */
25
+ needsAttention: boolean;
26
+ }
27
+ /** Within this, someone counts as being at the counter right now. */
28
+ export declare const HERE_WINDOW_MS: number;
29
+ /** An invite this close to lapsing is worth flagging before it does. */
30
+ export declare const EXPIRING_WINDOW_MS: number;
31
+ interface MemberLike {
32
+ status?: string | null;
33
+ lastActiveAt?: string | null;
34
+ inviteExpiresAt?: string | null;
35
+ joinedAt?: string | null;
36
+ }
37
+ export declare function readPresence(member: MemberLike, now?: number): PresenceReading;
38
+ /** How many rows are asking for something, for the card's subtitle. */
39
+ export declare function countNeedingAttention(members: MemberLike[], now?: number): number;
40
+ export {};
@@ -0,0 +1,77 @@
1
+ const HERE_WINDOW_MS = 5 * 60 * 1e3;
2
+ const EXPIRING_WINDOW_MS = 48 * 60 * 60 * 1e3;
3
+ const parse = (value) => {
4
+ if (!value) return null;
5
+ const t = new Date(value).getTime();
6
+ return Number.isNaN(t) ? null : t;
7
+ };
8
+ function days(ms) {
9
+ return Math.floor(ms / (24 * 60 * 60 * 1e3));
10
+ }
11
+ function readPresence(member, now = Date.now()) {
12
+ if (member.status === "removed") {
13
+ return { state: "removed", label: "removed", needsAttention: false };
14
+ }
15
+ if (member.status === "invited") {
16
+ const expires = parse(member.inviteExpiresAt);
17
+ if (expires === null) {
18
+ return { state: "invited", label: "invite sent", needsAttention: false };
19
+ }
20
+ if (expires <= now) {
21
+ return {
22
+ state: "invite-expired",
23
+ label: "invite expired",
24
+ needsAttention: true
25
+ };
26
+ }
27
+ if (expires - now <= EXPIRING_WINDOW_MS) {
28
+ const hours = Math.max(1, Math.round((expires - now) / (60 * 60 * 1e3)));
29
+ return {
30
+ state: "invite-expiring",
31
+ label: `invite expires in ${hours}h`,
32
+ needsAttention: true
33
+ };
34
+ }
35
+ const left = days(expires - now);
36
+ return {
37
+ state: "invited",
38
+ label: left <= 1 ? "invite expires tomorrow" : `invite expires in ${left}d`,
39
+ needsAttention: false
40
+ };
41
+ }
42
+ if (member.lastActiveAt === void 0) {
43
+ return { state: "unknown", label: "", needsAttention: false };
44
+ }
45
+ const last = parse(member.lastActiveAt);
46
+ if (last === null) {
47
+ return {
48
+ state: "never",
49
+ label: "not signed in yet",
50
+ needsAttention: false
51
+ };
52
+ }
53
+ const ago = now - last;
54
+ if (ago <= HERE_WINDOW_MS) {
55
+ return { state: "here", label: "here now", needsAttention: false };
56
+ }
57
+ const d = days(ago);
58
+ if (d === 0) {
59
+ const hours = Math.max(1, Math.round(ago / (60 * 60 * 1e3)));
60
+ return { state: "today", label: `${hours}h ago`, needsAttention: false };
61
+ }
62
+ return {
63
+ state: "away",
64
+ label: d === 1 ? "yesterday" : `${d} days ago`,
65
+ needsAttention: false
66
+ };
67
+ }
68
+ function countNeedingAttention(members, now = Date.now()) {
69
+ return members.filter((m) => readPresence(m, now).needsAttention).length;
70
+ }
71
+ export {
72
+ EXPIRING_WINDOW_MS,
73
+ HERE_WINDOW_MS,
74
+ countNeedingAttention,
75
+ readPresence
76
+ };
77
+ //# sourceMappingURL=member-presence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/member-presence.ts"],"sourcesContent":["/**\n * What state a person on the team is actually in.\n *\n * The team page listed members and their roles, which answers \"who has keys\"\n * and not \"who is here\" — and those are different questions. The second is the\n * one a manager asks continuously, and could otherwise only answer by texting\n * somebody.\n *\n * The state that matters most is the one nothing surfaced at all: an invite\n * sent on Monday that nobody opened is, on Friday, indistinguishable from one\n * sent an hour ago. That is the failure most worth noticing, and an owner\n * currently discovers it by asking the person they hired why they never\n * started.\n *\n * Pure, so the thresholds can be tested rather than eyeballed against a\n * clock — and so `people-card.tsx`, already over the 500-line house limit,\n * does not grow a second job.\n */\n\nexport type MemberPresence =\n | 'unknown' // the api did not say — not the same as \"never\"\n | 'here' // active within the last few minutes\n | 'today' // active earlier today\n | 'away' // active, but not recently\n | 'never' // accepted and never came back\n | 'invited' // waiting, with time left\n | 'invite-expiring' // waiting, about to lapse\n | 'invite-expired' // lapsed unused — the silent failure\n | 'removed';\n\nexport interface PresenceReading {\n state: MemberPresence;\n /** One short phrase for the row. Empty when there is nothing worth saying. */\n label: string;\n /** True when this row is asking the manager to do something. */\n needsAttention: boolean;\n}\n\n/** Within this, someone counts as being at the counter right now. */\nexport const HERE_WINDOW_MS = 5 * 60 * 1000;\n/** An invite this close to lapsing is worth flagging before it does. */\nexport const EXPIRING_WINDOW_MS = 48 * 60 * 60 * 1000;\n\ninterface MemberLike {\n status?: string | null;\n lastActiveAt?: string | null;\n inviteExpiresAt?: string | null;\n joinedAt?: string | null;\n}\n\nconst parse = (value: string | null | undefined): number | null => {\n if (!value) return null;\n const t = new Date(value).getTime();\n return Number.isNaN(t) ? null : t;\n};\n\nfunction days(ms: number): number {\n return Math.floor(ms / (24 * 60 * 60 * 1000));\n}\n\nexport function readPresence(\n member: MemberLike,\n now: number = Date.now(),\n): PresenceReading {\n if (member.status === 'removed') {\n return { state: 'removed', label: 'removed', needsAttention: false };\n }\n\n if (member.status === 'invited') {\n const expires = parse(member.inviteExpiresAt);\n // An invite with no recorded expiry is treated as simply waiting rather\n // than as expired. Guessing \"expired\" would tell a manager to chase\n // something that may be perfectly fine.\n if (expires === null) {\n return { state: 'invited', label: 'invite sent', needsAttention: false };\n }\n if (expires <= now) {\n return {\n state: 'invite-expired',\n label: 'invite expired',\n needsAttention: true,\n };\n }\n if (expires - now <= EXPIRING_WINDOW_MS) {\n const hours = Math.max(1, Math.round((expires - now) / (60 * 60 * 1000)));\n return {\n state: 'invite-expiring',\n label: `invite expires in ${hours}h`,\n needsAttention: true,\n };\n }\n const left = days(expires - now);\n return {\n state: 'invited',\n label:\n left <= 1 ? 'invite expires tomorrow' : `invite expires in ${left}d`,\n needsAttention: false,\n };\n }\n\n // ABSENT is not the same as NULL, and conflating them shipped a lie.\n //\n // `lastActiveAt` was added to the api response in api#414, which has not\n // deployed. Until it does the field is simply missing — and treating missing\n // as \"never active\" put \"not signed in yet\" beside the owner's name while\n // they were signed in, reading the page. A roster that is confidently wrong\n // about the person reading it is worse than one that says nothing.\n //\n // undefined the api did not tell us -> say nothing\n // null the api says: never active -> \"not signed in yet\"\n if (member.lastActiveAt === undefined) {\n return { state: 'unknown', label: '', needsAttention: false };\n }\n\n const last = parse(member.lastActiveAt);\n if (last === null) {\n // Accepted, then never opened it again. Worth seeing, not worth alarming\n // about — plenty of people are invited and simply have not started.\n return {\n state: 'never',\n label: 'not signed in yet',\n needsAttention: false,\n };\n }\n\n const ago = now - last;\n // A clock that has gone backwards must not read as \"active in the future\".\n if (ago <= HERE_WINDOW_MS) {\n return { state: 'here', label: 'here now', needsAttention: false };\n }\n\n const d = days(ago);\n if (d === 0) {\n const hours = Math.max(1, Math.round(ago / (60 * 60 * 1000)));\n return { state: 'today', label: `${hours}h ago`, needsAttention: false };\n }\n return {\n state: 'away',\n label: d === 1 ? 'yesterday' : `${d} days ago`,\n needsAttention: false,\n };\n}\n\n/** How many rows are asking for something, for the card's subtitle. */\nexport function countNeedingAttention(\n members: MemberLike[],\n now: number = Date.now(),\n): number {\n return members.filter((m) => readPresence(m, now).needsAttention).length;\n}\n"],"mappings":"AAuCO,MAAM,iBAAiB,IAAI,KAAK;AAEhC,MAAM,qBAAqB,KAAK,KAAK,KAAK;AASjD,MAAM,QAAQ,CAAC,UAAoD;AACjE,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,IAAI,IAAI,KAAK,KAAK,EAAE,QAAQ;AAClC,SAAO,OAAO,MAAM,CAAC,IAAI,OAAO;AAClC;AAEA,SAAS,KAAK,IAAoB;AAChC,SAAO,KAAK,MAAM,MAAM,KAAK,KAAK,KAAK,IAAK;AAC9C;AAEO,SAAS,aACd,QACA,MAAc,KAAK,IAAI,GACN;AACjB,MAAI,OAAO,WAAW,WAAW;AAC/B,WAAO,EAAE,OAAO,WAAW,OAAO,WAAW,gBAAgB,MAAM;AAAA,EACrE;AAEA,MAAI,OAAO,WAAW,WAAW;AAC/B,UAAM,UAAU,MAAM,OAAO,eAAe;AAI5C,QAAI,YAAY,MAAM;AACpB,aAAO,EAAE,OAAO,WAAW,OAAO,eAAe,gBAAgB,MAAM;AAAA,IACzE;AACA,QAAI,WAAW,KAAK;AAClB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,IACF;AACA,QAAI,UAAU,OAAO,oBAAoB;AACvC,YAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,OAAO,UAAU,QAAQ,KAAK,KAAK,IAAK,CAAC;AACxE,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO,qBAAqB,KAAK;AAAA,QACjC,gBAAgB;AAAA,MAClB;AAAA,IACF;AACA,UAAM,OAAO,KAAK,UAAU,GAAG;AAC/B,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OACE,QAAQ,IAAI,4BAA4B,qBAAqB,IAAI;AAAA,MACnE,gBAAgB;AAAA,IAClB;AAAA,EACF;AAYA,MAAI,OAAO,iBAAiB,QAAW;AACrC,WAAO,EAAE,OAAO,WAAW,OAAO,IAAI,gBAAgB,MAAM;AAAA,EAC9D;AAEA,QAAM,OAAO,MAAM,OAAO,YAAY;AACtC,MAAI,SAAS,MAAM;AAGjB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,MACP,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,MAAM,MAAM;AAElB,MAAI,OAAO,gBAAgB;AACzB,WAAO,EAAE,OAAO,QAAQ,OAAO,YAAY,gBAAgB,MAAM;AAAA,EACnE;AAEA,QAAM,IAAI,KAAK,GAAG;AAClB,MAAI,MAAM,GAAG;AACX,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,KAAK,KAAK,IAAK,CAAC;AAC5D,WAAO,EAAE,OAAO,SAAS,OAAO,GAAG,KAAK,SAAS,gBAAgB,MAAM;AAAA,EACzE;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,OAAO,MAAM,IAAI,cAAc,GAAG,CAAC;AAAA,IACnC,gBAAgB;AAAA,EAClB;AACF;AAGO,SAAS,sBACd,SACA,MAAc,KAAK,IAAI,GACf;AACR,SAAO,QAAQ,OAAO,CAAC,MAAM,aAAa,GAAG,GAAG,EAAE,cAAc,EAAE;AACpE;","names":[]}
@@ -0,0 +1,16 @@
1
+ interface EnrollMemberInPlanInput {
2
+ tenantSlug: string;
3
+ planId: string;
4
+ memberId: string;
5
+ memberEmail: string;
6
+ origin: string;
7
+ }
8
+ export declare function getMemberDetailPath(memberId: string, tab?: 'subscriptions'): string;
9
+ export declare function getMemberSubscriptionCallbackUrl(origin: string, memberId: string): string;
10
+ export declare function enrollMemberInPlan({ tenantSlug, planId, memberId, memberEmail, origin, }: EnrollMemberInPlanInput): Promise<{
11
+ subscription: import("@withpotter/lib/api").CustomerSubscription;
12
+ paymentRequired: boolean;
13
+ authorizationUrl?: string;
14
+ reference?: string;
15
+ }>;
16
+ export {};
@@ -0,0 +1,32 @@
1
+ import { merchantSubscriptionsApi } from "@withpotter/lib/api";
2
+ function getMemberDetailPath(memberId, tab) {
3
+ const path = `/dashboard/customers/${encodeURIComponent(memberId)}`;
4
+ return tab ? `${path}?tab=${tab}` : path;
5
+ }
6
+ function getMemberSubscriptionCallbackUrl(origin, memberId) {
7
+ return new URL(
8
+ getMemberDetailPath(memberId, "subscriptions"),
9
+ origin
10
+ ).toString();
11
+ }
12
+ function enrollMemberInPlan({
13
+ tenantSlug,
14
+ planId,
15
+ memberId,
16
+ memberEmail,
17
+ origin
18
+ }) {
19
+ const request = {
20
+ planId,
21
+ customerId: memberId,
22
+ customerEmail: memberEmail,
23
+ callbackUrl: getMemberSubscriptionCallbackUrl(origin, memberId)
24
+ };
25
+ return merchantSubscriptionsApi.createSubscription(tenantSlug, request);
26
+ }
27
+ export {
28
+ enrollMemberInPlan,
29
+ getMemberDetailPath,
30
+ getMemberSubscriptionCallbackUrl
31
+ };
32
+ //# sourceMappingURL=member-subscription-enrollment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/member-subscription-enrollment.ts"],"sourcesContent":["import { merchantSubscriptionsApi } from '@withpotter/lib/api';\n\ninterface EnrollMemberInPlanInput {\n tenantSlug: string;\n planId: string;\n memberId: string;\n memberEmail: string;\n origin: string;\n}\n\nexport function getMemberDetailPath(memberId: string, tab?: 'subscriptions') {\n const path = `/dashboard/customers/${encodeURIComponent(memberId)}`;\n return tab ? `${path}?tab=${tab}` : path;\n}\n\nexport function getMemberSubscriptionCallbackUrl(\n origin: string,\n memberId: string,\n) {\n return new URL(\n getMemberDetailPath(memberId, 'subscriptions'),\n origin,\n ).toString();\n}\n\nexport function enrollMemberInPlan({\n tenantSlug,\n planId,\n memberId,\n memberEmail,\n origin,\n}: EnrollMemberInPlanInput) {\n const request = {\n planId,\n customerId: memberId,\n customerEmail: memberEmail,\n callbackUrl: getMemberSubscriptionCallbackUrl(origin, memberId),\n };\n\n return merchantSubscriptionsApi.createSubscription(tenantSlug, request);\n}\n"],"mappings":"AAAA,SAAS,gCAAgC;AAUlC,SAAS,oBAAoB,UAAkB,KAAuB;AAC3E,QAAM,OAAO,wBAAwB,mBAAmB,QAAQ,CAAC;AACjE,SAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK;AACtC;AAEO,SAAS,iCACd,QACA,UACA;AACA,SAAO,IAAI;AAAA,IACT,oBAAoB,UAAU,eAAe;AAAA,IAC7C;AAAA,EACF,EAAE,SAAS;AACb;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,UAAU;AAAA,IACd;AAAA,IACA,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa,iCAAiC,QAAQ,QAAQ;AAAA,EAChE;AAEA,SAAO,yBAAyB,mBAAmB,YAAY,OAAO;AACxE;","names":[]}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * When a cached membership is stale enough to be worth re-asking for, and what
3
+ * a failed re-ask means.
4
+ *
5
+ * `usePermissions` fetched once per tenant change and then never again. A
6
+ * merchant who demoted someone, or removed them outright, had no effect on that
7
+ * person's open tab until they happened to reload: the nav still offered rows
8
+ * the api had already started refusing, and the removed member kept a working
9
+ * dashboard for a business they were no longer in.
10
+ *
11
+ * Pure so it can be tested without a renderer.
12
+ */
13
+ /** Below this, a refocus is someone alt-tabbing, not a session worth re-checking. */
14
+ export declare const MEMBERSHIP_STALE_AFTER_MS = 30000;
15
+ export declare function isMembershipStale(lastFetchedAt: number | null, now: number, staleAfterMs?: number): boolean;
16
+ export type MembershipOutcome = 'active' | 'removed' | 'unknown';
17
+ /**
18
+ * What a failed `/team/me` means.
19
+ *
20
+ * 403 and 404 are the api saying this account is not a member of this tenant,
21
+ * which is a real answer and should lock the session down. Anything else — a
22
+ * timeout, a 500, an offline tab — is not an answer, and must NOT be treated as
23
+ * removal, or a flaky connection would eject people from their own workspace.
24
+ */
25
+ export declare function classifyMembershipError(error: unknown): MembershipOutcome;
26
+ /**
27
+ * A `null` body from `/team/me` is the other way the api says "not a member" —
28
+ * it answers 200 with no membership. Distinguished from an error because it is
29
+ * a successful response, but it means the same thing.
30
+ */
31
+ export declare function outcomeForMember(member: unknown): MembershipOutcome;
@@ -0,0 +1,21 @@
1
+ const MEMBERSHIP_STALE_AFTER_MS = 3e4;
2
+ function isMembershipStale(lastFetchedAt, now, staleAfterMs = MEMBERSHIP_STALE_AFTER_MS) {
3
+ if (lastFetchedAt === null) return true;
4
+ if (now < lastFetchedAt) return true;
5
+ return now - lastFetchedAt >= staleAfterMs;
6
+ }
7
+ function classifyMembershipError(error) {
8
+ const status = typeof error === "object" && error !== null && "status" in error ? error.status : void 0;
9
+ if (status === 403 || status === 404) return "removed";
10
+ return "unknown";
11
+ }
12
+ function outcomeForMember(member) {
13
+ return member ? "active" : "removed";
14
+ }
15
+ export {
16
+ MEMBERSHIP_STALE_AFTER_MS,
17
+ classifyMembershipError,
18
+ isMembershipStale,
19
+ outcomeForMember
20
+ };
21
+ //# sourceMappingURL=membership-freshness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/membership-freshness.ts"],"sourcesContent":["/**\n * When a cached membership is stale enough to be worth re-asking for, and what\n * a failed re-ask means.\n *\n * `usePermissions` fetched once per tenant change and then never again. A\n * merchant who demoted someone, or removed them outright, had no effect on that\n * person's open tab until they happened to reload: the nav still offered rows\n * the api had already started refusing, and the removed member kept a working\n * dashboard for a business they were no longer in.\n *\n * Pure so it can be tested without a renderer.\n */\n\n/** Below this, a refocus is someone alt-tabbing, not a session worth re-checking. */\nexport const MEMBERSHIP_STALE_AFTER_MS = 30_000;\n\nexport function isMembershipStale(\n lastFetchedAt: number | null,\n now: number,\n staleAfterMs: number = MEMBERSHIP_STALE_AFTER_MS,\n): boolean {\n if (lastFetchedAt === null) return true;\n // A clock that has gone backwards (system time change, a paused laptop\n // resuming) must not read as \"fetched in the future\" and pin the membership\n // as fresh forever.\n if (now < lastFetchedAt) return true;\n return now - lastFetchedAt >= staleAfterMs;\n}\n\nexport type MembershipOutcome = 'active' | 'removed' | 'unknown';\n\n/**\n * What a failed `/team/me` means.\n *\n * 403 and 404 are the api saying this account is not a member of this tenant,\n * which is a real answer and should lock the session down. Anything else — a\n * timeout, a 500, an offline tab — is not an answer, and must NOT be treated as\n * removal, or a flaky connection would eject people from their own workspace.\n */\nexport function classifyMembershipError(error: unknown): MembershipOutcome {\n const status =\n typeof error === 'object' && error !== null && 'status' in error\n ? (error as { status?: unknown }).status\n : undefined;\n\n if (status === 403 || status === 404) return 'removed';\n return 'unknown';\n}\n\n/**\n * A `null` body from `/team/me` is the other way the api says \"not a member\" —\n * it answers 200 with no membership. Distinguished from an error because it is\n * a successful response, but it means the same thing.\n */\nexport function outcomeForMember(member: unknown): MembershipOutcome {\n return member ? 'active' : 'removed';\n}\n"],"mappings":"AAcO,MAAM,4BAA4B;AAElC,SAAS,kBACd,eACA,KACA,eAAuB,2BACd;AACT,MAAI,kBAAkB,KAAM,QAAO;AAInC,MAAI,MAAM,cAAe,QAAO;AAChC,SAAO,MAAM,iBAAiB;AAChC;AAYO,SAAS,wBAAwB,OAAmC;AACzE,QAAM,SACJ,OAAO,UAAU,YAAY,UAAU,QAAQ,YAAY,QACtD,MAA+B,SAChC;AAEN,MAAI,WAAW,OAAO,WAAW,IAAK,QAAO;AAC7C,SAAO;AACT;AAOO,SAAS,iBAAiB,QAAoC;AACnE,SAAO,SAAS,WAAW;AAC7B;","names":[]}
@@ -0,0 +1,32 @@
1
+ import type { LucideIcon } from 'lucide-react';
2
+ interface DetailHeaderConfig {
3
+ title: string;
4
+ onBack?: () => void;
5
+ action?: {
6
+ label: string;
7
+ icon?: LucideIcon;
8
+ onClick: () => void;
9
+ };
10
+ }
11
+ interface ScreenHeaderConfig {
12
+ title?: string;
13
+ subtitle?: string;
14
+ action?: {
15
+ label: string;
16
+ icon?: LucideIcon;
17
+ onClick: () => void;
18
+ };
19
+ }
20
+ interface MobileHeaderContextValue {
21
+ detailConfig: DetailHeaderConfig | null;
22
+ setDetailHeader: (config: DetailHeaderConfig) => void;
23
+ clearDetailHeader: () => void;
24
+ screenConfig: ScreenHeaderConfig | null;
25
+ setScreenHeader: (config: ScreenHeaderConfig) => void;
26
+ clearScreenHeader: () => void;
27
+ }
28
+ export declare function MobileHeaderProvider({ children, }: {
29
+ children: React.ReactNode;
30
+ }): import("react").JSX.Element;
31
+ export declare function useMobileHeaderContext(): MobileHeaderContextValue;
32
+ export {};
@@ -0,0 +1,59 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { createContext, useContext, useState, useCallback } from "react";
4
+ const MobileHeaderContext = createContext({
5
+ detailConfig: null,
6
+ setDetailHeader: () => {
7
+ },
8
+ clearDetailHeader: () => {
9
+ },
10
+ screenConfig: null,
11
+ setScreenHeader: () => {
12
+ },
13
+ clearScreenHeader: () => {
14
+ }
15
+ });
16
+ function MobileHeaderProvider({
17
+ children
18
+ }) {
19
+ const [detailConfig, setDetailConfig] = useState(
20
+ null
21
+ );
22
+ const [screenConfig, setScreenConfig] = useState(
23
+ null
24
+ );
25
+ const setDetailHeader = useCallback((config) => {
26
+ setDetailConfig(config);
27
+ }, []);
28
+ const clearDetailHeader = useCallback(() => {
29
+ setDetailConfig(null);
30
+ }, []);
31
+ const setScreenHeader = useCallback((config) => {
32
+ setScreenConfig(config);
33
+ }, []);
34
+ const clearScreenHeader = useCallback(() => {
35
+ setScreenConfig(null);
36
+ }, []);
37
+ return /* @__PURE__ */ jsx(
38
+ MobileHeaderContext.Provider,
39
+ {
40
+ value: {
41
+ detailConfig,
42
+ setDetailHeader,
43
+ clearDetailHeader,
44
+ screenConfig,
45
+ setScreenHeader,
46
+ clearScreenHeader
47
+ },
48
+ children
49
+ }
50
+ );
51
+ }
52
+ function useMobileHeaderContext() {
53
+ return useContext(MobileHeaderContext);
54
+ }
55
+ export {
56
+ MobileHeaderProvider,
57
+ useMobileHeaderContext
58
+ };
59
+ //# sourceMappingURL=mobile-header-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mobile-header-context.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, useContext, useState, useCallback } from 'react';\nimport type { LucideIcon } from 'lucide-react';\n\ninterface DetailHeaderConfig {\n title: string;\n onBack?: () => void;\n action?: { label: string; icon?: LucideIcon; onClick: () => void };\n}\n\ninterface ScreenHeaderConfig {\n title?: string;\n subtitle?: string;\n action?: { label: string; icon?: LucideIcon; onClick: () => void };\n}\n\ninterface MobileHeaderContextValue {\n detailConfig: DetailHeaderConfig | null;\n setDetailHeader: (config: DetailHeaderConfig) => void;\n clearDetailHeader: () => void;\n screenConfig: ScreenHeaderConfig | null;\n setScreenHeader: (config: ScreenHeaderConfig) => void;\n clearScreenHeader: () => void;\n}\n\nconst MobileHeaderContext = createContext<MobileHeaderContextValue>({\n detailConfig: null,\n setDetailHeader: () => {},\n clearDetailHeader: () => {},\n screenConfig: null,\n setScreenHeader: () => {},\n clearScreenHeader: () => {},\n});\n\nexport function MobileHeaderProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const [detailConfig, setDetailConfig] = useState<DetailHeaderConfig | null>(\n null,\n );\n const [screenConfig, setScreenConfig] = useState<ScreenHeaderConfig | null>(\n null,\n );\n\n const setDetailHeader = useCallback((config: DetailHeaderConfig) => {\n setDetailConfig(config);\n }, []);\n\n const clearDetailHeader = useCallback(() => {\n setDetailConfig(null);\n }, []);\n\n const setScreenHeader = useCallback((config: ScreenHeaderConfig) => {\n setScreenConfig(config);\n }, []);\n\n const clearScreenHeader = useCallback(() => {\n setScreenConfig(null);\n }, []);\n\n return (\n <MobileHeaderContext.Provider\n value={{\n detailConfig,\n setDetailHeader,\n clearDetailHeader,\n screenConfig,\n setScreenHeader,\n clearScreenHeader,\n }}\n >\n {children}\n </MobileHeaderContext.Provider>\n );\n}\n\nexport function useMobileHeaderContext() {\n return useContext(MobileHeaderContext);\n}\n"],"mappings":";AAgEI;AA9DJ,SAAS,eAAe,YAAY,UAAU,mBAAmB;AAwBjE,MAAM,sBAAsB,cAAwC;AAAA,EAClE,cAAc;AAAA,EACd,iBAAiB,MAAM;AAAA,EAAC;AAAA,EACxB,mBAAmB,MAAM;AAAA,EAAC;AAAA,EAC1B,cAAc;AAAA,EACd,iBAAiB,MAAM;AAAA,EAAC;AAAA,EACxB,mBAAmB,MAAM;AAAA,EAAC;AAC5B,CAAC;AAEM,SAAS,qBAAqB;AAAA,EACnC;AACF,GAEG;AACD,QAAM,CAAC,cAAc,eAAe,IAAI;AAAA,IACtC;AAAA,EACF;AACA,QAAM,CAAC,cAAc,eAAe,IAAI;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,kBAAkB,YAAY,CAAC,WAA+B;AAClE,oBAAgB,MAAM;AAAA,EACxB,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoB,YAAY,MAAM;AAC1C,oBAAgB,IAAI;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkB,YAAY,CAAC,WAA+B;AAClE,oBAAgB,MAAM;AAAA,EACxB,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoB,YAAY,MAAM;AAC1C,oBAAgB,IAAI;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,SACE;AAAA,IAAC,oBAAoB;AAAA,IAApB;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEO,SAAS,yBAAyB;AACvC,SAAO,WAAW,mBAAmB;AACvC;","names":[]}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * The mobile route contract.
3
+ *
4
+ * Every route under `/dashboard` declares how it behaves on a phone. There are
5
+ * only four answers, and "we haven't decided" is not one of them — that is the
6
+ * whole point of this file. `scripts/check-mobile-routes.mjs` fails CI when a
7
+ * route exists without an entry here, or an entry here points at a route that
8
+ * no longer exists.
9
+ *
10
+ * Why this exists: mobile had grown into a second app — 59 hand-built screens
11
+ * covering 43% of the dashboard — and nothing broke when a route shipped
12
+ * without a mobile twin. A fork with no failure mode loses ground every week.
13
+ * This is the failure mode.
14
+ *
15
+ * ## The tiers
16
+ *
17
+ * `native` — a hand-built mobile screen under `components/mobile/screens/`,
18
+ * drawing its own chrome from `components/mobile/primitives/chrome.tsx`
19
+ * (`BackBar`, `BottomTabBar`). Reserved for jobs a merchant does **standing
20
+ * up, one hand, under a minute**. That is the entire test. It is a closed
21
+ * list; adding to it is a product decision, not a refactor. The five tab
22
+ * roots are always native, because landing a tab press in a fallback layout
23
+ * reads as a bug.
24
+ *
25
+ * `shell` — the desktop body, on a phone, with mobile chrome around it. The
26
+ * correct answer for anything configured sitting down.
27
+ *
28
+ * `MobileShellChrome`, mounted in `app/dashboard/layout.tsx`, draws that
29
+ * chrome from the live primitives. It reads `mobile-header-context`, so a
30
+ * route names itself by publishing a title — `useScreenHeader`,
31
+ * `useDetailHeader` or `<MobilePageHeader>`, and both page frames do it for
32
+ * you. Publish nothing and you get a tab bar with no name on it.
33
+ * `desktop-only` — genuinely cannot be a phone surface. Every entry carries a
34
+ * reason so the call does not get re-litigated every six months.
35
+ *
36
+ * `redirect` — a stub that never renders its own UI, so it has no mobile
37
+ * behaviour to declare. Two spellings: a server `redirect()`, or a client
38
+ * `router.replace()` in an effect for routes that must wait on the tenant
39
+ * before they know where to go. Tracked so the gate can tell a real gap from
40
+ * a route that was always a signpost.
41
+ */
42
+ export type MobileTier = 'native' | 'shell' | 'desktop-only' | 'redirect';
43
+ export declare const DESKTOP_ONLY_REASONS: Record<string, string>;
44
+ export declare const MOBILE_ROUTES: Record<string, MobileTier>;
45
+ /**
46
+ * Shell-tier routes that STILL render a hand-built mobile screen.
47
+ *
48
+ * These are the Phase 2 deletion backlog: they failed the standing-up test, so
49
+ * the tier says `shell`, but the screen has not been removed yet and the route
50
+ * still branches on `useIsMobile`. Until it does, the frame must not add
51
+ * fallback chrome on top — that is how a screen ends up with two headers.
52
+ *
53
+ * The list is transient and should shrink to nothing. The gate verifies it:
54
+ * every entry must actually still branch, and no shell route may branch without
55
+ * being listed here. Delete a mobile screen, drop its line, and the route picks
56
+ * up the fallback automatically.
57
+ */
58
+ /**
59
+ * Shell routes that deliberately draw no chrome.
60
+ *
61
+ * Not a gap and not a backlog: a surface whose whole job is to *be* the
62
+ * customer's view of the site cannot have the app's furniture sitting on top of
63
+ * it. The template preview has its own toolbar naming the template and its own
64
+ * fullscreen mode, so it names itself and offers its own way out.
65
+ */
66
+ export declare const CHROMELESS_BY_DESIGN: ReadonlySet<string>;
67
+ export declare const LEGACY_MOBILE_SCREENS: ReadonlySet<string>;
68
+ /**
69
+ * Whether the shared page frames should draw mobile chrome for this pathname.
70
+ *
71
+ * True only for a shell route that draws none of its own. A native screen
72
+ * brings its own BackBar/BottomTabBar, and a legacy screen still does too.
73
+ */
74
+ export declare function shouldRenderFallbackChrome(pathname: string): boolean;
75
+ /**
76
+ * Resolve a live pathname to its tier, matching dynamic segments.
77
+ *
78
+ * Static keys win over dynamic ones, so `/dashboard/catalog/new` resolves to
79
+ * its own entry rather than to `/dashboard/catalog/[productId]`.
80
+ */
81
+ export declare function mobileTierFor(pathname: string): MobileTier | undefined;