Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added public/project-images/CoreStack(1).png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/project-images/CoreStack.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/project-images/Tailor.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
29 changes: 29 additions & 0 deletions src/components/MissingEnvScreen.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
const MissingEnvScreen = () => {
return (
<div className="flex min-h-screen flex-col items-center justify-center bg-brand-black px-6 text-center text-white">
<p className="text-xs font-semibold uppercase tracking-[0.2em] text-brand-lavender">
Setup required
</p>

<h1 className="mt-4 text-3xl font-display font-bold">
Supabase environment variables are missing
</h1>

<p className="mt-4 max-w-xl text-sm text-gray-400">
Create a <code className="text-brand-cyan">.env</code> file in the
project root with{" "}
<code className="text-brand-cyan">VITE_SUPABASE_URL</code> and{" "}
<code className="text-brand-cyan">VITE_SUPABASE_ANON_KEY</code>, then
restart <code className="text-brand-cyan">npm run dev</code>.
</p>

<p className="mt-3 max-w-xl text-xs text-gray-500">
See <code>.env.example</code> for the expected format. Legacy
MongoDB/Express keys in <code>.env</code> are not used by this
frontend.
</p>
</div>
);
};

export default MissingEnvScreen;
69 changes: 51 additions & 18 deletions src/constants/projects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,61 @@ export const portfolioProjects: readonly PortfolioProject[] = [
shortDescription:
"An AI-powered Conversion Rate Optimization (CRO) platform providing intent-aware analysis, actionable reports, and website conversion insights.",
category: "Analytics & Growth",
tags: ["React", "TypeScript", "Tailwind", "Analytics"],
tags: ["React", "TypeScript", "Tailwind", "Analytics","Reports", "CRO"],
status: "live",
accentGradient: "bg-gradient-to-r from-violet-600 via-purple-600 to-indigo-600",
visual: "📈",
imageSrc: "/project-images/Convertly_project.png",
imageAlt: "Convertly Dashboard",
directLink: "https://convertly.hmcoding.com/",
badgeLabelOverride: "Live Product",

},
{
slug: "corestack",
title: "CoreStack",
shortDescription:
"CoreStack is a centralized practice management platform for CA firms, streamlining clients, tasks, billing, documents, and team workflows with role-based visibility.",
category: "Management",
tags: ["React", "TypeScript", "Tailwind", "CA Firm", "Management", "Platform"],
status: "live",
accentGradient: "bg-gradient-to-r from-blue-500 via-indigo-500 to-violet-600",
visual: "🏢",
imageSrc: "/project-images/CoreStack(1).png",
imageAlt: "CoreStack Dashboard",
directLink: "https://corestack.hmcoding.com/",
badgeLabelOverride: "Live Project",
},
{
slug: "tailor",
title: "Tailor",
shortDescription:
"Tailor Management System is a full-stack web app that centralizes customer profiles, body measurements, garment orders, and delivery schedules for tailoring businesses.",
category: "Management",
tags: ["React", "TypeScript", "Tailwind", "Tailoring", "Orders", "Management"],
status: "live",
accentGradient: "bg-gradient-to-r from-pink-500 via-rose-500 to-red-600",
visual: "✂️",
imageSrc: "/project-images/Tailor.jpg",
imageAlt: "Tailor Dashboard",
directLink: "https://tms-frontend-x0we.onrender.com/",
badgeLabelOverride: "Live Project"

},
{
slug: "restaurant-pos",
title: "Restaurant POS System",
shortDescription:
"Fast counter workflow: orders, kitchen routing, tabs, and shift reporting in one calm, touch-friendly surface.",
category: "Point of sale",
tags: ["React", "Real-time", "Payments", "Kitchen display"],
status: "live",
accentGradient: "bg-gradient-to-r from-orange-500 via-rose-500 to-amber-600",
visual: "🍽️",
imageSrc: "/project-images/restaurant.png",
imageAlt: "Restaurant POS System Dashboard",
directLink: "https://dishdash.hmcoding.com/",
badgeLabelOverride: "Live Project"
},
{
slug: "gym-management",
Expand Down Expand Up @@ -57,7 +104,6 @@ export const portfolioProjects: readonly PortfolioProject[] = [
imageAlt: "Client Reminder CRM Dashboard",
directLink: "https://remindflow.hmcoding.com/",
badgeLabelOverride: "Live Project",

},
{
slug: "inventory-system",
Expand All @@ -71,6 +117,7 @@ export const portfolioProjects: readonly PortfolioProject[] = [
visual: "📦",
imageSrc: "/project-images/inventory.jpg",
imageAlt: "Inventory Management Dashboard",
badgeLabelOverride: "Live Demo",
},
{
slug: "real-estate-crm",
Expand All @@ -84,21 +131,7 @@ export const portfolioProjects: readonly PortfolioProject[] = [
visual: "🏠",
imageSrc: "/project-images/real-state.png",
imageAlt: "Real Estate CRM Dashboard",
},
{

slug: "restaurant-pos",
title: "Restaurant POS System",
shortDescription:
"Fast counter workflow: orders, kitchen routing, tabs, and shift reporting in one calm, touch-friendly surface.",
category: "Point of sale",
tags: ["React", "Real-time", "Payments", "Kitchen display"],
status: "live",
accentGradient: "bg-gradient-to-r from-orange-500 via-rose-500 to-amber-600",
visual: "🍽️",
imageSrc: "/project-images/restaurant.png",
imageAlt: "Restaurant POS System Dashboard",

badgeLabelOverride: "Live Demo",
},
] as const;

Expand All @@ -114,7 +147,7 @@ export function isKnownPortfolioSlug(slug: string): boolean {

/** Homepage spotlight — order defines card order (must exist on `portfolioProjects`). */

export const homeFeaturedProjectSlugs = ["convertly", "gym-management", "client-reminder-crm"] as const;
export const homeFeaturedProjectSlugs = ["convertly", "corestack", "tailor"] as const;


export function getHomeFeaturedProjects(): PortfolioProject[] {
Expand Down
20 changes: 1 addition & 19 deletions src/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,7 @@ import "./index.css";
import { GlobalLoaderProvider } from "./context/GlobalLoaderContext";
import { ErrorBoundary } from "./components/ErrorBoundary";
import { isSupabaseConfigured } from "./lib/supabase";

function MissingEnvScreen() {
return (
<div className="flex min-h-screen flex-col items-center justify-center bg-brand-black px-6 text-center text-white">
<p className="text-xs font-semibold uppercase tracking-[0.2em] text-brand-lavender">Setup required</p>
<h1 className="mt-4 text-3xl font-display font-bold">Supabase environment variables are missing</h1>
<p className="mt-4 max-w-xl text-sm text-gray-400">
Create a <code className="text-brand-cyan">.env</code> file in the project root with{" "}
<code className="text-brand-cyan">VITE_SUPABASE_URL</code> and{" "}
<code className="text-brand-cyan">VITE_SUPABASE_ANON_KEY</code>, then restart{" "}
<code className="text-brand-cyan">npm run dev</code>.
</p>
<p className="mt-3 max-w-xl text-xs text-gray-500">
See <code>.env.example</code> for the expected format. Legacy MongoDB/Express keys in{" "}
<code>.env</code> are not used by this frontend.
</p>
</div>
);
}
import MissingEnvScreen from "./components/MissingEnvScreen";

const root = document.getElementById("root");

Expand Down
Loading