@mohasinac/appkit 4.52.4 → 4.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (633) hide show
  1. package/dist/.build-stamp.json +4 -4
  2. package/dist/_internal/client/features/sticker-trace/canvas-codec.d.ts +2 -0
  3. package/dist/_internal/client/features/sticker-trace/canvas-codec.js +148 -0
  4. package/dist/_internal/server/features/auctions/actions.js +1 -1
  5. package/dist/_internal/server/features/categories/data.js +23 -7
  6. package/dist/_internal/server/features/checkout/actions.js +10 -3
  7. package/dist/_internal/server/features/checkout/data.d.ts +15 -0
  8. package/dist/_internal/server/features/checkout/data.js +20 -3
  9. package/dist/_internal/server/features/lottery/actions.js +9 -1
  10. package/dist/_internal/server/features/lottery/og.d.ts +40 -0
  11. package/dist/_internal/server/features/lottery/og.js +79 -0
  12. package/dist/_internal/server/features/messages/actions.js +4 -0
  13. package/dist/_internal/server/features/offers/adapters.js +17 -3
  14. package/dist/_internal/server/features/orders/actions.js +7 -2
  15. package/dist/_internal/server/features/raffle/actions.d.ts +19 -0
  16. package/dist/_internal/server/features/raffle/actions.js +25 -0
  17. package/dist/_internal/server/features/reviews/actions.js +1 -1
  18. package/dist/_internal/server/features/reviews/data.d.ts +1 -1
  19. package/dist/_internal/server/features/search/index-build/artifact-store.d.ts +89 -0
  20. package/dist/_internal/server/features/search/index-build/artifact-store.js +208 -0
  21. package/dist/_internal/server/features/search/index-build/build.d.ts +57 -0
  22. package/dist/_internal/server/features/search/index-build/build.js +285 -0
  23. package/dist/_internal/server/features/search/index-build/sources.d.ts +53 -0
  24. package/dist/_internal/server/features/search/index-build/sources.js +385 -0
  25. package/dist/_internal/server/features/search/search-sources.d.ts +0 -15
  26. package/dist/_internal/server/features/search/search-sources.js +142 -7
  27. package/dist/_internal/server/features/seo/robots.js +21 -1
  28. package/dist/_internal/server/features/seo/sitemap.js +1 -1
  29. package/dist/_internal/server/features/shared/listing-data-factory.js +16 -4
  30. package/dist/_internal/server/features/site-settings/adapters.d.ts +1 -1
  31. package/dist/_internal/server/features/site-settings/adapters.js +26 -0
  32. package/dist/_internal/server/features/sticker-trace/actions.d.ts +109 -0
  33. package/dist/_internal/server/features/sticker-trace/actions.js +172 -0
  34. package/dist/_internal/server/features/sticker-trace/adapters.d.ts +80 -0
  35. package/dist/_internal/server/features/sticker-trace/adapters.js +174 -0
  36. package/dist/_internal/server/features/sticker-trace/build-cut-file.d.ts +26 -0
  37. package/dist/_internal/server/features/sticker-trace/build-cut-file.js +127 -0
  38. package/dist/_internal/server/features/sticker-trace/coordinator.d.ts +27 -0
  39. package/dist/_internal/server/features/sticker-trace/coordinator.js +169 -0
  40. package/dist/_internal/server/features/sticker-trace/fanout.d.ts +43 -0
  41. package/dist/_internal/server/features/sticker-trace/fanout.js +180 -0
  42. package/dist/_internal/server/features/sticker-trace/finalizer.d.ts +25 -0
  43. package/dist/_internal/server/features/sticker-trace/finalizer.js +123 -0
  44. package/dist/_internal/server/features/sticker-trace/mosaic-inputs.d.ts +30 -0
  45. package/dist/_internal/server/features/sticker-trace/mosaic-inputs.js +112 -0
  46. package/dist/_internal/server/features/sticker-trace/progress.d.ts +81 -0
  47. package/dist/_internal/server/features/sticker-trace/progress.js +198 -0
  48. package/dist/_internal/server/features/sticker-trace/promote.d.ts +23 -0
  49. package/dist/_internal/server/features/sticker-trace/promote.js +193 -0
  50. package/dist/_internal/server/features/sticker-trace/shard.d.ts +50 -0
  51. package/dist/_internal/server/features/sticker-trace/shard.js +174 -0
  52. package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +141 -0
  53. package/dist/_internal/server/features/sticker-trace/sheet-actions.js +279 -0
  54. package/dist/_internal/server/features/sticker-trace/storage.d.ts +135 -0
  55. package/dist/_internal/server/features/sticker-trace/storage.js +282 -0
  56. package/dist/_internal/server/functions/scheduled.d.ts +2 -1
  57. package/dist/_internal/server/functions/scheduled.js +25 -1
  58. package/dist/_internal/server/jobs/core/_event-ref.d.ts +51 -0
  59. package/dist/_internal/server/jobs/core/_event-ref.js +63 -0
  60. package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +18 -0
  61. package/dist/_internal/server/jobs/core/assignSpinPrize.js +77 -16
  62. package/dist/_internal/server/jobs/core/auctionSettlement.js +13 -4
  63. package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +44 -15
  64. package/dist/_internal/server/jobs/core/bundleStockSync.js +3 -4
  65. package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +44 -0
  66. package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +78 -0
  67. package/dist/_internal/server/jobs/core/event-draw-reasons.js +133 -0
  68. package/dist/_internal/server/jobs/core/listingProcessor.js +28 -8
  69. package/dist/_internal/server/jobs/core/onOrderCreate.js +12 -1
  70. package/dist/_internal/server/jobs/core/onScamReportCreate.js +13 -2
  71. package/dist/_internal/server/jobs/core/onScamReportRejected.js +8 -2
  72. package/dist/_internal/server/jobs/core/onScamReportVerified.js +8 -2
  73. package/dist/_internal/server/jobs/core/onStoreWrite.js +11 -4
  74. package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +5 -4
  75. package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +1 -4
  76. package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +1 -2
  77. package/dist/_internal/server/jobs/core/promotions.js +7 -4
  78. package/dist/_internal/server/jobs/core/searchIndexBuild.d.ts +7 -0
  79. package/dist/_internal/server/jobs/core/searchIndexBuild.js +211 -0
  80. package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +35 -0
  81. package/dist/_internal/server/jobs/core/triggerEventRaffle.js +213 -31
  82. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +20 -14
  83. package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +8 -0
  84. package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +15 -15
  85. package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
  86. package/dist/_internal/server/jobs/handlers/index.js +1 -0
  87. package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +18 -0
  88. package/dist/_internal/server/jobs/handlers/onProductWrite.js +18 -0
  89. package/dist/_internal/server/jobs/handlers/onReviewWrite.js +18 -0
  90. package/dist/_internal/server/jobs/handlers/onScamReportUpdate.js +18 -0
  91. package/dist/_internal/server/jobs/handlers/onStoreWrite.js +18 -0
  92. package/dist/_internal/server/jobs/handlers/searchIndexBuild.d.ts +2 -0
  93. package/dist/_internal/server/jobs/handlers/searchIndexBuild.js +2 -0
  94. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +8 -0
  95. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -6
  96. package/dist/_internal/shared/actions/action-registry.js +29 -0
  97. package/dist/_internal/shared/cache/revalidate-targets.d.ts +0 -1
  98. package/dist/_internal/shared/cache/revalidate-targets.js +10 -8
  99. package/dist/_internal/shared/features/events/config.d.ts +14 -0
  100. package/dist/_internal/shared/features/events/config.js +14 -0
  101. package/dist/_internal/shared/features/notifications/action-url.js +8 -0
  102. package/dist/_internal/shared/features/site-settings/types.d.ts +11 -0
  103. package/dist/_internal/shared/features/sticker-trace/codec.d.ts +81 -0
  104. package/dist/_internal/shared/features/sticker-trace/codec.js +30 -0
  105. package/dist/_internal/shared/features/sticker-trace/config.d.ts +81 -0
  106. package/dist/_internal/shared/features/sticker-trace/config.js +177 -0
  107. package/dist/_internal/shared/features/sticker-trace/cut-contour.d.ts +20 -0
  108. package/dist/_internal/shared/features/sticker-trace/cut-contour.js +60 -0
  109. package/dist/_internal/shared/features/sticker-trace/export/build-export-set.d.ts +65 -0
  110. package/dist/_internal/shared/features/sticker-trace/export/build-export-set.js +176 -0
  111. package/dist/_internal/shared/features/sticker-trace/export/cut-svg.d.ts +56 -0
  112. package/dist/_internal/shared/features/sticker-trace/export/cut-svg.js +120 -0
  113. package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.d.ts +92 -0
  114. package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.js +153 -0
  115. package/dist/_internal/shared/features/sticker-trace/export/nesting.d.ts +51 -0
  116. package/dist/_internal/shared/features/sticker-trace/export/nesting.js +110 -0
  117. package/dist/_internal/shared/features/sticker-trace/export/page-sizes.d.ts +68 -0
  118. package/dist/_internal/shared/features/sticker-trace/export/page-sizes.js +223 -0
  119. package/dist/_internal/shared/features/sticker-trace/export/part-tiling.d.ts +51 -0
  120. package/dist/_internal/shared/features/sticker-trace/export/part-tiling.js +178 -0
  121. package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.d.ts +26 -0
  122. package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.js +134 -0
  123. package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.d.ts +40 -0
  124. package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.js +195 -0
  125. package/dist/_internal/shared/features/sticker-trace/index.d.ts +2 -0
  126. package/dist/_internal/shared/features/sticker-trace/index.js +59 -0
  127. package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.d.ts +11 -0
  128. package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.js +66 -0
  129. package/dist/_internal/shared/features/sticker-trace/math/edt.d.ts +27 -0
  130. package/dist/_internal/shared/features/sticker-trace/math/edt.js +165 -0
  131. package/dist/_internal/shared/features/sticker-trace/math/label.d.ts +15 -0
  132. package/dist/_internal/shared/features/sticker-trace/math/label.js +156 -0
  133. package/dist/_internal/shared/features/sticker-trace/math/marching-squares.d.ts +16 -0
  134. package/dist/_internal/shared/features/sticker-trace/math/marching-squares.js +242 -0
  135. package/dist/_internal/shared/features/sticker-trace/math/morphology.d.ts +46 -0
  136. package/dist/_internal/shared/features/sticker-trace/math/morphology.js +168 -0
  137. package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.d.ts +88 -0
  138. package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.js +286 -0
  139. package/dist/_internal/shared/features/sticker-trace/math/rdp.d.ts +10 -0
  140. package/dist/_internal/shared/features/sticker-trace/math/rdp.js +74 -0
  141. package/dist/_internal/shared/features/sticker-trace/resume.d.ts +50 -0
  142. package/dist/_internal/shared/features/sticker-trace/resume.js +160 -0
  143. package/dist/_internal/shared/features/sticker-trace/trace/cluster.d.ts +20 -0
  144. package/dist/_internal/shared/features/sticker-trace/trace/cluster.js +132 -0
  145. package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.d.ts +28 -0
  146. package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.js +120 -0
  147. package/dist/_internal/shared/features/sticker-trace/trace/flood.d.ts +21 -0
  148. package/dist/_internal/shared/features/sticker-trace/trace/flood.js +104 -0
  149. package/dist/_internal/shared/features/sticker-trace/trace/geometry.d.ts +3 -0
  150. package/dist/_internal/shared/features/sticker-trace/trace/geometry.js +140 -0
  151. package/dist/_internal/shared/features/sticker-trace/trace/line-filter.d.ts +15 -0
  152. package/dist/_internal/shared/features/sticker-trace/trace/line-filter.js +138 -0
  153. package/dist/_internal/shared/features/sticker-trace/trace/merge.d.ts +27 -0
  154. package/dist/_internal/shared/features/sticker-trace/trace/merge.js +187 -0
  155. package/dist/_internal/shared/features/sticker-trace/trace/paper.d.ts +32 -0
  156. package/dist/_internal/shared/features/sticker-trace/trace/paper.js +147 -0
  157. package/dist/_internal/shared/features/sticker-trace/trace/prefilter.d.ts +30 -0
  158. package/dist/_internal/shared/features/sticker-trace/trace/prefilter.js +125 -0
  159. package/dist/_internal/shared/features/sticker-trace/trace/quantise.d.ts +10 -0
  160. package/dist/_internal/shared/features/sticker-trace/trace/quantise.js +153 -0
  161. package/dist/_internal/shared/features/sticker-trace/trace/ridge.d.ts +88 -0
  162. package/dist/_internal/shared/features/sticker-trace/trace/ridge.js +344 -0
  163. package/dist/_internal/shared/features/sticker-trace/trace/segment.d.ts +10 -0
  164. package/dist/_internal/shared/features/sticker-trace/trace/segment.js +251 -0
  165. package/dist/_internal/shared/features/sticker-trace/types.d.ts +197 -0
  166. package/dist/_internal/shared/features/sticker-trace/types.js +49 -0
  167. package/dist/_internal/shared/listing-types/_registry.d.ts +11 -0
  168. package/dist/_internal/shared/listing-types/art/config.d.ts +1 -0
  169. package/dist/_internal/shared/listing-types/art/config.js +1 -0
  170. package/dist/_internal/shared/listing-types/auction/config.d.ts +1 -0
  171. package/dist/_internal/shared/listing-types/auction/config.js +1 -0
  172. package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -0
  173. package/dist/_internal/shared/listing-types/classified/config.js +1 -0
  174. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -0
  175. package/dist/_internal/shared/listing-types/digital-code/config.js +1 -0
  176. package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
  177. package/dist/_internal/shared/listing-types/feature-flags.js +9 -0
  178. package/dist/_internal/shared/listing-types/live/config.d.ts +1 -0
  179. package/dist/_internal/shared/listing-types/live/config.js +1 -0
  180. package/dist/_internal/shared/listing-types/pre-order/config.d.ts +1 -0
  181. package/dist/_internal/shared/listing-types/pre-order/config.js +1 -0
  182. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -0
  183. package/dist/_internal/shared/listing-types/prize-draw/config.js +1 -0
  184. package/dist/_internal/shared/listing-types/standard/config.d.ts +1 -0
  185. package/dist/_internal/shared/listing-types/standard/config.js +1 -0
  186. package/dist/_internal/shared/listing-types/stickers/config.d.ts +1 -0
  187. package/dist/_internal/shared/listing-types/stickers/config.js +1 -0
  188. package/dist/_internal/shared/media/limits.d.ts +12 -2
  189. package/dist/_internal/shared/media/limits.js +12 -2
  190. package/dist/_internal/shared/search/artifact-url.d.ts +35 -0
  191. package/dist/_internal/shared/search/artifact-url.js +119 -0
  192. package/dist/_internal/shared/search/index-record.d.ts +68 -0
  193. package/dist/_internal/shared/search/index-record.js +96 -0
  194. package/dist/_internal/shared/search/match.d.ts +65 -0
  195. package/dist/_internal/shared/search/match.js +263 -0
  196. package/dist/client.d.ts +8 -7
  197. package/dist/client.js +12 -5
  198. package/dist/configs/eslint.js +22 -2
  199. package/dist/constants/api-endpoints.d.ts +68 -0
  200. package/dist/constants/api-endpoints.js +32 -0
  201. package/dist/constants/field-names.d.ts +7 -1
  202. package/dist/constants/field-names.js +36 -1
  203. package/dist/contracts/repository.d.ts +8 -7
  204. package/dist/contracts/search.d.ts +2 -2
  205. package/dist/contracts/table.d.ts +3 -3
  206. package/dist/contracts/table.js +3 -3
  207. package/dist/core/contact-submissions.repository.js +2 -2
  208. package/dist/core/integration-keys.js +7 -1
  209. package/dist/core/newsletter.repository.js +2 -2
  210. package/dist/core/site-config.js +1 -1
  211. package/dist/errors/error-codes.d.ts +30 -0
  212. package/dist/errors/error-codes.js +30 -0
  213. package/dist/errors/error-display-map.js +40 -1
  214. package/dist/features/account/api/[userId]/addresses/route.js +1 -1
  215. package/dist/features/account/components/UserBidsView.js +1 -1
  216. package/dist/features/account/components/index.d.ts +0 -8
  217. package/dist/features/account/components/index.js +0 -4
  218. package/dist/features/addresses/repository/addresses.repository.d.ts +17 -6
  219. package/dist/features/addresses/repository/addresses.repository.js +65 -9
  220. package/dist/features/addresses/schemas/firestore.d.ts +17 -6
  221. package/dist/features/admin/actions/notification-actions.js +15 -6
  222. package/dist/features/admin/api/bids/route.js +1 -1
  223. package/dist/features/admin/api/coupons/route.js +1 -1
  224. package/dist/features/admin/api/products/route.js +1 -1
  225. package/dist/features/admin/api/reviews/route.js +1 -1
  226. package/dist/features/admin/components/AdminAdEditorView.js +19 -5
  227. package/dist/features/admin/components/AdminAuditLogView.js +1 -1
  228. package/dist/features/admin/components/AdminBlogEditorView.js +0 -1
  229. package/dist/features/admin/components/AdminBlogView.js +1 -1
  230. package/dist/features/admin/components/AdminBrandsView.js +17 -1
  231. package/dist/features/admin/components/AdminCategoryEditorView.js +0 -1
  232. package/dist/features/admin/components/AdminContactView.js +1 -1
  233. package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
  234. package/dist/features/admin/components/AdminNewsletterView.js +1 -1
  235. package/dist/features/admin/components/AdminOrdersView.js +9 -2
  236. package/dist/features/admin/components/AdminPayoutsView.js +1 -1
  237. package/dist/features/admin/components/AdminPrizeDrawsView.js +11 -0
  238. package/dist/features/admin/components/AdminProductEditorView.d.ts +10 -1
  239. package/dist/features/admin/components/AdminProductEditorView.js +24 -37
  240. package/dist/features/admin/components/AdminProductsView.js +10 -3
  241. package/dist/features/admin/components/AdminScammersView.js +1 -1
  242. package/dist/features/admin/components/AdminSectionsView.js +21 -5
  243. package/dist/features/admin/components/AdminSessionsView.js +1 -1
  244. package/dist/features/admin/components/AdminSublistingCategoriesView.js +22 -1
  245. package/dist/features/admin/components/AdminTeamView.js +1 -1
  246. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +0 -1
  247. package/dist/features/admin/components/AdminUsersView.js +1 -1
  248. package/dist/features/admin/components/DataListingView.d.ts +2 -1
  249. package/dist/features/admin/components/DataListingView.js +9 -4
  250. package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +0 -2
  251. package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
  252. package/dist/features/admin/repository/site-settings.repository.js +8 -3
  253. package/dist/features/admin/schemas/firestore.d.ts +62 -1
  254. package/dist/features/admin/schemas/firestore.js +32 -0
  255. package/dist/features/admin/types/index.d.ts +1 -1
  256. package/dist/features/auctions/actions/bid-actions.d.ts +2 -2
  257. package/dist/features/auctions/actions/bid-actions.js +16 -4
  258. package/dist/features/auctions/api/route.js +1 -1
  259. package/dist/features/auctions/components/AuctionBottomActions.js +4 -0
  260. package/dist/features/auctions/repository/bid.repository.d.ts +46 -4
  261. package/dist/features/auctions/repository/bid.repository.js +114 -13
  262. package/dist/features/auctions/schemas/firestore.d.ts +24 -4
  263. package/dist/features/auctions/schemas/firestore.js +1 -0
  264. package/dist/features/auth/actions/profile-actions.js +30 -4
  265. package/dist/features/auth/components/index.d.ts +0 -1
  266. package/dist/features/auth/components/index.js +0 -1
  267. package/dist/features/auth/repository/session.repository.d.ts +17 -3
  268. package/dist/features/auth/repository/session.repository.js +46 -5
  269. package/dist/features/auth/repository/token.repository.d.ts +27 -4
  270. package/dist/features/auth/repository/token.repository.js +65 -11
  271. package/dist/features/auth/repository/user.repository.d.ts +33 -7
  272. package/dist/features/auth/repository/user.repository.js +100 -15
  273. package/dist/features/auth/schemas/firestore.d.ts +63 -12
  274. package/dist/features/auth/schemas/firestore.js +11 -0
  275. package/dist/features/before-after/api/route.js +1 -1
  276. package/dist/features/blog/components/BlogListView.js +16 -3
  277. package/dist/features/blog/components/BlogPostView.js +1 -1
  278. package/dist/features/blog/schemas/index.d.ts +2 -2
  279. package/dist/features/cart/api/route.js +1 -1
  280. package/dist/features/catalogue/repository/catalogue.repository.d.ts +7 -7
  281. package/dist/features/catalogue/repository/catalogue.repository.js +28 -10
  282. package/dist/features/catalogue/schemas/firestore.d.ts +11 -0
  283. package/dist/features/categories/api/route.js +10 -10
  284. package/dist/features/categories/components/CategoryDetailPageView.js +35 -5
  285. package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
  286. package/dist/features/categories/components/index.d.ts +0 -2
  287. package/dist/features/categories/components/index.js +0 -1
  288. package/dist/features/categories/repository/categories.repository.d.ts +1 -0
  289. package/dist/features/categories/repository/categories.repository.js +31 -1
  290. package/dist/features/categories/schemas/index.d.ts +2 -2
  291. package/dist/features/categories/utils/taxonomy-visual.d.ts +21 -0
  292. package/dist/features/categories/utils/taxonomy-visual.js +58 -0
  293. package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
  294. package/dist/features/collections/api/[slug]/route.js +3 -3
  295. package/dist/features/collections/api/route.js +1 -1
  296. package/dist/features/consultation/api/route.js +1 -1
  297. package/dist/features/consultation/repository/consultations.repository.js +1 -1
  298. package/dist/features/consultation/types/index.d.ts +1 -1
  299. package/dist/features/contact/components/ContactForm.js +1 -3
  300. package/dist/features/corporate/api/route.js +1 -1
  301. package/dist/features/corporate/repository/corporate.repository.js +1 -1
  302. package/dist/features/corporate/types/index.d.ts +1 -1
  303. package/dist/features/cron/jobs/auction-expiry.job.js +1 -1
  304. package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
  305. package/dist/features/events/actions/event-actions.d.ts +14 -0
  306. package/dist/features/events/actions/event-actions.js +82 -3
  307. package/dist/features/events/api/[id]/route.js +2 -2
  308. package/dist/features/events/components/AdminEventEditorView.js +22 -3
  309. package/dist/features/events/components/AdminEventsView.js +32 -8
  310. package/dist/features/events/components/EventRafflesSection.d.ts +34 -1
  311. package/dist/features/events/components/EventRafflesSection.js +52 -3
  312. package/dist/features/events/components/SpinWheelView.d.ts +2 -2
  313. package/dist/features/events/components/SpinWheelView.js +41 -4
  314. package/dist/features/events/repository/event-entry.repository.d.ts +14 -2
  315. package/dist/features/events/repository/event-entry.repository.js +41 -7
  316. package/dist/features/events/schemas/firestore.d.ts +17 -4
  317. package/dist/features/events/types/index.d.ts +37 -0
  318. package/dist/features/faq/repository/faqs.repository.js +1 -1
  319. package/dist/features/faq/schemas/index.d.ts +5 -2
  320. package/dist/features/faq/schemas/index.js +6 -0
  321. package/dist/features/faq/types/index.d.ts +0 -1
  322. package/dist/features/grouped/components/GroupedListingEditorView.js +17 -2
  323. package/dist/features/homepage/api/carousel/[id]/route.js +1 -1
  324. package/dist/features/homepage/api/carousel/route.js +4 -4
  325. package/dist/features/homepage/api/route.js +2 -2
  326. package/dist/features/homepage/api/sections/route.js +1 -1
  327. package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
  328. package/dist/features/homepage/components/AnnouncementBar.js +13 -19
  329. package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
  330. package/dist/features/homepage/components/index.d.ts +0 -2
  331. package/dist/features/homepage/components/index.js +0 -1
  332. package/dist/features/homepage/repository/homepage.repository.js +1 -1
  333. package/dist/features/homepage/schemas/firestore.d.ts +6 -0
  334. package/dist/features/homepage/schemas/index.d.ts +10 -10
  335. package/dist/features/layout/AppLayoutShell.d.ts +12 -3
  336. package/dist/features/layout/AppLayoutShell.js +65 -13
  337. package/dist/features/layout/BottomActionsContext.d.ts +16 -0
  338. package/dist/features/layout/BottomActionsContext.js +5 -0
  339. package/dist/features/layout/BottomChrome.js +48 -9
  340. package/dist/features/layout/BottomNavbar.d.ts +14 -0
  341. package/dist/features/layout/BottomNavbar.js +43 -3
  342. package/dist/features/layout/MainNavbar.d.ts +11 -0
  343. package/dist/features/layout/NavbarLayout.d.ts +3 -0
  344. package/dist/features/layout/NavbarLayout.js +88 -11
  345. package/dist/features/layout/SideActionDock.d.ts +1 -0
  346. package/dist/features/layout/SideActionDock.js +219 -0
  347. package/dist/features/layout/TitleBarLayout.d.ts +1 -3
  348. package/dist/features/layout/TitleBarLayout.js +3 -4
  349. package/dist/features/layout/cta-anchor.d.ts +31 -0
  350. package/dist/features/layout/cta-anchor.js +31 -0
  351. package/dist/features/layout/hooks/useBottomActions.d.ts +7 -0
  352. package/dist/features/layout/hooks/useBottomActions.js +6 -1
  353. package/dist/features/layout/index.d.ts +9 -1
  354. package/dist/features/layout/index.js +9 -1
  355. package/dist/features/layout/useCtaReveal.d.ts +24 -0
  356. package/dist/features/layout/useCtaReveal.js +82 -0
  357. package/dist/features/layout/useHoldToOpen.d.ts +41 -0
  358. package/dist/features/layout/useHoldToOpen.js +84 -0
  359. package/dist/features/lottery/repository/lottery-entry.repository.d.ts +18 -3
  360. package/dist/features/lottery/repository/lottery-entry.repository.js +48 -6
  361. package/dist/features/lottery/schemas/firestore.d.ts +33 -5
  362. package/dist/features/loyalty/api/balance/route.js +1 -1
  363. package/dist/features/loyalty/api/history/route.js +1 -1
  364. package/dist/features/media/MediaImage.js +0 -1
  365. package/dist/features/media/MediaPickerModal.js +7 -1
  366. package/dist/features/media/modals/ImageEditor.js +5 -1
  367. package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
  368. package/dist/features/media/repository/media-assets.repository.d.ts +19 -0
  369. package/dist/features/media/upload/CameraCapture.js +16 -1
  370. package/dist/features/media/upload/ImageUpload.js +42 -4
  371. package/dist/features/media/upload/MediaUploadField.js +69 -13
  372. package/dist/features/media/upload/downscale-image.d.ts +56 -0
  373. package/dist/features/media/upload/downscale-image.js +150 -0
  374. package/dist/features/messages/components/ConversationThreadView.js +45 -2
  375. package/dist/features/messages/components/MessageSellerButton.d.ts +15 -1
  376. package/dist/features/messages/components/MessageSellerButton.js +10 -2
  377. package/dist/features/messages/schemas/firestore.d.ts +15 -0
  378. package/dist/features/orders/hooks/useOrders.js +4 -2
  379. package/dist/features/orders/repository/orders.repository.d.ts +15 -4
  380. package/dist/features/orders/repository/orders.repository.js +52 -20
  381. package/dist/features/orders/schemas/firestore.d.ts +15 -4
  382. package/dist/features/orders/schemas/index.d.ts +8 -8
  383. package/dist/features/orders/types/index.d.ts +2 -2
  384. package/dist/features/payments/repository/payments.repository.js +2 -2
  385. package/dist/features/payments/repository/payout.repository.d.ts +23 -6
  386. package/dist/features/payments/repository/payout.repository.js +63 -23
  387. package/dist/features/payments/repository/saved-payment-methods.repository.d.ts +17 -6
  388. package/dist/features/payments/repository/saved-payment-methods.repository.js +59 -11
  389. package/dist/features/payments/schemas/firestore.d.ts +14 -3
  390. package/dist/features/payments/schemas/saved-methods-firestore.d.ts +12 -1
  391. package/dist/features/pre-orders/api/[slug]/route.js +1 -1
  392. package/dist/features/pre-orders/api/admin/route.js +1 -1
  393. package/dist/features/pre-orders/api/route.js +1 -1
  394. package/dist/features/pre-orders/repository/pre-orders.repository.d.ts +3 -3
  395. package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
  396. package/dist/features/products/api/[id]/route.js +1 -1
  397. package/dist/features/products/components/ListingBottomActions.js +4 -0
  398. package/dist/features/products/components/ProductDetailPageView.js +2 -1
  399. package/dist/features/products/components/ProductGalleryClient.js +2 -2
  400. package/dist/features/products/components/ProductGrid.js +12 -1
  401. package/dist/features/products/components/index.d.ts +0 -2
  402. package/dist/features/products/components/index.js +0 -1
  403. package/dist/features/products/config/listing-type-listing-config.d.ts +0 -3
  404. package/dist/features/products/config/listing-type-listing-config.js +27 -2
  405. package/dist/features/products/constants/listing-tabs.d.ts +9 -0
  406. package/dist/features/products/constants/listing-tabs.js +3 -2
  407. package/dist/features/products/hooks/useProducts.js +2 -2
  408. package/dist/features/products/repository/products.repository.js +13 -1
  409. package/dist/features/products/schemas/index.d.ts +2 -2
  410. package/dist/features/products/types/index.d.ts +1 -1
  411. package/dist/features/promotions/api/route.js +1 -1
  412. package/dist/features/reviews/actions/review-actions.d.ts +6 -6
  413. package/dist/features/reviews/actions/review-actions.js +22 -8
  414. package/dist/features/reviews/components/ReviewDetailPageView.js +13 -1
  415. package/dist/features/reviews/components/ReviewsIndexPageView.js +21 -4
  416. package/dist/features/reviews/repository/reviews.repository.d.ts +19 -7
  417. package/dist/features/reviews/repository/reviews.repository.js +63 -12
  418. package/dist/features/reviews/schemas/firestore.d.ts +13 -2
  419. package/dist/features/reviews/schemas/index.d.ts +2 -2
  420. package/dist/features/scams/actions/scam-actions.js +16 -4
  421. package/dist/features/search/components/SearchResultsPageView.js +2 -1
  422. package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
  423. package/dist/features/search/hooks/useSearchIndex.js +172 -0
  424. package/dist/features/search/repository/search.repository.js +2 -2
  425. package/dist/features/seller/actions/offer-actions.d.ts +5 -5
  426. package/dist/features/seller/actions/offer-actions.js +38 -8
  427. package/dist/features/seller/actions/seller-actions.js +34 -7
  428. package/dist/features/seller/api/coupons/route.js +1 -1
  429. package/dist/features/seller/api/products/route.js +1 -1
  430. package/dist/features/seller/api/store/route.js +1 -1
  431. package/dist/features/seller/components/SellerBidsView.js +1 -1
  432. package/dist/features/seller/components/SellerCouponsView.js +1 -1
  433. package/dist/features/seller/components/SellerListingTypeView.js +9 -1
  434. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  435. package/dist/features/seller/components/SellerPayoutSettingsView.js +0 -1
  436. package/dist/features/seller/components/SellerPayoutsView.js +1 -1
  437. package/dist/features/seller/components/SellerProductShell.js +0 -1
  438. package/dist/features/seller/components/SellerProductsView.js +1 -1
  439. package/dist/features/seller/components/SellerShippingView.js +0 -1
  440. package/dist/features/seller/components/SellerStorefrontView.js +0 -1
  441. package/dist/features/seller/components/index.d.ts +0 -4
  442. package/dist/features/seller/components/index.js +0 -2
  443. package/dist/features/seller/repository/offer.repository.d.ts +15 -3
  444. package/dist/features/seller/repository/offer.repository.js +43 -7
  445. package/dist/features/seller/schemas/firestore.d.ts +14 -3
  446. package/dist/features/seller/schemas/index.d.ts +4 -4
  447. package/dist/features/seller/schemas/order-forms.d.ts +39 -0
  448. package/dist/features/seller/schemas/order-forms.js +37 -0
  449. package/dist/features/shell/FormShell.js +6 -2
  450. package/dist/features/shell/QuickFormDrawer.js +15 -1
  451. package/dist/features/shipments/components/AdminShipmentEditorView.js +0 -1
  452. package/dist/features/shipments/components/AdminShipmentsView.js +1 -1
  453. package/dist/features/sticker-trace/components/StickerCommitPanel.d.ts +30 -0
  454. package/dist/features/sticker-trace/components/StickerCommitPanel.js +93 -0
  455. package/dist/features/sticker-trace/components/StickerPrintPanel.d.ts +33 -0
  456. package/dist/features/sticker-trace/components/StickerPrintPanel.js +104 -0
  457. package/dist/features/sticker-trace/components/StickerRetryPanel.d.ts +20 -0
  458. package/dist/features/sticker-trace/components/StickerRetryPanel.js +128 -0
  459. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +45 -0
  460. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +84 -0
  461. package/dist/features/sticker-trace/components/StickerTraceStudio.d.ts +27 -0
  462. package/dist/features/sticker-trace/components/StickerTraceStudio.js +171 -0
  463. package/dist/features/sticker-trace/constants/help-content.d.ts +23 -0
  464. package/dist/features/sticker-trace/constants/help-content.js +172 -0
  465. package/dist/features/sticker-trace/hooks/useLiveTrace.d.ts +27 -0
  466. package/dist/features/sticker-trace/hooks/useLiveTrace.js +160 -0
  467. package/dist/features/sticker-trace/hooks/useStickerTraceProgress.d.ts +22 -0
  468. package/dist/features/sticker-trace/hooks/useStickerTraceProgress.js +106 -0
  469. package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +113 -0
  470. package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +146 -0
  471. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +132 -0
  472. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +174 -0
  473. package/dist/features/sticker-trace/schemas/firestore.d.ts +248 -0
  474. package/dist/features/sticker-trace/schemas/firestore.js +79 -0
  475. package/dist/features/sticker-trace/server.d.ts +8 -0
  476. package/dist/features/sticker-trace/server.js +51 -0
  477. package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
  478. package/dist/features/stores/actions/store-query-actions.js +7 -2
  479. package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -3
  480. package/dist/features/stores/api/[storeSlug]/products/route.js +3 -3
  481. package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
  482. package/dist/features/stores/api/[storeSlug]/route.js +1 -1
  483. package/dist/features/stores/components/StoreNavTabs.js +17 -2
  484. package/dist/features/stores/manifest.js +8 -4
  485. package/dist/features/support/repository/support.repository.d.ts +14 -3
  486. package/dist/features/support/repository/support.repository.js +93 -13
  487. package/dist/features/support/schemas/firestore.d.ts +16 -5
  488. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +61 -19
  489. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +19 -3
  490. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +2 -0
  491. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +243 -0
  492. package/dist/features/tester/seed-data/authored/content-discovery__events.js +36 -10
  493. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +2 -0
  494. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +209 -0
  495. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +2 -0
  496. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +90 -0
  497. package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.d.ts +2 -0
  498. package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.js +85 -0
  499. package/dist/features/tester/seed-data/authored/index.js +10 -0
  500. package/dist/features/tester/seed-data/authored/selling__media-limits.js +19 -17
  501. package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +10 -5
  502. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +2 -0
  503. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +283 -0
  504. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +235 -22
  505. package/dist/index.d.ts +10 -23
  506. package/dist/index.js +27 -19
  507. package/dist/next/api/routeHandler.js +9 -0
  508. package/dist/next/routing/require-record.d.ts +13 -0
  509. package/dist/next/routing/require-record.js +62 -0
  510. package/dist/next/routing/route-map.d.ts +4 -4
  511. package/dist/next/routing/route-map.js +25 -3
  512. package/dist/providers/db-firebase/base.d.ts +4 -2
  513. package/dist/providers/db-firebase/base.js +21 -5
  514. package/dist/providers/db-firebase/base.repository.d.ts +11 -9
  515. package/dist/providers/db-firebase/base.repository.js +19 -0
  516. package/dist/providers/db-firebase/rtdb-paths.d.ts +12 -0
  517. package/dist/providers/db-firebase/rtdb-paths.js +12 -0
  518. package/dist/react/ErrorBoundary.js +6 -1
  519. package/dist/react/hooks/realtime-event-constants.d.ts +1 -0
  520. package/dist/react/hooks/realtime-event-constants.js +8 -0
  521. package/dist/react/hooks/useEntityDelete.js +5 -1
  522. package/dist/react/hooks/useMessage.js +5 -1
  523. package/dist/repositories/index.d.ts +2 -2
  524. package/dist/repositories/index.js +6 -1
  525. package/dist/schemas/registry.d.ts +13 -20
  526. package/dist/schemas/registry.js +31 -14
  527. package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
  528. package/dist/security/encrypted.d.ts +117 -0
  529. package/dist/security/encrypted.js +100 -0
  530. package/dist/security/index.d.ts +5 -2
  531. package/dist/security/index.js +16 -2
  532. package/dist/security/pii-accessors.d.ts +71 -0
  533. package/dist/security/pii-accessors.js +150 -0
  534. package/dist/security/pii-encrypt.d.ts +0 -8
  535. package/dist/security/pii-encrypt.js +22 -15
  536. package/dist/security/pii-mask.d.ts +18 -0
  537. package/dist/security/pii-mask.js +27 -0
  538. package/dist/seed/_helpers/search-txt-wrappers.d.ts +6 -6
  539. package/dist/seed/_helpers/search-txt-wrappers.js +22 -0
  540. package/dist/seed/addresses-seed-data.d.ts +2 -2
  541. package/dist/seed/authenticity-knowledge-seed-data.d.ts +34 -0
  542. package/dist/seed/authenticity-knowledge-seed-data.js +1277 -0
  543. package/dist/seed/bids-seed-data.d.ts +2 -2
  544. package/dist/seed/bids-seed-data.js +23 -2
  545. package/dist/seed/events-seed-data.d.ts +2 -2
  546. package/dist/seed/events-seed-data.js +5 -0
  547. package/dist/seed/faq-seed-data.js +175 -5
  548. package/dist/seed/homepage-sections-seed-data.js +39 -23
  549. package/dist/seed/index.d.ts +1 -0
  550. package/dist/seed/index.js +1 -0
  551. package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
  552. package/dist/seed/offers-seed-data.d.ts +2 -2
  553. package/dist/seed/offers-seed-data.js +1 -1
  554. package/dist/seed/orders-seed-data.d.ts +2 -2
  555. package/dist/seed/payouts-seed-data.d.ts +2 -2
  556. package/dist/seed/payouts-seed-data.js +1 -1
  557. package/dist/seed/reviews-seed-data.d.ts +1 -2
  558. package/dist/seed/seed-purpose.js +7 -0
  559. package/dist/seed/sessions-seed-data.d.ts +2 -2
  560. package/dist/seed/sessions-seed-data.js +5 -0
  561. package/dist/seed/site-settings-seed-data.js +1 -1
  562. package/dist/seed/support-tickets-seed-data.d.ts +2 -2
  563. package/dist/seed/support-tickets-seed-data.js +1 -1
  564. package/dist/seed/users-seed-data.d.ts +2 -2
  565. package/dist/seed/users-seed-data.js +1 -1
  566. package/dist/seo/json-ld.js +5 -1
  567. package/dist/server.d.ts +18 -3
  568. package/dist/server.js +59 -3
  569. package/dist/styles.css +237 -1
  570. package/dist/tailwind-utilities.css +1 -1
  571. package/dist/ui/components/Button.js +7 -1
  572. package/dist/ui/components/FilterChipGroup.d.ts +11 -0
  573. package/dist/ui/components/FilterChipGroup.js +1 -1
  574. package/dist/ui/components/ImageGallery.js +6 -1
  575. package/dist/ui/components/ListingLayout.js +14 -8
  576. package/dist/ui/components/OverflowRow.d.ts +92 -0
  577. package/dist/ui/components/OverflowRow.js +203 -0
  578. package/dist/ui/components/OverflowRow.style.css +235 -0
  579. package/dist/ui/components/RecordDetailModal.js +14 -1
  580. package/dist/ui/components/RowActionMenu.js +5 -1
  581. package/dist/ui/components/SideDrawer.js +5 -1
  582. package/dist/ui/components/SideModal.js +9 -1
  583. package/dist/ui/components/TabBarShell.d.ts +12 -1
  584. package/dist/ui/components/TabBarShell.js +3 -2
  585. package/dist/ui/components/Tabs.js +36 -24
  586. package/dist/ui/components/Toast.d.ts +3 -24
  587. package/dist/ui/components/Toast.js +2 -19
  588. package/dist/ui/components/TopBannerPortal.d.ts +15 -0
  589. package/dist/ui/components/TopBannerPortal.js +19 -0
  590. package/dist/ui/components/UnsavedChangesModal.js +5 -1
  591. package/dist/ui/components/index.style.css +1 -0
  592. package/dist/ui/components/row-collapse.d.ts +15 -0
  593. package/dist/ui/components/row-collapse.js +127 -0
  594. package/dist/ui/components/toast-context.d.ts +63 -0
  595. package/dist/ui/components/toast-context.js +48 -0
  596. package/dist/ui/components/top-banner-slot.d.ts +37 -0
  597. package/dist/ui/components/top-banner-slot.js +45 -0
  598. package/dist/ui/icons/icon-registry.d.ts +6 -0
  599. package/dist/ui/icons/icon-registry.js +17 -1
  600. package/dist/ui/index.d.ts +2 -0
  601. package/dist/ui/index.js +1 -0
  602. package/dist/utils/array.helper.d.ts +2 -2
  603. package/dist/utils/array.helper.js +5 -5
  604. package/dist/utils/id-generators.d.ts +6 -0
  605. package/dist/utils/id-generators.js +10 -0
  606. package/dist/utils/media-url.js +0 -2
  607. package/dist/utils/search-txt-builders.d.ts +28 -4
  608. package/dist/utils/search-txt-builders.js +41 -1
  609. package/dist/validation/schemas.d.ts +8 -8
  610. package/package.json +6 -2
  611. package/scripts/seed-cli.mjs +3 -0
  612. package/dist/features/account/components/UserAddressesView.d.ts +0 -13
  613. package/dist/features/account/components/UserAddressesView.js +0 -5
  614. package/dist/features/account/components/UserNotificationsView.d.ts +0 -15
  615. package/dist/features/account/components/UserNotificationsView.js +0 -12
  616. package/dist/features/account/components/UserSettingsView.d.ts +0 -16
  617. package/dist/features/account/components/UserSettingsView.js +0 -13
  618. package/dist/features/account/components/UserSupportView.d.ts +0 -3
  619. package/dist/features/account/components/UserSupportView.js +0 -166
  620. package/dist/features/admin/components/DemoSeedView.d.ts +0 -11
  621. package/dist/features/admin/components/DemoSeedView.js +0 -5
  622. package/dist/features/auth/components/AuthStatusPanel.d.ts +0 -10
  623. package/dist/features/auth/components/AuthStatusPanel.js +0 -22
  624. package/dist/features/categories/components/CategoryProductsView.d.ts +0 -45
  625. package/dist/features/categories/components/CategoryProductsView.js +0 -21
  626. package/dist/features/homepage/components/HowItWorksInfoView.d.ts +0 -36
  627. package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
  628. package/dist/features/layout/BottomActions.d.ts +0 -1
  629. package/dist/features/layout/BottomActions.js +0 -311
  630. package/dist/features/products/components/ProductsView.d.ts +0 -6
  631. package/dist/features/products/components/ProductsView.js +0 -5
  632. package/dist/features/seller/components/SellerStoreView.d.ts +0 -8
  633. package/dist/features/seller/components/SellerStoreView.js +0 -8
