README.md CHANGED
@@ -1,10 +1 @@
1
- ---
2
- title: Hyzo
3
- emoji: πŸ‘€
4
- colorFrom: blue
5
- colorTo: purple
6
- sdk: docker
7
- pinned: false
8
- ---
9
-
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
+ # Here are your Instructions
 
 
 
 
 
 
 
 
 
backend/.env ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ MONGO_URL="mongodb://localhost:27017"
2
+ DB_NAME="test_database"
backend/requirements.txt ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ fastapi==0.110.1
2
+ uvicorn==0.25.0
3
+ boto3>=1.34.129
4
+ requests-oauthlib>=2.0.0
5
+ cryptography>=42.0.8
6
+ python-dotenv>=1.0.1
7
+ pymongo==4.5.0
8
+ pydantic>=2.6.4
9
+ email-validator>=2.2.0
10
+ pyjwt>=2.10.1
11
+ passlib>=1.7.4
12
+ tzdata>=2024.2
13
+ motor==3.3.1
14
+ pytest>=8.0.0
15
+ black>=24.1.1
16
+ isort>=5.13.2
17
+ flake8>=7.0.0
18
+ mypy>=1.8.0
19
+ python-jose>=3.3.0
20
+ requests>=2.31.0
21
+ pandas>=2.2.0
22
+ numpy>=1.26.0
23
+ python-multipart>=0.0.9
24
+ jq>=1.6.0
25
+ typer>=0.9.0
backend/server.py ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, APIRouter
2
+ from dotenv import load_dotenv
3
+ from starlette.middleware.cors import CORSMiddleware
4
+ from motor.motor_asyncio import AsyncIOMotorClient
5
+ import os
6
+ import logging
7
+ from pathlib import Path
8
+ from pydantic import BaseModel, Field
9
+ from typing import List
10
+ import uuid
11
+ from datetime import datetime
12
+
13
+
14
+ ROOT_DIR = Path(__file__).parent
15
+ load_dotenv(ROOT_DIR / '.env')
16
+
17
+ # MongoDB connection
18
+ mongo_url = os.environ['MONGO_URL']
19
+ client = AsyncIOMotorClient(mongo_url)
20
+ db = client[os.environ['DB_NAME']]
21
+
22
+ # Create the main app without a prefix
23
+ app = FastAPI()
24
+
25
+ # Create a router with the /api prefix
26
+ api_router = APIRouter(prefix="/api")
27
+
28
+
29
+ # Define Models
30
+ class StatusCheck(BaseModel):
31
+ id: str = Field(default_factory=lambda: str(uuid.uuid4()))
32
+ client_name: str
33
+ timestamp: datetime = Field(default_factory=datetime.utcnow)
34
+
35
+ class StatusCheckCreate(BaseModel):
36
+ client_name: str
37
+
38
+ # Add your routes to the router instead of directly to app
39
+ @api_router.get("/")
40
+ async def root():
41
+ return {"message": "Hello World"}
42
+
43
+ @api_router.post("/status", response_model=StatusCheck)
44
+ async def create_status_check(input: StatusCheckCreate):
45
+ status_dict = input.dict()
46
+ status_obj = StatusCheck(**status_dict)
47
+ _ = await db.status_checks.insert_one(status_obj.dict())
48
+ return status_obj
49
+
50
+ @api_router.get("/status", response_model=List[StatusCheck])
51
+ async def get_status_checks():
52
+ status_checks = await db.status_checks.find().to_list(1000)
53
+ return [StatusCheck(**status_check) for status_check in status_checks]
54
+
55
+ # Include the router in the main app
56
+ app.include_router(api_router)
57
+
58
+ app.add_middleware(
59
+ CORSMiddleware,
60
+ allow_credentials=True,
61
+ allow_origins=["*"],
62
+ allow_methods=["*"],
63
+ allow_headers=["*"],
64
+ )
65
+
66
+ # Configure logging
67
+ logging.basicConfig(
68
+ level=logging.INFO,
69
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
70
+ )
71
+ logger = logging.getLogger(__name__)
72
+
73
+ @app.on_event("shutdown")
74
+ async def shutdown_db_client():
75
+ client.close()
frontend/.env ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ WDS_SOCKET_PORT=443
2
+ REACT_APP_BACKEND_URL=https://01d9c805-948a-4b7f-8d6e-6f2ab32fb0ac.preview.emergentagent.com
frontend/README.md ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Getting Started with Create React App
2
+
3
+ This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
4
+
5
+ ## Available Scripts
6
+
7
+ In the project directory, you can run:
8
+
9
+ ### `npm start`
10
+
11
+ Runs the app in the development mode.\
12
+ Open [http://localhost:3000](http://localhost:3000) to view it in your browser.
13
+
14
+ The page will reload when you make changes.\
15
+ You may also see any lint errors in the console.
16
+
17
+ ### `npm test`
18
+
19
+ Launches the test runner in the interactive watch mode.\
20
+ See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
21
+
22
+ ### `npm run build`
23
+
24
+ Builds the app for production to the `build` folder.\
25
+ It correctly bundles React in production mode and optimizes the build for the best performance.
26
+
27
+ The build is minified and the filenames include the hashes.\
28
+ Your app is ready to be deployed!
29
+
30
+ See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
31
+
32
+ ### `npm run eject`
33
+
34
+ **Note: this is a one-way operation. Once you `eject`, you can't go back!**
35
+
36
+ If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
37
+
38
+ Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.
39
+
40
+ You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.
41
+
42
+ ## Learn More
43
+
44
+ You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
45
+
46
+ To learn React, check out the [React documentation](https://reactjs.org/).
47
+
48
+ ### Code Splitting
49
+
50
+ This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
51
+
52
+ ### Analyzing the Bundle Size
53
+
54
+ This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
55
+
56
+ ### Making a Progressive Web App
57
+
58
+ This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
59
+
60
+ ### Advanced Configuration
61
+
62
+ This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
63
+
64
+ ### Deployment
65
+
66
+ This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
67
+
68
+ ### `npm run build` fails to minify
69
+
70
+ This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
frontend/package.json ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "frontend",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "dependencies": {
6
+ "axios": "^1.8.4",
7
+ "cra-template": "1.2.0",
8
+ "react": "^19.0.0",
9
+ "react-dom": "^19.0.0",
10
+ "react-router-dom": "^7.5.1",
11
+ "react-scripts": "5.0.1"
12
+ },
13
+ "scripts": {
14
+ "start": "react-scripts start",
15
+ "build": "react-scripts build",
16
+ "test": "react-scripts test",
17
+ "eject": "react-scripts eject"
18
+ },
19
+ "browserslist": {
20
+ "production": [
21
+ ">0.2%",
22
+ "not dead",
23
+ "not op_mini all"
24
+ ],
25
+ "development": [
26
+ "last 1 chrome version",
27
+ "last 1 firefox version",
28
+ "last 1 safari version"
29
+ ]
30
+ },
31
+ "devDependencies": {
32
+ "@eslint/js": "9.23.0",
33
+ "autoprefixer": "^10.4.20",
34
+ "eslint": "9.23.0",
35
+ "eslint-plugin-import": "2.31.0",
36
+ "eslint-plugin-jsx-a11y": "6.10.2",
37
+ "eslint-plugin-react": "7.37.4",
38
+ "globals": "15.15.0",
39
+ "postcss": "^8.4.49",
40
+ "tailwindcss": "^3.4.17"
41
+ }
42
+ }
frontend/postcss.config.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ module.exports = {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ }
frontend/public/index.html ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <meta name="theme-color" content="#000000" />
7
+ <meta name="description" content="Hyzo - Custom Printing & Promotional Products" />
8
+ <!--
9
+ manifest.json provides metadata used when your web app is installed on a
10
+ user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
11
+ -->
12
+ <!--
13
+ Notice the use of %PUBLIC_URL% in the tags above.
14
+ It will be replaced with the URL of the `public` folder during the build.
15
+ Only files inside the `public` folder can be referenced from the HTML.
16
+
17
+ Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
18
+ work correctly both with client-side routing and a non-root public URL.
19
+ Learn how to configure a non-root public URL by running `npm run build`.
20
+ -->
21
+ <title>Hyzo | Custom Printing & Promotional Products</title>
22
+ </head>
23
+ <body>
24
+ <noscript>You need to enable JavaScript to run this app.</noscript>
25
+ <div id="root"></div>
26
+ <!--
27
+ This HTML file is a template.
28
+ If you open it directly in the browser, you will see an empty page.
29
+
30
+ You can add webfonts, meta tags, or analytics to this file.
31
+ The build step will place the bundled scripts into the <body> tag.
32
+
33
+ To begin the development, run `npm start` or `yarn start`.
34
+ To create a production bundle, use `npm run build` or `yarn build`.
35
+ -->
36
+
37
+ <script>
38
+ !(function (t, e) {
39
+ var o, n, p, r;
40
+ e.__SV ||
41
+ ((window.posthog = e),
42
+ (e._i = []),
43
+ (e.init = function (i, s, a) {
44
+ function g(t, e) {
45
+ var o = e.split(".");
46
+ 2 == o.length && ((t = t[o[0]]), (e = o[1])),
47
+ (t[e] = function () {
48
+ t.push(
49
+ [e].concat(
50
+ Array.prototype.slice.call(
51
+ arguments,
52
+ 0,
53
+ ),
54
+ ),
55
+ );
56
+ });
57
+ }
58
+ ((p = t.createElement("script")).type =
59
+ "text/javascript"),
60
+ (p.crossOrigin = "anonymous"),
61
+ (p.async = !0),
62
+ (p.src =
63
+ s.api_host.replace(
64
+ ".i.posthog.com",
65
+ "-assets.i.posthog.com",
66
+ ) + "/static/array.js"),
67
+ (r =
68
+ t.getElementsByTagName(
69
+ "script",
70
+ )[0]).parentNode.insertBefore(p, r);
71
+ var u = e;
72
+ for (
73
+ void 0 !== a ? (u = e[a] = []) : (a = "posthog"),
74
+ u.people = u.people || [],
75
+ u.toString = function (t) {
76
+ var e = "posthog";
77
+ return (
78
+ "posthog" !== a && (e += "." + a),
79
+ t || (e += " (stub)"),
80
+ e
81
+ );
82
+ },
83
+ u.people.toString = function () {
84
+ return u.toString(1) + ".people (stub)";
85
+ },
86
+ o =
87
+ "init me ws ys ps bs capture je Di ks register register_once register_for_session unregister unregister_for_session Ps getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSurveysLoaded onSessionId getSurveys getActiveMatchingSurveys renderSurvey canRenderSurvey canRenderSurveyAsync identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty Es $s createPersonProfile Is opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing clear_opt_in_out_capturing Ss debug xs getPageViewId captureTraceFeedback captureTraceMetric".split(
88
+ " ",
89
+ ),
90
+ n = 0;
91
+ n < o.length;
92
+ n++
93
+ )
94
+ g(u, o[n]);
95
+ e._i.push([i, s, a]);
96
+ }),
97
+ (e.__SV = 1));
98
+ })(document, window.posthog || []);
99
+ posthog.init("phc_yJW1VjHGGwmCbbrtczfqqNxgBDbhlhOWcdzcIJEOTFE", {
100
+ api_host: "https://us.i.posthog.com",
101
+ person_profiles: "identified_only", // or 'always' to create profiles for anonymous users as well
102
+ });
103
+ </script>
104
+ </body>
105
+ </html>
frontend/public/index.html.new ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <meta name="theme-color" content="#000000" />
7
+ <meta name="description" content="Hyzo - Custom Printing & Promotional Products" />
8
+ <!--
9
+ manifest.json provides metadata used when your web app is installed on a
10
+ user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
11
+ -->
12
+ <!--
13
+ Notice the use of %PUBLIC_URL% in the tags above.
14
+ It will be replaced with the URL of the `public` folder during the build.
15
+ Only files inside the `public` folder can be referenced from the HTML.
16
+
17
+ Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
18
+ work correctly both with client-side routing and a non-root public URL.
19
+ Learn how to configure a non-root public URL by running `npm run build`.
20
+ -->
21
+ <title>Hyzo | Custom Printing & Promotional Products</title>
22
+ </head>
23
+ <body>
24
+ <noscript>You need to enable JavaScript to run this app.</noscript>
25
+ <div id="root"></div>
26
+ <!--
27
+ This HTML file is a template.
28
+ If you open it directly in the browser, you will see an empty page.
29
+
30
+ You can add webfonts, meta tags, or analytics to this file.
31
+ The build step will place the bundled scripts into the <body> tag.
32
+
33
+ To begin the development, run `npm start` or `yarn start`.
34
+ To create a production bundle, use `npm run build` or `yarn build`.
35
+ -->
36
+ <script>
37
+ !(function (t, e) {
38
+ var o, n, p, r;
39
+ e.__SV ||
40
+ ((window.posthog = e),
41
+ (e._i = []),
42
+ (e.init = function (i, s, a) {
43
+ function g(t, e) {
44
+ var o = e.split(".");
45
+ 2 == o.length && ((t = t[o[0]]), (e = o[1])),
46
+ (t[e] = function () {
47
+ t.push(
48
+ [e].concat(
49
+ Array.prototype.slice.call(
50
+ arguments,
51
+ 0,
52
+ ),
53
+ ),
54
+ );
55
+ });
56
+ }
57
+ ((p = t.createElement("script")).type =
58
+ "text/javascript"),
59
+ (p.crossOrigin = "anonymous"),
60
+ (p.async = !0),
61
+ (p.src =
62
+ s.api_host.replace(
63
+ ".i.posthog.com",
64
+ "-assets.i.posthog.com",
65
+ ) + "/static/array.js"),
66
+ (r =
67
+ t.getElementsByTagName(
68
+ "script",
69
+ )[0]).parentNode.insertBefore(p, r);
70
+ var u = e;
71
+ for (
72
+ void 0 !== a ? (u = e[a] = []) : (a = "posthog"),
73
+ u.people = u.people || [],
74
+ u.toString = function (t) {
75
+ var e = "posthog";
76
+ return (
77
+ "posthog" !== a && (e += "." + a),
78
+ t || (e += " (stub)"),
79
+ e
80
+ );
81
+ },
82
+ u.people.toString = function () {
83
+ return u.toString(1) + ".people (stub)";
84
+ },
85
+ o =
86
+ "init me ws ys ps bs capture je Di ks register register_once register_for_session unregister unregister_for_session Ps getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSurveysLoaded onSessionId getSurveys getActiveMatchingSurveys renderSurvey canRenderSurvey canRenderSurveyAsync identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty Es $s createPersonProfile Is opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing clear_opt_in_out_capturing Ss debug xs getPageViewId captureTraceFeedback captureTraceMetric".split(
87
+ " ",
88
+ ),
89
+ n = 0;
90
+ n < o.length;
91
+ n++
92
+ )
93
+ g(u, o[n]);
94
+ e._i.push([i, s, a]);
95
+ }),
96
+ (e.__SV = 1));
97
+ })(document, window.posthog || []);
98
+ posthog.init("phc_yJW1VjHGGwmCbbrtczfqqNxgBDbhlhOWcdzcIJEOTFE", {
99
+ api_host: "https://us.i.posthog.com",
100
+ person_profiles: "identified_only", // or 'always' to create profiles for anonymous users as well
101
+ });
102
+ </script>
103
+ </body>
104
+ </html>
frontend/src/App.css ADDED
@@ -0,0 +1,233 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* PrintStop India - Enhanced Styles */
2
+ .App {
3
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', sans-serif;
4
+ line-height: 1.6;
5
+ }
6
+
7
+ /* Custom scrollbar */
8
+ ::-webkit-scrollbar {
9
+ width: 8px;
10
+ }
11
+
12
+ ::-webkit-scrollbar-track {
13
+ background: #f1f1f1;
14
+ }
15
+
16
+ ::-webkit-scrollbar-thumb {
17
+ background: #f97316;
18
+ border-radius: 4px;
19
+ }
20
+
21
+ ::-webkit-scrollbar-thumb:hover {
22
+ background: #ea580c;
23
+ }
24
+
25
+ /* Smooth transitions */
26
+ * {
27
+ transition: all 0.2s ease-in-out;
28
+ }
29
+
30
+ /* Button hover effects */
31
+ button:hover {
32
+ transform: translateY(-1px);
33
+ box-shadow: 0 4px 8px rgba(249, 115, 22, 0.2);
34
+ }
35
+
36
+ /* Card hover effects */
37
+ .product-card:hover {
38
+ transform: translateY(-2px);
39
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
40
+ }
41
+
42
+ /* Enhanced gradients for PrintStop style */
43
+ .hero-gradient {
44
+ background: linear-gradient(135deg, #f97316 0%, #dc2626 25%, #7c3aed 50%, #fbbf24 100%);
45
+ }
46
+
47
+ .design-studio-gradient {
48
+ background: linear-gradient(135deg, #f97316 0%, #dc2626 100%);
49
+ }
50
+
51
+ /* Typography matching PrintStop */
52
+ h1, h2, h3, h4, h5, h6 {
53
+ font-weight: 700;
54
+ letter-spacing: -0.02em;
55
+ }
56
+
57
+ .hero-title {
58
+ font-size: 4rem;
59
+ font-weight: 900;
60
+ line-height: 1.1;
61
+ letter-spacing: -0.05em;
62
+ }
63
+
64
+ /* Product image hover effect */
65
+ .product-image {
66
+ transition: transform 0.3s ease;
67
+ }
68
+
69
+ .product-image:hover {
70
+ transform: scale(1.05);
71
+ }
72
+
73
+ /* PrintStop specific color scheme */
74
+ .text-orange-400 {
75
+ color: #fb923c;
76
+ }
77
+
78
+ .text-orange-500 {
79
+ color: #f97316;
80
+ }
81
+
82
+ .text-orange-600 {
83
+ color: #ea580c;
84
+ }
85
+
86
+ .bg-orange-400 {
87
+ background-color: #fb923c;
88
+ }
89
+
90
+ .bg-orange-500 {
91
+ background-color: #f97316;
92
+ }
93
+
94
+ .bg-orange-600 {
95
+ background-color: #ea580c;
96
+ }
97
+
98
+ .border-orange-500 {
99
+ border-color: #f97316;
100
+ }
101
+
102
+ /* Loading animation */
103
+ @keyframes fadeIn {
104
+ from {
105
+ opacity: 0;
106
+ transform: translateY(20px);
107
+ }
108
+ to {
109
+ opacity: 1;
110
+ transform: translateY(0);
111
+ }
112
+ }
113
+
114
+ .fade-in {
115
+ animation: fadeIn 0.6s ease-out;
116
+ }
117
+
118
+ /* Colorful background pattern for hero */
119
+ @keyframes colorShift {
120
+ 0%, 100% {
121
+ background-position: 0% 50%;
122
+ }
123
+ 50% {
124
+ background-position: 100% 50%;
125
+ }
126
+ }
127
+
128
+ .colorful-bg {
129
+ background: linear-gradient(-45deg, #ee7724, #d8363a, #dd3675, #b44593);
130
+ background-size: 400% 400%;
131
+ animation: colorShift 15s ease infinite;
132
+ }
133
+
134
+ /* Responsive grid improvements */
135
+ @media (max-width: 1024px) {
136
+ .grid-cols-4 {
137
+ grid-template-columns: repeat(3, 1fr);
138
+ }
139
+
140
+ .hero-title {
141
+ font-size: 3rem;
142
+ }
143
+ }
144
+
145
+ @media (max-width: 768px) {
146
+ .grid-cols-4,
147
+ .grid-cols-3 {
148
+ grid-template-columns: repeat(2, 1fr);
149
+ }
150
+
151
+ .hero-title {
152
+ font-size: 2.5rem;
153
+ }
154
+
155
+ .text-6xl {
156
+ font-size: 2.5rem;
157
+ }
158
+ }
159
+
160
+ @media (max-width: 640px) {
161
+ .grid-cols-4,
162
+ .grid-cols-3,
163
+ .grid-cols-2 {
164
+ grid-template-columns: 1fr;
165
+ }
166
+
167
+ .flex {
168
+ flex-direction: column;
169
+ }
170
+
171
+ .w-1\/2 {
172
+ width: 100%;
173
+ }
174
+
175
+ .hero-title {
176
+ font-size: 2rem;
177
+ }
178
+ }
179
+
180
+ /* Special effects for Indian market */
181
+ .rupee-symbol {
182
+ font-weight: bold;
183
+ color: #f97316;
184
+ }
185
+
186
+ .discount-badge {
187
+ background: linear-gradient(45deg, #10b981, #059669);
188
+ color: white;
189
+ font-weight: bold;
190
+ animation: pulse 2s infinite;
191
+ }
192
+
193
+ @keyframes pulse {
194
+ 0%, 100% {
195
+ transform: scale(1);
196
+ }
197
+ 50% {
198
+ transform: scale(1.05);
199
+ }
200
+ }
201
+
202
+ /* Enhanced shadows */
203
+ .shadow-custom {
204
+ box-shadow: 0 10px 25px rgba(249, 115, 22, 0.1);
205
+ }
206
+
207
+ .shadow-custom-hover:hover {
208
+ box-shadow: 0 20px 40px rgba(249, 115, 22, 0.15);
209
+ }
210
+
211
+ /* PrintStop logo styling */
212
+ .printstop-logo {
213
+ font-family: 'Arial Black', sans-serif;
214
+ font-weight: 900;
215
+ letter-spacing: 0.05em;
216
+ }
217
+
218
+ /* Navigation hover effects */
219
+ .nav-item:hover {
220
+ color: #f97316;
221
+ border-bottom: 2px solid #f97316;
222
+ }
223
+
224
+ /* Featured product cards */
225
+ .featured-card {
226
+ border: 2px solid transparent;
227
+ transition: all 0.3s ease;
228
+ }
229
+
230
+ .featured-card:hover {
231
+ border-color: #f97316;
232
+ box-shadow: 0 10px 30px rgba(249, 115, 22, 0.2);
233
+ }
frontend/src/App.js ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect } from 'react';
2
+ import './App.css';
3
+ import { BrowserRouter, Routes, Route } from 'react-router-dom';
4
+ import Components from './components';
5
+
6
+ const {
7
+ Header,
8
+ Hero,
9
+ KeyFeatures,
10
+ ProductGrid,
11
+ DesignStudio,
12
+ B2BSection,
13
+ SustainabilitySection,
14
+ TestimonialsSection,
15
+ Footer,
16
+ AuthModal
17
+ } = Components;
18
+
19
+ const Home = () => {
20
+ const [currentView, setCurrentView] = useState('home');
21
+ const [selectedCategory, setSelectedCategory] = useState('all');
22
+ const [cartItems, setCartItems] = useState([]);
23
+ const [user, setUser] = useState(null);
24
+ const [showAuthModal, setShowAuthModal] = useState(false);
25
+ const [authMode, setAuthMode] = useState('login'); // 'login' or 'signup'
26
+
27
+ // Check for saved user session
28
+ useEffect(() => {
29
+ const savedUser = localStorage.getItem('hyzoUser');
30
+ if (savedUser) {
31
+ setUser(JSON.parse(savedUser));
32
+ }
33
+ }, []);
34
+
35
+ const addToCart = (product) => {
36
+ if (!user) {
37
+ setAuthMode('login');
38
+ setShowAuthModal(true);
39
+ return;
40
+ }
41
+ setCartItems(prev => [...prev, product]);
42
+ };
43
+
44
+ const navigateTo = (view) => {
45
+ setCurrentView(view);
46
+ };
47
+
48
+ const selectCategory = (category) => {
49
+ setSelectedCategory(category);
50
+ setCurrentView('products');
51
+ };
52
+
53
+ const handleLogin = (userData) => {
54
+ setUser(userData);
55
+ localStorage.setItem('hyzoUser', JSON.stringify(userData));
56
+ setShowAuthModal(false);
57
+ };
58
+
59
+ const handleLogout = () => {
60
+ setUser(null);
61
+ localStorage.removeItem('hyzoUser');
62
+ setCartItems([]);
63
+ };
64
+
65
+ const openAuth = (mode) => {
66
+ setAuthMode(mode);
67
+ setShowAuthModal(true);
68
+ };
69
+
70
+ return (
71
+ <div className="App">
72
+ <Header
73
+ cartItems={cartItems}
74
+ navigateTo={navigateTo}
75
+ selectCategory={selectCategory}
76
+ user={user}
77
+ onLogin={() => openAuth('login')}
78
+ onLogout={handleLogout}
79
+ />
80
+
81
+ {currentView === 'home' && (
82
+ <>
83
+ <Hero navigateTo={navigateTo} selectCategory={selectCategory} />
84
+ <KeyFeatures />
85
+ <ProductGrid category="featured" addToCart={addToCart} />
86
+ <DesignStudio navigateTo={navigateTo} />
87
+ <B2BSection navigateTo={navigateTo} />
88
+ <SustainabilitySection />
89
+ <TestimonialsSection />
90
+ </>
91
+ )}
92
+
93
+ {currentView === 'products' && (
94
+ <ProductGrid
95
+ category={selectedCategory}
96
+ addToCart={addToCart}
97
+ fullPage={true}
98
+ />
99
+ )}
100
+
101
+ {currentView === 'design-studio' && (
102
+ <DesignStudio fullPage={true} user={user} openAuth={() => openAuth('login')} />
103
+ )}
104
+
105
+ {currentView === 'b2b' && (
106
+ <B2BSection fullPage={true} />
107
+ )}
108
+
109
+ {currentView === 'visiting-cards' && (
110
+ <ProductGrid category="visiting-cards" addToCart={addToCart} fullPage={true} />
111
+ )}
112
+
113
+ {currentView === 'stationery' && (
114
+ <ProductGrid category="stationery" addToCart={addToCart} fullPage={true} />
115
+ )}
116
+
117
+ {currentView === 'apparel' && (
118
+ <ProductGrid category="apparel" addToCart={addToCart} fullPage={true} />
119
+ )}
120
+
121
+ {currentView === 'marketing' && (
122
+ <ProductGrid category="marketing" addToCart={addToCart} fullPage={true} />
123
+ )}
124
+
125
+ {currentView === 'drinkware' && (
126
+ <ProductGrid category="drinkware" addToCart={addToCart} fullPage={true} />
127
+ )}
128
+
129
+ {currentView === 'gadgets' && (
130
+ <ProductGrid category="gadgets" addToCart={addToCart} fullPage={true} />
131
+ )}
132
+
133
+ {currentView === 'bags' && (
134
+ <ProductGrid category="bags" addToCart={addToCart} fullPage={true} />
135
+ )}
136
+
137
+ <Footer navigateTo={navigateTo} />
138
+
139
+ {showAuthModal && (
140
+ <AuthModal
141
+ mode={authMode}
142
+ onClose={() => setShowAuthModal(false)}
143
+ onLogin={handleLogin}
144
+ onSwitchMode={(mode) => setAuthMode(mode)}
145
+ />
146
+ )}
147
+ </div>
148
+ );
149
+ };
150
+
151
+ function App() {
152
+ return (
153
+ <BrowserRouter>
154
+ <Routes>
155
+ <Route path="/" element={<Home />} />
156
+ </Routes>
157
+ </BrowserRouter>
158
+ );
159
+ }
160
+
161
+ export default App;
frontend/src/components.js ADDED
@@ -0,0 +1,1121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState } from 'react';
2
+
3
+ // Enhanced Mock Data for Indian Market
4
+ const mockProducts = {
5
+ 'featured': [
6
+ {
7
+ id: 1,
8
+ name: 'Premium Business Cards',
9
+ description: 'High-quality 350 GSM cards with matte finish. Perfect for professionals.',
10
+ image: 'https://images.unsplash.com/photo-1626148750586-df6e1b0bebf2?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NDQ2MzR8MHwxfHNlYXJjaHwxfHxidXNpbmVzcyUyMGNhcmRzfGVufDB8fHxibHVlfDE3NTA3MDI0NTl8MA&ixlib=rb-4.1.0&q=85',
11
+ price: 499,
12
+ originalPrice: 699,
13
+ category: 'Popular'
14
+ },
15
+ {
16
+ id: 2,
17
+ name: 'Custom T-Shirts',
18
+ description: 'Premium cotton t-shirts with custom printing. Available in multiple colors.',
19
+ image: 'https://images.pexels.com/photos/7135121/pexels-photo-7135121.jpeg',
20
+ price: 399,
21
+ originalPrice: 499,
22
+ category: 'Apparel'
23
+ },
24
+ {
25
+ id: 3,
26
+ name: 'Promotional Flyers',
27
+ description: 'A4 size flyers on 130 GSM paper. Perfect for marketing campaigns.',
28
+ image: 'https://images.pexels.com/photos/7764020/pexels-photo-7764020.jpeg',
29
+ price: 299,
30
+ originalPrice: 399,
31
+ category: 'Marketing'
32
+ },
33
+ {
34
+ id: 4,
35
+ name: 'Corporate Mugs',
36
+ description: 'Ceramic mugs with company logo. Dishwasher safe and durable.',
37
+ image: 'https://images.pexels.com/photos/7763960/pexels-photo-7763960.jpeg',
38
+ price: 199,
39
+ originalPrice: 299,
40
+ category: 'Drinkware'
41
+ }
42
+ ],
43
+ 'visiting-cards': [
44
+ {
45
+ id: 5,
46
+ name: 'Standard Visiting Cards',
47
+ description: '350 GSM art paper with glossy finish. 500 cards per pack.',
48
+ image: 'https://images.unsplash.com/photo-1626148750586-df6e1b0bebf2?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NDQ2MzR8MHwxfHNlYXJjaHwxfHxidXNpbmVzcyUyMGNhcmRzfGVufDB8fHxibHVlfDE3NTA3MDI0NTl8MA&ixlib=rb-4.1.0&q=85',
49
+ price: 299,
50
+ originalPrice: 399,
51
+ category: 'Standard'
52
+ },
53
+ {
54
+ id: 6,
55
+ name: 'Premium Visiting Cards',
56
+ description: '400 GSM cardstock with matte lamination. Luxury feel.',
57
+ image: 'https://images.unsplash.com/photo-1626148749751-1aada0bca59a?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NDQ2MzR8MHwxfHNlYXJjaHwzfHxidXNpbmVzcyUyMGNhcmRzfGVufDB8fHxibHVlfDE3NTA3MDI0NTl8MA&ixlib=rb-4.1.0&q=85',
58
+ price: 599,
59
+ originalPrice: 799,
60
+ category: 'Premium'
61
+ },
62
+ {
63
+ id: 7,
64
+ name: 'Eco-Friendly Cards',
65
+ description: 'Made from recycled paper. Environment-friendly option.',
66
+ image: 'https://images.unsplash.com/photo-1588829608152-e7accc3c7eef?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwyfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85',
67
+ price: 399,
68
+ originalPrice: 499,
69
+ category: 'Eco'
70
+ },
71
+ {
72
+ id: 8,
73
+ name: 'Metallic Foil Cards',
74
+ description: 'Premium cards with gold/silver foil printing. Luxury finish.',
75
+ image: 'https://images.unsplash.com/photo-1504711434969-e33886168f5c?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwzfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85',
76
+ price: 899,
77
+ originalPrice: 1199,
78
+ category: 'Luxury'
79
+ }
80
+ ],
81
+ 'apparel': [
82
+ {
83
+ id: 9,
84
+ name: 'Custom Polo T-Shirts',
85
+ description: '100% cotton polo shirts with embroidered logo. Corporate wear.',
86
+ image: 'https://images.pexels.com/photos/7135121/pexels-photo-7135121.jpeg',
87
+ price: 549,
88
+ originalPrice: 699,
89
+ category: 'Corporate'
90
+ },
91
+ {
92
+ id: 10,
93
+ name: 'Event T-Shirts',
94
+ description: 'Lightweight cotton t-shirts perfect for events and promotions.',
95
+ image: 'https://images.pexels.com/photos/7764020/pexels-photo-7764020.jpeg',
96
+ price: 299,
97
+ originalPrice: 399,
98
+ category: 'Events'
99
+ },
100
+ {
101
+ id: 11,
102
+ name: 'Hoodies & Sweatshirts',
103
+ description: 'Premium hoodies with custom printing. Perfect for corporate gifts.',
104
+ image: 'https://images.pexels.com/photos/7763960/pexels-photo-7763960.jpeg',
105
+ price: 799,
106
+ originalPrice: 999,
107
+ category: 'Winter'
108
+ },
109
+ {
110
+ id: 12,
111
+ name: 'Corporate Shirts',
112
+ description: 'Formal shirts with company logo. Available in multiple colors.',
113
+ image: 'https://images.unsplash.com/photo-1617695744007-68ef55752789?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwxfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85',
114
+ price: 899,
115
+ originalPrice: 1199,
116
+ category: 'Formal'
117
+ }
118
+ ],
119
+ 'stationery': [
120
+ {
121
+ id: 13,
122
+ name: 'Custom Notebooks',
123
+ description: 'A5 size notebooks with company branding. 200 pages.',
124
+ image: 'https://images.unsplash.com/photo-1588829608152-e7accc3c7eef?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwyfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85',
125
+ price: 149,
126
+ originalPrice: 199,
127
+ category: 'Office'
128
+ },
129
+ {
130
+ id: 14,
131
+ name: 'Letterheads',
132
+ description: 'A4 letterheads on premium paper. Professional look.',
133
+ image: 'https://images.unsplash.com/photo-1504711434969-e33886168f5c?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwzfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85',
134
+ price: 199,
135
+ originalPrice: 299,
136
+ category: 'Corporate'
137
+ },
138
+ {
139
+ id: 15,
140
+ name: 'File Folders',
141
+ description: 'Custom printed file folders for office organization.',
142
+ image: 'https://images.pexels.com/photos/7135121/pexels-photo-7135121.jpeg',
143
+ price: 99,
144
+ originalPrice: 149,
145
+ category: 'Office'
146
+ },
147
+ {
148
+ id: 16,
149
+ name: 'Desk Calendars',
150
+ description: '12-month desk calendars with custom design and branding.',
151
+ image: 'https://images.pexels.com/photos/7764020/pexels-photo-7764020.jpeg',
152
+ price: 299,
153
+ originalPrice: 399,
154
+ category: 'Promotional'
155
+ }
156
+ ],
157
+ 'marketing': [
158
+ {
159
+ id: 17,
160
+ name: 'Promotional Banners',
161
+ description: 'Vinyl banners for outdoor advertising. Weather resistant.',
162
+ image: 'https://images.pexels.com/photos/7763960/pexels-photo-7763960.jpeg',
163
+ price: 899,
164
+ originalPrice: 1199,
165
+ category: 'Outdoor'
166
+ },
167
+ {
168
+ id: 18,
169
+ name: 'Brochures',
170
+ description: 'Tri-fold brochures on glossy paper. Perfect for marketing.',
171
+ image: 'https://images.unsplash.com/photo-1617695744007-68ef55752789?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwxfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85',
172
+ price: 399,
173
+ originalPrice: 499,
174
+ category: 'Print'
175
+ },
176
+ {
177
+ id: 19,
178
+ name: 'Standees',
179
+ description: 'Roll-up standees for exhibitions and events. Portable design.',
180
+ image: 'https://images.unsplash.com/photo-1588829608152-e7accc3c7eef?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwyfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85',
181
+ price: 1299,
182
+ originalPrice: 1599,
183
+ category: 'Exhibition'
184
+ },
185
+ {
186
+ id: 20,
187
+ name: 'Poster Printing',
188
+ description: 'A3 and A2 size posters on premium paper. High resolution.',
189
+ image: 'https://images.unsplash.com/photo-1504711434969-e33886168f5c?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwzfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85',
190
+ price: 199,
191
+ originalPrice: 299,
192
+ category: 'Print'
193
+ }
194
+ ],
195
+ 'drinkware': [
196
+ {
197
+ id: 21,
198
+ name: 'Ceramic Mugs',
199
+ description: 'White ceramic mugs with custom printing. 11 oz capacity.',
200
+ image: 'https://images.pexels.com/photos/7135121/pexels-photo-7135121.jpeg',
201
+ price: 149,
202
+ originalPrice: 199,
203
+ category: 'Office'
204
+ },
205
+ {
206
+ id: 22,
207
+ name: 'Stainless Steel Bottles',
208
+ description: 'Insulated steel bottles with laser engraving. 500ml capacity.',
209
+ image: 'https://images.pexels.com/photos/7764020/pexels-photo-7764020.jpeg',
210
+ price: 399,
211
+ originalPrice: 499,
212
+ category: 'Premium'
213
+ },
214
+ {
215
+ id: 23,
216
+ name: 'Glass Bottles',
217
+ description: 'Eco-friendly glass bottles with custom branding.',
218
+ image: 'https://images.pexels.com/photos/7763960/pexels-photo-7763960.jpeg',
219
+ price: 299,
220
+ originalPrice: 399,
221
+ category: 'Eco'
222
+ },
223
+ {
224
+ id: 24,
225
+ name: 'Travel Mugs',
226
+ description: 'Insulated travel mugs with spill-proof lid. Perfect for commuters.',
227
+ image: 'https://images.unsplash.com/photo-1617695744007-68ef55752789?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwxfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85',
228
+ price: 449,
229
+ originalPrice: 599,
230
+ category: 'Travel'
231
+ }
232
+ ],
233
+ 'gadgets': [
234
+ {
235
+ id: 25,
236
+ name: 'Power Banks',
237
+ description: '10000mAh power banks with custom branding. Dual USB output.',
238
+ image: 'https://images.unsplash.com/photo-1588829608152-e7accc3c7eef?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwyfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85',
239
+ price: 799,
240
+ originalPrice: 999,
241
+ category: 'Electronics'
242
+ },
243
+ {
244
+ id: 26,
245
+ name: 'USB Drives',
246
+ description: 'Custom USB drives with company logo. 16GB capacity.',
247
+ image: 'https://images.unsplash.com/photo-1504711434969-e33886168f5c?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwzfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85',
248
+ price: 399,
249
+ originalPrice: 499,
250
+ category: 'Storage'
251
+ },
252
+ {
253
+ id: 27,
254
+ name: 'Bluetooth Speakers',
255
+ description: 'Portable speakers with custom branding. Excellent sound quality.',
256
+ image: 'https://images.pexels.com/photos/7135121/pexels-photo-7135121.jpeg',
257
+ price: 1299,
258
+ originalPrice: 1599,
259
+ category: 'Audio'
260
+ },
261
+ {
262
+ id: 28,
263
+ name: 'Mobile Stands',
264
+ description: 'Adjustable mobile phone stands with company logo.',
265
+ image: 'https://images.pexels.com/photos/7764020/pexels-photo-7764020.jpeg',
266
+ price: 199,
267
+ originalPrice: 299,
268
+ category: 'Accessories'
269
+ }
270
+ ],
271
+ 'bags': [
272
+ {
273
+ id: 29,
274
+ name: 'Canvas Tote Bags',
275
+ description: 'Eco-friendly canvas bags with custom printing. Reusable and durable.',
276
+ image: 'https://images.pexels.com/photos/7763960/pexels-photo-7763960.jpeg',
277
+ price: 199,
278
+ originalPrice: 299,
279
+ category: 'Eco'
280
+ },
281
+ {
282
+ id: 30,
283
+ name: 'Laptop Bags',
284
+ description: 'Professional laptop bags with company branding. 15.6 inch compatible.',
285
+ image: 'https://images.unsplash.com/photo-1617695744007-68ef55752789?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwxfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85',
286
+ price: 899,
287
+ originalPrice: 1199,
288
+ category: 'Professional'
289
+ },
290
+ {
291
+ id: 31,
292
+ name: 'Backpacks',
293
+ description: 'Custom backpacks for corporate events and employee gifts.',
294
+ image: 'https://images.unsplash.com/photo-1588829608152-e7accc3c7eef?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwyfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85',
295
+ price: 699,
296
+ originalPrice: 899,
297
+ category: 'Corporate'
298
+ },
299
+ {
300
+ id: 32,
301
+ name: 'Jute Bags',
302
+ description: 'Natural jute bags with custom printing. Environment-friendly option.',
303
+ image: 'https://images.unsplash.com/photo-1504711434969-e33886168f5c?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwzfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85',
304
+ price: 149,
305
+ originalPrice: 199,
306
+ category: 'Eco'
307
+ }
308
+ ]
309
+ };
310
+
311
+ // Header Component with modern Hyzo branding
312
+ const Header = ({ cartItems, navigateTo, selectCategory, user, onLogin, onLogout }) => {
313
+ return (
314
+ <header className="bg-white shadow-lg border-b border-purple-100">
315
+ <div className="container mx-auto px-4">
316
+ <div className="flex items-center justify-between py-4">
317
+ <div
318
+ className="text-3xl font-bold cursor-pointer hyzo-logo"
319
+ onClick={() => navigateTo('home')}
320
+ >
321
+ <span className="bg-gradient-to-r from-purple-600 to-teal-500 bg-clip-text text-transparent">
322
+ Hyzo
323
+ </span>
324
+ </div>
325
+
326
+ <div className="flex items-center space-x-6">
327
+ <button className="flex items-center text-gray-700 hover:text-purple-600 transition-colors">
328
+ <span className="mr-1">πŸ“ž</span>
329
+ Support
330
+ </button>
331
+ <button className="relative flex items-center text-gray-700 hover:text-purple-600 transition-colors">
332
+ <span className="mr-1">πŸ›’</span>
333
+ Cart
334
+ {cartItems.length > 0 && (
335
+ <span className="absolute -top-2 -right-2 bg-gradient-to-r from-purple-500 to-teal-500 text-white rounded-full w-5 h-5 text-xs flex items-center justify-center">
336
+ {cartItems.length}
337
+ </span>
338
+ )}
339
+ </button>
340
+ {user ? (
341
+ <div className="flex items-center space-x-4">
342
+ <span className="text-gray-700">Hi, {user.name}!</span>
343
+ <button
344
+ className="bg-gradient-to-r from-purple-500 to-teal-500 text-white px-4 py-2 rounded-lg hover:from-purple-600 hover:to-teal-600 transition-all"
345
+ onClick={onLogout}
346
+ >
347
+ Logout
348
+ </button>
349
+ </div>
350
+ ) : (
351
+ <button
352
+ className="bg-gradient-to-r from-purple-500 to-teal-500 text-white px-6 py-2 rounded-lg hover:from-purple-600 hover:to-teal-600 transition-all"
353
+ onClick={onLogin}
354
+ >
355
+ Login
356
+ </button>
357
+ )}
358
+ </div>
359
+ </div>
360
+
361
+ <nav className="border-t border-gray-200">
362
+ <div className="flex space-x-8 py-3 text-sm">
363
+ <button className="text-gray-700 hover:text-purple-600 transition-colors">
364
+ Umbrellas & Raincoats
365
+ </button>
366
+ <button
367
+ className="text-gray-700 hover:text-purple-600 transition-colors"
368
+ onClick={() => selectCategory('visiting-cards')}
369
+ >
370
+ Visiting Cards & ID Cards
371
+ </button>
372
+ <button
373
+ className="text-gray-700 hover:text-purple-600 transition-colors"
374
+ onClick={() => selectCategory('stationery')}
375
+ >
376
+ Stationery & Office Supplies
377
+ </button>
378
+ <button
379
+ className="text-gray-700 hover:text-purple-600 transition-colors"
380
+ onClick={() => selectCategory('apparel')}
381
+ >
382
+ Apparel
383
+ </button>
384
+ <button
385
+ className="text-gray-700 hover:text-purple-600 transition-colors"
386
+ onClick={() => selectCategory('marketing')}
387
+ >
388
+ Marketing
389
+ </button>
390
+ <button
391
+ className="text-gray-700 hover:text-purple-600 transition-colors"
392
+ onClick={() => selectCategory('drinkware')}
393
+ >
394
+ Drinkware & Lunchboxes
395
+ </button>
396
+ <button
397
+ className="text-gray-700 hover:text-purple-600 transition-colors"
398
+ onClick={() => selectCategory('gadgets')}
399
+ >
400
+ Gadgets and Accessories
401
+ </button>
402
+ <button
403
+ className="text-gray-700 hover:text-purple-600 transition-colors"
404
+ onClick={() => selectCategory('bags')}
405
+ >
406
+ Bags
407
+ </button>
408
+ <button className="text-gray-700 hover:text-purple-600 transition-colors">
409
+ Kits & Hampers
410
+ </button>
411
+ <button className="text-gray-700 hover:text-purple-600 transition-colors">
412
+ More
413
+ </button>
414
+ </div>
415
+ </nav>
416
+ </div>
417
+ </header>
418
+ );
419
+ };
420
+
421
+ // Hero Component with modern gradient design
422
+ const Hero = ({ navigateTo, selectCategory }) => {
423
+ return (
424
+ <section className="relative bg-gradient-to-br from-purple-600 via-teal-500 to-blue-600 py-20 overflow-hidden modern-hero">
425
+ {/* Animated background elements */}
426
+ <div className="absolute inset-0 opacity-10">
427
+ <div className="absolute top-20 left-20 w-32 h-32 bg-white rounded-full floating-slow"></div>
428
+ <div className="absolute top-40 right-32 w-24 h-24 bg-yellow-300 rounded-full floating-medium"></div>
429
+ <div className="absolute bottom-32 left-1/4 w-40 h-40 bg-pink-300 rounded-full floating-fast"></div>
430
+ <div className="absolute bottom-20 right-20 w-28 h-28 bg-green-300 rounded-full floating-slow"></div>
431
+ </div>
432
+
433
+ <div className="container mx-auto px-4 text-center relative z-10">
434
+ <div className="bg-white/90 backdrop-blur-lg rounded-3xl shadow-2xl p-12 max-w-3xl mx-auto border border-white/20">
435
+ <h2 className="text-xl text-gray-700 mb-4 font-medium">Premium Printing Solutions</h2>
436
+ <h1 className="text-7xl font-black text-transparent bg-gradient-to-r from-purple-600 to-teal-500 bg-clip-text mb-8 tracking-tight">
437
+ Hyzo
438
+ </h1>
439
+ <p className="text-lg text-gray-600 mb-8 max-w-2xl mx-auto">
440
+ Transform your ideas into stunning printed materials with our cutting-edge technology and premium quality services.
441
+ </p>
442
+ <button
443
+ className="bg-gradient-to-r from-purple-600 to-teal-500 text-white px-12 py-4 rounded-xl font-semibold hover:from-purple-700 hover:to-teal-600 transition-all transform hover:scale-105 shadow-lg text-lg"
444
+ onClick={() => selectCategory('featured')}
445
+ >
446
+ Explore Products
447
+ </button>
448
+ </div>
449
+ </div>
450
+ </section>
451
+ );
452
+ };
453
+
454
+ // Key Features Component with modern icons
455
+ const KeyFeatures = () => {
456
+ const features = [
457
+ {
458
+ icon: '🎨',
459
+ title: 'AI-Powered Design',
460
+ description: 'Smart design tools with AI assistance'
461
+ },
462
+ {
463
+ icon: '⚑',
464
+ title: 'Lightning Fast',
465
+ description: '24-hour express delivery available'
466
+ },
467
+ {
468
+ icon: '🌍',
469
+ title: 'Global Quality',
470
+ description: 'International printing standards'
471
+ },
472
+ {
473
+ icon: 'πŸ’Ž',
474
+ title: 'Premium Materials',
475
+ description: 'Luxury finishes and materials'
476
+ }
477
+ ];
478
+
479
+ return (
480
+ <section className="py-16 bg-gradient-to-br from-gray-50 to-purple-50">
481
+ <div className="container mx-auto px-4">
482
+ <div className="grid grid-cols-4 gap-8">
483
+ {features.map((feature, index) => (
484
+ <div key={index} className="text-center group hover:transform hover:scale-105 transition-all duration-300">
485
+ <div className="text-5xl mb-6 group-hover:animate-bounce">{feature.icon}</div>
486
+ <h3 className="font-bold text-gray-800 mb-3 text-lg">{feature.title}</h3>
487
+ <p className="text-gray-600">{feature.description}</p>
488
+ </div>
489
+ ))}
490
+ </div>
491
+ </div>
492
+ </section>
493
+ );
494
+ };
495
+
496
+ // Enhanced Product Grid Component
497
+ const ProductGrid = ({ category, addToCart, fullPage = false }) => {
498
+ const getProducts = () => {
499
+ if (category === 'all' || category === 'featured') {
500
+ return Object.values(mockProducts).flat();
501
+ }
502
+ return mockProducts[category] || [];
503
+ };
504
+
505
+ const products = getProducts();
506
+ const categoryNames = {
507
+ 'featured': 'Featured Products',
508
+ 'visiting-cards': 'Visiting Cards & ID Cards',
509
+ 'stationery': 'Stationery & Office Supplies',
510
+ 'apparel': 'Apparel & Clothing',
511
+ 'marketing': 'Marketing Materials',
512
+ 'drinkware': 'Drinkware & Lunchboxes',
513
+ 'gadgets': 'Gadgets & Accessories',
514
+ 'bags': 'Bags & Carry Items',
515
+ 'all': 'All Products'
516
+ };
517
+
518
+ return (
519
+ <section className={`py-12 ${fullPage ? 'min-h-screen bg-gradient-to-br from-purple-50 to-teal-50' : ''}`}>
520
+ <div className="container mx-auto px-4">
521
+ {fullPage && (
522
+ <div className="mb-12 text-center">
523
+ <h1 className="text-4xl font-bold bg-gradient-to-r from-purple-600 to-teal-500 bg-clip-text text-transparent mb-4">
524
+ {categoryNames[category] || 'Products'}
525
+ </h1>
526
+ <p className="text-gray-600 text-lg max-w-2xl mx-auto">
527
+ Discover our premium collection of printing solutions designed to elevate your brand and business presence.
528
+ </p>
529
+ </div>
530
+ )}
531
+
532
+ {!fullPage && (
533
+ <div className="mb-12 text-center">
534
+ <h2 className="text-3xl font-bold bg-gradient-to-r from-purple-600 to-teal-500 bg-clip-text text-transparent mb-4">
535
+ Featured Products
536
+ </h2>
537
+ <p className="text-gray-600 text-lg max-w-2xl mx-auto">
538
+ High-quality printing solutions at the best prices in India. Free delivery across major cities.
539
+ </p>
540
+ </div>
541
+ )}
542
+
543
+ <div className="grid grid-cols-4 gap-8">
544
+ {products.map((product) => (
545
+ <div key={product.id} className="bg-white rounded-2xl shadow-lg overflow-hidden hover:shadow-2xl transition-all duration-300 transform hover:-translate-y-2 product-card-modern">
546
+ <div className="relative overflow-hidden">
547
+ <img
548
+ src={product.image}
549
+ alt={product.name}
550
+ className="w-full h-56 object-cover transition-transform duration-300 hover:scale-110"
551
+ />
552
+ <div className="absolute top-4 right-4">
553
+ {product.originalPrice && (
554
+ <span className="bg-gradient-to-r from-green-500 to-emerald-500 text-white text-sm px-3 py-1 rounded-full font-bold shadow-lg">
555
+ {Math.round(((product.originalPrice - product.price) / product.originalPrice) * 100)}% OFF
556
+ </span>
557
+ )}
558
+ </div>
559
+ </div>
560
+ <div className="p-6">
561
+ <h3 className="font-bold text-gray-800 mb-3 text-lg">{product.name}</h3>
562
+ <p className="text-gray-600 text-sm mb-4 line-clamp-2">{product.description}</p>
563
+ <div className="flex justify-between items-center mb-4">
564
+ <div>
565
+ <span className="text-2xl font-bold bg-gradient-to-r from-purple-600 to-teal-500 bg-clip-text text-transparent">
566
+ β‚Ή{product.price}
567
+ </span>
568
+ {product.originalPrice && (
569
+ <span className="text-sm text-gray-500 line-through ml-2">β‚Ή{product.originalPrice}</span>
570
+ )}
571
+ </div>
572
+ </div>
573
+ <button
574
+ className="w-full bg-gradient-to-r from-purple-600 to-teal-500 text-white px-6 py-3 rounded-xl hover:from-purple-700 hover:to-teal-600 transition-all transform hover:scale-105 font-semibold shadow-lg"
575
+ onClick={() => addToCart(product)}
576
+ >
577
+ Add to Cart
578
+ </button>
579
+ </div>
580
+ </div>
581
+ ))}
582
+ </div>
583
+ </div>
584
+ </section>
585
+ );
586
+ };
587
+
588
+ // Enhanced Design Studio Component
589
+ const DesignStudio = ({ navigateTo, fullPage = false, user, openAuth }) => {
590
+ const [selectedTemplate, setSelectedTemplate] = useState(null);
591
+
592
+ const templates = [
593
+ { id: 1, name: 'Modern Gradient', category: 'Business', preview: 'https://images.pexels.com/photos/7135121/pexels-photo-7135121.jpeg' },
594
+ { id: 2, name: 'Professional Teal', category: 'Corporate', preview: 'https://images.pexels.com/photos/7764020/pexels-photo-7764020.jpeg' },
595
+ { id: 3, name: 'Creative Purple', category: 'Creative', preview: 'https://images.pexels.com/photos/7763960/pexels-photo-7763960.jpeg' },
596
+ { id: 4, name: 'Elegant Design', category: 'Premium', preview: 'https://images.unsplash.com/photo-1617695744007-68ef55752789?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwxfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85' }
597
+ ];
598
+
599
+ const handleStartDesigning = () => {
600
+ if (!user) {
601
+ openAuth();
602
+ return;
603
+ }
604
+ // Proceed with design
605
+ alert('Design studio feature coming soon!');
606
+ };
607
+
608
+ if (fullPage) {
609
+ return (
610
+ <div className="min-h-screen bg-gradient-to-br from-purple-50 to-teal-50">
611
+ <div className="container mx-auto px-4 py-12">
612
+ <h1 className="text-5xl font-bold text-center mb-4 bg-gradient-to-r from-purple-600 to-teal-500 bg-clip-text text-transparent">
613
+ AI-Powered Design Studio
614
+ </h1>
615
+ <p className="text-center text-gray-600 mb-12 text-lg">Create stunning designs with our intelligent design tools</p>
616
+
617
+ <div className="grid grid-cols-2 gap-12">
618
+ <div>
619
+ <h2 className="text-2xl font-bold mb-6">Choose a Template</h2>
620
+ <div className="grid grid-cols-2 gap-6">
621
+ {templates.map((template) => (
622
+ <div
623
+ key={template.id}
624
+ className={`border-2 rounded-xl p-4 cursor-pointer transition-all duration-300 ${
625
+ selectedTemplate?.id === template.id
626
+ ? 'border-purple-500 bg-purple-50 shadow-lg transform scale-105'
627
+ : 'border-gray-200 hover:border-purple-300 hover:shadow-md'
628
+ }`}
629
+ onClick={() => setSelectedTemplate(template)}
630
+ >
631
+ <img src={template.preview} alt={template.name} className="w-full h-32 object-cover rounded-lg mb-3" />
632
+ <h3 className="font-semibold text-gray-800">{template.name}</h3>
633
+ <p className="text-sm text-gray-600">{template.category}</p>
634
+ </div>
635
+ ))}
636
+ </div>
637
+ </div>
638
+ <div>
639
+ <h2 className="text-2xl font-bold mb-6">Design Canvas</h2>
640
+ <div className="bg-white border-2 border-dashed border-purple-300 rounded-xl h-96 flex items-center justify-center shadow-inner">
641
+ {selectedTemplate ? (
642
+ <div className="text-center">
643
+ <img src={selectedTemplate.preview} alt="Design Preview" className="w-64 h-40 object-cover rounded-lg mb-6 mx-auto shadow-lg" />
644
+ <h3 className="font-semibold mb-4 text-xl">{selectedTemplate.name}</h3>
645
+ <button
646
+ className="bg-gradient-to-r from-purple-600 to-teal-500 text-white px-8 py-3 rounded-xl hover:from-purple-700 hover:to-teal-600 transition-all font-semibold shadow-lg"
647
+ onClick={handleStartDesigning}
648
+ >
649
+ {user ? 'Start Editing - β‚Ή99' : 'Login to Start Designing'}
650
+ </button>
651
+ </div>
652
+ ) : (
653
+ <p className="text-gray-500 text-lg">Select a template to start designing</p>
654
+ )}
655
+ </div>
656
+ </div>
657
+ </div>
658
+ </div>
659
+ </div>
660
+ );
661
+ }
662
+
663
+ return (
664
+ <section className="py-20 bg-gradient-to-r from-purple-600 via-blue-600 to-teal-500">
665
+ <div className="container mx-auto px-4 text-center">
666
+ <h2 className="text-5xl font-bold text-white mb-6">AI-Powered Design Studio</h2>
667
+ <p className="text-xl text-white/90 mb-10 max-w-2xl mx-auto">
668
+ Create stunning designs with our intelligent design tools. From business cards to banners, design like a pro in minutes.
669
+ </p>
670
+ <button
671
+ className="bg-white text-purple-600 px-12 py-4 rounded-xl font-bold hover:bg-gray-100 transition-all transform hover:scale-105 shadow-xl text-lg"
672
+ onClick={() => navigateTo('design-studio')}
673
+ >
674
+ Launch Design Studio
675
+ </button>
676
+ </div>
677
+ </section>
678
+ );
679
+ };
680
+
681
+ // Enhanced B2B Section Component
682
+ const B2BSection = ({ navigateTo, fullPage = false }) => {
683
+ if (fullPage) {
684
+ return (
685
+ <div className="min-h-screen bg-gradient-to-br from-blue-50 to-purple-50">
686
+ <div className="container mx-auto px-4 py-12">
687
+ <h1 className="text-5xl font-bold text-center mb-4 bg-gradient-to-r from-purple-600 to-teal-500 bg-clip-text text-transparent">
688
+ Enterprise Solutions
689
+ </h1>
690
+ <p className="text-center text-gray-600 mb-12 text-lg">Scalable printing solutions for growing businesses</p>
691
+
692
+ <div className="grid grid-cols-2 gap-12">
693
+ <div>
694
+ <h2 className="text-3xl font-bold mb-6">Bulk Pricing (INR)</h2>
695
+ <div className="bg-white p-8 rounded-2xl shadow-xl border border-purple-100">
696
+ <div className="space-y-6">
697
+ <div className="flex justify-between items-center py-3 border-b border-gray-100">
698
+ <span className="text-lg">1-50 units</span>
699
+ <span className="font-bold text-xl">β‚Ή299 each</span>
700
+ </div>
701
+ <div className="flex justify-between items-center py-3 border-b border-gray-100">
702
+ <span className="text-lg">51-200 units</span>
703
+ <span className="font-bold text-xl text-green-600">β‚Ή249 each (15% off)</span>
704
+ </div>
705
+ <div className="flex justify-between items-center py-3 border-b border-gray-100">
706
+ <span className="text-lg">201-500 units</span>
707
+ <span className="font-bold text-xl text-green-600">β‚Ή199 each (25% off)</span>
708
+ </div>
709
+ <div className="flex justify-between items-center py-3">
710
+ <span className="text-lg">500+ units</span>
711
+ <span className="font-bold text-xl text-green-600">β‚Ή149 each (40% off)</span>
712
+ </div>
713
+ </div>
714
+ </div>
715
+ </div>
716
+ <div>
717
+ <h2 className="text-3xl font-bold mb-6">Enterprise Features</h2>
718
+ <div className="bg-white p-8 rounded-2xl shadow-xl border border-purple-100">
719
+ <ul className="space-y-4">
720
+ <li className="flex items-center">
721
+ <span className="text-green-500 mr-3 text-xl">βœ“</span>
722
+ <span className="text-lg">Dedicated Account Manager</span>
723
+ </li>
724
+ <li className="flex items-center">
725
+ <span className="text-green-500 mr-3 text-xl">βœ“</span>
726
+ <span className="text-lg">Custom Quote Requests</span>
727
+ </li>
728
+ <li className="flex items-center">
729
+ <span className="text-green-500 mr-3 text-xl">βœ“</span>
730
+ <span className="text-lg">Priority Production Queue</span>
731
+ </li>
732
+ <li className="flex items-center">
733
+ <span className="text-green-500 mr-3 text-xl">βœ“</span>
734
+ <span className="text-lg">API Integration Support</span>
735
+ </li>
736
+ <li className="flex items-center">
737
+ <span className="text-green-500 mr-3 text-xl">βœ“</span>
738
+ <span className="text-lg">GST Invoice & Compliance</span>
739
+ </li>
740
+ </ul>
741
+ </div>
742
+ </div>
743
+ </div>
744
+ </div>
745
+ </div>
746
+ );
747
+ }
748
+
749
+ return (
750
+ <section className="py-20 bg-gradient-to-br from-blue-50 to-purple-50">
751
+ <div className="container mx-auto px-4">
752
+ <div className="text-center mb-16">
753
+ <h2 className="text-5xl font-bold bg-gradient-to-r from-purple-600 to-teal-500 bg-clip-text text-transparent mb-6">
754
+ Enterprise Solutions
755
+ </h2>
756
+ <p className="text-xl text-gray-600 max-w-2xl mx-auto">
757
+ Scale your business with our enterprise-grade printing solutions and dedicated support
758
+ </p>
759
+ </div>
760
+ <div className="grid grid-cols-3 gap-10">
761
+ <div className="text-center group">
762
+ <div className="bg-gradient-to-br from-purple-100 to-teal-100 p-8 rounded-2xl mb-6 group-hover:shadow-xl transition-all duration-300">
763
+ <img
764
+ src="https://images.pexels.com/photos/7764020/pexels-photo-7764020.jpeg"
765
+ alt="Bulk Orders"
766
+ className="w-full h-48 object-cover rounded-xl mb-4"
767
+ />
768
+ </div>
769
+ <h3 className="text-2xl font-bold mb-3">Volume Discounts</h3>
770
+ <p className="text-gray-600">Save up to 40% on bulk orders with tiered pricing</p>
771
+ </div>
772
+ <div className="text-center group">
773
+ <div className="bg-gradient-to-br from-purple-100 to-teal-100 p-8 rounded-2xl mb-6 group-hover:shadow-xl transition-all duration-300">
774
+ <img
775
+ src="https://images.pexels.com/photos/7763960/pexels-photo-7763960.jpeg"
776
+ alt="Support"
777
+ className="w-full h-48 object-cover rounded-xl mb-4"
778
+ />
779
+ </div>
780
+ <h3 className="text-2xl font-bold mb-3">Dedicated Support</h3>
781
+ <p className="text-gray-600">Personal account manager for enterprise clients</p>
782
+ </div>
783
+ <div className="text-center group">
784
+ <div className="bg-gradient-to-br from-purple-100 to-teal-100 p-8 rounded-2xl mb-6 group-hover:shadow-xl transition-all duration-300">
785
+ <img
786
+ src="https://images.unsplash.com/photo-1617695744007-68ef55752789?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwxfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85"
787
+ alt="Integration"
788
+ className="w-full h-48 object-cover rounded-xl mb-4"
789
+ />
790
+ </div>
791
+ <h3 className="text-2xl font-bold mb-3">API Integration</h3>
792
+ <p className="text-gray-600">Seamless integration with your existing systems</p>
793
+ </div>
794
+ </div>
795
+ <div className="text-center mt-12">
796
+ <button
797
+ className="bg-gradient-to-r from-purple-600 to-teal-500 text-white px-12 py-4 rounded-xl font-bold hover:from-purple-700 hover:to-teal-600 transition-all transform hover:scale-105 shadow-xl text-lg"
798
+ onClick={() => navigateTo('b2b')}
799
+ >
800
+ Get Enterprise Quote
801
+ </button>
802
+ </div>
803
+ </div>
804
+ </section>
805
+ );
806
+ };
807
+
808
+ // Enhanced Sustainability Section
809
+ const SustainabilitySection = () => {
810
+ return (
811
+ <section className="py-20 bg-gradient-to-br from-green-50 to-emerald-50">
812
+ <div className="container mx-auto px-4">
813
+ <div className="text-center mb-16">
814
+ <h2 className="text-5xl font-bold bg-gradient-to-r from-green-600 to-emerald-500 bg-clip-text text-transparent mb-6">
815
+ Sustainable Printing
816
+ </h2>
817
+ <p className="text-xl text-gray-600 max-w-2xl mx-auto">
818
+ Committed to environmental responsibility with eco-friendly printing solutions
819
+ </p>
820
+ </div>
821
+ <div className="grid grid-cols-3 gap-10">
822
+ <div className="text-center group">
823
+ <div className="text-8xl mb-6 group-hover:animate-bounce transition-all">🌱</div>
824
+ <h3 className="text-2xl font-bold mb-4">Recycled Materials</h3>
825
+ <p className="text-gray-600 text-lg">100% recycled paper options with premium quality finish</p>
826
+ </div>
827
+ <div className="text-center group">
828
+ <div className="text-8xl mb-6 group-hover:animate-bounce transition-all">🌿</div>
829
+ <h3 className="text-2xl font-bold mb-4">Eco-Friendly Inks</h3>
830
+ <p className="text-gray-600 text-lg">Water-based and soy-based inks for safe printing</p>
831
+ </div>
832
+ <div className="text-center group">
833
+ <div className="text-8xl mb-6 group-hover:animate-bounce transition-all">♻️</div>
834
+ <h3 className="text-2xl font-bold mb-4">Carbon Neutral</h3>
835
+ <p className="text-gray-600 text-lg">Offsetting carbon footprint for every order placed</p>
836
+ </div>
837
+ </div>
838
+ </div>
839
+ </section>
840
+ );
841
+ };
842
+
843
+ // Enhanced Testimonials Section
844
+ const TestimonialsSection = () => {
845
+ const testimonials = [
846
+ {
847
+ name: "Arjun Mehta",
848
+ company: "Tech Innovators Pvt Ltd",
849
+ text: "Hyzo's quality and service exceeded our expectations. The AI design tools saved us hours of work!",
850
+ avatar: "https://images.unsplash.com/photo-1588829608152-e7accc3c7eef?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwyfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85",
851
+ rating: 5
852
+ },
853
+ {
854
+ name: "Sneha Patel",
855
+ company: "Creative Solutions Agency",
856
+ text: "The premium materials and lightning-fast delivery make Hyzo our go-to printing partner.",
857
+ avatar: "https://images.unsplash.com/photo-1504711434969-e33886168f5c?crop=entropy&cs=srgb&fm=jpg&ixid=M3w3NTY2Nzd8MHwxfHNlYXJjaHwzfHxwcmludGluZ3xlbnwwfHx8Ymx1ZXwxNzUwNzAyNDUwfDA&ixlib=rb-4.1.0&q=85",
858
+ rating: 5
859
+ },
860
+ {
861
+ name: "Rahul Sharma",
862
+ company: "Global Enterprises",
863
+ text: "Enterprise features and bulk pricing helped us scale efficiently. Highly recommend for businesses!",
864
+ avatar: "https://images.pexels.com/photos/7135121/pexels-photo-7135121.jpeg",
865
+ rating: 5
866
+ }
867
+ ];
868
+
869
+ return (
870
+ <section className="py-20 bg-gradient-to-br from-gray-50 to-purple-50">
871
+ <div className="container mx-auto px-4">
872
+ <div className="text-center mb-16">
873
+ <h2 className="text-5xl font-bold bg-gradient-to-r from-purple-600 to-teal-500 bg-clip-text text-transparent mb-6">
874
+ Customer Success Stories
875
+ </h2>
876
+ <p className="text-xl text-gray-600">Join thousands of satisfied customers across India</p>
877
+ </div>
878
+ <div className="grid grid-cols-3 gap-10">
879
+ {testimonials.map((testimonial, index) => (
880
+ <div key={index} className="bg-white p-8 rounded-2xl shadow-xl hover:shadow-2xl transition-all duration-300 border border-purple-100">
881
+ <div className="flex items-center mb-6">
882
+ <img
883
+ src={testimonial.avatar}
884
+ alt={testimonial.name}
885
+ className="w-16 h-16 rounded-full object-cover mr-4 border-2 border-purple-200"
886
+ />
887
+ <div>
888
+ <h4 className="font-bold text-gray-800 text-lg">{testimonial.name}</h4>
889
+ <p className="text-gray-600">{testimonial.company}</p>
890
+ </div>
891
+ </div>
892
+ <div className="flex mb-4">
893
+ {[...Array(testimonial.rating)].map((_, i) => (
894
+ <span key={i} className="text-yellow-400 text-xl">⭐</span>
895
+ ))}
896
+ </div>
897
+ <p className="text-gray-700 italic text-lg">"{testimonial.text}"</p>
898
+ </div>
899
+ ))}
900
+ </div>
901
+ </div>
902
+ </section>
903
+ );
904
+ };
905
+
906
+ // Enhanced Footer Component
907
+ const Footer = ({ navigateTo }) => {
908
+ return (
909
+ <footer className="bg-gradient-to-br from-gray-900 to-purple-900 text-white py-16">
910
+ <div className="container mx-auto px-4">
911
+ <div className="grid grid-cols-4 gap-12">
912
+ <div>
913
+ <h3 className="text-2xl font-bold mb-6 bg-gradient-to-r from-purple-400 to-teal-400 bg-clip-text text-transparent">
914
+ Hyzo
915
+ </h3>
916
+ <p className="text-gray-300 mb-6 text-lg">
917
+ India's most advanced online printing platform with AI-powered design tools.
918
+ </p>
919
+ <div className="text-gray-300 space-y-2">
920
+ <p>πŸ“ Mumbai | Delhi | Bangalore</p>
921
+ <p>πŸ“ž +91-9876543210</p>
922
+ <p>πŸ“§ [email protected]</p>
923
+ </div>
924
+ </div>
925
+ <div>
926
+ <h4 className="font-bold mb-6 text-lg">Products</h4>
927
+ <ul className="space-y-3 text-gray-300">
928
+ <li><button className="hover:text-purple-400 transition-colors">Business Cards</button></li>
929
+ <li><button className="hover:text-purple-400 transition-colors">Custom Apparel</button></li>
930
+ <li><button className="hover:text-purple-400 transition-colors">Marketing Materials</button></li>
931
+ <li><button className="hover:text-purple-400 transition-colors">Corporate Gifts</button></li>
932
+ </ul>
933
+ </div>
934
+ <div>
935
+ <h4 className="font-bold mb-6 text-lg">Services</h4>
936
+ <ul className="space-y-3 text-gray-300">
937
+ <li><button className="hover:text-purple-400 transition-colors" onClick={() => navigateTo('design-studio')}>AI Design Studio</button></li>
938
+ <li><button className="hover:text-purple-400 transition-colors" onClick={() => navigateTo('b2b')}>Enterprise Solutions</button></li>
939
+ <li><button className="hover:text-purple-400 transition-colors">Express Delivery</button></li>
940
+ <li><button className="hover:text-purple-400 transition-colors">Custom Solutions</button></li>
941
+ </ul>
942
+ </div>
943
+ <div>
944
+ <h4 className="font-bold mb-6 text-lg">Support</h4>
945
+ <ul className="space-y-3 text-gray-300">
946
+ <li><button className="hover:text-purple-400 transition-colors">Help Center</button></li>
947
+ <li><button className="hover:text-purple-400 transition-colors">Track Order</button></li>
948
+ <li><button className="hover:text-purple-400 transition-colors">Return Policy</button></li>
949
+ <li><button className="hover:text-purple-400 transition-colors">Contact Support</button></li>
950
+ </ul>
951
+ </div>
952
+ </div>
953
+ <div className="border-t border-gray-700 mt-12 pt-8 text-center text-gray-400">
954
+ <p>&copy; 2025 Hyzo India. All rights reserved. | GST: 27HYZO1234X1Z5</p>
955
+ </div>
956
+ </div>
957
+ </footer>
958
+ );
959
+ };
960
+
961
+ // Authentication Modal Component
962
+ const AuthModal = ({ mode, onClose, onLogin, onSwitchMode }) => {
963
+ const [formData, setFormData] = useState({
964
+ name: '',
965
+ email: '',
966
+ password: '',
967
+ confirmPassword: ''
968
+ });
969
+ const [isLoading, setIsLoading] = useState(false);
970
+
971
+ const handleSubmit = async (e) => {
972
+ e.preventDefault();
973
+ setIsLoading(true);
974
+
975
+ // Simulate API call
976
+ setTimeout(() => {
977
+ if (mode === 'signup') {
978
+ if (formData.password !== formData.confirmPassword) {
979
+ alert('Passwords do not match!');
980
+ setIsLoading(false);
981
+ return;
982
+ }
983
+ }
984
+
985
+ // Mock successful authentication
986
+ const userData = {
987
+ name: formData.name || formData.email.split('@')[0],
988
+ email: formData.email,
989
+ id: Date.now()
990
+ };
991
+
992
+ onLogin(userData);
993
+ setIsLoading(false);
994
+ }, 1000);
995
+ };
996
+
997
+ const handleChange = (e) => {
998
+ setFormData({
999
+ ...formData,
1000
+ [e.target.name]: e.target.value
1001
+ });
1002
+ };
1003
+
1004
+ return (
1005
+ <div className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-4">
1006
+ <div className="bg-white rounded-2xl shadow-2xl max-w-md w-full p-8 relative">
1007
+ <button
1008
+ onClick={onClose}
1009
+ className="absolute top-4 right-4 text-gray-500 hover:text-gray-700 text-2xl"
1010
+ >
1011
+ Γ—
1012
+ </button>
1013
+
1014
+ <div className="text-center mb-8">
1015
+ <h2 className="text-3xl font-bold bg-gradient-to-r from-purple-600 to-teal-500 bg-clip-text text-transparent mb-2">
1016
+ {mode === 'login' ? 'Welcome Back' : 'Join Hyzo'}
1017
+ </h2>
1018
+ <p className="text-gray-600">
1019
+ {mode === 'login' ? 'Sign in to your account' : 'Create your account to get started'}
1020
+ </p>
1021
+ </div>
1022
+
1023
+ <form onSubmit={handleSubmit} className="space-y-6">
1024
+ {mode === 'signup' && (
1025
+ <div>
1026
+ <label className="block text-gray-700 font-semibold mb-2">Full Name</label>
1027
+ <input
1028
+ type="text"
1029
+ name="name"
1030
+ value={formData.name}
1031
+ onChange={handleChange}
1032
+ className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:outline-none focus:border-purple-500 transition-colors"
1033
+ placeholder="Enter your full name"
1034
+ required
1035
+ />
1036
+ </div>
1037
+ )}
1038
+
1039
+ <div>
1040
+ <label className="block text-gray-700 font-semibold mb-2">Email Address</label>
1041
+ <input
1042
+ type="email"
1043
+ name="email"
1044
+ value={formData.email}
1045
+ onChange={handleChange}
1046
+ className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:outline-none focus:border-purple-500 transition-colors"
1047
+ placeholder="Enter your email"
1048
+ required
1049
+ />
1050
+ </div>
1051
+
1052
+ <div>
1053
+ <label className="block text-gray-700 font-semibold mb-2">Password</label>
1054
+ <input
1055
+ type="password"
1056
+ name="password"
1057
+ value={formData.password}
1058
+ onChange={handleChange}
1059
+ className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:outline-none focus:border-purple-500 transition-colors"
1060
+ placeholder="Enter your password"
1061
+ required
1062
+ minLength="6"
1063
+ />
1064
+ </div>
1065
+
1066
+ {mode === 'signup' && (
1067
+ <div>
1068
+ <label className="block text-gray-700 font-semibold mb-2">Confirm Password</label>
1069
+ <input
1070
+ type="password"
1071
+ name="confirmPassword"
1072
+ value={formData.confirmPassword}
1073
+ onChange={handleChange}
1074
+ className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:outline-none focus:border-purple-500 transition-colors"
1075
+ placeholder="Confirm your password"
1076
+ required
1077
+ minLength="6"
1078
+ />
1079
+ </div>
1080
+ )}
1081
+
1082
+ <button
1083
+ type="submit"
1084
+ disabled={isLoading}
1085
+ className="w-full bg-gradient-to-r from-purple-600 to-teal-500 text-white py-3 rounded-lg font-semibold hover:from-purple-700 hover:to-teal-600 transition-all disabled:opacity-50"
1086
+ >
1087
+ {isLoading ? 'Please wait...' : (mode === 'login' ? 'Sign In' : 'Create Account')}
1088
+ </button>
1089
+ </form>
1090
+
1091
+ <div className="text-center mt-6">
1092
+ <p className="text-gray-600">
1093
+ {mode === 'login' ? "Don't have an account? " : "Already have an account? "}
1094
+ <button
1095
+ onClick={() => onSwitchMode(mode === 'login' ? 'signup' : 'login')}
1096
+ className="text-purple-600 hover:text-purple-700 font-semibold"
1097
+ >
1098
+ {mode === 'login' ? 'Sign Up' : 'Sign In'}
1099
+ </button>
1100
+ </p>
1101
+ </div>
1102
+ </div>
1103
+ </div>
1104
+ );
1105
+ };
1106
+
1107
+ // Export all components
1108
+ const Components = {
1109
+ Header,
1110
+ Hero,
1111
+ KeyFeatures,
1112
+ ProductGrid,
1113
+ DesignStudio,
1114
+ B2BSection,
1115
+ SustainabilitySection,
1116
+ TestimonialsSection,
1117
+ Footer,
1118
+ AuthModal
1119
+ };
1120
+
1121
+ export default Components;
frontend/src/index.css ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ body {
6
+ margin: 0;
7
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto",
8
+ "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans",
9
+ "Helvetica Neue", sans-serif;
10
+ -webkit-font-smoothing: antialiased;
11
+ -moz-osx-font-smoothing: grayscale;
12
+ }
13
+
14
+ code {
15
+ font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
16
+ monospace;
17
+ }
frontend/src/index.js ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from "react";
2
+ import ReactDOM from "react-dom/client";
3
+ import "./index.css";
4
+ import App from "./App";
5
+
6
+ const root = ReactDOM.createRoot(document.getElementById("root"));
7
+ root.render(
8
+ <React.StrictMode>
9
+ <App />
10
+ </React.StrictMode>,
11
+ );
frontend/tailwind.config.js ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /** @type {import('tailwindcss').Config} */
2
+ module.exports = {
3
+ content: [
4
+ "./src/**/*.{js,jsx,ts,tsx}",
5
+ "./public/index.html"
6
+ ],
7
+ theme: {
8
+ extend: {},
9
+ },
10
+ plugins: [],
11
+ };
frontend/yarn.lock ADDED
The diff for this file is too large to render. See raw diff
 
test_result.md ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #====================================================================================================
2
+ # START - Testing Protocol - DO NOT EDIT OR REMOVE THIS SECTION
3
+ #====================================================================================================
4
+
5
+ # THIS SECTION CONTAINS CRITICAL TESTING INSTRUCTIONS FOR BOTH AGENTS
6
+ # BOTH MAIN_AGENT AND TESTING_AGENT MUST PRESERVE THIS ENTIRE BLOCK
7
+
8
+ # Communication Protocol:
9
+ # If the `testing_agent` is available, main agent should delegate all testing tasks to it.
10
+ #
11
+ # You have access to a file called `test_result.md`. This file contains the complete testing state
12
+ # and history, and is the primary means of communication between main and the testing agent.
13
+ #
14
+ # Main and testing agents must follow this exact format to maintain testing data.
15
+ # The testing data must be entered in yaml format Below is the data structure:
16
+ #
17
+ ## user_problem_statement: {problem_statement}
18
+ ## backend:
19
+ ## - task: "Task name"
20
+ ## implemented: true
21
+ ## working: true # or false or "NA"
22
+ ## file: "file_path.py"
23
+ ## stuck_count: 0
24
+ ## priority: "high" # or "medium" or "low"
25
+ ## needs_retesting: false
26
+ ## status_history:
27
+ ## -working: true # or false or "NA"
28
+ ## -agent: "main" # or "testing" or "user"
29
+ ## -comment: "Detailed comment about status"
30
+ ##
31
+ ## frontend:
32
+ ## - task: "Task name"
33
+ ## implemented: true
34
+ ## working: true # or false or "NA"
35
+ ## file: "file_path.js"
36
+ ## stuck_count: 0
37
+ ## priority: "high" # or "medium" or "low"
38
+ ## needs_retesting: false
39
+ ## status_history:
40
+ ## -working: true # or false or "NA"
41
+ ## -agent: "main" # or "testing" or "user"
42
+ ## -comment: "Detailed comment about status"
43
+ ##
44
+ ## metadata:
45
+ ## created_by: "main_agent"
46
+ ## version: "1.0"
47
+ ## test_sequence: 0
48
+ ## run_ui: false
49
+ ##
50
+ ## test_plan:
51
+ ## current_focus:
52
+ ## - "Task name 1"
53
+ ## - "Task name 2"
54
+ ## stuck_tasks:
55
+ ## - "Task name with persistent issues"
56
+ ## test_all: false
57
+ ## test_priority: "high_first" # or "sequential" or "stuck_first"
58
+ ##
59
+ ## agent_communication:
60
+ ## -agent: "main" # or "testing" or "user"
61
+ ## -message: "Communication message between agents"
62
+
63
+ # Protocol Guidelines for Main agent
64
+ #
65
+ # 1. Update Test Result File Before Testing:
66
+ # - Main agent must always update the `test_result.md` file before calling the testing agent
67
+ # - Add implementation details to the status_history
68
+ # - Set `needs_retesting` to true for tasks that need testing
69
+ # - Update the `test_plan` section to guide testing priorities
70
+ # - Add a message to `agent_communication` explaining what you've done
71
+ #
72
+ # 2. Incorporate User Feedback:
73
+ # - When a user provides feedback that something is or isn't working, add this information to the relevant task's status_history
74
+ # - Update the working status based on user feedback
75
+ # - If a user reports an issue with a task that was marked as working, increment the stuck_count
76
+ # - Whenever user reports issue in the app, if we have testing agent and task_result.md file so find the appropriate task for that and append in status_history of that task to contain the user concern and problem as well
77
+ #
78
+ # 3. Track Stuck Tasks:
79
+ # - Monitor which tasks have high stuck_count values or where you are fixing same issue again and again, analyze that when you read task_result.md
80
+ # - For persistent issues, use websearch tool to find solutions
81
+ # - Pay special attention to tasks in the stuck_tasks list
82
+ # - When you fix an issue with a stuck task, don't reset the stuck_count until the testing agent confirms it's working
83
+ #
84
+ # 4. Provide Context to Testing Agent:
85
+ # - When calling the testing agent, provide clear instructions about:
86
+ # - Which tasks need testing (reference the test_plan)
87
+ # - Any authentication details or configuration needed
88
+ # - Specific test scenarios to focus on
89
+ # - Any known issues or edge cases to verify
90
+ #
91
+ # 5. Call the testing agent with specific instructions referring to test_result.md
92
+ #
93
+ # IMPORTANT: Main agent must ALWAYS update test_result.md BEFORE calling the testing agent, as it relies on this file to understand what to test next.
94
+
95
+ #====================================================================================================
96
+ # END - Testing Protocol - DO NOT EDIT OR REMOVE THIS SECTION
97
+ #====================================================================================================
98
+
99
+
100
+
101
+ #====================================================================================================
102
+ # Testing Data - Main Agent and testing sub agent both should log testing data below this section
103
+ #====================================================================================================
tests/__init__.py ADDED
File without changes
yarn.lock ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2
+ # yarn lockfile v1
3
+
4
+