hey-pharmacist-ecommerce 1.1.42 → 1.1.43
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/README.md +70 -8
- package/dist/index.d.mts +380 -2364
- package/dist/index.d.ts +380 -2364
- package/dist/index.js +287 -326
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +287 -323
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/components/AccountOverviewTab.tsx +5 -5
- package/src/components/CartItem.tsx +15 -15
- package/src/components/Notification.tsx +3 -3
- package/src/components/ProductCard.tsx +10 -10
- package/src/components/QuickViewModal.tsx +16 -16
- package/src/components/ReviewCard.tsx +2 -2
- package/src/lib/Apis/api.ts +0 -1
- package/src/lib/Apis/models/group-with-no-users-dto.ts +0 -6
- package/src/lib/Apis/models/group-with-users-dto.ts +0 -6
- package/src/lib/Apis/models/index.ts +0 -35
- package/src/lib/Apis/models/order.ts +0 -6
- package/src/lib/Apis/models/populated-order.ts +0 -6
- package/src/lib/Apis/models/preference-update-item.ts +1 -0
- package/src/lib/Apis/models/update-user-dto.ts +0 -6
- package/src/lib/Apis/models/user-group.ts +0 -6
- package/src/lib/Apis/models/user-with-no-id.ts +0 -6
- package/src/lib/Apis/sharedConfig.ts +1 -1
- package/src/screens/CartScreen.tsx +10 -10
- package/src/screens/CheckoutScreen.tsx +12 -12
- package/src/screens/ProductDetailScreen.tsx +39 -39
- package/src/screens/ShopScreen.tsx +20 -20
- package/src/lib/Apis/apis/marketing-api.ts +0 -3099
- package/src/lib/Apis/models/add-contact-to-list-dto.ts +0 -33
- package/src/lib/Apis/models/browser-stats-response-dto.ts +0 -40
- package/src/lib/Apis/models/campaign-content-response-dto.ts +0 -40
- package/src/lib/Apis/models/campaign-draft-dto.ts +0 -175
- package/src/lib/Apis/models/campaign-draft-response-dto.ts +0 -40
- package/src/lib/Apis/models/campaign-draft-schedule-dto.ts +0 -49
- package/src/lib/Apis/models/campaign-draft-schedule-response-dto.ts +0 -40
- package/src/lib/Apis/models/campaign-draft-sending-dto.ts +0 -43
- package/src/lib/Apis/models/campaign-draft-sending-response-dto.ts +0 -40
- package/src/lib/Apis/models/contact-aggregated-stats-response-dto.ts +0 -40
- package/src/lib/Apis/models/contact-full-dto.ts +0 -93
- package/src/lib/Apis/models/contact-full-response-dto.ts +0 -40
- package/src/lib/Apis/models/contact-list-stats-response-dto.ts +0 -40
- package/src/lib/Apis/models/contact-lists-response-dto.ts +0 -40
- package/src/lib/Apis/models/country-stats-response-dto.ts +0 -40
- package/src/lib/Apis/models/create-contact-dto.ts +0 -39
- package/src/lib/Apis/models/create-contact-list-dto.ts +0 -27
- package/src/lib/Apis/models/create-email-template-dto.ts +0 -51
- package/src/lib/Apis/models/create-marketing-campaign-dto.ts +0 -81
- package/src/lib/Apis/models/email-template-response-dto.ts +0 -117
- package/src/lib/Apis/models/general-stats-response-dto.ts +0 -40
- package/src/lib/Apis/models/link-stats-response-dto.ts +0 -40
- package/src/lib/Apis/models/marketing-campaign-content-dto.ts +0 -27
- package/src/lib/Apis/models/marketing-list-contact-dto.ts +0 -51
- package/src/lib/Apis/models/schedule-campaign-draft-dto.ts +0 -27
- package/src/lib/Apis/models/send-test-email-dto.ts +0 -28
- package/src/lib/Apis/models/single-browser-stats-dto.ts +0 -45
- package/src/lib/Apis/models/single-contact-aggregated-stats-dto.ts +0 -129
- package/src/lib/Apis/models/single-contact-list-stats-dto.ts +0 -117
- package/src/lib/Apis/models/single-country-stats-dto.ts +0 -39
- package/src/lib/Apis/models/single-general-stats.ts +0 -153
- package/src/lib/Apis/models/single-link-stats-dto.ts +0 -39
- package/src/lib/Apis/models/single-recipient-dto.ts +0 -33
- package/src/lib/Apis/models/update-campaign-draft-content-dto.ts +0 -27
- package/src/lib/Apis/models/update-marketing-camp-draft-dto.ts +0 -81
|
@@ -109,14 +109,14 @@ export function CartScreen() {
|
|
|
109
109
|
|
|
110
110
|
return (
|
|
111
111
|
<div className="min-h-screen bg-white">
|
|
112
|
-
<div className="max-w-[1400px] mx-auto px-
|
|
113
|
-
<div className="
|
|
112
|
+
<div className="max-w-[1400px] mx-auto px-4 md:px-12">
|
|
113
|
+
<div className="py-8">
|
|
114
114
|
{/* Header */}
|
|
115
|
-
<div className="mb-12">
|
|
116
|
-
<h1 className="font-
|
|
115
|
+
<div className="mb-8 md:mb-12">
|
|
116
|
+
<h1 className="font-semibold text-hsecondary tracking-[-1px] md:tracking-[-2px] mb-2 text-3xl md:text-4xl">
|
|
117
117
|
Shopping Cart
|
|
118
118
|
</h1>
|
|
119
|
-
<p className="
|
|
119
|
+
<p className="text-[14px] md:text-[16px] text-hmuted">
|
|
120
120
|
{itemCount} {itemCount === 1 ? 'item' : 'items'} in your cart
|
|
121
121
|
</p>
|
|
122
122
|
</div>
|
|
@@ -148,15 +148,15 @@ export function CartScreen() {
|
|
|
148
148
|
initial={{ opacity: 0, y: 24 }}
|
|
149
149
|
animate={{ opacity: 1, y: 0 }}
|
|
150
150
|
transition={{ delay: 0.1 }}
|
|
151
|
-
className="
|
|
151
|
+
className="lg:sticky lg:top-24 h-fit lg:col-span-1"
|
|
152
152
|
>
|
|
153
|
-
<div className="bg-linear-to-br from-hsecondary/10 to-hsecondary/10 rounded-[24px] p-8 border-2 border-hsecondary/20 sticky top-24">
|
|
154
|
-
<h2 className="font-
|
|
153
|
+
<div className="bg-hsecondary/[0.03] md:bg-linear-to-br md:from-hsecondary/10 md:to-hsecondary/10 rounded-[24px] p-6 md:p-8 border-2 border-hsecondary/10 md:border-hsecondary/20 lg:sticky lg:top-24">
|
|
154
|
+
<h2 className="font-semibold text-hsecondary mb-6">Order Summary</h2>
|
|
155
155
|
|
|
156
156
|
<div className="space-y-4 mb-6">
|
|
157
157
|
<div className="flex items-center justify-between">
|
|
158
|
-
<span className="
|
|
159
|
-
<span className="font-
|
|
158
|
+
<span className="text-[14px] text-hmuted">Subtotal ({itemCount} {itemCount === 1 ? 'item' : 'items'})</span>
|
|
159
|
+
<span className="font-semibold text-[14px] text-hsecondary">{formatPrice(subtotal)}</span>
|
|
160
160
|
</div>
|
|
161
161
|
<div className="flex items-center justify-between text-sm">
|
|
162
162
|
<span className="text-gray-600">Shipping</span>
|
|
@@ -557,10 +557,10 @@ export function CheckoutScreen() {
|
|
|
557
557
|
>
|
|
558
558
|
{/* Header */}
|
|
559
559
|
<div className="mb-12">
|
|
560
|
-
<h1 className="font-
|
|
560
|
+
<h1 className="font-semibold text-[#2B4B7C] mb-2 text-3xl">
|
|
561
561
|
Checkout
|
|
562
562
|
</h1>
|
|
563
|
-
<p className="
|
|
563
|
+
<p className="text-[14px] text-[#676c80] text-md leading-relaxed">
|
|
564
564
|
Complete your order information below
|
|
565
565
|
</p>
|
|
566
566
|
</div>
|
|
@@ -694,7 +694,7 @@ export function CheckoutScreen() {
|
|
|
694
694
|
<section className="bg-white border-2 border-gray-100 rounded-[24px] p-8 text-[#2B4B7C]">
|
|
695
695
|
<div className="flex flex-wrap items-center justify-between gap-4">
|
|
696
696
|
<div>
|
|
697
|
-
<h2 className="font-
|
|
697
|
+
<h2 className="font-semibold text-[#2B4B7C] mb-2 text-2xl">
|
|
698
698
|
{isDelivery ? 'Delivery Address' : 'Contact Information'}
|
|
699
699
|
</h2>
|
|
700
700
|
<p className="text-sm text-slate-500">
|
|
@@ -828,7 +828,7 @@ export function CheckoutScreen() {
|
|
|
828
828
|
<div className="bg-white border-2 border-gray-100 rounded-[24px] p-8 text-[#2B4B7C]">
|
|
829
829
|
<div className="flex items-center gap-3 text-xl font-semibold text-gray-900 pb-4 mb-8 border-b">
|
|
830
830
|
<Truck className="w-8 h-8 flex items-center justify-center text-[#2B4B7C]" />
|
|
831
|
-
<h2 className="font-
|
|
831
|
+
<h2 className="font-semibold text-[#2B4B7C] text-2xl">Shipping Options</h2>
|
|
832
832
|
</div>
|
|
833
833
|
|
|
834
834
|
{shippingRatesLoading ? (
|
|
@@ -980,7 +980,7 @@ export function CheckoutScreen() {
|
|
|
980
980
|
>
|
|
981
981
|
{/* Order Summary */}
|
|
982
982
|
<div className="bg-linear-to-br from-hsecondary/10 to-hsecondary/10 rounded-[24px] p-8 border-2 border-hsecondary/20 sticky top-24">
|
|
983
|
-
<h2 className="font-
|
|
983
|
+
<h2 className="font-semibold text-hsecondary mb-6 text-2xl">Order Summary</h2>
|
|
984
984
|
|
|
985
985
|
|
|
986
986
|
{/* Cart Summary */}
|
|
@@ -992,13 +992,13 @@ export function CheckoutScreen() {
|
|
|
992
992
|
<Image src={item.productVariantData?.media?.[0]?.file || PLACEHOLDER_IMAGE_SRC} alt={item.productVariantData.name} className="w-full h-full object-cover" height={200} width={200} />
|
|
993
993
|
</div>
|
|
994
994
|
<div className="flex-1 min-w-0">
|
|
995
|
-
<p className="font-
|
|
995
|
+
<p className="font-medium text-[12px] text-[#2B4B7C] mb-1">
|
|
996
996
|
{item?.productVariantData?.name}
|
|
997
997
|
</p>
|
|
998
|
-
<p className="
|
|
998
|
+
<p className="text-[11px] text-[#676c80]">
|
|
999
999
|
{item?.productVariantData?.brand} • Qty: {item.quantity}
|
|
1000
1000
|
</p>
|
|
1001
|
-
<p className="font-
|
|
1001
|
+
<p className="font-semibold text-[12px] text-hsecondary mt-1">
|
|
1002
1002
|
{formatPrice(item.productVariantData.finalPrice * item.quantity)}
|
|
1003
1003
|
</p>
|
|
1004
1004
|
</div>
|
|
@@ -1045,8 +1045,8 @@ export function CheckoutScreen() {
|
|
|
1045
1045
|
<div className="h-px bg-hsecondary/20 mt-6" />
|
|
1046
1046
|
|
|
1047
1047
|
<div className="flex items-center justify-between mb-6">
|
|
1048
|
-
<span className="font-
|
|
1049
|
-
<span className="font-
|
|
1048
|
+
<span className="font-semibold text-[16px] text-hsecondary">Total</span>
|
|
1049
|
+
<span className="font-bold text-[24px] text-hsecondary">{formatPrice(total)}</span>
|
|
1050
1050
|
</div>
|
|
1051
1051
|
{/* <p className="mt-1 text-xs text-slate-500">
|
|
1052
1052
|
Tax is estimated. Final amount confirmed after payment.
|
|
@@ -1054,7 +1054,7 @@ export function CheckoutScreen() {
|
|
|
1054
1054
|
</div>
|
|
1055
1055
|
|
|
1056
1056
|
<div className="bg-white/80 rounded-xl p-4">
|
|
1057
|
-
<p className="
|
|
1057
|
+
<p className="text-[11px] text-[#676c80] leading-[1.6]">
|
|
1058
1058
|
<strong className="text-hsecondary">Payment:</strong> We'll contact you to arrange payment upon pickup or delivery. We accept cash, credit cards, and all major payment methods.
|
|
1059
1059
|
</p>
|
|
1060
1060
|
</div>
|
|
@@ -1093,7 +1093,7 @@ export function CheckoutScreen() {
|
|
|
1093
1093
|
<button
|
|
1094
1094
|
type="submit"
|
|
1095
1095
|
disabled={isSubmitting}
|
|
1096
|
-
className="font-
|
|
1096
|
+
className="font-medium text-[14px] px-6 py-3 rounded-full text-white hover:bg-[#d66f45] hover:shadow-lg transition-all duration-300 mt-4 w-full bg-hsecondary hover:bg-[#2B4B7C] flex items-center justify-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed"
|
|
1097
1097
|
>
|
|
1098
1098
|
<CreditCard className="h-5 w-5" />
|
|
1099
1099
|
{isSubmitting ? 'Placing order...' : 'Place Secure Order'}
|
|
@@ -361,7 +361,7 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
361
361
|
<div className="max-w-[1400px] mx-auto px-8 md:px-12">
|
|
362
362
|
<button
|
|
363
363
|
onClick={() => router.push(buildPath('/shop'))}
|
|
364
|
-
className="flex items-center gap-2
|
|
364
|
+
className="flex items-center gap-2 text-[13px] text-hmuted hover:text-hprimary transition-colors"
|
|
365
365
|
>
|
|
366
366
|
<ChevronLeft className="size-4" />
|
|
367
367
|
Back to Shop
|
|
@@ -405,22 +405,22 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
405
405
|
|
|
406
406
|
<div className="absolute top-6 left-6 flex flex-col gap-3">
|
|
407
407
|
{discount > 0 && (
|
|
408
|
-
<div className="bg-
|
|
409
|
-
<span className="font-
|
|
408
|
+
<div className="bg-hsecondary text-white rounded-full px-4 py-2">
|
|
409
|
+
<span className="font-bold text-[12px] uppercase tracking-wide">
|
|
410
410
|
Save {discount}%
|
|
411
411
|
</span>
|
|
412
412
|
</div>
|
|
413
413
|
)}
|
|
414
414
|
{/* {product.bestseller && (
|
|
415
415
|
<div className="bg-hsecondary text-white rounded-full px-4 py-2">
|
|
416
|
-
<span className="font-
|
|
416
|
+
<span className="font-semibold text-[11px] uppercase tracking-wide">
|
|
417
417
|
Bestseller
|
|
418
418
|
</span>
|
|
419
419
|
</div>
|
|
420
420
|
)}
|
|
421
421
|
{product.newArrival && (
|
|
422
422
|
<div className="bg-hprimary text-white rounded-full px-4 py-2">
|
|
423
|
-
<span className="font-
|
|
423
|
+
<span className="font-semibold text-[11px] uppercase tracking-wide">
|
|
424
424
|
New Arrival
|
|
425
425
|
</span>
|
|
426
426
|
</div>
|
|
@@ -461,10 +461,10 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
461
461
|
<aside className="space-y-6 lg:sticky lg:top-24">
|
|
462
462
|
{/* Category Path */}
|
|
463
463
|
<div className="mb-4">
|
|
464
|
-
<p className="
|
|
464
|
+
<p className="text-[12px] text-hprimary uppercase tracking-wide font-medium mb-2">
|
|
465
465
|
{product.brand} • {product.categoryIds?.[0]?.name || 'Uncategorized'}
|
|
466
466
|
</p>
|
|
467
|
-
<h1 className="text-3xl font-
|
|
467
|
+
<h1 className="text-3xl font-semibold text-hsecondary tracking-[-1.5px] mb-3">
|
|
468
468
|
{selectedVariant?.name || product.name}
|
|
469
469
|
</h1>
|
|
470
470
|
{/* Rating */}
|
|
@@ -480,22 +480,22 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
480
480
|
/>
|
|
481
481
|
))}
|
|
482
482
|
</div>
|
|
483
|
-
<span className="
|
|
483
|
+
<span className="text-[14px] text-hmuted">
|
|
484
484
|
{reviewStats.averageRating} ({reviewStats.reviewCount} {reviewStats.reviewCount === 1 ? 'review' : 'reviews'})
|
|
485
485
|
</span>
|
|
486
486
|
</div>
|
|
487
487
|
{selectedVariant && (
|
|
488
488
|
<div className="flex items-center gap-3 mb-6 pb-6 border-b-2 border-gray-100">
|
|
489
|
-
<span className="font-
|
|
489
|
+
<span className="font-bold text-[40px] text-hsecondary">
|
|
490
490
|
${variantPrice.toFixed(2)}
|
|
491
491
|
</span>
|
|
492
492
|
{variantComparePrice && variantComparePrice > variantPrice && (
|
|
493
493
|
<>
|
|
494
|
-
<span className="
|
|
494
|
+
<span className="text-[24px] text-hmuted line-through">
|
|
495
495
|
${variantComparePrice.toFixed(2)}
|
|
496
496
|
</span>
|
|
497
|
-
<div className="px-3 py-1 rounded-full bg-
|
|
498
|
-
<span className="font-
|
|
497
|
+
<div className="px-3 py-1 rounded-full bg-hsecondary/10">
|
|
498
|
+
<span className="font-semibold text-[13px] text-hsecondary">
|
|
499
499
|
Save ${formatPrice(variantComparePrice - variantPrice)}
|
|
500
500
|
</span>
|
|
501
501
|
</div>
|
|
@@ -510,28 +510,28 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
510
510
|
{selectedVariant.inventoryStatus === ProductVariantInventoryStatusEnum.OUTOFSTOCK ? (
|
|
511
511
|
<>
|
|
512
512
|
<div className="size-3 rounded-full bg-red-500" />
|
|
513
|
-
<span className="
|
|
513
|
+
<span className="text-[13px] text-red-600 font-medium">
|
|
514
514
|
Out of Stock
|
|
515
515
|
</span>
|
|
516
516
|
</>
|
|
517
517
|
) : selectedVariant.inventoryStatus === ProductVariantInventoryStatusEnum.LOWSTOCK || selectedVariant.inventoryCount <= 10 ? (
|
|
518
518
|
<>
|
|
519
519
|
<div className="size-3 rounded-full bg-hprimary animate-pulse" />
|
|
520
|
-
<span className="
|
|
520
|
+
<span className="text-[13px] text-hprimary font-medium">
|
|
521
521
|
Only {selectedVariant.inventoryCount} left in stock - Order soon!
|
|
522
522
|
</span>
|
|
523
523
|
</>
|
|
524
524
|
) : (
|
|
525
525
|
<>
|
|
526
526
|
<div className="size-3 rounded-full bg-green-500" />
|
|
527
|
-
<span className="
|
|
527
|
+
<span className="text-[13px] text-green-600 font-medium">
|
|
528
528
|
In Stock
|
|
529
529
|
</span>
|
|
530
530
|
</>
|
|
531
531
|
)}
|
|
532
532
|
|
|
533
533
|
</div>
|
|
534
|
-
<p className="
|
|
534
|
+
<p className="text-[12px] text-hmuted">
|
|
535
535
|
SKU: {selectedVariant?.sku || product?.sku}
|
|
536
536
|
</p>
|
|
537
537
|
</div>
|
|
@@ -540,7 +540,7 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
540
540
|
{/* Description */}
|
|
541
541
|
{product.description && (
|
|
542
542
|
<div
|
|
543
|
-
className="
|
|
543
|
+
className="text-[14px] text-hmuted leading-[1.7] mb-8 max-w-full overflow-hidden break-words"
|
|
544
544
|
dangerouslySetInnerHTML={{ __html: product.description }}
|
|
545
545
|
/>
|
|
546
546
|
)}
|
|
@@ -548,7 +548,7 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
548
548
|
{/* Variant Selector with Images */}
|
|
549
549
|
{product?.variants && product.variants.length > 0 && (
|
|
550
550
|
<div className="mb-6">
|
|
551
|
-
<h3 className="font-
|
|
551
|
+
<h3 className="font-semibold text-[14px] text-hsecondary mb-3">
|
|
552
552
|
Select Variant
|
|
553
553
|
</h3>
|
|
554
554
|
<div className="flex flex-wrap gap-3">
|
|
@@ -598,7 +598,7 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
598
598
|
|
|
599
599
|
{/* Quantity Selector */}
|
|
600
600
|
<div className="mb-8">
|
|
601
|
-
<h3 className="font-
|
|
601
|
+
<h3 className="font-semibold text-[14px] text-hsecondary mb-3">
|
|
602
602
|
Quantity
|
|
603
603
|
</h3>
|
|
604
604
|
<div className="flex items-center gap-3">
|
|
@@ -608,18 +608,18 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
608
608
|
type="button"
|
|
609
609
|
onClick={() => setQuantity((current) => Math.max(1, current - 1))}
|
|
610
610
|
|
|
611
|
-
className="font-
|
|
611
|
+
className="font-bold text-[18px] text-hsecondary hover:text-hprimary transition-colors"
|
|
612
612
|
aria-label="Increase quantity"
|
|
613
613
|
>
|
|
614
614
|
-
|
|
615
615
|
</button>
|
|
616
|
-
<span className="font-
|
|
616
|
+
<span className="font-semibold text-[16px] text-hsecondary min-w-[30px] text-center">
|
|
617
617
|
{quantity}
|
|
618
618
|
</span>
|
|
619
619
|
<button
|
|
620
620
|
onClick={() => setQuantity(Math.min(selectedVariant?.inventoryCount || product.inventoryCount || 999, quantity + 1))}
|
|
621
621
|
disabled={quantity >= (selectedVariant?.inventoryCount || product.inventoryCount || 0)}
|
|
622
|
-
className="font-
|
|
622
|
+
className="font-bold text-[18px] text-hsecondary hover:text-hprimary transition-colors disabled:opacity-50"
|
|
623
623
|
>
|
|
624
624
|
+
|
|
625
625
|
</button>
|
|
@@ -635,7 +635,7 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
635
635
|
{/* Action Buttons */}
|
|
636
636
|
<div className="flex flex-col sm:flex-row gap-3 mb-8">
|
|
637
637
|
<button
|
|
638
|
-
className="flex-1 font-
|
|
638
|
+
className="flex-1 font-medium text-[14px] px-8 py-4 rounded-full transition-all duration-300 flex items-center justify-center gap-3 bg-hsecondary text-white hover:bg-hsecondary/80 hover:shadow-lg disabled:opacity-50 disabled:cursor-not-allowed"
|
|
639
639
|
onClick={handleAddToCart}
|
|
640
640
|
disabled={!selectedVariant || selectedVariant.inventoryStatus === ProductVariantInventoryStatusEnum.OUTOFSTOCK || isAddingToCart}
|
|
641
641
|
>
|
|
@@ -675,10 +675,10 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
675
675
|
<Truck className="size-5 text-hprimary" />
|
|
676
676
|
</div>
|
|
677
677
|
<div>
|
|
678
|
-
<p className="font-
|
|
678
|
+
<p className="font-semibold text-[12px] text-hsecondary mb-1">
|
|
679
679
|
Free Shipping
|
|
680
680
|
</p>
|
|
681
|
-
<p className="
|
|
681
|
+
<p className="text-[11px] text-hmuted">
|
|
682
682
|
On all orders
|
|
683
683
|
</p>
|
|
684
684
|
</div>
|
|
@@ -688,10 +688,10 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
688
688
|
<RotateCcw className="size-5 text-hprimary" />
|
|
689
689
|
</div>
|
|
690
690
|
<div>
|
|
691
|
-
<p className="font-
|
|
691
|
+
<p className="font-semibold text-[12px] text-hsecondary mb-1">
|
|
692
692
|
Easy Returns
|
|
693
693
|
</p>
|
|
694
|
-
<p className="
|
|
694
|
+
<p className="text-[11px] text-hmuted">
|
|
695
695
|
30-day return policy
|
|
696
696
|
</p>
|
|
697
697
|
</div>
|
|
@@ -701,10 +701,10 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
701
701
|
<Shield className="size-5 text-hprimary" />
|
|
702
702
|
</div>
|
|
703
703
|
<div>
|
|
704
|
-
<p className="font-
|
|
704
|
+
<p className="font-semibold text-[12px] text-hsecondary mb-1">
|
|
705
705
|
Secure Checkout
|
|
706
706
|
</p>
|
|
707
|
-
<p className="
|
|
707
|
+
<p className="text-[11px] text-hmuted">
|
|
708
708
|
Safe & protected
|
|
709
709
|
</p>
|
|
710
710
|
</div>
|
|
@@ -714,10 +714,10 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
714
714
|
<Package className="size-5 text-hprimary" />
|
|
715
715
|
</div>
|
|
716
716
|
<div>
|
|
717
|
-
<p className="font-
|
|
717
|
+
<p className="font-semibold text-[12px] text-hsecondary mb-1">
|
|
718
718
|
Quality Guaranteed
|
|
719
719
|
</p>
|
|
720
|
-
<p className="
|
|
720
|
+
<p className="text-[11px] text-hmuted">
|
|
721
721
|
Premium materials
|
|
722
722
|
</p>
|
|
723
723
|
</div>
|
|
@@ -734,7 +734,7 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
734
734
|
<button
|
|
735
735
|
key={tab}
|
|
736
736
|
onClick={() => setActiveTab(tab)}
|
|
737
|
-
className={`font-
|
|
737
|
+
className={`font-medium text-[14px] px-6 py-4 transition-all ${activeTab === tab
|
|
738
738
|
? 'text-hprimary border-b-2 border-hprimary -mb-0.5'
|
|
739
739
|
: 'text-hmuted hover:text-hprimary'
|
|
740
740
|
}`}
|
|
@@ -747,29 +747,29 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
747
747
|
<div className="bg-white rounded-[24px] p-8 border-2 border-gray-100">
|
|
748
748
|
{activeTab === 'description' && (
|
|
749
749
|
<div>
|
|
750
|
-
<h3 className="font-
|
|
750
|
+
<h3 className="font-semibold text-hsecondary mb-4">
|
|
751
751
|
Product Description
|
|
752
752
|
</h3>
|
|
753
753
|
<div
|
|
754
|
-
className="
|
|
754
|
+
className="text-[14px] text-hmuted leading-[1.8] mb-4 max-w-full overflow-hidden break-words"
|
|
755
755
|
dangerouslySetInnerHTML={{ __html: product.description }}
|
|
756
756
|
/>
|
|
757
757
|
|
|
758
758
|
<div className="mt-6">
|
|
759
|
-
<h4 className="font-
|
|
759
|
+
<h4 className="font-semibold text-[13px] text-hsecondary mb-3">
|
|
760
760
|
Last updated:
|
|
761
761
|
</h4>
|
|
762
|
-
<p className="
|
|
762
|
+
<p className="text-[14px] text-hmuted">
|
|
763
763
|
{lastUpdatedLabel}
|
|
764
764
|
</p>
|
|
765
765
|
</div>
|
|
766
766
|
|
|
767
767
|
{/* shipped from */}
|
|
768
768
|
<div className="mt-6">
|
|
769
|
-
<h4 className="font-
|
|
769
|
+
<h4 className="font-semibold text-[13px] text-hsecondary mb-3">
|
|
770
770
|
Shipped from:
|
|
771
771
|
</h4>
|
|
772
|
-
<p className="
|
|
772
|
+
<p className="text-[14px] text-hmuted">
|
|
773
773
|
Local pharmacy distribution center
|
|
774
774
|
</p>
|
|
775
775
|
</div>
|
|
@@ -786,7 +786,7 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
786
786
|
{/* Related Products */}
|
|
787
787
|
{relatedProducts.length > 0 && (
|
|
788
788
|
<div>
|
|
789
|
-
<h2 className="font-
|
|
789
|
+
<h2 className="font-semibold text-hsecondary mb-8 text-2xl">
|
|
790
790
|
You May Also Like
|
|
791
791
|
</h2>
|
|
792
792
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
|
|
@@ -664,12 +664,12 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
664
664
|
|
|
665
665
|
<div className={`lg:w-72 ${showFilters ? 'block rounded-full' : 'hidden lg:block'}`}>
|
|
666
666
|
<div className="bg-white rounded-[24px] p-6 border-2 border-gray-100 sticky top-24">
|
|
667
|
-
<h3 className="font-
|
|
667
|
+
<h3 className="font-semibold text-hsecondary">
|
|
668
668
|
Filters
|
|
669
669
|
</h3>
|
|
670
670
|
{/* Search */}
|
|
671
671
|
<div className="mb-6">
|
|
672
|
-
<label className="
|
|
672
|
+
<label className="text-[12px] text-hmuted mb-2 block font-medium">
|
|
673
673
|
Search Products
|
|
674
674
|
</label>
|
|
675
675
|
<div className="relative">
|
|
@@ -679,7 +679,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
679
679
|
placeholder="Search..."
|
|
680
680
|
value={searchQuery}
|
|
681
681
|
onChange={handleInputChange}
|
|
682
|
-
className="w-full pl-10 pr-4 py-2.5 rounded-xl border-2 border-gray-200 focus:border-hprimary focus:outline-hidden
|
|
682
|
+
className="w-full pl-10 pr-4 py-2.5 rounded-xl border-2 border-gray-200 focus:border-hprimary focus:outline-hidden text-[13px] text-hsecondary"
|
|
683
683
|
/>
|
|
684
684
|
</div>
|
|
685
685
|
</div>
|
|
@@ -690,7 +690,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
690
690
|
onClick={() => toggleFilterSection('category')}
|
|
691
691
|
className="w-full flex items-center justify-between mb-3"
|
|
692
692
|
>
|
|
693
|
-
<label className="
|
|
693
|
+
<label className="text-[12px] text-hmuted font-medium cursor-pointer">
|
|
694
694
|
Category
|
|
695
695
|
</label>
|
|
696
696
|
{expandedFilterSections.category ? (
|
|
@@ -713,7 +713,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
713
713
|
if (!isExpanded) toggleCategoryExpand(categoryId);
|
|
714
714
|
handleCategoryChange(categoryId);
|
|
715
715
|
}}
|
|
716
|
-
className={`w-full text-left px-4 py-3 rounded-xl
|
|
716
|
+
className={`w-full text-left px-4 py-3 rounded-xl text-[13px] transition-all flex items-center gap-3 ${isCategoryActive
|
|
717
717
|
? 'bg-hprimary text-white shadow-lg'
|
|
718
718
|
: 'text-hsecondary hover:bg-gray-50 border-2 border-gray-100'
|
|
719
719
|
}`}
|
|
@@ -733,7 +733,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
733
733
|
onClick={() => toggleFilterSection('brand')}
|
|
734
734
|
className="w-full flex items-center justify-between mb-3"
|
|
735
735
|
>
|
|
736
|
-
<label className="
|
|
736
|
+
<label className="text-[12px] text-hmuted font-medium cursor-pointer">
|
|
737
737
|
Brand
|
|
738
738
|
</label>
|
|
739
739
|
<ChevronDown className={`size-4 text-hmuted transition-transform ${expandedFilterSections.brand ? 'rotate-180' : ''}`} />
|
|
@@ -748,7 +748,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
748
748
|
<button
|
|
749
749
|
key={brand}
|
|
750
750
|
onClick={() => handleBrandChange(brand)}
|
|
751
|
-
className={`w-full text-left px-4 py-3 rounded-xl
|
|
751
|
+
className={`w-full text-left px-4 py-3 rounded-xl text-[13px] transition-all ${isSelected
|
|
752
752
|
? 'bg-hprimary text-white shadow-lg'
|
|
753
753
|
: 'text-hsecondary hover:bg-gray-50 border-2 border-gray-100'
|
|
754
754
|
}`}
|
|
@@ -769,7 +769,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
769
769
|
onClick={() => toggleFilterSection('availability')}
|
|
770
770
|
className="w-full flex items-center justify-between mb-3"
|
|
771
771
|
>
|
|
772
|
-
<label className="
|
|
772
|
+
<label className="text-[12px] text-hmuted font-medium cursor-pointer">
|
|
773
773
|
Availability
|
|
774
774
|
</label>
|
|
775
775
|
<ChevronDown className={`size-4 text-hmuted transition-transform ${expandedFilterSections.availability ? 'rotate-180' : ''}`} />
|
|
@@ -778,7 +778,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
778
778
|
<div className="space-y-2">
|
|
779
779
|
<button
|
|
780
780
|
onClick={handleToggleStock}
|
|
781
|
-
className={`w-full flex items-center justify-between px-4 py-3 rounded-xl
|
|
781
|
+
className={`w-full flex items-center justify-between px-4 py-3 rounded-xl text-[13px] transition-all border-2 ${inStockOnly
|
|
782
782
|
? 'bg-hprimary text-white shadow-lg'
|
|
783
783
|
: 'text-hsecondary hover:bg-gray-50 border-2 border-gray-100'
|
|
784
784
|
}`}
|
|
@@ -794,7 +794,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
794
794
|
onClick={() => toggleFilterSection('price')}
|
|
795
795
|
className="w-full flex items-center justify-between mb-3"
|
|
796
796
|
>
|
|
797
|
-
<label className="
|
|
797
|
+
<label className="text-[12px] text-hmuted font-medium cursor-pointer">
|
|
798
798
|
Price Range
|
|
799
799
|
</label>
|
|
800
800
|
<ChevronDown className={`size-4 text-hmuted transition-transform ${expandedFilterSections.price ? 'rotate-180' : ''}`} />
|
|
@@ -809,7 +809,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
809
809
|
type="button"
|
|
810
810
|
key={range.value}
|
|
811
811
|
onClick={() => handlePriceRangeSelect(range.value)}
|
|
812
|
-
className={`w-full flex items-center justify-between px-4 py-3 rounded-xl
|
|
812
|
+
className={`w-full flex items-center justify-between px-4 py-3 rounded-xl text-[13px] transition-all border-2 ${isActive
|
|
813
813
|
? 'bg-hprimary text-white shadow-lg'
|
|
814
814
|
: 'text-hsecondary hover:bg-gray-50 border-2 border-gray-100'
|
|
815
815
|
}`}
|
|
@@ -828,7 +828,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
828
828
|
onChange={(event) =>
|
|
829
829
|
setCustomPrice((current) => ({ ...current, min: event.target.value }))
|
|
830
830
|
}
|
|
831
|
-
className="w-1/2 px-4 py-2.5 rounded-xl border-2 border-gray-200 focus:border-hprimary focus:outline-hidden
|
|
831
|
+
className="w-1/2 px-4 py-2.5 rounded-xl border-2 border-gray-200 focus:border-hprimary focus:outline-hidden text-[13px] text-hsecondary"
|
|
832
832
|
/>
|
|
833
833
|
<Input
|
|
834
834
|
type="number"
|
|
@@ -838,7 +838,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
838
838
|
onChange={(event) =>
|
|
839
839
|
setCustomPrice((current) => ({ ...current, max: event.target.value }))
|
|
840
840
|
}
|
|
841
|
-
className="w-1/2 px-4 py-2.5 rounded-xl border-2 border-gray-200 focus:border-hprimary focus:outline-hidden
|
|
841
|
+
className="w-1/2 px-4 py-2.5 rounded-xl border-2 border-gray-200 focus:border-hprimary focus:outline-hidden text-[13px] text-hsecondary"
|
|
842
842
|
/>
|
|
843
843
|
</div>
|
|
844
844
|
<button
|
|
@@ -926,9 +926,9 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
926
926
|
</section>
|
|
927
927
|
|
|
928
928
|
{/* Shop by Category Section */}
|
|
929
|
-
<section className="py-8 bg-white">
|
|
929
|
+
<section className="py-8 bg-white/50">
|
|
930
930
|
<div className="container mx-auto px-4">
|
|
931
|
-
<h2 className="text-2xl md:text-3xl font-
|
|
931
|
+
<h2 className="text-2xl md:text-3xl font-semibold text-hsecondary mb-6">
|
|
932
932
|
Shop by Category
|
|
933
933
|
</h2>
|
|
934
934
|
<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-4">
|
|
@@ -948,11 +948,11 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
948
948
|
<Package className={`size-6 ${!categoryFilter ? 'text-white' : 'text-hprimary'
|
|
949
949
|
}`} />
|
|
950
950
|
</div>
|
|
951
|
-
<h3 className={`font-
|
|
951
|
+
<h3 className={`font-semibold text-[14px] mb-1.5 ${!categoryFilter ? 'text-white' : 'text-hsecondary'
|
|
952
952
|
}`}>
|
|
953
953
|
All Products
|
|
954
954
|
</h3>
|
|
955
|
-
<p className={`
|
|
955
|
+
<p className={`text-[11px] ${!categoryFilter ? 'text-white/80' : 'text-hmuted'
|
|
956
956
|
}`}>
|
|
957
957
|
Browse Everything
|
|
958
958
|
</p>
|
|
@@ -983,11 +983,11 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
983
983
|
<Icon className={`size-6 ${isSelected ? 'text-white' : 'text-hprimary'
|
|
984
984
|
}`} />
|
|
985
985
|
</div>
|
|
986
|
-
<h3 className={`font-
|
|
986
|
+
<h3 className={`font-semibold text-[14px] mb-1.5 ${isSelected ? 'text-white' : 'text-hsecondary'
|
|
987
987
|
}`}>
|
|
988
988
|
{category.name}
|
|
989
989
|
</h3>
|
|
990
|
-
<p className={`
|
|
990
|
+
<p className={`text-[11px] ${isSelected ? 'text-white/80' : 'text-hmuted'
|
|
991
991
|
}`}>
|
|
992
992
|
{category.description}
|
|
993
993
|
</p>
|
|
@@ -1177,7 +1177,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
1177
1177
|
event.stopPropagation();
|
|
1178
1178
|
router.push(buildPath(`/products/${product._id}`));
|
|
1179
1179
|
}}
|
|
1180
|
-
className="w-full font-
|
|
1180
|
+
className="w-full font-medium text-sm px-3 py-2 rounded-xl bg-hsecondary text-white hover:opacity-80 hover:shadow-lg transition-all duration-300 flex items-center justify-center gap-1.5 disabled:opacity-50 disabled:cursor-not-allowed"
|
|
1181
1181
|
>
|
|
1182
1182
|
View product
|
|
1183
1183
|
</button>
|