hey-pharmacist-ecommerce 1.1.41 → 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 +576 -615
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +576 -612
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/components/AccountAddressesTab.tsx +9 -9
- package/src/components/AccountOrdersTab.tsx +11 -11
- package/src/components/AccountOverviewTab.tsx +26 -26
- 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 +15 -15
- package/src/components/FilterChips.tsx +7 -7
- package/src/components/Footer.tsx +9 -9
- package/src/components/Header.tsx +7 -7
- package/src/components/Notification.tsx +3 -3
- 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 +13 -13
- package/src/components/QuickViewModal.tsx +28 -28
- package/src/components/ReviewCard.tsx +6 -6
- 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/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/providers/ThemeProvider.tsx +2 -2
- package/src/screens/AddressesScreen.tsx +6 -6
- package/src/screens/CartScreen.tsx +23 -23
- package/src/screens/ChangePasswordScreen.tsx +2 -2
- package/src/screens/CheckoutScreen.tsx +28 -28
- 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 +59 -59
- 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 +55 -55
- package/src/screens/WishlistScreen.tsx +22 -22
- package/src/styles/globals.css +43 -43
- 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
|
@@ -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
|
|
@@ -664,22 +664,22 @@ 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">
|
|
676
|
-
<Search className="absolute left-3 top-1/2 -translate-y-1/2 size-4 text-
|
|
676
|
+
<Search className="absolute left-3 top-1/2 -translate-y-1/2 size-4 text-hmuted" />
|
|
677
677
|
<input
|
|
678
678
|
type="text"
|
|
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-
|
|
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,13 +690,13 @@ 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 ? (
|
|
697
|
-
<ChevronDown className={`size-4 text-
|
|
697
|
+
<ChevronDown className={`size-4 text-hmuted transition-transform ${expandedFilterSections.category ? 'rotate-180' : ''}`} />
|
|
698
698
|
) : (
|
|
699
|
-
<ChevronDown className={`size-4 text-
|
|
699
|
+
<ChevronDown className={`size-4 text-hmuted transition-transform ${expandedFilterSections.category ? 'rotate-180' : ''}`} />
|
|
700
700
|
)}
|
|
701
701
|
</button>
|
|
702
702
|
{expandedFilterSections.category && (
|
|
@@ -713,9 +713,9 @@ 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
|
|
717
|
-
? 'bg-
|
|
718
|
-
: 'text-
|
|
716
|
+
className={`w-full text-left px-4 py-3 rounded-xl text-[13px] transition-all flex items-center gap-3 ${isCategoryActive
|
|
717
|
+
? 'bg-hprimary text-white shadow-lg'
|
|
718
|
+
: 'text-hsecondary hover:bg-gray-50 border-2 border-gray-100'
|
|
719
719
|
}`}
|
|
720
720
|
>
|
|
721
721
|
<Icon className="size-4" />
|
|
@@ -733,10 +733,10 @@ 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
|
-
<ChevronDown className={`size-4 text-
|
|
739
|
+
<ChevronDown className={`size-4 text-hmuted transition-transform ${expandedFilterSections.brand ? 'rotate-180' : ''}`} />
|
|
740
740
|
</button>
|
|
741
741
|
{expandedFilterSections.brand && (
|
|
742
742
|
<div className="space-y-2">
|
|
@@ -748,9 +748,9 @@ 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
|
|
752
|
-
? 'bg-
|
|
753
|
-
: 'text-
|
|
751
|
+
className={`w-full text-left px-4 py-3 rounded-xl text-[13px] transition-all ${isSelected
|
|
752
|
+
? 'bg-hprimary text-white shadow-lg'
|
|
753
|
+
: 'text-hsecondary hover:bg-gray-50 border-2 border-gray-100'
|
|
754
754
|
}`}
|
|
755
755
|
>
|
|
756
756
|
{brand}
|
|
@@ -769,18 +769,18 @@ 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
|
-
<ChevronDown className={`size-4 text-
|
|
775
|
+
<ChevronDown className={`size-4 text-hmuted transition-transform ${expandedFilterSections.availability ? 'rotate-180' : ''}`} />
|
|
776
776
|
</button>
|
|
777
777
|
{expandedFilterSections.availability && (
|
|
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
|
|
782
|
-
? 'bg-
|
|
783
|
-
: 'text-
|
|
781
|
+
className={`w-full flex items-center justify-between px-4 py-3 rounded-xl text-[13px] transition-all border-2 ${inStockOnly
|
|
782
|
+
? 'bg-hprimary text-white shadow-lg'
|
|
783
|
+
: 'text-hsecondary hover:bg-gray-50 border-2 border-gray-100'
|
|
784
784
|
}`}
|
|
785
785
|
>
|
|
786
786
|
In Stock Only
|
|
@@ -794,10 +794,10 @@ 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
|
-
<ChevronDown className={`size-4 text-
|
|
800
|
+
<ChevronDown className={`size-4 text-hmuted transition-transform ${expandedFilterSections.price ? 'rotate-180' : ''}`} />
|
|
801
801
|
</button>
|
|
802
802
|
{expandedFilterSections.price && (
|
|
803
803
|
<div className="space-y-2">
|
|
@@ -809,9 +809,9 @@ 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
|
|
813
|
-
? 'bg-
|
|
814
|
-
: 'text-
|
|
812
|
+
className={`w-full flex items-center justify-between px-4 py-3 rounded-xl text-[13px] transition-all border-2 ${isActive
|
|
813
|
+
? 'bg-hprimary text-white shadow-lg'
|
|
814
|
+
: 'text-hsecondary hover:bg-gray-50 border-2 border-gray-100'
|
|
815
815
|
}`}
|
|
816
816
|
>
|
|
817
817
|
{range.label}
|
|
@@ -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-
|
|
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,14 +838,14 @@ 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-
|
|
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
|
|
845
845
|
type="button"
|
|
846
846
|
onClick={applyCustomPrice}
|
|
847
847
|
disabled={!isCustomPriceDirty}
|
|
848
|
-
className="w-full rounded-lg border border-
|
|
848
|
+
className="w-full rounded-lg border border-hprimary bg-hprimary-10 px-4 py-2 text-sm font-medium text-hprimary transition hover:bg-hprimary-20 disabled:cursor-not-allowed disabled:border-slate-200 disabled:text-slate-400"
|
|
849
849
|
>
|
|
850
850
|
Apply
|
|
851
851
|
</button>
|
|
@@ -878,7 +878,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
878
878
|
return (
|
|
879
879
|
<div className="min-h-screen bg-[#F9FAFB]">
|
|
880
880
|
{/* Header Section */}
|
|
881
|
-
<section className="relative overflow-hidden bg-
|
|
881
|
+
<section className="relative overflow-hidden bg-hprimary-bg py-16 md:py-24">
|
|
882
882
|
<div className="container mx-auto px-4">
|
|
883
883
|
<motion.div
|
|
884
884
|
initial={{ opacity: 0, y: 24 }}
|
|
@@ -887,8 +887,8 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
887
887
|
>
|
|
888
888
|
{/* Orange icon and badge */}
|
|
889
889
|
<div className="flex items-center justify-center gap-2 mb-4">
|
|
890
|
-
<Star className="h-5 w-5 text-
|
|
891
|
-
<span className="text-sm font-semibold uppercase tracking-wider text-
|
|
890
|
+
<Star className="h-5 w-5 text-hprimary fill-primary" />
|
|
891
|
+
<span className="text-sm font-semibold uppercase tracking-wider text-hprimary">
|
|
892
892
|
COMPLETE PHARMACY SHOP
|
|
893
893
|
</span>
|
|
894
894
|
</div>
|
|
@@ -916,7 +916,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
916
916
|
value={searchQuery}
|
|
917
917
|
onChange={handleInputChange}
|
|
918
918
|
onKeyDown={handleKeyDown}
|
|
919
|
-
className="flex h-16 w-full rounded-full border-0 bg-white px-5 pl-14 pr-5 text-base text-slate-900 placeholder-slate-400 shadow-lg focus:outline-hidden focus:ring-2 focus:ring-
|
|
919
|
+
className="flex h-16 w-full rounded-full border-0 bg-white px-5 pl-14 pr-5 text-base text-slate-900 placeholder-slate-400 shadow-lg focus:outline-hidden focus:ring-2 focus:ring-hprimary-500/30 disabled:opacity-50"
|
|
920
920
|
disabled={isSearching}
|
|
921
921
|
/>
|
|
922
922
|
</div>
|
|
@@ -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">
|
|
@@ -936,23 +936,23 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
936
936
|
onClick={handleClearCategory}
|
|
937
937
|
initial={{ opacity: 0, y: 20 }}
|
|
938
938
|
animate={{ opacity: 1, y: 0 }}
|
|
939
|
-
className={`group relative overflow-hidden rounded-[24px] p-6 min-h-[180px] min-w-[170px] transition-all duration-300 ${!categoryFilter ? 'bg-linear-to-br from-
|
|
940
|
-
: 'bg-linear-to-br from-gray-50 to-white hover:shadow-lg border-2 border-gray-100 hover:border-
|
|
939
|
+
className={`group relative overflow-hidden rounded-[24px] p-6 min-h-[180px] min-w-[170px] transition-all duration-300 ${!categoryFilter ? 'bg-linear-to-br from-hprimary to-hsecondary text-white shadow-xl scale-105'
|
|
940
|
+
: 'bg-linear-to-br from-gray-50 to-white hover:shadow-lg border-2 border-gray-100 hover:border-hprimary'
|
|
941
941
|
}`}
|
|
942
942
|
>
|
|
943
943
|
<div className="relative">
|
|
944
944
|
<div className={`size-12 rounded-full mb-3 mx-auto flex items-center justify-center transition-all ${!categoryFilter
|
|
945
945
|
? 'bg-white/20'
|
|
946
|
-
: 'bg-linear-to-br from-
|
|
946
|
+
: 'bg-linear-to-br from-hprimary-10 to-hsecondary-10 group-hover:scale-110'
|
|
947
947
|
}`}>
|
|
948
|
-
<Package className={`size-6 ${!categoryFilter ? 'text-white' : 'text-
|
|
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>
|
|
@@ -971,23 +971,23 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
971
971
|
animate={{ opacity: 1, y: 0 }}
|
|
972
972
|
transition={{ delay: index * 0.1 }}
|
|
973
973
|
onClick={() => handleCategoryChange(categoryId)}
|
|
974
|
-
className={`group relative overflow-hidden rounded-[24px] p-6 min-h-[180px] min-w-[170px] transition-all duration-300 ${isSelected ? 'bg-linear-to-br from-
|
|
975
|
-
: 'bg-linear-to-br from-gray-50 to-white hover:shadow-lg border-2 border-gray-100 hover:border-
|
|
974
|
+
className={`group relative overflow-hidden rounded-[24px] p-6 min-h-[180px] min-w-[170px] transition-all duration-300 ${isSelected ? 'bg-linear-to-br from-hprimary to-hsecondary text-white shadow-xl scale-105'
|
|
975
|
+
: 'bg-linear-to-br from-gray-50 to-white hover:shadow-lg border-2 border-gray-100 hover:border-hprimary'
|
|
976
976
|
}`}
|
|
977
977
|
>
|
|
978
978
|
<div className="relative">
|
|
979
979
|
<div className={`size-12 rounded-full mb-3 mx-auto flex items-center justify-center transition-all ${isSelected
|
|
980
980
|
? 'bg-white/20'
|
|
981
|
-
: 'bg-linear-to-br from-
|
|
981
|
+
: 'bg-linear-to-br from-hprimary-10 to-hsecondary-10 group-hover:scale-110'
|
|
982
982
|
}`}>
|
|
983
|
-
<Icon className={`size-6 ${isSelected ? 'text-white' : 'text-
|
|
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>
|
|
@@ -1027,7 +1027,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
1027
1027
|
onChange={(event) => {
|
|
1028
1028
|
setSortOption(event.target.value as SortOption);
|
|
1029
1029
|
}}
|
|
1030
|
-
className="appearance-none rounded-full border border-gray-200 bg-white py-2.5 pl-10 pr-9 text-sm font-medium text-gray-700 shadow-xs transition focus:outline-hidden focus:ring-1 focus:ring-
|
|
1030
|
+
className="appearance-none rounded-full border border-gray-200 bg-white py-2.5 pl-10 pr-9 text-sm font-medium text-gray-700 shadow-xs transition focus:outline-hidden focus:ring-1 focus:ring-hsecondary focus:border-hprimary"
|
|
1031
1031
|
>
|
|
1032
1032
|
<option value="featured">Featured products</option>
|
|
1033
1033
|
<option value="price-low-high">Price: low to high</option>
|
|
@@ -1041,7 +1041,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
1041
1041
|
type="button"
|
|
1042
1042
|
onClick={() => setViewMode('grid')}
|
|
1043
1043
|
className={`flex items-center gap-2 rounded-full px-4 py-2 text-sm font-medium transition ${viewMode === 'grid'
|
|
1044
|
-
? 'bg-white text-
|
|
1044
|
+
? 'bg-white text-hprimary shadow-md'
|
|
1045
1045
|
: 'text-gray-500 hover:text-gray-700'
|
|
1046
1046
|
}`}
|
|
1047
1047
|
aria-pressed={viewMode === 'grid'}
|
|
@@ -1052,7 +1052,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
1052
1052
|
type="button"
|
|
1053
1053
|
onClick={() => setViewMode('list')}
|
|
1054
1054
|
className={`flex items-center gap-2 rounded-full px-4 py-2 text-sm font-medium transition ${viewMode === 'list'
|
|
1055
|
-
? 'bg-white text-
|
|
1055
|
+
? 'bg-white text-hprimary shadow-md'
|
|
1056
1056
|
: 'text-gray-500 hover:text-gray-700'
|
|
1057
1057
|
}`}
|
|
1058
1058
|
aria-pressed={viewMode === 'list'}
|
|
@@ -1070,10 +1070,10 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
1070
1070
|
key={chip.key}
|
|
1071
1071
|
type="button"
|
|
1072
1072
|
onClick={chip.onRemove}
|
|
1073
|
-
className="group flex items-center gap-2 rounded-full bg-
|
|
1073
|
+
className="group flex items-center gap-2 rounded-full bg-hprimary-50 px-3 py-1.5 text-sm font-medium text-hprimary-700 transition hover:bg-hprimary-100"
|
|
1074
1074
|
>
|
|
1075
1075
|
{chip.label}
|
|
1076
|
-
<X className="h-4 w-4 text-
|
|
1076
|
+
<X className="h-4 w-4 text-hprimary-500 group-hover:text-hprimary-700" />
|
|
1077
1077
|
</button>
|
|
1078
1078
|
))}
|
|
1079
1079
|
<button
|
|
@@ -1136,7 +1136,7 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
1136
1136
|
</div>
|
|
1137
1137
|
|
|
1138
1138
|
<div className="flex-1 space-y-3">
|
|
1139
|
-
<div className="flex flex-wrap items-center gap-2 text-xs font-semibold uppercase tracking-wide text-
|
|
1139
|
+
<div className="flex flex-wrap items-center gap-2 text-xs font-semibold uppercase tracking-wide text-hprimary-600">
|
|
1140
1140
|
{product.tags?.slice(0, 3).map((tag: string) => (
|
|
1141
1141
|
<span
|
|
1142
1142
|
key={tag}
|
|
@@ -1150,12 +1150,12 @@ export function ShopScreen({ initialFilters = {}, categoryName }: ShopScreenProp
|
|
|
1150
1150
|
{product.name}
|
|
1151
1151
|
</h3>
|
|
1152
1152
|
<div className="flex flex-wrap items-center gap-4 text-sm text-gray-500">
|
|
1153
|
-
<span className="inline-flex items-center gap-2 font-medium text-
|
|
1153
|
+
<span className="inline-flex items-center gap-2 font-medium text-hprimary-600">
|
|
1154
1154
|
<ShieldCheck className="h-4 w-4" />
|
|
1155
1155
|
{displayInventoryCount > 0 ? 'In stock & ready to ship' : 'Restocking soon'}
|
|
1156
1156
|
</span>
|
|
1157
1157
|
<span className="inline-flex items-center gap-2">
|
|
1158
|
-
<Clock className="h-4 w-4 text-
|
|
1158
|
+
<Clock className="h-4 w-4 text-hprimary-500" />
|
|
1159
1159
|
Added {new Date(product.createdAt).toLocaleDateString()}
|
|
1160
1160
|
</span>
|
|
1161
1161
|
</div>
|
|
@@ -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>
|