@burdenoff/microfe-adaptercloud 2026.624.1 → 2026.625.1
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/adaptercloud/components/EmptyState.js +17 -21
- package/dist/adaptercloud/components/EmptyState.js.map +1 -1
- package/dist/adaptercloud/components/InvestmentCard.js +25 -23
- package/dist/adaptercloud/components/InvestmentCard.js.map +1 -1
- package/dist/adaptercloud/components/MetricsCard.js +18 -12
- package/dist/adaptercloud/components/MetricsCard.js.map +1 -1
- package/dist/adaptercloud/components/PageLayout.js +38 -19
- package/dist/adaptercloud/components/PageLayout.js.map +1 -1
- package/dist/adaptercloud/components/RatingDisplay.js +3 -3
- package/dist/adaptercloud/components/RatingDisplay.js.map +1 -1
- package/dist/adaptercloud/components/StatusBadge.js +36 -16
- package/dist/adaptercloud/components/StatusBadge.js.map +1 -1
- package/dist/adaptercloud/pages/HomePage.js +242 -231
- package/dist/adaptercloud/pages/HomePage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +33 -33
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminDashboard.js +32 -32
- package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +11 -11
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +11 -11
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js +3 -3
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +1 -1
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/CartManagementPage.js +28 -28
- package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/UserManagementPage.js +25 -25
- package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +19 -19
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +7 -7
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +40 -37
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +21 -21
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +24 -24
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +20 -20
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +36 -36
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +25 -25
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/HelpSupportPage.js +43 -43
- package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js +32 -31
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/SettingsPage.js +8 -8
- package/dist/adaptercloud/pages/common/SettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +22 -21
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CartDetailPage.js +18 -17
- package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +12 -11
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CheckoutPage.js +9 -9
- package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js +30 -30
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +19 -19
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +24 -23
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/FavoritesPage.js +9 -8
- package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +4 -3
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +15 -14
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +10 -9
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/ReviewsPage.js +18 -17
- package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +14 -13
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +32 -32
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +14 -13
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +27 -27
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js +16 -16
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +9 -8
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +12 -12
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +19 -19
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +26 -25
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js +43 -43
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +37 -36
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +34 -34
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +27 -25
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomerProfilePage.js","names":[],"sources":["../../../../src/adaptercloud/pages/customer/CustomerProfilePage.tsx"],"sourcesContent":["/**\n * Customer Profile Page\n * @module adaptercloud/pages/customer\n *\n * Full profile management with 3-tab interface (Profile Info, Preferences, My Stats),\n * edit mode toggle, inline editable fields, emergency contact, dietary preferences,\n * food allergies, and stats/loyalty display.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport {\n User,\n Mail,\n Phone,\n Shield,\n MapPin,\n Bell,\n Globe,\n CheckCircle2,\n Camera,\n ChevronRight,\n Edit3,\n Save,\n X,\n Heart,\n AlertTriangle,\n Award,\n ShoppingBag,\n IndianRupee,\n Star,\n BarChart3,\n Settings,\n UserCircle,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { useOrders } from '../../hooks/useAdapterCloudApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatDate } from '../../utils/formatters';\n\ntype ProfileTab = 'profile' | 'preferences' | 'stats';\n\ninterface EmergencyContact {\n name: string;\n phone: string;\n relationship: string;\n}\n\ninterface ProfileData {\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n emergencyContact: EmergencyContact;\n dietary: string[];\n allergies: string[];\n notifications: {\n orderUpdates: boolean;\n promotions: boolean;\n newsletter: boolean;\n sms: boolean;\n };\n}\n\nconst dietaryOptions = ['vegetarian', 'vegan', 'jain', 'keto', 'gluten-free', 'low-carb'];\nconst allergyOptions = ['nuts', 'dairy', 'eggs', 'soy', 'shellfish', 'gluten'];\n\nconst mockAddresses = [\n {\n id: 'addr-1',\n label: 'Home',\n street: '123, MG Road',\n area: 'Near Central Mall',\n city: 'Bangalore',\n state: 'Karnataka',\n pincode: '560001',\n isDefault: true,\n },\n {\n id: 'addr-2',\n label: 'Office',\n street: '456 Tech Park Road',\n area: 'Whitefield',\n city: 'Bangalore',\n state: 'Karnataka',\n pincode: '560066',\n isDefault: false,\n },\n];\n\nexport function CustomerProfilePage() {\n const { navigateTo, currentUser } = useAdapterCloud();\n const { data: orders = [], isLoading: isLoadingOrders } = useOrders({\n customerId: currentUser?.id,\n });\n const [activeTab, setActiveTab] = useState<ProfileTab>('profile');\n const [isEditing, setIsEditing] = useState(false);\n\n // Use currentUser from context, fallback to defaults\n const profile = {\n firstName: currentUser?.firstName || currentUser?.name?.split(' ')[0] || 'Customer',\n lastName: currentUser?.lastName || currentUser?.name?.split(' ').slice(1).join(' ') || '',\n email: currentUser?.email || '',\n phone: '+91 98765 43210',\n profilePicture: currentUser?.avatar,\n isEmailVerified: true,\n isPhoneVerified: true,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n // Editable profile data\n const [profileData, setProfileData] = useState<ProfileData>({\n firstName: profile.firstName,\n lastName: profile.lastName,\n email: profile.email,\n phone: profile.phone,\n emergencyContact: {\n name: 'Priya Sharma',\n phone: '+91 98765 43211',\n relationship: 'Spouse',\n },\n dietary: ['vegetarian'],\n allergies: ['nuts', 'dairy'],\n notifications: {\n orderUpdates: true,\n promotions: true,\n newsletter: false,\n sms: true,\n },\n });\n\n const [editedData, setEditedData] = useState<ProfileData>({ ...profileData });\n\n // Calculate stats from real orders\n const stats = {\n totalOrders: orders.length,\n totalSpent: orders.reduce((acc, o) => acc + o.total, 0),\n loyaltyPoints: Math.floor(orders.reduce((acc, o) => acc + o.total, 0) / 10),\n avgOrderValue:\n orders.length > 0\n ? Math.floor(orders.reduce((acc, o) => acc + o.total, 0) / orders.length)\n : 0,\n favoriteCategory: 'South Indian',\n memberSince: profile.createdAt,\n };\n\n const isLoading = isLoadingOrders;\n\n const handleStartEdit = () => {\n setEditedData({ ...profileData });\n setIsEditing(true);\n };\n\n const handleCancelEdit = () => {\n setEditedData({ ...profileData });\n setIsEditing(false);\n };\n\n const handleSaveProfile = () => {\n setProfileData({ ...editedData });\n setIsEditing(false);\n alert('Profile updated successfully');\n };\n\n const handleSavePreferences = () => {\n setProfileData({ ...editedData });\n alert('Preferences saved successfully');\n };\n\n const handleFieldChange = (field: keyof ProfileData, value: string) => {\n setEditedData((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleEmergencyContactChange = (field: keyof EmergencyContact, value: string) => {\n setEditedData((prev) => ({\n ...prev,\n emergencyContact: { ...prev.emergencyContact, [field]: value },\n }));\n };\n\n const handleNotificationChange = (field: string, value: boolean) => {\n setEditedData((prev) => ({\n ...prev,\n notifications: { ...prev.notifications, [field]: value },\n }));\n };\n\n const handleArrayToggle = (field: 'dietary' | 'allergies', value: string, checked: boolean) => {\n setEditedData((prev) => {\n const currentArray = prev[field];\n const newArray = checked\n ? [...currentArray, value]\n : currentArray.filter((item) => item !== value);\n return { ...prev, [field]: newArray };\n });\n };\n\n const tabs: Array<{ key: ProfileTab; label: string; icon: typeof UserCircle }> = [\n { key: 'profile', label: 'Profile Info', icon: UserCircle },\n { key: 'preferences', label: 'Preferences', icon: Settings },\n { key: 'stats', label: 'My Stats', icon: BarChart3 },\n ];\n\n if (isLoading) {\n return (\n <PageLayout title=\"My Profile\">\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-foreground mx-auto mb-4\" />\n <p className=\"text-sm text-text-secondary\">Loading profile...</p>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout title=\"My Profile\" description=\"Manage your personal information and preferences\">\n {/* Profile Header */}\n <div className=\"flex flex-col items-center sm:flex-row sm:items-start gap-6 rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"relative\">\n <div className=\"h-24 w-24 rounded-full bg-bg-sunken overflow-hidden\">\n {profile.profilePicture ? (\n <img\n src={profile.profilePicture}\n alt={`${profile.firstName} ${profile.lastName}`}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"flex h-full w-full items-center justify-center text-text-secondary\">\n <User className=\"h-10 w-10\" />\n </div>\n )}\n </div>\n <button\n type=\"button\"\n className=\"absolute bottom-0 right-0 flex h-8 w-8 items-center justify-center rounded-full bg-foreground text-background shadow-sm hover:opacity-90 transition-opacity\"\n >\n <Camera className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"flex-1 text-center sm:text-left\">\n <h2 className=\"text-xl font-semibold text-text-primary\">\n {profileData.firstName} {profileData.lastName}\n </h2>\n <p className=\"mt-1 text-sm text-text-secondary\">{profileData.email}</p>\n <p className=\"mt-0.5 text-sm text-text-secondary\">{profileData.phone}</p>\n <div className=\"flex flex-wrap items-center justify-center sm:justify-start gap-2 mt-2\">\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium',\n profile.isEmailVerified\n ? 'bg-green-500/20 text-green-600 dark:text-green-400'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n <CheckCircle2 className=\"h-3 w-3\" />\n {profile.isEmailVerified ? 'Email Verified' : 'Email Not Verified'}\n </span>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium',\n profile.isPhoneVerified\n ? 'bg-green-500/20 text-green-600 dark:text-green-400'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n <CheckCircle2 className=\"h-3 w-3\" />\n {profile.isPhoneVerified ? 'Phone Verified' : 'Phone Not Verified'}\n </span>\n </div>\n </div>\n\n <div className=\"text-center sm:text-right\">\n <p className=\"text-2xl font-bold text-text-primary\">{stats.loyaltyPoints}</p>\n <p className=\"text-xs text-text-secondary\">Loyalty Points</p>\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"mt-6 rounded-lg border border-border-subtle bg-bg-surface\">\n <div className=\"border-b border-border-subtle\">\n <nav className=\"flex -mb-px overflow-x-auto\">\n {tabs.map((tab) => {\n const Icon = tab.icon;\n return (\n <button\n key={tab.key}\n type=\"button\"\n className={cn(\n 'flex items-center gap-2 py-3.5 px-5 text-sm font-medium whitespace-nowrap transition-colors',\n activeTab === tab.key\n ? 'border-b-2 border-foreground text-text-primary'\n : 'text-text-secondary hover:text-text-primary'\n )}\n onClick={() => setActiveTab(tab.key)}\n >\n <Icon className=\"h-4 w-4\" />\n {tab.label}\n </button>\n );\n })}\n </nav>\n </div>\n\n <div className=\"p-5 md:p-6\">\n {/* Profile Tab */}\n {activeTab === 'profile' && (\n <div className=\"space-y-6\">\n {/* Header with Edit/Save/Cancel */}\n <div className=\"flex justify-between items-center\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Personal Information</h3>\n {isEditing ? (\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={handleSaveProfile}\n className=\"flex items-center gap-1.5 rounded-lg bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Save className=\"h-3 w-3\" />\n Save\n </button>\n <button\n type=\"button\"\n onClick={handleCancelEdit}\n className=\"flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <X className=\"h-3 w-3\" />\n Cancel\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={handleStartEdit}\n className=\"flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Edit3 className=\"h-3 w-3\" />\n Edit Profile\n </button>\n )}\n </div>\n\n {/* Editable Fields */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-5\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n First Name\n </label>\n <input\n type=\"text\"\n value={isEditing ? editedData.firstName : profileData.firstName}\n onChange={(e) => handleFieldChange('firstName', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Last Name\n </label>\n <input\n type=\"text\"\n value={isEditing ? editedData.lastName : profileData.lastName}\n onChange={(e) => handleFieldChange('lastName', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Email</label>\n <input\n type=\"email\"\n value={isEditing ? editedData.email : profileData.email}\n onChange={(e) => handleFieldChange('email', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Phone</label>\n <input\n type=\"tel\"\n value={isEditing ? editedData.phone : profileData.phone}\n onChange={(e) => handleFieldChange('phone', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n </div>\n\n {/* Primary Address */}\n <div>\n <h4 className=\"text-base font-semibold text-text-primary mb-3\">Primary Address</h4>\n <div className=\"rounded-lg bg-bg-sunken/50 p-4\">\n <p className=\"text-sm font-medium text-text-primary\">{mockAddresses[0].street}</p>\n <p className=\"text-sm text-text-secondary\">{mockAddresses[0].area}</p>\n <p className=\"text-sm text-text-secondary\">\n {mockAddresses[0].city}, {mockAddresses[0].state} - {mockAddresses[0].pincode}\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/addresses')}\n className=\"mt-2 flex items-center gap-1 text-xs font-medium text-text-secondary hover:text-text-primary transition-colors\"\n >\n <MapPin className=\"h-3 w-3\" />\n Manage Addresses\n <ChevronRight className=\"h-3 w-3\" />\n </button>\n </div>\n </div>\n\n {/* Emergency Contact */}\n <div>\n <h4 className=\"text-base font-semibold text-text-primary mb-3 flex items-center gap-2\">\n <AlertTriangle className=\"h-4 w-4 text-text-secondary\" />\n Emergency Contact\n </h4>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Name</label>\n <input\n type=\"text\"\n value={\n isEditing\n ? editedData.emergencyContact.name\n : profileData.emergencyContact.name\n }\n onChange={(e) => handleEmergencyContactChange('name', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Phone\n </label>\n <input\n type=\"tel\"\n value={\n isEditing\n ? editedData.emergencyContact.phone\n : profileData.emergencyContact.phone\n }\n onChange={(e) => handleEmergencyContactChange('phone', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Relationship\n </label>\n <input\n type=\"text\"\n value={\n isEditing\n ? editedData.emergencyContact.relationship\n : profileData.emergencyContact.relationship\n }\n onChange={(e) => handleEmergencyContactChange('relationship', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n </div>\n </div>\n\n {/* Save/Cancel at bottom when editing */}\n {isEditing && (\n <div className=\"flex gap-3 pt-4 border-t border-border-subtle\">\n <button\n type=\"button\"\n onClick={handleSaveProfile}\n className=\"flex items-center gap-2 rounded-lg bg-foreground px-4 py-2.5 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Save className=\"h-4 w-4\" />\n Save Changes\n </button>\n <button\n type=\"button\"\n onClick={handleCancelEdit}\n className=\"flex items-center gap-2 rounded-lg border border-border-subtle px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Cancel\n </button>\n </div>\n )}\n </div>\n )}\n\n {/* Preferences Tab */}\n {activeTab === 'preferences' && (\n <div className=\"space-y-8\">\n {/* Notification Preferences */}\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Bell className=\"h-4 w-4 text-text-secondary\" />\n Notification Preferences\n </h3>\n <div className=\"space-y-3\">\n {[\n { key: 'orderUpdates', label: 'Order status updates' },\n { key: 'promotions', label: 'Promotional offers and discounts' },\n { key: 'newsletter', label: 'Newsletter and food recommendations' },\n { key: 'sms', label: 'SMS notifications' },\n ].map((item) => (\n <label key={item.key} className=\"flex items-center gap-3 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={\n editedData.notifications[\n item.key as keyof typeof editedData.notifications\n ]\n }\n onChange={(e) => handleNotificationChange(item.key, e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle text-text-primary focus:ring-[var(--color-focus-ring)]\"\n />\n <span className=\"text-sm text-text-primary\">{item.label}</span>\n </label>\n ))}\n </div>\n </div>\n\n {/* Dietary Preferences */}\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Heart className=\"h-4 w-4 text-text-secondary\" />\n Dietary Preferences\n </h3>\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3\">\n {dietaryOptions.map((diet) => (\n <label key={diet} className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={editedData.dietary.includes(diet)}\n onChange={(e) => handleArrayToggle('dietary', diet, e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle text-text-primary focus:ring-[var(--color-focus-ring)]\"\n />\n <span className=\"text-sm text-text-primary capitalize\">{diet}</span>\n </label>\n ))}\n </div>\n </div>\n\n {/* Food Allergies */}\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <AlertTriangle className=\"h-4 w-4 text-status-error-text\" />\n Food Allergies\n </h3>\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3\">\n {allergyOptions.map((allergy) => (\n <label key={allergy} className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={editedData.allergies.includes(allergy)}\n onChange={(e) => handleArrayToggle('allergies', allergy, e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle text-status-error-text focus:ring-destructive\"\n />\n <span className=\"text-sm text-text-primary capitalize\">{allergy}</span>\n </label>\n ))}\n </div>\n </div>\n\n {/* Save Preferences */}\n <div className=\"pt-4 border-t border-border-subtle\">\n <button\n type=\"button\"\n onClick={handleSavePreferences}\n className=\"flex items-center gap-2 rounded-lg bg-foreground px-4 py-2.5 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Save className=\"h-4 w-4\" />\n Save Preferences\n </button>\n </div>\n </div>\n )}\n\n {/* Stats Tab */}\n {activeTab === 'stats' && (\n <div className=\"space-y-8\">\n {/* Top Stats Cards */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"rounded-lg bg-blue-500/10 p-5 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n <ShoppingBag className=\"h-4 w-4 text-blue-600 dark:text-blue-400\" />\n <h4 className=\"text-sm font-medium text-blue-600 dark:text-blue-400\">\n Total Orders\n </h4>\n </div>\n <p className=\"text-3xl font-bold text-blue-600 dark:text-blue-400\">\n {stats.totalOrders}\n </p>\n </div>\n <div className=\"rounded-lg bg-green-500/10 p-5 border border-green-500/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n <IndianRupee className=\"h-4 w-4 text-green-600 dark:text-green-400\" />\n <h4 className=\"text-sm font-medium text-green-600 dark:text-green-400\">\n Total Spent\n </h4>\n </div>\n <p className=\"text-3xl font-bold text-green-600 dark:text-green-400\">\n {formatCurrency(stats.totalSpent, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div className=\"rounded-lg bg-purple-500/10 p-5 border border-purple-500/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Award className=\"h-4 w-4 text-purple-600 dark:text-purple-400\" />\n <h4 className=\"text-sm font-medium text-purple-600 dark:text-purple-400\">\n Loyalty Points\n </h4>\n </div>\n <p className=\"text-3xl font-bold text-purple-600 dark:text-purple-400\">\n {stats.loyaltyPoints}\n </p>\n </div>\n </div>\n\n {/* Details Grid */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n {/* Order Statistics */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h4 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-4 w-4 text-text-secondary\" />\n Order Statistics\n </h4>\n <div className=\"space-y-3\">\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Average Order Value</span>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(stats.avgOrderValue, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Favorite Category</span>\n <span className=\"text-sm font-medium text-text-primary\">\n {stats.favoriteCategory}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Member Since</span>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatDate(stats.memberSince, {\n hour: undefined,\n minute: undefined,\n hour12: undefined,\n })}\n </span>\n </div>\n </div>\n </div>\n\n {/* Account Status */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h4 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Shield className=\"h-4 w-4 text-text-secondary\" />\n Account Status\n </h4>\n <div className=\"space-y-3\">\n <div className=\"flex justify-between items-center\">\n <span className=\"text-sm text-text-secondary\">Email Verification</span>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium',\n profile.isEmailVerified\n ? 'bg-green-500/20 text-green-600 dark:text-green-400'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n {profile.isEmailVerified ? 'Verified' : 'Not Verified'}\n </span>\n </div>\n <div className=\"flex justify-between items-center\">\n <span className=\"text-sm text-text-secondary\">Phone Verification</span>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium',\n profile.isPhoneVerified\n ? 'bg-green-500/20 text-green-600 dark:text-green-400'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n {profile.isPhoneVerified ? 'Verified' : 'Not Verified'}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Last Updated</span>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatDate(profile.updatedAt, {\n hour: undefined,\n minute: undefined,\n hour12: undefined,\n })}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CustomerProfilePage.js","names":[],"sources":["../../../../src/adaptercloud/pages/customer/CustomerProfilePage.tsx"],"sourcesContent":["/**\n * Customer Profile Page\n * @module adaptercloud/pages/customer\n *\n * Full profile management with 3-tab interface (Profile Info, Preferences, My Stats),\n * edit mode toggle, inline editable fields, emergency contact, dietary preferences,\n * food allergies, and stats/loyalty display.\n */\n\nimport { useState, useEffect, useCallback } from'react';\nimport {\n User,\n Mail,\n Phone,\n Shield,\n MapPin,\n Bell,\n Globe,\n CheckCircle2,\n Camera,\n ChevronRight,\n Edit3,\n Save,\n X,\n Heart,\n AlertTriangle,\n Award,\n ShoppingBag,\n IndianRupee,\n Star,\n BarChart3,\n Settings,\n UserCircle,\n} from'lucide-react';\nimport { PageLayout } from'../../components/PageLayout';\nimport { useAdapterCloud } from'../../context/AdapterCloudContext';\nimport { useOrders } from'../../hooks/useAdapterCloudApi';\nimport { cn } from'../../utils/cn';\nimport { formatCurrency, formatDate } from'../../utils/formatters';\n\ntype ProfileTab = 'profile' | 'preferences' | 'stats';\n\ninterface EmergencyContact {\n name: string;\n phone: string;\n relationship: string;\n}\n\ninterface ProfileData {\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n emergencyContact: EmergencyContact;\n dietary: string[];\n allergies: string[];\n notifications: {\n orderUpdates: boolean;\n promotions: boolean;\n newsletter: boolean;\n sms: boolean;\n };\n}\n\nconst dietaryOptions = ['vegetarian', 'vegan', 'jain', 'keto', 'gluten-free', 'low-carb'];\nconst allergyOptions = ['nuts', 'dairy', 'eggs', 'soy', 'shellfish', 'gluten'];\n\nconst mockAddresses = [\n {\n id: 'addr-1',\n label: 'Home',\n street: '123, MG Road',\n area: 'Near Central Mall',\n city: 'Bangalore',\n state: 'Karnataka',\n pincode: '560001',\n isDefault: true,\n },\n {\n id: 'addr-2',\n label: 'Office',\n street: '456 Tech Park Road',\n area: 'Whitefield',\n city: 'Bangalore',\n state: 'Karnataka',\n pincode: '560066',\n isDefault: false,\n },\n];\n\nexport function CustomerProfilePage() {\n const { navigateTo, currentUser } = useAdapterCloud();\n const { data: orders = [], isLoading: isLoadingOrders } = useOrders({\n customerId: currentUser?.id,\n });\n const [activeTab, setActiveTab] = useState<ProfileTab>('profile');\n const [isEditing, setIsEditing] = useState(false);\n\n // Use currentUser from context, fallback to defaults\n const profile = {\n firstName: currentUser?.firstName || currentUser?.name?.split(' ')[0] || 'Customer',\n lastName: currentUser?.lastName || currentUser?.name?.split(' ').slice(1).join(' ') || '',\n email: currentUser?.email || '',\n phone: '+91 98765 43210',\n profilePicture: currentUser?.avatar,\n isEmailVerified: true,\n isPhoneVerified: true,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n // Editable profile data\n const [profileData, setProfileData] = useState<ProfileData>({\n firstName: profile.firstName,\n lastName: profile.lastName,\n email: profile.email,\n phone: profile.phone,\n emergencyContact: {\n name: 'Priya Sharma',\n phone: '+91 98765 43211',\n relationship: 'Spouse',\n },\n dietary: ['vegetarian'],\n allergies: ['nuts', 'dairy'],\n notifications: {\n orderUpdates: true,\n promotions: true,\n newsletter: false,\n sms: true,\n },\n });\n\n const [editedData, setEditedData] = useState<ProfileData>({ ...profileData });\n\n // Calculate stats from real orders\n const stats = {\n totalOrders: orders.length,\n totalSpent: orders.reduce((acc, o) => acc + o.total, 0),\n loyaltyPoints: Math.floor(orders.reduce((acc, o) => acc + o.total, 0) / 10),\n avgOrderValue:\n orders.length > 0\n ? Math.floor(orders.reduce((acc, o) => acc + o.total, 0) / orders.length)\n : 0,\n favoriteCategory: 'South Indian',\n memberSince: profile.createdAt,\n };\n\n const isLoading = isLoadingOrders;\n\n const handleStartEdit = () => {\n setEditedData({ ...profileData });\n setIsEditing(true);\n };\n\n const handleCancelEdit = () => {\n setEditedData({ ...profileData });\n setIsEditing(false);\n };\n\n const handleSaveProfile = () => {\n setProfileData({ ...editedData });\n setIsEditing(false);\n alert('Profile updated successfully');\n };\n\n const handleSavePreferences = () => {\n setProfileData({ ...editedData });\n alert('Preferences saved successfully');\n };\n\n const handleFieldChange = (field: keyof ProfileData, value: string) => {\n setEditedData((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleEmergencyContactChange = (field: keyof EmergencyContact, value: string) => {\n setEditedData((prev) => ({\n ...prev,\n emergencyContact: { ...prev.emergencyContact, [field]: value },\n }));\n };\n\n const handleNotificationChange = (field: string, value: boolean) => {\n setEditedData((prev) => ({\n ...prev,\n notifications: { ...prev.notifications, [field]: value },\n }));\n };\n\n const handleArrayToggle = (field: 'dietary' | 'allergies', value: string, checked: boolean) => {\n setEditedData((prev) => {\n const currentArray = prev[field];\n const newArray = checked\n ? [...currentArray, value]\n : currentArray.filter((item) => item !== value);\n return { ...prev, [field]: newArray };\n });\n };\n\n const tabs: Array<{ key: ProfileTab; label: string; icon: typeof UserCircle }> = [\n { key: 'profile', label: 'Profile Info', icon: UserCircle },\n { key: 'preferences', label: 'Preferences', icon: Settings },\n { key: 'stats', label: 'My Stats', icon: BarChart3 },\n ];\n\n if (isLoading) {\n return (\n <PageLayout title=\"My Profile\">\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-foreground mx-auto mb-4\" />\n <p className=\"text-sm text-text-secondary\">Loading profile...</p>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout title=\"My Profile\" description=\"Manage your personal information and preferences\">\n {/* Profile Header */}\n <div className=\"flex flex-col items-center sm:flex-row sm:items-start gap-6 rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <div className=\"relative\">\n <div className=\"h-24 w-24 rounded-full bg-bg-sunken overflow-hidden\">\n {profile.profilePicture ? (\n <img\n src={profile.profilePicture}\n alt={`${profile.firstName} ${profile.lastName}`}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"flex h-full w-full items-center justify-center text-text-secondary\">\n <User className=\"h-10 w-10\" />\n </div>\n )}\n </div>\n <button\n type=\"button\"\n className=\"absolute bottom-0 right-0 flex h-8 w-8 items-center justify-center rounded-full bg-foreground text-background shadow-sm hover:opacity-90 transition-opacity\"\n >\n <Camera className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"flex-1 text-center sm:text-left\">\n <h2 className=\"text-xl font-semibold text-text-primary\">\n {profileData.firstName} {profileData.lastName}\n </h2>\n <p className=\"mt-1 text-sm text-text-secondary\">{profileData.email}</p>\n <p className=\"mt-0.5 text-sm text-text-secondary\">{profileData.phone}</p>\n <div className=\"flex flex-wrap items-center justify-center sm:justify-start gap-2 mt-2\">\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium',\n profile.isEmailVerified\n ? 'bg-status-success-bg-subtle/20 text-status-success-text'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n <CheckCircle2 className=\"h-3 w-3\" />\n {profile.isEmailVerified ? 'Email Verified' : 'Email Not Verified'}\n </span>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium',\n profile.isPhoneVerified\n ? 'bg-status-success-bg-subtle/20 text-status-success-text'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n <CheckCircle2 className=\"h-3 w-3\" />\n {profile.isPhoneVerified ? 'Phone Verified' : 'Phone Not Verified'}\n </span>\n </div>\n </div>\n\n <div className=\"text-center sm:text-right\">\n <p className=\"text-2xl font-bold text-text-primary\">{stats.loyaltyPoints}</p>\n <p className=\"text-xs text-text-secondary\">Loyalty Points</p>\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"mt-6 rounded-lg border border-border-subtle bg-bg-surface\">\n <div className=\"border-b border-border-subtle\">\n <nav className=\"flex -mb-px overflow-x-auto\">\n {tabs.map((tab) => {\n const Icon = tab.icon;\n return (\n <button\n key={tab.key}\n type=\"button\"\n className={cn(\n 'flex items-center gap-2 py-3.5 px-5 text-sm font-medium whitespace-nowrap transition-colors',\n activeTab === tab.key\n ? 'border-b-2 border-foreground text-text-primary'\n : 'text-text-secondary hover:text-text-primary'\n )}\n onClick={() => setActiveTab(tab.key)}\n >\n <Icon className=\"h-4 w-4\" />\n {tab.label}\n </button>\n );\n })}\n </nav>\n </div>\n\n <div className=\"p-5 md:p-6\">\n {/* Profile Tab */}\n {activeTab === 'profile' && (\n <div className=\"space-y-6\">\n {/* Header with Edit/Save/Cancel */}\n <div className=\"flex justify-between items-center\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Personal Information</h3>\n {isEditing ? (\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={handleSaveProfile}\n className=\"flex items-center gap-1.5 rounded-lg bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Save className=\"h-3 w-3\" />\n Save\n </button>\n <button\n type=\"button\"\n onClick={handleCancelEdit}\n className=\"flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <X className=\"h-3 w-3\" />\n Cancel\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={handleStartEdit}\n className=\"flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Edit3 className=\"h-3 w-3\" />\n Edit Profile\n </button>\n )}\n </div>\n\n {/* Editable Fields */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-5\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n First Name\n </label>\n <input\n type=\"text\"\n value={isEditing ? editedData.firstName : profileData.firstName}\n onChange={(e) => handleFieldChange('firstName', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Last Name\n </label>\n <input\n type=\"text\"\n value={isEditing ? editedData.lastName : profileData.lastName}\n onChange={(e) => handleFieldChange('lastName', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Email</label>\n <input\n type=\"email\"\n value={isEditing ? editedData.email : profileData.email}\n onChange={(e) => handleFieldChange('email', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Phone</label>\n <input\n type=\"tel\"\n value={isEditing ? editedData.phone : profileData.phone}\n onChange={(e) => handleFieldChange('phone', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n </div>\n\n {/* Primary Address */}\n <div>\n <h4 className=\"text-base font-semibold text-text-primary mb-3\">Primary Address</h4>\n <div className=\"rounded-lg bg-bg-sunken/50 p-4\">\n <p className=\"text-sm font-medium text-text-primary\">{mockAddresses[0].street}</p>\n <p className=\"text-sm text-text-secondary\">{mockAddresses[0].area}</p>\n <p className=\"text-sm text-text-secondary\">\n {mockAddresses[0].city}, {mockAddresses[0].state} - {mockAddresses[0].pincode}\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/addresses')}\n className=\"mt-2 flex items-center gap-1 text-xs font-medium text-text-secondary hover:text-text-primary transition-colors\"\n >\n <MapPin className=\"h-3 w-3\" />\n Manage Addresses\n <ChevronRight className=\"h-3 w-3\" />\n </button>\n </div>\n </div>\n\n {/* Emergency Contact */}\n <div>\n <h4 className=\"text-base font-semibold text-text-primary mb-3 flex items-center gap-2\">\n <AlertTriangle className=\"h-4 w-4 text-text-secondary\" />\n Emergency Contact\n </h4>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Name</label>\n <input\n type=\"text\"\n value={\n isEditing\n ? editedData.emergencyContact.name\n : profileData.emergencyContact.name\n }\n onChange={(e) => handleEmergencyContactChange('name', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Phone\n </label>\n <input\n type=\"tel\"\n value={\n isEditing\n ? editedData.emergencyContact.phone\n : profileData.emergencyContact.phone\n }\n onChange={(e) => handleEmergencyContactChange('phone', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Relationship\n </label>\n <input\n type=\"text\"\n value={\n isEditing\n ? editedData.emergencyContact.relationship\n : profileData.emergencyContact.relationship\n }\n onChange={(e) => handleEmergencyContactChange('relationship', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n </div>\n </div>\n\n {/* Save/Cancel at bottom when editing */}\n {isEditing && (\n <div className=\"flex gap-3 pt-4 border-t border-border-subtle\">\n <button\n type=\"button\"\n onClick={handleSaveProfile}\n className=\"flex items-center gap-2 rounded-lg bg-foreground px-4 py-2.5 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Save className=\"h-4 w-4\" />\n Save Changes\n </button>\n <button\n type=\"button\"\n onClick={handleCancelEdit}\n className=\"flex items-center gap-2 rounded-lg border border-border-subtle px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Cancel\n </button>\n </div>\n )}\n </div>\n )}\n\n {/* Preferences Tab */}\n {activeTab === 'preferences' && (\n <div className=\"space-y-8\">\n {/* Notification Preferences */}\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Bell className=\"h-4 w-4 text-text-secondary\" />\n Notification Preferences\n </h3>\n <div className=\"space-y-3\">\n {[\n { key: 'orderUpdates', label: 'Order status updates' },\n { key: 'promotions', label: 'Promotional offers and discounts' },\n { key: 'newsletter', label: 'Newsletter and food recommendations' },\n { key: 'sms', label: 'SMS notifications' },\n ].map((item) => (\n <label key={item.key} className=\"flex items-center gap-3 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={\n editedData.notifications[\n item.key as keyof typeof editedData.notifications\n ]\n }\n onChange={(e) => handleNotificationChange(item.key, e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle text-text-primary focus:ring-[var(--color-focus-ring)]\"\n />\n <span className=\"text-sm text-text-primary\">{item.label}</span>\n </label>\n ))}\n </div>\n </div>\n\n {/* Dietary Preferences */}\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Heart className=\"h-4 w-4 text-text-secondary\" />\n Dietary Preferences\n </h3>\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3\">\n {dietaryOptions.map((diet) => (\n <label key={diet} className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={editedData.dietary.includes(diet)}\n onChange={(e) => handleArrayToggle('dietary', diet, e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle text-text-primary focus:ring-[var(--color-focus-ring)]\"\n />\n <span className=\"text-sm text-text-primary capitalize\">{diet}</span>\n </label>\n ))}\n </div>\n </div>\n\n {/* Food Allergies */}\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <AlertTriangle className=\"h-4 w-4 text-status-error-text\" />\n Food Allergies\n </h3>\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3\">\n {allergyOptions.map((allergy) => (\n <label key={allergy} className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={editedData.allergies.includes(allergy)}\n onChange={(e) => handleArrayToggle('allergies', allergy, e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle text-status-error-text focus:ring-destructive\"\n />\n <span className=\"text-sm text-text-primary capitalize\">{allergy}</span>\n </label>\n ))}\n </div>\n </div>\n\n {/* Save Preferences */}\n <div className=\"pt-4 border-t border-border-subtle\">\n <button\n type=\"button\"\n onClick={handleSavePreferences}\n className=\"flex items-center gap-2 rounded-lg bg-foreground px-4 py-2.5 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Save className=\"h-4 w-4\" />\n Save Preferences\n </button>\n </div>\n </div>\n )}\n\n {/* Stats Tab */}\n {activeTab === 'stats' && (\n <div className=\"space-y-8\">\n {/* Top Stats Cards */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"rounded-lg bg-accent-blue-subtle/10 p-5 border border-accent-blue-subtle/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n <ShoppingBag className=\"h-4 w-4 text-accent-blue\" />\n <h4 className=\"text-sm font-medium text-accent-blue\">\n Total Orders\n </h4>\n </div>\n <p className=\"text-3xl font-bold text-accent-blue\">\n {stats.totalOrders}\n </p>\n </div>\n <div className=\"rounded-lg bg-status-success-bg-subtle/10 p-5 border border-status-success-border/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n <IndianRupee className=\"h-4 w-4 text-status-success-text\" />\n <h4 className=\"text-sm font-medium text-status-success-text\">\n Total Spent\n </h4>\n </div>\n <p className=\"text-3xl font-bold text-status-success-text\">\n {formatCurrency(stats.totalSpent, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div className=\"rounded-lg bg-accent-purple-subtle/10 p-5 border border-accent-purple-subtle/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Award className=\"h-4 w-4 text-accent-purple\" />\n <h4 className=\"text-sm font-medium text-accent-purple\">\n Loyalty Points\n </h4>\n </div>\n <p className=\"text-3xl font-bold text-accent-purple\">\n {stats.loyaltyPoints}\n </p>\n </div>\n </div>\n\n {/* Details Grid */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n {/* Order Statistics */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop\">\n <h4 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-4 w-4 text-text-secondary\" />\n Order Statistics\n </h4>\n <div className=\"space-y-3\">\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Average Order Value</span>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(stats.avgOrderValue, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Favorite Category</span>\n <span className=\"text-sm font-medium text-text-primary\">\n {stats.favoriteCategory}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Member Since</span>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatDate(stats.memberSince, {\n hour: undefined,\n minute: undefined,\n hour12: undefined,\n })}\n </span>\n </div>\n </div>\n </div>\n\n {/* Account Status */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop\">\n <h4 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Shield className=\"h-4 w-4 text-text-secondary\" />\n Account Status\n </h4>\n <div className=\"space-y-3\">\n <div className=\"flex justify-between items-center\">\n <span className=\"text-sm text-text-secondary\">Email Verification</span>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium',\n profile.isEmailVerified\n ? 'bg-status-success-bg-subtle/20 text-status-success-text'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n {profile.isEmailVerified ? 'Verified' : 'Not Verified'}\n </span>\n </div>\n <div className=\"flex justify-between items-center\">\n <span className=\"text-sm text-text-secondary\">Phone Verification</span>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium',\n profile.isPhoneVerified\n ? 'bg-status-success-bg-subtle/20 text-status-success-text'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n {profile.isPhoneVerified ? 'Verified' : 'Not Verified'}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Last Updated</span>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatDate(profile.updatedAt, {\n hour: undefined,\n minute: undefined,\n hour12: undefined,\n })}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -48,6 +48,7 @@ function k() {
|
|
|
48
48
|
if (!j) return /* @__PURE__ */ w(n, {
|
|
49
49
|
title: "Cart Not Found",
|
|
50
50
|
children: /* @__PURE__ */ w(r, {
|
|
51
|
+
illustration: "empty-search",
|
|
51
52
|
icon: /* @__PURE__ */ w(h, { className: "h-12 w-12" }),
|
|
52
53
|
title: "Service not available",
|
|
53
54
|
description: "Direct service is not available for this cart.",
|
|
@@ -107,13 +108,13 @@ function k() {
|
|
|
107
108
|
children: [/* @__PURE__ */ T("div", {
|
|
108
109
|
className: "flex flex-col items-center",
|
|
109
110
|
children: [/* @__PURE__ */ w("div", {
|
|
110
|
-
className: t("flex h-8 w-8 items-center justify-center rounded-full text-xs font-medium", r ? "bg-
|
|
111
|
+
className: t("flex h-8 w-8 items-center justify-center rounded-full text-xs font-medium", r ? "bg-status-success-bg-subtle/20 text-status-success-text" : i ? "bg-foreground text-background" : "bg-bg-sunken text-text-secondary"),
|
|
111
112
|
children: r ? /* @__PURE__ */ w(f, { className: "h-4 w-4" }) : n + 1
|
|
112
113
|
}), /* @__PURE__ */ w("span", {
|
|
113
114
|
className: t("mt-1 text-[10px]", i ? "font-medium text-text-primary" : "text-text-secondary"),
|
|
114
115
|
children: D[e]
|
|
115
116
|
})]
|
|
116
|
-
}), n < E.length - 1 && /* @__PURE__ */ w("div", { className: t("mx-2 h-0.5 w-8 sm:w-16", r ? "bg-
|
|
117
|
+
}), n < E.length - 1 && /* @__PURE__ */ w("div", { className: t("mx-2 h-0.5 w-8 sm:w-16", r ? "bg-status-success-bg-subtle/30" : "bg-border") })]
|
|
117
118
|
}, e);
|
|
118
119
|
})
|
|
119
120
|
}), /* @__PURE__ */ T("div", {
|
|
@@ -122,7 +123,7 @@ function k() {
|
|
|
122
123
|
className: "lg:col-span-2",
|
|
123
124
|
children: [
|
|
124
125
|
M === "location" && /* @__PURE__ */ T("div", {
|
|
125
|
-
className: "rounded-lg border border-border-
|
|
126
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
|
|
126
127
|
children: [
|
|
127
128
|
/* @__PURE__ */ T("h2", {
|
|
128
129
|
className: "text-base font-semibold text-text-primary mb-1 flex items-center gap-2",
|
|
@@ -138,7 +139,7 @@ function k() {
|
|
|
138
139
|
/* @__PURE__ */ T("div", { children: [/* @__PURE__ */ T("label", {
|
|
139
140
|
className: "block text-sm font-medium text-text-primary mb-1.5",
|
|
140
141
|
children: ["Your Address ", /* @__PURE__ */ w("span", {
|
|
141
|
-
className: "text-
|
|
142
|
+
className: "text-status-error-text",
|
|
142
143
|
children: "*"
|
|
143
144
|
})]
|
|
144
145
|
}), /* @__PURE__ */ T("div", {
|
|
@@ -188,7 +189,7 @@ function k() {
|
|
|
188
189
|
/* @__PURE__ */ T("div", { children: [/* @__PURE__ */ T("label", {
|
|
189
190
|
className: "block text-sm font-medium text-text-primary mb-1.5",
|
|
190
191
|
children: ["Phone Number ", /* @__PURE__ */ w("span", {
|
|
191
|
-
className: "text-
|
|
192
|
+
className: "text-status-error-text",
|
|
192
193
|
children: "*"
|
|
193
194
|
})]
|
|
194
195
|
}), /* @__PURE__ */ T("div", {
|
|
@@ -209,7 +210,7 @@ function k() {
|
|
|
209
210
|
]
|
|
210
211
|
}),
|
|
211
212
|
M === "details" && /* @__PURE__ */ T("div", {
|
|
212
|
-
className: "rounded-lg border border-border-
|
|
213
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
|
|
213
214
|
children: [
|
|
214
215
|
/* @__PURE__ */ T("h2", {
|
|
215
216
|
className: "text-base font-semibold text-text-primary mb-1 flex items-center gap-2",
|
|
@@ -225,7 +226,7 @@ function k() {
|
|
|
225
226
|
/* @__PURE__ */ T("div", { children: [/* @__PURE__ */ T("label", {
|
|
226
227
|
className: "block text-sm font-medium text-text-primary mb-1.5",
|
|
227
228
|
children: ["Preferred Time Slot ", /* @__PURE__ */ w("span", {
|
|
228
|
-
className: "text-
|
|
229
|
+
className: "text-status-error-text",
|
|
229
230
|
children: "*"
|
|
230
231
|
})]
|
|
231
232
|
}), /* @__PURE__ */ w("div", {
|
|
@@ -273,7 +274,7 @@ function k() {
|
|
|
273
274
|
]
|
|
274
275
|
}),
|
|
275
276
|
M === "payment" && /* @__PURE__ */ T("div", {
|
|
276
|
-
className: "rounded-lg border border-border-
|
|
277
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
|
|
277
278
|
children: [
|
|
278
279
|
/* @__PURE__ */ T("h2", {
|
|
279
280
|
className: "text-base font-semibold text-text-primary mb-1 flex items-center gap-2",
|
|
@@ -287,9 +288,9 @@ function k() {
|
|
|
287
288
|
className: "space-y-4",
|
|
288
289
|
children: [
|
|
289
290
|
/* @__PURE__ */ T("div", {
|
|
290
|
-
className: "flex items-start gap-2 rounded-lg border border-blue-
|
|
291
|
-
children: [/* @__PURE__ */ w(c, { className: "h-4 w-4 text-
|
|
292
|
-
className: "text-xs text-
|
|
291
|
+
className: "flex items-start gap-2 rounded-lg border border-accent-blue-subtle/20 bg-accent-blue-subtle/5 p-3",
|
|
292
|
+
children: [/* @__PURE__ */ w(c, { className: "h-4 w-4 text-accent-blue shrink-0 mt-0.5" }), /* @__PURE__ */ T("p", {
|
|
293
|
+
className: "text-xs text-accent-blue",
|
|
293
294
|
children: [
|
|
294
295
|
"You need to pay ",
|
|
295
296
|
i(100, { minimumFractionDigits: 0 }),
|
|
@@ -386,14 +387,14 @@ function k() {
|
|
|
386
387
|
]
|
|
387
388
|
}),
|
|
388
389
|
M === "confirmation" && H && /* @__PURE__ */ T("div", {
|
|
389
|
-
className: "rounded-lg border border-border-
|
|
390
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
|
|
390
391
|
children: [
|
|
391
392
|
/* @__PURE__ */ T("div", {
|
|
392
393
|
className: "text-center mb-6",
|
|
393
394
|
children: [
|
|
394
395
|
/* @__PURE__ */ w("div", {
|
|
395
|
-
className: "mx-auto mb-3 flex h-14 w-14 items-center justify-center rounded-full bg-
|
|
396
|
-
children: /* @__PURE__ */ w(f, { className: "h-7 w-7 text-
|
|
396
|
+
className: "mx-auto mb-3 flex h-14 w-14 items-center justify-center rounded-full bg-status-success-bg-subtle/10",
|
|
397
|
+
children: /* @__PURE__ */ w(f, { className: "h-7 w-7 text-status-success-text" })
|
|
397
398
|
}),
|
|
398
399
|
/* @__PURE__ */ w("h2", {
|
|
399
400
|
className: "text-lg font-semibold text-text-primary mb-1",
|
|
@@ -448,9 +449,9 @@ function k() {
|
|
|
448
449
|
})]
|
|
449
450
|
}),
|
|
450
451
|
/* @__PURE__ */ T("div", {
|
|
451
|
-
className: "rounded-lg border border-
|
|
452
|
+
className: "rounded-lg border border-status-success-border/20 bg-status-success-bg-subtle/5 p-4 mb-4",
|
|
452
453
|
children: [/* @__PURE__ */ T("h3", {
|
|
453
|
-
className: "text-sm font-medium text-
|
|
454
|
+
className: "text-sm font-medium text-status-success-text mb-2 flex items-center gap-2",
|
|
454
455
|
children: [/* @__PURE__ */ w(f, { className: "h-4 w-4" }), "Payment Processed"]
|
|
455
456
|
}), /* @__PURE__ */ T("div", {
|
|
456
457
|
className: "grid grid-cols-2 gap-3 text-sm",
|
|
@@ -480,23 +481,23 @@ function k() {
|
|
|
480
481
|
className: "text-xs text-text-secondary",
|
|
481
482
|
children: "Status"
|
|
482
483
|
}), /* @__PURE__ */ w("p", {
|
|
483
|
-
className: "font-medium text-
|
|
484
|
+
className: "font-medium text-status-success-text",
|
|
484
485
|
children: "Paid"
|
|
485
486
|
})] })
|
|
486
487
|
]
|
|
487
488
|
})]
|
|
488
489
|
}),
|
|
489
490
|
/* @__PURE__ */ T("div", {
|
|
490
|
-
className: "rounded-lg border border-blue-
|
|
491
|
+
className: "rounded-lg border border-accent-blue-subtle/20 bg-accent-blue-subtle/5 p-4 mb-6",
|
|
491
492
|
children: [/* @__PURE__ */ w("h3", {
|
|
492
|
-
className: "text-sm font-medium text-
|
|
493
|
+
className: "text-sm font-medium text-accent-blue mb-2",
|
|
493
494
|
children: "Next Steps"
|
|
494
495
|
}), /* @__PURE__ */ T("div", {
|
|
495
|
-
className: "space-y-2 text-xs text-
|
|
496
|
+
className: "space-y-2 text-xs text-accent-blue",
|
|
496
497
|
children: [
|
|
497
498
|
/* @__PURE__ */ T("div", {
|
|
498
499
|
className: "flex items-start gap-2",
|
|
499
|
-
children: [/* @__PURE__ */ w(f, { className: "h-3.5 w-3.5 text-
|
|
500
|
+
children: [/* @__PURE__ */ w(f, { className: "h-3.5 w-3.5 text-status-success-text mt-0.5 shrink-0" }), /* @__PURE__ */ T("span", { children: [
|
|
500
501
|
"Payment confirmed -",
|
|
501
502
|
" ",
|
|
502
503
|
i(100, { minimumFractionDigits: 0 }),
|
|
@@ -562,7 +563,7 @@ function k() {
|
|
|
562
563
|
}), /* @__PURE__ */ w("div", {
|
|
563
564
|
className: "lg:col-span-1",
|
|
564
565
|
children: /* @__PURE__ */ T("div", {
|
|
565
|
-
className: "sticky top-6 rounded-lg border border-border-
|
|
566
|
+
className: "sticky top-6 rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
|
|
566
567
|
children: [
|
|
567
568
|
/* @__PURE__ */ w("h3", {
|
|
568
569
|
className: "text-base font-semibold text-text-primary mb-4",
|
|
@@ -605,7 +606,7 @@ function k() {
|
|
|
605
606
|
})]
|
|
606
607
|
}),
|
|
607
608
|
/* @__PURE__ */ T("div", {
|
|
608
|
-
className: "flex items-center gap-2 mt-3 pt-3 border-t border-border-subtle text-
|
|
609
|
+
className: "flex items-center gap-2 mt-3 pt-3 border-t border-border-subtle text-status-success-text",
|
|
609
610
|
children: [/* @__PURE__ */ w(f, { className: "h-3.5 w-3.5" }), /* @__PURE__ */ w("span", {
|
|
610
611
|
className: "text-xs",
|
|
611
612
|
children: "Pay remaining amount at cart"
|