@mohasinac/appkit 4.59.0 → 4.60.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.
- package/dist/.build-stamp.json +3 -3
- package/dist/_internal/client/features/layout/DashboardLayoutClient.js +62 -5
- package/dist/_internal/client/features/maintenance/views/MaintenanceDashboardView.js +2 -2
- package/dist/_internal/server/features/brands/actions.js +78 -4
- package/dist/_internal/server/features/checkout/actions.d.ts +36 -13
- package/dist/_internal/server/features/checkout/actions.js +668 -183
- package/dist/_internal/server/features/checkout/supplier-identity.js +18 -1
- package/dist/_internal/server/features/gateway-events/index.d.ts +10 -0
- package/dist/_internal/server/features/gateway-events/index.js +10 -0
- package/dist/_internal/server/features/gateway-events/ingest.d.ts +127 -0
- package/dist/_internal/server/features/gateway-events/ingest.js +188 -0
- package/dist/_internal/server/features/gateway-events/redact.d.ts +66 -0
- package/dist/_internal/server/features/gateway-events/redact.js +151 -0
- package/dist/_internal/server/features/grievance/actions.d.ts +63 -0
- package/dist/_internal/server/features/grievance/actions.js +173 -0
- package/dist/_internal/server/features/grievance/index.d.ts +8 -0
- package/dist/_internal/server/features/grievance/index.js +8 -0
- package/dist/_internal/server/features/grouped/data.js +28 -3
- package/dist/_internal/server/features/lottery/actions.js +99 -4
- package/dist/_internal/server/features/order-completion/actions.d.ts +92 -0
- package/dist/_internal/server/features/order-completion/actions.js +336 -0
- package/dist/_internal/server/features/order-completion/index.d.ts +7 -0
- package/dist/_internal/server/features/order-completion/index.js +7 -0
- package/dist/_internal/server/features/orders/actions.d.ts +13 -0
- package/dist/_internal/server/features/orders/actions.js +56 -2
- package/dist/_internal/server/features/orders/adapters.js +26 -0
- package/dist/_internal/server/features/orders/cancellation-refund.d.ts +116 -0
- package/dist/_internal/server/features/orders/cancellation-refund.js +466 -0
- package/dist/_internal/server/features/orders/index.d.ts +2 -1
- package/dist/_internal/server/features/orders/index.js +1 -1
- package/dist/_internal/server/features/orders/service.d.ts +60 -0
- package/dist/_internal/server/features/orders/service.js +74 -0
- package/dist/_internal/server/features/payment-cases/disputes.d.ts +76 -0
- package/dist/_internal/server/features/payment-cases/disputes.js +241 -0
- package/dist/_internal/server/features/payment-cases/index.d.ts +9 -0
- package/dist/_internal/server/features/payment-cases/index.js +9 -0
- package/dist/_internal/server/features/payouts/actions.d.ts +28 -3
- package/dist/_internal/server/features/payouts/actions.js +84 -10
- package/dist/_internal/server/features/points/adjust.d.ts +61 -0
- package/dist/_internal/server/features/points/adjust.js +121 -0
- package/dist/_internal/server/features/points/award.d.ts +65 -0
- package/dist/_internal/server/features/points/award.js +145 -0
- package/dist/_internal/server/features/price-index/market.d.ts +33 -0
- package/dist/_internal/server/features/price-index/market.js +54 -1
- package/dist/_internal/server/features/products/data.js +40 -22
- package/dist/_internal/server/features/protection-claims/actions.d.ts +72 -0
- package/dist/_internal/server/features/protection-claims/actions.js +228 -0
- package/dist/_internal/server/features/protection-claims/index.d.ts +8 -0
- package/dist/_internal/server/features/protection-claims/index.js +8 -0
- package/dist/_internal/server/features/refunds/actions.d.ts +20 -0
- package/dist/_internal/server/features/refunds/actions.js +259 -17
- package/dist/_internal/server/features/refunds/capacity.d.ts +29 -0
- package/dist/_internal/server/features/refunds/capacity.js +37 -0
- package/dist/_internal/server/features/reviews/actions.js +3 -2
- package/dist/_internal/server/features/search/index-build/sources.js +20 -1
- package/dist/_internal/server/features/shipping/reconcile.d.ts +10 -1
- package/dist/_internal/server/features/shipping/reconcile.js +34 -3
- package/dist/_internal/server/features/shipping/reimbursement.d.ts +117 -0
- package/dist/_internal/server/features/shipping/reimbursement.js +223 -0
- package/dist/_internal/server/features/stores/tabs.d.ts +19 -4
- package/dist/_internal/server/features/stores/tabs.js +24 -4
- package/dist/_internal/server/functions/https.d.ts +31 -1
- package/dist/_internal/server/functions/https.js +52 -1
- package/dist/_internal/server/functions/scheduled.d.ts +72 -1
- package/dist/_internal/server/functions/scheduled.js +124 -1
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +62 -16
- package/dist/_internal/server/jobs/core/boxRollupReconcile.d.ts +46 -0
- package/dist/_internal/server/jobs/core/boxRollupReconcile.js +142 -0
- package/dist/_internal/server/jobs/core/dailyDataCleanup.js +149 -1
- package/dist/_internal/server/jobs/core/dailyStatusDigest.d.ts +14 -0
- package/dist/_internal/server/jobs/core/dailyStatusDigest.js +79 -1
- package/dist/_internal/server/jobs/core/index.d.ts +2 -0
- package/dist/_internal/server/jobs/core/index.js +2 -0
- package/dist/_internal/server/jobs/core/marketPriceRollup.d.ts +64 -0
- package/dist/_internal/server/jobs/core/marketPriceRollup.js +153 -0
- package/dist/_internal/server/jobs/core/obligationSweep.d.ts +36 -0
- package/dist/_internal/server/jobs/core/obligationSweep.js +503 -0
- package/dist/_internal/server/jobs/core/paymentReconcile.d.ts +79 -0
- package/dist/_internal/server/jobs/core/paymentReconcile.js +614 -0
- package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +34 -0
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +35 -4
- package/dist/_internal/server/jobs/handlers/boxRollupReconcile.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/boxRollupReconcile.js +15 -0
- package/dist/_internal/server/jobs/handlers/countersReconcileNow.d.ts +65 -0
- package/dist/_internal/server/jobs/handlers/countersReconcileNow.js +89 -0
- package/dist/_internal/server/jobs/handlers/index.d.ts +5 -0
- package/dist/_internal/server/jobs/handlers/index.js +5 -0
- package/dist/_internal/server/jobs/handlers/marketPriceRollup.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/marketPriceRollup.js +2 -0
- package/dist/_internal/server/jobs/handlers/obligationSweep.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/obligationSweep.js +15 -0
- package/dist/_internal/server/jobs/handlers/onShipmentAllocationSync.js +30 -1
- package/dist/_internal/server/jobs/handlers/paymentReconcile.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/paymentReconcile.js +6 -0
- package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
- package/dist/_internal/shared/actions/action-registry.js +71 -0
- package/dist/_internal/shared/checkout/coupon-discount.d.ts +73 -0
- package/dist/_internal/shared/checkout/coupon-discount.js +103 -0
- package/dist/_internal/shared/checkout/lanes.d.ts +42 -0
- package/dist/_internal/shared/checkout/lanes.js +46 -0
- package/dist/_internal/shared/checkout/order-math.d.ts +149 -1
- package/dist/_internal/shared/checkout/order-math.js +251 -3
- package/dist/_internal/shared/checkout/refundable-base.d.ts +116 -0
- package/dist/_internal/shared/checkout/refundable-base.js +122 -0
- package/dist/_internal/shared/features/auctions/config.d.ts +14 -1
- package/dist/_internal/shared/features/auctions/config.js +30 -1
- package/dist/_internal/shared/features/brands/schema.d.ts +42 -0
- package/dist/_internal/shared/features/brands/schema.js +18 -0
- package/dist/_internal/shared/features/orders/refund-copy.d.ts +22 -0
- package/dist/_internal/shared/features/orders/refund-copy.js +34 -0
- package/dist/_internal/shared/features/print/label-profiles.d.ts +198 -0
- package/dist/_internal/shared/features/print/label-profiles.js +350 -0
- package/dist/_internal/shared/features/products/to-product-item.js +33 -5
- package/dist/_internal/shared/fees/calculator.d.ts +31 -2
- package/dist/_internal/shared/fees/calculator.js +103 -5
- package/dist/_internal/shared/fees/india-states.d.ts +195 -0
- package/dist/_internal/shared/fees/india-states.js +190 -0
- package/dist/_internal/shared/fees/payout-hold.d.ts +80 -0
- package/dist/_internal/shared/fees/payout-hold.js +74 -0
- package/dist/_internal/shared/obligations/deadlines.d.ts +94 -0
- package/dist/_internal/shared/obligations/deadlines.js +155 -0
- package/dist/_internal/shared/shipping/quote.d.ts +96 -0
- package/dist/_internal/shared/shipping/quote.js +67 -0
- package/dist/_internal/shared/time/business-days.d.ts +91 -0
- package/dist/_internal/shared/time/business-days.js +185 -0
- package/dist/cli/index.js +0 -2
- package/dist/client.d.ts +9 -4
- package/dist/client.js +26 -3
- package/dist/configs/tailwind.d.ts +0 -12
- package/dist/configs/tailwind.js +28 -15
- package/dist/constants/api-endpoints.d.ts +51 -9
- package/dist/constants/api-endpoints.js +23 -7
- package/dist/constants/index.d.ts +1 -1
- package/dist/constants/index.js +1 -1
- package/dist/contracts/index.d.ts +1 -1
- package/dist/contracts/payment.d.ts +131 -0
- package/dist/features/about/components/AboutView.js +1 -1
- package/dist/features/about/components/DeveloperView.js +5 -2
- package/dist/features/about/components/FAQPageView.js +2 -1
- package/dist/features/about/components/FeesView.js +2 -1
- package/dist/features/about/components/HelpPageView.js +2 -1
- package/dist/features/about/components/HowAuctionsWorkView.js +2 -1
- package/dist/features/about/components/HowCheckoutWorksView.js +2 -1
- package/dist/features/about/components/HowEmiWorksView.js +2 -1
- package/dist/features/about/components/HowOffersWorkView.js +2 -1
- package/dist/features/about/components/HowOrdersWorkView.js +2 -1
- package/dist/features/about/components/HowPayoutsWorkView.js +2 -1
- package/dist/features/about/components/HowPreOrdersWorkView.js +2 -1
- package/dist/features/about/components/HowReviewsWorkView.js +2 -1
- package/dist/features/about/components/PolicyPageView.js +2 -1
- package/dist/features/about/components/ProseHero.d.ts +73 -0
- package/dist/features/about/components/ProseHero.js +18 -0
- package/dist/features/about/components/SecurityPrivacyView.js +2 -1
- package/dist/features/about/components/ShippingPolicyView.js +2 -1
- package/dist/features/about/components/TrackOrderView.js +2 -1
- package/dist/features/about/components/UnauthorizedView.js +1 -1
- package/dist/features/about/index.d.ts +2 -0
- package/dist/features/about/index.js +5 -0
- package/dist/features/account/actions/address-actions.d.ts +26 -2
- package/dist/features/account/actions/address-actions.js +25 -1
- package/dist/features/account/components/BuyerShoppingGuideView.js +1 -1
- package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
- package/dist/features/account/components/UserOrdersView.js +17 -0
- package/dist/features/account/components/UserSidebar.js +1 -1
- package/dist/features/account/hooks/useNotifications.js +29 -0
- package/dist/features/admin/actions/admin-coupon-actions.js +36 -0
- package/dist/features/admin/components/AdminBeysView.js +2 -2
- package/dist/features/admin/components/AdminBlogEditorView.js +2 -2
- package/dist/features/admin/components/AdminBrandEditorView.js +32 -2
- package/dist/features/admin/components/AdminBundleEditorView.js +1 -1
- package/dist/features/admin/components/AdminCarouselEditorView.js +1 -1
- package/dist/features/admin/components/AdminCategoriesView.js +1 -1
- package/dist/features/admin/components/AdminCategoryEditorView.js +73 -17
- package/dist/features/admin/components/AdminContactEditorView.js +1 -1
- package/dist/features/admin/components/AdminCouponEditorView.js +26 -1
- package/dist/features/admin/components/AdminFaqEditorView.js +1 -1
- package/dist/features/admin/components/AdminFaqsView.js +2 -2
- package/dist/features/admin/components/AdminGatewayEventsView.d.ts +54 -0
- package/dist/features/admin/components/AdminGatewayEventsView.js +209 -0
- package/dist/features/admin/components/AdminGuideHubView.js +1 -1
- package/dist/features/admin/components/AdminMoneyCasesView.d.ts +60 -0
- package/dist/features/admin/components/AdminMoneyCasesView.js +287 -0
- package/dist/features/admin/components/AdminPartsView.js +2 -2
- package/dist/features/admin/components/AdminProductsView.js +75 -4
- package/dist/features/admin/components/AdminSidebar.js +2 -2
- package/dist/features/admin/components/AdminSiteSettingsView.js +65 -7
- package/dist/features/admin/components/AdminSublistingCategoriesView.js +2 -0
- package/dist/features/admin/components/AdminSupportTicketDetailView.js +1 -1
- package/dist/features/admin/components/AdminSupportTicketsView.js +2 -2
- package/dist/features/admin/components/AdminTesterChecklistView.js +2 -2
- package/dist/features/admin/components/AdminUsersView.js +72 -1
- package/dist/features/admin/components/AdminViewCards.d.ts +3 -1
- package/dist/features/admin/components/AdminViewCards.js +4 -4
- package/dist/features/admin/components/DataListingView.d.ts +28 -0
- package/dist/features/admin/components/DataListingView.js +175 -14
- package/dist/features/admin/components/DataTable.d.ts +12 -1
- package/dist/features/admin/components/DataTable.js +3 -3
- package/dist/features/admin/components/OwnerQuickActions.d.ts +1 -1
- package/dist/features/admin/components/OwnerQuickActions.js +60 -2
- package/dist/features/admin/components/RecordOwnerQuickActions.d.ts +1 -1
- package/dist/features/admin/components/RecordOwnerQuickActions.js +61 -14
- package/dist/features/admin/components/analytics/AdminStatCard.d.ts +35 -1
- package/dist/features/admin/components/analytics/AdminStatCard.js +77 -2
- package/dist/features/admin/components/index.d.ts +4 -0
- package/dist/features/admin/components/index.js +6 -0
- package/dist/features/admin/constants/filter-tabs.d.ts +156 -0
- package/dist/features/admin/constants/filter-tabs.js +106 -0
- package/dist/features/admin/repository/site-settings.repository.d.ts +22 -0
- package/dist/features/admin/repository/site-settings.repository.js +82 -1
- package/dist/features/admin/schemas/admin-editor-forms.d.ts +21 -0
- package/dist/features/admin/schemas/admin-editor-forms.js +44 -0
- package/dist/features/admin/schemas/firestore.js +5 -1
- package/dist/features/admin/schemas/site-settings-form.js +30 -1
- package/dist/features/auctions/actions/bid-actions.js +13 -1
- package/dist/features/auctions/components/AuctionBottomActions.js +2 -2
- package/dist/features/auctions/components/AuctionDetailPageView.js +3 -1
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +11 -0
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +5 -3
- package/dist/features/auctions/components/PlaceBidFormClient.d.ts +8 -1
- package/dist/features/auctions/components/PlaceBidFormClient.js +2 -2
- package/dist/features/audit-log/schemas/firestore.d.ts +28 -0
- package/dist/features/audit-log/schemas/firestore.js +14 -0
- package/dist/features/auth/permissions/constants.d.ts +17 -1
- package/dist/features/auth/permissions/constants.js +18 -0
- package/dist/features/blog/components/BlogPostView.js +1 -1
- package/dist/features/catalogue/components/AdminCatalogueApprovalsView.js +1 -1
- package/dist/features/categories/api/[id]/description-template/route.js +107 -1
- package/dist/features/categories/components/BrandDetailPageView.js +2 -2
- package/dist/features/categories/components/BreadcrumbTrail.js +7 -1
- package/dist/features/categories/components/BundleDetailView.js +1 -1
- package/dist/features/categories/components/CategoryDetailPageView.js +2 -2
- package/dist/features/categories/components/CategoryForm.js +12 -1
- package/dist/features/categories/components/CategoryTemplatePicker.js +38 -5
- package/dist/features/categories/repository/market-price-index.repository.d.ts +123 -0
- package/dist/features/categories/repository/market-price-index.repository.js +105 -0
- package/dist/features/categories/repository/price-observation.repository.d.ts +166 -0
- package/dist/features/categories/repository/price-observation.repository.js +132 -0
- package/dist/features/events/components/EventSaleBanner.js +1 -1
- package/dist/features/events/components/EventStatusBadge.js +1 -1
- package/dist/features/faq/components/FAQAccordion.js +2 -1
- package/dist/features/faq/components/FAQCategorySidebar.js +2 -2
- package/dist/features/faq/components/FAQHelpfulButtons.js +4 -4
- package/dist/features/faq/components/RelatedFAQs.js +1 -1
- package/dist/features/filters/FilterFacetSection.js +1 -1
- package/dist/features/filters/SwitchFilter.js +1 -1
- package/dist/features/gateway-events/repository/gateway-events.repository.d.ts +117 -0
- package/dist/features/gateway-events/repository/gateway-events.repository.js +274 -0
- package/dist/features/gateway-events/schemas/firestore.d.ts +217 -0
- package/dist/features/gateway-events/schemas/firestore.js +125 -0
- package/dist/features/gateway-events/schemas/index.d.ts +81 -0
- package/dist/features/gateway-events/schemas/index.js +79 -0
- package/dist/features/grouped/components/GroupedListingDetailView.js +1 -1
- package/dist/features/homepage/components/AnnouncementBar.js +37 -1
- package/dist/features/homepage/components/AnnouncementBar.style.css +30 -0
- package/dist/features/homepage/components/BrandsSection.js +1 -1
- package/dist/features/homepage/components/CTABannerSection.js +1 -1
- package/dist/features/homepage/components/FeaturedBundlesSection.js +14 -24
- package/dist/features/homepage/components/HeroCarousel.js +2 -2
- package/dist/features/homepage/components/SocialPostCard.js +1 -1
- package/dist/features/inventory/components/AdminMoveLedgerView.d.ts +7 -0
- package/dist/features/inventory/components/AdminMoveLedgerView.js +157 -0
- package/dist/features/inventory/components/AdminStorageBoxesView.d.ts +11 -0
- package/dist/features/inventory/components/AdminStorageBoxesView.js +168 -0
- package/dist/features/inventory/components/ReceiveStationView.d.ts +39 -0
- package/dist/features/inventory/components/ReceiveStationView.js +413 -0
- package/dist/features/inventory/components/operator-message.d.ts +29 -0
- package/dist/features/inventory/components/operator-message.js +41 -0
- package/dist/features/inventory/index.d.ts +13 -0
- package/dist/features/inventory/index.js +28 -0
- package/dist/features/inventory/repository/inventory-movements.repository.d.ts +97 -0
- package/dist/features/inventory/repository/inventory-movements.repository.js +186 -0
- package/dist/features/inventory/repository/inventory-placements.repository.d.ts +179 -0
- package/dist/features/inventory/repository/inventory-placements.repository.js +345 -0
- package/dist/features/inventory/repository/storage-boxes.repository.d.ts +83 -0
- package/dist/features/inventory/repository/storage-boxes.repository.js +127 -0
- package/dist/features/inventory/schemas/firestore.d.ts +197 -0
- package/dist/features/inventory/schemas/firestore.js +159 -0
- package/dist/features/layout/AppLayoutShell.d.ts +12 -1
- package/dist/features/layout/AppLayoutShell.js +25 -12
- package/dist/features/layout/AutoBreadcrumbs.js +162 -3
- package/dist/features/layout/AutoBreadcrumbs.style.css +45 -0
- package/dist/features/layout/BottomNavbar.d.ts +1 -1
- package/dist/features/layout/BottomNavbar.js +2 -2
- package/dist/features/media/MediaAvatar.js +1 -1
- package/dist/features/media/MediaImage.d.ts +24 -4
- package/dist/features/media/MediaImage.js +44 -4
- package/dist/features/media/MediaLightbox.js +1 -1
- package/dist/features/media/modals/ImageCropModal.js +1 -1
- package/dist/features/media/modals/ImageEditor.js +1 -1
- package/dist/features/media/upload/MediaUploadField.js +91 -3
- package/dist/features/obligations/constants/policies.d.ts +92 -0
- package/dist/features/obligations/constants/policies.js +378 -0
- package/dist/features/obligations/repository/obligations.repository.d.ts +68 -0
- package/dist/features/obligations/repository/obligations.repository.js +158 -0
- package/dist/features/obligations/schemas/firestore.d.ts +160 -0
- package/dist/features/obligations/schemas/firestore.js +87 -0
- package/dist/features/orders/actions/order-actions.d.ts +43 -4
- package/dist/features/orders/actions/order-actions.js +60 -3
- package/dist/features/orders/actions/refund-actions.js +70 -10
- package/dist/features/orders/components/OrderCompletionPanel.d.ts +27 -0
- package/dist/features/orders/components/OrderCompletionPanel.js +192 -0
- package/dist/features/orders/components/OrdersList.js +2 -2
- package/dist/features/orders/components/RefundHistoryTable.js +3 -1
- package/dist/features/orders/components/index.d.ts +2 -0
- package/dist/features/orders/components/index.js +6 -0
- package/dist/features/orders/constants/transitions.d.ts +59 -0
- package/dist/features/orders/constants/transitions.js +104 -0
- package/dist/features/orders/repository/orders.repository.d.ts +109 -6
- package/dist/features/orders/repository/orders.repository.js +464 -21
- package/dist/features/orders/schemas/firestore.d.ts +270 -0
- package/dist/features/orders/schemas/firestore.js +24 -0
- package/dist/features/orders/schemas/index.d.ts +61 -0
- package/dist/features/orders/schemas/index.js +22 -0
- package/dist/features/orders/types/index.d.ts +79 -0
- package/dist/features/parts/components/PartsIndexPageView.js +8 -1
- package/dist/features/payment-cases/repository/payment-cases.repository.d.ts +170 -0
- package/dist/features/payment-cases/repository/payment-cases.repository.js +342 -0
- package/dist/features/payment-cases/schemas/firestore.d.ts +229 -0
- package/dist/features/payment-cases/schemas/firestore.js +105 -0
- package/dist/features/payment-cases/schemas/resolve-form.d.ts +97 -0
- package/dist/features/payment-cases/schemas/resolve-form.js +114 -0
- package/dist/features/payments/repository/payout.repository.d.ts +0 -1
- package/dist/features/payments/repository/payout.repository.js +0 -1
- package/dist/features/points/repository/points.repository.d.ts +122 -0
- package/dist/features/points/repository/points.repository.js +304 -1
- package/dist/features/points/schemas/adjust-form.d.ts +58 -0
- package/dist/features/points/schemas/adjust-form.js +63 -0
- package/dist/features/points/schemas/firestore.d.ts +108 -1
- package/dist/features/points/schemas/firestore.js +84 -0
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +3 -3
- package/dist/features/pre-orders/components/PreOrderBadge.js +1 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +1 -1
- package/dist/features/price-index/components/PriceIndexToolView.d.ts +23 -4
- package/dist/features/price-index/components/PriceIndexToolView.js +71 -6
- package/dist/features/price-index/market-stats.d.ts +82 -0
- package/dist/features/price-index/market-stats.js +230 -0
- package/dist/features/print/components/BoxLabelPrintView.d.ts +25 -0
- package/dist/features/print/components/BoxLabelPrintView.js +66 -0
- package/dist/features/print/components/LabelProfilePicker.d.ts +13 -0
- package/dist/features/print/components/LabelProfilePicker.js +38 -0
- package/dist/features/print/components/labels.d.ts +117 -0
- package/dist/features/print/components/labels.js +258 -0
- package/dist/features/print/components/labels.style.css +46 -0
- package/dist/features/print/index.d.ts +6 -0
- package/dist/features/print/index.js +16 -0
- package/dist/features/products/columns/productTableColumns.js +5 -4
- package/dist/features/products/components/MarketplaceBundleCard.js +2 -2
- package/dist/features/products/components/MarketplacePrizeDrawCard.js +6 -6
- package/dist/features/products/components/PrizeDrawCollage.js +1 -1
- package/dist/features/products/components/PrizeDrawItemsEditor.js +1 -1
- package/dist/features/products/components/PrizeRevealModal.js +2 -2
- package/dist/features/products/components/ProductDetailPageView.js +18 -4
- package/dist/features/products/components/ProductForm.js +34 -23
- package/dist/features/products/components/ProductGrid.js +86 -62
- package/dist/features/products/constants/card-badges.d.ts +97 -0
- package/dist/features/products/constants/card-badges.js +100 -0
- package/dist/features/products/repository/products.repository.js +34 -1
- package/dist/features/products/schemas/firestore.d.ts +46 -3
- package/dist/features/products/schemas/firestore.js +21 -0
- package/dist/features/promotions/components/PromotionsView.js +1 -1
- package/dist/features/promotions/repository/claimed-coupons.repository.d.ts +32 -0
- package/dist/features/promotions/repository/claimed-coupons.repository.js +58 -0
- package/dist/features/promotions/schemas/firestore.js +30 -3
- package/dist/features/promotions/schemas/index.d.ts +6 -6
- package/dist/features/protection-claims/repository/protection-claims.repository.d.ts +54 -0
- package/dist/features/protection-claims/repository/protection-claims.repository.js +174 -0
- package/dist/features/protection-claims/schemas/firestore.d.ts +168 -0
- package/dist/features/protection-claims/schemas/firestore.js +130 -0
- package/dist/features/reviews/actions/review-actions.js +3 -2
- package/dist/features/reviews/components/ReviewModal.js +1 -1
- package/dist/features/reviews/components/ReviewsList.js +1 -1
- package/dist/features/reviews/schemas/firestore.d.ts +20 -1
- package/dist/features/scams/constants/scam-types.d.ts +2 -0
- package/dist/features/scams/constants/scam-types.js +18 -0
- package/dist/features/scams/schemas/report-form.d.ts +3 -3
- package/dist/features/scams/schemas/report-form.js +26 -1
- package/dist/features/search/components/Search.js +9 -9
- package/dist/features/search/components/SearchResultsClient.js +18 -3
- package/dist/features/search/components/SearchResultsPageView.d.ts +1 -6
- package/dist/features/search/components/SearchResultsPageView.js +2 -2
- package/dist/features/seller/actions/offer-actions.js +16 -1
- package/dist/features/seller/actions/seller-actions.js +14 -3
- package/dist/features/seller/components/CategoryInlineSelect.js +75 -11
- package/dist/features/seller/components/PrintCenterView.d.ts +5 -0
- package/dist/features/seller/components/PrintCenterView.js +41 -30
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutRequestView.js +16 -5
- package/dist/features/seller/components/SellerPayoutSettingsView.js +1 -1
- package/dist/features/seller/components/SellerProductShell.d.ts +16 -0
- package/dist/features/seller/components/SellerProductShell.js +123 -13
- package/dist/features/seller/components/SellerReviewsView.js +4 -2
- package/dist/features/seller/components/SellerSidebar.js +1 -1
- package/dist/features/seller/schemas/coupon-form.d.ts +26 -0
- package/dist/features/seller/schemas/coupon-form.js +27 -0
- package/dist/features/seller/schemas/product-form.d.ts +3 -0
- package/dist/features/seller/schemas/product-form.js +5 -0
- package/dist/features/shell/FormShell.js +2 -2
- package/dist/features/shell/QuickFormDrawer.js +14 -0
- package/dist/features/shell/SectionForm.d.ts +19 -0
- package/dist/features/shell/SectionForm.js +133 -9
- package/dist/features/shell/SectionForm.style.css +54 -0
- package/dist/features/shipments/components/AdminShipmentsView.js +16 -1
- package/dist/features/shipments/repository/shipment-items.repository.d.ts +9 -0
- package/dist/features/shipments/repository/shipment-items.repository.js +14 -0
- package/dist/features/site-settings/components/ActionPermissionsManager.js +1 -1
- package/dist/features/sticker-trace/components/StickerCommitPanel.js +1 -1
- package/dist/features/store-extensions/schemas/report-review-form.d.ts +8 -8
- package/dist/features/stores/components/StoreGuideHubView.js +1 -1
- package/dist/features/stores/components/StoreHeader.js +1 -1
- package/dist/features/support/schemas/firestore.d.ts +73 -2
- package/dist/features/support/schemas/firestore.js +59 -0
- package/dist/index.d.ts +16 -24
- package/dist/index.js +38 -47
- package/dist/next/ErrorBoundary.js +1 -1
- package/dist/next/routing/route-map.d.ts +24 -0
- package/dist/next/routing/route-map.js +40 -0
- package/dist/providers/payment-manual/index.d.ts +15 -1
- package/dist/providers/payment-manual/index.js +37 -0
- package/dist/providers/payment-phonepe/index.d.ts +14 -1
- package/dist/providers/payment-phonepe/index.js +36 -0
- package/dist/providers/payment-razorpay/index.d.ts +44 -1
- package/dist/providers/payment-razorpay/index.js +99 -0
- package/dist/providers/shipping-shiprocket/index.d.ts +18 -0
- package/dist/providers/shipping-shiprocket/index.js +18 -0
- package/dist/schemas/registry.d.ts +44 -11
- package/dist/server-entry.d.ts +2 -0
- package/dist/server-entry.js +27 -0
- package/dist/server.d.ts +42 -0
- package/dist/server.js +93 -0
- package/dist/styles.css +418 -149
- package/dist/tailwind-utilities.css +1 -1
- package/dist/tokens/themes/default-dark.js +15 -12
- package/dist/tokens/themes/default-light.js +14 -11
- package/dist/tokens/tokens.css +106 -23
- package/dist/ui/DataTable.style.css +4 -4
- package/dist/ui/columns/cell-renderers.d.ts +20 -0
- package/dist/ui/columns/cell-renderers.js +26 -1
- package/dist/ui/columns/index.d.ts +1 -1
- package/dist/ui/columns/index.js +4 -1
- package/dist/ui/components/Badge.style.css +1 -1
- package/dist/ui/components/Breadcrumb.js +19 -1
- package/dist/ui/components/BulkActionBar.style.css +4 -4
- package/dist/ui/components/Button.style.css +1 -1
- package/dist/ui/components/Checkbox.style.css +1 -1
- package/dist/ui/components/FallbackShell.js +1 -1
- package/dist/ui/components/Form.d.ts +14 -1
- package/dist/ui/components/Form.js +2 -2
- package/dist/ui/components/FormField.js +18 -4
- package/dist/ui/components/FormField.style.css +43 -3
- package/dist/ui/components/GatedPrice.style.css +1 -1
- package/dist/ui/components/IconButton.style.css +1 -1
- package/dist/ui/components/Input.js +22 -1
- package/dist/ui/components/Input.style.css +38 -22
- package/dist/ui/components/ListingFilterDrawer.js +1 -1
- package/dist/ui/components/ListingToolbar.js +1 -1
- package/dist/ui/components/PaginatedSelect.js +0 -0
- package/dist/ui/components/Radio.style.css +1 -1
- package/dist/ui/components/Repeater.d.ts +53 -0
- package/dist/ui/components/Repeater.js +7 -0
- package/dist/ui/components/RichTextEditor.d.ts +20 -1
- package/dist/ui/components/RichTextEditor.js +23 -2
- package/dist/ui/components/Select.style.css +7 -21
- package/dist/ui/components/Semantic.js +27 -3
- package/dist/ui/components/TagInput.style.css +4 -9
- package/dist/ui/components/Textarea.style.css +4 -18
- package/dist/ui/components/Toggle.style.css +1 -1
- package/dist/ui/components/Typography.d.ts +3 -3
- package/dist/ui/components/Typography.js +15 -15
- package/dist/ui/components/ViewToggle.style.css +4 -4
- package/dist/ui/forms/AddAnotherToggle.d.ts +16 -0
- package/dist/ui/forms/AddAnotherToggle.js +56 -0
- package/dist/ui/forms/ColorPickerField.js +15 -2
- package/dist/ui/forms/FieldCheckbox.js +15 -2
- package/dist/ui/forms/FieldInput.d.ts +22 -1
- package/dist/ui/forms/FieldInput.js +19 -5
- package/dist/ui/forms/FieldLabel.d.ts +35 -0
- package/dist/ui/forms/FieldLabel.js +70 -0
- package/dist/ui/forms/FieldSelect.d.ts +4 -1
- package/dist/ui/forms/FieldSelect.js +27 -5
- package/dist/ui/forms/FieldTextarea.d.ts +4 -1
- package/dist/ui/forms/FieldTextarea.js +22 -5
- package/dist/ui/forms/FormShell.d.ts +17 -1
- package/dist/ui/forms/FormShell.js +36 -2
- package/dist/ui/forms/FormShell.style.css +41 -33
- package/dist/ui/forms/index.d.ts +5 -1
- package/dist/ui/forms/index.js +2 -0
- package/dist/ui/icons/icon-registry.d.ts +1 -0
- package/dist/ui/icons/icon-registry.js +17 -1
- package/dist/utils/id-generators.d.ts +80 -0
- package/dist/utils/id-generators.js +93 -0
- package/dist/utils/search-txt-builders.d.ts +12 -0
- package/dist/utils/search-txt-builders.js +17 -0
- package/package.json +1 -1
- package/scripts/seed-cli.mjs +106 -5
- package/dist/features/loyalty/api/admin/loyalty/grant/route.d.ts +0 -12
- package/dist/features/loyalty/api/admin/loyalty/grant/route.js +0 -38
- package/dist/features/loyalty/api/balance/route.d.ts +0 -12
- package/dist/features/loyalty/api/balance/route.js +0 -41
- package/dist/features/loyalty/api/earn/route.d.ts +0 -12
- package/dist/features/loyalty/api/earn/route.js +0 -38
- package/dist/features/loyalty/api/history/route.d.ts +0 -12
- package/dist/features/loyalty/api/history/route.js +0 -58
- package/dist/features/loyalty/api/redeem/route.d.ts +0 -12
- package/dist/features/loyalty/api/redeem/route.js +0 -38
- package/dist/features/loyalty/columns/index.d.ts +0 -17
- package/dist/features/loyalty/columns/index.js +0 -40
- package/dist/features/loyalty/components/CoinsDisplay.d.ts +0 -12
- package/dist/features/loyalty/components/CoinsDisplay.js +0 -10
- package/dist/features/loyalty/components/index.d.ts +0 -1
- package/dist/features/loyalty/components/index.js +0 -1
- package/dist/features/loyalty/hooks/useLoyaltyBalance.d.ts +0 -4
- package/dist/features/loyalty/hooks/useLoyaltyBalance.js +0 -25
- package/dist/features/loyalty/index.d.ts +0 -6
- package/dist/features/loyalty/index.js +0 -6
- package/dist/features/loyalty/manifest.d.ts +0 -2
- package/dist/features/loyalty/manifest.js +0 -16
- package/dist/features/loyalty/messages/en.json +0 -19
- package/dist/features/loyalty/repository/loyalty.repository.d.ts +0 -8
- package/dist/features/loyalty/repository/loyalty.repository.js +0 -22
- package/dist/features/loyalty/schemas/index.d.ts +0 -85
- package/dist/features/loyalty/schemas/index.js +0 -40
- package/dist/features/loyalty/server.d.ts +0 -6
- package/dist/features/loyalty/server.js +0 -6
- package/dist/features/loyalty/types/index.d.ts +0 -31
- package/dist/features/loyalty/types/index.js +0 -1
- package/dist/features/loyalty/types/loyalty-config.d.ts +0 -7
- package/dist/features/loyalty/types/loyalty-config.js +0 -1
- package/dist/features/loyalty/types/loyalty-math.d.ts +0 -9
- package/dist/features/loyalty/types/loyalty-math.js +0 -27
- package/dist/features/products/components/ProductOwnerQuickActions.d.ts +0 -11
- package/dist/features/products/components/ProductOwnerQuickActions.js +0 -120
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How much of an order can still be refunded, and what is withheld.
|
|
3
|
+
*
|
|
4
|
+
* ONE owner for two numbers that were previously computed four different ways
|
|
5
|
+
* and disagreed with each other and with the money actually moved.
|
|
6
|
+
*
|
|
7
|
+
* WHY:
|
|
8
|
+
*
|
|
9
|
+
* · **D1** — the over-refund guard compared `amount > order.totalPrice`, i.e.
|
|
10
|
+
* against the ORDER TOTAL rather than the remaining balance, while its own
|
|
11
|
+
* docstring promised "≤ remaining refundable amount". So ₹500 and then
|
|
12
|
+
* another ₹500 both passed on a ₹600 order: **₹1,000 refunded, two real
|
|
13
|
+
* gateway calls, both successful.**
|
|
14
|
+
*
|
|
15
|
+
* · **D3** — `isFull` was `amount >= order.totalPrice`, so a split refund
|
|
16
|
+
* (₹300 + ₹200 of ₹500) never reached `status: "refunded"` and the order
|
|
17
|
+
* stayed fully refundable forever.
|
|
18
|
+
*
|
|
19
|
+
* · **D32** — the platform fee is non-refundable by policy, and the only code
|
|
20
|
+
* implementing that withheld ~10x too much (see `platformFeeWithheld`).
|
|
21
|
+
*/
|
|
22
|
+
import { roundRupees } from "../../../utils/number.formatter.js";
|
|
23
|
+
/**
|
|
24
|
+
* Half a paisa. The tolerance exists because these are IEEE-754 sums of 2dp
|
|
25
|
+
* components: `0.1 + 0.2 > 0.3` is TRUE in floating point, so an exact
|
|
26
|
+
* comparison would reject a legitimate final refund that exactly exhausts the
|
|
27
|
+
* balance. Half a paisa is below the smallest representable money unit, so it
|
|
28
|
+
* cannot admit a real over-refund.
|
|
29
|
+
*/
|
|
30
|
+
export const MONEY_EPSILON = 0.005;
|
|
31
|
+
/**
|
|
32
|
+
* The platform fee actually withheld on a refund: the amount CHARGED, never a
|
|
33
|
+
* recomputed percentage.
|
|
34
|
+
*
|
|
35
|
+
* 🛑 This replaces the single worst money defect found in the audit (D32).
|
|
36
|
+
* `previewCancellationRefund` did:
|
|
37
|
+
*
|
|
38
|
+
* const effectiveRate = platformFeePercent * (1 + gstPercent / 100);
|
|
39
|
+
* const feeDeducted = (grossRefund * effectiveRate) / 100;
|
|
40
|
+
*
|
|
41
|
+
* — a PERCENTAGE OF THE REFUND, which ignores `commissions.platformFeeMax`
|
|
42
|
+
* (default **₹10**) entirely and ignores `order.platformFee`, the amount that
|
|
43
|
+
* was actually collected and is stored on the order. On a ₹5,000 order at 2% +
|
|
44
|
+
* 18% GST it deducted **₹118** from a buyer who had paid **₹11.80** — keeping
|
|
45
|
+
* roughly ₹106 of their goods money and labelling it a platform fee. The
|
|
46
|
+
* overcharge grows with order value, so it is largest exactly where it is most
|
|
47
|
+
* noticeable.
|
|
48
|
+
*
|
|
49
|
+
* `platformFeeGst` is read from the order and only DERIVED for rows written
|
|
50
|
+
* before that field existed (2026-10-21). The derivation takes `gstPercent`
|
|
51
|
+
* from the caller rather than reading settings itself, so this stays pure and
|
|
52
|
+
* so a caller cannot accidentally reach for today's rate when the order is
|
|
53
|
+
* from last year — which is the mistake the whole function exists to undo.
|
|
54
|
+
*/
|
|
55
|
+
export function platformFeeWithheld(order,
|
|
56
|
+
/** Only consulted for legacy orders with no stored `platformFeeGst`. */
|
|
57
|
+
legacyGstPercent) {
|
|
58
|
+
const fee = order.platformFee ?? 0;
|
|
59
|
+
if (fee <= 0)
|
|
60
|
+
return 0;
|
|
61
|
+
const gst = order.platformFeeGst ??
|
|
62
|
+
(typeof legacyGstPercent === "number" ? roundRupees((fee * legacyGstPercent) / 100) : 0);
|
|
63
|
+
return roundRupees(fee + gst);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The ceiling every refund is measured against.
|
|
67
|
+
*
|
|
68
|
+
* 🛑 `totalPrice − platformFeeWithheld`, NOT `totalPrice`. The platform fee is
|
|
69
|
+
* non-refundable in every scenario — a decided policy, and one the product
|
|
70
|
+
* already states: `REFUND_COPY.request.acknowledgments[2]` tells the buyer
|
|
71
|
+
* "platform fees may be non-recoverable".
|
|
72
|
+
*
|
|
73
|
+
* This correction matters twice over. Phase 1's cumulative cap has to compare
|
|
74
|
+
* against THIS, or a refund can exceed what the buyer is owed; and `isFull`
|
|
75
|
+
* has to compare against THIS, or the largest possible refund is strictly less
|
|
76
|
+
* than `totalPrice` and **an order can never reach `status: "refunded"`** —
|
|
77
|
+
* which is what the old `amount >= totalPrice` test guaranteed.
|
|
78
|
+
*/
|
|
79
|
+
export function refundableBase(order, legacyGstPercent) {
|
|
80
|
+
return roundRupees(Math.max(0, order.totalPrice - platformFeeWithheld(order, legacyGstPercent)));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Sum of refunds that have COMMITTED money, i.e. everything not `failed`.
|
|
84
|
+
*
|
|
85
|
+
* 🛑 A `reserved` entry counts. The two-phase write reserves before calling the
|
|
86
|
+
* provider and settles after, so between those two points the money may well
|
|
87
|
+
* have left — excluding reserved entries would let a concurrent request refund
|
|
88
|
+
* against a balance that is already spoken for, which is the TOCTOU the
|
|
89
|
+
* reservation exists to close. A `failed` entry releases its reservation by
|
|
90
|
+
* being skipped here, which is why no explicit release step is needed.
|
|
91
|
+
*
|
|
92
|
+
* `status` is optional on `OrderRefundEvent`: rows written before the
|
|
93
|
+
* two-phase scheme have none, and those are all committed refunds, so a
|
|
94
|
+
* missing status must count.
|
|
95
|
+
*/
|
|
96
|
+
export function committedRefundTotal(order) {
|
|
97
|
+
return roundRupees((order.refunds ?? [])
|
|
98
|
+
.filter((r) => r.status !== "failed")
|
|
99
|
+
.reduce((sum, r) => sum + (r.amount ?? 0), 0));
|
|
100
|
+
}
|
|
101
|
+
/** Everything a caller needs to decide and to EXPLAIN a refund decision. */
|
|
102
|
+
export function refundCapacity(order, legacyGstPercent) {
|
|
103
|
+
const base = refundableBase(order, legacyGstPercent);
|
|
104
|
+
const committed = committedRefundTotal(order);
|
|
105
|
+
return {
|
|
106
|
+
base,
|
|
107
|
+
committed,
|
|
108
|
+
remaining: roundRupees(Math.max(0, base - committed)),
|
|
109
|
+
withheld: platformFeeWithheld(order, legacyGstPercent),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Would this refund exhaust the refundable base?
|
|
114
|
+
*
|
|
115
|
+
* Measured against `base`, not `totalPrice` — see `refundableBase`. The
|
|
116
|
+
* epsilon makes an exactly-exhausting refund count as full rather than
|
|
117
|
+
* leaving a sub-paisa residue that keeps the order refundable forever.
|
|
118
|
+
*/
|
|
119
|
+
export function wouldBeFullRefund(order, amount, legacyGstPercent) {
|
|
120
|
+
const { base, committed } = refundCapacity(order, legacyGstPercent);
|
|
121
|
+
return committed + amount >= base - MONEY_EPSILON;
|
|
122
|
+
}
|
|
@@ -55,6 +55,19 @@ export interface BuyNowAvailabilityInput {
|
|
|
55
55
|
currentBid: number | null | undefined;
|
|
56
56
|
isEnded: boolean;
|
|
57
57
|
isSold?: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* The seller's floor for the item (D53). Buy-Now below it is refused.
|
|
60
|
+
*
|
|
61
|
+
* 🛑 OPTIONAL so every existing call site keeps compiling — but a caller
|
|
62
|
+
* that has the product and omits it silently reopens the hole, which is the
|
|
63
|
+
* weakness of this shape. The two server call sites that decide money
|
|
64
|
+
* (`placeBuyNow`, and the capability gate it consults) both pass it; a
|
|
65
|
+
* display-only caller that omits it renders a button the server will refuse,
|
|
66
|
+
* which is a worse UX than a hidden button but is not an exploit.
|
|
67
|
+
*
|
|
68
|
+
* Absent / 0 / non-finite means NO reserve — the common case.
|
|
69
|
+
*/
|
|
70
|
+
reservePrice?: number | null;
|
|
58
71
|
}
|
|
59
72
|
/**
|
|
60
73
|
* The single definition of "can this auction be bought outright right now".
|
|
@@ -75,7 +88,7 @@ export interface BuyNowAvailabilityInput {
|
|
|
75
88
|
* `isSold` is optional because client callers rendering a live auction page
|
|
76
89
|
* already know it isn't sold; server callers should always pass it.
|
|
77
90
|
*/
|
|
78
|
-
export declare function isBuyNowAvailable({ buyNowPrice, currentBid, isEnded, isSold, }: BuyNowAvailabilityInput): boolean;
|
|
91
|
+
export declare function isBuyNowAvailable({ buyNowPrice, currentBid, isEnded, isSold, reservePrice, }: BuyNowAvailabilityInput): boolean;
|
|
79
92
|
/**
|
|
80
93
|
* Preset step multipliers offered by the bid form, as multiples of the
|
|
81
94
|
* effective minimum increment. With a ₹100 increment this renders
|
|
@@ -89,12 +89,41 @@ export function resolveMinBid(currentBidAmount, tiers, override, opts) {
|
|
|
89
89
|
* `isSold` is optional because client callers rendering a live auction page
|
|
90
90
|
* already know it isn't sold; server callers should always pass it.
|
|
91
91
|
*/
|
|
92
|
-
export function isBuyNowAvailable({ buyNowPrice, currentBid, isEnded, isSold, }) {
|
|
92
|
+
export function isBuyNowAvailable({ buyNowPrice, currentBid, isEnded, isSold, reservePrice, }) {
|
|
93
93
|
if (isEnded || isSold === true)
|
|
94
94
|
return false;
|
|
95
95
|
if (typeof buyNowPrice !== "number" || !Number.isFinite(buyNowPrice) || buyNowPrice <= 0) {
|
|
96
96
|
return false;
|
|
97
97
|
}
|
|
98
|
+
/*
|
|
99
|
+
* ── D53: BUY-NOW MUST CLEAR THE RESERVE ─────────────────────────────────
|
|
100
|
+
*
|
|
101
|
+
* 🛑 This function consulted end state, sold state and the standing bid —
|
|
102
|
+
* and never `reservePrice`, which was enforced in ONE place:
|
|
103
|
+
* `auctionSettlement`, i.e. only on the competitive path. So a Buy-Now
|
|
104
|
+
* priced below the reserve completed, and the seller was bound to a price
|
|
105
|
+
* the reserve existed to refuse.
|
|
106
|
+
*
|
|
107
|
+
* The reserve is the seller's floor for the ITEM, not for a particular sale
|
|
108
|
+
* mechanism. A buyout that undercuts it defeats it entirely — and does so on
|
|
109
|
+
* the path with no competing bidders to push the price up, which is the one
|
|
110
|
+
* where the floor matters most.
|
|
111
|
+
*
|
|
112
|
+
* 🛑 Checked here rather than at the call site, deliberately: this is the
|
|
113
|
+
* gate `placeBuyNow` already consults AND the predicate the UI uses to
|
|
114
|
+
* decide whether to render the button at all, so one change closes the
|
|
115
|
+
* exploit and stops offering a control that must then refuse.
|
|
116
|
+
*
|
|
117
|
+
* Absent/zero/non-finite reserve means NO reserve — which is the common case
|
|
118
|
+
* and must stay permissive, or every reserve-less auction would lose its
|
|
119
|
+
* Buy-Now.
|
|
120
|
+
*/
|
|
121
|
+
if (typeof reservePrice === "number" &&
|
|
122
|
+
Number.isFinite(reservePrice) &&
|
|
123
|
+
reservePrice > 0 &&
|
|
124
|
+
buyNowPrice < reservePrice) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
98
127
|
return buyNowPrice > (currentBid ?? 0);
|
|
99
128
|
}
|
|
100
129
|
/**
|
|
@@ -9,26 +9,47 @@ export declare const brandInputSchema: z.ZodObject<{
|
|
|
9
9
|
founded: z.ZodOptional<z.ZodNumber>;
|
|
10
10
|
isActive: z.ZodDefault<z.ZodBoolean>;
|
|
11
11
|
displayOrder: z.ZodDefault<z.ZodNumber>;
|
|
12
|
+
highlights: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
13
|
+
faqs: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
14
|
+
question: z.ZodString;
|
|
15
|
+
answer: z.ZodString;
|
|
16
|
+
}, "strip", z.ZodTypeAny, {
|
|
17
|
+
question: string;
|
|
18
|
+
answer: string;
|
|
19
|
+
}, {
|
|
20
|
+
question: string;
|
|
21
|
+
answer: string;
|
|
22
|
+
}>, "many">>;
|
|
12
23
|
}, "strip", z.ZodTypeAny, {
|
|
13
24
|
name: string;
|
|
14
25
|
slug: string;
|
|
15
26
|
isActive: boolean;
|
|
16
27
|
displayOrder: number;
|
|
17
28
|
country?: string | undefined;
|
|
29
|
+
faqs?: {
|
|
30
|
+
question: string;
|
|
31
|
+
answer: string;
|
|
32
|
+
}[] | undefined;
|
|
18
33
|
description?: string | undefined;
|
|
19
34
|
logoURL?: string | undefined;
|
|
20
35
|
website?: string | undefined;
|
|
21
36
|
founded?: number | undefined;
|
|
37
|
+
highlights?: string[] | undefined;
|
|
22
38
|
}, {
|
|
23
39
|
name: string;
|
|
24
40
|
slug: string;
|
|
25
41
|
country?: string | undefined;
|
|
42
|
+
faqs?: {
|
|
43
|
+
question: string;
|
|
44
|
+
answer: string;
|
|
45
|
+
}[] | undefined;
|
|
26
46
|
description?: string | undefined;
|
|
27
47
|
isActive?: boolean | undefined;
|
|
28
48
|
displayOrder?: number | undefined;
|
|
29
49
|
logoURL?: string | undefined;
|
|
30
50
|
website?: string | undefined;
|
|
31
51
|
founded?: number | undefined;
|
|
52
|
+
highlights?: string[] | undefined;
|
|
32
53
|
}>;
|
|
33
54
|
export declare const brandUpdateSchema: z.ZodObject<Omit<{
|
|
34
55
|
name: z.ZodOptional<z.ZodString>;
|
|
@@ -40,24 +61,45 @@ export declare const brandUpdateSchema: z.ZodObject<Omit<{
|
|
|
40
61
|
founded: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
|
41
62
|
isActive: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
42
63
|
displayOrder: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
64
|
+
highlights: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
65
|
+
faqs: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
66
|
+
question: z.ZodString;
|
|
67
|
+
answer: z.ZodString;
|
|
68
|
+
}, "strip", z.ZodTypeAny, {
|
|
69
|
+
question: string;
|
|
70
|
+
answer: string;
|
|
71
|
+
}, {
|
|
72
|
+
question: string;
|
|
73
|
+
answer: string;
|
|
74
|
+
}>, "many">>>;
|
|
43
75
|
}, "slug">, "strip", z.ZodTypeAny, {
|
|
44
76
|
country?: string | undefined;
|
|
45
77
|
name?: string | undefined;
|
|
78
|
+
faqs?: {
|
|
79
|
+
question: string;
|
|
80
|
+
answer: string;
|
|
81
|
+
}[] | undefined;
|
|
46
82
|
description?: string | undefined;
|
|
47
83
|
isActive?: boolean | undefined;
|
|
48
84
|
displayOrder?: number | undefined;
|
|
49
85
|
logoURL?: string | undefined;
|
|
50
86
|
website?: string | undefined;
|
|
51
87
|
founded?: number | undefined;
|
|
88
|
+
highlights?: string[] | undefined;
|
|
52
89
|
}, {
|
|
53
90
|
country?: string | undefined;
|
|
54
91
|
name?: string | undefined;
|
|
92
|
+
faqs?: {
|
|
93
|
+
question: string;
|
|
94
|
+
answer: string;
|
|
95
|
+
}[] | undefined;
|
|
55
96
|
description?: string | undefined;
|
|
56
97
|
isActive?: boolean | undefined;
|
|
57
98
|
displayOrder?: number | undefined;
|
|
58
99
|
logoURL?: string | undefined;
|
|
59
100
|
website?: string | undefined;
|
|
60
101
|
founded?: number | undefined;
|
|
102
|
+
highlights?: string[] | undefined;
|
|
61
103
|
}>;
|
|
62
104
|
export type BrandInput = z.infer<typeof brandInputSchema>;
|
|
63
105
|
export type BrandUpdate = z.infer<typeof brandUpdateSchema>;
|
|
@@ -12,5 +12,23 @@ export const brandInputSchema = z.object({
|
|
|
12
12
|
founded: z.number().int().min(1800).max(new Date().getFullYear()).optional(),
|
|
13
13
|
isActive: z.boolean().default(true),
|
|
14
14
|
displayOrder: z.number().int().min(0).default(0),
|
|
15
|
+
/*
|
|
16
|
+
* Editorial content, rendered by `CategoryHighlightsAndFaqSection` on the
|
|
17
|
+
* brand page and previously unauthorable — the form did not carry them, so
|
|
18
|
+
* this schema did not need them either.
|
|
19
|
+
*
|
|
20
|
+
* 🛑 CAPPED, both of them. These render in a fixed block above the fold on
|
|
21
|
+
* a public page, and an unbounded list is how a form becomes a way to break
|
|
22
|
+
* the page it feeds. The numbers match what the category editor already
|
|
23
|
+
* enforces for the same two fields on the same renderer.
|
|
24
|
+
*/
|
|
25
|
+
highlights: z.array(z.string().min(1).max(200)).max(8).optional(),
|
|
26
|
+
faqs: z
|
|
27
|
+
.array(z.object({
|
|
28
|
+
question: z.string().min(1).max(300),
|
|
29
|
+
answer: z.string().min(1).max(2000),
|
|
30
|
+
}))
|
|
31
|
+
.max(8)
|
|
32
|
+
.optional(),
|
|
15
33
|
});
|
|
16
34
|
export const brandUpdateSchema = brandInputSchema.partial().omit({ slug: true });
|
|
@@ -40,6 +40,28 @@ export declare const REFUND_COPY: {
|
|
|
40
40
|
readonly siblingPayments: {
|
|
41
41
|
readonly heading: (count: number) => string;
|
|
42
42
|
};
|
|
43
|
+
/**
|
|
44
|
+
* What to tell the buyer about the money, immediately after they cancel.
|
|
45
|
+
*
|
|
46
|
+
* 🛑 Here rather than inline in the route, because there are two cancel
|
|
47
|
+
* endpoints plus the buyer's cancel page, and three copies of "we owe you
|
|
48
|
+
* ₹X" is how a refund timeline comes to be published three different ways
|
|
49
|
+
* (D20/D31). It is a function of the OUTCOME, so the sentence cannot
|
|
50
|
+
* disagree with what actually happened — which is the specific failure D14
|
|
51
|
+
* was: the page said one thing and the money did another.
|
|
52
|
+
*
|
|
53
|
+
* 🛑 It deliberately quotes **no timeline**. "5–7 business days" is published
|
|
54
|
+
* in three contradicting places already and reconciling them is Phase 9; a
|
|
55
|
+
* fourth statement of it here would be a new owner of a number that needs
|
|
56
|
+
* fewer, not more.
|
|
57
|
+
*/
|
|
58
|
+
readonly cancellation: {
|
|
59
|
+
readonly message: (outcome: {
|
|
60
|
+
moved: "none" | "gateway" | "owed";
|
|
61
|
+
amount: number;
|
|
62
|
+
why?: string;
|
|
63
|
+
}) => string;
|
|
64
|
+
};
|
|
43
65
|
readonly shipping: {
|
|
44
66
|
readonly noOptions: "No shipping options available for this item.";
|
|
45
67
|
readonly freeLabel: "Free";
|
|
@@ -44,6 +44,40 @@ export const REFUND_COPY = {
|
|
|
44
44
|
siblingPayments: {
|
|
45
45
|
heading: (count) => `Other orders from this payment (${count})`,
|
|
46
46
|
},
|
|
47
|
+
/**
|
|
48
|
+
* What to tell the buyer about the money, immediately after they cancel.
|
|
49
|
+
*
|
|
50
|
+
* 🛑 Here rather than inline in the route, because there are two cancel
|
|
51
|
+
* endpoints plus the buyer's cancel page, and three copies of "we owe you
|
|
52
|
+
* ₹X" is how a refund timeline comes to be published three different ways
|
|
53
|
+
* (D20/D31). It is a function of the OUTCOME, so the sentence cannot
|
|
54
|
+
* disagree with what actually happened — which is the specific failure D14
|
|
55
|
+
* was: the page said one thing and the money did another.
|
|
56
|
+
*
|
|
57
|
+
* 🛑 It deliberately quotes **no timeline**. "5–7 business days" is published
|
|
58
|
+
* in three contradicting places already and reconciling them is Phase 9; a
|
|
59
|
+
* fourth statement of it here would be a new owner of a number that needs
|
|
60
|
+
* fewer, not more.
|
|
61
|
+
*/
|
|
62
|
+
cancellation: {
|
|
63
|
+
message: (outcome) => {
|
|
64
|
+
if (outcome.moved === "gateway") {
|
|
65
|
+
return `Order cancelled. A refund of ₹${outcome.amount.toFixed(2)} has been sent back to your original payment method.`;
|
|
66
|
+
}
|
|
67
|
+
if (outcome.moved === "owed") {
|
|
68
|
+
return `Order cancelled. We owe you ₹${outcome.amount.toFixed(2)} — it needs to be sent manually, and our team has been notified.`;
|
|
69
|
+
}
|
|
70
|
+
/*
|
|
71
|
+
* `none` splits two very different situations and must not blur them: an
|
|
72
|
+
* unpaid order has nothing to refund, while an already-refunded one has
|
|
73
|
+
* had its money returned. Telling the second buyer "no payment was
|
|
74
|
+
* taken" would read as a denial that they ever paid.
|
|
75
|
+
*/
|
|
76
|
+
return outcome.why === "nothing-refundable"
|
|
77
|
+
? "Order cancelled. Its payment had already been refunded in full, so nothing further is owed."
|
|
78
|
+
: "Order cancelled. No payment had been taken, so there is nothing to refund.";
|
|
79
|
+
},
|
|
80
|
+
},
|
|
47
81
|
shipping: {
|
|
48
82
|
noOptions: "No shipping options available for this item.",
|
|
49
83
|
freeLabel: "Free",
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { MM_PER_INCH, type PrintPageSize } from "../sticker-trace/export/page-sizes";
|
|
2
|
+
/**
|
|
3
|
+
* CODE128 module width at which essentially every handheld scanner reads
|
|
4
|
+
* reliably, including cheap CCD units at an angle. 0.25 mm ≈ 10 mil.
|
|
5
|
+
*/
|
|
6
|
+
export declare const SAFE_MODULE_MM = 0.25;
|
|
7
|
+
/**
|
|
8
|
+
* The floor. Below this a symbol is a lottery: good scanners manage it under
|
|
9
|
+
* good light at a good angle, and a receive station is none of those things.
|
|
10
|
+
*/
|
|
11
|
+
export declare const MIN_SCANNABLE_MODULE_MM = 0.19;
|
|
12
|
+
/**
|
|
13
|
+
* How wide a CODE128-B symbol must be, in mm, INCLUDING its quiet zones.
|
|
14
|
+
*
|
|
15
|
+
* Structure, from the symbology itself rather than from a chart:
|
|
16
|
+
* start 11 modules
|
|
17
|
+
* each data character 11 modules
|
|
18
|
+
* check 11 modules
|
|
19
|
+
* stop 13 modules
|
|
20
|
+
* quiet 10 modules each side (the spec minimum)
|
|
21
|
+
*
|
|
22
|
+
* so `11 x (n + 2) + 13 + 20` modules for `n` data characters.
|
|
23
|
+
*
|
|
24
|
+
* 🛑 THE QUIET ZONE IS PART OF THE SYMBOL, not padding around it. A label sized
|
|
25
|
+
* to the bars alone prints a barcode whose first bar touches the die-cut edge,
|
|
26
|
+
* and a scanner has nothing to lock onto — it reads as a smudged or damaged
|
|
27
|
+
* label rather than as a layout mistake.
|
|
28
|
+
*
|
|
29
|
+
* 🛑 This also CORRECTS a number already written down elsewhere. The
|
|
30
|
+
* barcode-vs-SKU header in `id-generators.ts` derives "a ~42 mm minimum" from
|
|
31
|
+
* the 12-character `LIR-XXXXXXXX` form; that figure omits the quiet zones.
|
|
32
|
+
* 11 x 14 + 13 = 167 modules of bars, but 187 with them, which is 46.75 mm at
|
|
33
|
+
* `SAFE_MODULE_MM` — not 42. The smaller figure is the dangerous direction to
|
|
34
|
+
* be wrong in, because it says yes to stock that cannot carry the symbol.
|
|
35
|
+
*/
|
|
36
|
+
export declare function code128WidthMm(characters: number, moduleMm?: number): number;
|
|
37
|
+
/**
|
|
38
|
+
* An A4 sheet of die-cut labels: where the first one starts and how far apart
|
|
39
|
+
* they are. `null` on a thermal profile, where the page IS the label.
|
|
40
|
+
*
|
|
41
|
+
* 🛑 PITCH, NOT GAP. Pitch is centre-to-centre and is what positions label
|
|
42
|
+
* number 40; a gap has to be added to a width to get there, and any rounding in
|
|
43
|
+
* the width then accumulates down the column. Avery publish pitch for the same
|
|
44
|
+
* reason.
|
|
45
|
+
*/
|
|
46
|
+
export interface SheetLayout {
|
|
47
|
+
readonly columns: number;
|
|
48
|
+
readonly rows: number;
|
|
49
|
+
/** Distance from the page's left edge to the first label's left edge. */
|
|
50
|
+
readonly marginLeftMm: number;
|
|
51
|
+
/** Distance from the page's top edge to the first label's top edge. */
|
|
52
|
+
readonly marginTopMm: number;
|
|
53
|
+
/** Centre-to-centre horizontal spacing. */
|
|
54
|
+
readonly pitchXMm: number;
|
|
55
|
+
/** Centre-to-centre vertical spacing. */
|
|
56
|
+
readonly pitchYMm: number;
|
|
57
|
+
}
|
|
58
|
+
export type LabelProfileId = "thermal-50x25" | "thermal-38x25" | "thermal-100x50" | "a4-65up" | "a4-24up" | "a4-8up";
|
|
59
|
+
export interface LabelProfile {
|
|
60
|
+
readonly id: LabelProfileId;
|
|
61
|
+
readonly label: string;
|
|
62
|
+
/** One label's die-cut size. */
|
|
63
|
+
readonly widthMm: number;
|
|
64
|
+
readonly heightMm: number;
|
|
65
|
+
/** Printable inset inside the label. */
|
|
66
|
+
readonly paddingMm: number;
|
|
67
|
+
/** The page the printer is fed. For thermal, the page is one label. */
|
|
68
|
+
readonly page: {
|
|
69
|
+
readonly widthMm: number;
|
|
70
|
+
readonly heightMm: number;
|
|
71
|
+
};
|
|
72
|
+
/** Null for thermal — a roll has no grid. */
|
|
73
|
+
readonly sheet: SheetLayout | null;
|
|
74
|
+
readonly isThermal: boolean;
|
|
75
|
+
}
|
|
76
|
+
export declare const LABEL_PROFILES: Readonly<Record<LabelProfileId, LabelProfile>>;
|
|
77
|
+
/** Thermal first — it is what the warehouse actually uses day to day. */
|
|
78
|
+
export declare const LABEL_PROFILE_IDS: readonly LabelProfileId[];
|
|
79
|
+
export declare function labelProfileById(id: LabelProfileId): LabelProfile;
|
|
80
|
+
/**
|
|
81
|
+
* The real print geometry, as CSS.
|
|
82
|
+
*
|
|
83
|
+
* 🛑 `@page { size: <w>mm <h>mm; margin: 0 }` IS THE WHOLE POINT OF THIS
|
|
84
|
+
* MODULE. Without it the browser prints the user's default paper and the label
|
|
85
|
+
* is a small rectangle somewhere on an A4 sheet. `margin: 0` is not tidiness:
|
|
86
|
+
* a thermal page IS one label, so any page margin shrinks the label and the
|
|
87
|
+
* content no longer lines up with the die-cut.
|
|
88
|
+
*
|
|
89
|
+
* 🛑 `@page` IS DOCUMENT-GLOBAL AND CANNOT BE SCOPED. Two components each
|
|
90
|
+
* emitting one does not give two geometries — the later in document order
|
|
91
|
+
* wins, silently. So exactly ONE owner may call this per printable view, and
|
|
92
|
+
* that owner is the thing that knows which profile the user picked.
|
|
93
|
+
*
|
|
94
|
+
* The screen preview is deliberately NOT styled from here. A label shown at its
|
|
95
|
+
* true physical size on a 27-inch monitor is a postage stamp nobody can read,
|
|
96
|
+
* and mm in a browser depend on a reported DPI that is usually a guess.
|
|
97
|
+
*/
|
|
98
|
+
export declare function labelPageCss(profile: LabelProfile): string;
|
|
99
|
+
/**
|
|
100
|
+
* The `@page` rule for an ordinary printed DOCUMENT — a packing slip, a box
|
|
101
|
+
* contents sheet — rather than a label.
|
|
102
|
+
*
|
|
103
|
+
* 🛑 Lives here rather than in the view for one reason: `audit-label-profiles`
|
|
104
|
+
* R3 allows exactly one module to author `@page`, because the rule is
|
|
105
|
+
* document-global and a second author does not add a geometry — the later one
|
|
106
|
+
* silently wins. A view that needed A4 would otherwise have to write its own
|
|
107
|
+
* and defeat that guarantee.
|
|
108
|
+
*
|
|
109
|
+
* 🛑 It takes explicit mm, never `size: A4`. A named paper size is the original
|
|
110
|
+
* bug this module exists to fix: the browser prints its default page, which is
|
|
111
|
+
* A4 for some users and Letter for others, and the layout silently differs by
|
|
112
|
+
* 18 mm of height between them.
|
|
113
|
+
*/
|
|
114
|
+
export declare function documentPageCss(page?: {
|
|
115
|
+
widthMm: number;
|
|
116
|
+
heightMm: number;
|
|
117
|
+
}, marginMm?: number): string;
|
|
118
|
+
export interface LabelFitReport {
|
|
119
|
+
readonly fits: boolean;
|
|
120
|
+
/** Width the symbol needs at `SAFE_MODULE_MM`, quiet zones included. */
|
|
121
|
+
readonly requiredMm: number;
|
|
122
|
+
/** Width the label actually offers once padding is removed. */
|
|
123
|
+
readonly availableMm: number;
|
|
124
|
+
/**
|
|
125
|
+
* The module width this stock would force. Compare against
|
|
126
|
+
* `MIN_SCANNABLE_MODULE_MM` — below it the symbol is unreliable rather than
|
|
127
|
+
* merely small.
|
|
128
|
+
*/
|
|
129
|
+
readonly impliedModuleMm: number;
|
|
130
|
+
/** Plain-language reason, safe to show an operator verbatim. */
|
|
131
|
+
readonly reason: string;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Does a barcode of `characters` length fit this label — and if not, why.
|
|
135
|
+
*
|
|
136
|
+
* 🛑 THIS REPORTS. IT NEVER SCALES, AND THAT IS THE ENTIRE DESIGN.
|
|
137
|
+
*
|
|
138
|
+
* Scaling a barcode to fit is the obvious, wrong answer, and it fails in the
|
|
139
|
+
* worst possible way: the label looks perfect. The bars are narrower, the
|
|
140
|
+
* proportions are right, a human sees a barcode — and the module width has
|
|
141
|
+
* dropped below what a scanner can resolve, so it does not read. The failure
|
|
142
|
+
* surfaces weeks later at a receive station as "the scanner is broken", and the
|
|
143
|
+
* labels have all been printed and stuck to things by then.
|
|
144
|
+
*
|
|
145
|
+
* A refusal to print is noticed in the second it happens, by the person who can
|
|
146
|
+
* still choose different stock. That is the only trade this function makes.
|
|
147
|
+
*
|
|
148
|
+
* 🛑 COMPUTED AGAINST THE PROFILES ABOVE, NOT ASSERTED. A 12-character
|
|
149
|
+
* `LIR-XXXXXXXX` symbol needs 187 modules = 46.75 mm at `SAFE_MODULE_MM`, and
|
|
150
|
+
* the six stocks answer differently enough that a single "does it fit" boolean
|
|
151
|
+
* would have been a lie:
|
|
152
|
+
*
|
|
153
|
+
* thermal-100x50 97.0 mm 0.519 mm/module comfortable
|
|
154
|
+
* a4-8up 95.1 mm 0.509 mm/module comfortable
|
|
155
|
+
* a4-24up 60.5 mm 0.324 mm/module comfortable
|
|
156
|
+
* thermal-50x25 47.0 mm 0.251 mm/module fits by 0.25 mm — no slack
|
|
157
|
+
* a4-65up 36.1 mm 0.193 mm/module over the floor by 0.003 mm
|
|
158
|
+
* thermal-38x25 35.0 mm 0.187 mm/module BELOW the floor
|
|
159
|
+
*
|
|
160
|
+
* 🛑 An earlier draft of this comment claimed `a4-65up` "cannot carry" the
|
|
161
|
+
* symbol. It can, barely — 0.193 against a 0.19 floor — and overstating it
|
|
162
|
+
* would have had someone discard working stock. The two genuinely notable rows
|
|
163
|
+
* are the last two, and they are notable for opposite reasons: 65-up is
|
|
164
|
+
* technically above the floor with no margin whatsoever for a worn printhead,
|
|
165
|
+
* and 38x25 is the one stock that simply cannot do it.
|
|
166
|
+
*
|
|
167
|
+
* All six stay in the list. 38x25 is fine for a shorter code or a text-only
|
|
168
|
+
* label, and silently dropping stock the warehouse already owns teaches nobody
|
|
169
|
+
* why it was dropped.
|
|
170
|
+
*/
|
|
171
|
+
export declare function labelFitsProfile(profile: LabelProfile, characters: number): LabelFitReport;
|
|
172
|
+
/**
|
|
173
|
+
* Where label `index` sits on a sheet, in mm from the page's top-left.
|
|
174
|
+
*
|
|
175
|
+
* Returns null past the last position on the sheet, which the caller must read
|
|
176
|
+
* as "start a new page" rather than as an error — a 70-label job on 65-up stock
|
|
177
|
+
* is two pages, not a failure.
|
|
178
|
+
*/
|
|
179
|
+
export declare function sheetPositionMm(sheet: SheetLayout, index: number): {
|
|
180
|
+
leftMm: number;
|
|
181
|
+
topMm: number;
|
|
182
|
+
} | null;
|
|
183
|
+
/**
|
|
184
|
+
* Sanity check that a sheet's own grid fits on its own page.
|
|
185
|
+
*
|
|
186
|
+
* 🛑 Exists because the Avery figures above are transcribed, and a transposed
|
|
187
|
+
* digit in a pitch is invisible until a batch has been printed. The last
|
|
188
|
+
* label's far edge is `margin + (n - 1) x pitch + size`; if that exceeds the
|
|
189
|
+
* page, the grid is wrong on paper and nothing else in this module would say
|
|
190
|
+
* so. Call it from the audit, not at render time.
|
|
191
|
+
*/
|
|
192
|
+
export declare function sheetOverflowMm(profile: LabelProfile): {
|
|
193
|
+
rightMm: number;
|
|
194
|
+
bottomMm: number;
|
|
195
|
+
} | null;
|
|
196
|
+
/** Re-exported so a caller converting a legacy inch figure need not hunt. */
|
|
197
|
+
export { MM_PER_INCH };
|
|
198
|
+
export type { PrintPageSize };
|