@mohasinac/appkit 4.30.18 → 4.31.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 (557) hide show
  1. package/dist/_internal/client/features/digital-code/CodeRevealPanel.js +5 -2
  2. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +3 -3
  3. package/dist/_internal/client/features/layout/useSidebarSearch.d.ts +21 -5
  4. package/dist/_internal/client/features/layout/useSidebarSearch.js +27 -6
  5. package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +23 -3
  6. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +106 -86
  7. package/dist/_internal/client/features/lottery/LotteryPullForm.d.ts +16 -5
  8. package/dist/_internal/client/features/lottery/LotteryPullForm.js +65 -40
  9. package/dist/_internal/client/features/maintenance/views/AnalysisRunnerView.js +5 -2
  10. package/dist/_internal/client/features/maintenance/views/CloudLogsListView.js +11 -3
  11. package/dist/_internal/client/hand-mode/HandModeProvider.js +2 -0
  12. package/dist/_internal/server/features/auctions/actions.js +14 -3
  13. package/dist/_internal/server/features/auctions/service.js +1 -1
  14. package/dist/_internal/server/features/auth/permissions.d.ts +2 -0
  15. package/dist/_internal/server/features/auth/permissions.js +3 -2
  16. package/dist/_internal/server/features/blog/data.js +2 -2
  17. package/dist/_internal/server/features/blog/service.js +3 -3
  18. package/dist/_internal/server/features/brands/data.js +1 -1
  19. package/dist/_internal/server/features/brands/service.js +3 -3
  20. package/dist/_internal/server/features/bundles/actions.js +6 -1
  21. package/dist/_internal/server/features/bundles/data.js +21 -4
  22. package/dist/_internal/server/features/cart/data.js +3 -1
  23. package/dist/_internal/server/features/cart/service.js +13 -2
  24. package/dist/_internal/server/features/categories/data.js +26 -6
  25. package/dist/_internal/server/features/classified/index.d.ts +0 -1
  26. package/dist/_internal/server/features/classified/index.js +0 -1
  27. package/dist/_internal/server/features/digital-code/index.d.ts +0 -1
  28. package/dist/_internal/server/features/digital-code/index.js +0 -1
  29. package/dist/_internal/server/features/events/actions.js +17 -4
  30. package/dist/_internal/server/features/events/data.js +1 -1
  31. package/dist/_internal/server/features/events/service.js +1 -1
  32. package/dist/_internal/server/features/grouped/data.js +7 -2
  33. package/dist/_internal/server/features/item-requests/data.js +1 -1
  34. package/dist/_internal/server/features/live/index.d.ts +0 -1
  35. package/dist/_internal/server/features/live/index.js +0 -1
  36. package/dist/_internal/server/features/lottery/actions.js +2 -2
  37. package/dist/_internal/server/features/lottery/data.js +1 -1
  38. package/dist/_internal/server/features/orders/actions.js +7 -7
  39. package/dist/_internal/server/features/orders/data.d.ts +1 -1
  40. package/dist/_internal/server/features/orders/data.js +14 -2
  41. package/dist/_internal/server/features/orders/service.js +1 -1
  42. package/dist/_internal/server/features/pre-orders/service.js +1 -1
  43. package/dist/_internal/server/features/prize-draws/actions.js +1 -1
  44. package/dist/_internal/server/features/products/data.js +21 -6
  45. package/dist/_internal/server/features/products/list-public.d.ts +9 -0
  46. package/dist/_internal/server/features/products/list-public.js +95 -7
  47. package/dist/_internal/server/features/products/service.js +1 -1
  48. package/dist/_internal/server/features/promotions/actions.js +1 -1
  49. package/dist/_internal/server/features/promotions/data.js +1 -1
  50. package/dist/_internal/server/features/promotions/service.js +1 -1
  51. package/dist/_internal/server/features/reviews/data.d.ts +1 -1
  52. package/dist/_internal/server/features/reviews/data.js +6 -1
  53. package/dist/_internal/server/features/reviews/og-data.js +1 -1
  54. package/dist/_internal/server/features/shared/listing-data-factory.js +7 -2
  55. package/dist/_internal/server/features/site-settings/adapters.d.ts +2 -2
  56. package/dist/_internal/server/features/site-settings/adapters.js +8 -5
  57. package/dist/_internal/server/features/stores/data.js +1 -1
  58. package/dist/_internal/server/features/sublisting-categories/data.js +1 -1
  59. package/dist/_internal/server/features/tester/visibility.d.ts +2 -1
  60. package/dist/_internal/server/features/tester/visibility.js +2 -2
  61. package/dist/_internal/server/functions/scheduled.d.ts +3 -1
  62. package/dist/_internal/server/functions/scheduled.js +27 -1
  63. package/dist/_internal/server/jobs/core/auctionSettlement.js +6 -1
  64. package/dist/_internal/server/jobs/core/hardBanCascade.js +4 -0
  65. package/dist/_internal/server/jobs/core/index.d.ts +2 -0
  66. package/dist/_internal/server/jobs/core/index.js +2 -0
  67. package/dist/_internal/server/jobs/core/onOrderStatusChange.js +7 -15
  68. package/dist/_internal/server/jobs/core/pageViewPrune.d.ts +10 -0
  69. package/dist/_internal/server/jobs/core/pageViewPrune.js +44 -0
  70. package/dist/_internal/server/jobs/core/pageViewRollup.d.ts +2 -0
  71. package/dist/_internal/server/jobs/core/pageViewRollup.js +87 -0
  72. package/dist/_internal/server/jobs/core/revenueRollup.js +7 -1
  73. package/dist/_internal/server/jobs/handlers/index.d.ts +2 -0
  74. package/dist/_internal/server/jobs/handlers/index.js +2 -0
  75. package/dist/_internal/server/jobs/handlers/pageViewPrune.d.ts +2 -0
  76. package/dist/_internal/server/jobs/handlers/pageViewPrune.js +2 -0
  77. package/dist/_internal/server/jobs/handlers/pageViewRollup.d.ts +2 -0
  78. package/dist/_internal/server/jobs/handlers/pageViewRollup.js +2 -0
  79. package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
  80. package/dist/_internal/shared/actions/action-registry.js +69 -22
  81. package/dist/_internal/shared/checkout/rules/classified.rule.d.ts +9 -4
  82. package/dist/_internal/shared/checkout/rules/classified.rule.js +7 -2
  83. package/dist/_internal/shared/features/layout/matchesNavQuery.d.ts +14 -0
  84. package/dist/_internal/shared/features/layout/matchesNavQuery.js +72 -0
  85. package/dist/_internal/shared/features/layout/types.d.ts +37 -1
  86. package/dist/_internal/shared/features/layout/types.js +19 -1
  87. package/dist/_internal/shared/features/notifications/action-url.d.ts +9 -1
  88. package/dist/_internal/shared/features/notifications/action-url.js +47 -0
  89. package/dist/_internal/shared/features/offers/config.d.ts +65 -0
  90. package/dist/_internal/shared/features/offers/config.js +73 -2
  91. package/dist/_internal/shared/features/orders/schema.d.ts +19 -1
  92. package/dist/_internal/shared/features/orders/schema.js +22 -2
  93. package/dist/_internal/shared/features/site-settings/types.d.ts +12 -3
  94. package/dist/_internal/shared/listing-types/capabilities.d.ts +8 -2
  95. package/dist/_internal/shared/listing-types/capabilities.js +6 -1
  96. package/dist/_internal/shared/listing-types/classified/ctas.js +6 -1
  97. package/dist/_internal/shared/listing-types/feature-flags.d.ts +10 -5
  98. package/dist/_internal/shared/listing-types/feature-flags.js +11 -6
  99. package/dist/client/api/useApiQuery.js +17 -6
  100. package/dist/client.d.ts +38 -20
  101. package/dist/client.js +39 -14
  102. package/dist/configs/next.js +10 -2
  103. package/dist/constants/api-endpoints.d.ts +18 -54
  104. package/dist/constants/api-endpoints.js +6 -26
  105. package/dist/constants/field-names.d.ts +6 -24
  106. package/dist/constants/field-names.js +10 -27
  107. package/dist/constants/geo/countries.d.ts +50 -0
  108. package/dist/constants/geo/countries.js +129 -0
  109. package/dist/constants/geo/subdivisions.d.ts +13 -0
  110. package/dist/constants/geo/subdivisions.js +104 -0
  111. package/dist/constants/index.d.ts +2 -2
  112. package/dist/constants/index.js +2 -2
  113. package/dist/constants/table-keys.d.ts +24 -0
  114. package/dist/constants/table-keys.js +28 -0
  115. package/dist/contracts/client-realtime.d.ts +6 -0
  116. package/dist/contracts/extend.d.ts +0 -9
  117. package/dist/contracts/index.d.ts +1 -1
  118. package/dist/contracts/realtime-session.d.ts +12 -12
  119. package/dist/contracts/realtime-session.js +79 -77
  120. package/dist/core/browser.d.ts +1 -1
  121. package/dist/core/browser.js +1 -1
  122. package/dist/core/index.d.ts +1 -1
  123. package/dist/core/index.js +1 -1
  124. package/dist/core/site-config.d.ts +0 -3
  125. package/dist/core/site-config.js +0 -3
  126. package/dist/errors/index.d.ts +1 -1
  127. package/dist/errors/index.js +1 -1
  128. package/dist/errors/messages.d.ts +0 -8
  129. package/dist/errors/messages.js +0 -9
  130. package/dist/features/about/components/DeveloperView.js +7 -2
  131. package/dist/features/about/components/PolicyPageView.js +9 -1
  132. package/dist/features/about/components/PublicProfileView.js +23 -5
  133. package/dist/features/about/schemas/index.d.ts +8 -8
  134. package/dist/features/account/components/AddressFilters.js +32 -11
  135. package/dist/features/account/components/AddressForm.d.ts +26 -25
  136. package/dist/features/account/components/AddressForm.js +81 -103
  137. package/dist/features/account/components/AddressesIndexListing.js +8 -4
  138. package/dist/features/account/components/NotificationBell.js +4 -3
  139. package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
  140. package/dist/features/account/components/UserOffersPanel.js +1 -1
  141. package/dist/features/account/components/UserSidebar.d.ts +3 -4
  142. package/dist/features/account/components/UserSupportView.js +89 -58
  143. package/dist/features/account/components/index.d.ts +1 -7
  144. package/dist/features/account/components/index.js +0 -3
  145. package/dist/features/account/hooks/useAddresses.d.ts +4 -3
  146. package/dist/features/account/hooks/useAddresses.js +4 -6
  147. package/dist/features/account/hooks/useCollapsedSections.d.ts +51 -10
  148. package/dist/features/account/hooks/useCollapsedSections.js +211 -38
  149. package/dist/features/account/hooks/useProfile.d.ts +8 -0
  150. package/dist/features/account/index.d.ts +0 -3
  151. package/dist/features/account/index.js +0 -3
  152. package/dist/features/account/schemas/index.d.ts +0 -92
  153. package/dist/features/account/schemas/index.js +42 -20
  154. package/dist/features/addresses/components/AddressLocationFields.d.ts +13 -0
  155. package/dist/features/addresses/components/AddressLocationFields.js +41 -0
  156. package/dist/features/addresses/hooks/usePostalLookup.d.ts +17 -0
  157. package/dist/features/addresses/hooks/usePostalLookup.js +133 -0
  158. package/dist/features/addresses/schemas/address-form.d.ts +423 -0
  159. package/dist/features/addresses/schemas/address-form.js +212 -0
  160. package/dist/features/addresses/schemas/index.d.ts +1 -0
  161. package/dist/features/addresses/schemas/index.js +8 -0
  162. package/dist/features/admin/actions/admin-read-actions.d.ts +1 -1
  163. package/dist/features/admin/actions/index.d.ts +0 -1
  164. package/dist/features/admin/actions/index.js +0 -1
  165. package/dist/features/admin/actions/notification-actions.js +1 -41
  166. package/dist/features/admin/components/AdminActionIndexView.d.ts +32 -0
  167. package/dist/features/admin/components/AdminActionIndexView.js +128 -0
  168. package/dist/features/admin/components/AdminAdEditorView.js +159 -163
  169. package/dist/features/admin/components/AdminAddressEditorView.js +97 -55
  170. package/dist/features/admin/components/AdminBrandEditorView.d.ts +15 -0
  171. package/dist/features/admin/components/AdminBrandEditorView.js +113 -77
  172. package/dist/features/admin/components/AdminBundleEditorView.d.ts +19 -9
  173. package/dist/features/admin/components/AdminBundleEditorView.js +136 -168
  174. package/dist/features/admin/components/AdminCategoryEditorView.js +120 -43
  175. package/dist/features/admin/components/AdminCouponEditorView.js +145 -109
  176. package/dist/features/admin/components/AdminEmployeeEditorView.js +125 -56
  177. package/dist/features/admin/components/AdminFaqEditorView.js +112 -58
  178. package/dist/features/admin/components/AdminFeatureEditorView.js +108 -68
  179. package/dist/features/admin/components/AdminFulfillmentView.js +5 -2
  180. package/dist/features/admin/components/AdminMediaView.js +3 -3
  181. package/dist/features/admin/components/AdminNavEditorView.js +69 -44
  182. package/dist/features/admin/components/AdminOrderEditorView.js +47 -10
  183. package/dist/features/admin/components/AdminPrizeDrawsView.js +16 -2
  184. package/dist/features/admin/components/AdminSidebar.d.ts +11 -7
  185. package/dist/features/admin/components/AdminSiteSettingsView.js +37 -37
  186. package/dist/features/admin/components/AdminStoreEditorView.js +75 -52
  187. package/dist/features/admin/components/AdminSublistingCategoryEditorView.js +71 -30
  188. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +95 -65
  189. package/dist/features/admin/components/BrandQuickCreateForm.d.ts +10 -0
  190. package/dist/features/admin/components/BrandQuickCreateForm.js +49 -26
  191. package/dist/features/admin/components/CategoryQuickCreateForm.d.ts +11 -0
  192. package/dist/features/admin/components/CategoryQuickCreateForm.js +48 -26
  193. package/dist/features/admin/components/index.d.ts +2 -2
  194. package/dist/features/admin/components/index.js +1 -1
  195. package/dist/features/admin/constants/site-settings-tabs.d.ts +120 -0
  196. package/dist/features/admin/constants/site-settings-tabs.js +152 -0
  197. package/dist/features/admin/index.d.ts +0 -3
  198. package/dist/features/admin/index.js +0 -2
  199. package/dist/features/admin/repository/analytics-rollup.repository.d.ts +35 -0
  200. package/dist/features/admin/repository/analytics-rollup.repository.js +30 -0
  201. package/dist/features/admin/schemas/admin-editor-forms.d.ts +56 -57
  202. package/dist/features/admin/schemas/admin-editor-forms.js +97 -54
  203. package/dist/features/admin/schemas/admin-ops-forms.d.ts +57 -5
  204. package/dist/features/admin/schemas/admin-ops-forms.js +104 -20
  205. package/dist/features/admin/schemas/admin-user-form.js +7 -0
  206. package/dist/features/admin/schemas/firestore.d.ts +48 -95
  207. package/dist/features/admin/schemas/firestore.js +15 -151
  208. package/dist/features/admin/schemas/nav-item-form.js +9 -2
  209. package/dist/features/admin/server.d.ts +0 -4
  210. package/dist/features/admin/server.js +0 -2
  211. package/dist/features/admin/types/index.d.ts +0 -7
  212. package/dist/features/analytics/repository/page-views.repository.d.ts +14 -0
  213. package/dist/features/analytics/repository/page-views.repository.js +24 -0
  214. package/dist/features/analytics/types.d.ts +1 -1
  215. package/dist/features/analytics/types.js +13 -0
  216. package/dist/features/auctions/components/AuctionDetailPageView.js +6 -2
  217. package/dist/features/auctions/components/MarketplaceAuctionCard.js +3 -1
  218. package/dist/features/auth/actions/index.d.ts +0 -1
  219. package/dist/features/auth/actions/index.js +0 -1
  220. package/dist/features/auth/actions/profile-actions.js +4 -3
  221. package/dist/features/auth/actions/realtime-token-actions.js +1 -12
  222. package/dist/features/auth/auth-helpers.js +5 -7
  223. package/dist/features/auth/components/ForgotPasswordView.js +1 -1
  224. package/dist/features/auth/components/Guards.js +2 -1
  225. package/dist/features/auth/components/LoginForm.d.ts +0 -2
  226. package/dist/features/auth/components/LoginForm.js +2 -4
  227. package/dist/features/auth/components/RegisterForm.js +62 -19
  228. package/dist/features/auth/components/ResetPasswordView.js +1 -1
  229. package/dist/features/auth/hooks/useAuth.js +3 -0
  230. package/dist/features/auth/permissions/constants.d.ts +27 -1
  231. package/dist/features/auth/role-predicates.d.ts +75 -7
  232. package/dist/features/auth/role-predicates.js +28 -2
  233. package/dist/features/auth/schemas/firestore.d.ts +22 -0
  234. package/dist/features/auth/schemas/index.d.ts +1 -1
  235. package/dist/features/auth/schemas/index.js +44 -8
  236. package/dist/features/auth/types/index.d.ts +14 -1
  237. package/dist/features/blog/api/route.js +10 -2
  238. package/dist/features/blog/components/BlogIndexListing.js +1 -1
  239. package/dist/features/blog/hooks/useBlog.js +2 -2
  240. package/dist/features/blog/repository/blog.repository.js +3 -1
  241. package/dist/features/blog/schemas/index.d.ts +4 -0
  242. package/dist/features/blog/schemas/index.js +2 -0
  243. package/dist/features/blog/types/index.d.ts +1 -1
  244. package/dist/features/cart/actions/cart-actions.js +13 -4
  245. package/dist/features/cart/utils/pending-ops.js +1 -1
  246. package/dist/features/catalogue/components/CatalogueItemEditorView.d.ts +22 -0
  247. package/dist/features/catalogue/components/CatalogueItemEditorView.js +112 -52
  248. package/dist/features/catalogue/schemas/validation.d.ts +4 -4
  249. package/dist/features/catalogue/schemas/validation.js +47 -10
  250. package/dist/features/categories/components/BrandDetailPageView.js +28 -12
  251. package/dist/features/categories/components/CategoryDetailPageView.js +37 -20
  252. package/dist/features/categories/repository/categories.repository.js +3 -1
  253. package/dist/features/categories/schemas/bundle-form.d.ts +142 -0
  254. package/dist/features/categories/schemas/bundle-form.js +149 -0
  255. package/dist/features/checkout/actions/checkout-value-otp-actions.js +10 -1
  256. package/dist/features/classified/components/ClassifiedContactSellerPanel.js +1 -1
  257. package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +5 -4
  258. package/dist/features/classified/components/ClassifiedDetailPageView.js +47 -18
  259. package/dist/features/consultation/components/ConsultationForm.js +1 -1
  260. package/dist/features/consultation/schemas/index.js +34 -10
  261. package/dist/features/corporate/schemas/index.js +36 -15
  262. package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +4 -1
  263. package/dist/features/events/components/EventBanner.js +5 -2
  264. package/dist/features/events/components/EventOfferCard.js +3 -1
  265. package/dist/features/events/components/EventPollWidget.js +1 -1
  266. package/dist/features/events/components/SpinWheelView.js +3 -2
  267. package/dist/features/filters/FilterPanel.js +3 -3
  268. package/dist/features/filters/RangeFilter.d.ts +10 -0
  269. package/dist/features/filters/RangeFilter.js +41 -4
  270. package/dist/features/grouped/components/GroupedListingEditorView.js +2 -1
  271. package/dist/features/history/hooks/useHistory.js +29 -27
  272. package/dist/features/homepage/components/AdSlot.js +3 -1
  273. package/dist/features/homepage/components/GoogleReviewsSection.js +8 -2
  274. package/dist/features/homepage/components/MarketplaceHomepageView.js +58 -15
  275. package/dist/features/homepage/components/SocialFeedSection.js +4 -1
  276. package/dist/features/homepage/hooks/useBlogArticles.js +1 -1
  277. package/dist/features/homepage/lib/live-stats.js +8 -1
  278. package/dist/features/homepage/repository/carousel.repository.js +2 -1
  279. package/dist/features/layout/BottomActions.js +84 -11
  280. package/dist/features/layout/BottomActionsContext.d.ts +1 -6
  281. package/dist/features/layout/BottomActionsContext.js +1 -1
  282. package/dist/features/layout/hooks/useBottomActions.js +2 -2
  283. package/dist/features/layout/hooks/useFormBottomActions.d.ts +12 -1
  284. package/dist/features/layout/hooks/useFormBottomActions.js +12 -6
  285. package/dist/features/live/components/LiveItemDetailPageView.js +4 -1
  286. package/dist/features/lottery/schemas/config-write.d.ts +9 -5
  287. package/dist/features/lottery/schemas/config-write.js +69 -9
  288. package/dist/features/media/finalize.js +3 -1
  289. package/dist/features/media/modals/ImageEditor.js +1 -1
  290. package/dist/features/media/modals/VideoThumbnailSelector.js +5 -2
  291. package/dist/features/media/modals/VideoTrimModal.js +5 -2
  292. package/dist/features/media/upload/MediaUploadField.js +2 -2
  293. package/dist/features/messages/hooks/useConversation.js +18 -4
  294. package/dist/features/messages/hooks/useConversations.js +25 -8
  295. package/dist/features/orders/components/RefundRequestView.js +5 -2
  296. package/dist/features/orders/schemas/buyer-forms.d.ts +6 -3
  297. package/dist/features/orders/schemas/buyer-forms.js +31 -3
  298. package/dist/features/orders/schemas/index.d.ts +2 -2
  299. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +3 -1
  300. package/dist/features/pre-orders/components/PreOrderActionsClient.js +1 -1
  301. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +4 -1
  302. package/dist/features/products/components/GroupSettingsPanel.js +3 -1
  303. package/dist/features/products/components/MakeOfferButton.d.ts +13 -2
  304. package/dist/features/products/components/MakeOfferButton.js +33 -11
  305. package/dist/features/products/components/PrizeDrawDetailPageView.js +4 -1
  306. package/dist/features/products/components/ProductDetailActions.js +0 -1
  307. package/dist/features/products/components/ProductDetailPageView.d.ts +7 -3
  308. package/dist/features/products/components/ProductDetailPageView.js +16 -7
  309. package/dist/features/products/components/ShareButton.js +3 -1
  310. package/dist/features/products/constants/action-defs.d.ts +1 -2
  311. package/dist/features/products/constants/action-defs.js +40 -43
  312. package/dist/features/products/repository/loadProductFeatures.js +10 -2
  313. package/dist/features/products/repository/products.repository.d.ts +5 -1
  314. package/dist/features/products/repository/products.repository.js +25 -2
  315. package/dist/features/products/schemas/firestore.d.ts +7 -3
  316. package/dist/features/products/schemas/product-features.validators.js +3 -0
  317. package/dist/features/promotions/components/CouponCard.js +11 -8
  318. package/dist/features/reviews/actions/review-actions.js +8 -1
  319. package/dist/features/reviews/components/ReviewDetailPageView.js +13 -3
  320. package/dist/features/reviews/components/ReviewDetailShell.js +3 -1
  321. package/dist/features/scams/actions/scam-actions.d.ts +9 -1
  322. package/dist/features/scams/actions/scam-actions.js +52 -12
  323. package/dist/features/scams/components/SellerTrustBadge.d.ts +1 -1
  324. package/dist/features/scams/components/SellerTrustBadge.js +13 -0
  325. package/dist/features/scams/repository/scammer.repository.js +2 -1
  326. package/dist/features/scams/schemas/firestore.d.ts +15 -1
  327. package/dist/features/scams/schemas/report-form.d.ts +5 -5
  328. package/dist/features/scams/schemas/report-form.js +18 -3
  329. package/dist/features/search/action-index/derive.d.ts +49 -0
  330. package/dist/features/search/action-index/derive.js +121 -0
  331. package/dist/features/search/action-index/repository.d.ts +42 -0
  332. package/dist/features/search/action-index/repository.js +100 -0
  333. package/dist/features/search/action-index/settings-entries.d.ts +41 -0
  334. package/dist/features/search/action-index/settings-entries.js +268 -0
  335. package/dist/features/search/action-index/types.d.ts +81 -0
  336. package/dist/features/search/action-index/types.js +102 -0
  337. package/dist/features/search/action-index/validate-entry.d.ts +34 -0
  338. package/dist/features/search/action-index/validate-entry.js +114 -0
  339. package/dist/features/search/hooks/useNavSuggestions.d.ts +5 -1
  340. package/dist/features/search/hooks/useNavSuggestions.js +23 -3
  341. package/dist/features/search/repository/search.repository.js +3 -1
  342. package/dist/features/seller/actions/offer-actions.js +43 -19
  343. package/dist/features/seller/actions/seller-actions.js +29 -5
  344. package/dist/features/seller/components/CategoryChipPicker.d.ts +9 -0
  345. package/dist/features/seller/components/CategoryChipPicker.js +12 -0
  346. package/dist/features/seller/components/FulfillmentView.js +5 -2
  347. package/dist/features/seller/components/PhysicalLocationModal.js +1 -1
  348. package/dist/features/seller/components/PrintCenterView.js +3 -1
  349. package/dist/features/seller/components/SellerAddressesView.js +5 -1
  350. package/dist/features/seller/components/SellerAnalyticsAlertsView.js +83 -43
  351. package/dist/features/seller/components/SellerArtView.d.ts +14 -7
  352. package/dist/features/seller/components/SellerArtView.js +4 -119
  353. package/dist/features/seller/components/SellerBidsView.js +1 -1
  354. package/dist/features/seller/components/SellerClassifiedView.d.ts +14 -7
  355. package/dist/features/seller/components/SellerClassifiedView.js +4 -124
  356. package/dist/features/seller/components/SellerCouponEditorView.d.ts +22 -1
  357. package/dist/features/seller/components/SellerCouponEditorView.js +91 -45
  358. package/dist/features/seller/components/SellerCouponsView.js +1 -1
  359. package/dist/features/seller/components/SellerDigitalCodesView.d.ts +14 -7
  360. package/dist/features/seller/components/SellerDigitalCodesView.js +4 -126
  361. package/dist/features/seller/components/SellerGoogleReviewsView.js +2 -2
  362. package/dist/features/seller/components/SellerListingTypeView.d.ts +66 -0
  363. package/dist/features/seller/components/SellerListingTypeView.js +277 -0
  364. package/dist/features/seller/components/SellerLiveView.d.ts +14 -7
  365. package/dist/features/seller/components/SellerLiveView.js +4 -126
  366. package/dist/features/seller/components/SellerOrdersView.js +3 -3
  367. package/dist/features/seller/components/SellerPayoutMethodsView.js +2 -2
  368. package/dist/features/seller/components/SellerProductShell.d.ts +5 -0
  369. package/dist/features/seller/components/SellerProductShell.js +15 -5
  370. package/dist/features/seller/components/SellerProductsView.js +24 -10
  371. package/dist/features/seller/components/SellerReviewsView.js +47 -16
  372. package/dist/features/seller/components/SellerShippingConfigsView.js +5 -4
  373. package/dist/features/seller/components/SellerSidebar.d.ts +3 -6
  374. package/dist/features/seller/components/SellerStickersView.d.ts +14 -7
  375. package/dist/features/seller/components/SellerStickersView.js +4 -119
  376. package/dist/features/seller/components/SellerStoreCategoriesView.js +3 -2
  377. package/dist/features/seller/components/SellerSupportView.d.ts +31 -0
  378. package/dist/features/seller/components/SellerSupportView.js +100 -0
  379. package/dist/features/seller/components/index.d.ts +4 -8
  380. package/dist/features/seller/components/index.js +2 -4
  381. package/dist/features/seller/index.d.ts +0 -1
  382. package/dist/features/seller/index.js +0 -1
  383. package/dist/features/seller/schemas/coupon-form.d.ts +214 -0
  384. package/dist/features/seller/schemas/coupon-form.js +155 -23
  385. package/dist/features/seller/schemas/offer-forms.d.ts +16 -7
  386. package/dist/features/seller/schemas/offer-forms.js +28 -12
  387. package/dist/features/shell/FormShell.js +2 -2
  388. package/dist/features/shell/QuickFormDrawer.js +2 -2
  389. package/dist/features/shell/SectionForm.d.ts +19 -1
  390. package/dist/features/shell/SectionForm.js +104 -17
  391. package/dist/features/shell/build-sections.d.ts +23 -0
  392. package/dist/features/shell/build-sections.js +106 -8
  393. package/dist/features/shell/field-ui-meta.d.ts +44 -0
  394. package/dist/features/shell/field-ui-meta.js +14 -7
  395. package/dist/features/shell/form-sections.d.ts +46 -0
  396. package/dist/features/shell/form-sections.js +114 -0
  397. package/dist/features/shipments/components/AdminShipmentEditorView.js +87 -64
  398. package/dist/features/shipments/schemas/validation.d.ts +2 -2
  399. package/dist/features/shipments/schemas/validation.js +44 -13
  400. package/dist/features/store-extensions/schemas/custom-role-form.js +6 -2
  401. package/dist/features/store-extensions/schemas/listing-template-form.d.ts +7 -7
  402. package/dist/features/store-extensions/schemas/payout-method-form.js +14 -0
  403. package/dist/features/stores/actions/store-query-actions.js +3 -2
  404. package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -1
  405. package/dist/features/stores/api/[storeSlug]/products/route.js +3 -1
  406. package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
  407. package/dist/features/stores/components/StoreDetailLayoutView.js +12 -3
  408. package/dist/features/support/repository/support.repository.d.ts +21 -0
  409. package/dist/features/support/repository/support.repository.js +63 -0
  410. package/dist/features/support/schemas/firestore.d.ts +27 -2
  411. package/dist/features/support/schemas/firestore.js +2 -0
  412. package/dist/features/support/schemas/ticket-create-form.js +7 -0
  413. package/dist/features/tester/schemas/checklist-item-form.d.ts +43 -0
  414. package/dist/features/tester/schemas/checklist-item-form.js +109 -0
  415. package/dist/features/tester/seed-data/blog-tester-seed-data.js +2 -2
  416. package/dist/features/tester/seed-data/categories-tester-seed-data.js +2 -2
  417. package/dist/features/tester/seed-data/events-tester-seed-data.js +5 -5
  418. package/dist/features/tester/seed-data/orders-tester-seed-data.js +2 -2
  419. package/dist/features/tester/seed-data/products-tester-seed-data.js +48 -49
  420. package/dist/features/tester/seed-data/stores-tester-seed-data.js +3 -3
  421. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +291 -30
  422. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +51 -14
  423. package/dist/features/wishlist/hooks/useWishlistToggle.js +8 -1
  424. package/dist/http/api-handler.js +2 -1
  425. package/dist/index.d.ts +25 -104
  426. package/dist/index.js +38 -143
  427. package/dist/jobs.d.ts +1 -1
  428. package/dist/jobs.js +1 -1
  429. package/dist/monitoring/browser.d.ts +0 -2
  430. package/dist/monitoring/browser.js +12 -1
  431. package/dist/monitoring/index.d.ts +0 -2
  432. package/dist/monitoring/index.js +0 -1
  433. package/dist/next/api/routeHandler.js +9 -4
  434. package/dist/next/index.d.ts +1 -2
  435. package/dist/next/index.js +0 -1
  436. package/dist/next/middleware/index.d.ts +0 -2
  437. package/dist/next/middleware/index.js +0 -1
  438. package/dist/next/routing/route-map.d.ts +8 -7
  439. package/dist/next/routing/route-map.js +10 -3
  440. package/dist/providers/auth-firebase/session.js +3 -1
  441. package/dist/providers/db-firebase/admin-app-lite.js +8 -8
  442. package/dist/providers/db-firebase/admin.js +27 -13
  443. package/dist/providers/db-firebase/browser-stub.d.ts +1 -11
  444. package/dist/providers/db-firebase/browser-stub.js +6 -11
  445. package/dist/providers/db-firebase/index.d.ts +0 -1
  446. package/dist/providers/db-firebase/index.js +0 -1
  447. package/dist/providers/db-firebase/rtdb-paths.d.ts +15 -6
  448. package/dist/providers/db-firebase/rtdb-paths.js +15 -6
  449. package/dist/providers/db-firebase/rtdb-url.d.ts +27 -0
  450. package/dist/providers/db-firebase/rtdb-url.js +50 -0
  451. package/dist/providers/db-firebase/sieve.d.ts +22 -0
  452. package/dist/providers/firebase-client/realtime.d.ts +20 -0
  453. package/dist/providers/firebase-client/realtime.js +34 -1
  454. package/dist/providers.d.ts +1 -1
  455. package/dist/providers.js +1 -1
  456. package/dist/react/hooks/use-action-dispatch.js +8 -2
  457. package/dist/react/hooks/useFormStatePreservation.js +3 -1
  458. package/dist/react/hooks/useListingTypeFlags.d.ts +1 -1
  459. package/dist/react/hooks/useListingTypeFlags.js +1 -1
  460. package/dist/react/hooks/usePendingFilters.js +5 -3
  461. package/dist/react/hooks/usePendingTable.js +15 -3
  462. package/dist/react/hooks/useRealtimeEvent.js +20 -9
  463. package/dist/repositories/index.d.ts +0 -1
  464. package/dist/repositories/index.js +0 -1
  465. package/dist/schemas/registry.d.ts +197 -232
  466. package/dist/schemas/registry.js +5 -6
  467. package/dist/schemas/webhooks/razorpay.d.ts +50 -50
  468. package/dist/security/authorization.d.ts +9 -0
  469. package/dist/security/authorization.js +16 -2
  470. package/dist/security/browser.d.ts +1 -3
  471. package/dist/security/browser.js +5 -2
  472. package/dist/security/index.d.ts +1 -3
  473. package/dist/security/index.js +19 -2
  474. package/dist/security/pii-encrypt.js +16 -0
  475. package/dist/security/pii-schemas.d.ts +0 -14
  476. package/dist/security/pii-schemas.js +7 -15
  477. package/dist/seed/_helpers/category-forest.js +2 -2
  478. package/dist/seed/_helpers/media.d.ts +19 -0
  479. package/dist/seed/_helpers/media.js +75 -0
  480. package/dist/seed/blog-posts-seed-data.js +17 -17
  481. package/dist/seed/carousel-slides-seed-data.js +7 -7
  482. package/dist/seed/cart-seed-data.js +13 -13
  483. package/dist/seed/categories-seed-data.js +10 -10
  484. package/dist/seed/events-seed-data.js +24 -24
  485. package/dist/seed/factories/product.factory.js +4 -4
  486. package/dist/seed/factories/store.factory.js +3 -3
  487. package/dist/seed/factories/user.factory.js +2 -2
  488. package/dist/seed/grouped-listings-seed-data.js +11 -11
  489. package/dist/seed/homepage-sections-seed-data.js +2 -2
  490. package/dist/seed/index.d.ts +0 -1
  491. package/dist/seed/index.js +0 -1
  492. package/dist/seed/manifest.d.ts +1 -1
  493. package/dist/seed/manifest.js +0 -5
  494. package/dist/seed/notifications-seed-data.js +20 -1
  495. package/dist/seed/orders-seed-data.js +2 -2
  496. package/dist/seed/products-art-seed-data.js +16 -16
  497. package/dist/seed/products-auctions-seed-data.js +34 -34
  498. package/dist/seed/products-classifieds-seed-data.js +35 -37
  499. package/dist/seed/products-digital-codes-seed-data.js +20 -20
  500. package/dist/seed/products-live-items-seed-data.js +11 -11
  501. package/dist/seed/products-preorders-seed-data.js +13 -13
  502. package/dist/seed/products-prize-draws-seed-data.js +43 -43
  503. package/dist/seed/products-standard-seed-data.js +54 -54
  504. package/dist/seed/products-stickers-seed-data.js +15 -15
  505. package/dist/seed/reviews-seed-data.js +4 -4
  506. package/dist/seed/scammers-seed-data.js +3 -3
  507. package/dist/seed/site-settings-seed-data.js +11 -24
  508. package/dist/seed/store-extensions-seed-data.js +10 -10
  509. package/dist/seed/stores-seed-data.js +11 -11
  510. package/dist/seed/support-tickets-seed-data.d.ts +14 -0
  511. package/dist/seed/support-tickets-seed-data.js +20 -1
  512. package/dist/seed/users-seed-data.js +20 -20
  513. package/dist/server-entry.d.ts +0 -1
  514. package/dist/server-entry.js +0 -1
  515. package/dist/server.d.ts +9 -6
  516. package/dist/server.js +7 -13
  517. package/dist/styles.css +248 -68
  518. package/dist/tailwind-utilities.css +1 -1
  519. package/dist/tokens/themes/default-dark.js +2 -2
  520. package/dist/tokens/themes/default-light.js +2 -2
  521. package/dist/tokens/tokens.css +24 -4
  522. package/dist/ui/components/ActionRow.d.ts +50 -0
  523. package/dist/ui/components/ActionRow.js +53 -0
  524. package/dist/ui/components/ActionRow.style.css +145 -0
  525. package/dist/ui/components/Drawer.d.ts +10 -0
  526. package/dist/ui/components/Drawer.js +2 -1
  527. package/dist/ui/components/FilterDrawer.js +4 -1
  528. package/dist/ui/components/FilterDrawer.style.css +6 -12
  529. package/dist/ui/components/FormActionBar.js +14 -1
  530. package/dist/ui/components/FormActionBar.style.css +12 -11
  531. package/dist/ui/components/ListingLayout.js +8 -1
  532. package/dist/ui/components/ListingLayout.style.css +6 -13
  533. package/dist/ui/components/Modal.d.ts +15 -1
  534. package/dist/ui/components/Modal.js +17 -3
  535. package/dist/ui/components/QuickCreateModal.js +2 -2
  536. package/dist/ui/components/QuickCreateModal.style.css +78 -84
  537. package/dist/ui/components/RecordDetailModal.js +2 -2
  538. package/dist/ui/components/SideDrawer.d.ts +8 -0
  539. package/dist/ui/components/SideDrawer.js +2 -1
  540. package/dist/ui/components/SideDrawer.style.css +6 -3
  541. package/dist/ui/components/SideModal.d.ts +11 -1
  542. package/dist/ui/components/SideModal.js +3 -2
  543. package/dist/ui/components/SideModal.style.css +14 -0
  544. package/dist/ui/components/Typography.style.css +33 -24
  545. package/dist/ui/components/index.style.css +1 -0
  546. package/dist/ui/components/toolbar-collapse.js +1 -2
  547. package/dist/ui/forms/FormShell.style.css +260 -311
  548. package/dist/ui/index.d.ts +2 -0
  549. package/dist/ui/index.js +1 -0
  550. package/dist/utils/index.d.ts +0 -1
  551. package/dist/utils/index.js +0 -1
  552. package/dist/validation/index.d.ts +1 -1
  553. package/dist/validation/index.js +1 -1
  554. package/dist/validation/schemas.d.ts +0 -19
  555. package/dist/validation/schemas.js +8 -19
  556. package/package.json +1 -1
  557. package/scripts/seed-cli.mjs +3 -6
