@mohasinac/appkit 2.8.6 → 2.8.8

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 (62) hide show
  1. package/dist/_internal/server/features/checkout/actions.js +9 -9
  2. package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +1 -1
  3. package/dist/_internal/shared/listing-types/action-tracker.js +1 -1
  4. package/dist/client.d.ts +2 -0
  5. package/dist/client.js +1 -0
  6. package/dist/constants/api-endpoints.d.ts +3 -0
  7. package/dist/constants/api-endpoints.js +1 -0
  8. package/dist/core/hooks/useSyncManager.js +4 -4
  9. package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
  10. package/dist/features/admin/components/AdminSupportTicketDetailView.js +4 -4
  11. package/dist/features/blog/api/[slug]/route.js +1 -1
  12. package/dist/features/categories/components/CategoryDetailPageView.js +3 -1
  13. package/dist/features/layout/TitleBarLayout.js +2 -4
  14. package/dist/features/media/MediaImage.js +7 -5
  15. package/dist/features/media/MediaVideo.js +5 -2
  16. package/dist/features/media/upload/MediaUploadField.js +3 -1
  17. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +3 -1
  18. package/dist/features/products/components/ShareButton.js +1 -1
  19. package/dist/features/products/components/ShowGroupSection.js +1 -1
  20. package/dist/features/products/components/SublistingCarouselSection.js +1 -1
  21. package/dist/features/promotions/components/CouponCard.js +1 -1
  22. package/dist/features/scams/actions/scam-actions.js +1 -1
  23. package/dist/features/seller/components/PhysicalLocationModal.js +5 -1
  24. package/dist/features/seller/components/SellerFeaturesView.js +2 -2
  25. package/dist/features/seller/components/SellerGoogleReviewsView.js +1 -1
  26. package/dist/features/seller/components/SellerPayoutRequestView.js +1 -1
  27. package/dist/features/seller/components/SellerPayoutSettingsView.js +1 -1
  28. package/dist/features/seller/components/SellerProductShell.js +1 -1
  29. package/dist/features/seller/components/SellerShippingView.js +1 -1
  30. package/dist/features/wishlist/hooks/useWishlistCount.js +1 -1
  31. package/dist/monitoring/server-logger.js +3 -3
  32. package/dist/providers/db-firebase/browser-stub.d.ts +1 -0
  33. package/dist/providers/db-firebase/browser-stub.js +1 -0
  34. package/dist/providers/db-firebase/rtdb-paths.d.ts +1 -0
  35. package/dist/providers/db-firebase/rtdb-paths.js +1 -0
  36. package/dist/seed/_helpers/media.d.ts +1 -0
  37. package/dist/seed/_helpers/media.js +26 -0
  38. package/dist/seed/blog-posts-seed-data.js +12 -11
  39. package/dist/seed/carousel-slides-seed-data.js +7 -6
  40. package/dist/seed/cart-seed-data.js +13 -12
  41. package/dist/seed/categories-seed-data.js +95 -94
  42. package/dist/seed/events-seed-data.js +9 -8
  43. package/dist/seed/factories/product.factory.js +4 -3
  44. package/dist/seed/factories/store.factory.js +3 -2
  45. package/dist/seed/factories/user.factory.js +2 -1
  46. package/dist/seed/grouped-listings-seed-data.js +4 -3
  47. package/dist/seed/homepage-sections-seed-data.js +2 -1
  48. package/dist/seed/products-auctions-seed-data.js +57 -56
  49. package/dist/seed/products-classifieds-seed-data.js +12 -11
  50. package/dist/seed/products-digital-codes-seed-data.js +11 -10
  51. package/dist/seed/products-live-items-seed-data.js +9 -8
  52. package/dist/seed/products-preorders-seed-data.js +6 -5
  53. package/dist/seed/products-prize-draws-seed-data.js +25 -24
  54. package/dist/seed/products-standard-seed-data.js +125 -124
  55. package/dist/seed/scammers-seed-data.js +2 -1
  56. package/dist/seed/site-settings-seed-data.js +6 -5
  57. package/dist/seed/store-extensions-seed-data.js +10 -9
  58. package/dist/seed/stores-seed-data.js +17 -16
  59. package/dist/seed/users-seed-data.js +22 -21
  60. package/dist/ui/components/BackgroundRenderer.js +6 -4
  61. package/dist/ui/rich-text/RichText.js +1 -1
  62. package/package.json +1 -1
