Refactor Site Builder Integration and Update Docker Configuration

- Merged the site builder functionality into the main app, enhancing the SiteBuilderWizard component with new steps and improved UI.
- Updated the Docker Compose configuration by removing the separate site builder service and integrating its functionality into the igny8_sites service.
- Enhanced Vite configuration to support code-splitting for builder routes, optimizing loading times.
- Updated package dependencies to include new libraries for state management and form handling.
This commit is contained in:
IGNY8 VPS (Salman)
2025-11-18 10:35:30 +00:00
parent 8508af37c7
commit 3ea519483d
19 changed files with 1637 additions and 91 deletions

View File

@@ -0,0 +1,125 @@
import type { BuilderFormData } from "../../../../types/siteBuilder";
import { Card } from "../../../../components/ui/card";
import { useSiteStore } from "../../../../store/siteStore";
import { useSectorStore } from "../../../../store/sectorStore";
const inputClass =
"h-11 w-full rounded-xl border border-gray-200 bg-white px-4 text-sm font-medium text-gray-900 placeholder:text-gray-400 focus:border-brand-300 focus:outline-hidden focus:ring-3 focus:ring-brand-500/10 dark:border-white/10 dark:bg-white/[0.03] dark:text-white/90 dark:placeholder:text-white/30 dark:focus:border-brand-800";
const labelClass =
"text-sm font-semibold text-gray-700 dark:text-white/80 mb-2 inline-block";
interface Props {
data: BuilderFormData;
onChange: <K extends keyof BuilderFormData>(
key: K,
value: BuilderFormData[K],
) => void;
}
export function BusinessDetailsStep({ data, onChange }: Props) {
const { activeSite } = useSiteStore();
const { activeSector } = useSectorStore();
return (
<div className="space-y-6">
<Card variant="panel" padding="lg">
<div className="flex flex-col gap-2">
<p className="text-xs font-semibold uppercase tracking-wider text-gray-500 dark:text-white/50">
Context
</p>
<h3 className="text-lg font-semibold text-gray-900 dark:text-white">
Site &amp; Sector
</h3>
<p className="text-sm text-gray-500 dark:text-gray-400">
The wizard will use your currently active site and sector. Switch
them from the header at any time.
</p>
</div>
<div className="mt-4 grid grid-cols-1 gap-4 md:grid-cols-2">
<div className="rounded-2xl border border-brand-100 bg-brand-50/60 p-4 dark:border-brand-500/40 dark:bg-brand-500/10">
<p className="text-xs uppercase tracking-wide text-brand-600 dark:text-brand-300">
Active Site
</p>
<p className="text-base font-semibold text-brand-700 dark:text-brand-200">
{activeSite?.name ?? "No site selected"}
</p>
</div>
<div className="rounded-2xl border border-indigo-100 bg-indigo-50/60 p-4 dark:border-indigo-500/40 dark:bg-indigo-500/10">
<p className="text-xs uppercase tracking-wide text-indigo-600 dark:text-indigo-300">
Active Sector
</p>
<p className="text-base font-semibold text-indigo-700 dark:text-indigo-200">
{activeSector?.name ?? "All sectors"}
</p>
</div>
</div>
</Card>
<Card variant="surface" padding="lg">
<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
<div>
<label className={labelClass}>Site name</label>
<input
className={inputClass}
type="text"
value={data.siteName}
placeholder="Acme Robotics"
onChange={(event) => onChange("siteName", event.target.value)}
/>
</div>
<div>
<label className={labelClass}>Hosting preference</label>
<select
className={inputClass}
value={data.hostingType}
onChange={(event) =>
onChange("hostingType", event.target.value as BuilderFormData["hostingType"])
}
>
<option value="igny8_sites">IGNY8 Sites</option>
<option value="wordpress">WordPress</option>
<option value="shopify">Shopify</option>
<option value="multi">Multiple destinations</option>
</select>
</div>
</div>
<div className="mt-6 grid grid-cols-1 gap-6 md:grid-cols-2">
<div>
<label className={labelClass}>Business type</label>
<input
className={inputClass}
type="text"
value={data.businessType}
placeholder="B2B SaaS platform"
onChange={(event) => onChange("businessType", event.target.value)}
/>
</div>
<div>
<label className={labelClass}>Industry</label>
<input
className={inputClass}
type="text"
value={data.industry}
placeholder="Supply chain automation"
onChange={(event) => onChange("industry", event.target.value)}
/>
</div>
</div>
<div className="mt-6">
<label className={labelClass}>Target audience</label>
<input
className={inputClass}
type="text"
value={data.targetAudience}
placeholder="Operations leaders at fast-scaling eCommerce brands"
onChange={(event) => onChange("targetAudience", event.target.value)}
/>
</div>
</Card>
</div>
);
}