@@ -52,8 +52,8 @@ export const DEFAULT_DARK_THEME = {
52
52
  "appkit-color-border": "#334155",
53
53
  "appkit-color-border-subtle": "rgba(30, 41, 59, 0.6)",
54
54
  "appkit-color-text": "#fafafa",
55
- "appkit-color-text-muted": "#a1a1aa",
56
- "appkit-color-text-faint": "#71717a",
55
+ "appkit-color-text-muted": "#b4b4bd",
56
+ "appkit-color-text-faint": "#8b8b94",
57
57
  "appkit-color-success": "#34d399",
58
58
  "appkit-color-success-surface": "rgba(6, 78, 59, 0.25)",
59
59
  "appkit-color-warning": "#fbbf24",
@@ -54,8 +54,8 @@ export const DEFAULT_LIGHT_THEME = {
54
54
  "appkit-color-border": "#e4e4e7",
55
55
  "appkit-color-border-subtle": "#f4f4f5",
56
56
  "appkit-color-text": "#18181b",
57
- "appkit-color-text-muted": "#71717a",
58
- "appkit-color-text-faint": "#87878f",
57
+ "appkit-color-text-muted": "#5b5b63",
58
+ "appkit-color-text-faint": "#6f6f78",
59
59
  "appkit-color-text-on-primary": "#ffffff",
60
60
  "appkit-color-success": "#15803d",
61
61
  "appkit-color-success-surface": "#f0fdf4",
@@ -287,8 +287,8 @@
287
287
  --appkit-color-border-subtle: #f4f4f5; /* zinc-100 */
288
288
 
289
289
  --appkit-color-text: #18181b; /* zinc-900 */
290
- --appkit-color-text-muted: #71717a; /* zinc-500 */
291
- --appkit-color-text-faint: #87878f; /* zinc-400 darkened for WCAG AA large-text 3:1 on --appkit-color-bg (audit-a11y) */
290
+ --appkit-color-text-muted: #5b5b63; /* darkened from zinc-500 #71717a — ~7:1 on --appkit-color-bg */
291
+ --appkit-color-text-faint: #6f6f78; /* darkened from #87878f — now clears WCAG AA 4.5:1 for NORMAL text, not just large (audit-a11y) */
292
292
  --appkit-color-text-on-primary: #ffffff;
293
293
  --appkit-color-text-on-dark: #ffffff;
294
294
 
@@ -429,8 +429,8 @@
429
429
  --appkit-color-border-subtle: rgba(30, 41, 59, 0.6); /* slate-800/60 */
430
430
 
431
431
  --appkit-color-text: #fafafa; /* zinc-50 */
432
- --appkit-color-text-muted: #a1a1aa; /* zinc-400 */
433
- --appkit-color-text-faint: #71717a; /* zinc-500 */
432
+ --appkit-color-text-muted: #b4b4bd; /* lightened from zinc-400 #a1a1aa — ~9:1 on the dark page */
433
+ --appkit-color-text-faint: #8b8b94; /* lightened from zinc-500 #71717a, which was ~3:1 and read as barely present */
434
434
 
435
435
  --appkit-color-success: #34d399; /* emerald-400 */
436
436
  --appkit-color-success-surface: rgba(6, 78, 59, 0.25);
@@ -748,6 +748,26 @@
748
748
  --appkit-size-input-md: 2.5rem; /* 40px */
749
749
  --appkit-size-input-lg: 2.75rem; /* 44px */
750
750
 
751
+ /*
752
+ * CTA sizing — consumed by ActionRow (appkit/src/ui/components/ActionRow.style.css).
753
+ *
754
+ * --appkit-size-action-min is the width below which an action WRAPS to the
755
+ * next line instead of being squeezed. 7.5rem is fixed from both ends:
756
+ * upper — the narrowest supported viewport is 280px; the pinned bottom bar
757
+ * spends 12px padding a side plus an 8px gap, leaving 248px for two
758
+ * actions, i.e. 124px each. 120px is the largest 8px-grid value that
759
+ * still lets a two-action bar share one line there.
760
+ * lower — 120px is 2.7x the 44px tap-target minimum and holds ~15 characters
761
+ * at 14px, so every CTA string resolves in at most two lines.
762
+ *
763
+ * SINGLE_ROW_MAX_ACTIONS in features/layout/BottomActions.tsx is COUPLED to
764
+ * this value. Raising either without re-checking that
765
+ * 2 x action-min + gap is under 280px reintroduces device-dependent row
766
+ * flipping, which the bar's row-count invariant forbids.
767
+ */
768
+ --appkit-size-action-min: 7.5rem; /* 120px */
769
+ --appkit-size-action-height: 2.5rem; /* 40px — CTA tap target, was a literal h-10 */
770
+
751
771
  /* Avatar sizes */
752
772
  --appkit-size-avatar-xs: 1.5rem; /* 24px */
753
773
  --appkit-size-avatar-sm: 2rem; /* 32px */
@@ -0,0 +1,50 @@
1
+ import React from "react";
2
+ import type { SurfaceProps } from "./surface-tokens";
3
+ /**
4
+ * Who absorbs the leftover width.
5
+ *
6
+ * The BASIS is content-proportional in all three — only the grow factor
7
+ * differs. `fill` is for bars and sheets, `end`/`start` for desktop dialog and
8
+ * editor footers where stretching two buttons across a 32rem dialog would read
9
+ * as a banner rather than a pair of controls.
10
+ */
11
+ export type ActionRowAlign = "fill" | "end" | "start";
12
+ type ActionRowGap = "xs" | "sm" | "md" | "lg";
13
+ export interface ActionRowProps extends React.HTMLAttributes<HTMLDivElement>, SurfaceProps {
14
+ /** Who absorbs the leftover width. Default `"fill"`. */
15
+ align?: ActionRowAlign;
16
+ /**
17
+ * Left-hand meta slot that is NOT an action: a title, a breadcrumb, an
18
+ * "Add more details →" link, or a lone Discard button.
19
+ *
20
+ * Content-sized and shrinkable to nothing, so it may ellipsise where an
21
+ * action never may. This replaces every `justify-content: space-between`
22
+ * footer and the `<span />` spacer hack that came with them — with a flat
23
+ * row, `space-between` across three children opens the gulf BETWEEN the two
24
+ * buttons instead of between the meta and the pair.
25
+ */
26
+ anchor?: React.ReactNode;
27
+ /** Gap between actions. Default `"sm"` (0.5rem). */
28
+ gap?: ActionRowGap;
29
+ children?: React.ReactNode;
30
+ }
31
+ /**
32
+ * The one layout law for CTA / footer action rows.
33
+ *
34
+ * Each action is sized from its own label and only the LEFTOVER is shared out;
35
+ * labels wrap rather than truncate; a row that cannot fit wraps to the next
36
+ * line rather than crushing its children. All of that lives in
37
+ * `ActionRow.style.css` as parent-selector rules, deliberately NOT as Tailwind
38
+ * classes on the children — see the stylesheet for why.
39
+ *
40
+ * 🛑 Callers must not put `flex-1`, `flex-shrink-0`, `basis-*`, `w-*`, `h-*`,
41
+ * `truncate` or `leading-none` on a child. Both configs set `important: true`,
42
+ * so any of those beats every rule in the stylesheet and silently reverts that
43
+ * one row to the old squeezed behaviour with no visible error.
44
+ *
45
+ * Not for the bulk-action bar. That is a fixed three-control composite
46
+ * (count pill | picker | Apply) where the picker is MEANT to eat all the slack
47
+ * and the pill must stay pill-sized.
48
+ */
49
+ export declare const ActionRow: React.ForwardRefExoticComponent<ActionRowProps & React.RefAttributes<HTMLDivElement>>;
50
+ export {};
@@ -0,0 +1,53 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { buildSurfaceClasses } from "./surface-tokens";
4
+ const ACTION_ROW_GAP_MAP = {
5
+ xs: "appkit-gap--xs",
6
+ sm: "appkit-gap--sm",
7
+ md: "appkit-gap--md",
8
+ lg: "appkit-gap--lg",
9
+ };
10
+ const ACTION_ROW_ALIGN_MAP = {
11
+ fill: "",
12
+ end: "appkit-action-row--end",
13
+ start: "appkit-action-row--start",
14
+ };
15
+ /**
16
+ * The one layout law for CTA / footer action rows.
17
+ *
18
+ * Each action is sized from its own label and only the LEFTOVER is shared out;
19
+ * labels wrap rather than truncate; a row that cannot fit wraps to the next
20
+ * line rather than crushing its children. All of that lives in
21
+ * `ActionRow.style.css` as parent-selector rules, deliberately NOT as Tailwind
22
+ * classes on the children — see the stylesheet for why.
23
+ *
24
+ * 🛑 Callers must not put `flex-1`, `flex-shrink-0`, `basis-*`, `w-*`, `h-*`,
25
+ * `truncate` or `leading-none` on a child. Both configs set `important: true`,
26
+ * so any of those beats every rule in the stylesheet and silently reverts that
27
+ * one row to the old squeezed behaviour with no visible error.
28
+ *
29
+ * Not for the bulk-action bar. That is a fixed three-control composite
30
+ * (count pill | picker | Apply) where the picker is MEANT to eat all the slack
31
+ * and the pill must stay pill-sized.
32
+ */
33
+ export const ActionRow = React.forwardRef(({ className = "", align = "fill", anchor, gap = "sm", surface, padding, paddingX, paddingY, rounded, roundedTop, roundedBottom, border, shadow, overflow, children, ...props }, ref) => (_jsxs("div", { ref: ref, className: [
34
+ "appkit-action-row",
35
+ ACTION_ROW_ALIGN_MAP[align],
36
+ ACTION_ROW_GAP_MAP[gap],
37
+ buildSurfaceClasses({
38
+ surface,
39
+ padding,
40
+ paddingX,
41
+ paddingY,
42
+ rounded,
43
+ roundedTop,
44
+ roundedBottom,
45
+ border,
46
+ shadow,
47
+ overflow,
48
+ }),
49
+ className,
50
+ ]
51
+ .filter(Boolean)
52
+ .join(" "), ...props, children: [anchor !== undefined && anchor !== null && (_jsx("div", { className: "appkit-action-row__anchor", children: anchor })), _jsx("div", { className: "appkit-action-row__group", children: children })] })));
53
+ ActionRow.displayName = "ActionRow";
@@ -0,0 +1,145 @@
1
+ /*
2
+ * ActionRow — the single layout law for every CTA / footer action row.
3
+ *
4
+ * SIZING: `flex: 1 1 auto`. `flex-basis: auto` resolves against the button's
5
+ * own max-content width, and only the LEFTOVER is shared out. That is the
6
+ * whole fix. Tailwind's `flex-1` is `flex: 1 1 0%`, and that ZERO basis throws
7
+ * the content width away — which is why "Back" and "Continue to payment" came
8
+ * out the same width regardless of their labels, and why the escape hatch from
9
+ * that (`grow: false`) had to be a hug that rendered a 44px stub reading "Ba".
10
+ *
11
+ * OVERFLOW: the row wraps. Flex line-breaking runs on the hypothetical main
12
+ * size — the base size clamped by `min-width` — BEFORE any shrinking happens,
13
+ * so an action that does not fit moves to the next line instead of being
14
+ * crushed. `--appkit-size-action-min` is the switch that decides when.
15
+ *
16
+ * TRUNCATION: none, anywhere. A label that cannot fit its line wraps and the
17
+ * button grows taller. Every height here is therefore `min-height`, never
18
+ * `height`, and no descendant may carry `truncate` / `leading-none`.
19
+ *
20
+ * WHY A STYLESHEET AND NOT TAILWIND CLASSES ON THE CHILDREN: all sizing lands
21
+ * via `.appkit-action-row__group > *`, a rule on the PARENT's selector. Putting
22
+ * a bare `flex` / `block` / `hidden` utility on a `<Button>` breaks its own
23
+ * flex contract, because the consumer's globals.css declares those three
24
+ * un-layered and `!important` — Recurrent Root Cause #68, which collapsed
25
+ * twelve image-tile buttons to 0x0.
26
+ *
27
+ * NOT FOR: BulkActionBar, and the bulk row inside BottomActions. Those are a
28
+ * fixed three-control composite — count pill | picker | Apply — where the
29
+ * picker is MEANT to eat all the slack and the pill must stay pill-sized.
30
+ * Content-proportional sizing there would let a long selected-action label
31
+ * push Apply off the line.
32
+ */
33
+
34
+ .appkit-action-row {
35
+ display: flex;
36
+ flex-wrap: wrap;
37
+ align-items: center;
38
+ width: 100%;
39
+ /* gap comes from the .appkit-gap--* class the component applies */
40
+ }
41
+
42
+ /*
43
+ * The inner group is load-bearing, not decoration. With a flat row, a footer
44
+ * that wants "meta left, buttons right" reaches for `space-between` — and with
45
+ * three children that opens the gulf BETWEEN the two buttons. Nesting keeps the
46
+ * outer row at exactly two items so the split is clean, and lets the group
47
+ * carry the alignment of the actions among themselves.
48
+ */
49
+ .appkit-action-row__group {
50
+ display: flex;
51
+ flex-wrap: wrap;
52
+ /* Equal heights when one action wraps to two lines and its neighbour does
53
+ not — ragged button heights in one row read as broken. */
54
+ align-items: stretch;
55
+ gap: inherit;
56
+ flex: 1 1 auto;
57
+ min-width: 0;
58
+ }
59
+
60
+ /* --- the actions ---------------------------------------------------------- */
61
+
62
+ .appkit-action-row__group > * {
63
+ flex: 1 1 auto;
64
+ /*
65
+ * The wrap threshold. `min()` with 100% so a panel narrower than the floor
66
+ * degrades to one action per line instead of overflowing its own container.
67
+ */
68
+ min-width: min(var(--appkit-size-action-min), 100%);
69
+ min-height: var(--appkit-size-action-height);
70
+ /* Beats any fixed height inherited from a button size variant, so a wrapped
71
+ second line can actually grow the box. */
72
+ height: auto;
73
+ white-space: normal;
74
+ text-align: center;
75
+ /*
76
+ * `.appkit-button` declares `line-height: 1`, which collides two wrapped
77
+ * lines into one smear. This selector is (0,2,0) and beats its (0,1,0).
78
+ */
79
+ line-height: 1.25;
80
+ }
81
+
82
+ /*
83
+ * A non-button action — a bare TextLink or a Text — has no intrinsic button
84
+ * height. Don't stretch it into a 40px block; centre it against the buttons.
85
+ */
86
+ .appkit-action-row__group > *:not(.appkit-button) {
87
+ align-self: center;
88
+ min-height: 0;
89
+ }
90
+
91
+ /*
92
+ * Icon-only actions stay square tap targets. The caller opts in, because a
93
+ * stylesheet cannot know a child has no label.
94
+ */
95
+ .appkit-action-row__group > .appkit-action-row__icon-only {
96
+ flex: 0 0 var(--appkit-size-input-lg);
97
+ min-width: var(--appkit-size-input-lg);
98
+ padding-inline: 0;
99
+ }
100
+
101
+ /* --- alignment ------------------------------------------------------------ */
102
+
103
+ /* `fill` is the base rule above: the actions absorb the leftover. */
104
+
105
+ .appkit-action-row--end > .appkit-action-row__group {
106
+ justify-content: flex-end;
107
+ }
108
+ .appkit-action-row--start > .appkit-action-row__group {
109
+ justify-content: flex-start;
110
+ }
111
+
112
+ /* Same content-proportional basis; the free space simply isn't handed out. */
113
+ .appkit-action-row--end > .appkit-action-row__group > *,
114
+ .appkit-action-row--start > .appkit-action-row__group > * {
115
+ flex-grow: 0;
116
+ }
117
+
118
+ /* --- the anchor ----------------------------------------------------------- */
119
+
120
+ .appkit-action-row > .appkit-action-row__anchor {
121
+ flex: 0 1 auto;
122
+ /* Deliberately NOT the action floor — meta text may ellipsise, an action
123
+ may not. */
124
+ min-width: 0;
125
+ align-self: center;
126
+ }
127
+
128
+ /* --- narrow collapse ------------------------------------------------------ */
129
+ /*
130
+ * Below 30rem there is no leftover worth leaving empty: a right-packed footer
131
+ * at 360px is a ragged clump against the edge. Every alignment becomes `fill`,
132
+ * which is what the pinned bottom bar already does at every width, and the
133
+ * anchor takes its own line above the actions.
134
+ */
135
+ @media (max-width: 30rem) {
136
+ .appkit-action-row > .appkit-action-row__anchor {
137
+ flex-basis: 100%;
138
+ }
139
+ .appkit-action-row > .appkit-action-row__group {
140
+ justify-content: flex-start;
141
+ }
142
+ .appkit-action-row > .appkit-action-row__group > * {
143
+ flex-grow: 1;
144
+ }
145
+ }
@@ -10,6 +10,16 @@ export interface DrawerProps {
10
10
  onClose: () => void;
11
11
  title?: string;
12
12
  children: React.ReactNode;
13
+ /**
14
+ * Action buttons for the drawer's footer. Pass them bare — the slot supplies
15
+ * the row itself via `<ActionRow>`, so each button is sized from its own
16
+ * label and the group wraps rather than overflowing.
17
+ *
18
+ * 🛑 Do not wrap them in your own flex container or put `flex-1` on them:
19
+ * `important: true` makes a caller's utility beat ActionRow's CSS. The slot
20
+ * used to be a padding-only block, which silently gave inline-flow layout and
21
+ * made every caller invent its own row.
22
+ */
13
23
  footer?: React.ReactNode;
14
24
  side?: "left" | "right" | "bottom";
15
25
  /** Width for left/right drawers. Default: 'md' */
@@ -5,6 +5,7 @@ import { createPortal } from "react-dom";
5
5
  import { X } from "lucide-react";
6
6
  import { Heading } from "./Typography";
7
7
  import { Button } from "./Button";
8
+ import { ActionRow } from "./ActionRow";
8
9
  import { useHandMode } from "../../_internal/client/hand-mode";
9
10
  const SIDE_TRANSLATE = {
10
11
  left: {
@@ -70,5 +71,5 @@ export function Drawer({ isOpen, onClose, title, children, footer, side, size =
70
71
  : `${SIDE_SIZE[size]} appkit-drawer__panel--full-height`,
71
72
  isOpen ? open : closed,
72
73
  className,
73
- ].join(" "), "data-section": "drawer-div-481", children: [isBottom && (_jsx("div", { className: "appkit-drawer__drag-wrap", "data-section": "drawer-div-482", children: _jsx("div", { className: "appkit-drawer__drag", "aria-hidden": "true" }) })), (title || showCloseButton) && (_jsxs("div", { className: hand === "left" ? "appkit-drawer__header flex-row-reverse" : "appkit-drawer__header", "data-section": "drawer-div-483", children: [title && (_jsx(Heading, { level: 2, className: "appkit-drawer__title", children: title })), showCloseButton && (_jsx(Button, { variant: "ghost", size: "sm", type: "button", onClick: onClose, className: "appkit-drawer__close", "aria-label": "Close", children: _jsx(X, { className: "appkit-drawer__close-icon" }) }))] })), _jsx("div", { className: "appkit-drawer__body", "data-section": "drawer-div-484", children: children }), footer && _jsx("div", { className: "appkit-drawer__footer", "data-section": "drawer-div-485", children: footer })] })] }), document.body);
74
+ ].join(" "), "data-section": "drawer-div-481", children: [isBottom && (_jsx("div", { className: "appkit-drawer__drag-wrap", "data-section": "drawer-div-482", children: _jsx("div", { className: "appkit-drawer__drag", "aria-hidden": "true" }) })), (title || showCloseButton) && (_jsxs("div", { className: hand === "left" ? "appkit-drawer__header flex-row-reverse" : "appkit-drawer__header", "data-section": "drawer-div-483", children: [title && (_jsx(Heading, { level: 2, className: "appkit-drawer__title", children: title })), showCloseButton && (_jsx(Button, { variant: "ghost", size: "sm", type: "button", onClick: onClose, className: "appkit-drawer__close", "aria-label": "Close", children: _jsx(X, { className: "appkit-drawer__close-icon" }) }))] })), _jsx("div", { className: "appkit-drawer__body", "data-section": "drawer-div-484", children: children }), footer && (_jsx("div", { className: "appkit-drawer__footer", "data-section": "drawer-div-485", children: _jsx(ActionRow, { children: footer }) }))] })] }), document.body);
74
75
  }