@@ -5,7 +5,13 @@ import { createPortal } from "react-dom";
5
5
  import { twMerge } from "tailwind-merge";
6
6
  import { Loader2 } from "lucide-react";
7
7
  import { surfaceError } from "../../client/api/surface-error.js";
8
- import { useToastSafe } from "./Toast.js";
8
+ /*
9
+ * From `toast-context`, never from `./Toast`. `Toast` renders a `<Button>` as
10
+ * its dismiss control, so importing the hook from there is a real value cycle
11
+ * between two primitives — which makes their module initialisation order a
12
+ * property of the bundler rather than of the code.
13
+ */
14
+ import { useToastSafe } from "./toast-context.js";
9
15
  import { SHADOW_MAP } from "./surface-tokens.js";
10
16
  import { resolveIcon, ICON_SIZE } from "../icons/icon-registry.js";
11
17
  function spawnRipple(host, clientX, clientY) {
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
+ import type { OverflowRowDotTone } from "./OverflowRow";
2
3
  /**
3
4
  * FilterChipGroup — labelled wrap-group of pill buttons.
4
5
  *
@@ -32,6 +33,16 @@ export interface FilterChipGroupTab {
32
33
  * and a failed count can never hide a filter that has rows (Root Cause #59).
33
34
  */
34
35
  count?: number;
36
+ /**
37
+ * Leading status dot. Lets a status chip be found by colour before the label
38
+ * is read, which is the whole job of a status filter bar.
39
+ *
40
+ * 🛑 Colour is NEVER the only signal — the label is always rendered beside
41
+ * it, so the dot is redundant reinforcement rather than information. A chip
42
+ * identified only by colour is unusable to a colour-blind or screen-reader
43
+ * user, and the dot is `aria-hidden` for exactly that reason.
44
+ */
45
+ dotTone?: OverflowRowDotTone;
35
46
  }