@@ -51,6 +51,7 @@ export const RTDB_PATHS = {
51
51
  AUTH_EVENTS: "auth_events",
52
52
  PAYMENT_EVENTS: "payment_events",
53
53
  BULK_EVENTS: "bulk_events",
54
+ SEED_EVENTS: "seed_events",
54
55
  };
55
56
  // Client config builder � safe in all environments
56
57
  export { buildFirebaseClientConfig, normalizeFirebaseConfigValue } from './client-config';
@@ -9,4 +9,5 @@ export declare const RTDB_PATHS: {
9
9
  readonly AUTH_EVENTS: "auth_events";
10
10
  readonly PAYMENT_EVENTS: "payment_events";
11
11
  readonly BULK_EVENTS: "bulk_events";
12
+ readonly SEED_EVENTS: "seed_events";
12
13
  };
@@ -9,4 +9,5 @@ export const RTDB_PATHS = {
9
9
  AUTH_EVENTS: "auth_events",
10
10
  PAYMENT_EVENTS: "payment_events",
11
11
  BULK_EVENTS: "bulk_events",
12
+ SEED_EVENTS: "seed_events",
12
13
  };
@@ -0,0 +1 @@
1
+ export declare function seedExtMedia(url: string): string;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Seed-time media URL helper.
3
+ *
4
+ * Wraps a 3rd-party image/video URL in the /api/media/ext proxy path so
5
+ * seed data never persists raw upstream URLs. The proxy adds watermarking,
6
+ * survives upstream rate-limits, and keeps CSP / image hosts under our
7
+ * control.
8
+ *
9
+ * Companion runtime helper: `resolveMediaUrl()` in ../../utils/media-url.ts
10
+ * — defends consumers that still see raw URLs (e.g. live Firestore reads
11
+ * from older docs). Both produce the same `/api/media/ext?url=<encoded>`
12
+ * shape for external https URLs.
13
+ *
14
+ * Idempotent: already-proxied URLs (`/media/...` or `/api/media/ext?url=...`)
15
+ * pass through untouched, so wrapping a wrapped URL is safe.
16
+ */
17
+ import { MEDIA_ENDPOINTS } from "../../constants/api-endpoints";
18
+ const PROXY_PREFIX = "/media/";
19
+ const EXT_PREFIX = "/api/media/ext?url=";
20
+ export function seedExtMedia(url) {
21
+ if (url.startsWith(PROXY_PREFIX))
22
+ return url;
23
+ if (url.startsWith(EXT_PREFIX))
24
+ return url;
25
+ return MEDIA_ENDPOINTS.EXT_URL(url);
26
+ }
@@ -13,6 +13,7 @@
13
13
  * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
14
14
  * @tag sideEffects:none
15
15
  */
16
+ import { seedExtMedia } from "./_helpers/media";
16
17
  const NOW = new Date();
17
18
  const daysAgo = (n) => new Date(NOW.getTime() - n * 86400000);
