@mohasinac/appkit 2.7.36 → 2.7.38

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 (144) hide show
  1. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +1 -1
  2. package/dist/_internal/client/features/seller/print-center/InventoryLabel.d.ts +12 -0
  3. package/dist/_internal/client/features/seller/print-center/InventoryLabel.js +49 -0
  4. package/dist/_internal/client/features/seller/print-center/LabelDesignPicker.d.ts +7 -0
  5. package/dist/_internal/client/features/seller/print-center/LabelDesignPicker.js +32 -0
  6. package/dist/_internal/client/features/seller/print-center/OrderPackingLabel.d.ts +28 -0
  7. package/dist/_internal/client/features/seller/print-center/OrderPackingLabel.js +33 -0
  8. package/dist/_internal/client/features/seller/print-center/PhysicalLocationModal.d.ts +12 -0
  9. package/dist/_internal/client/features/seller/print-center/PhysicalLocationModal.js +30 -0
  10. package/dist/_internal/client/features/seller/print-center/PrintCenterView.d.ts +12 -0
  11. package/dist/_internal/client/features/seller/print-center/PrintCenterView.js +102 -0
  12. package/dist/_internal/client/features/seller/print-center/PrintGrid.d.ts +12 -0
  13. package/dist/_internal/client/features/seller/print-center/PrintGrid.js +13 -0
  14. package/dist/_internal/client/features/seller/print-center/StoreCard.d.ts +19 -0
  15. package/dist/_internal/client/features/seller/print-center/StoreCard.js +30 -0
  16. package/dist/_internal/client/features/seller/print-center/WebsiteCard.d.ts +11 -0
  17. package/dist/_internal/client/features/seller/print-center/WebsiteCard.js +25 -0
  18. package/dist/_internal/client/features/seller/print-center/index.d.ts +11 -0
  19. package/dist/_internal/client/features/seller/print-center/index.js +10 -0
  20. package/dist/_internal/client/features/seller/print-center/types.d.ts +20 -0
  21. package/dist/_internal/client/features/seller/print-center/types.js +20 -0
  22. package/dist/_internal/client/features/seller/print-center/useInventoryPdf.d.ts +18 -0
  23. package/dist/_internal/client/features/seller/print-center/useInventoryPdf.js +76 -0
  24. package/dist/_internal/server/jobs/core/draftPrune.d.ts +2 -0
  25. package/dist/_internal/server/jobs/core/draftPrune.js +15 -0
  26. package/dist/_internal/server/jobs/core/onBidPlaced.js +1 -1
  27. package/dist/_internal/server/jobs/core/promotions.d.ts +1 -0
  28. package/dist/_internal/server/jobs/core/promotions.js +21 -6
  29. package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +18 -1
  30. package/dist/_internal/server/jobs/handlers/draftPrune.d.ts +2 -0
  31. package/dist/_internal/server/jobs/handlers/draftPrune.js +2 -0
  32. package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
  33. package/dist/_internal/server/jobs/handlers/index.js +2 -0
  34. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -1
  35. package/dist/_internal/shared/actions/action-registry.js +32 -0
  36. package/dist/_internal/shared/features/blog/schema.d.ts +8 -8
  37. package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +10 -10
  38. package/dist/_internal/shared/features/orders/schema.d.ts +8 -8
  39. package/dist/_internal/shared/features/products/schema.d.ts +8 -8
  40. package/dist/_internal/shared/features/promotions/schema.d.ts +6 -6
  41. package/dist/_internal/shared/features/reviews/schema.d.ts +2 -2
  42. package/dist/client.d.ts +13 -1
  43. package/dist/client.js +7 -1
  44. package/dist/configs/next.js +1 -0
  45. package/dist/constants/api-endpoints.d.ts +6 -0
  46. package/dist/constants/api-endpoints.js +2 -0
  47. package/dist/core/server-action.d.ts +4 -0
  48. package/dist/errors/error-codes.d.ts +18 -0
  49. package/dist/errors/error-codes.js +18 -0
  50. package/dist/errors/index.d.ts +1 -1
  51. package/dist/errors/index.js +1 -1
  52. package/dist/errors/messages.d.ts +1 -0
  53. package/dist/errors/messages.js +1 -0
  54. package/dist/features/account/components/UserSidebar.js +1 -1
  55. package/dist/features/account/schemas/index.d.ts +12 -12
  56. package/dist/features/admin/components/AdminSidebar.js +1 -1
  57. package/dist/features/auctions/actions/bid-actions.js +27 -11
  58. package/dist/features/auctions/components/PlaceBidFormClient.js +10 -2
  59. package/dist/features/auctions/repository/bid.repository.d.ts +7 -0
  60. package/dist/features/auctions/repository/bid.repository.js +16 -0
  61. package/dist/features/auctions/schemas/index.d.ts +18 -18
  62. package/dist/features/auth/schemas/index.d.ts +2 -2
  63. package/dist/features/before-after/schemas/index.d.ts +2 -2
  64. package/dist/features/blog/actions/blog-actions.d.ts +32 -32
  65. package/dist/features/blog/components/BlogPostForm.js +1 -1
  66. package/dist/features/blog/schemas/index.d.ts +38 -38
  67. package/dist/features/categories/schemas/index.d.ts +10 -10
  68. package/dist/features/collections/schemas/index.d.ts +4 -4
  69. package/dist/features/consultation/schemas/index.d.ts +9 -9
  70. package/dist/features/corporate/schemas/index.d.ts +4 -4
  71. package/dist/features/events/schemas/index.d.ts +50 -50
  72. package/dist/features/faq/actions/faq-actions.d.ts +6 -6
  73. package/dist/features/faq/schemas/index.d.ts +8 -8
  74. package/dist/features/homepage/actions/homepage-section-actions.d.ts +4 -4
  75. package/dist/features/layout/AppLayoutShell.js +1 -1
  76. package/dist/features/layout/AutoBreadcrumbs.js +1 -1
  77. package/dist/features/media/AvatarUpload.js +1 -1
  78. package/dist/features/media/types/index.d.ts +4 -4
  79. package/dist/features/media/upload/ImageUpload.js +18 -9
  80. package/dist/features/media/upload/MediaUploadList.js +2 -2
  81. package/dist/features/orders/schemas/firestore.d.ts +6 -0
  82. package/dist/features/orders/schemas/index.d.ts +10 -10
  83. package/dist/features/orders/types/index.d.ts +5 -0
  84. package/dist/features/payments/schemas/index.d.ts +4 -4
  85. package/dist/features/pre-orders/schemas/index.d.ts +8 -8
  86. package/dist/features/products/components/PrizeDrawItemsEditor.js +1 -1
  87. package/dist/features/products/components/ProductDetailActions.d.ts +16 -0
  88. package/dist/features/products/components/ProductDetailActions.js +94 -0
  89. package/dist/features/products/components/ProductDetailPageView.d.ts +16 -1
  90. package/dist/features/products/components/ProductDetailPageView.js +22 -3
  91. package/dist/features/products/components/ProductForm.js +20 -2
  92. package/dist/features/products/repository/products.repository.d.ts +3 -1
  93. package/dist/features/products/repository/products.repository.js +12 -1
  94. package/dist/features/products/schemas/firestore.d.ts +7 -0
  95. package/dist/features/products/schemas/index.d.ts +34 -34
  96. package/dist/features/products/schemas/product-features.validators.d.ts +6 -6
  97. package/dist/features/products/types/index.d.ts +6 -0
  98. package/dist/features/promotions/schemas/index.d.ts +14 -14
  99. package/dist/features/reviews/schemas/index.d.ts +18 -18
  100. package/dist/features/seller/actions/offer-actions.js +10 -1
  101. package/dist/features/seller/components/PhysicalLocationModal.d.ts +12 -0
  102. package/dist/features/seller/components/PhysicalLocationModal.js +30 -0
  103. package/dist/features/seller/components/PrintCenterView.d.ts +40 -0
  104. package/dist/features/seller/components/PrintCenterView.js +6 -0
  105. package/dist/features/seller/components/SellerOrdersView.js +48 -3
  106. package/dist/features/seller/components/SellerProductShell.d.ts +1 -0
  107. package/dist/features/seller/components/SellerProductShell.js +26 -4
  108. package/dist/features/seller/components/SellerProductsView.js +54 -13
  109. package/dist/features/seller/components/SellerSidebar.js +1 -1
  110. package/dist/features/seller/components/index.d.ts +1 -0
  111. package/dist/features/seller/components/index.js +1 -0
  112. package/dist/features/seller/schemas/firestore.d.ts +2 -0
  113. package/dist/features/seller/schemas/firestore.js +1 -0
  114. package/dist/features/seller/schemas/index.d.ts +22 -22
  115. package/dist/features/shell/FormShell.js +1 -1
  116. package/dist/features/shell/StepForm.d.ts +3 -1
  117. package/dist/features/shell/StepForm.js +3 -3
  118. package/dist/features/stores/schemas/index.d.ts +4 -4
  119. package/dist/index.d.ts +9 -1
  120. package/dist/index.js +6 -1
  121. package/dist/next/routing/route-map.d.ts +8 -0
  122. package/dist/next/routing/route-map.js +3 -0
  123. package/dist/tailwind-utilities.css +1 -1
  124. package/dist/ui/components/RowActionMenu.js +45 -10
  125. package/dist/ui/components/SideDrawer.style.css +2 -2
  126. package/dist/ui/forms/FieldCheckbox.d.ts +13 -0
  127. package/dist/ui/forms/FieldCheckbox.js +25 -0
  128. package/dist/ui/forms/FieldInput.d.ts +11 -0
  129. package/dist/ui/forms/FieldInput.js +25 -0
  130. package/dist/ui/forms/FieldSelect.d.ts +17 -0
  131. package/dist/ui/forms/FieldSelect.js +25 -0
  132. package/dist/ui/forms/FormShell.d.ts +48 -0
  133. package/dist/ui/forms/FormShell.js +176 -0
  134. package/dist/ui/forms/FormShell.style.css +287 -0
  135. package/dist/ui/forms/index.d.ts +8 -0
  136. package/dist/ui/forms/index.js +4 -0
  137. package/dist/ui/index.d.ts +9 -0
  138. package/dist/ui/index.js +5 -0
  139. package/dist/utils/action-response.d.ts +6 -0
  140. package/dist/utils/action-response.js +22 -0
  141. package/dist/utils/index.d.ts +1 -0
  142. package/dist/utils/index.js +1 -0
  143. package/dist/validation/schemas.d.ts +10 -10
  144. package/package.json +2 -2
