Pre luanch plan phase 1 complete
This commit is contained in:
@@ -376,9 +376,8 @@ export default function SignUpFormEnhanced({ planDetails: planDetailsProp, planL
|
||||
</div>
|
||||
|
||||
{isPaidPlan ? (
|
||||
<Button type="button" variant="primary" onClick={handleNextStep} className="w-full">
|
||||
<Button type="button" variant="primary" onClick={handleNextStep} className="w-full" endIcon={<ChevronRightIcon className="w-4 h-4" />}>
|
||||
Continue to Billing
|
||||
<ChevronRightIcon className="w-4 h-4 ml-2" />
|
||||
</Button>
|
||||
) : (
|
||||
<Button type="submit" variant="primary" disabled={loading} className="w-full">
|
||||
@@ -401,9 +400,8 @@ export default function SignUpFormEnhanced({ planDetails: planDetailsProp, planL
|
||||
<Button type="button" variant="outline" onClick={handlePrevStep} className="flex-1">
|
||||
Back
|
||||
</Button>
|
||||
<Button type="button" variant="primary" onClick={handleNextStep} className="flex-1">
|
||||
<Button type="button" variant="primary" onClick={handleNextStep} className="flex-1" endIcon={<ChevronRightIcon className="w-4 h-4" />}>
|
||||
Continue to Payment
|
||||
<ChevronRightIcon className="w-4 h-4 ml-2" />
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
31
frontend/src/components/common/PageLoader.tsx
Normal file
31
frontend/src/components/common/PageLoader.tsx
Normal file
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* Page Loader Component - Global page loading indicator
|
||||
* Displays a consistent spinner overlay when pages are loading
|
||||
* Used in AppLayout to provide unified loading experience across all pages
|
||||
*/
|
||||
import React from 'react';
|
||||
import { Spinner } from '../ui/spinner/Spinner';
|
||||
import { usePageLoadingContext } from '../../context/PageLoadingContext';
|
||||
|
||||
interface PageLoaderProps {
|
||||
className?: string;
|
||||
}
|
||||
|
||||
export const PageLoader: React.FC<PageLoaderProps> = ({ className = '' }) => {
|
||||
const { isLoading, loadingMessage } = usePageLoadingContext();
|
||||
|
||||
if (!isLoading) return null;
|
||||
|
||||
return (
|
||||
<div className={`flex flex-col items-center justify-center py-20 ${className}`}>
|
||||
<Spinner size="lg" color="primary" />
|
||||
{loadingMessage && (
|
||||
<p className="mt-4 text-sm text-gray-500 dark:text-gray-400">
|
||||
{loadingMessage}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default PageLoader;
|
||||
@@ -52,8 +52,8 @@ export default function SiteCard({
|
||||
|
||||
return (
|
||||
<article className="rounded-2xl border border-gray-200 bg-white dark:border-gray-800 dark:bg-white/3">
|
||||
<div className="relative p-5 pb-9">
|
||||
<div className="flex items-center gap-3 mb-3">
|
||||
<div className="relative p-3 pb-5">
|
||||
<div className="flex items-center gap-2 mb-1">
|
||||
<div className="inline-flex items-center justify-center">
|
||||
{icon}
|
||||
</div>
|
||||
@@ -61,32 +61,34 @@ export default function SiteCard({
|
||||
{site.name}
|
||||
</h3>
|
||||
</div>
|
||||
<p className="max-w-xs text-sm text-gray-500 dark:text-gray-400 mb-2">
|
||||
{site.description || 'No description'}
|
||||
</p>
|
||||
{site.domain && (
|
||||
<p className="text-xs text-gray-400 dark:text-gray-500 mb-2">
|
||||
<p className="text-xs text-gray-400 dark:text-gray-500 mb-2 ml-8">
|
||||
{site.domain}
|
||||
</p>
|
||||
)}
|
||||
<div className="flex items-center gap-2 mb-2 flex-wrap">
|
||||
<SiteTypeBadge hostingType={site.hosting_type} />
|
||||
{site.description && (
|
||||
<p className="max-w-xs text-sm text-gray-500 dark:text-gray-400 mb-2">
|
||||
{site.description}
|
||||
</p>
|
||||
)}
|
||||
<div className="flex items-center gap-1.5 mb-2 flex-wrap">
|
||||
<SiteTypeBadge hostingType={site.hosting_type} size="xs" />
|
||||
{site.industry_name && (
|
||||
<Badge variant="soft" color="warning" size="sm">
|
||||
<Badge variant="soft" color="warning" size="xs">
|
||||
{site.industry_name}
|
||||
</Badge>
|
||||
)}
|
||||
<Badge variant="soft" color="neutral" size="sm">
|
||||
<Badge variant="soft" color="neutral" size="xs">
|
||||
{site.active_sectors_count} / 5 Sectors
|
||||
</Badge>
|
||||
{site.status && (
|
||||
<Badge variant={site.is_active ? 'solid' : 'soft'} color={site.status === 'active' ? 'success' : 'neutral'} size="sm">
|
||||
<Badge variant={site.is_active ? 'solid' : 'soft'} color={site.status === 'active' ? 'success' : 'neutral'} size="xs">
|
||||
{site.status}
|
||||
</Badge>
|
||||
)}
|
||||
</div>
|
||||
{/* Setup Checklist - Compact View */}
|
||||
<div className="mt-3">
|
||||
<div className="mt-2">
|
||||
<SiteSetupChecklist
|
||||
siteId={site.id}
|
||||
siteName={site.name}
|
||||
@@ -98,18 +100,18 @@ export default function SiteCard({
|
||||
/>
|
||||
</div>
|
||||
{/* Status Text and Circle - Same row */}
|
||||
<div className="absolute top-5 right-5 flex items-center gap-2">
|
||||
<div className="absolute top-3 right-3 flex items-center gap-2">
|
||||
<span className={`text-sm ${statusText.color} ${statusText.bold ? 'font-bold' : ''} transition-colors duration-200`}>
|
||||
{statusText.text}
|
||||
</span>
|
||||
<div
|
||||
className={`w-[25px] h-[25px] rounded-full ${getStatusColor()} transition-colors duration-200`}
|
||||
className={`w-[20px] h-[20px] rounded-full ${getStatusColor()} transition-colors duration-200`}
|
||||
title={site.is_active ? 'Active site' : 'Inactive site'}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-center justify-between border-t border-gray-200 p-4 dark:border-gray-800">
|
||||
<div className="flex gap-2 flex-1">
|
||||
<div className="flex items-center justify-between border-t border-gray-200 p-2 dark:border-gray-800">
|
||||
<div className="flex gap-1.5 flex-1">
|
||||
<Button
|
||||
variant="primary"
|
||||
tone="brand"
|
||||
|
||||
@@ -9,7 +9,7 @@ import Badge from '../ui/badge/Badge';
|
||||
interface SiteTypeBadgeProps {
|
||||
hostingType: string;
|
||||
className?: string;
|
||||
size?: 'sm' | 'md' | 'lg';
|
||||
size?: 'xs' | 'sm' | 'md' | 'lg';
|
||||
}
|
||||
|
||||
export default function SiteTypeBadge({ hostingType, className = '', size = 'sm' }: SiteTypeBadgeProps) {
|
||||
|
||||
Reference in New Issue
Block a user