36
47
  export interface FilterChipGroupProps {
37
48
  /** Section label shown above the chips. */
@@ -56,6 +56,6 @@ export function FilterChipGroup({ label, tabs, value, onChange, allId = "All", m
56
56
  return (_jsxs("button", { type: "button",
57
57
  // Checkboxes report checked state, not pressed state — a screen
58
58
  // reader announcing "pressed" for a filter that stays on is wrong.
59
- role: multiple ? "checkbox" : undefined, "aria-checked": multiple ? isActive : undefined, "aria-pressed": multiple ? undefined : isActive, onClick: () => handleClick(tab.id), className: `${CHIP_BASE_CLS} ${isActive ? ACTIVE_CLS : INACTIVE_CLS}`, children: [tab.label, typeof tab.count === "number" && (_jsx("span", { className: COUNT_CLS, children: tab.count > 99 ? "99+" : tab.count }))] }, tab.id));
59
+ role: multiple ? "checkbox" : undefined, "aria-checked": multiple ? isActive : undefined, "aria-pressed": multiple ? undefined : isActive, onClick: () => handleClick(tab.id), className: `${CHIP_BASE_CLS} ${isActive ? ACTIVE_CLS : INACTIVE_CLS}`, children: [tab.dotTone && (_jsx("span", { className: "appkit-overflow-row__dot mr-1.5 inline-block align-middle", "data-tone": tab.dotTone, "aria-hidden": "true" })), tab.label, typeof tab.count === "number" && (_jsx("span", { className: COUNT_CLS, children: tab.count > 99 ? "99+" : tab.count }))] }, tab.id));
60
60
  }) })] }));