@@ -34,7 +34,10 @@ export function FilterDrawer({ children, title = "Filters", open, onOpen, onClos
34
34
  handleOpen();
35
35
  }, className: ["appkit-filter-drawer__trigger", triggerClassName]
36
36
  .filter(Boolean)
37
- .join(" "), "aria-label": triggerLabel, children: [_jsx(Span, { children: triggerLabel }), activeCount > 0 ? (_jsx(Span, { className: "appkit-filter-drawer__badge", children: activeCount })) : null] })) : null, _jsx(Drawer, { isOpen: isOpen, onClose: handleClose, title: title, side: side, size: size, className: "appkit-drawer__panel--filter", footer: _jsxs("div", { className: "appkit-filter-drawer__footer", "data-section": "filterdrawer-div-494", children: [_jsx(Button, { type: "button", variant: "ghost", onClick: onReset, children: "Reset all" }), _jsx(Button, { type: "button", variant: "primary", onClick: handleApply, children: pendingCount != null && pendingCount > 0
37
+ .join(" "), "aria-label": triggerLabel, children: [_jsx(Span, { children: triggerLabel }), activeCount > 0 ? (_jsx(Span, { className: "appkit-filter-drawer__badge", children: activeCount })) : null] })) : null, _jsx(Drawer, { isOpen: isOpen, onClose: handleClose, title: title, side: side, size: size, className: "appkit-drawer__panel--filter", footer:
38
+ /* Bare buttons — the Drawer's footer slot supplies the ActionRow.
39
+ The old `__footer` wrapper existed only to hand-roll a flex row. */
40
+ _jsxs(_Fragment, { children: [_jsx(Button, { type: "button", variant: "ghost", onClick: onReset, children: "Reset all" }), _jsx(Button, { type: "button", variant: "primary", onClick: handleApply, children: pendingCount != null && pendingCount > 0
38
41
  ? `Apply (${pendingCount})`
39
42
  : "Apply" })] }), children: _jsxs("div", { className: [
40
43
  "appkit-filter-drawer__body",
@@ -35,18 +35,12 @@
35
35
  color: var(--appkit-color-text-on-primary);
36
36
  }
37
37
 
38
- .appkit-filter-drawer__footer {
39
- display: flex;
40
- align-items: center;
41
- justify-content: space-between;
42
- gap: 0.5rem;
43
- border-top: 1px solid var(--appkit-color-border);
44
- padding: 0.75rem 1rem;
45
- }
46
-
47
- :is(.dark) .appkit-filter-drawer__footer {
48
- border-top-color: var(--appkit-color-border);
49
- }
38
+ /*
39
+ * `.appkit-filter-drawer__footer` was deleted. Its border and padding are
40
+ * already supplied by `.appkit-drawer__footer` (the slot it rendered inside),
41
+ * and its flex rules are now ActionRow's job — the wrapper existed only to
42
+ * hand-roll a row the slot should always have provided.
43
+ */
50
44
 
51
45
  .appkit-filter-drawer__body {
52
46
  & > * + * {
@@ -2,8 +2,21 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import React from "react";
4
4
  import { ChevronRight } from "lucide-react";
5
+ import { ActionRow } from "./ActionRow";
5
6
  import { Button } from "./Button";
6
7
  import { TextLink } from "./TextLink";
7
8
  export function FormActionBar({ title, breadcrumbs, onSaveDraft, onPublish, publishLabel = "Publish", onPreview, onDiscard, isDirty, isSubmitting, className, }) {
8
- return (_jsxs("div", { className: `appkit-form-action-bar${className ? ` ${className}` : ""}`, children: [_jsxs("div", { className: "appkit-form-action-bar__meta", children: [breadcrumbs && breadcrumbs.length > 0 && (_jsx("div", { className: "appkit-form-action-bar__breadcrumbs", children: breadcrumbs.map((crumb, i) => (_jsxs(React.Fragment, { children: [i > 0 && _jsx(ChevronRight, { className: "h-3 w-3 flex-shrink-0" }), crumb.href ? (_jsx(TextLink, { href: crumb.href, variant: "inherit", truncate: true, children: crumb.label })) : (_jsx("span", { className: "truncate", children: crumb.label }))] }, i))) })), title && (_jsxs("div", { className: "appkit-form-action-bar__title", children: [isDirty && (_jsx("span", { className: "appkit-form-action-bar__dirty-dot mr-1.5", "aria-label": "Unsaved changes" })), title] }))] }), _jsxs("div", { className: "appkit-form-action-bar__actions", children: [isDirty && onDiscard && (_jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: onDiscard, disabled: isSubmitting, children: "Discard" })), onPreview && (_jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: onPreview, disabled: isSubmitting, children: "Preview" })), onSaveDraft && (_jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: onSaveDraft, isLoading: isSubmitting, disabled: isSubmitting, children: "Save draft" })), _jsx(Button, { type: "button", size: "sm", onClick: onPublish, isLoading: isSubmitting, disabled: isSubmitting, children: publishLabel })] })] }));
9
+ return (
10
+ /*
11
+ * Up to four actions live here (Discard / Preview / Save draft / Publish),
12
+ * and every one of them used to be `flex-shrink: 0` inside a non-wrapping
13
+ * row — so on a narrow viewport the group simply overflowed the bar. As an
14
+ * ActionRow they wrap instead.
15
+ *
16
+ * `align="end"` keeps the desktop look: an editor bar spans the full page
17
+ * width, and stretching four buttons across it would read as a toolbar of
18
+ * banners. The title/breadcrumb block is the `anchor`, which is what lets
19
+ * it shrink and ellipsise while the actions never do.
20
+ */
21
+ _jsxs(ActionRow, { align: "end", gap: "sm", className: `appkit-form-action-bar${className ? ` ${className}` : ""}`, anchor: _jsxs("div", { className: "appkit-form-action-bar__meta", children: [breadcrumbs && breadcrumbs.length > 0 && (_jsx("div", { className: "appkit-form-action-bar__breadcrumbs", children: breadcrumbs.map((crumb, i) => (_jsxs(React.Fragment, { children: [i > 0 && _jsx(ChevronRight, { className: "h-3 w-3 flex-shrink-0" }), crumb.href ? (_jsx(TextLink, { href: crumb.href, variant: "inherit", truncate: true, children: crumb.label })) : (_jsx("span", { className: "truncate", children: crumb.label }))] }, i))) })), title && (_jsxs("div", { className: "appkit-form-action-bar__title", children: [isDirty && (_jsx("span", { className: "appkit-form-action-bar__dirty-dot mr-1.5", "aria-label": "Unsaved changes" })), title] }))] }), children: [isDirty && onDiscard && (_jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: onDiscard, disabled: isSubmitting, children: "Discard" })), onPreview && (_jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: onPreview, disabled: isSubmitting, children: "Preview" })), onSaveDraft && (_jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: onSaveDraft, isLoading: isSubmitting, disabled: isSubmitting, children: "Save draft" })), _jsx(Button, { type: "button", size: "sm", onClick: onPublish, isLoading: isSubmitting, disabled: isSubmitting, children: publishLabel })] }));
9
22
  }
