@mohasinac/appkit 4.59.0 → 4.60.1

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 (532) hide show
  1. package/dist/.build-stamp.json +3 -3
  2. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +62 -5
  3. package/dist/_internal/client/features/maintenance/views/MaintenanceDashboardView.js +2 -2
  4. package/dist/_internal/server/features/brands/actions.js +78 -4
  5. package/dist/_internal/server/features/checkout/actions.d.ts +36 -13
  6. package/dist/_internal/server/features/checkout/actions.js +668 -183
  7. package/dist/_internal/server/features/checkout/supplier-identity.js +18 -1
  8. package/dist/_internal/server/features/gateway-events/index.d.ts +10 -0
  9. package/dist/_internal/server/features/gateway-events/index.js +10 -0
  10. package/dist/_internal/server/features/gateway-events/ingest.d.ts +127 -0
  11. package/dist/_internal/server/features/gateway-events/ingest.js +188 -0
  12. package/dist/_internal/server/features/gateway-events/redact.d.ts +66 -0
  13. package/dist/_internal/server/features/gateway-events/redact.js +151 -0
  14. package/dist/_internal/server/features/grievance/actions.d.ts +63 -0
  15. package/dist/_internal/server/features/grievance/actions.js +173 -0
  16. package/dist/_internal/server/features/grievance/index.d.ts +8 -0
  17. package/dist/_internal/server/features/grievance/index.js +8 -0
  18. package/dist/_internal/server/features/grouped/data.js +28 -3
  19. package/dist/_internal/server/features/lottery/actions.js +99 -4
  20. package/dist/_internal/server/features/order-completion/actions.d.ts +92 -0
  21. package/dist/_internal/server/features/order-completion/actions.js +336 -0
  22. package/dist/_internal/server/features/order-completion/index.d.ts +7 -0
  23. package/dist/_internal/server/features/order-completion/index.js +7 -0
  24. package/dist/_internal/server/features/orders/actions.d.ts +13 -0
  25. package/dist/_internal/server/features/orders/actions.js +56 -2
  26. package/dist/_internal/server/features/orders/adapters.d.ts +20 -2
  27. package/dist/_internal/server/features/orders/adapters.js +44 -0
  28. package/dist/_internal/server/features/orders/cancellation-refund.d.ts +116 -0
  29. package/dist/_internal/server/features/orders/cancellation-refund.js +466 -0
  30. package/dist/_internal/server/features/orders/index.d.ts +2 -1
  31. package/dist/_internal/server/features/orders/index.js +1 -1
  32. package/dist/_internal/server/features/orders/service.d.ts +60 -0
  33. package/dist/_internal/server/features/orders/service.js +74 -0
  34. package/dist/_internal/server/features/payment-cases/disputes.d.ts +76 -0
  35. package/dist/_internal/server/features/payment-cases/disputes.js +241 -0
  36. package/dist/_internal/server/features/payment-cases/index.d.ts +9 -0
  37. package/dist/_internal/server/features/payment-cases/index.js +9 -0
  38. package/dist/_internal/server/features/payouts/actions.d.ts +28 -3
  39. package/dist/_internal/server/features/payouts/actions.js +84 -10
  40. package/dist/_internal/server/features/points/adjust.d.ts +61 -0
  41. package/dist/_internal/server/features/points/adjust.js +121 -0
  42. package/dist/_internal/server/features/points/award.d.ts +65 -0
  43. package/dist/_internal/server/features/points/award.js +145 -0
  44. package/dist/_internal/server/features/price-index/market.d.ts +33 -0
  45. package/dist/_internal/server/features/price-index/market.js +54 -1
  46. package/dist/_internal/server/features/products/data.js +40 -22
  47. package/dist/_internal/server/features/protection-claims/actions.d.ts +72 -0
  48. package/dist/_internal/server/features/protection-claims/actions.js +228 -0
  49. package/dist/_internal/server/features/protection-claims/index.d.ts +8 -0
  50. package/dist/_internal/server/features/protection-claims/index.js +8 -0
  51. package/dist/_internal/server/features/refunds/actions.d.ts +20 -0
  52. package/dist/_internal/server/features/refunds/actions.js +259 -17
  53. package/dist/_internal/server/features/refunds/capacity.d.ts +29 -0
  54. package/dist/_internal/server/features/refunds/capacity.js +37 -0
  55. package/dist/_internal/server/features/reviews/actions.js +3 -2
  56. package/dist/_internal/server/features/search/index-build/sources.js +20 -1
  57. package/dist/_internal/server/features/shipping/reconcile.d.ts +10 -1
  58. package/dist/_internal/server/features/shipping/reconcile.js +34 -3
  59. package/dist/_internal/server/features/shipping/reimbursement.d.ts +117 -0
  60. package/dist/_internal/server/features/shipping/reimbursement.js +223 -0
  61. package/dist/_internal/server/features/stores/tabs.d.ts +19 -4
  62. package/dist/_internal/server/features/stores/tabs.js +24 -4
  63. package/dist/_internal/server/functions/https.d.ts +31 -1
  64. package/dist/_internal/server/functions/https.js +52 -1
  65. package/dist/_internal/server/functions/scheduled.d.ts +72 -1
  66. package/dist/_internal/server/functions/scheduled.js +124 -1
  67. package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +62 -16
  68. package/dist/_internal/server/jobs/core/boxRollupReconcile.d.ts +46 -0
  69. package/dist/_internal/server/jobs/core/boxRollupReconcile.js +142 -0
  70. package/dist/_internal/server/jobs/core/dailyDataCleanup.js +149 -1
  71. package/dist/_internal/server/jobs/core/dailyStatusDigest.d.ts +14 -0
  72. package/dist/_internal/server/jobs/core/dailyStatusDigest.js +79 -1
  73. package/dist/_internal/server/jobs/core/index.d.ts +2 -0
  74. package/dist/_internal/server/jobs/core/index.js +2 -0
  75. package/dist/_internal/server/jobs/core/marketPriceRollup.d.ts +64 -0
  76. package/dist/_internal/server/jobs/core/marketPriceRollup.js +153 -0
  77. package/dist/_internal/server/jobs/core/obligationSweep.d.ts +36 -0
  78. package/dist/_internal/server/jobs/core/obligationSweep.js +503 -0
  79. package/dist/_internal/server/jobs/core/paymentReconcile.d.ts +79 -0
  80. package/dist/_internal/server/jobs/core/paymentReconcile.js +614 -0
  81. package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +34 -0
  82. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +35 -4
  83. package/dist/_internal/server/jobs/handlers/boxRollupReconcile.d.ts +2 -0
  84. package/dist/_internal/server/jobs/handlers/boxRollupReconcile.js +15 -0
  85. package/dist/_internal/server/jobs/handlers/countersReconcileNow.d.ts +65 -0
  86. package/dist/_internal/server/jobs/handlers/countersReconcileNow.js +89 -0
  87. package/dist/_internal/server/jobs/handlers/index.d.ts +5 -0
  88. package/dist/_internal/server/jobs/handlers/index.js +5 -0
  89. package/dist/_internal/server/jobs/handlers/marketPriceRollup.d.ts +2 -0
  90. package/dist/_internal/server/jobs/handlers/marketPriceRollup.js +2 -0
  91. package/dist/_internal/server/jobs/handlers/obligationSweep.d.ts +2 -0
  92. package/dist/_internal/server/jobs/handlers/obligationSweep.js +15 -0
  93. package/dist/_internal/server/jobs/handlers/onShipmentAllocationSync.js +30 -1
  94. package/dist/_internal/server/jobs/handlers/paymentReconcile.d.ts +2 -0
  95. package/dist/_internal/server/jobs/handlers/paymentReconcile.js +6 -0
  96. package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
  97. package/dist/_internal/shared/actions/action-registry.js +71 -0
  98. package/dist/_internal/shared/checkout/coupon-discount.d.ts +73 -0
  99. package/dist/_internal/shared/checkout/coupon-discount.js +103 -0
  100. package/dist/_internal/shared/checkout/lanes.d.ts +42 -0
  101. package/dist/_internal/shared/checkout/lanes.js +46 -0
  102. package/dist/_internal/shared/checkout/order-math.d.ts +149 -1
  103. package/dist/_internal/shared/checkout/order-math.js +251 -3
  104. package/dist/_internal/shared/checkout/refundable-base.d.ts +116 -0
  105. package/dist/_internal/shared/checkout/refundable-base.js +122 -0
  106. package/dist/_internal/shared/features/auctions/config.d.ts +14 -1
  107. package/dist/_internal/shared/features/auctions/config.js +30 -1
  108. package/dist/_internal/shared/features/brands/schema.d.ts +42 -0
  109. package/dist/_internal/shared/features/brands/schema.js +18 -0
  110. package/dist/_internal/shared/features/orders/refund-copy.d.ts +22 -0
  111. package/dist/_internal/shared/features/orders/refund-copy.js +34 -0
  112. package/dist/_internal/shared/features/print/label-profiles.d.ts +198 -0
  113. package/dist/_internal/shared/features/print/label-profiles.js +350 -0
  114. package/dist/_internal/shared/features/products/to-product-item.js +33 -5
  115. package/dist/_internal/shared/fees/calculator.d.ts +31 -2
  116. package/dist/_internal/shared/fees/calculator.js +103 -5
  117. package/dist/_internal/shared/fees/india-states.d.ts +195 -0
  118. package/dist/_internal/shared/fees/india-states.js +190 -0
  119. package/dist/_internal/shared/fees/payout-hold.d.ts +80 -0
  120. package/dist/_internal/shared/fees/payout-hold.js +74 -0
  121. package/dist/_internal/shared/obligations/deadlines.d.ts +94 -0
  122. package/dist/_internal/shared/obligations/deadlines.js +155 -0
  123. package/dist/_internal/shared/shipping/quote.d.ts +96 -0
  124. package/dist/_internal/shared/shipping/quote.js +67 -0
  125. package/dist/_internal/shared/time/business-days.d.ts +91 -0
  126. package/dist/_internal/shared/time/business-days.js +185 -0
  127. package/dist/cli/index.js +0 -2
  128. package/dist/client.d.ts +10 -4
  129. package/dist/client.js +29 -3
  130. package/dist/configs/tailwind.d.ts +0 -12
  131. package/dist/configs/tailwind.js +28 -15
  132. package/dist/constants/api-endpoints.d.ts +51 -9
  133. package/dist/constants/api-endpoints.js +23 -7
  134. package/dist/constants/index.d.ts +1 -1
  135. package/dist/constants/index.js +1 -1
  136. package/dist/contracts/index.d.ts +1 -1
  137. package/dist/contracts/payment.d.ts +131 -0
  138. package/dist/features/about/components/AboutView.js +1 -1
  139. package/dist/features/about/components/DeveloperView.js +5 -2
  140. package/dist/features/about/components/FAQPageView.js +2 -1
  141. package/dist/features/about/components/FeesView.js +2 -1
  142. package/dist/features/about/components/HelpPageView.js +2 -1
  143. package/dist/features/about/components/HowAuctionsWorkView.js +2 -1
  144. package/dist/features/about/components/HowCheckoutWorksView.js +2 -1
  145. package/dist/features/about/components/HowEmiWorksView.js +2 -1
  146. package/dist/features/about/components/HowOffersWorkView.js +2 -1
  147. package/dist/features/about/components/HowOrdersWorkView.js +2 -1
  148. package/dist/features/about/components/HowPayoutsWorkView.js +2 -1
  149. package/dist/features/about/components/HowPreOrdersWorkView.js +2 -1
  150. package/dist/features/about/components/HowReviewsWorkView.js +2 -1
  151. package/dist/features/about/components/PolicyPageView.js +2 -1
  152. package/dist/features/about/components/ProseHero.d.ts +73 -0
  153. package/dist/features/about/components/ProseHero.js +18 -0
  154. package/dist/features/about/components/SecurityPrivacyView.js +2 -1
  155. package/dist/features/about/components/ShippingPolicyView.js +2 -1
  156. package/dist/features/about/components/TrackOrderView.js +2 -1
  157. package/dist/features/about/components/UnauthorizedView.js +1 -1
  158. package/dist/features/about/index.d.ts +2 -0
  159. package/dist/features/about/index.js +5 -0
  160. package/dist/features/account/actions/address-actions.d.ts +26 -2
  161. package/dist/features/account/actions/address-actions.js +25 -1
  162. package/dist/features/account/components/BuyerShoppingGuideView.js +1 -1
  163. package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
  164. package/dist/features/account/components/UserOrdersView.js +17 -0
  165. package/dist/features/account/components/UserSidebar.js +1 -1
  166. package/dist/features/account/hooks/useNotifications.js +29 -0
  167. package/dist/features/admin/actions/admin-coupon-actions.js +36 -0
  168. package/dist/features/admin/components/AdminBeysView.js +2 -2
  169. package/dist/features/admin/components/AdminBlogEditorView.js +2 -2
  170. package/dist/features/admin/components/AdminBrandEditorView.js +32 -2
  171. package/dist/features/admin/components/AdminBundleEditorView.js +1 -1
  172. package/dist/features/admin/components/AdminCarouselEditorView.js +1 -1
  173. package/dist/features/admin/components/AdminCategoriesView.js +1 -1
  174. package/dist/features/admin/components/AdminCategoryEditorView.js +73 -17
  175. package/dist/features/admin/components/AdminContactEditorView.js +1 -1
  176. package/dist/features/admin/components/AdminCouponEditorView.js +26 -1
  177. package/dist/features/admin/components/AdminFaqEditorView.js +1 -1
  178. package/dist/features/admin/components/AdminFaqsView.js +2 -2
  179. package/dist/features/admin/components/AdminGatewayEventsView.d.ts +54 -0
  180. package/dist/features/admin/components/AdminGatewayEventsView.js +209 -0
  181. package/dist/features/admin/components/AdminGuideHubView.js +1 -1
  182. package/dist/features/admin/components/AdminMoneyCasesView.d.ts +60 -0
  183. package/dist/features/admin/components/AdminMoneyCasesView.js +287 -0
  184. package/dist/features/admin/components/AdminPartsView.js +2 -2
  185. package/dist/features/admin/components/AdminProductsView.js +75 -4
  186. package/dist/features/admin/components/AdminSidebar.js +2 -2
  187. package/dist/features/admin/components/AdminSiteSettingsView.js +65 -7
  188. package/dist/features/admin/components/AdminSublistingCategoriesView.js +2 -0
  189. package/dist/features/admin/components/AdminSupportTicketDetailView.js +1 -1
  190. package/dist/features/admin/components/AdminSupportTicketsView.js +2 -2
  191. package/dist/features/admin/components/AdminTesterChecklistView.js +2 -2
  192. package/dist/features/admin/components/AdminUsersView.js +72 -1
  193. package/dist/features/admin/components/AdminViewCards.d.ts +3 -1
  194. package/dist/features/admin/components/AdminViewCards.js +4 -4
  195. package/dist/features/admin/components/DataListingView.d.ts +28 -0
  196. package/dist/features/admin/components/DataListingView.js +175 -14
  197. package/dist/features/admin/components/DataTable.d.ts +12 -1
  198. package/dist/features/admin/components/DataTable.js +3 -3
  199. package/dist/features/admin/components/OwnerQuickActions.d.ts +1 -1
  200. package/dist/features/admin/components/OwnerQuickActions.js +60 -2
  201. package/dist/features/admin/components/RecordOwnerQuickActions.d.ts +1 -1
  202. package/dist/features/admin/components/RecordOwnerQuickActions.js +61 -14
  203. package/dist/features/admin/components/analytics/AdminStatCard.d.ts +35 -1
  204. package/dist/features/admin/components/analytics/AdminStatCard.js +77 -2
  205. package/dist/features/admin/components/index.d.ts +4 -0
  206. package/dist/features/admin/components/index.js +6 -0
  207. package/dist/features/admin/constants/filter-tabs.d.ts +156 -0
  208. package/dist/features/admin/constants/filter-tabs.js +106 -0
  209. package/dist/features/admin/repository/site-settings.repository.d.ts +22 -0
  210. package/dist/features/admin/repository/site-settings.repository.js +82 -1
  211. package/dist/features/admin/schemas/admin-editor-forms.d.ts +21 -0
  212. package/dist/features/admin/schemas/admin-editor-forms.js +44 -0
  213. package/dist/features/admin/schemas/firestore.js +5 -1
  214. package/dist/features/admin/schemas/site-settings-form.js +30 -1
  215. package/dist/features/auctions/actions/bid-actions.js +13 -1
  216. package/dist/features/auctions/components/AuctionBottomActions.js +2 -2
  217. package/dist/features/auctions/components/AuctionDetailPageView.js +3 -1
  218. package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +11 -0
  219. package/dist/features/auctions/components/MarketplaceAuctionCard.js +5 -3
  220. package/dist/features/auctions/components/PlaceBidFormClient.d.ts +8 -1
  221. package/dist/features/auctions/components/PlaceBidFormClient.js +2 -2
  222. package/dist/features/audit-log/schemas/firestore.d.ts +28 -0
  223. package/dist/features/audit-log/schemas/firestore.js +14 -0
  224. package/dist/features/auth/permissions/constants.d.ts +17 -1
  225. package/dist/features/auth/permissions/constants.js +18 -0
  226. package/dist/features/blog/components/BlogPostView.js +1 -1
  227. package/dist/features/catalogue/components/AdminCatalogueApprovalsView.js +1 -1
  228. package/dist/features/categories/api/[id]/description-template/route.js +107 -1
  229. package/dist/features/categories/components/BrandDetailPageView.js +2 -2
  230. package/dist/features/categories/components/BreadcrumbTrail.js +7 -1
  231. package/dist/features/categories/components/BundleDetailView.js +1 -1
  232. package/dist/features/categories/components/CategoryDetailPageView.js +2 -2
  233. package/dist/features/categories/components/CategoryForm.js +12 -1
  234. package/dist/features/categories/components/CategoryTemplatePicker.js +38 -5
  235. package/dist/features/categories/repository/market-price-index.repository.d.ts +123 -0
  236. package/dist/features/categories/repository/market-price-index.repository.js +105 -0
  237. package/dist/features/categories/repository/price-observation.repository.d.ts +166 -0
  238. package/dist/features/categories/repository/price-observation.repository.js +132 -0
  239. package/dist/features/events/components/EventSaleBanner.js +1 -1
  240. package/dist/features/events/components/EventStatusBadge.js +1 -1
  241. package/dist/features/faq/components/FAQAccordion.js +2 -1
  242. package/dist/features/faq/components/FAQCategorySidebar.js +2 -2
  243. package/dist/features/faq/components/FAQHelpfulButtons.js +4 -4
  244. package/dist/features/faq/components/RelatedFAQs.js +1 -1
  245. package/dist/features/filters/FilterFacetSection.js +1 -1
  246. package/dist/features/filters/SwitchFilter.js +1 -1
  247. package/dist/features/gateway-events/repository/gateway-events.repository.d.ts +117 -0
  248. package/dist/features/gateway-events/repository/gateway-events.repository.js +274 -0
  249. package/dist/features/gateway-events/schemas/firestore.d.ts +217 -0
  250. package/dist/features/gateway-events/schemas/firestore.js +125 -0
  251. package/dist/features/gateway-events/schemas/index.d.ts +81 -0
  252. package/dist/features/gateway-events/schemas/index.js +79 -0
  253. package/dist/features/grouped/components/GroupedListingDetailView.js +1 -1
  254. package/dist/features/homepage/components/AnnouncementBar.js +37 -1
  255. package/dist/features/homepage/components/AnnouncementBar.style.css +30 -0
  256. package/dist/features/homepage/components/BrandsSection.js +1 -1
  257. package/dist/features/homepage/components/CTABannerSection.js +1 -1
  258. package/dist/features/homepage/components/FeaturedBundlesSection.js +14 -24
  259. package/dist/features/homepage/components/HeroCarousel.js +2 -2
  260. package/dist/features/homepage/components/SocialPostCard.js +1 -1
  261. package/dist/features/inventory/components/AdminMoveLedgerView.d.ts +7 -0
  262. package/dist/features/inventory/components/AdminMoveLedgerView.js +157 -0
  263. package/dist/features/inventory/components/AdminStorageBoxesView.d.ts +11 -0
  264. package/dist/features/inventory/components/AdminStorageBoxesView.js +168 -0
  265. package/dist/features/inventory/components/ReceiveStationView.d.ts +39 -0
  266. package/dist/features/inventory/components/ReceiveStationView.js +413 -0
  267. package/dist/features/inventory/components/operator-message.d.ts +29 -0
  268. package/dist/features/inventory/components/operator-message.js +41 -0
  269. package/dist/features/inventory/index.d.ts +13 -0
  270. package/dist/features/inventory/index.js +28 -0
  271. package/dist/features/inventory/repository/inventory-movements.repository.d.ts +97 -0
  272. package/dist/features/inventory/repository/inventory-movements.repository.js +186 -0
  273. package/dist/features/inventory/repository/inventory-placements.repository.d.ts +179 -0
  274. package/dist/features/inventory/repository/inventory-placements.repository.js +345 -0
  275. package/dist/features/inventory/repository/storage-boxes.repository.d.ts +83 -0
  276. package/dist/features/inventory/repository/storage-boxes.repository.js +127 -0
  277. package/dist/features/inventory/schemas/firestore.d.ts +197 -0
  278. package/dist/features/inventory/schemas/firestore.js +159 -0
  279. package/dist/features/layout/AppLayoutShell.d.ts +12 -1
  280. package/dist/features/layout/AppLayoutShell.js +25 -12
  281. package/dist/features/layout/AutoBreadcrumbs.js +162 -3
  282. package/dist/features/layout/AutoBreadcrumbs.style.css +45 -0
  283. package/dist/features/layout/BottomNavbar.d.ts +1 -1
  284. package/dist/features/layout/BottomNavbar.js +2 -2
  285. package/dist/features/media/MediaAvatar.js +1 -1
  286. package/dist/features/media/MediaImage.d.ts +24 -4
  287. package/dist/features/media/MediaImage.js +44 -4
  288. package/dist/features/media/MediaLightbox.js +1 -1
  289. package/dist/features/media/modals/ImageCropModal.js +1 -1
  290. package/dist/features/media/modals/ImageEditor.js +1 -1
  291. package/dist/features/media/upload/MediaUploadField.js +91 -3
  292. package/dist/features/obligations/constants/policies.d.ts +92 -0
  293. package/dist/features/obligations/constants/policies.js +378 -0
  294. package/dist/features/obligations/repository/obligations.repository.d.ts +68 -0
  295. package/dist/features/obligations/repository/obligations.repository.js +158 -0
  296. package/dist/features/obligations/schemas/firestore.d.ts +160 -0
  297. package/dist/features/obligations/schemas/firestore.js +87 -0
  298. package/dist/features/orders/actions/order-actions.d.ts +43 -4
  299. package/dist/features/orders/actions/order-actions.js +60 -3
  300. package/dist/features/orders/actions/refund-actions.js +70 -10
  301. package/dist/features/orders/components/OrderCompletionPanel.d.ts +27 -0
  302. package/dist/features/orders/components/OrderCompletionPanel.js +192 -0
  303. package/dist/features/orders/components/OrdersList.js +2 -2
  304. package/dist/features/orders/components/RefundHistoryTable.js +3 -1
  305. package/dist/features/orders/components/index.d.ts +2 -0
  306. package/dist/features/orders/components/index.js +6 -0
  307. package/dist/features/orders/constants/transitions.d.ts +59 -0
  308. package/dist/features/orders/constants/transitions.js +104 -0
  309. package/dist/features/orders/repository/orders.repository.d.ts +109 -6
  310. package/dist/features/orders/repository/orders.repository.js +464 -21
  311. package/dist/features/orders/schemas/firestore.d.ts +270 -0
  312. package/dist/features/orders/schemas/firestore.js +24 -0
  313. package/dist/features/orders/schemas/index.d.ts +61 -0
  314. package/dist/features/orders/schemas/index.js +22 -0
  315. package/dist/features/orders/types/index.d.ts +79 -0
  316. package/dist/features/parts/components/PartsIndexPageView.js +8 -1
  317. package/dist/features/payment-cases/repository/payment-cases.repository.d.ts +170 -0
  318. package/dist/features/payment-cases/repository/payment-cases.repository.js +342 -0
  319. package/dist/features/payment-cases/schemas/firestore.d.ts +229 -0
  320. package/dist/features/payment-cases/schemas/firestore.js +105 -0
  321. package/dist/features/payment-cases/schemas/resolve-form.d.ts +97 -0
  322. package/dist/features/payment-cases/schemas/resolve-form.js +114 -0
  323. package/dist/features/payments/repository/payout.repository.d.ts +0 -1
  324. package/dist/features/payments/repository/payout.repository.js +0 -1
  325. package/dist/features/points/repository/points.repository.d.ts +122 -0
  326. package/dist/features/points/repository/points.repository.js +304 -1
  327. package/dist/features/points/schemas/adjust-form.d.ts +58 -0
  328. package/dist/features/points/schemas/adjust-form.js +63 -0
  329. package/dist/features/points/schemas/firestore.d.ts +108 -1
  330. package/dist/features/points/schemas/firestore.js +84 -0
  331. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +3 -3
  332. package/dist/features/pre-orders/components/PreOrderBadge.js +1 -1
  333. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +1 -1
  334. package/dist/features/price-index/components/PriceIndexToolView.d.ts +23 -4
  335. package/dist/features/price-index/components/PriceIndexToolView.js +71 -6
  336. package/dist/features/price-index/market-stats.d.ts +82 -0
  337. package/dist/features/price-index/market-stats.js +230 -0
  338. package/dist/features/print/components/BoxLabelPrintView.d.ts +25 -0
  339. package/dist/features/print/components/BoxLabelPrintView.js +66 -0
  340. package/dist/features/print/components/LabelProfilePicker.d.ts +13 -0
  341. package/dist/features/print/components/LabelProfilePicker.js +38 -0
  342. package/dist/features/print/components/labels.d.ts +117 -0
  343. package/dist/features/print/components/labels.js +258 -0
  344. package/dist/features/print/components/labels.style.css +46 -0
  345. package/dist/features/print/index.d.ts +6 -0
  346. package/dist/features/print/index.js +16 -0
  347. package/dist/features/products/columns/productTableColumns.js +5 -4
  348. package/dist/features/products/components/MarketplaceBundleCard.js +2 -2
  349. package/dist/features/products/components/MarketplacePrizeDrawCard.js +6 -6
  350. package/dist/features/products/components/PrizeDrawCollage.js +1 -1
  351. package/dist/features/products/components/PrizeDrawItemsEditor.js +1 -1
  352. package/dist/features/products/components/PrizeRevealModal.js +2 -2
  353. package/dist/features/products/components/ProductDetailPageView.js +18 -4
  354. package/dist/features/products/components/ProductForm.js +34 -23
  355. package/dist/features/products/components/ProductGrid.js +86 -62
  356. package/dist/features/products/constants/card-badges.d.ts +97 -0
  357. package/dist/features/products/constants/card-badges.js +100 -0
  358. package/dist/features/products/repository/products.repository.js +34 -1
  359. package/dist/features/products/schemas/firestore.d.ts +46 -3
  360. package/dist/features/products/schemas/firestore.js +21 -0
  361. package/dist/features/promotions/components/PromotionsView.js +1 -1
  362. package/dist/features/promotions/repository/claimed-coupons.repository.d.ts +32 -0
  363. package/dist/features/promotions/repository/claimed-coupons.repository.js +58 -0
  364. package/dist/features/promotions/schemas/firestore.js +30 -3
  365. package/dist/features/promotions/schemas/index.d.ts +6 -6
  366. package/dist/features/protection-claims/repository/protection-claims.repository.d.ts +54 -0
  367. package/dist/features/protection-claims/repository/protection-claims.repository.js +174 -0
  368. package/dist/features/protection-claims/schemas/firestore.d.ts +168 -0
  369. package/dist/features/protection-claims/schemas/firestore.js +130 -0
  370. package/dist/features/reviews/actions/review-actions.js +3 -2
  371. package/dist/features/reviews/components/ReviewModal.js +1 -1
  372. package/dist/features/reviews/components/ReviewsList.js +1 -1
  373. package/dist/features/reviews/schemas/firestore.d.ts +20 -1
  374. package/dist/features/scams/constants/scam-types.d.ts +2 -0
  375. package/dist/features/scams/constants/scam-types.js +18 -0
  376. package/dist/features/scams/schemas/report-form.d.ts +3 -3
  377. package/dist/features/scams/schemas/report-form.js +26 -1
  378. package/dist/features/search/components/Search.js +9 -9
  379. package/dist/features/search/components/SearchResultsClient.js +18 -3
  380. package/dist/features/search/components/SearchResultsPageView.d.ts +1 -6
  381. package/dist/features/search/components/SearchResultsPageView.js +2 -2
  382. package/dist/features/seller/actions/offer-actions.js +16 -1
  383. package/dist/features/seller/actions/seller-actions.js +14 -3
  384. package/dist/features/seller/components/CategoryInlineSelect.js +75 -11
  385. package/dist/features/seller/components/PrintCenterView.d.ts +5 -0
  386. package/dist/features/seller/components/PrintCenterView.js +41 -30
  387. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  388. package/dist/features/seller/components/SellerPayoutRequestView.js +16 -5
  389. package/dist/features/seller/components/SellerPayoutSettingsView.js +1 -1
  390. package/dist/features/seller/components/SellerProductShell.d.ts +16 -0
  391. package/dist/features/seller/components/SellerProductShell.js +123 -13
  392. package/dist/features/seller/components/SellerReviewsView.js +4 -2
  393. package/dist/features/seller/components/SellerSidebar.js +1 -1
  394. package/dist/features/seller/schemas/coupon-form.d.ts +26 -0
  395. package/dist/features/seller/schemas/coupon-form.js +27 -0
  396. package/dist/features/seller/schemas/product-form.d.ts +3 -0
  397. package/dist/features/seller/schemas/product-form.js +5 -0
  398. package/dist/features/shell/FormShell.js +2 -2
  399. package/dist/features/shell/QuickFormDrawer.js +14 -0
  400. package/dist/features/shell/SectionForm.d.ts +19 -0
  401. package/dist/features/shell/SectionForm.js +133 -9
  402. package/dist/features/shell/SectionForm.style.css +54 -0
  403. package/dist/features/shipments/components/AdminShipmentsView.js +16 -1
  404. package/dist/features/shipments/repository/shipment-items.repository.d.ts +9 -0
  405. package/dist/features/shipments/repository/shipment-items.repository.js +14 -0
  406. package/dist/features/site-settings/components/ActionPermissionsManager.js +1 -1
  407. package/dist/features/sticker-trace/components/StickerCommitPanel.js +1 -1
  408. package/dist/features/store-extensions/schemas/report-review-form.d.ts +8 -8
  409. package/dist/features/stores/components/StoreGuideHubView.js +1 -1
  410. package/dist/features/stores/components/StoreHeader.js +1 -1
  411. package/dist/features/support/schemas/firestore.d.ts +73 -2
  412. package/dist/features/support/schemas/firestore.js +59 -0
  413. package/dist/index.d.ts +16 -24
  414. package/dist/index.js +38 -47
  415. package/dist/next/ErrorBoundary.js +1 -1
  416. package/dist/next/routing/route-map.d.ts +24 -0
  417. package/dist/next/routing/route-map.js +40 -0
  418. package/dist/providers/payment-manual/index.d.ts +15 -1
  419. package/dist/providers/payment-manual/index.js +37 -0
  420. package/dist/providers/payment-phonepe/index.d.ts +14 -1
  421. package/dist/providers/payment-phonepe/index.js +36 -0
  422. package/dist/providers/payment-razorpay/index.d.ts +44 -1
  423. package/dist/providers/payment-razorpay/index.js +99 -0
  424. package/dist/providers/shipping-shiprocket/index.d.ts +18 -0
  425. package/dist/providers/shipping-shiprocket/index.js +18 -0
  426. package/dist/schemas/registry.d.ts +44 -11
  427. package/dist/server-entry.d.ts +2 -0
  428. package/dist/server-entry.js +27 -0
  429. package/dist/server.d.ts +43 -0
  430. package/dist/server.js +98 -0
  431. package/dist/styles.css +418 -149
  432. package/dist/tailwind-utilities.css +1 -1
  433. package/dist/tokens/themes/default-dark.js +15 -12
  434. package/dist/tokens/themes/default-light.js +14 -11
  435. package/dist/tokens/tokens.css +106 -23
  436. package/dist/ui/DataTable.style.css +4 -4
  437. package/dist/ui/columns/cell-renderers.d.ts +20 -0
  438. package/dist/ui/columns/cell-renderers.js +26 -1
  439. package/dist/ui/columns/index.d.ts +1 -1
  440. package/dist/ui/columns/index.js +4 -1
  441. package/dist/ui/components/Badge.style.css +1 -1
  442. package/dist/ui/components/Breadcrumb.js +19 -1
  443. package/dist/ui/components/BulkActionBar.style.css +4 -4
  444. package/dist/ui/components/Button.style.css +1 -1
  445. package/dist/ui/components/Checkbox.style.css +1 -1
  446. package/dist/ui/components/FallbackShell.js +1 -1
  447. package/dist/ui/components/Form.d.ts +14 -1
  448. package/dist/ui/components/Form.js +2 -2
  449. package/dist/ui/components/FormField.js +18 -4
  450. package/dist/ui/components/FormField.style.css +43 -3
  451. package/dist/ui/components/GatedPrice.style.css +1 -1
  452. package/dist/ui/components/IconButton.style.css +1 -1
  453. package/dist/ui/components/Input.js +22 -1
  454. package/dist/ui/components/Input.style.css +38 -22
  455. package/dist/ui/components/ListingFilterDrawer.js +1 -1
  456. package/dist/ui/components/ListingToolbar.js +1 -1
  457. package/dist/ui/components/PaginatedSelect.js +0 -0
  458. package/dist/ui/components/Radio.style.css +1 -1
  459. package/dist/ui/components/Repeater.d.ts +53 -0
  460. package/dist/ui/components/Repeater.js +7 -0
  461. package/dist/ui/components/RichTextEditor.d.ts +20 -1
  462. package/dist/ui/components/RichTextEditor.js +23 -2
  463. package/dist/ui/components/Select.style.css +7 -21
  464. package/dist/ui/components/Semantic.js +27 -3
  465. package/dist/ui/components/TagInput.style.css +4 -9
  466. package/dist/ui/components/Textarea.style.css +4 -18
  467. package/dist/ui/components/Toggle.style.css +1 -1
  468. package/dist/ui/components/Typography.d.ts +3 -3
  469. package/dist/ui/components/Typography.js +15 -15
  470. package/dist/ui/components/ViewToggle.style.css +4 -4
  471. package/dist/ui/forms/AddAnotherToggle.d.ts +16 -0
  472. package/dist/ui/forms/AddAnotherToggle.js +56 -0
  473. package/dist/ui/forms/ColorPickerField.js +15 -2
  474. package/dist/ui/forms/FieldCheckbox.js +15 -2
  475. package/dist/ui/forms/FieldInput.d.ts +22 -1
  476. package/dist/ui/forms/FieldInput.js +19 -5
  477. package/dist/ui/forms/FieldLabel.d.ts +35 -0
  478. package/dist/ui/forms/FieldLabel.js +70 -0
  479. package/dist/ui/forms/FieldSelect.d.ts +4 -1
  480. package/dist/ui/forms/FieldSelect.js +27 -5
  481. package/dist/ui/forms/FieldTextarea.d.ts +4 -1
  482. package/dist/ui/forms/FieldTextarea.js +22 -5
  483. package/dist/ui/forms/FormShell.d.ts +17 -1
  484. package/dist/ui/forms/FormShell.js +36 -2
  485. package/dist/ui/forms/FormShell.style.css +41 -33
  486. package/dist/ui/forms/index.d.ts +5 -1
  487. package/dist/ui/forms/index.js +2 -0
  488. package/dist/ui/icons/icon-registry.d.ts +1 -0
  489. package/dist/ui/icons/icon-registry.js +17 -1
  490. package/dist/utils/id-generators.d.ts +80 -0
  491. package/dist/utils/id-generators.js +93 -0
  492. package/dist/utils/search-txt-builders.d.ts +12 -0
  493. package/dist/utils/search-txt-builders.js +17 -0
  494. package/package.json +1 -1
  495. package/scripts/seed-cli.mjs +106 -5
  496. package/dist/features/loyalty/api/admin/loyalty/grant/route.d.ts +0 -12
  497. package/dist/features/loyalty/api/admin/loyalty/grant/route.js +0 -38
  498. package/dist/features/loyalty/api/balance/route.d.ts +0 -12
  499. package/dist/features/loyalty/api/balance/route.js +0 -41
  500. package/dist/features/loyalty/api/earn/route.d.ts +0 -12
  501. package/dist/features/loyalty/api/earn/route.js +0 -38
  502. package/dist/features/loyalty/api/history/route.d.ts +0 -12
  503. package/dist/features/loyalty/api/history/route.js +0 -58
  504. package/dist/features/loyalty/api/redeem/route.d.ts +0 -12
  505. package/dist/features/loyalty/api/redeem/route.js +0 -38
  506. package/dist/features/loyalty/columns/index.d.ts +0 -17
  507. package/dist/features/loyalty/columns/index.js +0 -40
  508. package/dist/features/loyalty/components/CoinsDisplay.d.ts +0 -12
  509. package/dist/features/loyalty/components/CoinsDisplay.js +0 -10
  510. package/dist/features/loyalty/components/index.d.ts +0 -1
  511. package/dist/features/loyalty/components/index.js +0 -1
  512. package/dist/features/loyalty/hooks/useLoyaltyBalance.d.ts +0 -4
  513. package/dist/features/loyalty/hooks/useLoyaltyBalance.js +0 -25
  514. package/dist/features/loyalty/index.d.ts +0 -6
  515. package/dist/features/loyalty/index.js +0 -6
  516. package/dist/features/loyalty/manifest.d.ts +0 -2
  517. package/dist/features/loyalty/manifest.js +0 -16
  518. package/dist/features/loyalty/messages/en.json +0 -19
  519. package/dist/features/loyalty/repository/loyalty.repository.d.ts +0 -8
  520. package/dist/features/loyalty/repository/loyalty.repository.js +0 -22
  521. package/dist/features/loyalty/schemas/index.d.ts +0 -85
  522. package/dist/features/loyalty/schemas/index.js +0 -40
  523. package/dist/features/loyalty/server.d.ts +0 -6
  524. package/dist/features/loyalty/server.js +0 -6
  525. package/dist/features/loyalty/types/index.d.ts +0 -31
  526. package/dist/features/loyalty/types/index.js +0 -1
  527. package/dist/features/loyalty/types/loyalty-config.d.ts +0 -7
  528. package/dist/features/loyalty/types/loyalty-config.js +0 -1
  529. package/dist/features/loyalty/types/loyalty-math.d.ts +0 -9
  530. package/dist/features/loyalty/types/loyalty-math.js +0 -27
  531. package/dist/features/products/components/ProductOwnerQuickActions.d.ts +0 -11
  532. package/dist/features/products/components/ProductOwnerQuickActions.js +0 -120