61
61
  }
@@ -4,7 +4,12 @@ import { useState, useRef, useEffect } from "react";
4
4
  import { Text } from "./Typography.js";
5
5
  import { Button } from "./Button.js";
6
6
  import { HorizontalScroller } from "./HorizontalScroller.js";
7
- import { useSwipe, useGesture } from "../../react/index.js";
7
+ // Defining modules, not the sibling barrel — Root Cause #18. `ui/index.ts` and
8
+ // `react/index.ts` re-exported into each other, which is the whole of
9
+ // `audit-import-cycles` component 1: an 18-module knot held together entirely
10
+ // by barrel hops, none of which needed the barrel.
11
+ import { useSwipe } from "../../react/hooks/useSwipe.js";
12
+ import { useGesture } from "../../react/hooks/useGesture.js";
8
13
  import { MediaImage } from "../../features/media/MediaImage.js";
9
14
  import { FLEX_CENTER, THEMED_BG_SECONDARY, THEMED_BG_TERTIARY, THEMED_BORDER, THEMED_TEXT_MUTED, THEMED_TEXT_PRIMARY, THEMED_TEXT_SECONDARY, } from "../../_internal/shared/styles/themed.js";
10
15
  const themed = {
@@ -50,24 +50,30 @@ export function ListingLayout({ headerSlot, statusTabsSlot, filterContent, filte
50
50
  // Must run before the detail-view short-circuit below — hooks cannot sit
51
51
  // after a conditional return.
52
52
  const bottomChromeSlot = useBottomChromeSlot();
53
- // Detail view short-circuit (folded from ListingViewShell)
54
- if (detailView) {
55
- return _jsx(_Fragment, { children: detailView });
56
- }
57
- // Portal-derived isDashboard default (folded from ListingViewShell)
58
- const effectiveIsDashboard = isDashboard ?? (portal === "admin" || portal === "seller");
59
- const l = { ...DEFAULT_LABELS, ...labels };
60
53
  /* The mobile toolbar is two stacked rows — search + Filter, then a scrolling
61
54
  sort/view/actions chip row — roughly 100px of chrome above the first card.
62
55
  It opens collapsed below `lg` and stays as the user left it thereafter.
63
56
  `forceExpanded` on a selection is load-bearing: the bulk-action bar renders
64
57
  INSIDE this toolbar, so a collapsed one would leave the user no way to act
65
- on rows they had just selected. */
58
+ on rows they had just selected.
59
+
60
+ 🛑 ABOVE the `detailView` short-circuit, with the other hooks. These two
61
+ sat below it — the THIRD time this component has grown a hook after that
62
+ return, which is what the two comments above are each a record of. Passing
63
+ `detailView` skipped them, so the hook ORDER changed between renders and
64
+ React silently reassigned state between the hooks that did run. */
66
65
  const toolbarPathname = usePathname();
67
66
  const { collapsed: mobileToolbarCollapsed, toggle: toggleMobileToolbar } = useToolbarCollapse({
68
67
  id: `listing-layout${toolbarPathname ? `:${toolbarPathname}` : ""}`,
69
68
  forceExpanded: selectedCount > 0,
70
69
  });
70
+ // Detail view short-circuit (folded from ListingViewShell)
71
+ if (detailView) {
72
+ return _jsx(_Fragment, { children: detailView });
73
+ }
74
+ // Portal-derived isDashboard default (folded from ListingViewShell)
75
+ const effectiveIsDashboard = isDashboard ?? (portal === "admin" || portal === "seller");
76
+ const l = { ...DEFAULT_LABELS, ...labels };
71
77
  const hasFilter = Boolean(filterContent);
72
78
  const panelTitle = filterTitle ?? l.filtersTitle;
73
79
  const handleMobileApply = () => {
@@ -0,0 +1,92 @@
1
+ import React from "react";
2
+ import type { IconKey } from "../icons/icon-registry";
3
+ /** Status tones for a leading dot. Mirrors the status colour pairs in tokens.css. */
4
+ export type OverflowRowDotTone = "default" | "primary" | "success" | "warning" | "error" | "info" | "muted";
5
+ /**
6
+ * Navigation props forwarded to every `href` item's link.
7
+ *
8
+ * Deliberately an explicit list rather than `Record<string, unknown>`: a bag
9
+ * of unknowns at a component boundary type-checks against anything, so a
10
+ * misspelled `scrollTo` would compile and silently do nothing — the defect
11
+ * being passed through here is precisely the kind that has no visible symptom.
12
+ */
13
+ export interface OverflowRowLinkProps {
14
+ /**
15
+ * `false` opts the link out of the global `<ScrollToTop>`, which is keyed on
16
+ * pathname. A tab bar that swaps a panel must pass this or every click
17
+ * yanks the page to the top.
18
+ */
19
+ scroll?: boolean;
20
+ prefetch?: boolean;
21
+ replace?: boolean;
22
+ }
23
+ export interface OverflowRowItem {
24
+ id: string;
25
+ /**
26
+ * Plain text. Required even when a visual is present: it is the search
27
+ * corpus, the collapsed trigger's text, and the accessible name.
28
+ */
29
+ label: string;
30
+ /** Trailing count. `undefined` means "not counted", NOT zero — it is omitted rather than rendered as 0. */
31
+ count?: number;
32
+ /**
33
+ * Leading visual, in precedence order: `imageUrl` → `iconName` → `emoji` →
34
+ * `dotTone`. Only one renders. All are optional; an item with none renders
35
+ * label-only and the row stays aligned because the visual box is not
36
+ * reserved when NO item in the set has one.
37
+ */
38
+ imageUrl?: string;
39
+ iconName?: IconKey;
40
+ emoji?: string;
41
+ dotTone?: OverflowRowDotTone;
42
+ /** Renders the pill as a link. Mutually exclusive with `onSelect`. */
43
+ href?: string;
44
+ onSelect?: () => void;
45
+ disabled?: boolean;
46
+ }
47
+ export interface OverflowRowProps {
48
+ items: readonly OverflowRowItem[];
49
+ /** Accessible name for the row and its collapsed dropdown. Required — an unnamed tablist is unusable. */
50
+ ariaLabel: string;
51
+ /** Selected item id. Drives `aria-selected`, the active pill, and the collapsed trigger's label. */
52
+ activeId?: string;
53
+ /**
54
+ * `"tabs"` renders `role="tablist"` / `role="tab"`; `"nav"` renders a plain
55
+ * list of links. Pick by what the items DO: a tab swaps a panel in place, a
56
+ * nav item navigates away. The collapsed dropdown is a `listbox` either way,
57
+ * because a `<select>`-shaped control is what a collapsed row reads as.
58
+ */
59
+ variant?: "tabs" | "nav";
60
+ /** Collapsed trigger text when nothing is selected. */
61
+ placeholder?: string;
62
+ searchPlaceholder?: string;
63
+ noResultsText?: string;
64
+ /**
65
+ * Skip measurement and always render collapsed. For sets known to be large
66
+ * at author time; the measured path is the default and is preferred.
67
+ */
68
+ alwaysCollapsed?: boolean;
69
+ /**
70
+ * Component used to render `href` items. Defaults to `next/link`.
71
+ *
72
+ * 🛑 Not a raw `<a>`, and the default is load-bearing: a plain anchor does a
73
+ * FULL PAGE LOAD, so a row of category links silently drops client-side
74
+ * navigation and every click re-downloads the document. Override it only to
75
+ * supply a locale-aware link (the consumer's `@/i18n/navigation` `Link`),
76
+ * never to go back to an anchor.
77
+ */
78
+ linkAs?: React.ElementType;
79
+ /**
80
+ * Extra props spread onto every `href` item's link.
81
+ *
82
+ * The case this exists for is `scroll={false}`: a tab bar that swaps a panel
83
+ * must NOT jump the page to the top on every click, and the app mounts a
84
+ * global `<ScrollToTop>` keyed on pathname, so opting out per-link is the
85
+ * documented escape hatch. Also carries `prefetch`.
86
+ */
87
+ linkProps?: OverflowRowLinkProps;
88
+ /** Applied to the outer shell. */
89
+ className?: string;
90
+ }
91
+ export declare function OverflowRow({ items, ariaLabel, activeId, variant, placeholder, searchPlaceholder, noResultsText, alwaysCollapsed, linkAs: Link, linkProps, className, }: OverflowRowProps): React.JSX.Element;
92
+ export default OverflowRow;
@@ -0,0 +1,203 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ /*
4
+ * WHY: A pill/tab row that is wider than its container has, until now, been
5
+ * solved three different ways in this codebase and badly in all of them:
6
+ * seven rows were a bare `overflow-x-auto` with NO affordance (the
7
+ * Subcategories row shipped 12 pills on a 1440px viewport with the last
8
+ * four simply unreachable), six went through `TabBarShell`'s scroll
9
+ * arrows, and `Tabs` collapsed to a native `<select>` on a hard-coded
10
+ * count of 5 — a threshold that is wrong in both directions, since four
11
+ * long labels overflow a phone and eight short ones fit a desktop.
12
+ *
13
+ * Width is the only honest input. This measures it.
14
+ *
15
+ * WHAT: A row of items that renders as pills while they fit and becomes a
16
+ * single searchable, keyboard-navigable dropdown when they do not.
17
+ * Every item may carry a leading visual (cover image, lucide glyph,
18
+ * status dot) which is shown in BOTH states.
19
+ *
20
+ * EXPORTS: OverflowRow, OverflowRowProps, OverflowRowItem
21
+ *
22
+ * @tag domain:ui
23
+ * @tag layer:ui
24
+ * @tag pattern:none
25
+ * @tag access:client
26
+ * @tag sideEffects:dom-measurement
27
+ */
28
+ import { useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
29
+ import NextLink from "next/link.js";
30
+ import { Check, ChevronDown, Search } from "lucide-react";
31
+ import { Avatar } from "./Avatar.js";
32
+ import { Icon } from "./Icon.js";
33
+ import { Input } from "./Input.js";
34
+ import { useRowCollapse } from "./row-collapse.js";
35
+ const UI_OVERFLOW_ROW = {
36
+ shell: "appkit-overflow-row",
37
+ row: "appkit-overflow-row__row",
38
+ pill: "appkit-overflow-row__pill",
39
+ pillActive: "appkit-overflow-row__pill--active",
40
+ count: "appkit-overflow-row__count",
41
+ visual: "appkit-overflow-row__visual",
42
+ dot: "appkit-overflow-row__dot",
43
+ emoji: "appkit-overflow-row__emoji",
44
+ trigger: "appkit-overflow-row__trigger",
45
+ triggerLabel: "appkit-overflow-row__trigger-label",
46
+ popover: "appkit-overflow-row__popover",
47
+ search: "appkit-overflow-row__search",
48
+ list: "appkit-overflow-row__list",
49
+ option: "appkit-overflow-row__option",
50
+ optionActive: "appkit-overflow-row__option--active",
51
+ optionSelected: "appkit-overflow-row__option--selected",
52
+ optionLabel: "appkit-overflow-row__option-label",
53
+ optionCount: "appkit-overflow-row__option-count",
54
+ empty: "appkit-overflow-row__empty",
55
+ check: "appkit-overflow-row__check",
56
+ };
57
+ function visualOf(item, size) {
58
+ if (item.imageUrl) {
59
+ return (_jsx(Avatar, { src: item.imageUrl, name: item.label, size: "xs", className: UI_OVERFLOW_ROW.visual }));
60
+ }
61
+ if (item.iconName) {
62
+ return _jsx(Icon, { name: item.iconName, size: size === "pill" ? "sm" : "md", tone: "current" });
63
+ }
64
+ if (item.emoji) {
65
+ return (_jsx("span", { className: UI_OVERFLOW_ROW.emoji, "aria-hidden": "true", children: item.emoji }));
66
+ }
67
+ if (item.dotTone) {
68
+ return _jsx("span", { className: UI_OVERFLOW_ROW.dot, "data-tone": item.dotTone, "aria-hidden": "true" });
69
+ }
70
+ return null;
71
+ }
72
+ /** Stable signature of the item set — invalidates the cached natural width when the set changes. */
73
+ function signatureOf(items) {
74
+ return items.map((i) => `${i.id}:${i.label}:${i.count ?? ""}`).join("|");
75
+ }
76
+ export function OverflowRow({ items, ariaLabel, activeId, variant = "tabs", placeholder, searchPlaceholder = "Search…", noResultsText = "No matches", alwaysCollapsed = false, linkAs: Link = NextLink, linkProps, className = "", }) {
77
+ const shellRef = useRef(null);
78
+ const rowRef = useRef(null);
79
+ const triggerRef = useRef(null);
80
+ const searchRef = useRef(null);
81
+ const listboxId = useId();
82
+ const [open, setOpen] = useState(false);
83
+ const [query, setQuery] = useState("");
84
+ const [activeIndex, setActiveIndex] = useState(0);
85
+ const signature = useMemo(() => signatureOf(items), [items]);
86
+ const collapsed = useRowCollapse(shellRef, rowRef, signature, {
87
+ disabled: alwaysCollapsed,
88
+ initial: alwaysCollapsed,
89
+ });
90
+ // Close on outside click.
91
+ useEffect(() => {
92
+ if (!open)
93
+ return;
94
+ const onDown = (event) => {
95
+ if (!shellRef.current?.contains(event.target))
96
+ setOpen(false);
97
+ };
98
+ document.addEventListener("mousedown", onDown);
99
+ return () => document.removeEventListener("mousedown", onDown);
100
+ }, [open]);
101
+ // Focus the search field on open — the whole point of collapsing is that the
102
+ // set is too big to scan, so typing must work without a second click.
103
+ useEffect(() => {
104
+ if (open)
105
+ searchRef.current?.focus();
106
+ else {
107
+ setQuery("");
108
+ setActiveIndex(0);
109
+ }
110
+ }, [open]);
111
+ const filtered = useMemo(() => {
112
+ const q = query.trim().toLowerCase();
113
+ if (!q)
114
+ return items;
115
+ return items.filter((item) => item.label.toLowerCase().includes(q));
116
+ }, [items, query]);
117
+ const activeItem = items.find((item) => item.id === activeId);
118
+ const commit = useCallback((item) => {
119
+ if (item.disabled)
120
+ return;
121
+ item.onSelect?.();
122
+ setOpen(false);
123
+ }, []);
124
+ const onSearchKeyDown = (event) => {
125
+ const count = filtered.length;
126
+ if (event.key === "Escape") {
127
+ event.preventDefault();
128
+ setOpen(false);
129
+ triggerRef.current?.focus();
130
+ return;
131
+ }
132
+ if (!count)
133
+ return;
134
+ if (event.key === "ArrowDown") {
135
+ event.preventDefault();
136
+ setActiveIndex((prev) => (prev + 1) % count);
137
+ return;
138
+ }
139
+ if (event.key === "ArrowUp") {
140
+ event.preventDefault();
141
+ setActiveIndex((prev) => (prev - 1 + count) % count);
142
+ return;
143
+ }
144
+ if (event.key === "Home") {
145
+ event.preventDefault();
146
+ setActiveIndex(0);
147
+ return;
148
+ }
149
+ if (event.key === "End") {
150
+ event.preventDefault();
151
+ setActiveIndex(count - 1);
152
+ return;
153
+ }
154
+ if (event.key === "Enter") {
155
+ event.preventDefault();
156
+ const item = filtered[Math.min(activeIndex, count - 1)];
157
+ if (!item)
158
+ return;
159
+ if (item.href) {
160
+ window.location.assign(item.href);
161
+ return;
162
+ }
163
+ commit(item);
164
+ }
165
+ };
166
+ const hasAnyVisual = items.some((item) => item.imageUrl || item.iconName || item.emoji || item.dotTone);
167
+ // ── Collapsed: one searchable dropdown ──────────────────────────────────
168
+ if (collapsed) {
169
+ return (_jsxs("div", { ref: shellRef, className: [UI_OVERFLOW_ROW.shell, className].filter(Boolean).join(" "), "data-collapsed": "true", children: [_jsxs("button", { ref: triggerRef, type: "button", className: UI_OVERFLOW_ROW.trigger, "aria-haspopup": "listbox", "aria-expanded": open, "aria-controls": open ? listboxId : undefined, "aria-label": ariaLabel, onClick: () => setOpen((prev) => !prev), onKeyDown: (event) => {
170
+ if (!open && (event.key === "ArrowDown" || event.key === "Enter")) {
171
+ event.preventDefault();
172
+ setOpen(true);
173
+ }
174
+ }, children: [activeItem ? visualOf(activeItem, "pill") : null, _jsx("span", { className: UI_OVERFLOW_ROW.triggerLabel, children: activeItem?.label ?? placeholder ?? ariaLabel }), items.length > 0 && (_jsx("span", { className: UI_OVERFLOW_ROW.count, children: items.length })), _jsx(ChevronDown, { className: "w-4 h-4", "aria-hidden": "true" })] }), open && (_jsxs("div", { className: UI_OVERFLOW_ROW.popover, children: [_jsx("div", { className: UI_OVERFLOW_ROW.search, children: _jsx(Input, { ref: searchRef, type: "search", value: query, placeholder: searchPlaceholder, "aria-label": searchPlaceholder, "aria-controls": listboxId, "aria-activedescendant": filtered[activeIndex] ? `${listboxId}-${filtered[activeIndex].id}` : undefined, icon: _jsx(Search, { className: "w-4 h-4", "aria-hidden": "true" }), onChange: (event) => {
175
+ setQuery(event.target.value);
176
+ setActiveIndex(0);
177
+ }, onKeyDown: onSearchKeyDown }) }), _jsxs("div", { id: listboxId, role: "listbox", "aria-label": ariaLabel, className: UI_OVERFLOW_ROW.list, children: [filtered.length === 0 && (_jsx("div", { className: UI_OVERFLOW_ROW.empty, children: noResultsText })), filtered.map((item, index) => {
178
+ const isSelected = item.id === activeId;
179
+ const classes = [
180
+ UI_OVERFLOW_ROW.option,
181
+ index === activeIndex ? UI_OVERFLOW_ROW.optionActive : "",
182
+ isSelected ? UI_OVERFLOW_ROW.optionSelected : "",
183
+ ]
184
+ .filter(Boolean)
185
+ .join(" ");
186
+ const body = (_jsxs(_Fragment, { children: [hasAnyVisual ? visualOf(item, "option") : null, _jsx("span", { className: UI_OVERFLOW_ROW.optionLabel, children: item.label }), typeof item.count === "number" && (_jsx("span", { className: UI_OVERFLOW_ROW.optionCount, children: item.count > 99 ? "99+" : item.count })), isSelected && (_jsx(Check, { className: `w-4 h-4 ${UI_OVERFLOW_ROW.check}`, "aria-hidden": "true" }))] }));
187
+ return item.href ? (_jsx(Link, { ...linkProps, id: `${listboxId}-${item.id}`, role: "option", "aria-selected": isSelected, href: item.href, className: classes, onMouseEnter: () => setActiveIndex(index), children: body }, item.id)) : (_jsx("button", { id: `${listboxId}-${item.id}`, role: "option", type: "button", "aria-selected": isSelected, disabled: item.disabled, className: classes, onClick: () => commit(item), onMouseEnter: () => setActiveIndex(index), children: body }, item.id));
188
+ })] })] }))] }));
189
+ }
190
+ // ── Expanded: the pill row ──────────────────────────────────────────────
191
+ return (_jsx("div", { ref: shellRef, className: [UI_OVERFLOW_ROW.shell, className].filter(Boolean).join(" "), "data-collapsed": "false", children: _jsx("div", { ref: rowRef, className: UI_OVERFLOW_ROW.row, role: variant === "tabs" ? "tablist" : undefined, "aria-label": ariaLabel, children: items.map((item) => {
192
+ const isActive = item.id === activeId;
193
+ const classes = [
194
+ UI_OVERFLOW_ROW.pill,
195
+ isActive ? UI_OVERFLOW_ROW.pillActive : "",
196
+ ]
197
+ .filter(Boolean)
198
+ .join(" ");
199
+ const body = (_jsxs(_Fragment, { children: [visualOf(item, "pill"), item.label, typeof item.count === "number" && (_jsx("span", { className: UI_OVERFLOW_ROW.count, children: item.count > 99 ? "99+" : item.count }))] }));
200
+ return item.href ? (_jsx(Link, { ...linkProps, href: item.href, className: classes, role: variant === "tabs" ? "tab" : undefined, "aria-selected": variant === "tabs" ? isActive : undefined, "aria-current": variant === "nav" && isActive ? "page" : undefined, children: body }, item.id)) : (_jsx("button", { type: "button", className: classes, role: variant === "tabs" ? "tab" : undefined, "aria-selected": variant === "tabs" ? isActive : undefined, disabled: item.disabled, onClick: () => commit(item), children: body }, item.id));
201
+ }) }) }));
202
+ }
203
+ export default OverflowRow;
@@ -0,0 +1,235 @@
1
+ /*
2
+ * OverflowRow — pill row that becomes a searchable dropdown when it overflows.
3
+ *
4
+ * All tokens live here rather than on the call site's className. The expanded
5
+ * and collapsed states are selected by `[data-collapsed]` written from JS, NOT
6
+ * by a media query: the decision is a width MEASUREMENT against the row's own
7
+ * content, which no breakpoint can express (four long labels overflow a phone;
8
+ * eight short ones fit a desktop).
9
+ *
10
+ * 🛑 Do not express the two states as Tailwind `md:`/`lg:` overrides. appkit's
11
+ * Tailwind build emits NO variant-prefixed utility (see the measured note in
12
+ * src/tailwind-input.css), so such a rule compiles to nothing and the element
13
+ * silently keeps its base style.
14
+ */
15
+
16
+ .appkit-overflow-row {
17
+ position: relative;
18
+ width: 100%;
19
+ min-width: 0;
20
+ }
21
+
22
+ /* ── Expanded ─────────────────────────────────────────────────────────── */
23
+
24
+ .appkit-overflow-row__row {
25
+ display: flex;
26
+ align-items: center;
27
+ gap: var(--appkit-space-2);
28
+ min-width: 0;
29
+ /*
30
+ * No `overflow-x: auto`. A scrollbar here would let the row satisfy its
31
+ * container at any width, so `scrollWidth` would still exceed `clientWidth`
32
+ * but nothing would ever look broken enough to collapse — the measurement
33
+ * and the visible truth must agree.
34
+ */
35
+ }
36
+
37
+ .appkit-overflow-row__pill {
38
+ display: inline-flex;
39
+ align-items: center;
40
+ flex-shrink: 0;
41
+ gap: var(--appkit-space-1-5);
42
+ padding: var(--appkit-space-1-5) var(--appkit-space-4);
43
+ border: 1px solid var(--appkit-color-border);
44
+ border-radius: var(--appkit-radius-full);
45
+ background: var(--appkit-color-surface-elevated);
46
+ color: var(--appkit-color-text-muted);
47
+ font-size: var(--appkit-text-sm);
48
+ font-weight: 500;
49
+ line-height: 1.25;
50
+ white-space: nowrap;
51
+ text-decoration: none;
52
+ transition: color var(--appkit-duration-fast) var(--appkit-ease-out),
53
+ border-color var(--appkit-duration-fast) var(--appkit-ease-out),
54
+ background-color var(--appkit-duration-fast) var(--appkit-ease-out);
55
+ }
56
+
57
+ .appkit-overflow-row__pill:hover {
58
+ border-color: var(--appkit-color-primary);
59
+ color: var(--appkit-color-primary);
60
+ }
61
+
62
+ .appkit-overflow-row__pill:disabled {
63
+ opacity: 0.5;
64
+ cursor: not-allowed;
65
+ }
66
+
67
+ .appkit-overflow-row__pill--active {
68
+ border-color: var(--appkit-color-primary);
69
+ background: var(--appkit-color-primary-surface);
70
+ color: var(--appkit-color-primary);
71
+ }
72
+
73
+ /* ── Leading visuals ──────────────────────────────────────────────────── */
74
+
75
+ /*
76
+ * Sized here rather than by Avatar's own `--xs`, which is a face-sized box.
77
+ * A pill's visual is an identifying mark at text scale: it must not grow the
78
+ * pill's line-box, or every row in the app gets taller.
79
+ */
80
+ .appkit-overflow-row__visual {
81
+ width: 1.125rem;
82
+ height: 1.125rem;
83
+ flex-shrink: 0;
84
+ font-size: var(--appkit-text-2xs);
85
+ }
86
+
87
+ .appkit-overflow-row__emoji {
88
+ line-height: 1;
89
+ flex-shrink: 0;
90
+ }
91
+
92
+ .appkit-overflow-row__dot {
93
+ width: 0.5rem;
94
+ height: 0.5rem;
95
+ border-radius: var(--appkit-radius-full);
96
+ flex-shrink: 0;
97
+ background: var(--appkit-color-text-faint);
98
+ }
99
+
100
+ .appkit-overflow-row__dot[data-tone="primary"] { background: var(--appkit-color-primary); }
101
+ .appkit-overflow-row__dot[data-tone="success"] { background: var(--appkit-color-success); }
102
+ .appkit-overflow-row__dot[data-tone="warning"] { background: var(--appkit-color-warning); }
103
+ .appkit-overflow-row__dot[data-tone="error"] { background: var(--appkit-color-error); }
104
+ .appkit-overflow-row__dot[data-tone="info"] { background: var(--appkit-color-info); }
105
+ .appkit-overflow-row__dot[data-tone="muted"] { background: var(--appkit-color-text-faint); }
106
+
107
+ /*
108
+ * `opacity` rather than a literal colour so the count stays legible on both
109
+ * the inactive (surface) and active (primary tint) pill — a fixed colour is
110
+ * invisible against one of them in some theme (Root Cause #67).
111
+ */
112
+ .appkit-overflow-row__count {
113
+ font-size: var(--appkit-text-xs);
114
+ font-variant-numeric: tabular-nums;
115
+ opacity: 0.7;
116
+ }
117
+
118
+ /* ── Collapsed trigger ────────────────────────────────────────────────── */
119
+
120
+ .appkit-overflow-row__trigger {
121
+ display: inline-flex;
122
+ align-items: center;
123
+ gap: var(--appkit-space-2);
124
+ max-width: 100%;
125
+ padding: var(--appkit-space-2) var(--appkit-space-3);
126
+ border: 1px solid var(--appkit-color-border);
127
+ border-radius: var(--appkit-radius-lg);
128
+ background: var(--appkit-color-surface-elevated);
129
+ color: var(--appkit-color-text);
130
+ font-size: var(--appkit-text-sm);
131
+ font-weight: 500;
132
+ line-height: 1.25;
133
+ cursor: pointer;
134
+ }
135
+
136
+ .appkit-overflow-row__trigger:hover {
137
+ border-color: var(--appkit-color-primary);
138
+ }
139
+
140
+ .appkit-overflow-row__trigger-label {
141
+ overflow: hidden;
142
+ text-overflow: ellipsis;
143
+ white-space: nowrap;
144
+ min-width: 0;
145
+ }
146
+
147
+ /* ── Popover ──────────────────────────────────────────────────────────── */
148
+
149
+ .appkit-overflow-row__popover {
150
+ position: absolute;
151
+ z-index: var(--appkit-z-dropdown);
152
+ top: calc(100% + var(--appkit-space-1));
153
+ left: 0;
154
+ width: min(22rem, 100%);
155
+ display: flex;
156
+ flex-direction: column;
157
+ border: 1px solid var(--appkit-color-border);
158
+ border-radius: var(--appkit-radius-lg);
159
+ background: var(--appkit-color-surface-elevated);
160
+ box-shadow: var(--appkit-shadow-lg);
161
+ overflow: hidden;
162
+ }
163
+
164
+ .appkit-overflow-row__search {
165
+ padding: var(--appkit-space-2);
166
+ border-bottom: 1px solid var(--appkit-color-border-subtle);
167
+ }
168
+
169
+ .appkit-overflow-row__list {
170
+ max-height: 18rem;
171
+ overflow-y: auto;
172
+ padding: var(--appkit-space-1);
173
+ }
174
+
175
+ .appkit-overflow-row__option {
176
+ display: flex;
177
+ align-items: center;
178
+ gap: var(--appkit-space-2);
179
+ width: 100%;
180
+ padding: var(--appkit-space-2) var(--appkit-space-2-5);
181
+ border: 0;
182
+ border-radius: var(--appkit-radius-md);
183
+ background: transparent;
184
+ color: var(--appkit-color-text);
185
+ font-size: var(--appkit-text-sm);
186
+ text-align: left;
187
+ text-decoration: none;
188
+ cursor: pointer;
189
+ }
190
+
191
+ .appkit-overflow-row__option:disabled {
192
+ opacity: 0.5;
193
+ cursor: not-allowed;
194
+ }
195
+
196
+ /*
197
+ * Hover and keyboard focus resolve to the SAME class, set from `activeIndex`
198
+ * on both `onMouseEnter` and the arrow keys — two different highlights in one
199
+ * list is what makes a combobox feel like it has two cursors.
200
+ */
201
+ .appkit-overflow-row__option--active {
202
+ background: var(--appkit-color-surface-hover);
203
+ }
204
+
205
+ .appkit-overflow-row__option--selected {
206
+ color: var(--appkit-color-primary);
207
+ font-weight: 600;
208
+ }
209
+
210
+ .appkit-overflow-row__option-label {
211
+ flex: 1 1 auto;
212
+ min-width: 0;
213
+ overflow: hidden;
214
+ text-overflow: ellipsis;
215
+ white-space: nowrap;
216
+ }
217
+
218
+ .appkit-overflow-row__option-count {
219
+ font-size: var(--appkit-text-xs);
220
+ font-variant-numeric: tabular-nums;
221
+ color: var(--appkit-color-text-muted);
222
+ flex-shrink: 0;
223
+ }
224
+
225
+ .appkit-overflow-row__check {
226
+ flex-shrink: 0;
227
+ color: var(--appkit-color-primary);
228
+ }
229
+
230
+ .appkit-overflow-row__empty {
231
+ padding: var(--appkit-space-4);
232
+ text-align: center;
233
+ font-size: var(--appkit-text-sm);
234
+ color: var(--appkit-color-text-muted);
235
+ }
@@ -1,6 +1,19 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { ActionRow, Anchor, Badge, Code, Div, Modal, Row, Stack, Text } from "../index.js";
3
+ /*
4
+ * 🛑 This was `from "../index"` — the component importing its own barrel,
5
+ * while also importing `features/media/MediaImage`. That made `ui/index.ts`
6
+ * depend on a module that depends on it, the last two-module knot in
7
+ * `audit-import-cycles`. Every symbol is one directory away.
8
+ */
9
+ import { ActionRow } from "./ActionRow.js";
10
+ import { Anchor } from "./Anchor.js";
11
+ import { Badge } from "./Badge.js";
12
+ import { Code } from "./Semantic.js";
13
+ import { Div } from "./Div.js";
14
+ import { Modal } from "./Modal.js";
15
+ import { Row, Stack } from "./Layout.js";
16
+ import { Text } from "./Typography.js";
4
17
  import { MediaImage } from "../../features/media/MediaImage.js";
5
18
  export function RecordDetailModal({ isOpen, onClose, title, badges, description, fields, items, extra, metadata, footer, }) {
6
19
  const hasMetadata = Boolean(metadata && Object.keys(metadata).length > 0);
@@ -5,7 +5,11 @@ import { createPortal } from "react-dom";
5
5
  import { MoreHorizontal } from "lucide-react";
6
6
  import { Button } from "./Button.js";
7
7
  import { Span } from "./Typography.js";
8
- import { useKeyPress } from "../../react/index.js";
8
+ // Defining modules, not the sibling barrel — Root Cause #18. `ui/index.ts` and
9
+ // `react/index.ts` re-exported into each other, which is the whole of
10
+ // `audit-import-cycles` component 1: an 18-module knot held together entirely
11
+ // by barrel hops, none of which needed the barrel.
12
+ import { useKeyPress } from "../../react/hooks/useKeyPress.js";
9
13
  export function RowActionMenu({ actions, align = "right", }) {
10
14
  const [open, setOpen] = useState(false);
11
15
  const [pos, setPos] = useState(null);