@codesinger0/shared-components 1.1.85 → 1.1.87

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/components/MasonryItemCard.jsx +1 -1
  2. package/package.json +1 -1
  3. package/dist/components 2/AccessibilityMenu.jsx +0 -474
  4. package/dist/components 2/AdvantagesList.jsx +0 -89
  5. package/dist/components 2/ArticlesList.jsx +0 -269
  6. package/dist/components 2/DualTextCard.jsx +0 -73
  7. package/dist/components 2/FloatingWhatsAppButton.jsx +0 -180
  8. package/dist/components 2/FullscreenCarousel.jsx +0 -292
  9. package/dist/components 2/Hero.jsx +0 -198
  10. package/dist/components 2/IconGrid.jsx +0 -144
  11. package/dist/components 2/IntroSection.jsx +0 -74
  12. package/dist/components 2/LargeItemCard.jsx +0 -267
  13. package/dist/components 2/MasonryItemCard.jsx +0 -247
  14. package/dist/components 2/Menu.d.ts +0 -26
  15. package/dist/components 2/Menu.jsx +0 -268
  16. package/dist/components 2/MyOrdersDisplay.jsx +0 -311
  17. package/dist/components 2/QAAccordion.jsx +0 -212
  18. package/dist/components 2/SmallItemCard.jsx +0 -152
  19. package/dist/components 2/SmallItemsGrid.jsx +0 -313
  20. package/dist/components 2/TextListCards.jsx +0 -107
  21. package/dist/components 2/ToastProvider.jsx +0 -38
  22. package/dist/components 2/UnderConstruction.jsx +0 -76
  23. package/dist/components 2/VideoCard.jsx +0 -88
  24. package/dist/components 2/cart/CartItem.jsx +0 -101
  25. package/dist/components 2/cart/FloatingCartButton.jsx +0 -49
  26. package/dist/components 2/cart/OrderForm.jsx +0 -960
  27. package/dist/components 2/cart/ShoppingCartModal.jsx +0 -229
  28. package/dist/components 2/clubMembership/ClubMembershipModal.jsx +0 -289
  29. package/dist/components 2/clubMembership/ClubPromoModal.jsx +0 -108
  30. package/dist/components 2/elements/CTAButton.jsx +0 -17
  31. package/dist/components 2/elements/FixedWidthHeroVideo.jsx +0 -92
  32. package/dist/components 2/elements/ImageLightbox.jsx +0 -112
  33. package/dist/components 2/elements/RoundButton.jsx +0 -44
  34. package/dist/components 2/elements/SmallButton.jsx +0 -35
  35. package/dist/components 2/elements/Toast.jsx +0 -37
  36. package/dist/components 2/elements/VideoLightbox.jsx +0 -76
  37. package/dist/components 2/modals/ItemDetailsModal.jsx +0 -192
  38. package/dist/components 2/products/CategoryList.jsx +0 -24
  39. package/dist/components 2/products/PriceRangeSlider.jsx +0 -162
  40. package/dist/components 2/products/ProductsDisplay.jsx +0 -40
  41. package/dist/components 2/products/ProductsSidebar.jsx +0 -46
  42. package/dist/components 2/products/SubcategorySection.jsx +0 -37
  43. package/dist/context 2/CartContext.jsx +0 -165
  44. package/dist/context 2/ItemModalContext.jsx +0 -40
  45. package/dist/hooks 2/useScrollLock.js +0 -52
  46. package/dist/index 2.js +0 -45
  47. package/dist/integrations 2/emailService.js +0 -167
  48. package/dist/styles 2/shared-components.css +0 -29
  49. package/dist/utils 2/ScrollManager.jsx +0 -85
  50. package/dist/utils 2/ScrollToTop.jsx +0 -14