18
19
  export const blogPostsSeedData = [
@@ -23,7 +24,7 @@ export const blogPostsSeedData = [
23
24
  slug: "identify-1st-edition-yugioh",
24
25
  excerpt: "Learn the telltale signs that distinguish a genuine 1st Edition print from Unlimited — from the gold stamp placement to the eye of Anubis hologram.",
25
26
  content: `<h2>The Gold Stamp</h2><p>1st Edition Yu-Gi-Oh! cards feature a gold "1st Edition" stamp below the artwork on the left side. On LOB (Legend of Blue Eyes White Dragon) cards from 2002, this stamp is slightly larger than later sets.</p><h2>Eye of Anubis</h2><p>Starting with LOB Unlimited, Konami added the Eye of Anubis hologram to the bottom-right corner. 1st Edition LOB cards do NOT have this hologram — that's actually a sign of authenticity for the earliest prints.</p><h2>Font Differences</h2><p>Compare the font weight of the card name. 1st Edition prints from the early Duel Monsters era often have slightly bolder text than their Unlimited counterparts.</p>`,
26
- coverImage: { type: "image", url: "https://images.ygoprodeck.com/images/cards/cropped/46986414.jpg", alt: "Dark Magician card art" },
27
+ coverImage: { type: "image", url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/46986414.jpg"), alt: "Dark Magician card art" },
27
28
  category: "guides",
28
29
  tags: ["1st-edition", "authentication", "grading", "ygo"],
29
30
  isFeatured: true,
@@ -31,7 +32,7 @@ export const blogPostsSeedData = [
31
32
  publishedAt: daysAgo(30),
32
33
  authorId: "user-admin-letitrip",
33
34
  authorName: "LetItRip Admin",
34
- authorAvatar: "https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg",
35
+ authorAvatar: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg"),
35
36
  readTimeMinutes: 5,
36
37
  views: 4200,
37
38
  metaTitle: "How to Identify 1st Edition Yu-Gi-Oh! Cards | LetItRip",
@@ -45,7 +46,7 @@ export const blogPostsSeedData = [
45
46
  slug: "psa-vs-bgs-vs-cgc",
46
47
  excerpt: "A head-to-head comparison of the three major card grading services and which one commands the highest premiums in the trading card market.",
47
48
  content: `<h2>PSA — The Industry Standard</h2><p>PSA (Professional Sports Authenticator) is the most widely recognized grading service. A PSA 10 "Gem Mint" commands the highest resale premiums, especially for vintage cards from any TCG.</p><h2>BGS — The Sub-Grade King</h2><p>Beckett Grading Services provides sub-grades for centering, surface, edges, and corners. A BGS 10 "Pristine" is incredibly rare, and a BGS 10 "Black Label" (all sub-grades 10) is the holy grail.</p><h2>CGC — The Newcomer</h2><p>CGC entered the trading card market more recently. They also offer sub-grades and their slabs have a modern, clean design. CGC is growing in popularity but PSA still dominates resale value.</p><h2>Our Recommendation</h2><p>For investment: PSA 10 commands the highest resale value. For personal collection with detailed condition analysis: BGS. For budget grading: CGC.</p>`,
48
- coverImage: { type: "image", url: "https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg", alt: "Exodia the Forbidden One" },
49
+ coverImage: { type: "image", url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg"), alt: "Exodia the Forbidden One" },
49
50
  category: "guides",
50
51
  tags: ["grading", "psa", "bgs", "cgc", "trading-cards", "investment"],
51
52
  isFeatured: true,
@@ -53,7 +54,7 @@ export const blogPostsSeedData = [
53
54
  publishedAt: daysAgo(25),
54
55
  authorId: "user-admin-letitrip",
55
56
  authorName: "LetItRip Admin",
56
- authorAvatar: "https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg",
57
+ authorAvatar: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg"),
57
58
  readTimeMinutes: 7,
58
59
  views: 3800,
59
60
  metaTitle: "PSA vs BGS vs CGC — Best Card Grading Services | LetItRip",
@@ -67,14 +68,14 @@ export const blogPostsSeedData = [
67
68
  slug: "complete-exodia-guide",
68
69
  excerpt: "Every printing of Exodia the Forbidden One and its four limbs — from the original LOB 1st Edition to the latest reprint, with current market values.",
69
70
  content: `<h2>The Original Five</h2><p>Exodia the Forbidden One (33396948), Left Arm (07902349), Right Arm (70903634), Left Leg (44519536), and Right Leg (08124921). Completing the set in your hand is an instant win — and completing a 1st Edition PSA 10 set is the ultimate flex.</p><h2>LOB 1st Edition (2002)</h2><p>The holy grail. Each piece in PSA 10 ranges from ₹3–5 lakh. A complete set? Over ₹20 lakh.</p><h2>Later Printings</h2><p>Unlimited LOB, Retro Pack, Lost Art Promotion, and various structure deck reprints. Values range from ₹500 for common reprints to ₹50,000+ for rare promotional versions.</p>`,
70
- coverImage: { type: "image", url: "https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg", alt: "Exodia the Forbidden One" },
71
+ coverImage: { type: "image", url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg"), alt: "Exodia the Forbidden One" },
71
72
  category: "guides",
72
73
  tags: ["exodia", "guide", "printings", "values", "ygo"],
73
74
  isFeatured: false,
74
75
  status: "draft",
75
76
  authorId: "user-admin-letitrip",
76
77
  authorName: "LetItRip Admin",
77
- authorAvatar: "https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg",
78
+ authorAvatar: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg"),
78
79
  readTimeMinutes: 10,
79
80
  views: 0,
80
81
  metaTitle: "Complete Exodia Guide — All Printings & Values | LetItRip",
@@ -149,7 +150,7 @@ export const blogPostsSeedData = [
149
150
  slug: "top-10-duel-monsters-cards",
150
151
  excerpt: "From the legendary Blue-Eyes White Dragon LOB 1st Edition to the elusive Tournament Black Luster Soldier — these are the cards every collector dreams of.",
151
152
  content: `<h2>1. Tournament Black Luster Soldier (2002)</h2><p>The rarest YGO card ever printed. Only one exists in the wild. Estimated value: over ₹70 lakh.</p><h2>2. Blue-Eyes White Dragon LOB 1st Ed PSA 10</h2><p>Seto Kaiba's signature card in gem mint 1st Edition. PSA 10 copies sell for ₹15–25 lakh.</p><h2>3. Dark Magician LOB 1st Ed PSA 10</h2><p>Yugi's signature card. A PSA 10 1st Edition LOB Dark Magician commands ₹8–12 lakh.</p><h2>4. Exodia Complete Set (LOB 1st Ed, all 5 pieces PSA 10)</h2><p>All five Exodia pieces in 1st Edition PSA 10 — virtually impossible to assemble. Set value: over ₹20 lakh.</p><h2>5–10</h2><p>Mirror Force MRD 1st Ed, Change of Heart MRD 1st Ed, Monster Reborn LOB 1st Ed, Pot of Greed LOB 1st Ed, Gate Guardian MRD, and Dark Magician Girl MFC 1st Ed.</p>`,
152
- coverImage: { type: "image", url: "https://images.ygoprodeck.com/images/cards/cropped/89631139.jpg", alt: "Blue-Eyes White Dragon" },
153
+ coverImage: { type: "image", url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/89631139.jpg"), alt: "Blue-Eyes White Dragon" },
153
154
  category: "news",
154
155
  tags: ["top-10", "duel-monsters", "investment", "rare-cards"],
155
156
  isFeatured: false,
@@ -157,7 +158,7 @@ export const blogPostsSeedData = [
157
158
  publishedAt: daysAgo(20),
158
159
  authorId: "user-admin-letitrip",
159
160
  authorName: "LetItRip Admin",
160
- authorAvatar: "https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg",
161
+ authorAvatar: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg"),
161
162
  readTimeMinutes: 8,
162
163
  views: 6100,
163
164
  metaTitle: "Top 10 Most Valuable Duel Monsters Era Cards | LetItRip",
@@ -232,7 +233,7 @@ export const blogPostsSeedData = [
232
233
  slug: "gx-era-hidden-gems",
233
234
  excerpt: "The GX era produced some of the most undervalued cards in Yu-Gi-Oh! history. Here are the Shadow of Infinity cards smart collectors are buying now.",
234
235
  content: `<h2>Why GX Cards Are Undervalued</h2><p>The GX era (2004–2008) coincided with peak Yu-Gi-Oh! anime popularity but many collectors focus exclusively on the original Duel Monsters era. This creates a pricing gap.</p><h2>Shadow of Infinity Picks</h2><p><strong>Elemental HERO Neos</strong> — Jaden Yuki's signature card. 1st Edition Ultra Rare copies are still affordable at ₹3,000–₹5,000.</p><p><strong>Cyber Dragon</strong> — One of the most competitively impactful cards ever. 1st Edition Ultimate Rare commands ₹8,000–₹12,000.</p><p><strong>Rainbow Dragon</strong> — Jesse Anderson's ace. Low print run makes this a sleeper investment.</p>`,
235
- coverImage: { type: "image", url: "https://images.ygoprodeck.com/images/cards/cropped/89943723.jpg", alt: "Elemental HERO Neos" },
236
+ coverImage: { type: "image", url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/89943723.jpg"), alt: "Elemental HERO Neos" },
236
237
  category: "tips",
237
238
  tags: ["gx-era", "hidden-gems", "investment", "ygo"],
238
239
  isFeatured: false,
@@ -240,7 +241,7 @@ export const blogPostsSeedData = [
240
241
  publishedAt: daysAgo(15),
241
242
  authorId: "user-admin-letitrip",
242
243
  authorName: "LetItRip Admin",
243
- authorAvatar: "https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg",
244
+ authorAvatar: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg"),
244
245
  readTimeMinutes: 6,
245
246
  views: 2900,
246
247
  metaTitle: "GX Era Hidden Gems — Undervalued YGO Cards | LetItRip",
@@ -314,7 +315,7 @@ export const blogPostsSeedData = [
314
315
  slug: "authenticating-ygo-cards",
315
316
  excerpt: "A behind-the-scenes look at how verified sellers on LetItRip check every trading card before listing — light tests, holo patterns, and weight checks.",
316
317
  content: `<h2>The 5-Point Authentication Process</h2><p>Every card listed by top verified stores goes through a rigorous 5-point check:</p><ol><li><strong>Light Test</strong> — Genuine Konami/Pokémon Company cards have a specific opacity when held to light.</li><li><strong>Holo Pattern</strong> — Each rarity has a distinct holographic pattern verified under UV light.</li><li><strong>Weight Check</strong> — A genuine trading card weighs approximately 1.7–1.8 grams.</li><li><strong>Rosette Test</strong> — Under 10x magnification, genuine cards show a rosette dot pattern.</li><li><strong>Edge & Corner Inspection</strong> — Check for trimming, re-cornering, or alteration.</li></ol>`,
317
- coverImage: { type: "image", url: "https://images.ygoprodeck.com/images/cards/cropped/23995346.jpg", alt: "Card authentication process" },
318
+ coverImage: { type: "image", url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/23995346.jpg"), alt: "Card authentication process" },
318
319
  category: "community",
319
320
  tags: ["authentication", "verification", "counterfeit", "trading-cards"],
320
321
  isFeatured: false,
@@ -12,6 +12,7 @@
12
12
  * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
13
13
  * @tag sideEffects:none
14
14
  */
15
+ import { seedExtMedia } from "./_helpers/media";
15
16
  const NOW = new Date();
16
17
  const daysAgo = (n) => new Date(NOW.getTime() - n * 86400000);
17
18
  const _rawSlides = [
@@ -22,7 +23,7 @@ const _rawSlides = [
22
23
  active: true,
23
24
  background: {
24
25
  type: "image",
25
- url: "https://images.ygoprodeck.com/images/cards/cropped/46986414.jpg",
26
+ url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/46986414.jpg"),
26
27
  dimOverlay: { enabled: true, opacity: 0.5 },
27
28
  },
28
29
  settings: { autoplayDelayMs: 5000, height: "tall" },
@@ -37,7 +38,7 @@ const _rawSlides = [
37
38
  active: true,
38
39
  background: {
39
40
  type: "image",
40
- url: "https://images.ygoprodeck.com/images/cards/cropped/89631139.jpg",
41
+ url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/89631139.jpg"),
41
42
  dimOverlay: { enabled: true, opacity: 0.4 },
42
43
  },
43
44
  link: { url: "/auctions", openInNewTab: false },
@@ -53,7 +54,7 @@ const _rawSlides = [
53
54
  active: true,
54
55
  background: {
55
56
  type: "image",
56
- url: "https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg",
57
+ url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg"),
57
58
  dimOverlay: { enabled: true, opacity: 0.45 },
58
59
  },
59
60
  link: { url: "/products?q=exodia", openInNewTab: false },
@@ -69,7 +70,7 @@ const _rawSlides = [
69
70
  active: true,
70
71
  background: {
71
72
  type: "image",
72
- url: "https://images.ygoprodeck.com/images/cards/cropped/89943723.jpg",
73
+ url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/89943723.jpg"),
73
74
  dimOverlay: { enabled: true, opacity: 0.4 },
74
75
  },
75
76
  link: { url: "/pre-orders", openInNewTab: false },
@@ -85,7 +86,7 @@ const _rawSlides = [
85
86
  active: true,
86
87
  background: {
87
88
  type: "image",
88
- url: "https://images.ygoprodeck.com/images/cards/cropped/38033121.jpg",
89
+ url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/38033121.jpg"),
89
90
  dimOverlay: { enabled: true, opacity: 0.5 },
90
91
  },
91
92
  link: { url: "/categories/category-graded-cards", openInNewTab: false },
@@ -101,7 +102,7 @@ const _rawSlides = [
101
102
  active: false,
102
103
  background: {
103
104
  type: "image",
104
- url: "https://images.ygoprodeck.com/images/cards/cropped/83764718.jpg",
105
+ url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/83764718.jpg"),
105
106
  dimOverlay: { enabled: true, opacity: 0.5 },
106
107
  },
107
108
  settings: { autoplayDelayMs: 5000, height: "tall" },
@@ -13,6 +13,7 @@
13
13
  * @tag sideEffects:none
14
14
  */
15
15
  import { getDefaultCurrency } from "./seed-market-config";
16
+ import { seedExtMedia } from "./_helpers/media";
16
17
  const _CURRENCY = getDefaultCurrency();
17
18
  const NOW = new Date();
18
19
  const daysAgo = (n) => new Date(NOW.getTime() - n * 86400000);
@@ -26,7 +27,7 @@ export const cartsSeedData = [
26
27
  itemId: "cartitem-yugi-dark-magician-lob-1st",
27
28
  productId: "product-dark-magician-lob-1st",
28
29
  productTitle: "Dark Magician LOB 1st Edition",
29
- productImage: "https://images.ygoprodeck.com/images/cards/small/46986414.jpg",
30
+ productImage: seedExtMedia("https://images.ygoprodeck.com/images/cards/small/46986414.jpg"),
30
31
  price: 499900,
31
32
  currency: _CURRENCY,
32
33
  quantity: 1,
@@ -40,7 +41,7 @@ export const cartsSeedData = [
40
41
  itemId: "cartitem-yugi-lob-booster-pack",
41
42
  productId: "product-lob-booster-pack",
42
43
  productTitle: "Legend of Blue Eyes Booster Pack",
43
- productImage: "https://images.ygoprodeck.com/images/cards/small/89631139.jpg",
44
+ productImage: seedExtMedia("https://images.ygoprodeck.com/images/cards/small/89631139.jpg"),
44
45
  price: 149900,
45
46
  currency: _CURRENCY,
46
47
  quantity: 2,
@@ -54,7 +55,7 @@ export const cartsSeedData = [
54
55
  itemId: "cartitem-yugi-kuriboh-mrd",
55
56
  productId: "product-kuriboh-mrd",
56
57
  productTitle: "Kuriboh MRD",
57
- productImage: "https://images.ygoprodeck.com/images/cards/small/40640057.jpg",
58
+ productImage: seedExtMedia("https://images.ygoprodeck.com/images/cards/small/40640057.jpg"),
58
59
  price: 29900,
59
60
  currency: _CURRENCY,
60
61
  quantity: 1,
@@ -68,7 +69,7 @@ export const cartsSeedData = [
68
69
  itemId: "cartitem-yugi-blue-eyes-auction-won",
69
70
  productId: "auction-blue-eyes-white-dragon-psa9",
70
71
  productTitle: "Blue-Eyes White Dragon PSA 9 — Won Auction",
71
- productImage: "https://images.ygoprodeck.com/images/cards/small/89631139.jpg",
72
+ productImage: seedExtMedia("https://images.ygoprodeck.com/images/cards/small/89631139.jpg"),
72
73
  price: 2499900,
73
74
  currency: _CURRENCY,
74
75
  quantity: 1,
@@ -83,7 +84,7 @@ export const cartsSeedData = [
83
84
  itemId: "cartitem-yugi-red-eyes-offer-accepted",
84
85
  productId: "product-red-eyes-black-dragon-mrd",
85
86
  productTitle: "Red-Eyes Black Dragon MRD — Offer Accepted",
86
- productImage: "https://images.ygoprodeck.com/images/cards/small/74677422.jpg",
87
+ productImage: seedExtMedia("https://images.ygoprodeck.com/images/cards/small/74677422.jpg"),
87
88
  price: 899900,
88
89
  currency: _CURRENCY,
89
90
  quantity: 1,
@@ -110,7 +111,7 @@ export const cartsSeedData = [
110
111
  itemId: "cartitem-kaiba-duelist-kingdom-playmat",
111
112
  productId: "product-duelist-kingdom-playmat",
112
113
  productTitle: "Duelist Kingdom Playmat",
113
- productImage: "https://images.ygoprodeck.com/images/cards/small/10000015.jpg",
114
+ productImage: seedExtMedia("https://images.ygoprodeck.com/images/cards/small/10000015.jpg"),
114
115
  price: 129900,
115
116
  currency: _CURRENCY,
116
117
  quantity: 1,
@@ -124,7 +125,7 @@ export const cartsSeedData = [
124
125
  itemId: "cartitem-kaiba-exodia-art-print",
125
126
  productId: "product-exodia-art-print",
126
127
  productTitle: "Exodia Art Print A3",
127
- productImage: "https://images.ygoprodeck.com/images/cards/small/33396948.jpg",
128
+ productImage: seedExtMedia("https://images.ygoprodeck.com/images/cards/small/33396948.jpg"),
128
129
  price: 79900,
129
130
  currency: _CURRENCY,
130
131
  quantity: 1,
@@ -138,7 +139,7 @@ export const cartsSeedData = [
138
139
  itemId: "cartitem-kaiba-gate-guardian-preorder",
139
140
  productId: "preorder-gate-guardian-reprint-2026",
140
141
  productTitle: "Gate Guardian 2026 Reprint — Pre-Order",
141
- productImage: "https://images.ygoprodeck.com/images/cards/small/25833572.jpg",
142
+ productImage: seedExtMedia("https://images.ygoprodeck.com/images/cards/small/25833572.jpg"),
142
143
  price: 349900,
143
144
  currency: _CURRENCY,
144
145
  quantity: 1,
@@ -161,7 +162,7 @@ export const cartsSeedData = [
161
162
  itemId: "cartitem-admin-chaos-emperor",
162
163
  productId: "product-chaos-emperor-dragon",
163
164
  productTitle: "Chaos Emperor Dragon — Envoy of the End",
164
- productImage: "https://images.ygoprodeck.com/images/cards/small/82301904.jpg",
165
+ productImage: seedExtMedia("https://images.ygoprodeck.com/images/cards/small/82301904.jpg"),
165
166
  price: 1299900,
166
167
  currency: _CURRENCY,
167
168
  quantity: 1,
@@ -175,7 +176,7 @@ export const cartsSeedData = [
175
176
  itemId: "cartitem-admin-potd-box",
176
177
  productId: "product-potd-booster-box",
177
178
  productTitle: "Power of the Duelist Booster Box 24pk",
178
- productImage: "https://images.ygoprodeck.com/images/cards/small/89943723.jpg",
179
+ productImage: seedExtMedia("https://images.ygoprodeck.com/images/cards/small/89943723.jpg"),
179
180
  price: 2299900,
180
181
  currency: _CURRENCY,
181
182
  quantity: 1,
@@ -198,7 +199,7 @@ export const cartsSeedData = [
198
199
  itemId: "cartitem-guest-mirror-force",
199
200
  productId: "product-mirror-force-mrd",
200
201
  productTitle: "Mirror Force MRD Ultra Rare",
201
- productImage: "https://images.ygoprodeck.com/images/cards/small/44095762.jpg",
202
+ productImage: seedExtMedia("https://images.ygoprodeck.com/images/cards/small/44095762.jpg"),
202
203
  price: 999900,
203
204
  currency: _CURRENCY,
204
205
  quantity: 1,
@@ -212,7 +213,7 @@ export const cartsSeedData = [
212
213
  itemId: "cartitem-guest-yugi-starter",
213
214
  productId: "product-yugi-starter-deck",
214
215
  productTitle: "Starter Deck: Yugi",
215
- productImage: "https://images.ygoprodeck.com/images/cards/small/46986414.jpg",
216
+ productImage: seedExtMedia("https://images.ygoprodeck.com/images/cards/small/46986414.jpg"),
216
217
  price: 199900,
217
218
  currency: _CURRENCY,
218
219
  quantity: 1,