@@ -41,8 +41,8 @@ export const DEFAULT_DARK_THEME = {
41
41
  "appkit-color-secondary-950": "#083344",
42
42
  "appkit-color-bg": "#020617",
43
43
  "appkit-color-surface": "#0f172a",
44
- "appkit-color-surface-elevated": "rgba(15, 23, 42, 0.9)",
45
- "appkit-color-surface-input": "rgba(30, 41, 59, 0.6)",
44
+ "appkit-color-surface-elevated": "#1e293b",
45
+ "appkit-color-surface-input": "#0b1220",
46
46
  // Theme-inverting interactive fills. Must stay byte-identical to the
47
47
  // [data-theme="default-dark"] block in tokens.css — audit-theme-drift
48
48
  // compares them.
@@ -87,16 +87,19 @@ export const DEFAULT_DARK_THEME = {
87
87
  "appkit-space-18": "4.5rem",
88
88
  "appkit-space-20": "5rem",
89
89
  "appkit-space-24": "6rem",
90
- "appkit-text-2xs": "0.625rem",
91
- "appkit-text-xs": "0.6875rem",
92
- "appkit-text-sm": "0.8125rem",
93
- "appkit-text-base": "0.9375rem",
94
- "appkit-text-lg": "1rem",
95
- "appkit-text-xl": "1.125rem",
96
- "appkit-text-2xl": "1.375rem",
97
- "appkit-text-3xl": "1.625rem",
98
- "appkit-text-4xl": "1.875rem",
99
- "appkit-text-5xl": "2.5rem",
90
+ "appkit-text-2xs": "0.6875rem",
91
+ "appkit-text-xs": "0.75rem",
92
+ "appkit-text-sm": "0.875rem",
93
+ "appkit-text-base": "1rem",
94
+ "appkit-text-lg": "1.125rem",
95
+ "appkit-text-xl": "1.25rem",
96
+ "appkit-text-2xl": "1.5rem",
97
+ "appkit-text-3xl": "1.875rem",
98
+ "appkit-text-4xl": "2.25rem",
99
+ "appkit-text-5xl": "3rem",
100
+ "appkit-text-6xl": "3.75rem",
101
+ "appkit-text-7xl": "4.5rem",
102
+ "appkit-text-8xl": "6rem",
100
103
  },
101
104
  gradients: {
102
105
  brand: "linear-gradient(to right, var(--appkit-color-primary), var(--appkit-color-secondary))",
@@ -45,7 +45,7 @@ export const DEFAULT_LIGHT_THEME = {
45
45
  "appkit-color-bg": "#fafafa",
46
46
  "appkit-color-surface": "#ffffff",
47
47
  "appkit-color-surface-elevated": "#ffffff",
48
- "appkit-color-surface-input": "#ffffff",
48
+ "appkit-color-surface-input": "#fafafa",
49
49
  // Theme-inverting interactive fills. Must stay byte-identical to the
50
50
  // matching :root block in tokens.css — audit-theme-drift compares them.
51
51
  "appkit-color-surface-hover": "#f4f4f5",
@@ -94,16 +94,19 @@ export const DEFAULT_LIGHT_THEME = {
94
94
  "appkit-space-18": "4.5rem",
95
95
  "appkit-space-20": "5rem",
96
96
  "appkit-space-24": "6rem",
97
- "appkit-text-2xs": "0.625rem",
98
- "appkit-text-xs": "0.6875rem",
99
- "appkit-text-sm": "0.8125rem",
100
- "appkit-text-base": "0.9375rem",
101
- "appkit-text-lg": "1rem",
102
- "appkit-text-xl": "1.125rem",
103
- "appkit-text-2xl": "1.375rem",
104
- "appkit-text-3xl": "1.625rem",
105
- "appkit-text-4xl": "1.875rem",
106
- "appkit-text-5xl": "2.5rem",
97
+ "appkit-text-2xs": "0.6875rem",
98
+ "appkit-text-xs": "0.75rem",
99
+ "appkit-text-sm": "0.875rem",
100
+ "appkit-text-base": "1rem",
101
+ "appkit-text-lg": "1.125rem",
102
+ "appkit-text-xl": "1.25rem",
103
+ "appkit-text-2xl": "1.5rem",
104
+ "appkit-text-3xl": "1.875rem",
105
+ "appkit-text-4xl": "2.25rem",
106
+ "appkit-text-5xl": "3rem",
107
+ "appkit-text-6xl": "3.75rem",
108
+ "appkit-text-7xl": "4.5rem",
109
+ "appkit-text-8xl": "6rem",
107
110
  },
108
111
  gradients: {
109
112
  brand: "linear-gradient(to right, var(--appkit-color-primary), var(--appkit-color-secondary))",
@@ -264,7 +264,13 @@
264
264
  --appkit-color-bg: #fafafa; /* zinc-50 */
265
265
  --appkit-color-surface: #ffffff; /* white */
266
266
  --appkit-color-surface-elevated: #ffffff;
267
- --appkit-color-surface-input: #ffffff;
267
+ /* 🛑 A FILL, not white. This was `#ffffff` — identical to `surface` — so a
268
+ * field on a white card had nothing but a 1px `#e4e4e7` border to mark it,
269
+ * which measures ~1.2:1 and is why the audit reported fields reading as
270
+ * faint outlines rather than objects. A recessed well is the cheaper fix
271
+ * than darkening every border in the product, because `--appkit-color-border`
272
+ * is also every divider and table rule. */
273
+ --appkit-color-surface-input: #fafafa; /* zinc-50 — recessed on a white card */
268
274
 
269
275
  /* --- Interactive surfaces ------------------------------------------------
270
276
  * `-hover` is the neutral chrome hover fill; `-raised` is a resting panel one
@@ -335,6 +341,49 @@
335
341
  --appkit-color-info-on-solid: #ffffff;
336
342
 
337
343
  --appkit-color-focus-ring: #0d9488; /* primary-600 = teal */
344
+
345
+ /* --- The focus ring, in ONE place ----------------------------------------
346
+ *
347
+ * 🛑 `--appkit-color-focus-ring` HAD NO READER. It is declared by all four
348
+ * built-in themes, listed in `required.ts`, and surfaced as an editable
349
+ * swatch in the admin Theme Manager — and not one stylesheet consumed it.
350
+ * Every ring in the product was a hardcoded `rgba()` of the brand RETIRED
351
+ * on 2026-08-17: lime green `rgba(101, 196, 8, …)` in 9 primitives and hot
352
+ * pink `rgba(233, 30, 140, …)` in 6. So an admin could pick a focus colour
353
+ * and change nothing, while every focused control showed a dead brand.
354
+ *
355
+ * Three tokens because the primitives use three genuinely different ring
356
+ * SHAPES, and the shapes are kept byte-for-byte as they were — only the
357
+ * colour is re-pointed, so this carries no visual risk beyond the hue:
358
+ *
359
+ * -ring text fields (Input, Select, Textarea): 3px + a 1px inset
360
+ * -compact buttons (Button, IconButton, TagInput): a flat 2px
361
+ * -halo Checkbox / Radio / Toggle: 2px, then a 4px surface-coloured
362
+ * gap so the ring reads against the control it is hugging
363
+ *
364
+ * They resolve `--appkit-color-focus-ring` at USE time, so each theme's own
365
+ * value applies automatically and every `.dark` focus override in the
366
+ * primitives becomes dead weight — which is the structural half of the fix:
367
+ * light and dark can no longer disagree, because there is only one value.
368
+ *
369
+ * `color-mix` unguarded, matching `--appkit-gradient-glass` above and
370
+ * `--glow-color` in globals.css. */
371
+ --appkit-focus-ring:
372
+ 0 0 0 3px color-mix(in srgb, var(--appkit-color-focus-ring) 25%, transparent),
373
+ inset 0 0 0 1px color-mix(in srgb, var(--appkit-color-focus-ring) 15%, transparent);
374
+ --appkit-focus-ring-compact:
375
+ 0 0 0 2px color-mix(in srgb, var(--appkit-color-focus-ring) 20%, transparent);
376
+ --appkit-focus-ring-halo:
377
+ 0 0 0 2px color-mix(in srgb, var(--appkit-color-focus-ring) 30%, transparent),
378
+ 0 0 0 4px var(--appkit-color-surface);
379
+ /* Same shape as `--appkit-focus-ring`, keyed on the error colour — a field
380
+ * that failed validation keeps its red edge while focused instead of
381
+ * swapping to the focus hue and losing the only signal it had. Was
382
+ * `rgba(248, 113, 113, …)` (red-400) hardcoded in Input and Select: the
383
+ * right family, but fixed in every theme and deaf to `--appkit-color-error`. */
384
+ --appkit-focus-ring-error:
385
+ 0 0 0 3px color-mix(in srgb, var(--appkit-color-error) 25%, transparent),
386
+ inset 0 0 0 1px color-mix(in srgb, var(--appkit-color-error) 15%, transparent);
338
387
  }
339
388
 
340
389
  /* --- Gradients — default-light defaults (overridden at runtime by ThemeProvider) - */
@@ -405,8 +454,23 @@
405
454
 
406
455
  --appkit-color-bg: #020617; /* slate-950 */
407
456
  --appkit-color-surface: #0f172a; /* slate-900 */
408
- --appkit-color-surface-elevated: rgba(15, 23, 42, 0.9);
409
- --appkit-color-surface-input: rgba(30, 41, 59, 0.6); /* slate-800/60 */
457
+ /* 🛑 ELEVATED WAS DARKER THAN SURFACE. `rgba(15, 23, 42, 0.9)` composites
458
+ * over the page to ~#0e1528, i.e. BELOW `surface` (#0f172a) — so in a dark
459
+ * theme, where elevation reads as "closer to the light", every elevated
460
+ * panel sank instead of rising. That is the audit's "the hero card is
461
+ * nearly invisible against the page".
462
+ *
463
+ * Opaque, not an alpha, and that is the actual lesson: a translucent
464
+ * elevation token composites against WHATEVER IS BEHIND IT, so the same
465
+ * "elevated" panel rendered one colour over the page and another over a
466
+ * card — which is how it ended up below `surface` in the first place
467
+ * without anyone choosing that. */
468
+ --appkit-color-surface-elevated: #1e293b; /* slate-800 — one step UP from surface */
469
+ /* Recessed, and distinct from all three panel levels, because an input
470
+ * appears on the page, on a card and on an elevated panel. The old
471
+ * `rgba(30, 41, 59, 0.6)` composited to the panel's own colour on an
472
+ * elevated panel — an input that disappears into the thing it sits on. */
473
+ --appkit-color-surface-input: #0b1220; /* a well, below slate-900 */
410
474
 
411
475
  /* --- Interactive surfaces ------------------------------------------------
412
476
  * `-hover` is the neutral chrome hover fill; `-raised` is a resting panel one
@@ -499,16 +563,19 @@
499
563
  --appkit-space-20: 5rem;
500
564
  --appkit-space-24: 6rem;
501
565
 
502
- --appkit-text-2xs: 0.625rem;
503
- --appkit-text-xs: 0.6875rem;
504
- --appkit-text-sm: 0.8125rem;
505
- --appkit-text-base: 0.9375rem;
506
- --appkit-text-lg: 1rem;
507
- --appkit-text-xl: 1.125rem;
508
- --appkit-text-2xl: 1.375rem;
509
- --appkit-text-3xl: 1.625rem;
510
- --appkit-text-4xl: 1.875rem;
511
- --appkit-text-5xl: 2.5rem;
566
+ --appkit-text-2xs: 0.6875rem;
567
+ --appkit-text-xs: 0.75rem;
568
+ --appkit-text-sm: 0.875rem;
569
+ --appkit-text-base: 1rem;
570
+ --appkit-text-lg: 1.125rem;
571
+ --appkit-text-xl: 1.25rem;
572
+ --appkit-text-2xl: 1.5rem;
573
+ --appkit-text-3xl: 1.875rem;
574
+ --appkit-text-4xl: 2.25rem;
575
+ --appkit-text-5xl: 3rem;
576
+ --appkit-text-6xl: 3.75rem;
577
+ --appkit-text-7xl: 4.5rem;
578
+ --appkit-text-8xl: 6rem;
512
579
  }
513
580
 
514
581
  /* --- Theme — Cobalt Night ([data-theme="cobalt-night"]) ------------------- */
@@ -639,16 +706,19 @@
639
706
  --appkit-font-editorial: var(--font-editorial), "Georgia", serif;
640
707
  --appkit-font-mono: ui-monospace, "SFMono-Regular", "Cascadia Mono", "Consolas", monospace;
641
708
 
642
- --appkit-text-2xs: 0.625rem; /* 10px */
643
- --appkit-text-xs: 0.6875rem; /* 11px */
644
- --appkit-text-sm: 0.8125rem; /* 13px */
645
- --appkit-text-base: 0.9375rem; /* 15px */
646
- --appkit-text-lg: 1rem; /* 16px */
647
- --appkit-text-xl: 1.125rem; /* 18px */
648
- --appkit-text-2xl: 1.375rem; /* 22px */
649
- --appkit-text-3xl: 1.625rem; /* 26px */
650
- --appkit-text-4xl: 1.875rem; /* 30px */
651
- --appkit-text-5xl: 2.5rem; /* 40px */
709
+ --appkit-text-2xs: 0.6875rem;
710
+ --appkit-text-xs: 0.75rem;
711
+ --appkit-text-sm: 0.875rem;
712
+ --appkit-text-base: 1rem;
713
+ --appkit-text-lg: 1.125rem;
714
+ --appkit-text-xl: 1.25rem;
715
+ --appkit-text-2xl: 1.5rem;
716
+ --appkit-text-3xl: 1.875rem;
717
+ --appkit-text-4xl: 2.25rem;
718
+ --appkit-text-5xl: 3rem;
719
+ --appkit-text-6xl: 3.75rem;
720
+ --appkit-text-7xl: 4.5rem;
721
+ --appkit-text-8xl: 6rem;
652
722
 
653
723
  --appkit-leading-tight: 1.15;
654
724
  --appkit-leading-snug: 1.375;
@@ -664,6 +734,19 @@
664
734
 
665
735
  /* --- Spacing -------------------------------------------------------------- */
666
736
  :root {
737
+ /* 🛑 THE SCALE HAD NO ZERO, and 18 call sites reached for it anyway.
738
+ *
739
+ * `p-[var(--appkit-space-0)]` on a control that wants no padding resolved
740
+ * to an undefined var, which drops the declaration — so every one of those
741
+ * controls kept its DEFAULT padding, the exact opposite of the intent. The
742
+ * tightest case is `AdminNavigationView`'s ▲/▼ reorder buttons, which pair
743
+ * it with `min-h-0 h-auto` to get a glyph-sized hit area and instead got a
744
+ * full-size button.
745
+ *
746
+ * Declared rather than rewritten to `p-0` at each site: 18 independent
747
+ * authors reaching for the same name is the scale's gap, not 18 mistakes,
748
+ * and a scale that starts at 2px cannot express "none". */
749
+ --appkit-space-0: 0rem; /* 0px */
667
750
  --appkit-space-0-5: 0.125rem; /* 2px */
668
751
  --appkit-space-1: 0.25rem; /* 4px */
669
752
  --appkit-space-1-5: 0.375rem; /* 6px */
@@ -168,15 +168,15 @@
168
168
  }
169
169
 
170
170
  .appkit-data-table__view-btn--active {
171
- background: rgba(80, 156, 2, 0.05);
171
+ background: color-mix(in srgb, var(--appkit-color-secondary) 5%, transparent);
172
172
  color: var(--appkit-color-secondary-600);
173
- box-shadow: inset 0 0 0 1px rgba(80, 156, 2, 0.3);
173
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--appkit-color-secondary) 30%, transparent);
174
174
  }
175
175
 
176
176
  :is(.dark) .appkit-data-table__view-btn--active {
177
- background: rgba(233, 30, 140, 0.1);
177
+ background: color-mix(in srgb, var(--appkit-color-primary) 10%, transparent);
178
178
  color: var(--appkit-color-primary);
179
- box-shadow: inset 0 0 0 1px rgba(233, 30, 140, 0.3);
179
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--appkit-color-primary) 30%, transparent);
180
180
  }