@@ -1,13 +1,16 @@
1
1
  /* FormActionBar — sticky editor action bar, bottom on mobile / top on desktop */
2
2
 
3
+ /*
4
+ * Chrome only — sticky positioning, background, padding. The row layout itself
5
+ * (`display: flex`, `justify-content`, `gap`) moved to ActionRow: this bar can
6
+ * hold four actions, and as a non-wrapping `flex-shrink: 0` group they used to
7
+ * overflow the bar on a narrow viewport. Do not re-add flex rules here; they
8
+ * would fight the ActionRow this class now decorates.
9
+ */
3
10
  .appkit-form-action-bar {
4
11
  position: sticky;
5
12
  bottom: var(--bottom-nav-height, 0px);
6
13
  z-index: var(--appkit-z-raised);
7
- display: flex;
8
- align-items: center;
9
- justify-content: space-between;
10
- gap: 0.75rem;
11
14
  border-top: 1px solid var(--appkit-color-border);
12
15
  background: var(--appkit-color-surface);
13
16
  backdrop-filter: blur(8px);
@@ -73,10 +76,8 @@
73
76
  }
74
77
 
75
78
  /* ── Right: action buttons ───────────────────────────────────────────────── */
76
-
77
- .appkit-form-action-bar__actions {
78
- display: flex;
79
- align-items: center;
80
- gap: 0.5rem;
81
- flex-shrink: 0;
82
- }
79
+ /*
80
+ * `.appkit-form-action-bar__actions` was deleted. Its `flex-shrink: 0` on a
81
+ * non-wrapping row is precisely what let four buttons overflow the bar; the
82
+ * group is now ActionRow's `__group`, which wraps.
83
+ */
@@ -115,7 +115,14 @@ export function ListingLayout({ headerSlot, statusTabsSlot, filterContent, filte
115
115
  bottomChromeSlot &&
116
116
  createPortal(_jsx(Nav, { "aria-label": "Pagination", className: "appkit-listing-layout__mobile-pagination", children: toolbarPaginationSlot }), bottomChromeSlot), hasFilter && (_jsx(Drawer, { isOpen: mobileFilterOpen, onClose: () => setMobileFilterOpen(false), side: "bottom", title: filterActiveCount > 0
117
117
  ? `${panelTitle} (${filterActiveCount})`
118
- : panelTitle, footer: _jsxs(Div, { className: "appkit-listing-layout__mobile-overlay-footer", children: [_jsx(Button, { type: "button", variant: "secondary", className: "flex-1 rounded-xl", onClick: () => onFilterClear?.(), children: l.clearAll }), _jsx(Button, { type: "button", variant: "primary", className: "flex-1 rounded-xl", onClick: handleMobileApply, children: filterPendingCount != null && filterPendingCount > 0
118
+ : panelTitle, footer:
119
+ /* Bare buttons: the Drawer's footer slot supplies the ActionRow.
120
+ 🛑 `flex-1` used to be on both of these, and under
121
+ `important: true` it beats ActionRow's content-proportional
122
+ basis — so this was the one row where the fix would have been
123
+ silently defeated. Only `rounded-xl` (a shape, not a width)
124
+ stays. */
125
+ _jsxs(_Fragment, { children: [_jsx(Button, { type: "button", variant: "secondary", className: "rounded-xl", onClick: () => onFilterClear?.(), children: l.clearAll }), _jsx(Button, { type: "button", variant: "primary", className: "rounded-xl", onClick: handleMobileApply, children: filterPendingCount != null && filterPendingCount > 0
119
126
  ? `${l.applyFilters} (${filterPendingCount})`
120
127
  : l.applyFilters })] }), children: filterContent })), overlays] }));
121
128
  }
@@ -463,19 +463,12 @@
463
463
  gap: 1rem;
464
464
  }
465
465
 
466
- .appkit-listing-layout__mobile-overlay-footer {
467
- flex-shrink: 0;
468
- display: flex;
469
- gap: 0.75rem;
470
- padding: 1rem;
471
- border-top: 1px solid var(--appkit-color-zinc-100);
472
- background: var(--appkit-color-surface);
473
- }
474
-
475
- .dark .appkit-listing-layout__mobile-overlay-footer {
476
- border-top-color: var(--appkit-color-slate-800);
477
- background: var(--appkit-color-bg);
478
- }
466
+ /*
467
+ * `.appkit-listing-layout__mobile-overlay-footer` was deleted: the mobile
468
+ * filter panel is a `<Drawer>`, whose footer slot now supplies both the chrome
469
+ * (`.appkit-drawer__footer`) and the action layout (`<ActionRow>`). The class
470
+ * existed only to hand-roll a flex row the slot should always have provided.
471
+ */
479
472
 
480
473
  /* -- Close button in mobile overlay ----------------- */
481
474
 
@@ -11,7 +11,21 @@ export interface ModalProps {
11
11
  className?: string;
12
12
  }
13
13
  export declare function Modal({ isOpen, open, onClose, title, children, size, showCloseButton, actions, className, }: ModalProps): React.ReactPortal | null;
14
- export declare function ModalFooter({ children, className, }: {
14
+ /**
15
+ * A dialog's action row.
16
+ *
17
+ * `align="end"` on purpose: a dialog is at most 32rem wide, and stretching
18
+ * Cancel/Confirm across it reads as a banner rather than a pair of controls.
19
+ * The buttons are still sized from their own labels — they simply don't take
20
+ * the leftover — and ActionRow's own narrow breakpoint collapses this to
21
+ * full-width below 30rem, where a right-packed clump would read badly.
22
+ *
23
+ * `anchor` is available for a footer that needs meta on the left (a link, a
24
+ * count). Use it instead of reintroducing `justify-between`, which with three
25
+ * children opens the gulf BETWEEN the two buttons rather than beside them.
26
+ */
27
+ export declare function ModalFooter({ children, anchor, className, }: {
15
28
  children: React.ReactNode;
29
+ anchor?: React.ReactNode;
16
30
  className?: string;
17
31
  }): React.JSX.Element;
@@ -5,6 +5,7 @@ import { createPortal } from "react-dom";
5
5
  import { motion, AnimatePresence, useReducedMotion } from "motion/react";
6
6
  import { Heading } from "./Typography";
7
7
  import { Button } from "./Button";
8
+ import { ActionRow } from "./ActionRow";
8
9
  import { SPRING_GENTLE } from "../../tokens/motion";
9
10
  import { useHandMode } from "../../_internal/client/hand-mode";
10
11
  import { OverlayContext } from "./overlay-context";
@@ -74,9 +75,22 @@ export function Modal({ isOpen, open, onClose, title, children, size = "md", sho
74
75
  .filter(Boolean)
75
76
  .join(" "), initial: reduced ? false : { opacity: 0, scale: 0.95, y: 8 }, animate: { opacity: 1, scale: 1, y: 0 }, exit: { opacity: 0, scale: 0.95, y: 8 }, transition: SPRING_GENTLE, "data-section": "modal-div-562", children: [(title || showCloseButton) && (_jsxs("div", { className: hand === "left" ? "appkit-modal__header flex-row-reverse" : "appkit-modal__header", "data-section": "modal-div-563", children: [title ? (_jsx(Heading, { level: 2, id: titleId, className: "appkit-modal__title", children: title })) : (_jsx("span", {})), showCloseButton ? (_jsx(Button, { variant: "ghost", size: "sm", type: "button", onClick: onClose, className: "appkit-modal__close", "aria-label": "Close", children: _jsx("span", { className: "appkit-modal__close-icon", "aria-hidden": "true", children: "\u00D7" }) })) : null] })), _jsx("div", { className: "appkit-modal__body", "data-section": "modal-div-564", children: children }), actions ? _jsx(ModalFooter, { children: actions }) : null] })] })) }) }), document.body);
