├── src
├── index.css
├── setupTests.js
├── App.test.js
├── ui
│ ├── scroll-area.js
│ ├── alert.js
│ ├── button.js
│ ├── progress.js
│ ├── card.js
│ └── Tabs.js
├── reportWebVitals.js
├── index.js
├── App.css
├── logo.svg
└── App.jsx
├── public
├── robots.txt
├── Image.jpg
├── scalp.png
├── favicon.ico
├── logo192.png
├── logo512.png
├── human_head.glb
├── manifest.json
└── index.html
├── postcss.config.js
├── --force
├── tailwind.config.js
├── .gitignore
├── package.json
└── README.md
/src/index.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/public/Image.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Krishna18062005/Scalp_Care-FrontEnd-ReactJS/HEAD/public/Image.jpg
--------------------------------------------------------------------------------
/public/scalp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Krishna18062005/Scalp_Care-FrontEnd-ReactJS/HEAD/public/scalp.png
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Krishna18062005/Scalp_Care-FrontEnd-ReactJS/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Krishna18062005/Scalp_Care-FrontEnd-ReactJS/HEAD/public/logo192.png
--------------------------------------------------------------------------------
/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Krishna18062005/Scalp_Care-FrontEnd-ReactJS/HEAD/public/logo512.png
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | };
7 |
--------------------------------------------------------------------------------
/public/human_head.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Krishna18062005/Scalp_Care-FrontEnd-ReactJS/HEAD/public/human_head.glb
--------------------------------------------------------------------------------
/--force:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: [],
4 | theme: {
5 | extend: {},
6 | },
7 | plugins: [],
8 | }
9 |
10 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 |
2 |
3 | /** @type {import('tailwindcss').Config} */
4 | export default {
5 | content: ["./index.html", "./src/**/*.{js,jsx,ts,tsx}"],
6 | theme: {
7 | extend: {},
8 | },
9 | plugins: [],
10 | };
11 |
--------------------------------------------------------------------------------
/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render();
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/src/ui/scroll-area.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | const ScrollArea = ({ children, height = "300px" }) => {
4 | return (
5 |
9 | {children}
10 |
11 | );
12 | };
13 |
14 | export {ScrollArea};
15 |
--------------------------------------------------------------------------------
/src/ui/alert.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | const Alert = ({ children, className }) => {
4 | return (
5 |
6 | {children}
7 |
8 | );
9 | };
10 |
11 | const AlertDescription = ({ children }) => (
12 | {children}
13 | );
14 |
15 | export { Alert, AlertDescription };
16 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/src/ui/button.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | const Button = ({ onClick, loading }) => {
3 | return (
4 |
11 | );
12 | };
13 |
14 | export {Button};
15 |
--------------------------------------------------------------------------------
/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/src/ui/progress.js:
--------------------------------------------------------------------------------
1 | import { motion } from "framer-motion";
2 | import React from "react";
3 | const Progress = ({ progress }) => {
4 | return (
5 |
6 |
12 |
13 | );
14 | };
15 |
16 | export { Progress};
17 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 | import './index.css';
4 | import App from './App';
5 | import reportWebVitals from './reportWebVitals';
6 |
7 | const root = ReactDOM.createRoot(document.getElementById('root'));
8 | root.render(
9 |
10 |
11 |
12 | );
13 |
14 | // If you want to start measuring performance in your app, pass a function
15 | // to log results (for example: reportWebVitals(console.log))
16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
17 | reportWebVitals();
18 |
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/src/ui/card.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | const Card = ({ children, className }) => {
4 | return (
5 |
6 | {children}
7 |
8 | );
9 | };
10 |
11 | const CardHeader = ({ children }) => (
12 | {children}
13 | );
14 |
15 | const CardTitle = ({ children }) => (
16 | {children}
17 | );
18 |
19 | const CardContent = ({ children }) => {children}
;
20 |
21 | export { Card, CardHeader, CardTitle, CardContent };
22 |
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | /* Custom styles */
6 | .progress-circle {
7 | transform: rotate(-90deg);
8 | }
9 |
10 | .progress-text {
11 | font-size: 1.5rem;
12 | font-weight: bold;
13 | fill: theme('colors.indigo.600');
14 | }
15 |
16 | .notification {
17 | position: fixed;
18 | top: 1rem;
19 | right: 1rem;
20 | background-color: theme('colors.green.500');
21 | color: white;
22 | padding: 0.75rem 1.5rem;
23 | border-radius: 0.5rem;
24 | box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
25 | transition: transform 0.3s ease-in-out;
26 | }
27 |
28 | .notification.hidden {
29 | transform: translateY(-100%);
30 | }
31 |
--------------------------------------------------------------------------------
/src/ui/Tabs.js:
--------------------------------------------------------------------------------
1 | import React, { createContext, useContext, useState } from "react";
2 |
3 | const TabsContext = createContext();
4 |
5 | const Tabs = ({ defaultValue, children }) => {
6 | const [activeTab, setActiveTab] = useState(defaultValue);
7 |
8 | return (
9 |
10 | {children}
11 |
12 | );
13 | };
14 |
15 | const TabsList = ({ children }) => {
16 | return {children}
;
17 | };
18 |
19 | const TabsTrigger = ({ value, children }) => {
20 | const { activeTab, setActiveTab } = useContext(TabsContext);
21 |
22 | return (
23 |
31 | );
32 | };
33 |
34 | const TabsContent = ({ value, children }) => {
35 | const { activeTab } = useContext(TabsContext);
36 |
37 | return activeTab === value ? {children}
: null;
38 | };
39 |
40 | export { Tabs, TabsList, TabsTrigger, TabsContent };
41 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "scalp",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@react-three/drei": "^9.121.4",
7 | "@react-three/fiber": "^8.17.14",
8 | "@shadcn/ui": "^0.0.4",
9 | "cra-template": "1.2.0",
10 | "lucide-react": "^0.475.0",
11 | "react": "^18.2.0",
12 | "react-dom": "^18.2.0",
13 | "react-icons": "^5.4.0",
14 | "react-scripts": "5.0.1",
15 | "recharts": "^2.15.1",
16 | "tailwind": "^4.0.0",
17 | "three": "^0.173.0",
18 | "web-vitals": "^4.2.4"
19 | },
20 | "scripts": {
21 | "start": "react-scripts start",
22 | "build": "react-scripts build",
23 | "test": "react-scripts test",
24 | "eject": "react-scripts eject"
25 | },
26 | "eslintConfig": {
27 | "extends": [
28 | "react-app",
29 | "react-app/jest"
30 | ]
31 | },
32 | "browserslist": {
33 | "production": [
34 | ">0.2%",
35 | "not dead",
36 | "not op_mini all"
37 | ],
38 | "development": [
39 | "last 1 chrome version",
40 | "last 1 firefox version",
41 | "last 1 safari version"
42 | ]
43 | },
44 | "devDependencies": {
45 | "autoprefixer": "^10.4.20",
46 | "postcss": "^8.5.1",
47 | "tailwindcss": "^3.4.17"
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
27 | React App
28 |
29 |
30 |
31 |
32 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/src/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # **{ScalpFelix}** Wearable AI-Powered Men's Hair Care Device
2 |
3 | ## Overview
4 | This project is a next-generation **AI-powered wearable men's hair care device**, designed to function as both a **scalp massager** and **serum applicator**. It provides a customizable, hands-free hair care experience with **zero hair breakage**, featuring **expandable massage nodes, smart scalp mapping, and AI-based hair analysis** for effective serum absorption and personalized scalp treatment.
5 |
6 | ---
7 |
8 | ## Features & Design
9 |
10 | ### 1. **External Design (Comfort, Fit & Usability)**
11 | - ✅ **Adjustable, Lightweight & Wearable**: Helmet-like structure with an adjustable fit, made from breathable, cushioned materials.
12 | - ✅ **Detachable, Hygienic Inner Lining**: Anti-bacterial, sweat-resistant, and washable lining for easy maintenance.
13 | - ✅ **Open & Breathable Structure**: Allows airflow for maximum comfort during wear.
14 | - ✅ **Sustainable & Eco-Friendly Materials**: Constructed with recycled bio-plastics and biodegradable composites.
15 | - ✅ **Wireless & Rechargeable**: Long battery life (6-8 hours per charge) with **USB-C fast charging**.
16 | - ✅ **Minimalist Touch Controls + App Integration**: On-device controls for quick access and full customization via a mobile app.
17 |
18 | ### 2. **Internal System (Massage & Serum Application)**
19 | - ✅ **Expandable, Hair-Friendly Massage Nodes**: Soft silicone nodes that expand/retract for a natural massage effect, ensuring **zero hair breakage**.
20 | - ✅ **Dual-Mode Serum Application**:
21 | - **Spray Mode**: Evenly distributes lightweight serum.
22 | - **Direct Contact Mode**: Nodes press serum into the scalp for deep absorption.
23 | - ✅ **Customizable Massage & Intensity Settings**:
24 | - Pre-set modes: **Deep tissue, kneading, vibration, tapping**.
25 | - Adjustable intensity levels based on user preference.
26 | - ✅ **Auto-Timer & Sleep Mode**: Users can schedule massage sessions before sleeping.
27 |
28 | ### 3. **Software & AI Smart Features**
29 | - ✅ **Touch-Based 3D Scalp Mapping**:
30 | - Users can tap/drag on a 3D model in the app to target specific areas for treatment.
31 | - ✅ **AI-Powered Hair Health Check-up**:
32 | - Analyzes scalp condition in real-time (e.g., **dandruff, dryness, hair thinning**).
33 | - Automatically adjusts serum composition, spray time, and massage intensity.
34 | - ✅ **L’Oréal Expert Product Recommendations**:
35 | - Integrates with **L’Oréal’s AI** to suggest optimal products for each user.
36 | - Users can order recommended products directly through the app.
37 | - ✅ **Cloud Sync & Personalized Hair Care History**:
38 | - Stores user preferences via **Bluetooth & cloud connectivity**.
39 | - Optional **voice control support** for hands-free operation.
40 |
41 | ---
42 |
43 | ## Finalized Improvements (Market-Ready Enhancements)
44 | - ✅ **Lightweight & Adjustable Design** → Ensures **all-day comfort**.
45 | - ✅ **Smart Serum Dispensing** → Dual-mode **spray & direct application**.
46 | - ✅ **Scalp Mapping & AI Check-Up** → Auto-adjusts based on real-time scalp data.
47 | - ✅ **Eco-Friendly & Sustainable** → **Biodegradable materials + refillable serum cartridges**.
48 | - ✅ **Long Battery Life & Fast Charging** → **6-8 hours per charge + USB-C**.
49 |
50 | ---
51 |
52 | ## Installation & Usage
53 | ### Prerequisites
54 | - Node.js & npm (for React App integration)
55 | - Python (for AI-powered scalp analysis backend)
56 | - Git (for version control)
57 |
58 | ### Steps to Run the Project
59 | 1. **Clone the Repository**
60 | ```sh
61 | git clone https://github.com/your-username/your-repo.git
62 | cd your-repo
63 | ```
64 |
65 | 2. **Install Dependencies**
66 | ```sh
67 | npm install # For frontend
68 | pip install -r requirements.txt # For backend (if applicable)
69 | ```
70 |
71 | 3. **Run the Application**
72 | ```sh
73 | npm start # Runs the frontend
74 | python app.py # Starts the backend (if applicable)
75 | ```
76 |
77 | 4. **Connect the Device**
78 | - Ensure the device is **charged & connected via Bluetooth**.
79 | - Open the mobile app and sync with the device.
80 | - Customize settings & enjoy hands-free hair care!
81 |
82 | ---
83 |
84 | ## Tech Stack
85 | ### **Frontend**
86 | - React.js (for app interface)
87 | - Tailwind CSS (for UI styling)
88 |
89 | ### **Backend**
90 | - Python (Flask/Django for AI processing)
91 | - TensorFlow/Keras (for hair health analysis)
92 | - Firebase/AWS (for cloud sync)
93 |
94 | ### **Hardware Integration**
95 | - Bluetooth Low Energy (BLE) for connectivity
96 | - AI-driven scalp analysis with TensorFlow
97 | - Rechargeable battery with USB-C fast charging
98 |
99 | ---
100 |
101 | ## Contributors
102 | - **Krishna K**, Lead Developer
103 | - **Dhivya S** ,AI & ML Engineer
104 | - **Akshaya T**, UI/UX Designer
105 |
106 |
107 | ---
108 |
109 | ## Final Thoughts
110 | our product is now a **realistic, market-ready, high-tech hair care device**. With a blend of **customizable massages, AI scalp analysis, smart serum application, and ergonomic wearable design**, it stands as a groundbreaking innovation in the men's grooming industry.
111 |
112 | 🚀 **Get ready for the future of smart hair care!**
113 |
114 |
--------------------------------------------------------------------------------
/src/App.jsx:
--------------------------------------------------------------------------------
1 | import { useState } from 'react';
2 | import { React } from 'react';
3 | import './App.css';
4 | import { Tabs, TabsList, TabsTrigger, TabsContent } from "./ui/Tabs";
5 | import { ScrollArea } from "./ui/scroll-area";
6 | import {
7 | Clock,
8 | ShoppingBag,
9 | User,
10 | Award,
11 | Activity,
12 | Bell,
13 | Droplet,
14 | Wind,
15 | DropletIcon,
16 | PlayCircle,
17 | PauseCircle,
18 | } from 'lucide-react';
19 | import { Card, CardContent, CardHeader, CardTitle } from './ui/card';
20 | import { Alert, AlertDescription } from './ui/alert';
21 | import {
22 | LineChart,
23 | Line,
24 | XAxis,
25 | YAxis,
26 | CartesianGrid,
27 | Tooltip,
28 | ResponsiveContainer,
29 | } from 'recharts';
30 |
31 | const App = () => {
32 | const [scanComplete, setScanComplete] = useState(false);
33 | const [activeTab, setActiveTab] = useState('dashboard');
34 | const [scanProgress, setScanProgress] = useState(0);
35 | const [showNotification, setShowNotification] = useState(false);
36 | const [selectedTimeframe, setSelectedTimeframe] = useState('1W');
37 | const [isScanning, setIsScanning] = useState(false);
38 | const [cartCount] = useState(0);
39 | const [isMassaging, setIsMassaging] = useState(false);
40 | const [massageType, setMassageType] = useState('circular');
41 |
42 | const [serumApplied, setSerumApplied] = useState(false);
43 | const [massageTime, setMassageTime] = useState(10); // Default massage time in minutes
44 | const [targetArea, setTargetArea] = useState('full'); // Default target area for massage
45 |
46 | // Mock historical data for charts
47 | const historicalData = [
48 | { date: 'Mon', health: 75, moisture: 60, scalp: 80 },
49 | { date: 'Tue', health: 78, moisture: 65, scalp: 82 },
50 | { date: 'Wed', health: 76, moisture: 68, scalp: 85 },
51 | { date: 'Thu', health: 80, moisture: 70, scalp: 83 },
52 | { date: 'Fri', health: 82, moisture: 72, scalp: 86 },
53 | { date: 'Sat', health: 85, moisture: 75, scalp: 88 },
54 | { date: 'Sun', health: 88, moisture: 78, scalp: 90 },
55 | ];
56 |
57 | const mockScanResults = {
58 | hairHealth: 88,
59 | moistureLevel: 78,
60 | scalpCondition: 90,
61 | recommendedProducts: [
62 | {
63 | name: "L'Oréal Pro Scalp Care Serum",
64 | price: '$29.99',
65 | rating: 4.8,
66 | reviews: 128,
67 | benefits: ['Deep moisturizing', 'Scalp health', 'Anti-dandruff'],
68 | },
69 | {
70 | name: "L'Oréal Vitamin E Boost",
71 | price: '$24.99',
72 | rating: 4.6,
73 | reviews: 95,
74 | benefits: ['Vitamin enriched', 'Hair strength', 'Shine boost'],
75 | },
76 | ],
77 | treatment: {
78 | serumMix: '70% Moisture + 30% Repair',
79 | applicationMode: 'Direct Contact',
80 | duration: '15 minutes',
81 | frequency: 'Daily',
82 |
83 | pressure: 'Medium',
84 | },
85 | };
86 |
87 | const startScan = () => {
88 | setIsScanning(true);
89 | setScanProgress(0);
90 |
91 | const interval = setInterval(() => {
92 | setScanProgress((prev) => {
93 | if (prev >= 100) {
94 | clearInterval(interval);
95 | setIsScanning(false);
96 | setScanComplete(true);
97 | setShowNotification(true);
98 | setTimeout(() => setShowNotification(false), 3000);
99 | return 100;
100 | }
101 | return prev + 2;
102 | });
103 | }, 100);
104 | };
105 |
106 | const toggleMassage = () => {
107 | setIsMassaging(!isMassaging);
108 | };
109 |
110 | const applySerum = () => {
111 | setSerumApplied(true);
112 | setTimeout(() => setSerumApplied(false), 5000); // Simulate serum application
113 | };
114 |
115 | const ProgressCircle = ({ progress, size = 150 }) => {
116 | const strokeWidth = 8;
117 | const radius = (size - strokeWidth) / 2;
118 | const circumference = radius * 2 * Math.PI;
119 | const offset = circumference - (progress / 100) * circumference;
120 |
121 | return (
122 |
154 | );
155 | };
156 |
157 | return (
158 |
159 | {/* Notification */}
160 |
165 | {cartCount > 0 ? 'Product added to cart!' : 'Scan completed successfully!'}
166 |
167 |
168 | {/* Header */}
169 |
191 |
192 | {/* Main Content */}
193 |
194 | {/* Navigation Tabs */}
195 |
196 | {[
197 | { id: 'dashboard', icon: Activity, label: 'Dashboard' },
198 | { id: 'scan', icon: Clock, label: 'Daily Scan' },
199 | { id: 'massager', icon: Award, label: '3D Massager' },
200 | ].map((tab) => (
201 |
214 | ))}
215 |
216 |
217 | {/* Dashboard Content */}
218 |
219 | {/* Scan Card */}
220 | {activeTab === 'dashboard' && (
221 |
222 |
223 | Dashboard Overview
224 |
225 |
226 |
227 |
Device Dashboard
228 |
229 |
230 | Features
231 | How to Use
232 | Components
233 |
234 |
235 |
236 |
237 |
238 |
239 | Key Features
240 |
241 | - Adjustable, Lightweight & Wearable
242 | - Detachable, Hygienic Inner Lining
243 | - Wireless & Rechargeable (6-8 hrs battery)
244 | - Customizable Massage & Intensity Settings
245 | - AI-Powered Hair Health Check-up
246 |
247 | - Scalp Mapping with AI
248 | - Eco-Friendly & Sustainable Materials
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 | How to Use
260 |
261 | - Ensure the device is fully charged.
262 | - Adjust the fit for comfort.
263 | - Choose the desired massage or serum mode.
264 | - Turn on the device using the touch controls or app.
265 | - Enjoy the session as per the timer settings.
266 | - Clean the device after use for hygiene.
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 | Components Used
278 |
279 | - Flexible Silicone Massage Nodes
280 | - Smart AI Sensors for Scalp Mapping
281 | - Eco-Friendly Biodegradable Body Material
282 | - USB-C Fast Charging Module
283 | - Bluetooth & Cloud Connectivity Module
284 | - Serum Dispensing System
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 | )}
296 |
297 | {activeTab === 'massager' && (
298 |
299 |
300 | 3D Scalp Massager
301 |
302 |
303 | {/* Scalp Image with Interactive Overlays */}
304 |
305 |

310 |
311 | {/* Overlay Buttons for Scalp Positions */}
312 |
313 | {/* Top (Front) */}
314 |
322 |
323 | {/* Bottom (Back) */}
324 |
332 |
333 | {/* Left */}
334 |
342 |
343 | {/* Right */}
344 |
352 |
353 |
354 |
355 | {/* Massage Controls */}
356 |
357 |
358 |
365 |
366 |
374 |
375 |
376 |
377 |
378 |
379 |
388 |
389 |
390 |
391 |
392 |
393 |
394 | setMassageTime(Number(e.target.value))}
398 | className="w-full p-2 border border-gray-300 rounded-lg"
399 | />
400 |
401 |
402 |
403 |
404 |
415 |
416 |
417 |
418 |
419 |
420 | )}
421 |
422 | {activeTab === 'scan' && (
423 |
424 |
425 | Daily Hair Analysis
426 |
427 |
428 | {!scanComplete ? (
429 |
430 | {isScanning ? (
431 |
432 |
433 |
Analyzing your hair condition...
434 |
435 | ) : (
436 |
442 | )}
443 |
444 | ) : (
445 |
446 |
447 |
448 | Scan complete! Here are your personalized recommendations.
449 |
450 |
451 |
452 | {/* Health Metrics */}
453 |
454 | {[
455 | { label: 'Hair Health', value: mockScanResults.hairHealth, icon: Activity },
456 | { label: 'Moisture', value: mockScanResults.moistureLevel, icon: Droplet },
457 | { label: 'Scalp Condition', value: mockScanResults.scalpCondition, icon: Wind },
458 | ].map((metric) => (
459 |
463 |
464 |
{metric.value}%
465 |
{metric.label}
466 |
467 | ))}
468 |
469 |
470 | {/* Charts */}
471 |
472 |
473 |
474 |
Trends
475 |
476 | {['1W', '1M', '3M', '1Y'].map((timeframe) => (
477 |
488 | ))}
489 |
490 |
491 |
492 |
493 |
494 |
495 |
496 |
497 |
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 |
506 |
507 |
508 |
509 | {/* Treatment Recommendations */}
510 |
511 |
Today's Treatment Plan
512 |
513 | {Object.entries(mockScanResults.treatment).map(([key, value]) => (
514 |
515 |
{key.replace(/([A-Z])/g, ' $1')}
516 |
{value}
517 |
520 |
521 | ))}
522 |
523 |
524 |
525 | )}
526 |
527 |
528 | )}
529 |
530 |
531 |
532 | );
533 | };
534 |
535 | export default App;
536 |
--------------------------------------------------------------------------------