@@ -88,38 +88,38 @@ export declare const eventItemSchema: z.ZodObject<{
88
88
  source: z.ZodOptional<z.ZodEnum<["upload", "youtube", "external"]>>;
89
89
  youtubeId: z.ZodOptional<z.ZodString>;
90
90
  }, "strip", z.ZodTypeAny, {
91
- type: "video" | "image" | "file";
92
91
  url: string;
93
- source?: "upload" | "youtube" | "external" | undefined;
92
+ type: "image" | "video" | "file";
94
93
  alt?: string | undefined;
95
94
  thumbnailUrl?: string | undefined;
95
+ source?: "upload" | "youtube" | "external" | undefined;
96
96
  youtubeId?: string | undefined;
97
97
  }, {
98
- type: "video" | "image" | "file";
99
98
  url: string;
100
- source?: "upload" | "youtube" | "external" | undefined;
99
+ type: "image" | "video" | "file";
101
100
  alt?: string | undefined;
102
101
  thumbnailUrl?: string | undefined;
102
+ source?: "upload" | "youtube" | "external" | undefined;
103
103
  youtubeId?: string | undefined;
104
104
  }>, z.ZodEffects<z.ZodString, {
105
105
  url: string;
106
106
  type: "image";
107
107
  }, string>]>>>, {
108
- type: "video" | "image" | "file";
109
108
  url: string;
110
- source?: "upload" | "youtube" | "external" | undefined;
109
+ type: "image" | "video" | "file";
111
110
  alt?: string | undefined;
112
111
  thumbnailUrl?: string | undefined;
112
+ source?: "upload" | "youtube" | "external" | undefined;
113
113
  youtubeId?: string | undefined;
114
114
  } | {
115
115
  url: string;
116
116
  type: "image";
117
117
  } | null, string | {
118
- type: "video" | "image" | "file";
119
118
  url: string;
120
- source?: "upload" | "youtube" | "external" | undefined;
119
+ type: "image" | "video" | "file";
121
120
  alt?: string | undefined;
122
121
  thumbnailUrl?: string | undefined;
122
+ source?: "upload" | "youtube" | "external" | undefined;
123
123
  youtubeId?: string | undefined;
124
124
  } | null | undefined>;
125
125
  coverImageUrl: z.ZodOptional<z.ZodString>;
@@ -131,18 +131,18 @@ export declare const eventItemSchema: z.ZodObject<{
131
131
  source: z.ZodOptional<z.ZodEnum<["upload", "youtube", "external"]>>;
132
132
  youtubeId: z.ZodOptional<z.ZodString>;
133
133
  }, "strip", z.ZodTypeAny, {
134
- type: "video" | "image" | "file";
135
134
  url: string;
136
- source?: "upload" | "youtube" | "external" | undefined;
135
+ type: "image" | "video" | "file";
137
136
  alt?: string | undefined;
138
137
  thumbnailUrl?: string | undefined;
138
+ source?: "upload" | "youtube" | "external" | undefined;
139
139
  youtubeId?: string | undefined;
140
140
  }, {
141
- type: "video" | "image" | "file";
142
141
  url: string;
143
- source?: "upload" | "youtube" | "external" | undefined;
142
+ type: "image" | "video" | "file";
144
143
  alt?: string | undefined;
145
144
  thumbnailUrl?: string | undefined;
145
+ source?: "upload" | "youtube" | "external" | undefined;
146
146
  youtubeId?: string | undefined;
147
147
  }>, "many">>>;
148
148
  winnerImages: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -153,18 +153,18 @@ export declare const eventItemSchema: z.ZodObject<{
153
153
  source: z.ZodOptional<z.ZodEnum<["upload", "youtube", "external"]>>;
154
154
  youtubeId: z.ZodOptional<z.ZodString>;
155
155
  }, "strip", z.ZodTypeAny, {
156
- type: "video" | "image" | "file";
157
156
  url: string;
158
- source?: "upload" | "youtube" | "external" | undefined;
157
+ type: "image" | "video" | "file";
159
158
  alt?: string | undefined;
160
159
  thumbnailUrl?: string | undefined;
160
+ source?: "upload" | "youtube" | "external" | undefined;
161
161
  youtubeId?: string | undefined;
162
162
  }, {
163
- type: "video" | "image" | "file";
164
163
  url: string;
165
- source?: "upload" | "youtube" | "external" | undefined;
164
+ type: "image" | "video" | "file";
166
165
  alt?: string | undefined;
167
166
  thumbnailUrl?: string | undefined;
167
+ source?: "upload" | "youtube" | "external" | undefined;
168
168
  youtubeId?: string | undefined;
169
169
  }>, "many">>>;