76
77
  }
77
- export function ModalFooter({ children, className = "", }) {
78
- return (_jsx("div", { className: [
79
- "flex items-center justify-end gap-3 border-t px-6 py-4 border-[var(--appkit-color-border-subtle)]",
78
+ /**
79
+ * A dialog's action row.
80
+ *
81
+ * `align="end"` on purpose: a dialog is at most 32rem wide, and stretching
82
+ * Cancel/Confirm across it reads as a banner rather than a pair of controls.
83
+ * The buttons are still sized from their own labels — they simply don't take
84
+ * the leftover — and ActionRow's own narrow breakpoint collapses this to
85
+ * full-width below 30rem, where a right-packed clump would read badly.
86
+ *
87
+ * `anchor` is available for a footer that needs meta on the left (a link, a
88
+ * count). Use it instead of reintroducing `justify-between`, which with three
89
+ * children opens the gulf BETWEEN the two buttons rather than beside them.
90
+ */
91
+ export function ModalFooter({ children, anchor, className = "", }) {
92
+ return (_jsx(ActionRow, { align: "end", gap: "md", anchor: anchor, className: [
93
+ "border-t px-6 py-4 border-[var(--appkit-color-border-subtle)]",
80
94
  className,
81
95
  ]
82
96
  .filter(Boolean)
@@ -2,10 +2,10 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import React from "react";
4
4
  import { createPortal } from "react-dom";
5
+ import { ActionRow } from "./ActionRow";
5
6
  import { Button } from "./Button";
6
7
  import { Div } from "./Div";
7
8
  import { Heading } from "./Typography";
8
- import { Row } from "./Layout";
9
9
  import { TextLink } from "./TextLink";
10
10
  export function QuickCreateModal({ isOpen, title, onSave, onSaved, onCancel, children, fullPageHref, saveLabel = "Save", cancelLabel = "Cancel", isSaving = false, saveDisabled = false, }) {
11
11
  const [busy, setBusy] = React.useState(false);
@@ -45,5 +45,5 @@ export function QuickCreateModal({ isOpen, title, onSave, onSaved, onCancel, chi
45
45
  if (!isOpen || typeof document === "undefined")
46
46
  return null;
47
47
  const saving = busy || isSaving;
48
- return createPortal(_jsxs(Div, { className: "appkit-quick-create-modal", role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, children: [_jsx(Div, { className: "appkit-quick-create-modal__backdrop", "aria-hidden": "true", onClick: () => !saving && onCancel() }), _jsxs(Div, { ref: panelRef, tabIndex: -1, className: "appkit-quick-create-modal__panel", children: [_jsxs(Div, { className: "appkit-quick-create-modal__header", children: [_jsx(Heading, { level: 2, id: titleId, className: "appkit-quick-create-modal__title", children: title }), _jsx(Button, { variant: "ghost", size: "sm", type: "button", onClick: onCancel, "aria-label": "Close", disabled: saving, children: "\u00D7" })] }), _jsx(Div, { className: "appkit-quick-create-modal__body", children: children }), _jsxs(Div, { className: "appkit-quick-create-modal__footer", children: [fullPageHref ? (_jsx(TextLink, { variant: "none", href: fullPageHref, target: "_blank", rel: "noreferrer", className: "appkit-quick-create-modal__full-link", children: "Add more details \u2192" })) : (_jsx("span", {})), _jsxs(Row, { className: "appkit-quick-create-modal__actions", children: [_jsx(Button, { variant: "ghost", type: "button", onClick: onCancel, disabled: saving, children: cancelLabel }), _jsx(Button, { variant: "primary", type: "button", onClick: handleSave, disabled: saving || saveDisabled, isLoading: saving, children: saveLabel })] })] })] })] }), document.body);
48
+ return createPortal(_jsxs(Div, { className: "appkit-quick-create-modal", role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, children: [_jsx(Div, { className: "appkit-quick-create-modal__backdrop", "aria-hidden": "true", onClick: () => !saving && onCancel() }), _jsxs(Div, { ref: panelRef, tabIndex: -1, className: "appkit-quick-create-modal__panel", children: [_jsxs(Div, { className: "appkit-quick-create-modal__header", children: [_jsx(Heading, { level: 2, id: titleId, className: "appkit-quick-create-modal__title", children: title }), _jsx(Button, { variant: "ghost", size: "sm", type: "button", onClick: onCancel, "aria-label": "Close", disabled: saving, children: "\u00D7" })] }), _jsx(Div, { className: "appkit-quick-create-modal__body", children: children }), _jsxs(ActionRow, { align: "end", gap: "md", className: "appkit-quick-create-modal__footer", anchor: fullPageHref ? (_jsx(TextLink, { variant: "none", href: fullPageHref, target: "_blank", rel: "noreferrer", className: "appkit-quick-create-modal__full-link", children: "Add more details \u2192" })) : undefined, children: [_jsx(Button, { variant: "ghost", type: "button", onClick: onCancel, disabled: saving, children: cancelLabel }), _jsx(Button, { variant: "primary", type: "button", onClick: handleSave, disabled: saving || saveDisabled, isLoading: saving, children: saveLabel })] })] })] }), document.body);
49
49
  }