hey-pharmacist-ecommerce 1.1.41 → 1.1.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +370 -370
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +370 -370
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/AccountAddressesTab.tsx +9 -9
- package/src/components/AccountOrdersTab.tsx +11 -11
- package/src/components/AccountOverviewTab.tsx +21 -21
- package/src/components/AccountPaymentTab.tsx +2 -2
- package/src/components/AccountReviewsTab.tsx +1 -1
- package/src/components/AccountSettingsTab.tsx +6 -6
- package/src/components/AddressFormModal.tsx +2 -2
- package/src/components/CartItem.tsx +2 -2
- package/src/components/FilterChips.tsx +7 -7
- package/src/components/Footer.tsx +9 -9
- package/src/components/Header.tsx +7 -7
- package/src/components/NotificationBell.tsx +3 -3
- package/src/components/NotificationDrawer.tsx +1 -1
- package/src/components/NotificationModal.tsx +1 -1
- package/src/components/OrderCard.tsx +2 -2
- package/src/components/ProductCard.tsx +6 -6
- package/src/components/QuickViewModal.tsx +23 -23
- package/src/components/ReviewCard.tsx +4 -4
- package/src/components/TabNavigation.tsx +2 -2
- package/src/components/ui/Badge.tsx +2 -2
- package/src/components/ui/Button.tsx +3 -3
- package/src/components/ui/ConfirmModal.tsx +3 -3
- package/src/components/ui/Input.tsx +1 -1
- package/src/providers/ThemeProvider.tsx +2 -2
- package/src/screens/AddressesScreen.tsx +6 -6
- package/src/screens/CartScreen.tsx +19 -19
- package/src/screens/ChangePasswordScreen.tsx +2 -2
- package/src/screens/CheckoutScreen.tsx +21 -21
- package/src/screens/CurrentOrdersScreen.tsx +4 -4
- package/src/screens/EditProfileScreen.tsx +1 -1
- package/src/screens/ForgotPasswordScreen.tsx +11 -11
- package/src/screens/LoginScreen.tsx +12 -12
- package/src/screens/OrderDetailScreen.tsx +30 -30
- package/src/screens/OrdersScreen.tsx +3 -3
- package/src/screens/ProductDetailScreen.tsx +48 -48
- package/src/screens/ProfileScreen.tsx +2 -2
- package/src/screens/RegisterScreen.tsx +15 -15
- package/src/screens/ResetPasswordScreen.tsx +14 -14
- package/src/screens/SearchResultsScreen.tsx +7 -7
- package/src/screens/ShopScreen.tsx +50 -50
- package/src/screens/WishlistScreen.tsx +22 -22
- package/src/styles/globals.css +43 -43
|
@@ -334,7 +334,7 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
334
334
|
<div className="min-h-screen bg-slate-50">
|
|
335
335
|
<div className="container mx-auto px-4 py-16">
|
|
336
336
|
<div className="rounded-3xl bg-white p-10 text-center shadow-xs">
|
|
337
|
-
<Sparkles className="mx-auto h-10 w-10 text-
|
|
337
|
+
<Sparkles className="mx-auto h-10 w-10 text-hprimary-500" />
|
|
338
338
|
<h1 className="mt-6 text-2xl font-semibold text-gray-900">Product not found</h1>
|
|
339
339
|
<p className="mt-2 text-gray-600">
|
|
340
340
|
It may have been removed or is temporarily unavailable. Discover other pharmacy
|
|
@@ -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 font-['Poppins',sans-serif] text-[13px] text-
|
|
364
|
+
className="flex items-center gap-2 font-['Poppins',sans-serif] text-[13px] text-hmuted hover:text-hprimary transition-colors"
|
|
365
365
|
>
|
|
366
366
|
<ChevronLeft className="size-4" />
|
|
367
367
|
Back to Shop
|
|
@@ -412,14 +412,14 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
412
412
|
</div>
|
|
413
413
|
)}
|
|
414
414
|
{/* {product.bestseller && (
|
|
415
|
-
<div className="bg-
|
|
415
|
+
<div className="bg-hsecondary text-white rounded-full px-4 py-2">
|
|
416
416
|
<span className="font-['Poppins',sans-serif] font-semibold text-[11px] uppercase tracking-wide">
|
|
417
417
|
Bestseller
|
|
418
418
|
</span>
|
|
419
419
|
</div>
|
|
420
420
|
)}
|
|
421
421
|
{product.newArrival && (
|
|
422
|
-
<div className="bg-
|
|
422
|
+
<div className="bg-hprimary text-white rounded-full px-4 py-2">
|
|
423
423
|
<span className="font-['Poppins',sans-serif] font-semibold text-[11px] uppercase tracking-wide">
|
|
424
424
|
New Arrival
|
|
425
425
|
</span>
|
|
@@ -437,8 +437,8 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
437
437
|
type="button"
|
|
438
438
|
onClick={() => setActiveImageIndex(index)}
|
|
439
439
|
className={`relative aspect-square overflow-hidden rounded-lg border-2 transition-all ${activeImageIndex === index
|
|
440
|
-
? 'border-
|
|
441
|
-
: 'border-slate-200 hover:border-
|
|
440
|
+
? 'border-hprimary-50 ring-2 ring-hprimary-80 ring-offset-2 shadow-md'
|
|
441
|
+
: 'border-slate-200 hover:border-hprimary-50'
|
|
442
442
|
}`}
|
|
443
443
|
>
|
|
444
444
|
<Image
|
|
@@ -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="font-['Poppins',sans-serif] text-[12px] text-
|
|
464
|
+
<p className="font-['Poppins',sans-serif] 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-['Poppins',sans-serif] font-semibold text-
|
|
467
|
+
<h1 className="text-3xl font-['Poppins',sans-serif] font-semibold text-hsecondary tracking-[-1.5px] mb-3">
|
|
468
468
|
{selectedVariant?.name || product.name}
|
|
469
469
|
</h1>
|
|
470
470
|
{/* Rating */}
|
|
@@ -480,7 +480,7 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
480
480
|
/>
|
|
481
481
|
))}
|
|
482
482
|
</div>
|
|
483
|
-
<span className="font-['Poppins',sans-serif] text-[14px] text-
|
|
483
|
+
<span className="font-['Poppins',sans-serif] text-[14px] text-hmuted">
|
|
484
484
|
{reviewStats.averageRating} ({reviewStats.reviewCount} {reviewStats.reviewCount === 1 ? 'review' : 'reviews'})
|
|
485
485
|
</span>
|
|
486
486
|
</div>
|
|
@@ -491,7 +491,7 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
491
491
|
</span>
|
|
492
492
|
{variantComparePrice && variantComparePrice > variantPrice && (
|
|
493
493
|
<>
|
|
494
|
-
<span className="font-['Poppins',sans-serif] text-[24px] text-
|
|
494
|
+
<span className="font-['Poppins',sans-serif] text-[24px] text-hmuted line-through">
|
|
495
495
|
${variantComparePrice.toFixed(2)}
|
|
496
496
|
</span>
|
|
497
497
|
<div className="px-3 py-1 rounded-full bg-[#E67E50]/10">
|
|
@@ -516,8 +516,8 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
516
516
|
</>
|
|
517
517
|
) : selectedVariant.inventoryStatus === ProductVariantInventoryStatusEnum.LOWSTOCK || selectedVariant.inventoryCount <= 10 ? (
|
|
518
518
|
<>
|
|
519
|
-
<div className="size-3 rounded-full bg-
|
|
520
|
-
<span className="font-['Poppins',sans-serif] text-[13px] text-
|
|
519
|
+
<div className="size-3 rounded-full bg-hprimary animate-pulse" />
|
|
520
|
+
<span className="font-['Poppins',sans-serif] text-[13px] text-hprimary font-medium">
|
|
521
521
|
Only {selectedVariant.inventoryCount} left in stock - Order soon!
|
|
522
522
|
</span>
|
|
523
523
|
</>
|
|
@@ -531,7 +531,7 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
531
531
|
)}
|
|
532
532
|
|
|
533
533
|
</div>
|
|
534
|
-
<p className="font-['Poppins',sans-serif] text-[12px] text-
|
|
534
|
+
<p className="font-['Poppins',sans-serif] 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="font-['Poppins',sans-serif] text-[14px] text-
|
|
543
|
+
className="font-['Poppins',sans-serif] 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-['Poppins',sans-serif] font-semibold text-[14px] text-
|
|
551
|
+
<h3 className="font-['Poppins',sans-serif] font-semibold text-[14px] text-hsecondary mb-3">
|
|
552
552
|
Select Variant
|
|
553
553
|
</h3>
|
|
554
554
|
<div className="flex flex-wrap gap-3">
|
|
@@ -564,11 +564,11 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
564
564
|
type="button"
|
|
565
565
|
onClick={() => handleVariantSelect(variant)}
|
|
566
566
|
className={`flex items-start gap-3 px-4 py-2.5 rounded-xl border-2 transition-all ${isSelected
|
|
567
|
-
? 'border-
|
|
568
|
-
: 'border-gray-200 hover:border-
|
|
567
|
+
? 'border-hprimary bg-hprimary-5'
|
|
568
|
+
: 'border-gray-200 hover:border-hprimary-50'
|
|
569
569
|
}`}
|
|
570
570
|
>
|
|
571
|
-
<div className={`relative h-12 w-12 shrink-0 overflow-hidden rounded-full border-2 ${isSelected ? 'border-
|
|
571
|
+
<div className={`relative h-12 w-12 shrink-0 overflow-hidden rounded-full border-2 ${isSelected ? 'border-hprimary' : 'border-slate-200'}`}>
|
|
572
572
|
<Image
|
|
573
573
|
src={variantImage}
|
|
574
574
|
alt={variant.name || 'Variant image'}
|
|
@@ -578,7 +578,7 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
578
578
|
/>
|
|
579
579
|
</div>
|
|
580
580
|
<div className="flex-1">
|
|
581
|
-
<p className={`text-start text-sm font-medium ${isSelected ? 'text-
|
|
581
|
+
<p className={`text-start text-sm font-medium ${isSelected ? 'text-hsecondary' : 'text-slate-900'}`}>
|
|
582
582
|
{variant.name}
|
|
583
583
|
</p>
|
|
584
584
|
{variant.sku && (
|
|
@@ -586,7 +586,7 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
586
586
|
)}
|
|
587
587
|
</div>
|
|
588
588
|
{isSelected && (
|
|
589
|
-
<Check className="h-5 w-5 text-
|
|
589
|
+
<Check className="h-5 w-5 text-hsecondary shrink-0" />
|
|
590
590
|
)}
|
|
591
591
|
</button>
|
|
592
592
|
);
|
|
@@ -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-['Poppins',sans-serif] font-semibold text-[14px] text-
|
|
601
|
+
<h3 className="font-['Poppins',sans-serif] 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-['Poppins',sans-serif] font-bold text-[18px] text-
|
|
611
|
+
className="font-['Poppins',sans-serif] 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-['Poppins',sans-serif] font-semibold text-[16px] text-
|
|
616
|
+
<span className="font-['Poppins',sans-serif] 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-['Poppins',sans-serif] font-bold text-[18px] text-
|
|
622
|
+
className="font-['Poppins',sans-serif] font-bold text-[18px] text-hsecondary hover:text-hprimary transition-colors disabled:opacity-50"
|
|
623
623
|
>
|
|
624
624
|
+
|
|
625
625
|
</button>
|
|
@@ -660,64 +660,64 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
660
660
|
)
|
|
661
661
|
}
|
|
662
662
|
</button>
|
|
663
|
-
<button className="sm:w-auto px-6 py-4 rounded-full border-2 border-
|
|
663
|
+
<button className="sm:w-auto px-6 py-4 rounded-full border-2 border-hprimary hover:bg-hprimary-5 transition-all flex items-center justify-center"
|
|
664
664
|
onClick={handleToggleFavorite}>
|
|
665
|
-
<Heart className={`h-4 w-4 ${isFavorited ? 'fill-red-500 text-red-500' : 'text-
|
|
665
|
+
<Heart className={`h-4 w-4 ${isFavorited ? 'fill-red-500 text-red-500' : 'text-hprimary'}`} />
|
|
666
666
|
</button>
|
|
667
667
|
</div>
|
|
668
668
|
|
|
669
669
|
</div>
|
|
670
670
|
|
|
671
671
|
{/* Benefits */}
|
|
672
|
-
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4 p-6 bg-linear-to-br from-
|
|
672
|
+
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4 p-6 bg-linear-to-br from-hsecondary/5 to-hsecondary/5 rounded-[24px]">
|
|
673
673
|
<div className="flex items-start gap-3">
|
|
674
674
|
<div className="size-10 rounded-full bg-white flex items-center justify-center shrink-0">
|
|
675
|
-
<Truck className="size-5 text-
|
|
675
|
+
<Truck className="size-5 text-hprimary" />
|
|
676
676
|
</div>
|
|
677
677
|
<div>
|
|
678
|
-
<p className="font-['Poppins',sans-serif] font-semibold text-[12px] text-
|
|
678
|
+
<p className="font-['Poppins',sans-serif] font-semibold text-[12px] text-hsecondary mb-1">
|
|
679
679
|
Free Shipping
|
|
680
680
|
</p>
|
|
681
|
-
<p className="font-['Poppins',sans-serif] text-[11px] text-
|
|
681
|
+
<p className="font-['Poppins',sans-serif] text-[11px] text-hmuted">
|
|
682
682
|
On all orders
|
|
683
683
|
</p>
|
|
684
684
|
</div>
|
|
685
685
|
</div>
|
|
686
686
|
<div className="flex items-start gap-3">
|
|
687
687
|
<div className="size-10 rounded-full bg-white flex items-center justify-center shrink-0">
|
|
688
|
-
<RotateCcw className="size-5 text-
|
|
688
|
+
<RotateCcw className="size-5 text-hprimary" />
|
|
689
689
|
</div>
|
|
690
690
|
<div>
|
|
691
|
-
<p className="font-['Poppins',sans-serif] font-semibold text-[12px] text-
|
|
691
|
+
<p className="font-['Poppins',sans-serif] font-semibold text-[12px] text-hsecondary mb-1">
|
|
692
692
|
Easy Returns
|
|
693
693
|
</p>
|
|
694
|
-
<p className="font-['Poppins',sans-serif] text-[11px] text-
|
|
694
|
+
<p className="font-['Poppins',sans-serif] text-[11px] text-hmuted">
|
|
695
695
|
30-day return policy
|
|
696
696
|
</p>
|
|
697
697
|
</div>
|
|
698
698
|
</div>
|
|
699
699
|
<div className="flex items-start gap-3">
|
|
700
700
|
<div className="size-10 rounded-full bg-white flex items-center justify-center shrink-0">
|
|
701
|
-
<Shield className="size-5 text-
|
|
701
|
+
<Shield className="size-5 text-hprimary" />
|
|
702
702
|
</div>
|
|
703
703
|
<div>
|
|
704
|
-
<p className="font-['Poppins',sans-serif] font-semibold text-[12px] text-
|
|
704
|
+
<p className="font-['Poppins',sans-serif] font-semibold text-[12px] text-hsecondary mb-1">
|
|
705
705
|
Secure Checkout
|
|
706
706
|
</p>
|
|
707
|
-
<p className="font-['Poppins',sans-serif] text-[11px] text-
|
|
707
|
+
<p className="font-['Poppins',sans-serif] text-[11px] text-hmuted">
|
|
708
708
|
Safe & protected
|
|
709
709
|
</p>
|
|
710
710
|
</div>
|
|
711
711
|
</div>
|
|
712
712
|
<div className="flex items-start gap-3">
|
|
713
713
|
<div className="size-10 rounded-full bg-white flex items-center justify-center shrink-0">
|
|
714
|
-
<Package className="size-5 text-
|
|
714
|
+
<Package className="size-5 text-hprimary" />
|
|
715
715
|
</div>
|
|
716
716
|
<div>
|
|
717
|
-
<p className="font-['Poppins',sans-serif] font-semibold text-[12px] text-
|
|
717
|
+
<p className="font-['Poppins',sans-serif] font-semibold text-[12px] text-hsecondary mb-1">
|
|
718
718
|
Quality Guaranteed
|
|
719
719
|
</p>
|
|
720
|
-
<p className="font-['Poppins',sans-serif] text-[11px] text-
|
|
720
|
+
<p className="font-['Poppins',sans-serif] text-[11px] text-hmuted">
|
|
721
721
|
Premium materials
|
|
722
722
|
</p>
|
|
723
723
|
</div>
|
|
@@ -735,8 +735,8 @@ export function ProductDetailScreen({ productId }: ProductDetailScreenProps) {
|
|
|
735
735
|
key={tab}
|
|
736
736
|
onClick={() => setActiveTab(tab)}
|
|
737
737
|
className={`font-['Poppins',sans-serif] font-medium text-[14px] px-6 py-4 transition-all ${activeTab === tab
|
|
738
|
-
? 'text-
|
|
739
|
-
: 'text-
|
|
738
|
+
? 'text-hprimary border-b-2 border-hprimary -mb-0.5'
|
|
739
|
+
: 'text-hmuted hover:text-hprimary'
|
|
740
740
|
}`}
|
|
741
741
|
>
|
|
742
742
|
{tab.charAt(0).toUpperCase() + tab.slice(1)}
|
|
@@ -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-['Poppins',sans-serif] font-semibold text-
|
|
750
|
+
<h3 className="font-['Poppins',sans-serif] font-semibold text-hsecondary mb-4">
|
|
751
751
|
Product Description
|
|
752
752
|
</h3>
|
|
753
753
|
<div
|
|
754
|
-
className="font-['Poppins',sans-serif] text-[14px] text-
|
|
754
|
+
className="font-['Poppins',sans-serif] 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-['Poppins',sans-serif] font-semibold text-[13px] text-
|
|
759
|
+
<h4 className="font-['Poppins',sans-serif] font-semibold text-[13px] text-hsecondary mb-3">
|
|
760
760
|
Last updated:
|
|
761
761
|
</h4>
|
|
762
|
-
<p className="font-['Poppins',sans-serif] text-[14px] text-
|
|
762
|
+
<p className="font-['Poppins',sans-serif] 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-['Poppins',sans-serif] font-semibold text-[13px] text-
|
|
769
|
+
<h4 className="font-['Poppins',sans-serif] font-semibold text-[13px] text-hsecondary mb-3">
|
|
770
770
|
Shipped from:
|
|
771
771
|
</h4>
|
|
772
|
-
<p className="font-['Poppins',sans-serif] text-[14px] text-
|
|
772
|
+
<p className="font-['Poppins',sans-serif] 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-['Poppins',sans-serif] font-semibold text-
|
|
789
|
+
<h2 className="font-['Poppins',sans-serif] 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">
|
|
@@ -98,8 +98,8 @@ export default function AccountPage() {
|
|
|
98
98
|
<div className="container mx-auto px-4 py-4">
|
|
99
99
|
<div className="flex items-center justify-between">
|
|
100
100
|
<div>
|
|
101
|
-
<h1 className="text-2xl font-semibold text-
|
|
102
|
-
<p className="text-sm text-
|
|
101
|
+
<h1 className="text-2xl font-semibold text-hsecondary">My Account</h1>
|
|
102
|
+
<p className="text-sm text-hmuted">
|
|
103
103
|
Manage your profile, orders, and preferences
|
|
104
104
|
</p>
|
|
105
105
|
</div>
|
|
@@ -98,9 +98,9 @@ export function RegisterScreen() {
|
|
|
98
98
|
>
|
|
99
99
|
<div className="w-full max-w-xl space-y-10 text-center">
|
|
100
100
|
<div className="space-y-2">
|
|
101
|
-
<UserPlus strokeWidth={2} className='h-16 w-16 mx-auto text-white rounded-full bg-
|
|
102
|
-
<h2 className="text-4xl text-
|
|
103
|
-
<p className="text-sm text-
|
|
101
|
+
<UserPlus strokeWidth={2} className='h-16 w-16 mx-auto text-white rounded-full bg-hprimary m-2 mb-4 px-4' />
|
|
102
|
+
<h2 className="text-4xl text-hsecondary">Create Your Account</h2>
|
|
103
|
+
<p className="text-sm text-hmuted">Join Holmdel Pharmacy Care for convenient healthcare access
|
|
104
104
|
</p>
|
|
105
105
|
</div>
|
|
106
106
|
|
|
@@ -113,7 +113,7 @@ export function RegisterScreen() {
|
|
|
113
113
|
>
|
|
114
114
|
<div className="grid gap-4 md:grid-cols-2 text-start">
|
|
115
115
|
<div>
|
|
116
|
-
<h2 className="text-sm text-
|
|
116
|
+
<h2 className="text-sm text-hsecondary mb-3">First name <span className='text-hprimary-500'>*</span></h2>
|
|
117
117
|
<Input
|
|
118
118
|
placeholder="Alex"
|
|
119
119
|
{...register('firstname')}
|
|
@@ -121,7 +121,7 @@ export function RegisterScreen() {
|
|
|
121
121
|
/>
|
|
122
122
|
</div>
|
|
123
123
|
<div>
|
|
124
|
-
<h2 className="text-sm text-
|
|
124
|
+
<h2 className="text-sm text-hsecondary mb-3">Last name <span className='text-hprimary-500'>*</span></h2>
|
|
125
125
|
<Input
|
|
126
126
|
placeholder="Morgan"
|
|
127
127
|
{...register('lastname')}
|
|
@@ -130,7 +130,7 @@ export function RegisterScreen() {
|
|
|
130
130
|
</div>
|
|
131
131
|
</div>
|
|
132
132
|
<div>
|
|
133
|
-
<h2 className="text-sm text-
|
|
133
|
+
<h2 className="text-sm text-hsecondary mb-3">Email Address <span className='text-hprimary-500'>*</span></h2>
|
|
134
134
|
<Input
|
|
135
135
|
type="email"
|
|
136
136
|
placeholder="you@example.com"
|
|
@@ -139,7 +139,7 @@ export function RegisterScreen() {
|
|
|
139
139
|
/>
|
|
140
140
|
</div>
|
|
141
141
|
<div>
|
|
142
|
-
<h2 className="text-sm text-
|
|
142
|
+
<h2 className="text-sm text-hsecondary mb-3">Phone Number</h2>
|
|
143
143
|
<Input
|
|
144
144
|
type="tel"
|
|
145
145
|
placeholder="+1 (555) 123-4567"
|
|
@@ -149,7 +149,7 @@ export function RegisterScreen() {
|
|
|
149
149
|
</div>
|
|
150
150
|
<div className="relative">
|
|
151
151
|
|
|
152
|
-
<h2 className="text-sm text-
|
|
152
|
+
<h2 className="text-sm text-hsecondary mb-3">Password <span className='text-hprimary-500'>*</span></h2>
|
|
153
153
|
<Input
|
|
154
154
|
type={showPassword ? 'text' : 'password'}
|
|
155
155
|
placeholder="••••••••"
|
|
@@ -165,7 +165,7 @@ export function RegisterScreen() {
|
|
|
165
165
|
</button>
|
|
166
166
|
</div>
|
|
167
167
|
<div className="relative">
|
|
168
|
-
<h2 className="text-sm text-
|
|
168
|
+
<h2 className="text-sm text-hsecondary mb-3">Confirm Password <span className='text-hprimary-500'>*</span></h2>
|
|
169
169
|
<Input
|
|
170
170
|
type={showConfirmPassword ? 'text' : 'password'}
|
|
171
171
|
placeholder="••••••••"
|
|
@@ -182,16 +182,16 @@ export function RegisterScreen() {
|
|
|
182
182
|
</div>
|
|
183
183
|
|
|
184
184
|
<div className="flex items-start gap-3 rounded-2xl bg-slate-50 p-4 text-sm text-slate-600">
|
|
185
|
-
<Shield strokeWidth={2} className="mt-0.5 h-8 w-8 text-
|
|
185
|
+
<Shield strokeWidth={2} className="mt-0.5 h-8 w-8 text-hprimary" />
|
|
186
186
|
<span>
|
|
187
187
|
By creating an account, you agree to our{' '}
|
|
188
|
-
<Link href={buildPath('/terms')} className="font-semibold text-
|
|
188
|
+
<Link href={buildPath('/terms')} className="font-semibold text-hprimary hover:opacity-70">
|
|
189
189
|
Terms of Service
|
|
190
190
|
</Link>{' '}
|
|
191
191
|
and{' '}
|
|
192
192
|
<Link
|
|
193
193
|
href={buildPath('/privacy')}
|
|
194
|
-
className="font-semibold text-
|
|
194
|
+
className="font-semibold text-hprimary hover:opacity-70"
|
|
195
195
|
>
|
|
196
196
|
Privacy Policy
|
|
197
197
|
</Link>
|
|
@@ -202,7 +202,7 @@ export function RegisterScreen() {
|
|
|
202
202
|
<button
|
|
203
203
|
type="submit"
|
|
204
204
|
disabled={isSubmitting}
|
|
205
|
-
className="w-full bg-
|
|
205
|
+
className="w-full bg-hsecondary hover:opacity-80 text-white font-medium py-3 px-4 rounded-lg transition-colors disabled:opacity-70 disabled:cursor-not-allowed"
|
|
206
206
|
>
|
|
207
207
|
{isSubmitting ? 'Creating account...' : 'Create my account'}
|
|
208
208
|
</button>
|
|
@@ -210,7 +210,7 @@ export function RegisterScreen() {
|
|
|
210
210
|
|
|
211
211
|
{/* <div className="rounded-3xl border border-slate-100 bg-slate-50 p-6 text-sm text-slate-600">
|
|
212
212
|
<div className="flex items-start gap-3">
|
|
213
|
-
<Heart className="mt-0.5 h-5 w-5 text-
|
|
213
|
+
<Heart className="mt-0.5 h-5 w-5 text-hprimary-500" />
|
|
214
214
|
<div>
|
|
215
215
|
<p className="font-semibold text-slate-800">Members love us</p>
|
|
216
216
|
<p>
|
|
@@ -222,7 +222,7 @@ export function RegisterScreen() {
|
|
|
222
222
|
</div> */}
|
|
223
223
|
|
|
224
224
|
<div className="mt-4">
|
|
225
|
-
<p className="text-
|
|
225
|
+
<p className="text-hmuted">Already have an account? <Link href={buildPath('/login')} className="font-medium text-hprimary transition hover:opacity-90">Sign in</Link></p>
|
|
226
226
|
</div>
|
|
227
227
|
</div>
|
|
228
228
|
</motion.section>
|
|
@@ -107,10 +107,10 @@ export function ResetPasswordScreen() {
|
|
|
107
107
|
<div className="space-y-2">
|
|
108
108
|
<Lock
|
|
109
109
|
strokeWidth={2}
|
|
110
|
-
className="h-16 w-16 mx-auto text-white rounded-full bg-
|
|
110
|
+
className="h-16 w-16 mx-auto text-white rounded-full bg-hsecondary m-2 mb-4 px-4"
|
|
111
111
|
/>
|
|
112
|
-
<h2 className="text-4xl text-
|
|
113
|
-
<p className="text-sm text-
|
|
112
|
+
<h2 className="text-4xl text-hsecondary">Reset Password</h2>
|
|
113
|
+
<p className="text-sm text-hmuted">
|
|
114
114
|
Enter your new password below to reset your account password.
|
|
115
115
|
</p>
|
|
116
116
|
</div>
|
|
@@ -134,16 +134,16 @@ export function ResetPasswordScreen() {
|
|
|
134
134
|
</div>
|
|
135
135
|
)}
|
|
136
136
|
|
|
137
|
-
<div className="relative text-start text-
|
|
138
|
-
<h2 className="text-sm text-
|
|
139
|
-
New Password <span className="text-
|
|
137
|
+
<div className="relative text-start text-hsecondary">
|
|
138
|
+
<h2 className="text-sm text-hsecondary mb-3">
|
|
139
|
+
New Password <span className="text-hprimary-500">*</span>
|
|
140
140
|
</h2>
|
|
141
141
|
<Input
|
|
142
142
|
type={showPassword ? 'text' : 'password'}
|
|
143
143
|
placeholder="Enter new password (min. 8 characters)"
|
|
144
144
|
{...register('newPassword')}
|
|
145
145
|
error={errors.newPassword?.message}
|
|
146
|
-
className="text-
|
|
146
|
+
className="text-hsecondary"
|
|
147
147
|
/>
|
|
148
148
|
<button
|
|
149
149
|
type="button"
|
|
@@ -154,16 +154,16 @@ export function ResetPasswordScreen() {
|
|
|
154
154
|
</button>
|
|
155
155
|
</div>
|
|
156
156
|
|
|
157
|
-
<div className="relative text-start text-
|
|
158
|
-
<h2 className="text-sm text-
|
|
159
|
-
Confirm Password <span className="text-
|
|
157
|
+
<div className="relative text-start text-hsecondary">
|
|
158
|
+
<h2 className="text-sm text-hsecondary mb-3">
|
|
159
|
+
Confirm Password <span className="text-hprimary-500">*</span>
|
|
160
160
|
</h2>
|
|
161
161
|
<Input
|
|
162
162
|
type={showConfirmPassword ? 'text' : 'password'}
|
|
163
163
|
placeholder="Re-enter new password"
|
|
164
164
|
{...register('confirmPassword')}
|
|
165
165
|
error={errors.confirmPassword?.message}
|
|
166
|
-
className="text-
|
|
166
|
+
className="text-hsecondary"
|
|
167
167
|
/>
|
|
168
168
|
<button
|
|
169
169
|
type="button"
|
|
@@ -181,20 +181,20 @@ export function ResetPasswordScreen() {
|
|
|
181
181
|
<button
|
|
182
182
|
type="submit"
|
|
183
183
|
disabled={isSubmitting || !token}
|
|
184
|
-
className="w-full bg-
|
|
184
|
+
className="w-full bg-hsecondary hover:opacity-80 text-white font-medium py-3 px-4 rounded-lg transition-colors disabled:opacity-70 disabled:cursor-not-allowed"
|
|
185
185
|
>
|
|
186
186
|
{isSubmitting ? 'Resetting Password...' : 'Reset Password'}
|
|
187
187
|
</button>
|
|
188
188
|
|
|
189
189
|
<div className="flex items-center gap-2 rounded-2xl border border-slate-200 bg-slate-50 px-4 py-3 text-sm text-slate-600">
|
|
190
|
-
<ShieldCheck className="h-4 w-4 text-
|
|
190
|
+
<ShieldCheck className="h-4 w-4 text-hprimary-600" />
|
|
191
191
|
Use a strong password that you haven't used elsewhere.
|
|
192
192
|
</div>
|
|
193
193
|
|
|
194
194
|
<div className="pt-4 border-t border-slate-200">
|
|
195
195
|
<Link
|
|
196
196
|
href={buildPath('/login')}
|
|
197
|
-
className="text-sm font-medium text-
|
|
197
|
+
className="text-sm font-medium text-hprimary transition hover:opacity-80"
|
|
198
198
|
>
|
|
199
199
|
Back to login
|
|
200
200
|
</Link>
|
|
@@ -214,7 +214,7 @@ export default function SearchPage() {
|
|
|
214
214
|
onFocus={handleInputFocus}
|
|
215
215
|
onBlur={() => setTimeout(() => setShowSuggestions(false), 200)}
|
|
216
216
|
placeholder="Search for products..."
|
|
217
|
-
className="pl-10 pr-10 py-6 text-base rounded-lg border-gray-300 focus:ring-2 focus:ring-
|
|
217
|
+
className="pl-10 pr-10 py-6 text-base rounded-lg border-gray-300 focus:ring-2 focus:ring-hprimary-500 focus:border-hprimary-500"
|
|
218
218
|
autoComplete="off"
|
|
219
219
|
/>
|
|
220
220
|
{searchInput && (
|
|
@@ -251,7 +251,7 @@ export default function SearchPage() {
|
|
|
251
251
|
onClick={() => handleSuggestionClick(suggestion)}
|
|
252
252
|
className="w-full text-left px-3 py-2.5 hover:bg-gray-50 rounded-md transition-colors flex items-center gap-2 group"
|
|
253
253
|
>
|
|
254
|
-
<Search className="h-4 w-4 text-gray-400 group-hover:text-
|
|
254
|
+
<Search className="h-4 w-4 text-gray-400 group-hover:text-hprimary-500" />
|
|
255
255
|
<span className="text-sm text-gray-700 group-hover:text-gray-900">
|
|
256
256
|
{suggestion}
|
|
257
257
|
</span>
|
|
@@ -274,7 +274,7 @@ export default function SearchPage() {
|
|
|
274
274
|
onClick={() => handleSuggestionClick(search)}
|
|
275
275
|
className="w-full text-left px-3 py-2.5 hover:bg-gray-50 rounded-md transition-colors flex items-center gap-2 group"
|
|
276
276
|
>
|
|
277
|
-
<Clock className="h-4 w-4 text-gray-400 group-hover:text-
|
|
277
|
+
<Clock className="h-4 w-4 text-gray-400 group-hover:text-hprimary-500" />
|
|
278
278
|
<span className="text-sm text-gray-700 group-hover:text-gray-900">
|
|
279
279
|
{search}
|
|
280
280
|
</span>
|
|
@@ -288,7 +288,7 @@ export default function SearchPage() {
|
|
|
288
288
|
</div>
|
|
289
289
|
<button
|
|
290
290
|
type="submit"
|
|
291
|
-
className="mt-4 w-full bg-
|
|
291
|
+
className="mt-4 w-full bg-hprimary-600 hover:bg-hprimary-700 text-white font-medium py-2 px-4 rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
292
292
|
disabled={!searchInput.trim()}
|
|
293
293
|
>
|
|
294
294
|
Search
|
|
@@ -346,7 +346,7 @@ export default function SearchPage() {
|
|
|
346
346
|
|
|
347
347
|
<Link
|
|
348
348
|
href={buildPath('/shop')}
|
|
349
|
-
className="px-6 py-2.5 bg-
|
|
349
|
+
className="px-6 py-2.5 bg-hprimary-600 text-white rounded-lg hover:bg-hprimary-700 transition-colors font-medium"
|
|
350
350
|
>
|
|
351
351
|
Browse All Products
|
|
352
352
|
</Link>
|
|
@@ -371,8 +371,8 @@ export default function SearchPage() {
|
|
|
371
371
|
</div>
|
|
372
372
|
) : (
|
|
373
373
|
<div className="text-center py-12">
|
|
374
|
-
<div className="w-16 h-16 bg-
|
|
375
|
-
<Search className="h-8 w-8 text-
|
|
374
|
+
<div className="w-16 h-16 bg-hprimary-50 rounded-full flex items-center justify-center mx-auto mb-4">
|
|
375
|
+
<Search className="h-8 w-8 text-hprimary-500" />
|
|
376
376
|
</div>
|
|
377
377
|
<h3 className="text-xl font-semibold text-gray-900 mb-2">
|
|
378
378
|
Start Searching
|