├── 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 | 123 | 131 | 143 | 151 | {progress}% 152 | 153 | 154 | ); 155 | }; 156 | 157 | return ( 158 |
159 | {/* Notification */} 160 |
165 | {cartCount > 0 ? 'Product added to cart!' : 'Scan completed successfully!'} 166 |
167 | 168 | {/* Header */} 169 |
170 |
171 |

ScalpFelix

172 |
173 | 181 | 185 | 188 |
189 |
190 |
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 |
  1. Ensure the device is fully charged.
  2. 262 |
  3. Adjust the fit for comfort.
  4. 263 |
  5. Choose the desired massage or serum mode.
  6. 264 |
  7. Turn on the device using the touch controls or app.
  8. 265 |
  9. Enjoy the session as per the timer settings.
  10. 266 |
  11. Clean the device after use for hygiene.
  12. 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 | Scalp 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 |
518 |
519 |
520 |
521 | ))} 522 |
523 |
524 |
525 | )} 526 |
527 |
528 | )} 529 |
530 |
531 |
532 | ); 533 | }; 534 | 535 | export default App; 536 | --------------------------------------------------------------------------------