@@ -1,229 +0,0 @@
1
- import React, { useEffect, useRef, useState } from 'react';
2
- import { motion, AnimatePresence } from 'framer-motion';
3
- import { X, ShoppingBag } from 'lucide-react';
4
- import { useCart } from '../../context/CartContext';
5
- import CartItem from './CartItem';
6
- import useScrollLock from '../../hooks/useScrollLock'
7
-
8
- const ShoppingCartModal = ({ CheckoutComponent }) => {
9
- const {
10
- cartItems,
11
- totalItems,
12
- totalPrice,
13
- isCartOpen, // context state
14
- closeCart, // context function that flips isCartOpen -> false
15
- updateQuantity,
16
- removeFromCart
17
- } = useCart();
18
-
19
- const orderFormScrollContainerRef = useRef(null);
20
-
21
- // local visible state that controls AnimatePresence mounting
22
- const [localOpen, setLocalOpen] = useState(Boolean(isCartOpen));
23
- const [showOrderForm, setShowOrderForm] = useState(false);
24
-
25
- // track whether the close was requested from inside this component
26
- const closingRequestedRef = useRef(false);
27
-
28
- // when context opens the cart, immediately open locally so it animates in
29
- useEffect(() => {
30
- if (isCartOpen) {
31
- setLocalOpen(true);
32
- setShowOrderForm(false); // Reset to cart view when opening
33
- closingRequestedRef.current = false;
34
- } else {
35
- setLocalOpen(false);
36
- setShowOrderForm(false); // Reset when closing
37
- }
38
- }, [isCartOpen]);
39
-
40
- useScrollLock(isCartOpen);
41
-
42
- // called by close buttons / backdrop clicks inside this component
43
- const requestClose = () => {
44
- // mark we requested a close so we call context close only after exit
45
- closingRequestedRef.current = true;
46
- // trigger AnimatePresence exit by setting localOpen -> false
47
- setLocalOpen(false);
48
- };
49
-
50
- const handleBackToCart = (closeCart = false) => {
51
- setShowOrderForm(false);
52
- if (closeCart === true) {
53
- requestClose()
54
- }
55
- };
56
-
57
- // onExitComplete runs after all children finish exiting
58
- const handleExitComplete = () => {
59
- if (closingRequestedRef.current) {
60
- closeCart();
61
- closingRequestedRef.current = false;
62
- }
63
- setShowOrderForm(false); // Reset form view when modal closes
64
- };
65
-
66
- return (
67
- // wrapper ignores clicks when closed so it doesn't block the app
68
- <div className={`fixed inset-0 z-50 flex ${isCartOpen ? '' : 'pointer-events-none'} supports-[height:100dvh]:h-[100dvh]`}>
69
- <AnimatePresence initial={false} mode="wait" onExitComplete={handleExitComplete}>
70
- {localOpen && (
71
- <>
72
- {/* Backdrop */}
73
- <motion.div
74
- key="backdrop"
75
- initial={{ opacity: 0 }}
76
- animate={{ opacity: 1 }}
77
- exit={{ opacity: 0 }}
78
- transition={{ duration: 0.18 }}
79
- className="absolute inset-0 bg-black bg-opacity-30 backdrop-blur-sm pointer-events-auto"
80
- onClick={!showOrderForm ? requestClose : undefined}
81
- aria-hidden="true"
82
- />
83
-
84
- {/* Cart Panel */}
85
- <motion.aside
86
- key="cart-panel"
87
- initial={{ x: '-100%' }}
88
- animate={{ x: 0 }}
89
- exit={{ x: 0 }}
90
- transition={{
91
- type: "tween",
92
- duration: 0.1,
93
- }}
94
- className={`relative ${showOrderForm ? 'w-full max-w-4xl' : 'w-full max-w-md'} h-full glass-card rounded-none overflow-hidden pointer-events-auto transition-all duration-300`}
95
- dir="rtl"
96
- role="dialog"
97
- aria-modal="true"
98
- onClick={(e) => e.stopPropagation()}
99
- >
100
- {showOrderForm ? (
101
- // Order Form View
102
- <div ref={orderFormScrollContainerRef} className="h-full overflow-y-auto">
103
- {CheckoutComponent ? (
104
- <CheckoutComponent
105
- onBack={handleBackToCart}
106
- cartItems={cartItems}
107
- totalPrice={totalPrice}
108
- scrollContainerRef={orderFormScrollContainerRef}
109
- />
110
- ) : (
111
- <div className="p-6">
112
- <p className="content-text">No checkout component provided</p>
113
- </div>
114
- )} </div>
115
- ) : (
116
- <div className="flex flex-col h-full">
117
- {/* Header */}
118
- <div className="flex justify-between items-center p-6 border-b border-white/20">
119
- <div className="flex items-center gap-3">
120
- <ShoppingBag className="w-6 h-6 text-primary" />
121
- <h2 className="subtitle font-bold">עגלת קניות</h2>
122
- {totalItems > 0 && (
123
- <motion.div
124
- initial={{ scale: 0 }}
125
- animate={{ scale: 1 }}
126
- transition={{ type: 'spring', stiffness: 600, damping: 20 }}
127
- className="bg-primary text-white text-xs font-bold rounded-full min-w-[1.5rem] h-6 flex items-center justify-center px-2"
128
- >
129
- {totalItems}
130
- </motion.div>
131
- )}
132
- </div>
133
- <button
134
- onClick={requestClose} // use local requestClose
135
- className="content-text hover:text-primary hover:bg-gray-100 p-2 rounded-md transition-colors duration-200"
136
- aria-label="Close cart"
137
- >
138
- <X size={20} />
139
- </button>
140
- </div>
141
-
142
- {/* Cart Items */}
143
- <div className="flex-1 overflow-y-auto p-6">
144
- <AnimatePresence>
145
- {cartItems.length === 0 ? (
146
- <motion.div
147
- key="empty"
148
- initial={{ opacity: 0, y: 20 }}
149
- animate={{ opacity: 1, y: 0 }}
150
- exit={{ opacity: 0, y: 10 }}
151
- className="text-center py-12"
152
- >
153
- <ShoppingBag className="w-16 h-16 mx-auto mb-4 text-gray-300" />
154
- <h3 className="subtitle font-medium text-gray-500 mb-2">
155
- העגלה ריקה
156
- </h3>
157
- <p className="content-text text-gray-400">
158
- הוסף מוצרים כדי להתחיל לקנות
159
- </p>
160
- </motion.div>
161
- ) : (
162
- <motion.div
163
- key="items"
164
- initial={{ opacity: 0 }}
165
- animate={{ opacity: 1 }}
166
- exit={{ opacity: 0 }}
167
- className="space-y-3"
168
- >
169
- {cartItems.map((item) => (
170
- <CartItem
171
- key={item.id}
172
- item={item}
173
- onUpdateQuantity={updateQuantity}
174
- onRemoveItem={removeFromCart}
175
- />
176
- ))}
177
- </motion.div>
178
- )}
179
- </AnimatePresence>
180
- </div>
181
-
182
- {/* Footer */}
183
- <motion.div
184
- initial={{ opacity: 0, y: 20 }}
185
- animate={{ opacity: 1, y: 0 }}
186
- exit={{ opacity: 0, y: 10 }}
187
- transition={{ duration: 0.18 }}
188
- className="p-6 border-t border-white/20 space-y-4"
189
- >
190
- {cartItems.length > 0 && (
191
- <>
192
- {/* Total */}
193
- <div className="flex justify-between items-center">
194
- <span className="subtitle font-bold">סה״כ:</span>
195
- <span className="text-xl font-bold text-price">
196
- ₪{totalPrice.toFixed(2)}
197
- </span>
198
- </div>
199
-
200
- {/* Checkout Button */}
201
- <button
202
- onClick={() => setShowOrderForm(true)}
203
- className="w-full btn-primary text-center py-3 rounded-lg font-medium transition-all duration-200 hover:brightness-90 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-opacity-50"
204
- >
205
- המשך לתשלום
206
- </button>
207
-
208
-
209
- </>
210
- )}
211
- {/* Continue Shopping */}
212
- <button
213
- onClick={requestClose}
214
- className="w-full text-center py-2 content-text hover:text-primary transition-colors duration-200"
215
- >
216
- המשך קנייה
217
- </button>
218
- </motion.div>
219
- </div>
220
- )}
221
- </motion.aside>
222
- </>
223
- )}
224
- </AnimatePresence>
225
- </div>
226
- );
227
- };
228
-
229
- export default ShoppingCartModal;
@@ -1,289 +0,0 @@
1
- import React, { useState } from 'react';
2
- import { motion, AnimatePresence } from 'framer-motion';
3
- import { X, Crown, Loader2, CheckCircle } from 'lucide-react';
4
- import { useToast } from '../ToastProvider';
5
-
6
- const ClubMembershipModal = ({
7
- isOpen,
8
- onClose,
9
- onMembershipComplete,
10
- userEmail,
11
- updateClubMembership
12
- }) => {
13
- const [formData, setFormData] = useState({
14
- firstName: '',
15
- lastName: '',
16
- phone: '',
17
- address: '',
18
- marketingConsent: false
19
- });
20
- const [isSubmitting, setIsSubmitting] = useState(false);
21
- const [isCompleted, setIsCompleted] = useState(false);
22
- const [errors, setErrors] = useState({});
23
-
24
- const addToast = useToast();
25
-
26
- const handleInputChange = (field, value) => {
27
- setFormData(prev => ({ ...prev, [field]: value }));
28
- // Clear field error when user starts typing
29
- if (errors[field]) {
30
- setErrors(prev => ({ ...prev, [field]: '' }));
31
- }
32
- };
33
-
34
- const validateForm = () => {
35
- const newErrors = {};
36
-
37
- if (!formData.firstName.trim()) {
38
- newErrors.firstName = 'שם פרטי חובה';
39
- }
40
-
41
- if (!formData.lastName.trim()) {
42
- newErrors.lastName = 'שם משפחה חובה';
43
- }
44
-
45
- if (!formData.phone.trim()) {
46
- newErrors.phone = 'מספר טלפון חובה';
47
- } else if (!/^(05\d{8}|5\d{8})$/.test(formData.phone.replace(/\D/g, ''))) {
48
- newErrors.phone = 'מספר טלפון לא תקין';
49
- }
50
-
51
- if (!formData.address.trim()) {
52
- newErrors.address = 'כתובת חובה';
53
- }
54
-
55
- if (!formData.marketingConsent) {
56
- newErrors.marketingConsent = 'יש לאשר את הסכמתך לקבלת דיוור שיווקי';
57
- }
58
-
59
- setErrors(newErrors);
60
- return Object.keys(newErrors).length === 0;
61
- };
62
-
63
- const handleSubmit = async (e) => {
64
- e.preventDefault();
65
-
66
- if (!validateForm()) {
67
- return;
68
- }
69
-
70
- setIsSubmitting(true);
71
-
72
- try {
73
- // Update user with club membership and form data
74
- await updateClubMembership({
75
- firstName: formData.firstName.trim(),
76
- lastName: formData.lastName.trim(),
77
- phone: formData.phone.trim(),
78
- address: formData.address.trim(),
79
- isClubMember: true,
80
- marketingConsent: formData.marketingConsent
81
- });
82
-
83
- setIsCompleted(true);
84
- addToast('הצטרפת בהצלחה למועדון הלקוחות!', 'success');
85
-
86
- // After short delay, notify parent and close
87
- setTimeout(() => {
88
- if (onMembershipComplete) {
89
- onMembershipComplete();
90
- }
91
- onClose();
92
- // Reset form for next time
93
- setFormData({
94
- firstName: '',
95
- lastName: '',
96
- phone: '',
97
- address: '',
98
- marketingConsent: false
99
- });
100
- setIsCompleted(false);
101
- }, 2000);
102
-
103
- } catch (error) {
104
- console.error('Error joining club:', error);
105
- addToast('שגיאה בהצטרפות למועדון. אנא נסה שנית.', 'error');
106
- }
107
-
108
- setIsSubmitting(false);
109
- };
110
-
111
- if (!isOpen) return null;
112
-
113
- return (
114
- <AnimatePresence>
115
- <div className="fixed inset-0 z-50 flex items-center justify-center">
116
- <motion.div
117
- initial={{ opacity: 0 }}
118
- animate={{ opacity: 1 }}
119
- exit={{ opacity: 0 }}
120
- className="absolute inset-0 bg-black bg-opacity-50 backdrop-blur-sm"
121
- onClick={onClose}
122
- />
123
-
124
- <motion.div
125
- initial={{ opacity: 0, scale: 0.9, y: 20 }}
126
- animate={{ opacity: 1, scale: 1, y: 0 }}
127
- exit={{ opacity: 0, scale: 0.9, y: 20 }}
128
- className="relative glass-card p-8 max-w-md w-full mx-4 max-h-[90vh] overflow-y-auto"
129
- >
130
- <button
131
- onClick={onClose}
132
- className="absolute top-4 left-4 p-2 rounded-full hover:bg-gray-100 transition-colors"
133
- >
134
- <X className="w-5 h-5" />
135
- </button>
136
-
137
- {isCompleted ? (
138
- <div className="text-center">
139
- <div className="w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto mb-4">
140
- <CheckCircle className="w-8 h-8 text-green-600" />
141
- </div>
142
- <h3 className="text-2xl font-bold text-gray-800 mb-3">
143
- ברוכים הבאים למועדון! 🎉
144
- </h3>
145
- <p className="text-gray-600">
146
- הצטרפת בהצלחה למועדון הלקוחות וזכית ב-10% הנחה על ההזמנה הנוכחית!
147
- </p>
148
- </div>
149
- ) : (
150
- <>
151
- <div className="text-center mb-6">
152
- <div className="w-16 h-16 bg-gradient-to-r from-yellow-400 to-orange-400 rounded-full flex items-center justify-center mx-auto mb-4">
153
- <Crown className="w-8 h-8 text-white" />
154
- </div>
155
- <h3 className="text-2xl font-bold text-gray-800 mb-2">
156
- הצטרפות למועדון הלקוחות
157
- </h3>
158
- <p className="text-gray-600">
159
- מלא את הפרטים וזכה ב-10% הנחה על כל הזמנה!
160
- </p>
161
- </div>
162
-
163
- <form onSubmit={handleSubmit} className="space-y-4">
164
- <div>
165
- <label htmlFor="firstName" className="block text-sm font-medium text-gray-700 mb-1">
166
- שם פרטי *
167
- </label>
168
- <input
169
- id="firstName"
170
- type="text"
171
- value={formData.firstName}
172
- onChange={(e) => handleInputChange('firstName', e.target.value)}
173
- placeholder="שם פרטי"
174
- className={`w-full px-3 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent ${
175
- errors.firstName ? 'border-red-500' : 'border-gray-300'
176
- }`}
177
- />
178
- {errors.firstName && (
179
- <p className="text-red-600 text-sm mt-1">{errors.firstName}</p>
180
- )}
181
- </div>
182
-
183
- <div>
184
- <label htmlFor="lastName" className="block text-sm font-medium text-gray-700 mb-1">
185
- שם משפחה *
186
- </label>
187
- <input
188
- id="lastName"
189
- type="text"
190
- value={formData.lastName}
191
- onChange={(e) => handleInputChange('lastName', e.target.value)}
192
- placeholder="שם משפחה"
193
- className={`w-full px-3 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent ${
194
- errors.lastName ? 'border-red-500' : 'border-gray-300'
195
- }`}
196
- />
197
- {errors.lastName && (
198
- <p className="text-red-600 text-sm mt-1">{errors.lastName}</p>
199
- )}
200
- </div>
201
-
202
- <div>
203
- <label htmlFor="phone" className="block text-sm font-medium text-gray-700 mb-1">
204
- טלפון *
205
- </label>
206
- <input
207
- id="phone"
208
- type="tel"
209
- value={formData.phone}
210
- onChange={(e) => handleInputChange('phone', e.target.value)}
211
- placeholder="052-1234567"
212
- className={`w-full px-3 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent ${
213
- errors.phone ? 'border-red-500' : 'border-gray-300'
214
- }`}
215
- />
216
- {errors.phone && (
217
- <p className="text-red-600 text-sm mt-1">{errors.phone}</p>
218
- )}
219
- </div>
220
-
221
- <div>
222
- <label htmlFor="address" className="block text-sm font-medium text-gray-700 mb-1">
223
- כתובת מלאה *
224
- </label>
225
- <textarea
226
- id="address"
227
- value={formData.address}
228
- onChange={(e) => handleInputChange('address', e.target.value)}
229
- placeholder="רחוב, מספר בית, עיר"
230
- rows={2}
231
- className={`w-full px-3 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent ${
232
- errors.address ? 'border-red-500' : 'border-gray-300'
233
- }`}
234
- />
235
- {errors.address && (
236
- <p className="text-red-600 text-sm mt-1">{errors.address}</p>
237
- )}
238
- </div>
239
-
240
- <div className="flex items-start space-x-2 rtl:space-x-reverse">
241
- <input
242
- id="marketingConsent"
243
- type="checkbox"
244
- checked={formData.marketingConsent}
245
- onChange={(e) => handleInputChange('marketingConsent', e.target.checked)}
246
- className="mt-1 w-4 h-4 text-primary focus:ring-primary border-gray-300 rounded"
247
- />
248
- <label htmlFor="marketingConsent" className="text-sm leading-5 text-gray-700">
249
- אני מסכים/מה לקבל דיוור שיווקי ועדכונים על מבצעים מיוחדים. *
250
- <span className="text-gray-500 block mt-1">
251
- (אנחנו מבטיחים לא לחפור ולשלוח רק תוכן איכותי ורלוונטי)
252
- </span>
253
- </label>
254
- </div>
255
- {errors.marketingConsent && (
256
- <p className="text-red-600 text-sm">{errors.marketingConsent}</p>
257
- )}
258
-
259
- <button
260
- type="submit"
261
- disabled={isSubmitting}
262
- className="w-full rounded-full py-3 text-white bg-gradient-to-r from-yellow-500 to-orange-500 border-0 hover:shadow-lg transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed"
263
- >
264
- {isSubmitting ? (
265
- <>
266
- <Loader2 className="w-4 h-4 inline ml-2 animate-spin" />
267
- מצטרף למועדון...
268
- </>
269
- ) : (
270
- <>
271
- <Crown className="w-4 h-4 inline ml-2" />
272
- הצטרף למועדון וקבל 10% הנחה!
273
- </>
274
- )}
275
- </button>
276
-
277
- <p className="text-xs text-gray-500 text-center">
278
- * כל השדות הם שדות חובה להצטרפות למועדון
279
- </p>
280
- </form>
281
- </>
282
- )}
283
- </motion.div>
284
- </div>
285
- </AnimatePresence>
286
- );
287
- };
288
-
289
- export default ClubMembershipModal;
@@ -1,108 +0,0 @@
1
- import React from 'react';
2
- import { motion, AnimatePresence } from 'framer-motion';
3
- import { X, Crown, Star, Gift, Zap, LogIn } from 'lucide-react';
4
-
5
- const ClubPromoModal = ({ isOpen, onClose, onLoginRedirect }) => {
6
- const handleJoinClick = () => {
7
- onLoginRedirect();
8
- };
9
-
10
- if (!isOpen) return null;
11
-
12
- return (
13
- <AnimatePresence>
14
- <div className="fixed inset-0 z-50 flex items-center justify-center">
15
- <motion.div
16
- initial={{ opacity: 0 }}
17
- animate={{ opacity: 1 }}
18
- exit={{ opacity: 0 }}
19
- className="absolute inset-0 bg-black bg-opacity-50 backdrop-blur-sm"
20
- onClick={onClose}
21
- />
22
-
23
- <motion.div
24
- initial={{ opacity: 0, scale: 0.9, y: 20 }}
25
- animate={{ opacity: 1, scale: 1, y: 0 }}
26
- exit={{ opacity: 0, scale: 0.9, y: 20 }}
27
- className="relative glass-card p-8 max-w-lg w-full mx-4"
28
- >
29
- <button
30
- onClick={onClose}
31
- className="absolute top-4 left-4 p-2 rounded-full hover:bg-gray-100 transition-colors"
32
- >
33
- <X className="w-5 h-5" />
34
- </button>
35
-
36
- <div className="text-center">
37
- <div className="w-20 h-20 bg-gradient-to-r from-yellow-400 to-orange-400 rounded-full flex items-center justify-center mx-auto mb-6">
38
- <Crown className="w-10 h-10 text-white" />
39
- </div>
40
-
41
- <h2 className="text-2xl font-bold text-gray-800 mb-4">
42
- הצטרפו למועדון הלקוחות של טרופיקל!
43
- </h2>
44
-
45
- <p className="text-gray-600 mb-6">
46
- מועדון VIP עם יתרונות בלעדיים שיהפכו כל הזמנה לחגיגה
47
- </p>
48
-
49
- <div className="space-y-4 mb-8 text-right">
50
- <div className="flex items-start gap-3">
51
- <div className="w-8 h-8 bg-green-100 rounded-full flex items-center justify-center flex-shrink-0 mt-1">
52
- <Gift className="w-4 h-4 text-green-600" />
53
- </div>
54
- <div>
55
- <h3 className="font-semibold text-gray-800">10% הנחה על כל הזמנה</h3>
56
- <p className="text-sm text-gray-600">הנחה קבועה על כל המוצרים בחנות</p>
57
- </div>
58
- </div>
59
-
60
- <div className="flex items-start gap-3">
61
- <div className="w-8 h-8 bg-blue-100 rounded-full flex items-center justify-center flex-shrink-0 mt-1">
62
- <Zap className="w-4 h-4 text-blue-600" />
63
- </div>
64
- <div>
65
- <h3 className="font-semibold text-gray-800">גישה מהירה להזמנות</h3>
66
- <p className="text-sm text-gray-600">פרטים שמורים לתהליך הזמנה מהיר</p>
67
- </div>
68
- </div>
69
-
70
- <div className="flex items-start gap-3">
71
- <div className="w-8 h-8 bg-purple-100 rounded-full flex items-center justify-center flex-shrink-0 mt-1">
72
- <Star className="w-4 h-4 text-purple-600" />
73
- </div>
74
- <div>
75
- <h3 className="font-semibold text-gray-800">מבצעים בלעדיים</h3>
76
- <p className="text-sm text-gray-600">עדכונים ראשונים על מוצרים חדשים ומבצעים</p>
77
- </div>
78
- </div>
79
- </div>
80
-
81
- <div className="space-y-3">
82
- <button
83
- onClick={handleJoinClick}
84
- className="w-full rounded-full py-3 text-white bg-gradient-to-r from-yellow-500 to-orange-500 border-0 text-lg font-semibold hover:shadow-lg transition-all duration-200"
85
- >
86
- <LogIn className="w-5 h-5 inline ml-2" />
87
- התחבר והצטרף למועדון!
88
- </button>
89
-
90
- <button
91
- onClick={onClose}
92
- className="w-full rounded-full py-2 text-gray-600 hover:text-gray-800 hover:bg-gray-50 transition-colors"
93
- >
94
- אולי מאוחר יותר
95
- </button>
96
- </div>
97
-
98
- <p className="text-xs text-gray-500 mt-4">
99
- ההצטרפות חינם לחלוטין ואפשר לבטל בכל עת
100
- </p>
101
- </div>
102
- </motion.div>
103
- </div>
104
- </AnimatePresence>
105
- );
106
- };
107
-
108
- export default ClubPromoModal;
@@ -1,17 +0,0 @@
1
- import React from 'react';
2
-
3
- const CTAButton = ({ children, onClick, className = '', ...props }) => {
4
- return (
5
- <button
6
- className={`btn-primary text-big rounded-sm px-6 py-3 transition-all duration-200 hover:brightness-90 inline-flex items-center gap-2 ${className}`}
7
- onClick={onClick}
8
- dir="rtl"
9
- {...props}
10
- >
11
- {children}
12
- <span className="text-xl">←</span>
13
- </button>
14
- );
15
- };
16
-
17
- export default CTAButton;