170
170
  additionalImages: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -175,18 +175,18 @@ export declare const eventItemSchema: z.ZodObject<{
175
175
  source: z.ZodOptional<z.ZodEnum<["upload", "youtube", "external"]>>;
176
176
  youtubeId: z.ZodOptional<z.ZodString>;
177
177
  }, "strip", z.ZodTypeAny, {
178
- type: "video" | "image" | "file";
179
178
  url: string;
180
- source?: "upload" | "youtube" | "external" | undefined;
179
+ type: "image" | "video" | "file";
181
180
  alt?: string | undefined;
182
181
  thumbnailUrl?: string | undefined;
182
+ source?: "upload" | "youtube" | "external" | undefined;
183
183
  youtubeId?: string | undefined;
184
184
  }, {
185
- type: "video" | "image" | "file";
186
185
  url: string;
187
- source?: "upload" | "youtube" | "external" | undefined;
186
+ type: "image" | "video" | "file";
188
187
  alt?: string | undefined;
189
188
  thumbnailUrl?: string | undefined;
189
+ source?: "upload" | "youtube" | "external" | undefined;
190
190
  youtubeId?: string | undefined;
191
191
  }>, "many">>>;
192
192
  saleConfig: z.ZodOptional<z.ZodObject<{
@@ -263,13 +263,13 @@ export declare const eventItemSchema: z.ZodObject<{
263
263
  createdAt: z.ZodString;
264
264
  updatedAt: z.ZodString;
265
265
  }, "strip", z.ZodTypeAny, {
266
- id: string;
267
- createdAt: string;
268
- updatedAt: string;
269
- status: "draft" | "ended" | "active" | "paused";
270
266
  type: "offer" | "feedback" | "sale" | "poll" | "survey";
267
+ status: "draft" | "ended" | "active" | "paused";
268
+ createdAt: string;
269
+ id: string;
271
270
  title: string;
272
271
  description: string;
272
+ updatedAt: string;
273
273
  stats: {
274
274
  totalEntries: number;
275
275
  approvedEntries: number;
@@ -277,11 +277,11 @@ export declare const eventItemSchema: z.ZodObject<{
277
277
  };
278
278
  createdBy: string;
279
279
  coverImage: {
280
- type: "video" | "image" | "file";
281
280
  url: string;
282
- source?: "upload" | "youtube" | "external" | undefined;
281
+ type: "image" | "video" | "file";
283
282
  alt?: string | undefined;
284
283
  thumbnailUrl?: string | undefined;
284
+ source?: "upload" | "youtube" | "external" | undefined;
285
285
  youtubeId?: string | undefined;
286
286
  } | {
287
287
  url: string;
@@ -290,27 +290,27 @@ export declare const eventItemSchema: z.ZodObject<{
290
290
  startsAt: string;
291
291
  endsAt: string;
292
292
  additionalImages: {
293
- type: "video" | "image" | "file";
294
293
  url: string;
295
- source?: "upload" | "youtube" | "external" | undefined;
294
+ type: "image" | "video" | "file";
296
295
  alt?: string | undefined;
297
296
  thumbnailUrl?: string | undefined;
297
+ source?: "upload" | "youtube" | "external" | undefined;
298
298
  youtubeId?: string | undefined;
299
299
  }[];
300
300
  eventImages: {
301
- type: "video" | "image" | "file";
302
301
  url: string;
303
- source?: "upload" | "youtube" | "external" | undefined;
302
+ type: "image" | "video" | "file";
304
303
  alt?: string | undefined;
305
304
  thumbnailUrl?: string | undefined;
305
+ source?: "upload" | "youtube" | "external" | undefined;
306
306
  youtubeId?: string | undefined;
307
307
  }[];
308
308
  winnerImages: {
309
- type: "video" | "image" | "file";
310
309
  url: string;
311
- source?: "upload" | "youtube" | "external" | undefined;
310
+ type: "image" | "video" | "file";
312
311
  alt?: string | undefined;
313
312
  thumbnailUrl?: string | undefined;
313
+ source?: "upload" | "youtube" | "external" | undefined;
314
314
  youtubeId?: string | undefined;
315
315
  }[];
316
316
  coverImageUrl?: string | undefined;
@@ -334,13 +334,13 @@ export declare const eventItemSchema: z.ZodObject<{
334
334
  resultsVisibility: "always" | "after_vote" | "after_end";
335
335
  } | undefined;
336
336
  }, {
337
- id: string;
338
- createdAt: string;
339
- updatedAt: string;
340
- status: "draft" | "ended" | "active" | "paused";
341
337
  type: "offer" | "feedback" | "sale" | "poll" | "survey";
338
+ status: "draft" | "ended" | "active" | "paused";
339
+ createdAt: string;
340
+ id: string;
342
341
  title: string;
343
342
  description: string;
343
+ updatedAt: string;
344
344
  stats: {
345
345
  totalEntries: number;
346
346
  approvedEntries: number;
@@ -350,36 +350,36 @@ export declare const eventItemSchema: z.ZodObject<{
350
350
  startsAt: string;
351
351
  endsAt: string;
352
352
  coverImage?: string | {
353
- type: "video" | "image" | "file";
354
353
  url: string;
355
- source?: "upload" | "youtube" | "external" | undefined;
354
+ type: "image" | "video" | "file";
356
355
  alt?: string | undefined;
357
356
  thumbnailUrl?: string | undefined;
357
+ source?: "upload" | "youtube" | "external" | undefined;
358
358
  youtubeId?: string | undefined;
359
359
  } | null | undefined;
360
360
  additionalImages?: {
361
- type: "video" | "image" | "file";
362
361
  url: string;
363
- source?: "upload" | "youtube" | "external" | undefined;
362
+ type: "image" | "video" | "file";
364
363
  alt?: string | undefined;
365
364
  thumbnailUrl?: string | undefined;
365
+ source?: "upload" | "youtube" | "external" | undefined;
366
366
  youtubeId?: string | undefined;
367
367
  }[] | undefined;
368
368
  coverImageUrl?: string | undefined;
369
369
  eventImages?: {
370
- type: "video" | "image" | "file";
371
370
  url: string;
372
- source?: "upload" | "youtube" | "external" | undefined;
371
+ type: "image" | "video" | "file";
373
372
  alt?: string | undefined;
374
373
  thumbnailUrl?: string | undefined;
374
+ source?: "upload" | "youtube" | "external" | undefined;
375
375
  youtubeId?: string | undefined;
376
376
  }[] | undefined;
377
377
  winnerImages?: {
378
- type: "video" | "image" | "file";
379
378
  url: string;
380
- source?: "upload" | "youtube" | "external" | undefined;
379
+ type: "image" | "video" | "file";
381
380
  alt?: string | undefined;
382
381
  thumbnailUrl?: string | undefined;
382
+ source?: "upload" | "youtube" | "external" | undefined;
383
383
  youtubeId?: string | undefined;
384
384
  }[] | undefined;
385
385
  saleConfig?: {
@@ -411,17 +411,17 @@ export declare const eventListParamsSchema: z.ZodObject<{
411
411
  perPage: z.ZodOptional<z.ZodNumber>;
412
412
  sort: z.ZodOptional<z.ZodString>;
413
413
  }, "strip", z.ZodTypeAny, {
414
- sort?: string | undefined;
415
- perPage?: number | undefined;
416
- status?: "draft" | "ended" | "active" | "paused" | undefined;
417
414
  type?: "offer" | "feedback" | "sale" | "poll" | "survey" | undefined;
415
+ status?: "draft" | "ended" | "active" | "paused" | undefined;
416
+ sort?: string | undefined;
418
417
  q?: string | undefined;
419
418
  page?: number | undefined;
420
- }, {
421
- sort?: string | undefined;
422
419
  perPage?: number | undefined;
423
- status?: "draft" | "ended" | "active" | "paused" | undefined;
420
+ }, {
424
421
  type?: "offer" | "feedback" | "sale" | "poll" | "survey" | undefined;
422
+ status?: "draft" | "ended" | "active" | "paused" | undefined;
423
+ sort?: string | undefined;
425
424
  q?: string | undefined;
426
425
  page?: number | undefined;
426
+ perPage?: number | undefined;
427
427
  }>;
@@ -39,8 +39,8 @@ export declare const faqCreateSchema: z.ZodEffects<z.ZodObject<{
39
39
  };
40
40
  isPinned: boolean;
41
41
  useSiteSettings: boolean;
42
- template?: string | undefined;
43
42
  tags?: string[] | undefined;
43
+ template?: string | undefined;
44
44
  variables?: Record<string, string> | undefined;
45
45
  relatedFAQs?: string[] | undefined;
46
46
  }, {
@@ -50,8 +50,8 @@ export declare const faqCreateSchema: z.ZodEffects<z.ZodObject<{
50
50
  text: string;
51
51
  format?: "html" | "plain" | "markdown" | undefined;
52
52
  };
53
- template?: string | undefined;
54
53
  tags?: string[] | undefined;
54
+ template?: string | undefined;
55
55
  order?: number | undefined;
56
56
  priority?: number | undefined;
57
57
  isActive?: boolean | undefined;
@@ -75,8 +75,8 @@ export declare const faqCreateSchema: z.ZodEffects<z.ZodObject<{
75
75
  };
76
76
  isPinned: boolean;
77
77
  useSiteSettings: boolean;
78
- template?: string | undefined;
79
78
  tags?: string[] | undefined;
79
+ template?: string | undefined;
80
80
  variables?: Record<string, string> | undefined;
81
81
  relatedFAQs?: string[] | undefined;
82
82
  }, {
@@ -86,8 +86,8 @@ export declare const faqCreateSchema: z.ZodEffects<z.ZodObject<{
86
86
  text: string;
87
87
  format?: "html" | "plain" | "markdown" | undefined;
88
88
  };
89
- template?: string | undefined;
90
89
  tags?: string[] | undefined;
90
+ template?: string | undefined;
91
91
  order?: number | undefined;
92
92
  priority?: number | undefined;
93
93
  isActive?: boolean | undefined;
@@ -123,9 +123,9 @@ export declare const faqUpdateSchema: z.ZodObject<{
123
123
  variables: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
124
124
  template: z.ZodOptional<z.ZodOptional<z.ZodString>>;
125
125
  }, "strip", z.ZodTypeAny, {
126
- template?: string | undefined;
127
126
  category?: string | undefined;
128
127
  tags?: string[] | undefined;
128
+ template?: string | undefined;
129
129
  order?: number | undefined;
130
130
  priority?: number | undefined;
131
131
  isActive?: boolean | undefined;
@@ -141,9 +141,9 @@ export declare const faqUpdateSchema: z.ZodObject<{
141
141
  relatedFAQs?: string[] | undefined;
142
142
  useSiteSettings?: boolean | undefined;
143
143
  }, {
144
- template?: string | undefined;
145
144
  category?: string | undefined;
146
145
  tags?: string[] | undefined;
146
+ template?: string | undefined;
147
147
  order?: number | undefined;
148
148
  priority?: number | undefined;
149
149
  isActive?: boolean | undefined;
@@ -82,16 +82,16 @@ export declare const faqSchema: z.ZodObject<{
82
82
  createdAt: z.ZodOptional<z.ZodString>;
83
83
  updatedAt: z.ZodOptional<z.ZodString>;
84
84
  }, "strip", z.ZodTypeAny, {
85
- id: string;
86
85
  category: "orders_payment" | "shipping_delivery" | "returns_refunds" | "product_information" | "account_security" | "technical_support" | "general";
86
+ id: string;
87
87
  question: string;
88
88
  answer: {
89
89
  text: string;
90
90
  format: "html" | "plain" | "markdown";
91
91
  };
92
92
  createdAt?: string | undefined;
93
- updatedAt?: string | undefined;
94
93
  tags?: string[] | undefined;
94
+ updatedAt?: string | undefined;
95
95
  order?: number | undefined;
96
96
  priority?: number | undefined;
97
97
  stats?: {
@@ -108,16 +108,16 @@ export declare const faqSchema: z.ZodObject<{
108
108
  isPinned?: boolean | undefined;
109
109
  relatedFAQs?: string[] | undefined;
110
110
  }, {
111
- id: string;
112
111
  category: "orders_payment" | "shipping_delivery" | "returns_refunds" | "product_information" | "account_security" | "technical_support" | "general";
112
+ id: string;
113
113
  question: string;
114
114
  answer: {
115
115
  text: string;
116
116
  format: "html" | "plain" | "markdown";
117
117
  };
118
118
  createdAt?: string | undefined;
119
- updatedAt?: string | undefined;
120
119
  tags?: string[] | undefined;
120
+ updatedAt?: string | undefined;
121
121
  order?: number | undefined;
122
122
  priority?: number | undefined;
123
123
  stats?: {
@@ -142,16 +142,16 @@ export declare const faqListParamsSchema: z.ZodObject<{
142
142
  page: z.ZodOptional<z.ZodNumber>;
143
143
  perPage: z.ZodOptional<z.ZodNumber>;
144
144
  }, "strip", z.ZodTypeAny, {
145
- perPage?: number | undefined;
146
- q?: string | undefined;
147
145
  category?: "orders_payment" | "shipping_delivery" | "returns_refunds" | "product_information" | "account_security" | "technical_support" | "general" | undefined;
146
+ q?: string | undefined;
148
147
  page?: number | undefined;
148
+ perPage?: number | undefined;
149
149
  homepage?: boolean | undefined;
150
150
  }, {
151
- perPage?: number | undefined;
152
- q?: string | undefined;
153
151
  category?: "orders_payment" | "shipping_delivery" | "returns_refunds" | "product_information" | "account_security" | "technical_support" | "general" | undefined;
152
+ q?: string | undefined;
154
153
  page?: number | undefined;
154
+ perPage?: number | undefined;
155
155
  homepage?: boolean | undefined;
156
156
  }>;
157
157
  export * from "./firestore";
@@ -7,14 +7,14 @@ export declare const createSectionSchema: z.ZodObject<{
7
7
  order: z.ZodDefault<z.ZodNumber>;
8
8
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
9
9
  }, "strip", z.ZodTypeAny, {
10
- enabled: boolean;
11
10
  type: string;
12
11
  order: number;
12
+ enabled: boolean;
13
13
  config?: Record<string, unknown> | undefined;
14
14
  }, {
15
15
  type: string;
16
- enabled?: boolean | undefined;
17
16
  order?: number | undefined;
17
+ enabled?: boolean | undefined;
18
18
  config?: Record<string, unknown> | undefined;
19
19
  }>;
20
20
  export declare const updateSectionSchema: z.ZodObject<{
@@ -22,12 +22,12 @@ export declare const updateSectionSchema: z.ZodObject<{
22
22
  enabled: z.ZodOptional<z.ZodBoolean>;
23
23
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
24
24
  }, "strip", z.ZodTypeAny, {
25
- enabled?: boolean | undefined;
26
25
  order?: number | undefined;
26
+ enabled?: boolean | undefined;
27
27
  config?: Record<string, unknown> | undefined;
28
28
  }, {
29
- enabled?: boolean | undefined;
30
29
  order?: number | undefined;
30
+ enabled?: boolean | undefined;
31
31
  config?: Record<string, unknown> | undefined;
32
32
  }>;
33
33
  export type CreateHomepageSectionInput = z.infer<typeof createSectionSchema>;
@@ -147,5 +147,5 @@ export function AppLayoutShell({ children, navItems, sidebarItems = [], sidebarS
147
147
  opacity: darkBackground.overlay?.opacity ?? 0,
148
148
  },
149
149
  };
150
- return (_jsx(QueryClientProvider, { client: queryClient, children: _jsxs(Div, { className: "flex min-h-screen w-full flex-col overflow-x-clip transition-colors duration-300", children: [_jsx(BackgroundRenderer, { mode: theme === "dark" ? "dark" : "light", lightMode: normalizedLightBackground, darkMode: normalizedDarkBackground }), _jsxs(Div, { ref: headerRef, className: "sticky top-0 z-50 w-full", children: [_jsx(TitleBar, { onToggleSidebar: handleTogglePublicSidebar, sidebarOpen: sidebarOpen, onSearchToggle: () => setSearchOpen((prev) => !prev), searchOpen: searchOpen, brandName: brandName, brandShortName: brandShortName, siteLogoUrl: siteLogoUrl, logoHref: logoHref, promotionsHref: promotionsHref, cartHref: cartHref, wishlistHref: wishlistHref, userId: userId, profileHref: profileHref, loginHref: loginHref, registerHref: registerHref, user: user, navSlot: titleBarNavSlot, notificationSlot: titleBarNotificationSlot, devSlot: titleBarDevSlot, promoStripText: titleBarPromoStripText, isDark: theme === "dark", onToggleTheme: showThemeToggle ? toggleTheme : undefined, onBeforeToggleDashboardNav: handleBeforeDashboardNavToggle, suppressDashboardNav: suppressDashboardNav, hideSidebarToggle: hideSidebarToggle }), _jsx(NavbarWithSettings, { navItems: navItems, hiddenNavItems: hiddenNavItems, permissions: authUser?.permissions }), searchOpen && (searchSlotRenderer ? searchSlotRenderer(() => setSearchOpen(false)) : searchSlot)] }), eventBannerSlot, _jsx(AutoBreadcrumbs, {}), _jsxs(Div, { className: "relative flex w-full flex-1 overflow-x-clip", children: [_jsx(SidebarLayout, { isOpen: sidebarOpen, ariaLabel: "Secondary navigation", header: user ? (_jsx(SidebarUserHeader, { user: user, onClose: () => setSidebarOpen(false) })) : (_jsx(SidebarGuestHeader, { sidebarTitle: sidebarTitle, onClose: () => setSidebarOpen(false) })), onClose: () => setSidebarOpen(false), children: sidebarContent }), _jsx(Main, { id: "main-content", className: `w-full flex-1 ${hasBottomActions ? "mb-28" : "mb-16"} md:mb-0`, children: _jsx(Div, { className: contentClassName ?? "w-full px-4 py-6 md:px-6 lg:px-8", children: children }) })] }), _jsx(BackToTop, {}), _jsx(FooterLayout, { ...footer }), _jsx(BottomActions, {}), _jsx(BottomNavbar, { user: user, homeHref: homeHref, shopHref: shopHref, cartHref: cartHref, profileHref: profileHref, loginHref: loginHref, onSearchToggle: () => setSearchOpen((prev) => !prev), navItems: navItems, onMoreToggle: hasDashboardNav ? toggleDashboardNav : handleTogglePublicSidebar }), _jsx(UnsavedChangesModal, {})] }) }));
150
+ return (_jsx(QueryClientProvider, { client: queryClient, children: _jsxs(Div, { className: "flex min-h-screen w-full flex-col overflow-x-clip transition-colors duration-300", children: [_jsx(BackgroundRenderer, { mode: theme === "dark" ? "dark" : "light", lightMode: normalizedLightBackground, darkMode: normalizedDarkBackground }), _jsxs(Div, { ref: headerRef, className: "sticky top-0 z-50 w-full", children: [_jsx(TitleBar, { onToggleSidebar: handleTogglePublicSidebar, sidebarOpen: sidebarOpen, onSearchToggle: () => setSearchOpen((prev) => !prev), searchOpen: searchOpen, brandName: brandName, brandShortName: brandShortName, siteLogoUrl: siteLogoUrl, logoHref: logoHref, promotionsHref: promotionsHref, cartHref: cartHref, wishlistHref: wishlistHref, userId: userId, profileHref: profileHref, loginHref: loginHref, registerHref: registerHref, user: user, navSlot: titleBarNavSlot, notificationSlot: titleBarNotificationSlot, devSlot: titleBarDevSlot, promoStripText: titleBarPromoStripText, isDark: theme === "dark", onToggleTheme: showThemeToggle ? toggleTheme : undefined, onBeforeToggleDashboardNav: handleBeforeDashboardNavToggle, suppressDashboardNav: suppressDashboardNav, hideSidebarToggle: hideSidebarToggle }), _jsx(NavbarWithSettings, { navItems: navItems, hiddenNavItems: hiddenNavItems, permissions: authUser?.permissions }), searchOpen && (searchSlotRenderer ? searchSlotRenderer(() => setSearchOpen(false)) : searchSlot)] }), eventBannerSlot, _jsx(AutoBreadcrumbs, {}), _jsxs(Div, { className: "relative flex w-full flex-1 overflow-x-clip", children: [_jsx(SidebarLayout, { isOpen: sidebarOpen, ariaLabel: "Secondary navigation", header: user ? (_jsx(SidebarUserHeader, { user: user, onClose: () => setSidebarOpen(false) })) : (_jsx(SidebarGuestHeader, { sidebarTitle: sidebarTitle, onClose: () => setSidebarOpen(false) })), onClose: () => setSidebarOpen(false), children: sidebarContent }), _jsx(Main, { id: "main-content", className: `w-full flex-1 ${hasBottomActions ? "mb-28" : "mb-16"} md:mb-0`, children: _jsx(Div, { className: contentClassName ?? "w-full px-5 py-6 md:px-6 lg:px-8", children: children }) })] }), _jsx(BackToTop, {}), _jsx(FooterLayout, { ...footer }), _jsx(BottomActions, {}), _jsx(BottomNavbar, { user: user, homeHref: homeHref, shopHref: shopHref, cartHref: cartHref, profileHref: profileHref, loginHref: loginHref, onSearchToggle: () => setSearchOpen((prev) => !prev), navItems: navItems, onMoreToggle: hasDashboardNav ? toggleDashboardNav : handleTogglePublicSidebar }), _jsx(UnsavedChangesModal, {})] }) }));
151
151
  }
@@ -77,7 +77,7 @@ export function AutoBreadcrumbs({ pathLabels, separator = "/", className = "", r
77
77
  href: `${localePrefix}/${segments.slice(0, i + 1).join("/")}`,
78
78
  }));
79
79
  const allCrumbs = [{ label: "Home", href: localePrefix || "/" }, ...crumbs];
80
- return (_jsx(Div, { className: "border-y border-zinc-200/80 bg-white/95 backdrop-blur supports-[backdrop-filter]:bg-white/90 dark:border-slate-800 dark:bg-slate-950/95 dark:supports-[backdrop-filter]:bg-slate-950/85", children: _jsx(Div, { className: "container mx-auto max-w-[1920px] px-4 py-2 sm:px-6 lg:px-8", children: _jsx(Nav, { "aria-label": "Breadcrumb", className: className, children: _jsx(Ol, { className: "flex items-center gap-2 text-sm flex-wrap", children: allCrumbs.map((crumb, index) => {
80
+ return (_jsx(Div, { className: "border-y border-zinc-200/80 bg-white/95 backdrop-blur supports-[backdrop-filter]:bg-white/90 dark:border-slate-800 dark:bg-slate-950/95 dark:supports-[backdrop-filter]:bg-slate-950/85", children: _jsx(Div, { className: "container mx-auto max-w-[1920px] px-5 py-2 sm:px-6 lg:px-8", children: _jsx(Nav, { "aria-label": "Breadcrumb", className: className, children: _jsx(Ol, { className: "flex items-center gap-2 text-sm flex-wrap", children: allCrumbs.map((crumb, index) => {
81
81
  const isLast = index === allCrumbs.length - 1;
82
82
  return (_jsxs(Li, { className: "flex items-center gap-2", children: [isLast ? (_jsx(Span, { "aria-current": "page", className: "text-zinc-700 dark:text-zinc-200", children: crumb.label })) : renderLink ? (renderLink(crumb.href, crumb.label)) : (_jsx(Link, { href: crumb.href, className: "text-zinc-700 dark:text-zinc-300 hover:text-zinc-950 dark:hover:text-white transition-colors", children: crumb.label })), !isLast && (_jsx(Span, { className: "text-zinc-500 dark:text-zinc-400/90 select-none", "aria-hidden": "true", children: separator }))] }, crumb.href));
83
83
  }) }) }) }) }));
@@ -106,6 +106,6 @@ export function AvatarUpload({ currentPhotoURL, currentCropData, userId, display
106
106
  fileInputRef.current.value = "";
107
107
  };
108
108
  const hasPending = pendingCropData !== null && pendingUploadFile !== null;
109
- return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "space-y-4", "data-section": "avatarupload-div-404", children: [_jsxs("div", { className: "flex items-start gap-6", "data-section": "avatarupload-div-405", children: [_jsx("div", { className: "shrink-0", "data-section": "avatarupload-div-406", children: _jsx(AvatarDisplay, { cropData: hasPending ? pendingCropData : cropData, size: "2xl", className: `border-4 ${hasPending ? "border-primary/60 ring-2 ring-primary/20" : "border-zinc-200 dark:border-slate-700"}`, displayName: displayName }) }), _jsxs("div", { className: "flex-1 space-y-3", "data-section": "avatarupload-div-407", children: [_jsx(Text, { variant: "secondary", className: "text-xs", children: "JPG, PNG, WEBP or GIF up to 10MB." }), isUploading ? (_jsx(Progress, { value: 50, variant: "primary", size: "sm", label: t.uploading })) : null, hasPending && !isUploading ? (_jsxs("div", { className: "space-y-2", "data-section": "avatarupload-div-408", children: [_jsx(Text, { variant: "secondary", className: "text-xs text-primary", children: t.readyToSave }), _jsxs("div", { className: "flex gap-3", "data-section": "avatarupload-div-409", children: [_jsx(Button, { type: "button", onClick: handleConfirmSave, size: "sm", children: t.saveAvatar }), _jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: handleCancelPending, children: t.cancelChange })] })] })) : null, !hasPending && !isUploading ? (_jsxs("div", { className: "flex gap-3", "data-section": "avatarupload-div-410", children: [_jsx(Button, { type: "button", onClick: () => fileInputRef.current?.click(), size: "sm", children: previewUrl ? t.changePhoto : t.chooseImage }), previewUrl ? (_jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: handleRemovePhoto, children: t.removePhoto })) : null] })) : null, _jsx(Input, { ref: fileInputRef, bare: true, type: "file", accept: "image/jpeg,image/png,image/webp,image/gif", onChange: handleFileSelect, className: "hidden", "aria-label": t.changePhoto })] })] }), uploadApiError ? (_jsx(Alert, { variant: "error", children: uploadApiError.message })) : null] }), showCropModal && tempImageUrl ? (_jsx(ImageCropModal, { isOpen: showCropModal, imageUrl: tempImageUrl, onClose: handleCropCancel, onSave: handleCropSave, initialCropData: cropData || undefined })) : null] }));
109
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "space-y-4", "data-section": "avatarupload-div-404", children: [_jsxs("div", { className: "flex items-start gap-6", "data-section": "avatarupload-div-405", children: [_jsx("div", { className: "shrink-0", "data-section": "avatarupload-div-406", children: _jsx(AvatarDisplay, { cropData: hasPending ? pendingCropData : cropData, size: "2xl", className: `border-4 ${hasPending ? "border-primary/60 ring-2 ring-primary/20" : "border-zinc-200 dark:border-slate-700"}`, displayName: displayName }) }), _jsxs("div", { className: "flex-1 space-y-3", "data-section": "avatarupload-div-407", children: [_jsx(Text, { variant: "secondary", className: "text-xs", children: "JPG, PNG, WEBP or GIF up to 10MB." }), isUploading ? (_jsx(Progress, { value: 50, variant: "primary", size: "sm", label: t.uploading })) : null, hasPending && !isUploading ? (_jsxs("div", { className: "space-y-2", "data-section": "avatarupload-div-408", children: [_jsx(Text, { variant: "secondary", className: "text-xs text-primary", children: t.readyToSave }), _jsxs("div", { className: "flex gap-3", "data-section": "avatarupload-div-409", children: [_jsx(Button, { type: "button", onClick: handleConfirmSave, size: "sm", children: t.saveAvatar }), _jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: handleCancelPending, children: t.cancelChange })] })] })) : null, !hasPending && !isUploading ? (_jsxs("div", { className: "flex gap-3", "data-section": "avatarupload-div-410", children: [_jsx(Button, { type: "button", onClick: () => fileInputRef.current?.click(), size: "sm", children: previewUrl ? t.changePhoto : t.chooseImage }), previewUrl ? (_jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: handleRemovePhoto, children: t.removePhoto })) : null] })) : null, _jsx(Input, { ref: fileInputRef, bare: true, type: "file", accept: "image/*", onChange: handleFileSelect, className: "hidden", "aria-label": t.changePhoto })] })] }), uploadApiError ? (_jsx(Alert, { variant: "error", children: uploadApiError.message })) : null] }), showCropModal && tempImageUrl ? (_jsx(ImageCropModal, { isOpen: showCropModal, imageUrl: tempImageUrl, onClose: handleCropCancel, onSave: handleCropSave, initialCropData: cropData || undefined })) : null] }));
110
110
  }
111
111
  export default AvatarUpload;
@@ -21,18 +21,18 @@ export declare const mediaFieldSchema: z.ZodObject<{
21
21
  source: z.ZodOptional<z.ZodEnum<["upload", "youtube", "external"]>>;
22
22
  youtubeId: z.ZodOptional<z.ZodString>;
23
23
  }, "strip", z.ZodTypeAny, {
24
- type: "video" | "image" | "file";
25
24
  url: string;
26
- source?: "upload" | "youtube" | "external" | undefined;
25
+ type: "image" | "video" | "file";
27
26
  alt?: string | undefined;
28
27
  thumbnailUrl?: string | undefined;
28
+ source?: "upload" | "youtube" | "external" | undefined;
29
29
  youtubeId?: string | undefined;
30
30
  }, {
31
- type: "video" | "image" | "file";
32
31
  url: string;
33
- source?: "upload" | "youtube" | "external" | undefined;
32
+ type: "image" | "video" | "file";
34
33
  alt?: string | undefined;
35
34
  thumbnailUrl?: string | undefined;
35
+ source?: "upload" | "youtube" | "external" | undefined;
36
36
  youtubeId?: string | undefined;
37
37
  }>;
38
38
  export declare function coerceMediaField(value: MediaFieldInput, fallbackType?: MediaFieldType): MediaField | null;
@@ -10,7 +10,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
10
10
  import { useState, useRef } from "react";
11
11
  import { useTranslations } from "next-intl";
12
12
  import { useCamera } from "../../../react";
13
- import { Alert, Button, Div, Label, Progress, Row, Span, Spinner, Text, } from "../../../ui";
13
+ import { Alert, Button, Div, Label, Progress, Row, Spinner, Text, } from "../../../ui";
14
14
  import { MediaImage } from "../MediaImage";
15
15
  import { ImageCropModal } from "../modals/ImageCropModal";
16
16
  import CameraCapture from "./CameraCapture";
@@ -19,7 +19,18 @@ function formatFileSize(bytes) {
19
19
  return `${(bytes / 1024).toFixed(1)}KB`;
20
20
  return `${(bytes / (1024 * 1024)).toFixed(2)}MB`;
21
21
  }
22
- export function ImageUpload({ currentImage, onUpload, onChange, accept = "image/jpeg,image/png,image/gif,image/webp", maxSizeMB = 10, label = "Upload Image", helperText, captureSource = "both", enableCrop = true, onCropDataChange, }) {
22
+ function matchesMimeAccept(fileType, accept) {
23
+ return accept.split(",").map((a) => a.trim()).some((pattern) => {
24
+ if (pattern === "*" || pattern === "*/*")
25
+ return true;
26
+ const [pType, pSub] = pattern.split("/");
27
+ const [fType, fSub] = fileType.split("/");
28
+ if (pType !== fType)
29
+ return false;
30
+ return pSub === "*" || pSub === fSub;
31
+ });
32
+ }
33
+ export function ImageUpload({ currentImage, onUpload, onChange, accept = "image/*", maxSizeMB = 10, label = "Upload Image", helperText, captureSource = "both", enableCrop = true, onCropDataChange, }) {
23
34
  const [uploading, setUploading] = useState(false);
24
35
  const [preview, setPreview] = useState(currentImage || "");
25
36
  const [error, setError] = useState("");
@@ -110,8 +121,7 @@ export function ImageUpload({ currentImage, onUpload, onChange, accept = "image/
110
121
  setError(`File size must be less than ${maxSizeMB}MB (current: ${formatFileSize(file.size)})`);
111
122
  return;
112
123
  }
113
- const acceptedTypes = accept.split(",").map((t) => t.trim());
114
- if (!acceptedTypes.includes(file.type)) {
124
+ if (!matchesMimeAccept(file.type, accept)) {
115
125
  setError(`Invalid file type. Accepted: ${accept}`);
116
126
  return;
117
127
  }
@@ -124,11 +134,10 @@ export function ImageUpload({ currentImage, onUpload, onChange, accept = "image/
124
134
  fileInputRef.current.value = "";
125
135
  onChange?.("");
126
136
  };
127
- return (_jsxs(Div, { className: "space-y-3", children: [label && (_jsx(Label, { className: "block text-sm font-medium text-zinc-600 dark:text-zinc-400", children: label })), _jsx(Div, { className: "relative", children: preview ? (_jsxs(Div, { className: "space-y-2", children: [_jsxs(Div, { className: "relative aspect-[16/9] overflow-hidden rounded-xl border-2 border-zinc-200 dark:border-zinc-700", children: [_jsx(MediaImage, { src: preview, alt: "Preview", size: "card" }), uploading && progress > 0 && (_jsx(Div, { className: "absolute inset-x-0 bottom-0", children: _jsx(Progress, { value: progress, size: "sm" }) }))] }), !uploading && (_jsxs(Row, { wrap: true, gap: "sm", children: [enableCrop && (_jsx(Button, { type: "button", onClick: () => {
137
+ return (_jsxs(Div, { className: "space-y-3", children: [label && (_jsx(Label, { className: "block text-sm font-medium text-zinc-600 dark:text-zinc-400", children: label })), _jsx(Div, { className: "relative", children: preview ? (_jsxs(Div, { className: "space-y-2", children: [_jsxs(Div, { className: "relative h-32 max-w-xs mx-auto overflow-hidden rounded-lg border border-zinc-200 dark:border-zinc-700", children: [_jsx(MediaImage, { src: preview, alt: "Preview", size: "card" }), uploading && progress > 0 && (_jsx(Div, { className: "absolute inset-x-0 bottom-0", children: _jsx(Progress, { value: progress, size: "sm" }) }))] }), !uploading && (_jsxs(Row, { wrap: true, gap: "sm", children: [enableCrop && (_jsx(Button, { type: "button", onClick: () => {
128
138
  setCropPreviewUrl(preview);
129
139
  setShowCropModal(true);
130
- }, variant: "secondary", size: "sm", children: tMediaEditor("editImage") })), _jsx(Button, { type: "button", onClick: () => fileInputRef.current?.click(), variant: "outline", size: "sm", children: tUpload("change") }), _jsx(Button, { type: "button", onClick: handleRemove, variant: "danger", size: "sm", children: tUpload("remove") })] }))] })) : (_jsxs(_Fragment, { children: [captureSource === "both" && isCameraSupported && (_jsxs(Row, { justify: "center", className: "gap-2 mb-3", children: [_jsx(Button, { type: "button", variant: captureMode === "file" ? "primary" : "outline", size: "sm", onClick: () => setCaptureMode("file"), children: t("switchToUpload") }), _jsx(Button, { type: "button", variant: captureMode === "camera" ? "primary" : "outline", size: "sm", onClick: () => setCaptureMode("camera"), children: t("switchToCamera") })] })), showCamera && isCameraSupported && (_jsx(CameraCapture, { mode: "photo", facingMode: "environment", onCapture: handleCameraCapture, onError: setError })), showCamera && !isCameraSupported && (_jsx(Button, { type: "button", onClick: () => mobileCaptureRef.current?.click(), disabled: uploading, variant: "ghost", className: "w-full aspect-[16/9] border-2 border-dashed border-zinc-200 dark:border-zinc-700 rounded-xl flex items-center justify-center flex-col text-zinc-500 dark:text-zinc-400", children: _jsx(Span, { className: "text-sm font-medium", children: t("switchToCamera") }) })), showFileInput && (_jsxs(Button, { type: "button", onClick: () => fileInputRef.current?.click(), disabled: uploading, variant: "ghost", className: "w-full aspect-[16/9] border-2 border-dashed border-zinc-200 dark:border-zinc-700 rounded-xl flex items-center justify-center flex-col text-zinc-500 dark:text-zinc-400", children: [_jsx("svg", { className: "w-12 h-12 mb-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", "aria-hidden": "true", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), _jsx(Span, { className: "text-sm font-medium", children: uploading ? tUpload("uploading") : tUpload("clickToUpload") }), _jsxs(Span, { className: "text-xs mt-1", children: [accept
131
- .split(",")
132
- .map((t) => t.split("/")[1]?.toUpperCase() ?? t)
133
- .join(", "), " ", "(max ", maxSizeMB, "MB)"] })] }))] })) }), _jsx("input", { ref: fileInputRef, type: "file", accept: accept, onChange: handleFileChange, className: "hidden", "aria-hidden": "true", "data-testid": "media-upload-input" }), showCamera && !isCameraSupported && (_jsx("input", { ref: mobileCaptureRef, type: "file", accept: "image/*", capture: "environment", onChange: handleFileChange, className: "hidden", "aria-hidden": "true", "data-testid": "media-upload-capture-input" })), helperText && !error && (_jsx(Text, { variant: "secondary", size: "xs", children: helperText })), error && _jsx(Alert, { variant: "error", children: error }), uploading && (_jsxs(Row, { className: "gap-2", children: [_jsx(Spinner, { size: "sm" }), _jsx(Text, { size: "sm", variant: "secondary", children: tUpload("uploadingProgress", { progress }) })] })), cropPreviewUrl && (_jsx(ImageCropModal, { isOpen: showCropModal, imageUrl: cropPreviewUrl, onClose: handleCropClose, onSave: handleCropSave }))] }));
140
+ }, variant: "secondary", size: "sm", children: tMediaEditor("editImage") })), _jsx(Button, { type: "button", onClick: () => fileInputRef.current?.click(), variant: "outline", size: "sm", children: tUpload("change") }), _jsx(Button, { type: "button", onClick: handleRemove, variant: "danger", size: "sm", children: tUpload("remove") })] }))] })) : (_jsxs(_Fragment, { children: [showCamera && isCameraSupported && (_jsx(CameraCapture, { mode: "photo", facingMode: "environment", onCapture: handleCameraCapture, onError: setError })), !showCamera && (_jsxs(Div, { className: "space-y-2", children: [_jsxs(Row, { gap: "sm", className: "flex-wrap", children: [showFileInput && (_jsx(Button, { type: "button", onClick: () => fileInputRef.current?.click(), disabled: uploading, variant: "outline", size: "sm", children: uploading ? tUpload("uploading") : tUpload("clickToUpload") })), captureSource !== "file-only" && isCameraSupported && (_jsx(Button, { type: "button", onClick: () => setCaptureMode("camera"), disabled: uploading, variant: "ghost", size: "sm", children: t("switchToCamera") })), captureSource !== "file-only" && !isCameraSupported && (_jsx(Button, { type: "button", onClick: () => mobileCaptureRef.current?.click(), disabled: uploading, variant: "ghost", size: "sm", children: t("switchToCamera") }))] }), _jsxs(Text, { size: "xs", variant: "secondary", children: [accept === "image/*"
141
+ ? `JPG PNG GIF WebP`
142
+ : accept.split(",").map((a) => a.split("/")[1]?.toUpperCase() ?? a).join(" "), " ", "\u2014 max ", maxSizeMB, "MB"] })] }))] })) }), _jsx("input", { ref: fileInputRef, type: "file", accept: accept, onChange: handleFileChange, className: "hidden", "aria-hidden": "true", "data-testid": "media-upload-input" }), showCamera && !isCameraSupported && (_jsx("input", { ref: mobileCaptureRef, type: "file", accept: "image/*", capture: "environment", onChange: handleFileChange, className: "hidden", "aria-hidden": "true", "data-testid": "media-upload-capture-input" })), helperText && !error && (_jsx(Text, { variant: "secondary", size: "xs", children: helperText })), error && _jsx(Alert, { variant: "error", children: error }), uploading && (_jsxs(Row, { className: "gap-2", children: [_jsx(Spinner, { size: "sm" }), _jsx(Text, { size: "sm", variant: "secondary", children: tUpload("uploadingProgress", { progress }) })] })), cropPreviewUrl && (_jsx(ImageCropModal, { isOpen: showCropModal, imageUrl: cropPreviewUrl, onClose: handleCropClose, onSave: handleCropSave }))] }));
134
143
  }
@@ -14,7 +14,7 @@ function fileNameFromUrl(url) {
14
14
  return url;
15
15
  }
16
16
  }
17
- export function MediaUploadList({ label, value, onChange, onUpload, accept = "image/*,video/*", maxSizeMB = 50, maxItems = 12, disabled = false, helperText, onAbort, onStagedUrlsChange, isPersisted = false, }) {
17
+ export function MediaUploadList({ label, value, onChange, onUpload, accept = "image/*,video/*,application/pdf", maxSizeMB = 50, maxItems = 12, disabled = false, helperText, onAbort, onStagedUrlsChange, isPersisted = false, }) {
18
18
  const inputRef = useRef(null);
19
19
  const [isLoading, setIsLoading] = useState(false);
20
20
  const [error, setError] = useState(null);
@@ -100,5 +100,5 @@ export function MediaUploadList({ label, value, onChange, onUpload, accept = "im
100
100
  unstageUrl(target.url);
101
101
  }
102
102
  };
103
- return (_jsxs(Div, { className: "space-y-2", children: [_jsx(Label, { className: "block text-sm font-medium text-zinc-600 dark:text-zinc-400", children: label }), value.length > 0 && (_jsx(Div, { className: "grid grid-cols-1 sm:grid-cols-2 gap-3", children: value.map((item, index) => (_jsxs(Div, { className: "rounded-lg border border-zinc-200 dark:border-zinc-700 bg-zinc-50 dark:bg-zinc-900 p-3", children: [item.type === "video" ? (_jsx(Div, { className: "relative aspect-video overflow-hidden rounded-lg", children: _jsx(MediaVideo, { src: item.url, alt: item.alt || `Media ${index + 1}`, controls: true }) })) : item.type === "image" ? (_jsx(Div, { className: "relative aspect-video overflow-hidden rounded-lg", children: _jsx(MediaImage, { src: item.url, alt: item.alt || `Media ${index + 1}`, size: "card", objectFit: "contain" }) })) : (_jsx("a", { href: item.url, target: "_blank", rel: "noopener noreferrer", className: "text-sm underline break-all text-blue-600 dark:text-blue-400", children: fileNameFromUrl(item.url) })), !disabled && (_jsx(Div, { className: "mt-2", children: _jsx(Button, { type: "button", size: "sm", variant: "danger", onClick: () => removeAt(index), children: "Remove" }) }))] }, `${item.url}-${index}`))) })), !disabled && value.length < maxItems && (_jsx(Button, { type: "button", variant: "ghost", className: "w-full py-3 border-2 border-dashed border-zinc-200 dark:border-zinc-700 rounded-xl text-sm text-zinc-500 dark:text-zinc-400", onClick: () => inputRef.current?.click(), disabled: isLoading, children: isLoading ? "Uploading..." : "Add media" })), isLoading && (_jsxs(Div, { className: "flex items-center gap-2", children: [_jsx(Spinner, { size: "sm" }), _jsx(Text, { size: "sm", variant: "secondary", children: "Uploading" })] })), _jsx("input", { ref: inputRef, type: "file", multiple: true, accept: accept, onChange: handleFileChange, className: "hidden", "aria-hidden": "true", "data-testid": "media-upload-list-input" }), helperText && !error && (_jsx(Text, { variant: "secondary", size: "xs", children: helperText })), error && _jsx(Alert, { variant: "error", children: error })] }));
103
+ return (_jsxs(Div, { className: "space-y-2", children: [_jsx(Label, { className: "block text-sm font-medium text-zinc-600 dark:text-zinc-400", children: label }), value.length > 0 && (_jsx(Div, { className: "grid grid-cols-1 sm:grid-cols-2 gap-3", children: value.map((item, index) => (_jsxs(Div, { className: "rounded-lg border border-zinc-200 dark:border-zinc-700 bg-zinc-50 dark:bg-zinc-900 p-3", children: [item.type === "video" ? (_jsx(Div, { className: "relative aspect-square max-h-24 overflow-hidden rounded-lg", children: _jsx(MediaVideo, { src: item.url, alt: item.alt || `Media ${index + 1}`, controls: true }) })) : item.type === "image" ? (_jsx(Div, { className: "relative aspect-square max-h-24 overflow-hidden rounded-lg", children: _jsx(MediaImage, { src: item.url, alt: item.alt || `Media ${index + 1}`, size: "card", objectFit: "contain" }) })) : (_jsx("a", { href: item.url, target: "_blank", rel: "noopener noreferrer", className: "text-sm underline break-all text-blue-600 dark:text-blue-400", children: fileNameFromUrl(item.url) })), !disabled && (_jsx(Div, { className: "mt-2", children: _jsx(Button, { type: "button", size: "sm", variant: "danger", onClick: () => removeAt(index), children: "Remove" }) }))] }, `${item.url}-${index}`))) })), !disabled && value.length < maxItems && (_jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => inputRef.current?.click(), disabled: isLoading, children: isLoading ? "Uploading..." : `+ Add Files (${value.length}/${maxItems})` })), isLoading && (_jsxs(Div, { className: "flex items-center gap-2", children: [_jsx(Spinner, { size: "sm" }), _jsx(Text, { size: "sm", variant: "secondary", children: "Uploading" })] })), _jsx("input", { ref: inputRef, type: "file", multiple: true, accept: accept, onChange: handleFileChange, className: "hidden", "aria-hidden": "true", "data-testid": "media-upload-list-input" }), helperText && !error && (_jsx(Text, { variant: "secondary", size: "xs", children: helperText })), error && _jsx(Alert, { variant: "error", children: error })] }));
104
104
  }
@@ -197,6 +197,12 @@ export interface OrderDocument {
197
197
  shippingProofMimeType?: string;
198
198
  shippingProofUploadedAt?: Date;
199
199
  shippingProofUploadedBy?: string;
200
+ /** Physical staging location for fulfilment management (Print & Label Center). */
201
+ physicalLocation?: {
202
+ zone: string;
203
+ shelf: string;
204
+ bin: string;
205
+ };
200
206
  createdAt: Date;
201
207
  updatedAt: Date;
202
208
  }