181
181
 
182
182
  .appkit-data-table__mobile-cards {
@@ -7,6 +7,26 @@ import { type StatusTone } from "./column-renderers";
7
7
  * and `AdminViewCards.tsx`. Both are now consumers of this one.
8
8
  */
9
9
  export declare const STATUS_TONE_CLASSES: Record<StatusTone, string>;
10
+ /**
11
+ * A stored status value as something a person reads.
12
+ *
13
+ * 🛑 EVERY status chip in the product printed the raw enum. This renderer
14
+ * used `status` verbatim, so admin tables and cards showed `published`,
15
+ * `in_review`, `out_of_stock` — lowercase, underscored, in our vocabulary
16
+ * rather than the reader's. That is the audit's "status is plain lowercase
17
+ * text where every other surface uses badges": the chip was there, its
18
+ * CONTENT was the database value.
19
+ *
20
+ * 🛑 And `productTableColumns` hand-rolled `status.replace("_", " ")`, which
21
+ * is worse than doing nothing: a STRING pattern replaces only the FIRST
22
+ * occurrence, so `out_of_stock` rendered as "out of_stock". A regex with `g`
23
+ * is the fix, which is reason enough for one helper instead of a `.replace`
24
+ * at each call site.
25
+ *
26
+ * Sentence case, not Title Case: these sit in dense table cells beside real
27
+ * sentences, and "Out Of Stock" reads like a proper noun.
28
+ */
29
+ export declare function statusLabel(status: string): string;
10
30
  /** A status string as a themed chip. Unknown statuses render neutral, not invisible. */
11
31
  export declare function renderStatusBadge(status: string | null | undefined, opts?: {
12
32
  emptyLabel?: string;
@@ -21,9 +21,34 @@ export const STATUS_TONE_CLASSES = {
21
21
  // Not a status colour — see the header.
22
22
  neutral: "bg-[var(--appkit-color-surface-elevated)] text-[var(--appkit-color-text-muted)]",
23
23
  };
24
+ /**
25
+ * A stored status value as something a person reads.
26
+ *
27
+ * 🛑 EVERY status chip in the product printed the raw enum. This renderer
28
+ * used `status` verbatim, so admin tables and cards showed `published`,
29
+ * `in_review`, `out_of_stock` — lowercase, underscored, in our vocabulary
30
+ * rather than the reader's. That is the audit's "status is plain lowercase
31
+ * text where every other surface uses badges": the chip was there, its
32
+ * CONTENT was the database value.
33
+ *
34
+ * 🛑 And `productTableColumns` hand-rolled `status.replace("_", " ")`, which
35
+ * is worse than doing nothing: a STRING pattern replaces only the FIRST
36
+ * occurrence, so `out_of_stock` rendered as "out of_stock". A regex with `g`
37
+ * is the fix, which is reason enough for one helper instead of a `.replace`
38
+ * at each call site.
39
+ *
40
+ * Sentence case, not Title Case: these sit in dense table cells beside real
41
+ * sentences, and "Out Of Stock" reads like a proper noun.
42
+ */
43
+ export function statusLabel(status) {
44
+ const words = status.replace(/[_-]+/g, " ").trim();
45
+ if (!words)
46
+ return status;
47
+ return words.charAt(0).toUpperCase() + words.slice(1).toLowerCase();
48
+ }
24
49
  /** A status string as a themed chip. Unknown statuses render neutral, not invisible. */
25
50
  export function renderStatusBadge(status, opts) {
26
- const label = status ?? opts?.emptyLabel ?? "—";
51
+ const label = status ? statusLabel(status) : (opts?.emptyLabel ?? "—");
27
52
  const tone = getStatusTone(status);
28
53
  return (_jsx(Span, { size: "xs", weight: "medium", rounded: "full", padding: "pill-sm-tall", className: `inline-flex whitespace-nowrap ${STATUS_TONE_CLASSES[tone]}`, children: label }));
29
54
  }
@@ -4,4 +4,4 @@
4
4
  export { buildColumns, createColumnBuilder, resolveColumnPriority } from "./build-columns";
5
5
  export { renderBoolean, renderCurrency, renderCurrencyCompact, renderCount, renderNullable, renderRating, getStatusTone, getResourceIcon, } from "./column-renderers";
6
6
  export type { BooleanRenderOpts, RatingMode, RatingRenderOpts, StatusTone, } from "./column-renderers";
7
- export { STATUS_TONE_CLASSES, renderStatusBadge, renderThumbnail, renderAvatar, renderMoney, renderRelativeDate, renderBooleanIcon, renderCountPill, renderTypeChip, } from "./cell-renderers";
7
+ export { STATUS_TONE_CLASSES, renderStatusBadge, renderThumbnail, renderAvatar, renderMoney, renderRelativeDate, renderBooleanIcon, renderCountPill, renderTypeChip, statusLabel, } from "./cell-renderers";
@@ -6,4 +6,7 @@ export { renderBoolean, renderCurrency, renderCurrencyCompact, renderCount, rend
6
6
  // JSX renderers. Deliberately a separate module from `column-renderers.ts`:
7
7
  // that one is React-free so it can run in a server context, and mixing the two
8
8
  // would drag React into every consumer of a plain string formatter.
9
- export { STATUS_TONE_CLASSES, renderStatusBadge, renderThumbnail, renderAvatar, renderMoney, renderRelativeDate, renderBooleanIcon, renderCountPill, renderTypeChip, } from "./cell-renderers.js";
9
+ export { STATUS_TONE_CLASSES, renderStatusBadge, renderThumbnail, renderAvatar, renderMoney, renderRelativeDate, renderBooleanIcon, renderCountPill, renderTypeChip,
10
+ // The status LABEL on its own, for the handful of cells that need this
11
+ // feature's own tones but the shared wording — see productTableColumns.
12
+ statusLabel, } from "./cell-renderers.js";
@@ -68,7 +68,7 @@
68
68
  .appkit-badge--secondary {
69
69
  background: var(--appkit-color-secondary-50);
70
70
  color: var(--appkit-color-secondary-700);
71
- border-color: rgba(101, 196, 8, 0.25);
71
+ border-color: color-mix(in srgb, var(--appkit-color-secondary) 25%, transparent);
72
72
  }
73
73
 
74
74
  .dark .appkit-badge--active,
@@ -4,7 +4,25 @@ import { Nav, Ol, Li } from "./Semantic.js";
4
4
  import { Span } from "./Typography.js";
5
5
  import { TextLink } from "./TextLink.js";
6
6
  export function Breadcrumb({ items, className = "", tone = "default" }) {
7
- return (_jsx(Nav, { "aria-label": "Breadcrumb", className: `${tone === "on-media" ? "appkit-breadcrumb--on-media" : ""} ${className}`, children: _jsx(Ol, { className: "appkit-breadcrumb__list", children: items.map((item, i) => {
7
+ return (
8
+ /*
9
+ * 🛑 `appkit-page-breadcrumb` IS A SIGNAL TO CSS, not a style hook — and
10
+ * it belongs on THIS primitive rather than on `BreadcrumbTrail`, because
11
+ * this is the one thing every page-level breadcrumb has in common.
12
+ * `BreadcrumbTrail` wraps it; the scam registry's three surfaces render it
13
+ * directly; and `AutoBreadcrumbs` — the automatic, pathname-derived trail
14
+ * the shell renders on every route — does NOT use it at all, building its
15
+ * own `<Nav><Ol>`. So this class means exactly "a page supplied its own
16
+ * breadcrumb", with one owner and nothing to keep in sync.
17
+ *
18
+ * `AutoBreadcrumbs.style.css` hides the automatic trail when this appears
19
+ * anywhere in the body. See that file for why the resolution is `:has()`
20
+ * and not React state: the shell renders before `{children}`, so a flag a
21
+ * page sets arrives a frame late, and hiding a full-width strip after
22
+ * paint is the top-of-page layout shift just fixed on the announcement
23
+ * bar.
24
+ */
25
+ _jsx(Nav, { "aria-label": "Breadcrumb", className: `appkit-page-breadcrumb ${tone === "on-media" ? "appkit-breadcrumb--on-media" : ""} ${className}`, children: _jsx(Ol, { className: "appkit-breadcrumb__list", children: items.map((item, i) => {
8
26
  const isLast = i === items.length - 1;
9
27
  return (_jsxs(Li, { className: "appkit-breadcrumb__item", children: [i > 0 && (_jsx(ChevronRight, { className: "appkit-breadcrumb__separator", "aria-hidden": "true" })), isLast || !item.href ? (_jsx(Span, { className: isLast
10
28
  ? "appkit-breadcrumb__current"
@@ -2,7 +2,7 @@
2
2
  position: relative;
3
3
  border-radius: 0.5rem;
4
4
  overflow: hidden;
5
- border: 1px solid rgba(80, 156, 2, 0.2);
5
+ border: 1px solid color-mix(in srgb, var(--appkit-color-secondary) 20%, transparent);
6
6
  animation: appkit-slide-in 150ms ease;
7
7
  }
8
8
 
@@ -34,14 +34,14 @@
34
34
  height: 2rem;
35
35
  padding: 0 0.75rem 0 0.5rem;
36
36
  border-radius: 9999px;
37
- border: 1px solid rgba(80, 156, 2, 0.3);
38
- background: rgba(80, 156, 2, 0.07);
37
+ border: 1px solid color-mix(in srgb, var(--appkit-color-secondary) 30%, transparent);
38
+ background: color-mix(in srgb, var(--appkit-color-secondary) 7%, transparent);
39
39
  color: var(--appkit-color-secondary-700);
40
40
  transition: background-color 0.15s ease;
41
41
  }
42
42
 
43
43
  .appkit-bulk-bar__count-pill:hover {
44
- background: rgba(80, 156, 2, 0.14);
44
+ background: color-mix(in srgb, var(--appkit-color-secondary) 14%, transparent);
45
45
  }
46
46
 
47
47
  .appkit-bulk-bar__count-icon {
@@ -49,7 +49,7 @@
49
49
 
50
50
  .appkit-button:focus-visible {
51
51
  outline: none;
52
- box-shadow: 0 0 0 2px rgba(101, 196, 8, 0.2);
52
+ box-shadow: var(--appkit-focus-ring-compact);
53
53
  }
54
54
 
55
55
  .appkit-button:disabled {
@@ -50,7 +50,7 @@
50
50
  }
51
51
  .appkit-checkbox__input:focus-visible {
52
52
  outline: none;
53
- box-shadow: 0 0 0 2px rgba(101, 196, 8, 0.3), 0 0 0 4px var(--appkit-color-surface);
53
+ box-shadow: var(--appkit-focus-ring-halo);
54
54
  }
55
55
  .appkit-checkbox__input:not(:disabled):hover {
56
56
  border-color: var(--appkit-color-secondary);
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  const TONE_BG = {
4
- neutral: "var(--appkit-color-surface-muted)",
4
+ neutral: "var(--appkit-color-bg)",
5
5
  danger: "var(--appkit-color-error-surface)",
6
6
  warning: "var(--appkit-color-warning-surface)",
7
7
  };
@@ -41,6 +41,19 @@ export interface FormProps extends Omit<React.FormHTMLAttributes<HTMLFormElement
41
41
  * this in a modal is a no-op rather than a bug.
42
42
  */
43
43
  bottomBar?: FormBottomBarConfig;
44
+ /**
45
+ * Offer "Create & add another" — render `<AddAnotherToggle>` somewhere in
46
+ * the form and read `addAnother` from the render-prop helpers' `shellCtx`.
47
+ *
48
+ * 🛑 PASSING THIS IS AN OBLIGATION, not a flag. The submit handler must keep
49
+ * the user on the form with a fresh draft when `addAnother` is true;
50
+ * otherwise it ships a checkbox that does nothing, which is the shape this
51
+ * codebase has paid for most often. `audit-add-another-honoured` blocks it.
52
+ *
53
+ * Ignored when `shellCtx` is supplied — the parent that owns the state owns
54
+ * this decision too, and two sources would disagree the first time one moved.
55
+ */
56
+ allowAddAnother?: boolean;
44
57
  /** Cross-axis alignment of flex/grid children. Replaces raw `items-*` className. */
45
58
  align?: "start" | "center" | "end" | "stretch";
46
59
  /** Gap between children — use instead of raw `gap-*` className. */
@@ -55,7 +68,7 @@ export interface FormBottomBarConfig {
55
68
  isLoading?: boolean;
56
69
  disabled?: boolean;
57
70
  }
58
- export declare function Form({ children, spacing, schema, shellCtx: shellCtxProp, bottomBar, align, gap, surface, padding, paddingX, paddingY, rounded, roundedTop, roundedBottom, border, shadow, overflow, className, ...props }: FormProps): React.JSX.Element;
71
+ export declare function Form({ children, spacing, schema, shellCtx: shellCtxProp, bottomBar, allowAddAnother, align, gap, surface, padding, paddingX, paddingY, rounded, roundedTop, roundedBottom, border, shadow, overflow, className, ...props }: FormProps): React.JSX.Element;
59
72
  export interface FormGroupProps {
60
73
  children: React.ReactNode;
61
74
  columns?: 1 | 2 | 3 | 4;
@@ -45,8 +45,8 @@ const FORM_ALIGN_MAP = {
45
45
  end: "items-end",
46
46
  stretch: "items-stretch",
47
47
  };
48
- export function Form({ children, spacing, schema, shellCtx: shellCtxProp, bottomBar, align, gap, surface, padding, paddingX, paddingY, rounded, roundedTop, roundedBottom, border, shadow, overflow, className = "", ...props }) {
49
- const helpers = useFormShellState(schema);
48
+ export function Form({ children, spacing, schema, shellCtx: shellCtxProp, bottomBar, allowAddAnother, align, gap, surface, padding, paddingX, paddingY, rounded, roundedTop, roundedBottom, border, shadow, overflow, className = "", ...props }) {
49
+ const helpers = useFormShellState(schema, undefined, { allowAddAnother });
50
50
  const effectiveCtx = shellCtxProp ?? helpers.shellCtx;
51
51
  /*
52
52
  * Marking the attempt on the NATIVE submit event covers both shapes this
@@ -1,10 +1,11 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useContext } from "react";
3
+ import { useContext, useId } from "react";
4
4
  import { Input } from "./Input.js";
5
5
  import { Select } from "./Select.js";
6
6
  import { Textarea } from "./Textarea.js";
7
- import { Label, Text, Span } from "./Typography.js";
7
+ import { Text } from "./Typography.js";
8
+ import { FieldLabel } from "../forms/FieldLabel.js";
8
9
  /*
9
10
  * 🛑 FROM THE DEFINING MODULES, NOT the `features/media` barrel.
10
11
  *
@@ -40,7 +41,20 @@ export function FormField({ label, name, card = false, type = "text", value = ""
40
41
  ? touched && !!error
41
42
  : !!error
42
43
  : false;
43
- const inputId = `field-${name}`;
44
+ const reactId = useId();
45
+ /*
46
+ * 🛑 UNIQUE PER INSTANCE. This was `field-${name}`, so two fields sharing a
47
+ * name on one page produced two elements with the SAME id — `/auth/login`
48
+ * shipped two `id="field-email"` (the sign-in form and the footer
49
+ * newsletter).
50
+ *
51
+ * That is not cosmetic. `htmlFor` resolves to the FIRST element with the
52
+ * id, so the second field's label points at the first field's input: the
53
+ * label is present in the markup and the input has no accessible name, which
54
+ * is what an accessibility pass reports as an unlabelled field. Clicking the
55
+ * second label also focuses the first input.
56
+ */
57
+ const inputId = `field-${name}-${reactId}`;
44
58
  const errorId = `${inputId}-error`;
45
59
  const describedBy = showError ? errorId : undefined;
46
60
  function handleFieldChange(newValue) {
@@ -58,6 +72,6 @@ export function FormField({ label, name, card = false, type = "text", value = ""
58
72
  if (type === "media" && onUpload) {
59
73
  return (_jsxs("div", { className: card ? CARD_CLASS : BASE_CLASS, "data-section": "formfield-div-506", children: [_jsx(MediaUploadField, { label: `${label || name}${required ? " *" : ""}`, value: value, onChange: (url) => handleFieldChange(url), onUpload: onUpload, disabled: disabled, helperText: hint ?? helpText, captureSource: captureSource ?? "file-only", captureMode: captureMode ?? "both", accept: accept, maxSizeMB: maxSizeMB }), showError ? (_jsx(Text, { id: errorId, size: "sm", variant: "error", className: "appkit-form-field__error", role: "alert", children: error })) : null] }));
60
74
  }
61
- return (_jsxs("div", { className: card ? CARD_CLASS : BASE_CLASS, "data-section": "formfield-div-507", children: [label ? (_jsxs(Label, { htmlFor: inputId, className: "appkit-form-field__label", children: [label, required ? (_jsx(Span, { className: "appkit-form-field__required", children: "*" })) : null] })) : null, type === "select" ? (_jsx(Select, { id: inputId, name: name, value: value, onChange: (event) => handleFieldChange(event.target.value), onBlur: handleFieldBlur, disabled: disabled, options: options, "aria-required": required || undefined, "aria-invalid": showError || undefined, "aria-describedby": describedBy })) : type === "textarea" ? (_jsx(Textarea, { id: inputId, name: name, value: value, onChange: (event) => handleFieldChange(event.target.value), onBlur: handleFieldBlur, placeholder: placeholder, disabled: disabled, rows: rows, "aria-required": required || undefined, "aria-invalid": showError || undefined, "aria-describedby": describedBy })) : (_jsx(Input, { id: inputId, name: name, type: type, value: value, onChange: (event) => handleFieldChange(event.target.value), onBlur: handleFieldBlur, placeholder: placeholder, disabled: disabled, autoComplete: autoComplete, "aria-required": required || undefined, "aria-invalid": showError || undefined, "aria-describedby": describedBy })), !showError && (hint || helpText) ? (_jsx(Text, { size: "sm", variant: "secondary", className: "appkit-form-field__hint", children: hint ?? helpText })) : null, showError ? (_jsx(Text, { id: errorId, size: "sm", variant: "error", className: "appkit-form-field__error", role: "alert", children: error })) : null] }));
75
+ return (_jsxs("div", { className: card ? CARD_CLASS : BASE_CLASS, "data-section": "formfield-div-507", children: [label ? (_jsx(FieldLabel, { htmlFor: inputId, required: required, children: label })) : null, type === "select" ? (_jsx(Select, { id: inputId, name: name, value: value, onChange: (event) => handleFieldChange(event.target.value), onBlur: handleFieldBlur, disabled: disabled, options: options, "aria-required": required || undefined, "aria-invalid": showError || undefined, "aria-describedby": describedBy })) : type === "textarea" ? (_jsx(Textarea, { id: inputId, name: name, value: value, onChange: (event) => handleFieldChange(event.target.value), onBlur: handleFieldBlur, placeholder: placeholder, disabled: disabled, rows: rows, "aria-required": required || undefined, "aria-invalid": showError || undefined, "aria-describedby": describedBy })) : (_jsx(Input, { id: inputId, name: name, type: type, value: value, onChange: (event) => handleFieldChange(event.target.value), onBlur: handleFieldBlur, placeholder: placeholder, disabled: disabled, autoComplete: autoComplete, "aria-required": required || undefined, "aria-invalid": showError || undefined, "aria-describedby": describedBy })), !showError && (hint || helpText) ? (_jsx(Text, { size: "sm", variant: "secondary", className: "appkit-form-field__hint", children: hint ?? helpText })) : null, showError ? (_jsx(Text, { id: errorId, size: "sm", variant: "error", className: "appkit-form-field__error", role: "alert", children: error })) : null] }));
62
76
  }
63
77
  export default FormField;
@@ -4,16 +4,49 @@
4
4
  width: 100%;
5
5
  }
6
6
 
7
+ /*
8
+ * 🛑 ONE THEME-INVERTING TOKEN, NOT A LIGHT/DARK PAIR OF HARDCODED ZINCS.
9
+ *
10
+ * This was `--appkit-color-zinc-700` with an `:is(.dark)` override to
11
+ * `--appkit-color-zinc-300`. Both halves worked — `ThemeProvider` does add the
12
+ * `.dark` class — but the zinc scale is declared ONCE under `:root` and never
13
+ * inverts (Root Cause #79), so these were two fixed greys standing in for a
14
+ * theme decision. A custom admin theme with its own palette got zinc anyway,
15
+ * on every form label in the app.
16
+ *
17
+ * `--appkit-color-text` inverts per theme and carries a MEASURED contrast
18
+ * ratio in its own declaration (tokens.css notes `~7:1` and `~9:1` for the
19
+ * muted variants, and records that the faint one was darkened to clear WCAG AA
20
+ * for normal text). A hardcoded zinc carries no such guarantee and cannot,
21
+ * because it does not know what it is sitting on.
22
+ *
23
+ * So one declaration replaces two, and there is no longer a pairing to get
24
+ * wrong — the same reasoning that made the hover fix a REMOVAL rather than an
25
+ * addition.
26
+ */
7
27
  .appkit-form-field__label {
8
28
  display: block;
9
29
  margin-bottom: 0.375rem;
10
30
  font-size: 0.875rem;
11
31
  font-weight: 500;
12
- color: var(--appkit-color-zinc-700);
32
+ color: var(--appkit-color-text);
13
33
  }
14
34
 
15
- :is(.dark) .appkit-form-field__label {
16
- color: var(--appkit-color-zinc-300);
35
+ /*
36
+ * Inline placement — the label sits beside its control rather than above it,
37
+ * for dense sections (a 12-field address block). Set once per section via
38
+ * `SectionDef.labelPlacement`, never per field: one field labelling above
39
+ * beside one labelling inline reads as broken rather than as varied.
40
+ *
41
+ * The margin is reset because `above` owns a bottom margin that becomes a gap
42
+ * in the wrong axis once the label is beside the control.
43
+ */
44
+ .appkit-form-field__label--inline {
45
+ display: inline-block;
46
+ margin-bottom: 0;
47
+ margin-right: 0.5rem;
48
+ min-width: 8rem;
49
+ vertical-align: middle;
17
50
  }
18
51
 
19
52
  .appkit-form-field__required {
@@ -21,8 +54,15 @@
21
54
  color: var(--appkit-color-error);
22
55
  }
23
56
 
57
+ /*
58
+ * The hint is MUTED, not faint. `--appkit-color-text-faint` exists and its own
59
+ * token comment records being darkened to clear AA for normal text at all —
60
+ * i.e. it is the bottom of the usable range. A hint explains a field's rules
61
+ * and is read by whoever is unsure, so it belongs a tier up.
62
+ */
24
63
  .appkit-form-field__hint {
25
64
  margin-top: 0.375rem;
65
+ color: var(--appkit-color-text-muted);
26
66
  }
27
67
 
28
68
  .appkit-form-field__error {
@@ -11,7 +11,7 @@
11
11
  min-width: 5rem;
12
12
  height: 1.25rem;
13
13
  border-radius: 0.25rem;
14
- /* 🛑 `--appkit-color-surface-muted` is NOT a token — 15 uses, 0 definitions,
14
+ /* 🛑 `--appkit-color-bg` is NOT a token — 15 uses, 0 definitions,
15
15
  and `audit-undefined-css-vars` ratchets it down. An undefined custom
16
16
  property with no fallback makes the whole declaration invalid, so this
17
17
  placeholder had no background at all and the grid still reflowed on
@@ -10,7 +10,7 @@
10
10
 
11
11
  .appkit-icon-button:focus-visible {
12
12
  outline: none;
13
- box-shadow: 0 0 0 2px rgba(101, 196, 8, 0.2);
13
+ box-shadow: var(--appkit-focus-ring-compact);
14
14
  }
15
15
 
16
16
  .appkit-icon-button:disabled {