darved2305 commited on
Commit
c715979
·
0 Parent(s):

landing page and made it multilingual

Browse files
frontend/.gitignore ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ node_modules
2
+ dist
3
+ dist-ssr
4
+ *.local
5
+
6
+ .vscode/*
7
+ !.vscode/extensions.json
8
+ .idea
9
+ .DS_Store
10
+ *.suo
11
+ *.ntvs*
12
+ *.njsproj
13
+ *.sln
14
+ *.sw?
15
+
16
+ .env
17
+ .env.local
18
+ .env.development.local
19
+ .env.test.local
20
+ .env.production.local
21
+
22
+ npm-debug.log*
23
+ yarn-debug.log*
24
+ yarn-error.log*
25
+ pnpm-debug.log*
26
+ lerna-debug.log*
27
+
28
+ coverage
29
+ *.log
frontend/index.html ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Co-Code GGW - Unified Medical Platform</title>\n <meta name="description" content="Upload your lab reports, get them interpreted, and receive smart reminders for checkups + medicines. Co-Code GGW helps you stay preventive—without becoming your doctor." />
8
+ <link rel="preconnect" href="https://fonts.googleapis.com">
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
+ <link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600;1,700&family=DM+Sans:wght@400;500;600;700&display=swap" rel="stylesheet">
11
+ </head>
12
+ <body>
13
+ <div id="root"></div>
14
+ <script type="module" src="/src/main.tsx"></script>
15
+ </body>
16
+ </html>
frontend/package-lock.json ADDED
@@ -0,0 +1,1888 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "co-code-ggw",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "co-code-ggw",
9
+ "version": "1.0.0",
10
+ "dependencies": {
11
+ "framer-motion": "^12.29.2",
12
+ "gsap": "^3.14.2",
13
+ "i18next": "^25.8.0",
14
+ "i18next-browser-languagedetector": "^8.2.0",
15
+ "react": "^18.2.0",
16
+ "react-dom": "^18.2.0",
17
+ "react-i18next": "^16.5.4"
18
+ },
19
+ "devDependencies": {
20
+ "@types/react": "^18.2.0",
21
+ "@types/react-dom": "^18.2.0",
22
+ "@vitejs/plugin-react": "^4.2.0",
23
+ "typescript": "^5.3.0",
24
+ "vite": "^5.0.0"
25
+ }
26
+ },
27
+ "node_modules/@babel/code-frame": {
28
+ "version": "7.28.6",
29
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz",
30
+ "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==",
31
+ "dev": true,
32
+ "license": "MIT",
33
+ "dependencies": {
34
+ "@babel/helper-validator-identifier": "^7.28.5",
35
+ "js-tokens": "^4.0.0",
36
+ "picocolors": "^1.1.1"
37
+ },
38
+ "engines": {
39
+ "node": ">=6.9.0"
40
+ }
41
+ },
42
+ "node_modules/@babel/compat-data": {
43
+ "version": "7.28.6",
44
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz",
45
+ "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==",
46
+ "dev": true,
47
+ "license": "MIT",
48
+ "engines": {
49
+ "node": ">=6.9.0"
50
+ }
51
+ },
52
+ "node_modules/@babel/core": {
53
+ "version": "7.28.6",
54
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz",
55
+ "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==",
56
+ "dev": true,
57
+ "license": "MIT",
58
+ "dependencies": {
59
+ "@babel/code-frame": "^7.28.6",
60
+ "@babel/generator": "^7.28.6",
61
+ "@babel/helper-compilation-targets": "^7.28.6",
62
+ "@babel/helper-module-transforms": "^7.28.6",
63
+ "@babel/helpers": "^7.28.6",
64
+ "@babel/parser": "^7.28.6",
65
+ "@babel/template": "^7.28.6",
66
+ "@babel/traverse": "^7.28.6",
67
+ "@babel/types": "^7.28.6",
68
+ "@jridgewell/remapping": "^2.3.5",
69
+ "convert-source-map": "^2.0.0",
70
+ "debug": "^4.1.0",
71
+ "gensync": "^1.0.0-beta.2",
72
+ "json5": "^2.2.3",
73
+ "semver": "^6.3.1"
74
+ },
75
+ "engines": {
76
+ "node": ">=6.9.0"
77
+ },
78
+ "funding": {
79
+ "type": "opencollective",
80
+ "url": "https://opencollective.com/babel"
81
+ }
82
+ },
83
+ "node_modules/@babel/generator": {
84
+ "version": "7.28.6",
85
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz",
86
+ "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==",
87
+ "dev": true,
88
+ "license": "MIT",
89
+ "dependencies": {
90
+ "@babel/parser": "^7.28.6",
91
+ "@babel/types": "^7.28.6",
92
+ "@jridgewell/gen-mapping": "^0.3.12",
93
+ "@jridgewell/trace-mapping": "^0.3.28",
94
+ "jsesc": "^3.0.2"
95
+ },
96
+ "engines": {
97
+ "node": ">=6.9.0"
98
+ }
99
+ },
100
+ "node_modules/@babel/helper-compilation-targets": {
101
+ "version": "7.28.6",
102
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
103
+ "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
104
+ "dev": true,
105
+ "license": "MIT",
106
+ "dependencies": {
107
+ "@babel/compat-data": "^7.28.6",
108
+ "@babel/helper-validator-option": "^7.27.1",
109
+ "browserslist": "^4.24.0",
110
+ "lru-cache": "^5.1.1",
111
+ "semver": "^6.3.1"
112
+ },
113
+ "engines": {
114
+ "node": ">=6.9.0"
115
+ }
116
+ },
117
+ "node_modules/@babel/helper-globals": {
118
+ "version": "7.28.0",
119
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
120
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
121
+ "dev": true,
122
+ "license": "MIT",
123
+ "engines": {
124
+ "node": ">=6.9.0"
125
+ }
126
+ },
127
+ "node_modules/@babel/helper-module-imports": {
128
+ "version": "7.28.6",
129
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
130
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
131
+ "dev": true,
132
+ "license": "MIT",
133
+ "dependencies": {
134
+ "@babel/traverse": "^7.28.6",
135
+ "@babel/types": "^7.28.6"
136
+ },
137
+ "engines": {
138
+ "node": ">=6.9.0"
139
+ }
140
+ },
141
+ "node_modules/@babel/helper-module-transforms": {
142
+ "version": "7.28.6",
143
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
144
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
145
+ "dev": true,
146
+ "license": "MIT",
147
+ "dependencies": {
148
+ "@babel/helper-module-imports": "^7.28.6",
149
+ "@babel/helper-validator-identifier": "^7.28.5",
150
+ "@babel/traverse": "^7.28.6"
151
+ },
152
+ "engines": {
153
+ "node": ">=6.9.0"
154
+ },
155
+ "peerDependencies": {
156
+ "@babel/core": "^7.0.0"
157
+ }
158
+ },
159
+ "node_modules/@babel/helper-plugin-utils": {
160
+ "version": "7.28.6",
161
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
162
+ "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
163
+ "dev": true,
164
+ "license": "MIT",
165
+ "engines": {
166
+ "node": ">=6.9.0"
167
+ }
168
+ },
169
+ "node_modules/@babel/helper-string-parser": {
170
+ "version": "7.27.1",
171
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
172
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
173
+ "dev": true,
174
+ "license": "MIT",
175
+ "engines": {
176
+ "node": ">=6.9.0"
177
+ }
178
+ },
179
+ "node_modules/@babel/helper-validator-identifier": {
180
+ "version": "7.28.5",
181
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
182
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
183
+ "dev": true,
184
+ "license": "MIT",
185
+ "engines": {
186
+ "node": ">=6.9.0"
187
+ }
188
+ },
189
+ "node_modules/@babel/helper-validator-option": {
190
+ "version": "7.27.1",
191
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
192
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
193
+ "dev": true,
194
+ "license": "MIT",
195
+ "engines": {
196
+ "node": ">=6.9.0"
197
+ }
198
+ },
199
+ "node_modules/@babel/helpers": {
200
+ "version": "7.28.6",
201
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz",
202
+ "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==",
203
+ "dev": true,
204
+ "license": "MIT",
205
+ "dependencies": {
206
+ "@babel/template": "^7.28.6",
207
+ "@babel/types": "^7.28.6"
208
+ },
209
+ "engines": {
210
+ "node": ">=6.9.0"
211
+ }
212
+ },
213
+ "node_modules/@babel/parser": {
214
+ "version": "7.28.6",
215
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz",
216
+ "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==",
217
+ "dev": true,
218
+ "license": "MIT",
219
+ "dependencies": {
220
+ "@babel/types": "^7.28.6"
221
+ },
222
+ "bin": {
223
+ "parser": "bin/babel-parser.js"
224
+ },
225
+ "engines": {
226
+ "node": ">=6.0.0"
227
+ }
228
+ },
229
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
230
+ "version": "7.27.1",
231
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
232
+ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
233
+ "dev": true,
234
+ "license": "MIT",
235
+ "dependencies": {
236
+ "@babel/helper-plugin-utils": "^7.27.1"
237
+ },
238
+ "engines": {
239
+ "node": ">=6.9.0"
240
+ },
241
+ "peerDependencies": {
242
+ "@babel/core": "^7.0.0-0"
243
+ }
244
+ },
245
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
246
+ "version": "7.27.1",
247
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
248
+ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
249
+ "dev": true,
250
+ "license": "MIT",
251
+ "dependencies": {
252
+ "@babel/helper-plugin-utils": "^7.27.1"
253
+ },
254
+ "engines": {
255
+ "node": ">=6.9.0"
256
+ },
257
+ "peerDependencies": {
258
+ "@babel/core": "^7.0.0-0"
259
+ }
260
+ },
261
+ "node_modules/@babel/runtime": {
262
+ "version": "7.28.6",
263
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz",
264
+ "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==",
265
+ "license": "MIT",
266
+ "engines": {
267
+ "node": ">=6.9.0"
268
+ }
269
+ },
270
+ "node_modules/@babel/template": {
271
+ "version": "7.28.6",
272
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
273
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
274
+ "dev": true,
275
+ "license": "MIT",
276
+ "dependencies": {
277
+ "@babel/code-frame": "^7.28.6",
278
+ "@babel/parser": "^7.28.6",
279
+ "@babel/types": "^7.28.6"
280
+ },
281
+ "engines": {
282
+ "node": ">=6.9.0"
283
+ }
284
+ },
285
+ "node_modules/@babel/traverse": {
286
+ "version": "7.28.6",
287
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz",
288
+ "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==",
289
+ "dev": true,
290
+ "license": "MIT",
291
+ "dependencies": {
292
+ "@babel/code-frame": "^7.28.6",
293
+ "@babel/generator": "^7.28.6",
294
+ "@babel/helper-globals": "^7.28.0",
295
+ "@babel/parser": "^7.28.6",
296
+ "@babel/template": "^7.28.6",
297
+ "@babel/types": "^7.28.6",
298
+ "debug": "^4.3.1"
299
+ },
300
+ "engines": {
301
+ "node": ">=6.9.0"
302
+ }
303
+ },
304
+ "node_modules/@babel/types": {
305
+ "version": "7.28.6",
306
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz",
307
+ "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==",
308
+ "dev": true,
309
+ "license": "MIT",
310
+ "dependencies": {
311
+ "@babel/helper-string-parser": "^7.27.1",
312
+ "@babel/helper-validator-identifier": "^7.28.5"
313
+ },
314
+ "engines": {
315
+ "node": ">=6.9.0"
316
+ }
317
+ },
318
+ "node_modules/@esbuild/aix-ppc64": {
319
+ "version": "0.21.5",
320
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
321
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
322
+ "cpu": [
323
+ "ppc64"
324
+ ],
325
+ "dev": true,
326
+ "license": "MIT",
327
+ "optional": true,
328
+ "os": [
329
+ "aix"
330
+ ],
331
+ "engines": {
332
+ "node": ">=12"
333
+ }
334
+ },
335
+ "node_modules/@esbuild/android-arm": {
336
+ "version": "0.21.5",
337
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
338
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
339
+ "cpu": [
340
+ "arm"
341
+ ],
342
+ "dev": true,
343
+ "license": "MIT",
344
+ "optional": true,
345
+ "os": [
346
+ "android"
347
+ ],
348
+ "engines": {
349
+ "node": ">=12"
350
+ }
351
+ },
352
+ "node_modules/@esbuild/android-arm64": {
353
+ "version": "0.21.5",
354
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
355
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
356
+ "cpu": [
357
+ "arm64"
358
+ ],
359
+ "dev": true,
360
+ "license": "MIT",
361
+ "optional": true,
362
+ "os": [
363
+ "android"
364
+ ],
365
+ "engines": {
366
+ "node": ">=12"
367
+ }
368
+ },
369
+ "node_modules/@esbuild/android-x64": {
370
+ "version": "0.21.5",
371
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
372
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
373
+ "cpu": [
374
+ "x64"
375
+ ],
376
+ "dev": true,
377
+ "license": "MIT",
378
+ "optional": true,
379
+ "os": [
380
+ "android"
381
+ ],
382
+ "engines": {
383
+ "node": ">=12"
384
+ }
385
+ },
386
+ "node_modules/@esbuild/darwin-arm64": {
387
+ "version": "0.21.5",
388
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
389
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
390
+ "cpu": [
391
+ "arm64"
392
+ ],
393
+ "dev": true,
394
+ "license": "MIT",
395
+ "optional": true,
396
+ "os": [
397
+ "darwin"
398
+ ],
399
+ "engines": {
400
+ "node": ">=12"
401
+ }
402
+ },
403
+ "node_modules/@esbuild/darwin-x64": {
404
+ "version": "0.21.5",
405
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
406
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
407
+ "cpu": [
408
+ "x64"
409
+ ],
410
+ "dev": true,
411
+ "license": "MIT",
412
+ "optional": true,
413
+ "os": [
414
+ "darwin"
415
+ ],
416
+ "engines": {
417
+ "node": ">=12"
418
+ }
419
+ },
420
+ "node_modules/@esbuild/freebsd-arm64": {
421
+ "version": "0.21.5",
422
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
423
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
424
+ "cpu": [
425
+ "arm64"
426
+ ],
427
+ "dev": true,
428
+ "license": "MIT",
429
+ "optional": true,
430
+ "os": [
431
+ "freebsd"
432
+ ],
433
+ "engines": {
434
+ "node": ">=12"
435
+ }
436
+ },
437
+ "node_modules/@esbuild/freebsd-x64": {
438
+ "version": "0.21.5",
439
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
440
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
441
+ "cpu": [
442
+ "x64"
443
+ ],
444
+ "dev": true,
445
+ "license": "MIT",
446
+ "optional": true,
447
+ "os": [
448
+ "freebsd"
449
+ ],
450
+ "engines": {
451
+ "node": ">=12"
452
+ }
453
+ },
454
+ "node_modules/@esbuild/linux-arm": {
455
+ "version": "0.21.5",
456
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
457
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
458
+ "cpu": [
459
+ "arm"
460
+ ],
461
+ "dev": true,
462
+ "license": "MIT",
463
+ "optional": true,
464
+ "os": [
465
+ "linux"
466
+ ],
467
+ "engines": {
468
+ "node": ">=12"
469
+ }
470
+ },
471
+ "node_modules/@esbuild/linux-arm64": {
472
+ "version": "0.21.5",
473
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
474
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
475
+ "cpu": [
476
+ "arm64"
477
+ ],
478
+ "dev": true,
479
+ "license": "MIT",
480
+ "optional": true,
481
+ "os": [
482
+ "linux"
483
+ ],
484
+ "engines": {
485
+ "node": ">=12"
486
+ }
487
+ },
488
+ "node_modules/@esbuild/linux-ia32": {
489
+ "version": "0.21.5",
490
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
491
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
492
+ "cpu": [
493
+ "ia32"
494
+ ],
495
+ "dev": true,
496
+ "license": "MIT",
497
+ "optional": true,
498
+ "os": [
499
+ "linux"
500
+ ],
501
+ "engines": {
502
+ "node": ">=12"
503
+ }
504
+ },
505
+ "node_modules/@esbuild/linux-loong64": {
506
+ "version": "0.21.5",
507
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
508
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
509
+ "cpu": [
510
+ "loong64"
511
+ ],
512
+ "dev": true,
513
+ "license": "MIT",
514
+ "optional": true,
515
+ "os": [
516
+ "linux"
517
+ ],
518
+ "engines": {
519
+ "node": ">=12"
520
+ }
521
+ },
522
+ "node_modules/@esbuild/linux-mips64el": {
523
+ "version": "0.21.5",
524
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
525
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
526
+ "cpu": [
527
+ "mips64el"
528
+ ],
529
+ "dev": true,
530
+ "license": "MIT",
531
+ "optional": true,
532
+ "os": [
533
+ "linux"
534
+ ],
535
+ "engines": {
536
+ "node": ">=12"
537
+ }
538
+ },
539
+ "node_modules/@esbuild/linux-ppc64": {
540
+ "version": "0.21.5",
541
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
542
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
543
+ "cpu": [
544
+ "ppc64"
545
+ ],
546
+ "dev": true,
547
+ "license": "MIT",
548
+ "optional": true,
549
+ "os": [
550
+ "linux"
551
+ ],
552
+ "engines": {
553
+ "node": ">=12"
554
+ }
555
+ },
556
+ "node_modules/@esbuild/linux-riscv64": {
557
+ "version": "0.21.5",
558
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
559
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
560
+ "cpu": [
561
+ "riscv64"
562
+ ],
563
+ "dev": true,
564
+ "license": "MIT",
565
+ "optional": true,
566
+ "os": [
567
+ "linux"
568
+ ],
569
+ "engines": {
570
+ "node": ">=12"
571
+ }
572
+ },
573
+ "node_modules/@esbuild/linux-s390x": {
574
+ "version": "0.21.5",
575
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
576
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
577
+ "cpu": [
578
+ "s390x"
579
+ ],
580
+ "dev": true,
581
+ "license": "MIT",
582
+ "optional": true,
583
+ "os": [
584
+ "linux"
585
+ ],
586
+ "engines": {
587
+ "node": ">=12"
588
+ }
589
+ },
590
+ "node_modules/@esbuild/linux-x64": {
591
+ "version": "0.21.5",
592
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
593
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
594
+ "cpu": [
595
+ "x64"
596
+ ],
597
+ "dev": true,
598
+ "license": "MIT",
599
+ "optional": true,
600
+ "os": [
601
+ "linux"
602
+ ],
603
+ "engines": {
604
+ "node": ">=12"
605
+ }
606
+ },
607
+ "node_modules/@esbuild/netbsd-x64": {
608
+ "version": "0.21.5",
609
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
610
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
611
+ "cpu": [
612
+ "x64"
613
+ ],
614
+ "dev": true,
615
+ "license": "MIT",
616
+ "optional": true,
617
+ "os": [
618
+ "netbsd"
619
+ ],
620
+ "engines": {
621
+ "node": ">=12"
622
+ }
623
+ },
624
+ "node_modules/@esbuild/openbsd-x64": {
625
+ "version": "0.21.5",
626
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
627
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
628
+ "cpu": [
629
+ "x64"
630
+ ],
631
+ "dev": true,
632
+ "license": "MIT",
633
+ "optional": true,
634
+ "os": [
635
+ "openbsd"
636
+ ],
637
+ "engines": {
638
+ "node": ">=12"
639
+ }
640
+ },
641
+ "node_modules/@esbuild/sunos-x64": {
642
+ "version": "0.21.5",
643
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
644
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
645
+ "cpu": [
646
+ "x64"
647
+ ],
648
+ "dev": true,
649
+ "license": "MIT",
650
+ "optional": true,
651
+ "os": [
652
+ "sunos"
653
+ ],
654
+ "engines": {
655
+ "node": ">=12"
656
+ }
657
+ },
658
+ "node_modules/@esbuild/win32-arm64": {
659
+ "version": "0.21.5",
660
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
661
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
662
+ "cpu": [
663
+ "arm64"
664
+ ],
665
+ "dev": true,
666
+ "license": "MIT",
667
+ "optional": true,
668
+ "os": [
669
+ "win32"
670
+ ],
671
+ "engines": {
672
+ "node": ">=12"
673
+ }
674
+ },
675
+ "node_modules/@esbuild/win32-ia32": {
676
+ "version": "0.21.5",
677
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
678
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
679
+ "cpu": [
680
+ "ia32"
681
+ ],
682
+ "dev": true,
683
+ "license": "MIT",
684
+ "optional": true,
685
+ "os": [
686
+ "win32"
687
+ ],
688
+ "engines": {
689
+ "node": ">=12"
690
+ }
691
+ },
692
+ "node_modules/@esbuild/win32-x64": {
693
+ "version": "0.21.5",
694
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
695
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
696
+ "cpu": [
697
+ "x64"
698
+ ],
699
+ "dev": true,
700
+ "license": "MIT",
701
+ "optional": true,
702
+ "os": [
703
+ "win32"
704
+ ],
705
+ "engines": {
706
+ "node": ">=12"
707
+ }
708
+ },
709
+ "node_modules/@jridgewell/gen-mapping": {
710
+ "version": "0.3.13",
711
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
712
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
713
+ "dev": true,
714
+ "license": "MIT",
715
+ "dependencies": {
716
+ "@jridgewell/sourcemap-codec": "^1.5.0",
717
+ "@jridgewell/trace-mapping": "^0.3.24"
718
+ }
719
+ },
720
+ "node_modules/@jridgewell/remapping": {
721
+ "version": "2.3.5",
722
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
723
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
724
+ "dev": true,
725
+ "license": "MIT",
726
+ "dependencies": {
727
+ "@jridgewell/gen-mapping": "^0.3.5",
728
+ "@jridgewell/trace-mapping": "^0.3.24"
729
+ }
730
+ },
731
+ "node_modules/@jridgewell/resolve-uri": {
732
+ "version": "3.1.2",
733
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
734
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
735
+ "dev": true,
736
+ "license": "MIT",
737
+ "engines": {
738
+ "node": ">=6.0.0"
739
+ }
740
+ },
741
+ "node_modules/@jridgewell/sourcemap-codec": {
742
+ "version": "1.5.5",
743
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
744
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
745
+ "dev": true,
746
+ "license": "MIT"
747
+ },
748
+ "node_modules/@jridgewell/trace-mapping": {
749
+ "version": "0.3.31",
750
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
751
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
752
+ "dev": true,
753
+ "license": "MIT",
754
+ "dependencies": {
755
+ "@jridgewell/resolve-uri": "^3.1.0",
756
+ "@jridgewell/sourcemap-codec": "^1.4.14"
757
+ }
758
+ },
759
+ "node_modules/@rolldown/pluginutils": {
760
+ "version": "1.0.0-beta.27",
761
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
762
+ "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
763
+ "dev": true,
764
+ "license": "MIT"
765
+ },
766
+ "node_modules/@rollup/rollup-android-arm-eabi": {
767
+ "version": "4.57.0",
768
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.0.tgz",
769
+ "integrity": "sha512-tPgXB6cDTndIe1ah7u6amCI1T0SsnlOuKgg10Xh3uizJk4e5M1JGaUMk7J4ciuAUcFpbOiNhm2XIjP9ON0dUqA==",
770
+ "cpu": [
771
+ "arm"
772
+ ],
773
+ "dev": true,
774
+ "license": "MIT",
775
+ "optional": true,
776
+ "os": [
777
+ "android"
778
+ ]
779
+ },
780
+ "node_modules/@rollup/rollup-android-arm64": {
781
+ "version": "4.57.0",
782
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.0.tgz",
783
+ "integrity": "sha512-sa4LyseLLXr1onr97StkU1Nb7fWcg6niokTwEVNOO7awaKaoRObQ54+V/hrF/BP1noMEaaAW6Fg2d/CfLiq3Mg==",
784
+ "cpu": [
785
+ "arm64"
786
+ ],
787
+ "dev": true,
788
+ "license": "MIT",
789
+ "optional": true,
790
+ "os": [
791
+ "android"
792
+ ]
793
+ },
794
+ "node_modules/@rollup/rollup-darwin-arm64": {
795
+ "version": "4.57.0",
796
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.0.tgz",
797
+ "integrity": "sha512-/NNIj9A7yLjKdmkx5dC2XQ9DmjIECpGpwHoGmA5E1AhU0fuICSqSWScPhN1yLCkEdkCwJIDu2xIeLPs60MNIVg==",
798
+ "cpu": [
799
+ "arm64"
800
+ ],
801
+ "dev": true,
802
+ "license": "MIT",
803
+ "optional": true,
804
+ "os": [
805
+ "darwin"
806
+ ]
807
+ },
808
+ "node_modules/@rollup/rollup-darwin-x64": {
809
+ "version": "4.57.0",
810
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.0.tgz",
811
+ "integrity": "sha512-xoh8abqgPrPYPr7pTYipqnUi1V3em56JzE/HgDgitTqZBZ3yKCWI+7KUkceM6tNweyUKYru1UMi7FC060RyKwA==",
812
+ "cpu": [
813
+ "x64"
814
+ ],
815
+ "dev": true,
816
+ "license": "MIT",
817
+ "optional": true,
818
+ "os": [
819
+ "darwin"
820
+ ]
821
+ },
822
+ "node_modules/@rollup/rollup-freebsd-arm64": {
823
+ "version": "4.57.0",
824
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.0.tgz",
825
+ "integrity": "sha512-PCkMh7fNahWSbA0OTUQ2OpYHpjZZr0hPr8lId8twD7a7SeWrvT3xJVyza+dQwXSSq4yEQTMoXgNOfMCsn8584g==",
826
+ "cpu": [
827
+ "arm64"
828
+ ],
829
+ "dev": true,
830
+ "license": "MIT",
831
+ "optional": true,
832
+ "os": [
833
+ "freebsd"
834
+ ]
835
+ },
836
+ "node_modules/@rollup/rollup-freebsd-x64": {
837
+ "version": "4.57.0",
838
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.0.tgz",
839
+ "integrity": "sha512-1j3stGx+qbhXql4OCDZhnK7b01s6rBKNybfsX+TNrEe9JNq4DLi1yGiR1xW+nL+FNVvI4D02PUnl6gJ/2y6WJA==",
840
+ "cpu": [
841
+ "x64"
842
+ ],
843
+ "dev": true,
844
+ "license": "MIT",
845
+ "optional": true,
846
+ "os": [
847
+ "freebsd"
848
+ ]
849
+ },
850
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
851
+ "version": "4.57.0",
852
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.0.tgz",
853
+ "integrity": "sha512-eyrr5W08Ms9uM0mLcKfM/Uzx7hjhz2bcjv8P2uynfj0yU8GGPdz8iYrBPhiLOZqahoAMB8ZiolRZPbbU2MAi6Q==",
854
+ "cpu": [
855
+ "arm"
856
+ ],
857
+ "dev": true,
858
+ "license": "MIT",
859
+ "optional": true,
860
+ "os": [
861
+ "linux"
862
+ ]
863
+ },
864
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
865
+ "version": "4.57.0",
866
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.0.tgz",
867
+ "integrity": "sha512-Xds90ITXJCNyX9pDhqf85MKWUI4lqjiPAipJ8OLp8xqI2Ehk+TCVhF9rvOoN8xTbcafow3QOThkNnrM33uCFQA==",
868
+ "cpu": [
869
+ "arm"
870
+ ],
871
+ "dev": true,
872
+ "license": "MIT",
873
+ "optional": true,
874
+ "os": [
875
+ "linux"
876
+ ]
877
+ },
878
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
879
+ "version": "4.57.0",
880
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.0.tgz",
881
+ "integrity": "sha512-Xws2KA4CLvZmXjy46SQaXSejuKPhwVdaNinldoYfqruZBaJHqVo6hnRa8SDo9z7PBW5x84SH64+izmldCgbezw==",
882
+ "cpu": [
883
+ "arm64"
884
+ ],
885
+ "dev": true,
886
+ "license": "MIT",
887
+ "optional": true,
888
+ "os": [
889
+ "linux"
890
+ ]
891
+ },
892
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
893
+ "version": "4.57.0",
894
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.0.tgz",
895
+ "integrity": "sha512-hrKXKbX5FdaRJj7lTMusmvKbhMJSGWJ+w++4KmjiDhpTgNlhYobMvKfDoIWecy4O60K6yA4SnztGuNTQF+Lplw==",
896
+ "cpu": [
897
+ "arm64"
898
+ ],
899
+ "dev": true,
900
+ "license": "MIT",
901
+ "optional": true,
902
+ "os": [
903
+ "linux"
904
+ ]
905
+ },
906
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
907
+ "version": "4.57.0",
908
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.0.tgz",
909
+ "integrity": "sha512-6A+nccfSDGKsPm00d3xKcrsBcbqzCTAukjwWK6rbuAnB2bHaL3r9720HBVZ/no7+FhZLz/U3GwwZZEh6tOSI8Q==",
910
+ "cpu": [
911
+ "loong64"
912
+ ],
913
+ "dev": true,
914
+ "license": "MIT",
915
+ "optional": true,
916
+ "os": [
917
+ "linux"
918
+ ]
919
+ },
920
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
921
+ "version": "4.57.0",
922
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.0.tgz",
923
+ "integrity": "sha512-4P1VyYUe6XAJtQH1Hh99THxr0GKMMwIXsRNOceLrJnaHTDgk1FTcTimDgneRJPvB3LqDQxUmroBclQ1S0cIJwQ==",
924
+ "cpu": [
925
+ "loong64"
926
+ ],
927
+ "dev": true,
928
+ "license": "MIT",
929
+ "optional": true,
930
+ "os": [
931
+ "linux"
932
+ ]
933
+ },
934
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
935
+ "version": "4.57.0",
936
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.0.tgz",
937
+ "integrity": "sha512-8Vv6pLuIZCMcgXre6c3nOPhE0gjz1+nZP6T+hwWjr7sVH8k0jRkH+XnfjjOTglyMBdSKBPPz54/y1gToSKwrSQ==",
938
+ "cpu": [
939
+ "ppc64"
940
+ ],
941
+ "dev": true,
942
+ "license": "MIT",
943
+ "optional": true,
944
+ "os": [
945
+ "linux"
946
+ ]
947
+ },
948
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
949
+ "version": "4.57.0",
950
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.0.tgz",
951
+ "integrity": "sha512-r1te1M0Sm2TBVD/RxBPC6RZVwNqUTwJTA7w+C/IW5v9Ssu6xmxWEi+iJQlpBhtUiT1raJ5b48pI8tBvEjEFnFA==",
952
+ "cpu": [
953
+ "ppc64"
954
+ ],
955
+ "dev": true,
956
+ "license": "MIT",
957
+ "optional": true,
958
+ "os": [
959
+ "linux"
960
+ ]
961
+ },
962
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
963
+ "version": "4.57.0",
964
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.0.tgz",
965
+ "integrity": "sha512-say0uMU/RaPm3CDQLxUUTF2oNWL8ysvHkAjcCzV2znxBr23kFfaxocS9qJm+NdkRhF8wtdEEAJuYcLPhSPbjuQ==",
966
+ "cpu": [
967
+ "riscv64"
968
+ ],
969
+ "dev": true,
970
+ "license": "MIT",
971
+ "optional": true,
972
+ "os": [
973
+ "linux"
974
+ ]
975
+ },
976
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
977
+ "version": "4.57.0",
978
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.0.tgz",
979
+ "integrity": "sha512-/MU7/HizQGsnBREtRpcSbSV1zfkoxSTR7wLsRmBPQ8FwUj5sykrP1MyJTvsxP5KBq9SyE6kH8UQQQwa0ASeoQQ==",
980
+ "cpu": [
981
+ "riscv64"
982
+ ],
983
+ "dev": true,
984
+ "license": "MIT",
985
+ "optional": true,
986
+ "os": [
987
+ "linux"
988
+ ]
989
+ },
990
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
991
+ "version": "4.57.0",
992
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.0.tgz",
993
+ "integrity": "sha512-Q9eh+gUGILIHEaJf66aF6a414jQbDnn29zeu0eX3dHMuysnhTvsUvZTCAyZ6tJhUjnvzBKE4FtuaYxutxRZpOg==",
994
+ "cpu": [
995
+ "s390x"
996
+ ],
997
+ "dev": true,
998
+ "license": "MIT",
999
+ "optional": true,
1000
+ "os": [
1001
+ "linux"
1002
+ ]
1003
+ },
1004
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
1005
+ "version": "4.57.0",
1006
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.0.tgz",
1007
+ "integrity": "sha512-OR5p5yG5OKSxHReWmwvM0P+VTPMwoBS45PXTMYaskKQqybkS3Kmugq1W+YbNWArF8/s7jQScgzXUhArzEQ7x0A==",
1008
+ "cpu": [
1009
+ "x64"
1010
+ ],
1011
+ "dev": true,
1012
+ "license": "MIT",
1013
+ "optional": true,
1014
+ "os": [
1015
+ "linux"
1016
+ ]
1017
+ },
1018
+ "node_modules/@rollup/rollup-linux-x64-musl": {
1019
+ "version": "4.57.0",
1020
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.0.tgz",
1021
+ "integrity": "sha512-XeatKzo4lHDsVEbm1XDHZlhYZZSQYym6dg2X/Ko0kSFgio+KXLsxwJQprnR48GvdIKDOpqWqssC3iBCjoMcMpw==",
1022
+ "cpu": [
1023
+ "x64"
1024
+ ],
1025
+ "dev": true,
1026
+ "license": "MIT",
1027
+ "optional": true,
1028
+ "os": [
1029
+ "linux"
1030
+ ]
1031
+ },
1032
+ "node_modules/@rollup/rollup-openbsd-x64": {
1033
+ "version": "4.57.0",
1034
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.0.tgz",
1035
+ "integrity": "sha512-Lu71y78F5qOfYmubYLHPcJm74GZLU6UJ4THkf/a1K7Tz2ycwC2VUbsqbJAXaR6Bx70SRdlVrt2+n5l7F0agTUw==",
1036
+ "cpu": [
1037
+ "x64"
1038
+ ],
1039
+ "dev": true,
1040
+ "license": "MIT",
1041
+ "optional": true,
1042
+ "os": [
1043
+ "openbsd"
1044
+ ]
1045
+ },
1046
+ "node_modules/@rollup/rollup-openharmony-arm64": {
1047
+ "version": "4.57.0",
1048
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.0.tgz",
1049
+ "integrity": "sha512-v5xwKDWcu7qhAEcsUubiav7r+48Uk/ENWdr82MBZZRIm7zThSxCIVDfb3ZeRRq9yqk+oIzMdDo6fCcA5DHfMyA==",
1050
+ "cpu": [
1051
+ "arm64"
1052
+ ],
1053
+ "dev": true,
1054
+ "license": "MIT",
1055
+ "optional": true,
1056
+ "os": [
1057
+ "openharmony"
1058
+ ]
1059
+ },
1060
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
1061
+ "version": "4.57.0",
1062
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.0.tgz",
1063
+ "integrity": "sha512-XnaaaSMGSI6Wk8F4KK3QP7GfuuhjGchElsVerCplUuxRIzdvZ7hRBpLR0omCmw+kI2RFJB80nenhOoGXlJ5TfQ==",
1064
+ "cpu": [
1065
+ "arm64"
1066
+ ],
1067
+ "dev": true,
1068
+ "license": "MIT",
1069
+ "optional": true,
1070
+ "os": [
1071
+ "win32"
1072
+ ]
1073
+ },
1074
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
1075
+ "version": "4.57.0",
1076
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.0.tgz",
1077
+ "integrity": "sha512-3K1lP+3BXY4t4VihLw5MEg6IZD3ojSYzqzBG571W3kNQe4G4CcFpSUQVgurYgib5d+YaCjeFow8QivWp8vuSvA==",
1078
+ "cpu": [
1079
+ "ia32"
1080
+ ],
1081
+ "dev": true,
1082
+ "license": "MIT",
1083
+ "optional": true,
1084
+ "os": [
1085
+ "win32"
1086
+ ]
1087
+ },
1088
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
1089
+ "version": "4.57.0",
1090
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.0.tgz",
1091
+ "integrity": "sha512-MDk610P/vJGc5L5ImE4k5s+GZT3en0KoK1MKPXCRgzmksAMk79j4h3k1IerxTNqwDLxsGxStEZVBqG0gIqZqoA==",
1092
+ "cpu": [
1093
+ "x64"
1094
+ ],
1095
+ "dev": true,
1096
+ "license": "MIT",
1097
+ "optional": true,
1098
+ "os": [
1099
+ "win32"
1100
+ ]
1101
+ },
1102
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
1103
+ "version": "4.57.0",
1104
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.0.tgz",
1105
+ "integrity": "sha512-Zv7v6q6aV+VslnpwzqKAmrk5JdVkLUzok2208ZXGipjb+msxBr/fJPZyeEXiFgH7k62Ak0SLIfxQRZQvTuf7rQ==",
1106
+ "cpu": [
1107
+ "x64"
1108
+ ],
1109
+ "dev": true,
1110
+ "license": "MIT",
1111
+ "optional": true,
1112
+ "os": [
1113
+ "win32"
1114
+ ]
1115
+ },
1116
+ "node_modules/@types/babel__core": {
1117
+ "version": "7.20.5",
1118
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
1119
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
1120
+ "dev": true,
1121
+ "license": "MIT",
1122
+ "dependencies": {
1123
+ "@babel/parser": "^7.20.7",
1124
+ "@babel/types": "^7.20.7",
1125
+ "@types/babel__generator": "*",
1126
+ "@types/babel__template": "*",
1127
+ "@types/babel__traverse": "*"
1128
+ }
1129
+ },
1130
+ "node_modules/@types/babel__generator": {
1131
+ "version": "7.27.0",
1132
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
1133
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
1134
+ "dev": true,
1135
+ "license": "MIT",
1136
+ "dependencies": {
1137
+ "@babel/types": "^7.0.0"
1138
+ }
1139
+ },
1140
+ "node_modules/@types/babel__template": {
1141
+ "version": "7.4.4",
1142
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
1143
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
1144
+ "dev": true,
1145
+ "license": "MIT",
1146
+ "dependencies": {
1147
+ "@babel/parser": "^7.1.0",
1148
+ "@babel/types": "^7.0.0"
1149
+ }
1150
+ },
1151
+ "node_modules/@types/babel__traverse": {
1152
+ "version": "7.28.0",
1153
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
1154
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
1155
+ "dev": true,
1156
+ "license": "MIT",
1157
+ "dependencies": {
1158
+ "@babel/types": "^7.28.2"
1159
+ }
1160
+ },
1161
+ "node_modules/@types/estree": {
1162
+ "version": "1.0.8",
1163
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
1164
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
1165
+ "dev": true,
1166
+ "license": "MIT"
1167
+ },
1168
+ "node_modules/@types/prop-types": {
1169
+ "version": "15.7.15",
1170
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
1171
+ "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
1172
+ "dev": true,
1173
+ "license": "MIT"
1174
+ },
1175
+ "node_modules/@types/react": {
1176
+ "version": "18.3.27",
1177
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz",
1178
+ "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==",
1179
+ "dev": true,
1180
+ "license": "MIT",
1181
+ "dependencies": {
1182
+ "@types/prop-types": "*",
1183
+ "csstype": "^3.2.2"
1184
+ }
1185
+ },
1186
+ "node_modules/@types/react-dom": {
1187
+ "version": "18.3.7",
1188
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
1189
+ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
1190
+ "dev": true,
1191
+ "license": "MIT",
1192
+ "peerDependencies": {
1193
+ "@types/react": "^18.0.0"
1194
+ }
1195
+ },
1196
+ "node_modules/@vitejs/plugin-react": {
1197
+ "version": "4.7.0",
1198
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
1199
+ "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==",
1200
+ "dev": true,
1201
+ "license": "MIT",
1202
+ "dependencies": {
1203
+ "@babel/core": "^7.28.0",
1204
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
1205
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
1206
+ "@rolldown/pluginutils": "1.0.0-beta.27",
1207
+ "@types/babel__core": "^7.20.5",
1208
+ "react-refresh": "^0.17.0"
1209
+ },
1210
+ "engines": {
1211
+ "node": "^14.18.0 || >=16.0.0"
1212
+ },
1213
+ "peerDependencies": {
1214
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
1215
+ }
1216
+ },
1217
+ "node_modules/baseline-browser-mapping": {
1218
+ "version": "2.9.18",
1219
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.18.tgz",
1220
+ "integrity": "sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA==",
1221
+ "dev": true,
1222
+ "license": "Apache-2.0",
1223
+ "bin": {
1224
+ "baseline-browser-mapping": "dist/cli.js"
1225
+ }
1226
+ },
1227
+ "node_modules/browserslist": {
1228
+ "version": "4.28.1",
1229
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
1230
+ "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
1231
+ "dev": true,
1232
+ "funding": [
1233
+ {
1234
+ "type": "opencollective",
1235
+ "url": "https://opencollective.com/browserslist"
1236
+ },
1237
+ {
1238
+ "type": "tidelift",
1239
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
1240
+ },
1241
+ {
1242
+ "type": "github",
1243
+ "url": "https://github.com/sponsors/ai"
1244
+ }
1245
+ ],
1246
+ "license": "MIT",
1247
+ "dependencies": {
1248
+ "baseline-browser-mapping": "^2.9.0",
1249
+ "caniuse-lite": "^1.0.30001759",
1250
+ "electron-to-chromium": "^1.5.263",
1251
+ "node-releases": "^2.0.27",
1252
+ "update-browserslist-db": "^1.2.0"
1253
+ },
1254
+ "bin": {
1255
+ "browserslist": "cli.js"
1256
+ },
1257
+ "engines": {
1258
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1259
+ }
1260
+ },
1261
+ "node_modules/caniuse-lite": {
1262
+ "version": "1.0.30001766",
1263
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz",
1264
+ "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==",
1265
+ "dev": true,
1266
+ "funding": [
1267
+ {
1268
+ "type": "opencollective",
1269
+ "url": "https://opencollective.com/browserslist"
1270
+ },
1271
+ {
1272
+ "type": "tidelift",
1273
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1274
+ },
1275
+ {
1276
+ "type": "github",
1277
+ "url": "https://github.com/sponsors/ai"
1278
+ }
1279
+ ],
1280
+ "license": "CC-BY-4.0"
1281
+ },
1282
+ "node_modules/convert-source-map": {
1283
+ "version": "2.0.0",
1284
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
1285
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
1286
+ "dev": true,
1287
+ "license": "MIT"
1288
+ },
1289
+ "node_modules/csstype": {
1290
+ "version": "3.2.3",
1291
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
1292
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
1293
+ "dev": true,
1294
+ "license": "MIT"
1295
+ },
1296
+ "node_modules/debug": {
1297
+ "version": "4.4.3",
1298
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1299
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
1300
+ "dev": true,
1301
+ "license": "MIT",
1302
+ "dependencies": {
1303
+ "ms": "^2.1.3"
1304
+ },
1305
+ "engines": {
1306
+ "node": ">=6.0"
1307
+ },
1308
+ "peerDependenciesMeta": {
1309
+ "supports-color": {
1310
+ "optional": true
1311
+ }
1312
+ }
1313
+ },
1314
+ "node_modules/electron-to-chromium": {
1315
+ "version": "1.5.279",
1316
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.279.tgz",
1317
+ "integrity": "sha512-0bblUU5UNdOt5G7XqGiJtpZMONma6WAfq9vsFmtn9x1+joAObr6x1chfqyxFSDCAFwFhCQDrqeAr6MYdpwJ9Hg==",
1318
+ "dev": true,
1319
+ "license": "ISC"
1320
+ },
1321
+ "node_modules/esbuild": {
1322
+ "version": "0.21.5",
1323
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
1324
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
1325
+ "dev": true,
1326
+ "hasInstallScript": true,
1327
+ "license": "MIT",
1328
+ "bin": {
1329
+ "esbuild": "bin/esbuild"
1330
+ },
1331
+ "engines": {
1332
+ "node": ">=12"
1333
+ },
1334
+ "optionalDependencies": {
1335
+ "@esbuild/aix-ppc64": "0.21.5",
1336
+ "@esbuild/android-arm": "0.21.5",
1337
+ "@esbuild/android-arm64": "0.21.5",
1338
+ "@esbuild/android-x64": "0.21.5",
1339
+ "@esbuild/darwin-arm64": "0.21.5",
1340
+ "@esbuild/darwin-x64": "0.21.5",
1341
+ "@esbuild/freebsd-arm64": "0.21.5",
1342
+ "@esbuild/freebsd-x64": "0.21.5",
1343
+ "@esbuild/linux-arm": "0.21.5",
1344
+ "@esbuild/linux-arm64": "0.21.5",
1345
+ "@esbuild/linux-ia32": "0.21.5",
1346
+ "@esbuild/linux-loong64": "0.21.5",
1347
+ "@esbuild/linux-mips64el": "0.21.5",
1348
+ "@esbuild/linux-ppc64": "0.21.5",
1349
+ "@esbuild/linux-riscv64": "0.21.5",
1350
+ "@esbuild/linux-s390x": "0.21.5",
1351
+ "@esbuild/linux-x64": "0.21.5",
1352
+ "@esbuild/netbsd-x64": "0.21.5",
1353
+ "@esbuild/openbsd-x64": "0.21.5",
1354
+ "@esbuild/sunos-x64": "0.21.5",
1355
+ "@esbuild/win32-arm64": "0.21.5",
1356
+ "@esbuild/win32-ia32": "0.21.5",
1357
+ "@esbuild/win32-x64": "0.21.5"
1358
+ }
1359
+ },
1360
+ "node_modules/escalade": {
1361
+ "version": "3.2.0",
1362
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1363
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1364
+ "dev": true,
1365
+ "license": "MIT",
1366
+ "engines": {
1367
+ "node": ">=6"
1368
+ }
1369
+ },
1370
+ "node_modules/framer-motion": {
1371
+ "version": "12.29.2",
1372
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.29.2.tgz",
1373
+ "integrity": "sha512-lSNRzBJk4wuIy0emYQ/nfZ7eWhqud2umPKw2QAQki6uKhZPKm2hRQHeQoHTG9MIvfobb+A/LbEWPJU794ZUKrg==",
1374
+ "license": "MIT",
1375
+ "dependencies": {
1376
+ "motion-dom": "^12.29.2",
1377
+ "motion-utils": "^12.29.2",
1378
+ "tslib": "^2.4.0"
1379
+ },
1380
+ "peerDependencies": {
1381
+ "@emotion/is-prop-valid": "*",
1382
+ "react": "^18.0.0 || ^19.0.0",
1383
+ "react-dom": "^18.0.0 || ^19.0.0"
1384
+ },
1385
+ "peerDependenciesMeta": {
1386
+ "@emotion/is-prop-valid": {
1387
+ "optional": true
1388
+ },
1389
+ "react": {
1390
+ "optional": true
1391
+ },
1392
+ "react-dom": {
1393
+ "optional": true
1394
+ }
1395
+ }
1396
+ },
1397
+ "node_modules/fsevents": {
1398
+ "version": "2.3.3",
1399
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1400
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1401
+ "dev": true,
1402
+ "hasInstallScript": true,
1403
+ "license": "MIT",
1404
+ "optional": true,
1405
+ "os": [
1406
+ "darwin"
1407
+ ],
1408
+ "engines": {
1409
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1410
+ }
1411
+ },
1412
+ "node_modules/gensync": {
1413
+ "version": "1.0.0-beta.2",
1414
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
1415
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
1416
+ "dev": true,
1417
+ "license": "MIT",
1418
+ "engines": {
1419
+ "node": ">=6.9.0"
1420
+ }
1421
+ },
1422
+ "node_modules/gsap": {
1423
+ "version": "3.14.2",
1424
+ "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.14.2.tgz",
1425
+ "integrity": "sha512-P8/mMxVLU7o4+55+1TCnQrPmgjPKnwkzkXOK1asnR9Jg2lna4tEY5qBJjMmAaOBDDZWtlRjBXjLa0w53G/uBLA==",
1426
+ "license": "Standard 'no charge' license: https://gsap.com/standard-license."
1427
+ },
1428
+ "node_modules/html-parse-stringify": {
1429
+ "version": "3.0.1",
1430
+ "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
1431
+ "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
1432
+ "license": "MIT",
1433
+ "dependencies": {
1434
+ "void-elements": "3.1.0"
1435
+ }
1436
+ },
1437
+ "node_modules/i18next": {
1438
+ "version": "25.8.0",
1439
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.8.0.tgz",
1440
+ "integrity": "sha512-urrg4HMFFMQZ2bbKRK7IZ8/CTE7D8H4JRlAwqA2ZwDRFfdd0K/4cdbNNLgfn9mo+I/h9wJu61qJzH7jCFAhUZQ==",
1441
+ "funding": [
1442
+ {
1443
+ "type": "individual",
1444
+ "url": "https://locize.com"
1445
+ },
1446
+ {
1447
+ "type": "individual",
1448
+ "url": "https://locize.com/i18next.html"
1449
+ },
1450
+ {
1451
+ "type": "individual",
1452
+ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
1453
+ }
1454
+ ],
1455
+ "license": "MIT",
1456
+ "dependencies": {
1457
+ "@babel/runtime": "^7.28.4"
1458
+ },
1459
+ "peerDependencies": {
1460
+ "typescript": "^5"
1461
+ },
1462
+ "peerDependenciesMeta": {
1463
+ "typescript": {
1464
+ "optional": true
1465
+ }
1466
+ }
1467
+ },
1468
+ "node_modules/i18next-browser-languagedetector": {
1469
+ "version": "8.2.0",
1470
+ "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.0.tgz",
1471
+ "integrity": "sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g==",
1472
+ "license": "MIT",
1473
+ "dependencies": {
1474
+ "@babel/runtime": "^7.23.2"
1475
+ }
1476
+ },
1477
+ "node_modules/js-tokens": {
1478
+ "version": "4.0.0",
1479
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1480
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1481
+ "license": "MIT"
1482
+ },
1483
+ "node_modules/jsesc": {
1484
+ "version": "3.1.0",
1485
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
1486
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
1487
+ "dev": true,
1488
+ "license": "MIT",
1489
+ "bin": {
1490
+ "jsesc": "bin/jsesc"
1491
+ },
1492
+ "engines": {
1493
+ "node": ">=6"
1494
+ }
1495
+ },
1496
+ "node_modules/json5": {
1497
+ "version": "2.2.3",
1498
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
1499
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
1500
+ "dev": true,
1501
+ "license": "MIT",
1502
+ "bin": {
1503
+ "json5": "lib/cli.js"
1504
+ },
1505
+ "engines": {
1506
+ "node": ">=6"
1507
+ }
1508
+ },
1509
+ "node_modules/loose-envify": {
1510
+ "version": "1.4.0",
1511
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1512
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1513
+ "license": "MIT",
1514
+ "dependencies": {
1515
+ "js-tokens": "^3.0.0 || ^4.0.0"
1516
+ },
1517
+ "bin": {
1518
+ "loose-envify": "cli.js"
1519
+ }
1520
+ },
1521
+ "node_modules/lru-cache": {
1522
+ "version": "5.1.1",
1523
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
1524
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
1525
+ "dev": true,
1526
+ "license": "ISC",
1527
+ "dependencies": {
1528
+ "yallist": "^3.0.2"
1529
+ }
1530
+ },
1531
+ "node_modules/motion-dom": {
1532
+ "version": "12.29.2",
1533
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.29.2.tgz",
1534
+ "integrity": "sha512-/k+NuycVV8pykxyiTCoFzIVLA95Nb1BFIVvfSu9L50/6K6qNeAYtkxXILy/LRutt7AzaYDc2myj0wkCVVYAPPA==",
1535
+ "license": "MIT",
1536
+ "dependencies": {
1537
+ "motion-utils": "^12.29.2"
1538
+ }
1539
+ },
1540
+ "node_modules/motion-utils": {
1541
+ "version": "12.29.2",
1542
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.29.2.tgz",
1543
+ "integrity": "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==",
1544
+ "license": "MIT"
1545
+ },
1546
+ "node_modules/ms": {
1547
+ "version": "2.1.3",
1548
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1549
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1550
+ "dev": true,
1551
+ "license": "MIT"
1552
+ },
1553
+ "node_modules/nanoid": {
1554
+ "version": "3.3.11",
1555
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
1556
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
1557
+ "dev": true,
1558
+ "funding": [
1559
+ {
1560
+ "type": "github",
1561
+ "url": "https://github.com/sponsors/ai"
1562
+ }
1563
+ ],
1564
+ "license": "MIT",
1565
+ "bin": {
1566
+ "nanoid": "bin/nanoid.cjs"
1567
+ },
1568
+ "engines": {
1569
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1570
+ }
1571
+ },
1572
+ "node_modules/node-releases": {
1573
+ "version": "2.0.27",
1574
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
1575
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
1576
+ "dev": true,
1577
+ "license": "MIT"
1578
+ },
1579
+ "node_modules/picocolors": {
1580
+ "version": "1.1.1",
1581
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1582
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1583
+ "dev": true,
1584
+ "license": "ISC"
1585
+ },
1586
+ "node_modules/postcss": {
1587
+ "version": "8.5.6",
1588
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
1589
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
1590
+ "dev": true,
1591
+ "funding": [
1592
+ {
1593
+ "type": "opencollective",
1594
+ "url": "https://opencollective.com/postcss/"
1595
+ },
1596
+ {
1597
+ "type": "tidelift",
1598
+ "url": "https://tidelift.com/funding/github/npm/postcss"
1599
+ },
1600
+ {
1601
+ "type": "github",
1602
+ "url": "https://github.com/sponsors/ai"
1603
+ }
1604
+ ],
1605
+ "license": "MIT",
1606
+ "dependencies": {
1607
+ "nanoid": "^3.3.11",
1608
+ "picocolors": "^1.1.1",
1609
+ "source-map-js": "^1.2.1"
1610
+ },
1611
+ "engines": {
1612
+ "node": "^10 || ^12 || >=14"
1613
+ }
1614
+ },
1615
+ "node_modules/react": {
1616
+ "version": "18.3.1",
1617
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
1618
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
1619
+ "license": "MIT",
1620
+ "dependencies": {
1621
+ "loose-envify": "^1.1.0"
1622
+ },
1623
+ "engines": {
1624
+ "node": ">=0.10.0"
1625
+ }
1626
+ },
1627
+ "node_modules/react-dom": {
1628
+ "version": "18.3.1",
1629
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
1630
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
1631
+ "license": "MIT",
1632
+ "dependencies": {
1633
+ "loose-envify": "^1.1.0",
1634
+ "scheduler": "^0.23.2"
1635
+ },
1636
+ "peerDependencies": {
1637
+ "react": "^18.3.1"
1638
+ }
1639
+ },
1640
+ "node_modules/react-i18next": {
1641
+ "version": "16.5.4",
1642
+ "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-16.5.4.tgz",
1643
+ "integrity": "sha512-6yj+dcfMncEC21QPhOTsW8mOSO+pzFmT6uvU7XXdvM/Cp38zJkmTeMeKmTrmCMD5ToT79FmiE/mRWiYWcJYW4g==",
1644
+ "license": "MIT",
1645
+ "dependencies": {
1646
+ "@babel/runtime": "^7.28.4",
1647
+ "html-parse-stringify": "^3.0.1",
1648
+ "use-sync-external-store": "^1.6.0"
1649
+ },
1650
+ "peerDependencies": {
1651
+ "i18next": ">= 25.6.2",
1652
+ "react": ">= 16.8.0",
1653
+ "typescript": "^5"
1654
+ },
1655
+ "peerDependenciesMeta": {
1656
+ "react-dom": {
1657
+ "optional": true
1658
+ },
1659
+ "react-native": {
1660
+ "optional": true
1661
+ },
1662
+ "typescript": {
1663
+ "optional": true
1664
+ }
1665
+ }
1666
+ },
1667
+ "node_modules/react-refresh": {
1668
+ "version": "0.17.0",
1669
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
1670
+ "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
1671
+ "dev": true,
1672
+ "license": "MIT",
1673
+ "engines": {
1674
+ "node": ">=0.10.0"
1675
+ }
1676
+ },
1677
+ "node_modules/rollup": {
1678
+ "version": "4.57.0",
1679
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.0.tgz",
1680
+ "integrity": "sha512-e5lPJi/aui4TO1LpAXIRLySmwXSE8k3b9zoGfd42p67wzxog4WHjiZF3M2uheQih4DGyc25QEV4yRBbpueNiUA==",
1681
+ "dev": true,
1682
+ "license": "MIT",
1683
+ "dependencies": {
1684
+ "@types/estree": "1.0.8"
1685
+ },
1686
+ "bin": {
1687
+ "rollup": "dist/bin/rollup"
1688
+ },
1689
+ "engines": {
1690
+ "node": ">=18.0.0",
1691
+ "npm": ">=8.0.0"
1692
+ },
1693
+ "optionalDependencies": {
1694
+ "@rollup/rollup-android-arm-eabi": "4.57.0",
1695
+ "@rollup/rollup-android-arm64": "4.57.0",
1696
+ "@rollup/rollup-darwin-arm64": "4.57.0",
1697
+ "@rollup/rollup-darwin-x64": "4.57.0",
1698
+ "@rollup/rollup-freebsd-arm64": "4.57.0",
1699
+ "@rollup/rollup-freebsd-x64": "4.57.0",
1700
+ "@rollup/rollup-linux-arm-gnueabihf": "4.57.0",
1701
+ "@rollup/rollup-linux-arm-musleabihf": "4.57.0",
1702
+ "@rollup/rollup-linux-arm64-gnu": "4.57.0",
1703
+ "@rollup/rollup-linux-arm64-musl": "4.57.0",
1704
+ "@rollup/rollup-linux-loong64-gnu": "4.57.0",
1705
+ "@rollup/rollup-linux-loong64-musl": "4.57.0",
1706
+ "@rollup/rollup-linux-ppc64-gnu": "4.57.0",
1707
+ "@rollup/rollup-linux-ppc64-musl": "4.57.0",
1708
+ "@rollup/rollup-linux-riscv64-gnu": "4.57.0",
1709
+ "@rollup/rollup-linux-riscv64-musl": "4.57.0",
1710
+ "@rollup/rollup-linux-s390x-gnu": "4.57.0",
1711
+ "@rollup/rollup-linux-x64-gnu": "4.57.0",
1712
+ "@rollup/rollup-linux-x64-musl": "4.57.0",
1713
+ "@rollup/rollup-openbsd-x64": "4.57.0",
1714
+ "@rollup/rollup-openharmony-arm64": "4.57.0",
1715
+ "@rollup/rollup-win32-arm64-msvc": "4.57.0",
1716
+ "@rollup/rollup-win32-ia32-msvc": "4.57.0",
1717
+ "@rollup/rollup-win32-x64-gnu": "4.57.0",
1718
+ "@rollup/rollup-win32-x64-msvc": "4.57.0",
1719
+ "fsevents": "~2.3.2"
1720
+ }
1721
+ },
1722
+ "node_modules/scheduler": {
1723
+ "version": "0.23.2",
1724
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
1725
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
1726
+ "license": "MIT",
1727
+ "dependencies": {
1728
+ "loose-envify": "^1.1.0"
1729
+ }
1730
+ },
1731
+ "node_modules/semver": {
1732
+ "version": "6.3.1",
1733
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
1734
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
1735
+ "dev": true,
1736
+ "license": "ISC",
1737
+ "bin": {
1738
+ "semver": "bin/semver.js"
1739
+ }
1740
+ },
1741
+ "node_modules/source-map-js": {
1742
+ "version": "1.2.1",
1743
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
1744
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
1745
+ "dev": true,
1746
+ "license": "BSD-3-Clause",
1747
+ "engines": {
1748
+ "node": ">=0.10.0"
1749
+ }
1750
+ },
1751
+ "node_modules/tslib": {
1752
+ "version": "2.8.1",
1753
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
1754
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
1755
+ "license": "0BSD"
1756
+ },
1757
+ "node_modules/typescript": {
1758
+ "version": "5.9.3",
1759
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
1760
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
1761
+ "devOptional": true,
1762
+ "license": "Apache-2.0",
1763
+ "bin": {
1764
+ "tsc": "bin/tsc",
1765
+ "tsserver": "bin/tsserver"
1766
+ },
1767
+ "engines": {
1768
+ "node": ">=14.17"
1769
+ }
1770
+ },
1771
+ "node_modules/update-browserslist-db": {
1772
+ "version": "1.2.3",
1773
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
1774
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
1775
+ "dev": true,
1776
+ "funding": [
1777
+ {
1778
+ "type": "opencollective",
1779
+ "url": "https://opencollective.com/browserslist"
1780
+ },
1781
+ {
1782
+ "type": "tidelift",
1783
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
1784
+ },
1785
+ {
1786
+ "type": "github",
1787
+ "url": "https://github.com/sponsors/ai"
1788
+ }
1789
+ ],
1790
+ "license": "MIT",
1791
+ "dependencies": {
1792
+ "escalade": "^3.2.0",
1793
+ "picocolors": "^1.1.1"
1794
+ },
1795
+ "bin": {
1796
+ "update-browserslist-db": "cli.js"
1797
+ },
1798
+ "peerDependencies": {
1799
+ "browserslist": ">= 4.21.0"
1800
+ }
1801
+ },
1802
+ "node_modules/use-sync-external-store": {
1803
+ "version": "1.6.0",
1804
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
1805
+ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
1806
+ "license": "MIT",
1807
+ "peerDependencies": {
1808
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
1809
+ }
1810
+ },
1811
+ "node_modules/vite": {
1812
+ "version": "5.4.21",
1813
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
1814
+ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
1815
+ "dev": true,
1816
+ "license": "MIT",
1817
+ "dependencies": {
1818
+ "esbuild": "^0.21.3",
1819
+ "postcss": "^8.4.43",
1820
+ "rollup": "^4.20.0"
1821
+ },
1822
+ "bin": {
1823
+ "vite": "bin/vite.js"
1824
+ },
1825
+ "engines": {
1826
+ "node": "^18.0.0 || >=20.0.0"
1827
+ },
1828
+ "funding": {
1829
+ "url": "https://github.com/vitejs/vite?sponsor=1"
1830
+ },
1831
+ "optionalDependencies": {
1832
+ "fsevents": "~2.3.3"
1833
+ },
1834
+ "peerDependencies": {
1835
+ "@types/node": "^18.0.0 || >=20.0.0",
1836
+ "less": "*",
1837
+ "lightningcss": "^1.21.0",
1838
+ "sass": "*",
1839
+ "sass-embedded": "*",
1840
+ "stylus": "*",
1841
+ "sugarss": "*",
1842
+ "terser": "^5.4.0"
1843
+ },
1844
+ "peerDependenciesMeta": {
1845
+ "@types/node": {
1846
+ "optional": true
1847
+ },
1848
+ "less": {
1849
+ "optional": true
1850
+ },
1851
+ "lightningcss": {
1852
+ "optional": true
1853
+ },
1854
+ "sass": {
1855
+ "optional": true
1856
+ },
1857
+ "sass-embedded": {
1858
+ "optional": true
1859
+ },
1860
+ "stylus": {
1861
+ "optional": true
1862
+ },
1863
+ "sugarss": {
1864
+ "optional": true
1865
+ },
1866
+ "terser": {
1867
+ "optional": true
1868
+ }
1869
+ }
1870
+ },
1871
+ "node_modules/void-elements": {
1872
+ "version": "3.1.0",
1873
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
1874
+ "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
1875
+ "license": "MIT",
1876
+ "engines": {
1877
+ "node": ">=0.10.0"
1878
+ }
1879
+ },
1880
+ "node_modules/yallist": {
1881
+ "version": "3.1.1",
1882
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
1883
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
1884
+ "dev": true,
1885
+ "license": "ISC"
1886
+ }
1887
+ }
1888
+ }
frontend/package.json ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "co-code-ggw",
3
+ "private": true,
4
+ "version": "1.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "tsc && vite build",
9
+ "preview": "vite preview"
10
+ },
11
+ "dependencies": {
12
+ "framer-motion": "^12.29.2",
13
+ "gsap": "^3.14.2",
14
+ "i18next": "^25.8.0",
15
+ "i18next-browser-languagedetector": "^8.2.0",
16
+ "react": "^18.2.0",
17
+ "react-dom": "^18.2.0",
18
+ "react-i18next": "^16.5.4"
19
+ },
20
+ "devDependencies": {
21
+ "@types/react": "^18.2.0",
22
+ "@types/react-dom": "^18.2.0",
23
+ "@vitejs/plugin-react": "^4.2.0",
24
+ "typescript": "^5.3.0",
25
+ "vite": "^5.0.0"
26
+ }
27
+ }
frontend/src/App.css ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ .app {
2
+ min-height: 100vh;
3
+ background-color: #f5f0e8;
4
+ }
frontend/src/App.tsx ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import Header from './components/Header'
2
+ import Hero from './components/Hero'
3
+ import ServicesSection from './components/ServicesSection'
4
+ import HowWeCanHelp from './components/HowWeCanHelp'
5
+ import BeliefStatement from './components/BeliefStatement'
6
+ import Testimonials from './components/Testimonials'
7
+ import ArtOfNaturalRemedies from './components/ArtOfNaturalRemedies'
8
+ import Footer from './components/Footer'
9
+ import './App.css'
10
+
11
+ function App() {
12
+ return (
13
+ <div className="app">
14
+ <Header />
15
+ <main>
16
+ <Hero />
17
+ <ServicesSection />
18
+ <HowWeCanHelp />
19
+ <BeliefStatement />
20
+ <Testimonials />
21
+ <ArtOfNaturalRemedies />
22
+ </main>
23
+ <Footer />
24
+ </div>
25
+ )
26
+ }
27
+
28
+ export default App
frontend/src/components/ArtOfNaturalRemedies.css ADDED
@@ -0,0 +1,212 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .art-remedies {
2
+ min-height: 100vh;
3
+ padding: 100px 80px;
4
+ background-color: #f5f0e8;
5
+ display: flex;
6
+ align-items: center;
7
+ }
8
+
9
+ .art-remedies-container {
10
+ max-width: 1600px;
11
+ margin: 0 auto;
12
+ width: 100%;
13
+ display: grid;
14
+ grid-template-columns: 1fr 1fr;
15
+ gap: 100px;
16
+ align-items: center;
17
+ }
18
+
19
+ .art-content {
20
+ max-width: 650px;
21
+ }
22
+
23
+ .art-title {
24
+ font-family: 'Cormorant Garamond', serif;
25
+ font-size: 68px;
26
+ font-weight: 500;
27
+ color: #2d2d2d;
28
+ margin-bottom: 35px;
29
+ letter-spacing: -1.2px;
30
+ line-height: 1.1;
31
+ }
32
+
33
+ .title-highlight {
34
+ color: #4a7c59;
35
+ font-weight: 600;
36
+ }
37
+
38
+ .art-subtitle {
39
+ font-family: 'DM Sans', sans-serif;
40
+ font-size: 19px;
41
+ font-weight: 400;
42
+ line-height: 1.7;
43
+ color: #7ba88a;
44
+ margin-bottom: 50px;
45
+ }
46
+
47
+ .accordion-container {
48
+ display: flex;
49
+ flex-direction: column;
50
+ gap: 0;
51
+ }
52
+
53
+ .accordion-item {
54
+ border-bottom: 1px solid #d4d4d4;
55
+ }
56
+
57
+ .accordion-button {
58
+ width: 100%;
59
+ display: flex;
60
+ justify-content: space-between;
61
+ align-items: center;
62
+ padding: 32px 0;
63
+ background: transparent;
64
+ border: none;
65
+ cursor: pointer;
66
+ text-align: left;
67
+ transition: all 0.3s ease;
68
+ }
69
+
70
+ .accordion-question {
71
+ font-family: 'Cormorant Garamond', serif;
72
+ font-size: 32px;
73
+ font-weight: 500;
74
+ color: #2d2d2d;
75
+ letter-spacing: -0.5px;
76
+ line-height: 1.3;
77
+ flex: 1;
78
+ padding-right: 20px;
79
+ }
80
+
81
+ .accordion-icon {
82
+ width: 45px;
83
+ height: 45px;
84
+ border: 1.5px solid #2d2d2d;
85
+ border-radius: 50%;
86
+ display: flex;
87
+ align-items: center;
88
+ justify-content: center;
89
+ transition: all 0.3s ease;
90
+ flex-shrink: 0;
91
+ }
92
+
93
+ .accordion-icon.open {
94
+ transform: rotate(180deg);
95
+ }
96
+
97
+ .accordion-button:hover .accordion-icon {
98
+ border-color: #7ba88a;
99
+ background-color: rgba(123, 168, 138, 0.1);
100
+ }
101
+
102
+ .accordion-content {
103
+ overflow: hidden;
104
+ }
105
+
106
+ .accordion-answer {
107
+ font-family: 'DM Sans', sans-serif;
108
+ font-size: 17px;
109
+ font-weight: 400;
110
+ line-height: 1.7;
111
+ color: #5a5a5a;
112
+ padding-bottom: 30px;
113
+ padding-right: 65px;
114
+ }
115
+
116
+ .art-images {
117
+ position: relative;
118
+ }
119
+
120
+ .images-grid {
121
+ display: grid;
122
+ grid-template-columns: 1fr 1fr;
123
+ grid-template-rows: 1fr 1fr;
124
+ gap: 25px;
125
+ }
126
+
127
+ .art-image-item {
128
+ border-radius: 25px;
129
+ overflow: hidden;
130
+ position: relative;
131
+ }
132
+
133
+ .art-image-item img {
134
+ width: 100%;
135
+ height: 100%;
136
+ object-fit: cover;
137
+ display: block;
138
+ filter: sepia(0.3) hue-rotate(90deg) saturate(0.8);
139
+ }
140
+
141
+ .image-1 {
142
+ border-radius: 80px 25px 25px 25px;
143
+ height: 280px;
144
+ }
145
+
146
+ .image-2 {
147
+ border-radius: 25px 80px 25px 25px;
148
+ height: 280px;
149
+ }
150
+
151
+ .image-3 {
152
+ border-radius: 25px 25px 25px 80px;
153
+ height: 280px;
154
+ }
155
+
156
+ .image-4 {
157
+ border-radius: 25px 25px 80px 25px;
158
+ height: 280px;
159
+ }
160
+
161
+ @media (max-width: 1200px) {
162
+ .art-remedies-container {
163
+ grid-template-columns: 1fr;
164
+ gap: 70px;
165
+ }
166
+
167
+ .art-content {
168
+ max-width: 100%;
169
+ }
170
+
171
+ .art-title {
172
+ font-size: 56px;
173
+ }
174
+
175
+ .accordion-question {
176
+ font-size: 28px;
177
+ }
178
+ }
179
+
180
+ @media (max-width: 768px) {
181
+ .art-remedies {
182
+ padding: 80px 40px;
183
+ }
184
+
185
+ .art-title {
186
+ font-size: 48px;
187
+ }
188
+
189
+ .art-subtitle {
190
+ font-size: 17px;
191
+ }
192
+
193
+ .accordion-question {
194
+ font-size: 24px;
195
+ }
196
+
197
+ .accordion-icon {
198
+ width: 40px;
199
+ height: 40px;
200
+ }
201
+
202
+ .images-grid {
203
+ gap: 20px;
204
+ }
205
+
206
+ .image-1,
207
+ .image-2,
208
+ .image-3,
209
+ .image-4 {
210
+ height: 220px;
211
+ }
212
+ }
frontend/src/components/ArtOfNaturalRemedies.tsx ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useState } from 'react'
2
+ import { motion } from 'framer-motion'
3
+ import { useTranslation } from 'react-i18next'
4
+ import './ArtOfNaturalRemedies.css'
5
+
6
+ function ArtOfNaturalRemedies() {
7
+ const { t } = useTranslation()
8
+ const [openAccordion, setOpenAccordion] = useState<number | null>(null)
9
+
10
+ const accordionItems = [
11
+ {
12
+ question: t('faq.items.isDoctor.question'),
13
+ answer: t('faq.items.isDoctor.answer')
14
+ },
15
+ {
16
+ question: t('faq.items.reports.question'),
17
+ answer: t('faq.items.reports.answer')
18
+ },
19
+ {
20
+ question: t('faq.items.ocr.question'),
21
+ answer: t('faq.items.ocr.answer')
22
+ },
23
+ {
24
+ question: t('faq.items.reminders.question'),
25
+ answer: t('faq.items.reminders.answer')
26
+ },
27
+ {
28
+ question: t('faq.items.security.question'),
29
+ answer: t('faq.items.security.answer')
30
+ },
31
+ {
32
+ question: t('faq.items.export.question'),
33
+ answer: t('faq.items.export.answer')
34
+ }
35
+ ]
36
+
37
+ const toggleAccordion = (index: number) => {
38
+ setOpenAccordion(openAccordion === index ? null : index)
39
+ }
40
+
41
+ return (
42
+ <section className="art-remedies">
43
+ <div className="art-remedies-container">
44
+ <div className="art-content">
45
+ <motion.h2
46
+ className="art-title"
47
+ initial={{ opacity: 0, y: 40 }}
48
+ whileInView={{ opacity: 1, y: 0 }}
49
+ viewport={{ once: true }}
50
+ transition={{ duration: 0.8 }}
51
+ >
52
+ {t('faq.title')} <span className="title-highlight">{t('faq.titleHighlight')}</span>
53
+ </motion.h2>
54
+
55
+ <motion.p
56
+ className="art-subtitle"
57
+ initial={{ opacity: 0, y: 30 }}
58
+ whileInView={{ opacity: 1, y: 0 }}
59
+ viewport={{ once: true }}
60
+ transition={{ delay: 0.2, duration: 0.8 }}
61
+ >
62
+ {t('faq.subtitle')}
63
+ </motion.p>
64
+
65
+ <div className="accordion-container">
66
+ {accordionItems.map((item, index) => (
67
+ <motion.div
68
+ key={index}
69
+ className="accordion-item"
70
+ initial={{ opacity: 0, y: 30 }}
71
+ whileInView={{ opacity: 1, y: 0 }}
72
+ viewport={{ once: true }}
73
+ transition={{ delay: 0.3 + index * 0.1, duration: 0.8 }}
74
+ >
75
+ <button
76
+ className="accordion-button"
77
+ onClick={() => toggleAccordion(index)}
78
+ aria-expanded={openAccordion === index}
79
+ >
80
+ <span className="accordion-question">{item.question}</span>
81
+ <span className={`accordion-icon ${openAccordion === index ? 'open' : ''}`}>
82
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none">
83
+ <path d="M6 9L12 15L18 9" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
84
+ </svg>
85
+ </span>
86
+ </button>
87
+ {openAccordion === index && (
88
+ <motion.div
89
+ className="accordion-content"
90
+ initial={{ opacity: 0, height: 0 }}
91
+ animate={{ opacity: 1, height: 'auto' }}
92
+ exit={{ opacity: 0, height: 0 }}
93
+ transition={{ duration: 0.3 }}
94
+ >
95
+ <p className="accordion-answer">{item.answer}</p>
96
+ </motion.div>
97
+ )}
98
+ </motion.div>
99
+ ))}
100
+ </div>
101
+ </div>
102
+
103
+ <div className="art-images">
104
+ <div className="images-grid">
105
+ <motion.div
106
+ className="art-image-item image-1"
107
+ initial={{ opacity: 0, scale: 0.8 }}
108
+ whileInView={{ opacity: 1, scale: 1 }}
109
+ viewport={{ once: true }}
110
+ transition={{ delay: 0.2, duration: 0.6 }}
111
+ >
112
+ <img src="https://images.unsplash.com/photo-1576091160399-112ba8d25d1d?w=400&h=300&fit=crop" alt="Medical professional analyzing data" />
113
+ </motion.div>
114
+ <motion.div
115
+ className="art-image-item image-2"
116
+ initial={{ opacity: 0, scale: 0.8 }}
117
+ whileInView={{ opacity: 1, scale: 1 }}
118
+ viewport={{ once: true }}
119
+ transition={{ delay: 0.3, duration: 0.6 }}
120
+ >
121
+ <img src="https://images.unsplash.com/photo-1579684385127-1ef15d508118?w=400&h=300&fit=crop" alt="Health checkup consultation" />
122
+ </motion.div>
123
+ <motion.div
124
+ className="art-image-item image-3"
125
+ initial={{ opacity: 0, scale: 0.8 }}
126
+ whileInView={{ opacity: 1, scale: 1 }}
127
+ viewport={{ once: true }}
128
+ transition={{ delay: 0.4, duration: 0.6 }}
129
+ >
130
+ <img src="https://images.unsplash.com/photo-1505751172876-fa1923c5c528?w=400&h=300&fit=crop" alt="Preventive healthcare planning" />
131
+ </motion.div>
132
+ <motion.div
133
+ className="art-image-item image-4"
134
+ initial={{ opacity: 0, scale: 0.8 }}
135
+ whileInView={{ opacity: 1, scale: 1 }}
136
+ viewport={{ once: true }}
137
+ transition={{ delay: 0.5, duration: 0.6 }}
138
+ >
139
+ <img src="https://images.unsplash.com/photo-1505751104628-0448e3c8c7b0?w=400&h=300&fit=crop" alt="Digital health records" />
140
+ </motion.div>
141
+ </div>
142
+ </div>
143
+ </div>
144
+ </section>
145
+ )
146
+ }
147
+
148
+ export default ArtOfNaturalRemedies
frontend/src/components/BeliefStatement.css ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .belief-statement {
2
+ min-height: 50vh;
3
+ padding: 120px 80px;
4
+ background-color: #3d3d3d;
5
+ display: flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ }
9
+
10
+ .belief-container {
11
+ max-width: 1400px;
12
+ margin: 0 auto;
13
+ text-align: center;
14
+ }
15
+
16
+ .leaf-icon {
17
+ margin-bottom: 50px;
18
+ display: inline-block;
19
+ }
20
+
21
+ .belief-text {
22
+ font-family: 'Cormorant Garamond', serif;
23
+ font-size: 52px;
24
+ font-weight: 400;
25
+ line-height: 1.5;
26
+ color: #ffffff;
27
+ letter-spacing: -0.5px;
28
+ max-width: 1300px;
29
+ margin: 0 auto;
30
+ }
31
+
32
+ .belief-subtext {
33
+ font-family: 'DM Sans', sans-serif;
34
+ font-size: 18px;
35
+ font-weight: 400;
36
+ font-style: italic;
37
+ color: #b8c9c0;
38
+ margin-top: 30px;
39
+ }
40
+
41
+ @media (max-width: 1200px) {
42
+ .belief-text {
43
+ font-size: 42px;
44
+ }
45
+ }
46
+
47
+ @media (max-width: 768px) {
48
+ .belief-statement {
49
+ padding: 90px 40px;
50
+ }
51
+
52
+ .belief-text {
53
+ font-size: 34px;
54
+ }
55
+
56
+ .leaf-icon svg {
57
+ width: 50px;
58
+ height: 50px;
59
+ }
60
+ }
frontend/src/components/BeliefStatement.tsx ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { motion } from 'framer-motion'
2
+ import { useTranslation } from 'react-i18next'
3
+ import './BeliefStatement.css'
4
+
5
+ function BeliefStatement() {
6
+ const { t } = useTranslation()
7
+
8
+ return (
9
+ <section className="belief-statement">
10
+ <div className="belief-container">
11
+ <motion.div
12
+ className="leaf-icon"
13
+ initial={{ opacity: 0, scale: 0.5 }}
14
+ whileInView={{ opacity: 1, scale: 1 }}
15
+ viewport={{ once: true }}
16
+ transition={{ duration: 0.8, type: 'spring', stiffness: 150 }}
17
+ >
18
+ <svg width="70" height="70" viewBox="0 0 70 70" fill="none">
19
+ <path d="M35 5 Q50 20 35 35 Q20 20 35 5 Z" fill="#7ba88a" />
20
+ <path d="M65 35 Q50 50 35 35 Q50 20 65 35 Z" fill="#7ba88a" />
21
+ <path d="M35 65 Q20 50 35 35 Q50 50 35 65 Z" fill="#7ba88a" />
22
+ <path d="M5 35 Q20 20 35 35 Q20 50 5 35 Z" fill="#7ba88a" />
23
+ </svg>
24
+ </motion.div>
25
+
26
+ <motion.p
27
+ className="belief-text"
28
+ initial={{ opacity: 0, y: 40 }}
29
+ whileInView={{ opacity: 1, y: 0 }}
30
+ viewport={{ once: true }}
31
+ transition={{ delay: 0.3, duration: 1 }}
32
+ >
33
+ {t('belief.message')}
34
+ </motion.p>
35
+
36
+ <motion.p
37
+ className="belief-subtext"
38
+ initial={{ opacity: 0 }}
39
+ whileInView={{ opacity: 1 }}
40
+ viewport={{ once: true }}
41
+ transition={{ delay: 0.6, duration: 0.8 }}
42
+ >
43
+ {t('belief.tagline')}
44
+ </motion.p>
45
+ </div>
46
+ </section>
47
+ )
48
+ }
49
+
50
+ export default BeliefStatement
frontend/src/components/Footer.css ADDED
@@ -0,0 +1,244 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .footer {
2
+ background-color: #b8c9c0;
3
+ }
4
+
5
+ .footer-main {
6
+ padding: 80px 80px 60px;
7
+ }
8
+
9
+ .footer-container {
10
+ max-width: 1600px;
11
+ margin: 0 auto;
12
+ display: grid;
13
+ grid-template-columns: 1fr 1fr 1.2fr;
14
+ gap: 80px;
15
+ }
16
+
17
+ .footer-column {
18
+ display: flex;
19
+ flex-direction: column;
20
+ gap: 18px;
21
+ }
22
+
23
+ .footer-heading {
24
+ font-family: 'Cormorant Garamond', serif;
25
+ font-size: 38px;
26
+ font-weight: 500;
27
+ color: #2d2d2d;
28
+ margin-bottom: 8px;
29
+ letter-spacing: -0.5px;
30
+ }
31
+
32
+ .footer-subheading {
33
+ font-family: 'Cormorant Garamond', serif;
34
+ font-size: 38px;
35
+ font-weight: 500;
36
+ color: #2d2d2d;
37
+ margin-top: 25px;
38
+ margin-bottom: 8px;
39
+ letter-spacing: -0.5px;
40
+ }
41
+
42
+ .footer-link {
43
+ font-family: 'DM Sans', sans-serif;
44
+ font-size: 18px;
45
+ font-weight: 400;
46
+ color: #3d3d3d;
47
+ text-decoration: none;
48
+ transition: color 0.3s ease;
49
+ }
50
+
51
+ .footer-link:hover {
52
+ color: #4a7c59;
53
+ }
54
+
55
+ .footer-text {
56
+ font-family: 'DM Sans', sans-serif;
57
+ font-size: 18px;
58
+ font-weight: 400;
59
+ color: #3d3d3d;
60
+ line-height: 1.6;
61
+ margin: 0;
62
+ }
63
+
64
+ .footer-address {
65
+ font-family: 'DM Sans', sans-serif;
66
+ font-size: 18px;
67
+ font-weight: 400;
68
+ color: #3d3d3d;
69
+ line-height: 1.6;
70
+ margin: 0;
71
+ }
72
+
73
+ .footer-cta {
74
+ align-items: flex-start;
75
+ gap: 25px;
76
+ }
77
+
78
+ .footer-logo {
79
+ display: flex;
80
+ flex-direction: column;
81
+ gap: 2px;
82
+ }
83
+
84
+ .footer-logo-main {
85
+ font-family: 'Cormorant Garamond', serif;
86
+ font-size: 28px;
87
+ font-weight: 500;
88
+ color: #2d2d2d;
89
+ letter-spacing: 1px;
90
+ }
91
+
92
+ .footer-logo-sub {
93
+ font-family: 'DM Sans', sans-serif;
94
+ font-size: 12px;
95
+ font-weight: 500;
96
+ color: #2d2d2d;
97
+ letter-spacing: 3px;
98
+ text-transform: uppercase;
99
+ }
100
+
101
+ .footer-cta-text {
102
+ font-family: 'Cormorant Garamond', serif;
103
+ font-size: 48px;
104
+ font-weight: 500;
105
+ color: #2d2d2d;
106
+ line-height: 1.3;
107
+ letter-spacing: -0.8px;
108
+ margin: 0;
109
+ }
110
+
111
+ .footer-buttons {
112
+ display: flex;
113
+ gap: 18px;
114
+ margin-top: 10px;
115
+ }
116
+
117
+ .footer-btn {
118
+ font-family: 'DM Sans', sans-serif;
119
+ font-size: 17px;
120
+ font-weight: 500;
121
+ padding: 18px 40px;
122
+ border-radius: 35px;
123
+ text-decoration: none;
124
+ transition: all 0.3s ease;
125
+ display: inline-block;
126
+ }
127
+
128
+ .footer-btn-outline {
129
+ background-color: transparent;
130
+ border: 2px solid #3d3d3d;
131
+ color: #3d3d3d;
132
+ }
133
+
134
+ .footer-btn-outline:hover {
135
+ background-color: #3d3d3d;
136
+ color: white;
137
+ }
138
+
139
+ .footer-btn-solid {
140
+ background-color: white;
141
+ border: 2px solid white;
142
+ color: #2d2d2d;
143
+ }
144
+
145
+ .footer-btn-solid:hover {
146
+ background-color: transparent;
147
+ border-color: #2d2d2d;
148
+ color: #2d2d2d;
149
+ }
150
+
151
+ .footer-bottom {
152
+ border-top: 1px solid rgba(61, 61, 61, 0.2);
153
+ padding: 35px 80px;
154
+ }
155
+
156
+ .footer-bottom-container {
157
+ max-width: 1600px;
158
+ margin: 0 auto;
159
+ display: flex;
160
+ justify-content: space-between;
161
+ align-items: center;
162
+ }
163
+
164
+ .footer-nav {
165
+ display: flex;
166
+ gap: 35px;
167
+ }
168
+
169
+ .footer-nav-link {
170
+ font-family: 'DM Sans', sans-serif;
171
+ font-size: 16px;
172
+ font-weight: 400;
173
+ color: #3d3d3d;
174
+ text-decoration: none;
175
+ transition: color 0.3s ease;
176
+ }
177
+
178
+ .footer-nav-link:hover {
179
+ color: #4a7c59;
180
+ }
181
+
182
+ .footer-copyright {
183
+ text-align: right;
184
+ }
185
+
186
+ .footer-copyright p {
187
+ font-family: 'DM Sans', sans-serif;
188
+ font-size: 14px;
189
+ font-weight: 400;
190
+ color: #5a5a5a;
191
+ margin: 4px 0;
192
+ line-height: 1.5;
193
+ }
194
+
195
+ @media (max-width: 1200px) {
196
+ .footer-container {
197
+ grid-template-columns: 1fr;
198
+ gap: 50px;
199
+ }
200
+
201
+ .footer-bottom-container {
202
+ flex-direction: column;
203
+ gap: 30px;
204
+ text-align: center;
205
+ }
206
+
207
+ .footer-copyright {
208
+ text-align: center;
209
+ }
210
+
211
+ .footer-nav {
212
+ flex-wrap: wrap;
213
+ justify-content: center;
214
+ }
215
+ }
216
+
217
+ @media (max-width: 768px) {
218
+ .footer-main {
219
+ padding: 60px 40px 40px;
220
+ }
221
+
222
+ .footer-bottom {
223
+ padding: 30px 40px;
224
+ }
225
+
226
+ .footer-heading,
227
+ .footer-subheading {
228
+ font-size: 32px;
229
+ }
230
+
231
+ .footer-cta-text {
232
+ font-size: 38px;
233
+ }
234
+
235
+ .footer-buttons {
236
+ flex-direction: column;
237
+ width: 100%;
238
+ }
239
+
240
+ .footer-btn {
241
+ text-align: center;
242
+ width: 100%;
243
+ }
244
+ }
frontend/src/components/Footer.tsx ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { motion } from 'framer-motion'
2
+ import { useTranslation } from 'react-i18next'
3
+ import './Footer.css'
4
+
5
+ function Footer() {
6
+ const { t } = useTranslation()
7
+
8
+ return (
9
+ <footer className="footer">
10
+ <div className="footer-main">
11
+ <div className="footer-container">
12
+ <motion.div
13
+ className="footer-column"
14
+ initial={{ opacity: 0, y: 40 }}
15
+ whileInView={{ opacity: 1, y: 0 }}
16
+ viewport={{ once: true }}
17
+ transition={{ duration: 0.6 }}
18
+ >
19
+ <h3 className="footer-heading">Co-Code GGW</h3>
20
+ <p className="footer-text">
21
+ {t('footer.description')}
22
+ </p>
23
+ </motion.div>
24
+
25
+ <motion.div
26
+ className="footer-column"
27
+ initial={{ opacity: 0, y: 40 }}
28
+ whileInView={{ opacity: 1, y: 0 }}
29
+ viewport={{ once: true }}
30
+ transition={{ delay: 0.1, duration: 0.6 }}
31
+ >
32
+ <h3 className="footer-heading">{t('footer.product.title')}</h3>
33
+ <a href="#features" className="footer-link">{t('header.nav.features')}</a>
34
+ <a href="#how-it-works" className="footer-link">{t('header.nav.howItWorks')}</a>
35
+ <a href="#privacy" className="footer-link">{t('header.nav.privacySecurity')}</a>
36
+ <a href="#faq" className="footer-link">{t('header.nav.faq')}</a>
37
+ <a href="#contact" className="footer-link">{t('header.nav.contact')}</a>
38
+ </motion.div>
39
+
40
+ <motion.div
41
+ className="footer-column footer-cta"
42
+ initial={{ opacity: 0, y: 40 }}
43
+ whileInView={{ opacity: 1, y: 0 }}
44
+ viewport={{ once: true }}
45
+ transition={{ delay: 0.2, duration: 0.6 }}
46
+ >
47
+ <div className="footer-logo">
48
+ <span className="footer-logo-main">Co-Code</span>
49
+ <span className="footer-logo-sub">GGW</span>
50
+ </div>
51
+ <h3 className="footer-cta-text">
52
+ {t('footer.cta.title')}
53
+ </h3>
54
+ <div className="footer-buttons">
55
+ <motion.a
56
+ href="#contact"
57
+ className="footer-btn footer-btn-outline"
58
+ whileHover={{ scale: 1.05 }}
59
+ whileTap={{ scale: 0.95 }}
60
+ >
61
+ {t('footer.cta.contact')}
62
+ </motion.a>
63
+ <motion.a
64
+ href="#demo"
65
+ className="footer-btn footer-btn-solid"
66
+ whileHover={{ scale: 1.05 }}
67
+ whileTap={{ scale: 0.95 }}
68
+ >
69
+ {t('footer.cta.demo')}
70
+ </motion.a>
71
+ </div>
72
+ </motion.div>
73
+ </div>
74
+ </div>
75
+
76
+ <div className="footer-bottom">
77
+ <div className="footer-bottom-container">
78
+ <nav className="footer-nav">
79
+ <a href="#features" className="footer-nav-link">{t('header.nav.features')}</a>
80
+ <a href="#privacy" className="footer-nav-link">{t('footer.bottom.privacy')}</a>
81
+ <a href="#terms" className="footer-nav-link">{t('footer.bottom.terms')}</a>
82
+ <a href="#contact" className="footer-nav-link">{t('header.nav.contact')}</a>
83
+ </nav>
84
+ <div className="footer-copyright">
85
+ <p>{t('footer.bottom.copyright')}</p>
86
+ </div>
87
+ </div>
88
+ </div>
89
+ </footer>
90
+ )
91
+ }
92
+
93
+ export default Footer
frontend/src/components/Header.css ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .header {
2
+ padding: 20px 60px;
3
+ background-color: #f5f0e8;
4
+ position: sticky;
5
+ top: 0;
6
+ z-index: 100;
7
+ }
8
+
9
+ .header-container {
10
+ max-width: 1400px;
11
+ margin: 0 auto;
12
+ display: flex;
13
+ align-items: center;
14
+ justify-content: space-between;
15
+ }
16
+
17
+ .logo {
18
+ display: flex;
19
+ flex-direction: column;
20
+ line-height: 1.1;
21
+ }
22
+
23
+ .logo-main {
24
+ font-family: 'Cormorant Garamond', serif;
25
+ font-size: 28px;
26
+ font-weight: 500;
27
+ color: #4a7c59;
28
+ letter-spacing: 0.5px;
29
+ }
30
+
31
+ .logo-sub {
32
+ font-family: 'DM Sans', sans-serif;
33
+ font-size: 12px;
34
+ font-weight: 500;
35
+ letter-spacing: 4px;
36
+ color: #4a7c59;
37
+ text-transform: uppercase;
38
+ }
39
+
40
+ .nav {
41
+ flex: 1;
42
+ display: flex;
43
+ justify-content: center;
44
+ }
45
+
46
+ .nav-list {
47
+ display: flex;
48
+ align-items: center;
49
+ gap: 40px;
50
+ }
51
+
52
+ .nav-item {
53
+ position: relative;
54
+ }
55
+
56
+ .nav-link {
57
+ font-family: 'DM Sans', sans-serif;
58
+ font-size: 16px;
59
+ font-weight: 400;
60
+ color: #2d2d2d;
61
+ transition: color 0.3s ease;
62
+ }
63
+
64
+ .nav-link:hover {
65
+ color: #4a7c59;
66
+ }
67
+
68
+ .header-actions {
69
+ display: flex;
70
+ align-items: center;
71
+ gap: 16px;
72
+ }
73
+
74
+ .cart-btn {
75
+ position: relative;
76
+ background: transparent;
77
+ padding: 8px;
78
+ display: flex;
79
+ align-items: center;
80
+ justify-content: center;
81
+ }
82
+
83
+ .cart-count {
84
+ position: absolute;
85
+ top: 0;
86
+ right: 0;
87
+ background-color: #4a7c59;
88
+ color: white;
89
+ font-size: 10px;
90
+ font-weight: 600;
91
+ width: 16px;
92
+ height: 16px;
93
+ border-radius: 50%;
94
+ display: flex;
95
+ align-items: center;
96
+ justify-content: center;
97
+ }
98
+
99
+ .book-session-btn {
100
+ background-color: #4a7c59;
101
+ color: white;
102
+ font-family: 'DM Sans', sans-serif;
103
+ font-size: 15px;
104
+ font-weight: 500;
105
+ padding: 14px 28px;
106
+ border-radius: 30px;
107
+ transition: background-color 0.3s ease;
108
+ }
109
+
110
+ .book-session-btn:hover {
111
+ background-color: #3d6a4a;
112
+ }
frontend/src/components/Header.tsx ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { motion } from 'framer-motion'
2
+ import { useTranslation } from 'react-i18next'
3
+ import LanguageSwitcher from './LanguageSwitcher'
4
+ import './Header.css'
5
+
6
+ function Header() {
7
+ const { t } = useTranslation()
8
+
9
+ const navLinks = [
10
+ { label: t('header.nav.features'), href: '#features' },
11
+ { label: t('header.nav.howItWorks'), href: '#how-it-works' },
12
+ { label: t('header.nav.privacySecurity'), href: '#privacy' },
13
+ { label: t('header.nav.news'), href: '#news' },
14
+ { label: t('header.nav.faq'), href: '#faq' },
15
+ { label: t('header.nav.contact'), href: '#contact' },
16
+ ]
17
+
18
+ return (
19
+ <motion.header
20
+ className="header"
21
+ initial={{ y: -100, opacity: 0 }}
22
+ animate={{ y: 0, opacity: 1 }}
23
+ transition={{ duration: 0.8, ease: 'easeOut' }}
24
+ >
25
+ <div className="header-container">
26
+ <motion.a
27
+ href="/"
28
+ className="logo"
29
+ whileHover={{ scale: 1.05 }}
30
+ transition={{ type: 'spring', stiffness: 400 }}
31
+ >
32
+ <span className="logo-main">Co-Code</span>
33
+ <span className="logo-sub">GGW</span>
34
+ </motion.a>
35
+
36
+ <nav className="nav">
37
+ <ul className="nav-list">
38
+ {navLinks.map((link, index) => (
39
+ <motion.li
40
+ key={link.label}
41
+ className="nav-item"
42
+ initial={{ y: -20, opacity: 0 }}
43
+ animate={{ y: 0, opacity: 1 }}
44
+ transition={{ delay: 0.1 * index, duration: 0.5 }}
45
+ >
46
+ <motion.a
47
+ href={link.href}
48
+ className="nav-link"
49
+ whileHover={{ scale: 1.1, color: '#4a7c59' }}
50
+ transition={{ type: 'spring', stiffness: 300 }}
51
+ >
52
+ {link.label}
53
+ </motion.a>
54
+ </motion.li>
55
+ ))}
56
+ </ul>
57
+ </nav>
58
+
59
+ <motion.div
60
+ className="header-actions"
61
+ initial={{ x: 100, opacity: 0 }}
62
+ animate={{ x: 0, opacity: 1 }}
63
+ transition={{ delay: 0.5, duration: 0.6 }}
64
+ >
65
+ <LanguageSwitcher />
66
+ <motion.a
67
+ href="#"
68
+ className="book-session-btn"
69
+ whileHover={{ scale: 1.08, boxShadow: '0 8px 25px rgba(74, 124, 89, 0.3)' }}
70
+ whileTap={{ scale: 0.95 }}
71
+ transition={{ type: 'spring', stiffness: 400, damping: 10 }}
72
+ >
73
+ {t('header.cta')}
74
+ </motion.a>
75
+ </motion.div>
76
+ </div>
77
+ </motion.header>
78
+ )
79
+ }
80
+
81
+ export default Header
frontend/src/components/Hero.css ADDED
@@ -0,0 +1,186 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .hero {
2
+ min-height: 100vh;
3
+ padding: 80px 80px 60px;
4
+ background-color: #f5f0e8;
5
+ display: flex;
6
+ align-items: center;
7
+ }
8
+
9
+ .hero-container {
10
+ max-width: 1600px;
11
+ margin: 0 auto;
12
+ display: flex;
13
+ align-items: center;
14
+ justify-content: space-between;
15
+ gap: 80px;
16
+ width: 100%;
17
+ }
18
+
19
+ .hero-content {
20
+ flex: 0 0 48%;
21
+ max-width: 750px;
22
+ }
23
+
24
+ .hero-title {
25
+ font-family: 'Cormorant Garamond', serif;
26
+ font-size: 110px;
27
+ font-weight: 500;
28
+ line-height: 1.1;
29
+ color: #2d2d2d;
30
+ margin-bottom: 45px;
31
+ letter-spacing: -2px;
32
+ }
33
+
34
+ .hero-title .highlight {
35
+ color: #4a7c59;
36
+ font-style: italic;
37
+ position: relative;
38
+ display: inline-block;
39
+ }
40
+
41
+ .hero-title .highlight::after {
42
+ content: '';
43
+ position: absolute;
44
+ bottom: 8px;
45
+ left: 0;
46
+ width: 100%;
47
+ height: 3px;
48
+ background-color: #2d2d2d;
49
+ border-radius: 2px;
50
+ }
51
+
52
+ .hero-description {
53
+ font-family: 'DM Sans', sans-serif;
54
+ font-size: 22px;
55
+ font-weight: 400;
56
+ line-height: 1.8;
57
+ color: #5a5a5a;
58
+ margin-bottom: 15px;
59
+ max-width: 650px;
60
+ }
61
+
62
+ .hero-disclaimer {
63
+ font-family: 'DM Sans', sans-serif;
64
+ font-size: 14px;
65
+ font-weight: 400;
66
+ line-height: 1.6;
67
+ color: #7a7a7a;
68
+ font-style: italic;
69
+ margin-bottom: 40px;
70
+ max-width: 650px;
71
+ }
72
+
73
+ .hero-buttons {
74
+ display: flex;
75
+ align-items: center;
76
+ gap: 30px;
77
+ }
78
+
79
+ .btn-primary {
80
+ background-color: #4a7c59;
81
+ color: white;
82
+ font-family: 'DM Sans', sans-serif;
83
+ font-size: 19px;
84
+ font-weight: 500;
85
+ padding: 22px 48px;
86
+ border-radius: 40px;
87
+ transition: all 0.3s ease;
88
+ display: inline-block;
89
+ }
90
+
91
+ .btn-primary:hover {
92
+ background-color: #3d6849;
93
+ transform: translateY(-2px);
94
+ }
95
+
96
+ .btn-secondary {
97
+ display: flex;
98
+ align-items: center;
99
+ gap: 16px;
100
+ font-family: 'DM Sans', sans-serif;
101
+ font-size: 19px;
102
+ font-weight: 500;
103
+ color: #2d2d2d;
104
+ transition: all 0.3s ease;
105
+ }
106
+
107
+ .btn-secondary:hover {
108
+ color: #4a7c59;
109
+ }
110
+
111
+ .btn-icon {
112
+ width: 50px;
113
+ height: 50px;
114
+ border: 1.5px solid #c5c5c5;
115
+ border-radius: 50%;
116
+ display: flex;
117
+ align-items: center;
118
+ justify-content: center;
119
+ transition: border-color 0.3s ease;
120
+ }
121
+
122
+ .btn-secondary:hover .btn-icon {
123
+ border-color: #4a7c59;
124
+ }
125
+
126
+ .hero-images {
127
+ flex: 0 0 50%;
128
+ max-width: 800px;
129
+ }
130
+
131
+ .image-grid {
132
+ display: grid;
133
+ grid-template-columns: 1fr 1fr;
134
+ grid-template-rows: auto auto;
135
+ gap: 28px;
136
+ }
137
+
138
+ .image-item {
139
+ overflow: hidden;
140
+ position: relative;
141
+ }
142
+
143
+ .image-item img {
144
+ width: 100%;
145
+ height: 100%;
146
+ object-fit: cover;
147
+ transition: transform 0.3s ease;
148
+ }
149
+
150
+ .image-item:hover img {
151
+ transform: scale(1.05);
152
+ }
153
+
154
+ .image-1 {
155
+ border-radius: 0 0 0 110px;
156
+ height: 300px;
157
+ border: 2px dashed #c5b89a;
158
+ padding: 12px;
159
+ background: transparent;
160
+ }
161
+
162
+ .image-1 img {
163
+ border-radius: 0 0 0 105px;
164
+ }
165
+
166
+ .image-2 {
167
+ border-radius: 110px 0 0 0;
168
+ height: 300px;
169
+ }
170
+
171
+ .image-3 {
172
+ border-radius: 0 110px 0 0;
173
+ height: 320px;
174
+ }
175
+
176
+ .image-4 {
177
+ border-radius: 0 0 110px 0;
178
+ height: 320px;
179
+ border: 2px dashed #c5b89a;
180
+ padding: 12px;
181
+ background: transparent;
182
+ }
183
+
184
+ .image-4 img {
185
+ border-radius: 0 0 105px 0;
186
+ }
frontend/src/components/Hero.tsx ADDED
@@ -0,0 +1,167 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useEffect, useRef } from 'react'
2
+ import { motion } from 'framer-motion'
3
+ import { useTranslation } from 'react-i18next'
4
+ import gsap from 'gsap'
5
+ import './Hero.css'
6
+
7
+ function Hero() {
8
+ const { t } = useTranslation()
9
+ const imagesRef = useRef<(HTMLDivElement | null)[]>([])
10
+
11
+ useEffect(() => {
12
+ imagesRef.current.forEach((img, index) => {
13
+ if (img) {
14
+ gsap.fromTo(img,
15
+ {
16
+ opacity: 0,
17
+ scale: 0.5,
18
+ rotation: index % 2 === 0 ? -180 : 180
19
+ },
20
+ {
21
+ opacity: 1,
22
+ scale: 1,
23
+ rotation: 0,
24
+ duration: 1.5,
25
+ delay: 0.5 + index * 0.2,
26
+ ease: 'elastic.out(1, 0.5)'
27
+ }
28
+ )
29
+
30
+ gsap.to(img, {
31
+ y: index % 2 === 0 ? -15 : 15,
32
+ duration: 2.5 + index * 0.5,
33
+ repeat: -1,
34
+ yoyo: true,
35
+ ease: 'sine.inOut'
36
+ })
37
+ }
38
+ })
39
+ }, [])
40
+
41
+ return (
42
+ <section className="hero">
43
+ <div className="hero-container">
44
+ <motion.div
45
+ className="hero-content"
46
+ initial={{ opacity: 0, x: -100 }}
47
+ animate={{ opacity: 1, x: 0 }}
48
+ transition={{ duration: 1, ease: 'easeOut' }}
49
+ >
50
+ <motion.h1
51
+ className="hero-title"
52
+ initial={{ opacity: 0, y: 50 }}
53
+ animate={{ opacity: 1, y: 0 }}
54
+ transition={{ delay: 0.3, duration: 0.8 }}
55
+ >
56
+ {t('hero.tagline')}
57
+ <br />
58
+ is <motion.span
59
+ className="highlight"
60
+ initial={{ scale: 0, opacity: 0 }}
61
+ animate={{ scale: 1, opacity: 1 }}
62
+ transition={{ delay: 0.8, duration: 0.6, type: 'spring', stiffness: 200 }}
63
+ >
64
+ {t('hero.taglineHighlight')}
65
+ </motion.span>
66
+ <br />
67
+ <motion.span
68
+ className="highlight"
69
+ initial={{ scale: 0, opacity: 0 }}
70
+ animate={{ scale: 1, opacity: 1 }}
71
+ transition={{ delay: 1, duration: 0.6, type: 'spring', stiffness: 200 }}
72
+ >
73
+ {t('hero.subtitle')}
74
+ </motion.span>
75
+ </motion.h1>
76
+ <motion.p
77
+ className="hero-description"
78
+ initial={{ opacity: 0, y: 30 }}
79
+ animate={{ opacity: 1, y: 0 }}
80
+ transition={{ delay: 1, duration: 0.8 }}
81
+ >
82
+ {t('hero.description')}
83
+ </motion.p>
84
+ <motion.p
85
+ className="hero-disclaimer"
86
+ initial={{ opacity: 0 }}
87
+ animate={{ opacity: 1 }}
88
+ transition={{ delay: 1.2, duration: 0.8 }}
89
+ >
90
+ {t('hero.disclaimer')}
91
+ </motion.p>
92
+ <motion.div
93
+ className="hero-buttons"
94
+ initial={{ opacity: 0, y: 30 }}
95
+ animate={{ opacity: 1, y: 0 }}
96
+ transition={{ delay: 1.3, duration: 0.8 }}
97
+ >
98
+ <motion.a
99
+ href="#"
100
+ className="btn-primary"
101
+ whileHover={{ scale: 1.1, y: -3, boxShadow: '0 10px 30px rgba(74, 124, 89, 0.4)' }}
102
+ whileTap={{ scale: 0.95 }}
103
+ transition={{ type: 'spring', stiffness: 400, damping: 10 }}
104
+ >
105
+ {t('hero.cta.upload')}
106
+ </motion.a>
107
+ <motion.a
108
+ href="#"
109
+ className="btn-secondary"
110
+ whileHover={{ scale: 1.05, x: 10 }}
111
+ whileTap={{ scale: 0.95 }}
112
+ >
113
+ <motion.span
114
+ className="btn-icon"
115
+ whileHover={{ rotate: 90 }}
116
+ transition={{ type: 'spring', stiffness: 300 }}
117
+ >
118
+ <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
119
+ <path d="M6 1L11 6M11 6L6 11M11 6H1" stroke="#2d2d2d" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/>
120
+ </svg>
121
+ </motion.span>
122
+ {t('hero.cta.howItWorks')}
123
+ </motion.a>
124
+ </motion.div>
125
+ </motion.div>
126
+ <div className="hero-images">
127
+ <div className="image-grid">
128
+ <motion.div
129
+ className="image-item image-1"
130
+ ref={el => imagesRef.current[0] = el}
131
+ whileHover={{ scale: 1.15, rotate: 5, zIndex: 10 }}
132
+ transition={{ type: 'spring', stiffness: 300 }}
133
+ >
134
+ <img src="https://images.unsplash.com/photo-1576091160399-112ba8d25d1d?w=400&h=300&fit=crop" alt={t('hero.images.labReport')} />
135
+ </motion.div>
136
+ <motion.div
137
+ className="image-item image-2"
138
+ ref={el => imagesRef.current[1] = el}
139
+ whileHover={{ scale: 1.15, rotate: -5, zIndex: 10 }}
140
+ transition={{ type: 'spring', stiffness: 300 }}
141
+ >
142
+ <img src="https://images.unsplash.com/photo-1579684385127-1ef15d508118?w=400&h=300&fit=crop" alt={t('hero.images.dashboard')} />
143
+ </motion.div>
144
+ <motion.div
145
+ className="image-item image-3"
146
+ ref={el => imagesRef.current[2] = el}
147
+ whileHover={{ scale: 1.15, rotate: 5, zIndex: 10 }}
148
+ transition={{ type: 'spring', stiffness: 300 }}
149
+ >
150
+ <img src="https://images.unsplash.com/photo-1576091160550-2173dba999ef?w=400&h=300&fit=crop" alt={t('hero.images.smartwatch')} />
151
+ </motion.div>
152
+ <motion.div
153
+ className="image-item image-4"
154
+ ref={el => imagesRef.current[3] = el}
155
+ whileHover={{ scale: 1.15, rotate: -5, zIndex: 10 }}
156
+ transition={{ type: 'spring', stiffness: 300 }}
157
+ >
158
+ <img src="https://images.unsplash.com/photo-1587854692152-cbe660dbde88?w=400&h=300&fit=crop" alt={t('hero.images.medicine')} />
159
+ </motion.div>
160
+ </div>
161
+ </div>
162
+ </div>
163
+ </section>
164
+ )
165
+ }
166
+
167
+ export default Hero
frontend/src/components/HowWeCanHelp.css ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .how-we-help {
2
+ min-height: 100vh;
3
+ padding: 100px 80px;
4
+ background-color: #f5f0e8;
5
+ display: flex;
6
+ align-items: center;
7
+ }
8
+
9
+ .how-we-help-container {
10
+ max-width: 1600px;
11
+ margin: 0 auto;
12
+ width: 100%;
13
+ }
14
+
15
+ .help-header {
16
+ display: flex;
17
+ justify-content: space-between;
18
+ align-items: flex-start;
19
+ margin-bottom: 70px;
20
+ gap: 60px;
21
+ }
22
+
23
+ .help-text {
24
+ flex: 1;
25
+ max-width: 700px;
26
+ }
27
+
28
+ .help-title {
29
+ font-family: 'Cormorant Garamond', serif;
30
+ font-size: 75px;
31
+ font-weight: 500;
32
+ color: #2d2d2d;
33
+ margin-bottom: 28px;
34
+ letter-spacing: -1.5px;
35
+ line-height: 1.1;
36
+ }
37
+
38
+ .help-subtitle {
39
+ font-family: 'DM Sans', sans-serif;
40
+ font-size: 19px;
41
+ font-weight: 400;
42
+ line-height: 1.7;
43
+ color: #5a5a5a;
44
+ max-width: 600px;
45
+ }
46
+
47
+ .btn-view-all {
48
+ display: inline-block;
49
+ background-color: #4a7c59;
50
+ color: white;
51
+ font-family: 'DM Sans', sans-serif;
52
+ font-size: 18px;
53
+ font-weight: 500;
54
+ padding: 20px 45px;
55
+ border-radius: 40px;
56
+ transition: all 0.3s ease;
57
+ white-space: nowrap;
58
+ }
59
+
60
+ .btn-view-all:hover {
61
+ background-color: #3d6849;
62
+ transform: translateY(-2px);
63
+ }
64
+
65
+ .services-cards {
66
+ display: grid;
67
+ grid-template-columns: repeat(3, 1fr);
68
+ gap: 35px;
69
+ }
70
+
71
+ .service-card-item {
72
+ background-color: #b8c9c0;
73
+ padding: 55px 40px;
74
+ border-radius: 20px;
75
+ display: flex;
76
+ flex-direction: column;
77
+ transition: transform 0.3s ease;
78
+ }
79
+
80
+ .service-icon {
81
+ margin-bottom: 35px;
82
+ }
83
+
84
+ .service-card-title {
85
+ font-family: 'Cormorant Garamond', serif;
86
+ font-size: 42px;
87
+ font-weight: 500;
88
+ color: #2d2d2d;
89
+ margin-bottom: 20px;
90
+ letter-spacing: -0.5px;
91
+ }
92
+
93
+ .service-card-description {
94
+ font-family: 'DM Sans', sans-serif;
95
+ font-size: 17px;
96
+ font-weight: 400;
97
+ line-height: 1.6;
98
+ color: #3d3d3d;
99
+ margin-bottom: 35px;
100
+ flex-grow: 1;
101
+ }
102
+
103
+ .service-view-link {
104
+ display: inline-flex;
105
+ align-items: center;
106
+ gap: 10px;
107
+ font-family: 'DM Sans', sans-serif;
108
+ font-size: 17px;
109
+ font-weight: 500;
110
+ color: #2d2d2d;
111
+ transition: all 0.3s ease;
112
+ }
113
+
114
+ .service-view-link:hover {
115
+ gap: 14px;
116
+ color: #4a7c59;
117
+ }
118
+
119
+ .view-icon {
120
+ width: 32px;
121
+ height: 32px;
122
+ border: 1.5px solid currentColor;
123
+ border-radius: 50%;
124
+ display: flex;
125
+ align-items: center;
126
+ justify-content: center;
127
+ transition: all 0.3s ease;
128
+ }
129
+
130
+ @media (max-width: 1200px) {
131
+ .services-cards {
132
+ grid-template-columns: 1fr;
133
+ gap: 30px;
134
+ }
135
+
136
+ .help-header {
137
+ flex-direction: column;
138
+ align-items: flex-start;
139
+ }
140
+
141
+ .help-title {
142
+ font-size: 60px;
143
+ }
144
+ }
145
+
146
+ @media (max-width: 768px) {
147
+ .how-we-help {
148
+ padding: 80px 40px;
149
+ }
150
+
151
+ .help-title {
152
+ font-size: 52px;
153
+ }
154
+
155
+ .help-subtitle {
156
+ font-size: 17px;
157
+ }
158
+
159
+ .service-card-title {
160
+ font-size: 36px;
161
+ }
162
+ }
frontend/src/components/HowWeCanHelp.tsx ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { motion } from 'framer-motion'
2
+ import { useTranslation } from 'react-i18next'
3
+ import './HowWeCanHelp.css'
4
+
5
+ function HowWeCanHelp() {
6
+ const { t } = useTranslation()
7
+
8
+ const services = [
9
+ {
10
+ icon: (
11
+ <svg width="80" height="80" viewBox="0 0 80 80" fill="none">
12
+ <circle cx="40" cy="40" r="15" fill="#4a7c59" />
13
+ <circle cx="40" cy="40" r="20" stroke="#4a7c59" strokeWidth="1.5" fill="none" />
14
+ <circle cx="40" cy="40" r="25" stroke="#4a7c59" strokeWidth="1.5" fill="none" />
15
+ <circle cx="40" cy="40" r="30" stroke="#4a7c59" strokeWidth="1.5" fill="none" />
16
+ <circle cx="40" cy="40" r="35" stroke="#4a7c59" strokeWidth="1.5" fill="none" />
17
+ </svg>
18
+ ),
19
+ title: t('howItWorks.features.ocr.title'),
20
+ description: t('howItWorks.features.ocr.description')
21
+ },
22
+ {
23
+ icon: (
24
+ <svg width="80" height="80" viewBox="0 0 80 80" fill="none">
25
+ <rect x="30" y="30" width="20" height="20" fill="#4a7c59" />
26
+ <rect x="25" y="25" width="30" height="30" stroke="#4a7c59" strokeWidth="1.5" fill="none" />
27
+ <rect x="20" y="20" width="40" height="40" stroke="#4a7c59" strokeWidth="1.5" fill="none" />
28
+ <rect x="15" y="15" width="50" height="50" stroke="#4a7c59" strokeWidth="1.5" fill="none" />
29
+ </svg>
30
+ ),
31
+ title: t('howItWorks.features.reminders.title'),
32
+ description: t('howItWorks.features.reminders.description')
33
+ },
34
+ {
35
+ icon: (
36
+ <svg width="80" height="80" viewBox="0 0 80 80" fill="none">
37
+ <path d="M40 20 L55 50 L25 50 Z" stroke="#4a7c59" strokeWidth="1.5" fill="none" />
38
+ <path d="M40 25 L52 47 L28 47 Z" stroke="#4a7c59" strokeWidth="1.5" fill="none" />
39
+ <path d="M40 30 L49 44 L31 44 Z" stroke="#4a7c59" strokeWidth="1.5" fill="none" />
40
+ <path d="M40 35 L46 41 L34 41 Z" fill="#4a7c59" />
41
+ </svg>
42
+ ),
43
+ title: t('howItWorks.features.index.title'),
44
+ description: t('howItWorks.features.index.description')
45
+ }
46
+ ]
47
+
48
+ return (
49
+ <section className="how-we-help">
50
+ <div className="how-we-help-container">
51
+ <div className="help-header">
52
+ <div className="help-text">
53
+ <motion.h2
54
+ className="help-title"
55
+ initial={{ opacity: 0, y: 40 }}
56
+ whileInView={{ opacity: 1, y: 0 }}
57
+ viewport={{ once: true }}
58
+ transition={{ duration: 0.8 }}
59
+ >
60
+ {t('howItWorks.title')}
61
+ </motion.h2>
62
+ <motion.p
63
+ className="help-subtitle"
64
+ initial={{ opacity: 0, y: 30 }}
65
+ whileInView={{ opacity: 1, y: 0 }}
66
+ viewport={{ once: true }}
67
+ transition={{ delay: 0.2, duration: 0.8 }}
68
+ >
69
+ {t('howItWorks.subtitle')}
70
+ </motion.p>
71
+ </div>
72
+ <motion.div
73
+ initial={{ opacity: 0, x: 40 }}
74
+ whileInView={{ opacity: 1, x: 0 }}
75
+ viewport={{ once: true }}
76
+ transition={{ delay: 0.3, duration: 0.8 }}
77
+ >
78
+ <motion.a
79
+ href="#"
80
+ className="btn-view-all"
81
+ whileHover={{ scale: 1.05 }}
82
+ whileTap={{ scale: 0.95 }}
83
+ >
84
+ {t('howItWorks.cta')}
85
+ </motion.a>
86
+ </motion.div>
87
+ </div>
88
+
89
+ <div className="services-cards">
90
+ {services.map((service, index) => (
91
+ <motion.div
92
+ key={service.title}
93
+ className="service-card-item"
94
+ initial={{ opacity: 0, y: 60 }}
95
+ whileInView={{ opacity: 1, y: 0 }}
96
+ viewport={{ once: true }}
97
+ transition={{ delay: index * 0.15, duration: 0.8 }}
98
+ >
99
+ <div className="service-icon">{service.icon}</div>
100
+ <h3 className="service-card-title">{service.title}</h3>
101
+ <p className="service-card-description">{service.description}</p>
102
+ <a href="#" className="service-view-link">
103
+ <span className="view-icon">
104
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
105
+ <path d="M8 3L13 8M13 8L8 13M13 8H3" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/>
106
+ </svg>
107
+ </span>
108
+ View
109
+ </a>
110
+ </motion.div>
111
+ ))}
112
+ </div>
113
+ </div>
114
+ </section>
115
+ )
116
+ }
117
+
118
+ export default HowWeCanHelp
frontend/src/components/LanguageSwitcher.css ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .language-switcher {
2
+ position: relative;
3
+ z-index: 1000;
4
+ }
5
+
6
+ .language-toggle {
7
+ display: flex;
8
+ align-items: center;
9
+ gap: 8px;
10
+ padding: 10px 16px;
11
+ background-color: rgba(255, 255, 255, 0.1);
12
+ border: 1px solid rgba(255, 255, 255, 0.2);
13
+ border-radius: 25px;
14
+ color: #2d2d2d;
15
+ font-family: 'DM Sans', sans-serif;
16
+ font-size: 14px;
17
+ font-weight: 500;
18
+ cursor: pointer;
19
+ transition: all 0.3s ease;
20
+ }
21
+
22
+ .language-toggle:hover {
23
+ background-color: rgba(255, 255, 255, 0.2);
24
+ border-color: #4a7c59;
25
+ }
26
+
27
+ .language-label {
28
+ min-width: 50px;
29
+ text-align: left;
30
+ }
31
+
32
+ .dropdown-arrow {
33
+ transition: transform 0.3s ease;
34
+ }
35
+
36
+ .dropdown-arrow.open {
37
+ transform: rotate(180deg);
38
+ }
39
+
40
+ .language-backdrop {
41
+ position: fixed;
42
+ top: 0;
43
+ left: 0;
44
+ right: 0;
45
+ bottom: 0;
46
+ background: transparent;
47
+ z-index: 999;
48
+ }
49
+
50
+ .language-dropdown {
51
+ position: absolute;
52
+ top: calc(100% + 8px);
53
+ right: 0;
54
+ background: white;
55
+ border: 1px solid #e0e0e0;
56
+ border-radius: 12px;
57
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
58
+ overflow: hidden;
59
+ min-width: 200px;
60
+ z-index: 1001;
61
+ }
62
+
63
+ .language-option {
64
+ display: flex;
65
+ align-items: center;
66
+ justify-content: space-between;
67
+ width: 100%;
68
+ padding: 14px 18px;
69
+ background: white;
70
+ border: none;
71
+ text-align: left;
72
+ cursor: pointer;
73
+ transition: background-color 0.2s ease;
74
+ font-family: 'DM Sans', sans-serif;
75
+ }
76
+
77
+ .language-option:hover {
78
+ background-color: #f5f5f5;
79
+ }
80
+
81
+ .language-option.active {
82
+ background-color: #f0f7f3;
83
+ }
84
+
85
+ .language-option:not(:last-child) {
86
+ border-bottom: 1px solid #f0f0f0;
87
+ }
88
+
89
+ .language-native {
90
+ font-size: 16px;
91
+ font-weight: 500;
92
+ color: #2d2d2d;
93
+ margin-right: 8px;
94
+ }
95
+
96
+ .language-english {
97
+ font-size: 13px;
98
+ color: #7d7d7d;
99
+ flex: 1;
100
+ }
101
+
102
+ @media (max-width: 768px) {
103
+ .language-toggle {
104
+ padding: 8px 12px;
105
+ font-size: 13px;
106
+ }
107
+
108
+ .language-label {
109
+ min-width: 40px;
110
+ }
111
+
112
+ .language-dropdown {
113
+ right: -10px;
114
+ min-width: 180px;
115
+ }
116
+
117
+ .language-option {
118
+ padding: 12px 16px;
119
+ }
120
+
121
+ .language-native {
122
+ font-size: 15px;
123
+ }
124
+
125
+ .language-english {
126
+ font-size: 12px;
127
+ }
128
+ }
frontend/src/components/LanguageSwitcher.tsx ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useState } from 'react';
2
+ import { useTranslation } from 'react-i18next';
3
+ import { motion, AnimatePresence } from 'framer-motion';
4
+ import './LanguageSwitcher.css';
5
+
6
+ function LanguageSwitcher() {
7
+ const { i18n, t } = useTranslation();
8
+ const [isOpen, setIsOpen] = useState(false);
9
+
10
+ const languages = [
11
+ { code: 'en', label: 'English', native: 'English' },
12
+ { code: 'hi', label: 'Hindi', native: 'हिंदी' },
13
+ { code: 'mr', label: 'Marathi', native: 'मराठी' }
14
+ ];
15
+
16
+ const currentLanguage = languages.find(lang => lang.code === i18n.language) || languages[0];
17
+
18
+ const changeLanguage = (langCode: string) => {
19
+ i18n.changeLanguage(langCode);
20
+ setIsOpen(false);
21
+ };
22
+
23
+ return (
24
+ <div className="language-switcher">
25
+ <button
26
+ className="language-toggle"
27
+ onClick={() => setIsOpen(!isOpen)}
28
+ aria-label={t('language.select')}
29
+ >
30
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none">
31
+ <path d="M10 1C5.03 1 1 5.03 1 10s4.03 9 9 9 9-4.03 9-9-4.03-9-9-9zm6.93 6h-2.95a15.65 15.65 0 0 0-1.38-3.56A8.03 8.03 0 0 1 16.93 7zM10 3.04c.83 1.2 1.48 2.53 1.91 3.96h-3.82c.43-1.43 1.08-2.76 1.91-3.96zM3.26 11C3.1 10.34 3 9.68 3 9s.1-1.34.26-2h3.38c-.08.66-.14 1.32-.14 2 0 .68.06 1.34.14 2H3.26zm.81 2h2.95c.32 1.25.78 2.45 1.38 3.56A7.987 7.987 0 0 1 4.07 13zm2.95-8H4.07a7.987 7.987 0 0 1 4.33-3.56A15.65 15.65 0 0 0 7.02 5zM10 16.96c-.83-1.2-1.48-2.53-1.91-3.96h3.82c-.43 1.43-1.08 2.76-1.91 3.96zM12.34 11H7.66c-.09-.66-.16-1.32-.16-2 0-.68.07-1.35.16-2h4.68c.09.65.16 1.32.16 2 0 .68-.07 1.34-.16 2zm.25 5.56c.6-1.11 1.06-2.31 1.38-3.56h2.95a8.03 8.03 0 0 1-4.33 3.56zM13.5 11c.08-.66.14-1.32.14-2 0-.68-.06-1.34-.14-2h3.38c.16.66.26 1.32.26 2s-.1 1.34-.26 2H13.5z" fill="currentColor"/>
32
+ </svg>
33
+ <span className="language-label">{currentLanguage.native}</span>
34
+ <svg width="12" height="12" viewBox="0 0 12 12" fill="none" className={`dropdown-arrow ${isOpen ? 'open' : ''}`}>
35
+ <path d="M3 5L6 8L9 5" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/>
36
+ </svg>
37
+ </button>
38
+
39
+ <AnimatePresence>
40
+ {isOpen && (
41
+ <>
42
+ <motion.div
43
+ className="language-backdrop"
44
+ initial={{ opacity: 0 }}
45
+ animate={{ opacity: 1 }}
46
+ exit={{ opacity: 0 }}
47
+ onClick={() => setIsOpen(false)}
48
+ />
49
+ <motion.div
50
+ className="language-dropdown"
51
+ initial={{ opacity: 0, y: -10 }}
52
+ animate={{ opacity: 1, y: 0 }}
53
+ exit={{ opacity: 0, y: -10 }}
54
+ transition={{ duration: 0.2 }}
55
+ >
56
+ {languages.map((lang) => (
57
+ <button
58
+ key={lang.code}
59
+ className={`language-option ${i18n.language === lang.code ? 'active' : ''}`}
60
+ onClick={() => changeLanguage(lang.code)}
61
+ >
62
+ <span className="language-native">{lang.native}</span>
63
+ <span className="language-english">{lang.label}</span>
64
+ {i18n.language === lang.code && (
65
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
66
+ <path d="M13 4L6 11L3 8" stroke="#4a7c59" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
67
+ </svg>
68
+ )}
69
+ </button>
70
+ ))}
71
+ </motion.div>
72
+ </>
73
+ )}
74
+ </AnimatePresence>
75
+ </div>
76
+ );
77
+ }
78
+
79
+ export default LanguageSwitcher;
frontend/src/components/ServicesSection.css ADDED
@@ -0,0 +1,267 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .services {
2
+ min-height: 100vh;
3
+ padding: 80px 80px 60px;
4
+ background-color: #f5f0e8;
5
+ display: flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ }
9
+
10
+ .services-container {
11
+ max-width: 1600px;
12
+ margin: 0 auto;
13
+ width: 100%;
14
+ }
15
+
16
+ .services-header {
17
+ text-align: center;
18
+ margin-bottom: 70px;
19
+ }
20
+
21
+ .services-title {
22
+ font-family: 'Cormorant Garamond', serif;
23
+ font-size: 75px;
24
+ font-weight: 500;
25
+ color: #2d2d2d;
26
+ margin-bottom: 28px;
27
+ letter-spacing: -1.5px;
28
+ line-height: 1.1;
29
+ }
30
+
31
+ .services-subtitle {
32
+ font-family: 'DM Sans', sans-serif;
33
+ font-size: 20px;
34
+ font-weight: 400;
35
+ line-height: 1.7;
36
+ color: #5a5a5a;
37
+ }
38
+
39
+ .services-grid {
40
+ display: grid;
41
+ grid-template-columns: 1fr 1fr 1fr;
42
+ grid-template-rows: 1fr 1fr;
43
+ gap: 0;
44
+ max-width: 1500px;
45
+ margin: 0 auto 60px;
46
+ position: relative;
47
+ min-height: 500px;
48
+ }
49
+
50
+ .service-card {
51
+ padding: 60px 50px;
52
+ display: flex;
53
+ flex-direction: column;
54
+ justify-content: center;
55
+ background-color: transparent;
56
+ position: relative;
57
+ z-index: 2;
58
+ }
59
+
60
+ .card-left-top {
61
+ grid-column: 1;
62
+ grid-row: 1;
63
+ padding-right: 70px;
64
+ }
65
+
66
+ .card-right-top {
67
+ grid-column: 3;
68
+ grid-row: 1;
69
+ padding-left: 70px;
70
+ }
71
+
72
+ .card-left-bottom {
73
+ grid-column: 1;
74
+ grid-row: 2;
75
+ padding-right: 70px;
76
+ }
77
+
78
+ .card-right-bottom {
79
+ grid-column: 3;
80
+ grid-row: 2;
81
+ padding-left: 70px;
82
+ }
83
+
84
+ .service-title {
85
+ font-family: 'Cormorant Garamond', serif;
86
+ font-size: 48px;
87
+ font-weight: 500;
88
+ color: #2d2d2d;
89
+ margin-bottom: 22px;
90
+ letter-spacing: -0.6px;
91
+ line-height: 1.2;
92
+ }
93
+
94
+ .service-description {
95
+ font-family: 'DM Sans', sans-serif;
96
+ font-size: 18px;
97
+ font-weight: 400;
98
+ line-height: 1.7;
99
+ color: #5a5a5a;
100
+ }
101
+
102
+ .petal-container {
103
+ grid-column: 2;
104
+ grid-row: 1 / 3;
105
+ position: relative;
106
+ display: flex;
107
+ flex-wrap: wrap;
108
+ width: 100%;
109
+ height: 100%;
110
+ z-index: 1;
111
+ }
112
+
113
+ .petal {
114
+ position: absolute;
115
+ width: 50%;
116
+ height: 50%;
117
+ border-radius: 0 100% 0 0;
118
+ }
119
+
120
+ .petal-green {
121
+ background-color: #4a7c59;
122
+ }
123
+
124
+ .petal-brown {
125
+ background-color: #5a5346;
126
+ }
127
+
128
+ .petal.top-left {
129
+ top: 0;
130
+ left: 0;
131
+ border-radius: 0 100% 0 0;
132
+ transform-origin: bottom right;
133
+ }
134
+
135
+ .petal.top-right {
136
+ top: 0;
137
+ right: 0;
138
+ border-radius: 100% 0 0 0;
139
+ transform-origin: bottom left;
140
+ }
141
+
142
+ .petal.bottom-left {
143
+ bottom: 0;
144
+ left: 0;
145
+ border-radius: 0 0 100% 0;
146
+ transform-origin: top right;
147
+ }
148
+
149
+ .petal.bottom-right {
150
+ bottom: 0;
151
+ right: 0;
152
+ border-radius: 0 0 0 100%;
153
+ transform-origin: top left;
154
+ }
155
+
156
+ .petal-border {
157
+ position: absolute;
158
+ border: 1.5px dashed #c5c5c5;
159
+ }
160
+
161
+ .petal-border.horizontal-top {
162
+ top: 50%;
163
+ left: 0;
164
+ right: 0;
165
+ height: 0;
166
+ }
167
+
168
+ .petal-border.horizontal-bottom {
169
+ bottom: 50%;
170
+ left: 0;
171
+ right: 0;
172
+ height: 0;
173
+ }
174
+
175
+ .petal-border.vertical-left {
176
+ left: 50%;
177
+ top: 0;
178
+ bottom: 0;
179
+ width: 0;
180
+ }
181
+
182
+ .petal-border.vertical-right {
183
+ right: 50%;
184
+ top: 0;
185
+ bottom: 0;
186
+ width: 0;
187
+ }
188
+
189
+ .services-footer {
190
+ text-align: center;
191
+ }
192
+
193
+ .btn-learn-more {
194
+ display: inline-block;
195
+ background-color: #4a7c59;
196
+ color: white;
197
+ font-family: 'DM Sans', sans-serif;
198
+ font-size: 18px;
199
+ font-weight: 500;
200
+ padding: 22px 55px;
201
+ border-radius: 40px;
202
+ transition: all 0.3s ease;
203
+ cursor: pointer;
204
+ }
205
+
206
+ .btn-learn-more:hover {
207
+ background-color: #3d6849;
208
+ }
209
+
210
+ @media (max-width: 1400px) {
211
+ .services-grid {
212
+ grid-template-columns: 1fr;
213
+ grid-template-rows: auto;
214
+ gap: 50px;
215
+ }
216
+
217
+ .service-card {
218
+ grid-column: 1 !important;
219
+ grid-row: auto !important;
220
+ padding: 50px !important;
221
+ text-align: center;
222
+ }
223
+
224
+ .petal-container {
225
+ grid-column: 1;
226
+ grid-row: auto;
227
+ height: 450px;
228
+ }
229
+
230
+ .services-title {
231
+ font-size: 70px;
232
+ }
233
+
234
+ .service-title {
235
+ font-size: 48px;
236
+ }
237
+
238
+ .service-description {
239
+ font-size: 18px;
240
+ }
241
+ }
242
+
243
+ @media (max-width: 768px) {
244
+ .services {
245
+ padding: 90px 40px;
246
+ }
247
+
248
+ .services-title {
249
+ font-size: 56px;
250
+ }
251
+
252
+ .services-subtitle {
253
+ font-size: 19px;
254
+ }
255
+
256
+ .service-title {
257
+ font-size: 42px;
258
+ }
259
+
260
+ .service-description {
261
+ font-size: 17px;
262
+ }
263
+
264
+ .petal-container {
265
+ height: 350px;
266
+ }
267
+ }
frontend/src/components/ServicesSection.tsx ADDED
@@ -0,0 +1,151 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useEffect } from 'react'
2
+ import { motion } from 'framer-motion'
3
+ import { useTranslation } from 'react-i18next'
4
+ import gsap from 'gsap'
5
+ import { ScrollTrigger } from 'gsap/ScrollTrigger'
6
+ import './ServicesSection.css'
7
+
8
+ gsap.registerPlugin(ScrollTrigger)
9
+
10
+ function ServicesSection() {
11
+ useEffect(() => {
12
+ const cards = document.querySelectorAll('.service-card')
13
+ cards.forEach((card, index) => {
14
+ gsap.fromTo(card,
15
+ {
16
+ opacity: 0,
17
+ y: 60,
18
+ },
19
+ {
20
+ opacity: 1,
21
+ y: 0,
22
+ duration: 1,
23
+ delay: index * 0.1,
24
+ ease: 'power3.out',
25
+ scrollTrigger: {
26
+ trigger: card,
27
+ start: 'top 85%',
28
+ toggleActions: 'play none none reverse'
29
+ }
30
+ }
31
+ )
32
+ })
33
+
34
+ const title = document.querySelector('.services-title')
35
+ if (title) {
36
+ gsap.fromTo(title,
37
+ { opacity: 0, y: -50 },
38
+ {
39
+ opacity: 1,
40
+ y: 0,
41
+ duration: 1,
42
+ ease: 'power3.out',
43
+ scrollTrigger: {
44
+ trigger: title,
45
+ start: 'top 85%'
46
+ }
47
+ }
48
+ )
49
+ }
50
+
51
+ const subtitle = document.querySelector('.services-subtitle')
52
+ if (subtitle) {
53
+ gsap.fromTo(subtitle,
54
+ { opacity: 0, y: -30 },
55
+ {
56
+ opacity: 1,
57
+ y: 0,
58
+ duration: 0.8,
59
+ delay: 0.2,
60
+ ease: 'power3.out',
61
+ scrollTrigger: {
62
+ trigger: subtitle,
63
+ start: 'top 85%'
64
+ }
65
+ }
66
+ )
67
+ }
68
+ }, [])
69
+
70
+ const { t } = useTranslation()
71
+
72
+ return (
73
+ <section className="services">
74
+ <div className="services-container">
75
+ <motion.div
76
+ className="services-header"
77
+ initial={{ opacity: 0, y: -40 }}
78
+ whileInView={{ opacity: 1, y: 0 }}
79
+ viewport={{ once: true }}
80
+ transition={{ duration: 0.8 }}
81
+ >
82
+ <h2 className="services-title">{t('services.title')}</h2>
83
+ <p className="services-subtitle">
84
+ {t('services.subtitle')}
85
+ </p>
86
+ </motion.div>
87
+
88
+ <div className="services-grid">
89
+ <div className="service-card card-left-top">
90
+ <h3 className="service-title">{t('services.cards.preventive.title')}</h3>
91
+ <p className="service-description">
92
+ {t('services.cards.preventive.description')}
93
+ </p>
94
+ </div>
95
+
96
+ <div className="petal-container">
97
+ <div className="petal petal-green top-left" />
98
+ <div className="petal petal-brown top-right" />
99
+ <div className="petal petal-brown bottom-left" />
100
+ <div className="petal petal-green bottom-right" />
101
+ <div className="petal-border horizontal-top" />
102
+ <div className="petal-border horizontal-bottom" />
103
+ <div className="petal-border vertical-left" />
104
+ <div className="petal-border vertical-right" />
105
+ </div>
106
+
107
+ <div className="service-card card-right-top">
108
+ <h3 className="service-title">{t('services.cards.tracking.title')}</h3>
109
+ <p className="service-description">
110
+ {t('services.cards.tracking.description')}
111
+ </p>
112
+ </div>
113
+
114
+ <div className="service-card card-left-bottom">
115
+ <h3 className="service-title">{t('services.cards.reminders.title')}</h3>
116
+ <p className="service-description">
117
+ {t('services.cards.reminders.description')}
118
+ </p>
119
+ </div>
120
+
121
+ <div className="service-card card-right-bottom">
122
+ <h3 className="service-title">{t('services.cards.index.title')}</h3>
123
+ <p className="service-description">
124
+ {t('services.cards.index.description')}
125
+ </p>
126
+ </div>
127
+ </div>
128
+
129
+ <motion.div
130
+ className="services-footer"
131
+ initial={{ opacity: 0, y: 30 }}
132
+ whileInView={{ opacity: 1, y: 0 }}
133
+ viewport={{ once: true }}
134
+ transition={{ duration: 0.8, delay: 0.4 }}
135
+ >
136
+ <motion.a
137
+ href="#"
138
+ className="btn-learn-more"
139
+ whileHover={{ scale: 1.05 }}
140
+ whileTap={{ scale: 0.95 }}
141
+ transition={{ type: 'spring', stiffness: 400, damping: 10 }}
142
+ >
143
+ Learn More
144
+ </motion.a>
145
+ </motion.div>
146
+ </div>
147
+ </section>
148
+ )
149
+ }
150
+
151
+ export default ServicesSection
frontend/src/components/Testimonials.css ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .testimonials {
2
+ min-height: 100vh;
3
+ padding: 100px 80px;
4
+ background-color: #3d3d3d;
5
+ display: flex;
6
+ align-items: center;
7
+ }
8
+
9
+ .testimonials-container {
10
+ max-width: 1200px;
11
+ margin: 0 auto;
12
+ width: 100%;
13
+ }
14
+
15
+ .testimonial-content {
16
+ color: white;
17
+ text-align: center;
18
+ }
19
+
20
+ .testimonial-label {
21
+ font-family: 'DM Sans', sans-serif;
22
+ font-size: 18px;
23
+ font-weight: 400;
24
+ color: #7ba88a;
25
+ margin-bottom: 40px;
26
+ letter-spacing: 0.5px;
27
+ }
28
+
29
+ .article-title {
30
+ font-family: 'Cormorant Garamond', serif;
31
+ font-size: 48px;
32
+ font-weight: 500;
33
+ line-height: 1.3;
34
+ color: #ffffff;
35
+ margin-bottom: 25px;
36
+ letter-spacing: -0.5px;
37
+ }
38
+
39
+ .article-meta {
40
+ display: flex;
41
+ align-items: center;
42
+ justify-content: center;
43
+ gap: 12px;
44
+ margin-bottom: 30px;
45
+ }
46
+
47
+ .article-source {
48
+ font-family: 'DM Sans', sans-serif;
49
+ font-size: 16px;
50
+ font-weight: 500;
51
+ color: #7ba88a;
52
+ }
53
+
54
+ .article-divider {
55
+ color: #7ba88a;
56
+ font-size: 14px;
57
+ }
58
+
59
+ .article-date {
60
+ font-family: 'DM Sans', sans-serif;
61
+ font-size: 16px;
62
+ font-weight: 400;
63
+ color: #b8b8b8;
64
+ }
65
+
66
+ .article-snippet {
67
+ font-family: 'DM Sans', sans-serif;
68
+ font-size: 20px;
69
+ font-weight: 400;
70
+ line-height: 1.7;
71
+ color: #d8d8d8;
72
+ margin-bottom: 35px;
73
+ max-width: 900px;
74
+ margin-left: auto;
75
+ margin-right: auto;
76
+ }
77
+
78
+ .article-link {
79
+ display: inline-block;
80
+ font-family: 'DM Sans', sans-serif;
81
+ font-size: 18px;
82
+ font-weight: 500;
83
+ color: #7ba88a;
84
+ text-decoration: none;
85
+ border-bottom: 2px solid transparent;
86
+ transition: all 0.3s ease;
87
+ }
88
+
89
+ .article-link:hover {
90
+ border-bottom-color: #7ba88a;
91
+ color: #9bc5a9;
92
+ }
93
+
94
+ .testimonial-controls {
95
+ display: flex;
96
+ gap: 20px;
97
+ justify-content: center;
98
+ margin-top: 50px;
99
+ }
100
+
101
+ .control-btn {
102
+ width: 55px;
103
+ height: 55px;
104
+ border: 2px solid rgba(255, 255, 255, 0.3);
105
+ border-radius: 50%;
106
+ background: transparent;
107
+ color: white;
108
+ display: flex;
109
+ align-items: center;
110
+ justify-content: center;
111
+ cursor: pointer;
112
+ transition: all 0.3s ease;
113
+ }
114
+
115
+ .control-btn:hover {
116
+ border-color: #7ba88a;
117
+ background-color: rgba(123, 168, 138, 0.1);
118
+ transform: scale(1.05);
119
+ }
120
+
121
+ .control-btn:active {
122
+ transform: scale(0.95);
123
+ }
124
+
125
+ @media (max-width: 1200px) {
126
+ .testimonials-container {
127
+ grid-template-columns: 1fr;
128
+ gap: 60px;
129
+ }
130
+
131
+ .testimonial-content {
132
+ padding-right: 0;
133
+ text-align: center;
134
+ }
135
+
136
+ .testimonial-controls {
137
+ justify-content: center;
138
+ }
139
+
140
+ .testimonial-quote {
141
+ font-size: 36px;
142
+ }
143
+
144
+ .author-name {
145
+ font-size: 32px;
146
+ }
147
+ }
148
+
149
+ @media (max-width: 768px) {
150
+ .testimonials {
151
+ padding: 80px 40px;
152
+ }
153
+
154
+ .testimonial-quote {
155
+ font-size: 30px;
156
+ }
157
+
158
+ .author-name {
159
+ font-size: 28px;
160
+ }
161
+
162
+ .control-btn {
163
+ width: 50px;
164
+ height: 50px;
165
+ }
166
+ }
frontend/src/components/Testimonials.tsx ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useState } from 'react'
2
+ import { motion, AnimatePresence } from 'framer-motion'
3
+ import { useTranslation } from 'react-i18next'
4
+ import './Testimonials.css'
5
+
6
+ function Testimonials() {
7
+ const { t } = useTranslation()
8
+ const [currentIndex, setCurrentIndex] = useState(0)
9
+
10
+ const articles = [
11
+ {
12
+ title: t('news.articles.abha.title'),
13
+ source: t('news.articles.abha.source'),
14
+ date: '14 Oct 2024',
15
+ snippet: t('news.articles.abha.snippet'),
16
+ link: 'https://pib.gov.in/PressReleaseIframePage.aspx?PRID=2064531'
17
+ },
18
+ {
19
+ title: t('news.articles.nppa.title'),
20
+ source: t('news.articles.nppa.source'),
21
+ date: '9 Dec 2025',
22
+ snippet: t('news.articles.nppa.snippet'),
23
+ link: 'https://pib.gov.in/PressReleasePage.aspx?PRID=2087562'
24
+ },
25
+ {
26
+ title: t('news.articles.ocr.title'),
27
+ source: t('news.articles.ocr.source'),
28
+ date: '12 Dec 2024',
29
+ snippet: t('news.articles.ocr.snippet'),
30
+ link: 'https://www.healthcareittoday.com/2024/12/12/ocr-transforms-healthcare-document-management/'
31
+ }
32
+ ]
33
+
34
+ const handlePrevious = () => {
35
+ setCurrentIndex((prev) => (prev === 0 ? articles.length - 1 : prev - 1))
36
+ }
37
+
38
+ const handleNext = () => {
39
+ setCurrentIndex((prev) => (prev === articles.length - 1 ? 0 : prev + 1))
40
+ }
41
+
42
+ return (
43
+ <section className="testimonials">
44
+ <div className="testimonials-container">
45
+ <div className="testimonial-content">
46
+ <motion.p
47
+ className="testimonial-label"
48
+ initial={{ opacity: 0, y: -20 }}
49
+ whileInView={{ opacity: 1, y: 0 }}
50
+ viewport={{ once: true }}
51
+ transition={{ duration: 0.6 }}
52
+ >
53
+ {t('news.label')}
54
+ </motion.p>
55
+
56
+ <AnimatePresence mode="wait">
57
+ <motion.div
58
+ key={currentIndex}
59
+ initial={{ opacity: 0, y: 30 }}
60
+ animate={{ opacity: 1, y: 0 }}
61
+ exit={{ opacity: 0, y: -30 }}
62
+ transition={{ duration: 0.5 }}
63
+ >
64
+ <h2 className="article-title">
65
+ {articles[currentIndex].title}
66
+ </h2>
67
+
68
+ <div className="article-meta">
69
+ <span className="article-source">{articles[currentIndex].source}</span>
70
+ <span className="article-divider">•</span>
71
+ <span className="article-date">{articles[currentIndex].date}</span>
72
+ </div>
73
+
74
+ <p className="article-snippet">
75
+ {articles[currentIndex].snippet}
76
+ </p>
77
+
78
+ <a
79
+ href={articles[currentIndex].link}
80
+ target="_blank"
81
+ rel="noopener noreferrer"
82
+ className="article-link"
83
+ >
84
+ {t('news.readMore')} →
85
+ </a>
86
+ </motion.div>
87
+ </AnimatePresence>
88
+
89
+ <div className="testimonial-controls">
90
+ <button
91
+ className="control-btn prev-btn"
92
+ onClick={handlePrevious}
93
+ aria-label="Previous article"
94
+ >
95
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none">
96
+ <path d="M12 4L6 10L12 16" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
97
+ </svg>
98
+ </button>
99
+ <button
100
+ className="control-btn next-btn"
101
+ onClick={handleNext}
102
+ aria-label="Next article"
103
+ >
104
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none">
105
+ <path d="M8 4L14 10L8 16" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
106
+ </svg>
107
+ </button>
108
+ </div>
109
+ </div>
110
+ </div>
111
+ </section>
112
+ )
113
+ }
114
+
115
+ export default Testimonials
frontend/src/i18n/config.ts ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import i18n from 'i18next';
2
+ import { initReactI18next } from 'react-i18next';
3
+ import LanguageDetector from 'i18next-browser-languagedetector';
4
+
5
+ import en from './locales/en.json';
6
+ import hi from './locales/hi.json';
7
+ import mr from './locales/mr.json';
8
+
9
+ i18n
10
+ .use(LanguageDetector)
11
+ .use(initReactI18next)
12
+ .init({
13
+ resources: {
14
+ en: { translation: en },
15
+ hi: { translation: hi },
16
+ mr: { translation: mr }
17
+ },
18
+ fallbackLng: 'en',
19
+ supportedLngs: ['en', 'hi', 'mr'],
20
+ interpolation: {
21
+ escapeValue: false
22
+ },
23
+ detection: {
24
+ order: ['localStorage', 'navigator'],
25
+ caches: ['localStorage']
26
+ }
27
+ });
28
+
29
+ export default i18n;
frontend/src/i18n/locales/en.json ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "header": {
3
+ "nav": {
4
+ "features": "Features",
5
+ "howItWorks": "How It Works",
6
+ "privacySecurity": "Privacy & Security",
7
+ "news": "News",
8
+ "faq": "FAQ",
9
+ "contact": "Contact"
10
+ },
11
+ "cta": "Get Started"
12
+ },
13
+ "hero": {
14
+ "tagline": "First priority is",
15
+ "taglineHighlight": "your health",
16
+ "subtitle": "Track it. Understand it. Prevent it.",
17
+ "description": "Upload your lab reports, get them interpreted, and receive smart reminders for checkups + medicines. Co-Code GGW helps you stay preventive—without becoming your doctor.",
18
+ "disclaimer": "Not medical advice. Always consult a licensed clinician for diagnosis/treatment.",
19
+ "cta": {
20
+ "upload": "Upload Reports",
21
+ "howItWorks": "See How It Works"
22
+ },
23
+ "images": {
24
+ "labReport": "Person scanning lab report on phone",
25
+ "dashboard": "Doctor reviewing health dashboard analytics",
26
+ "smartwatch": "Smartwatch health metrics tracking",
27
+ "medicine": "Medicine blister pack and pharmacy"
28
+ }
29
+ },
30
+ "services": {
31
+ "title": "Unified Medical Platform",
32
+ "subtitle": "One secure place for your reports, reminders, and health insights.",
33
+ "cards": {
34
+ "preventive": {
35
+ "title": "Preventive",
36
+ "description": "Personalized checkup schedule based on age, history, BMI, and past reports."
37
+ },
38
+ "tracking": {
39
+ "title": "Mindful Tracking",
40
+ "description": "Log food habits and lifestyle choices to identify patterns."
41
+ },
42
+ "reminders": {
43
+ "title": "Smart Reminders",
44
+ "description": "Dynamic alerts for checkups and medicines based on your health profile."
45
+ },
46
+ "index": {
47
+ "title": "Health Index",
48
+ "description": "Simple score showing trends and what needs attention in your health data."
49
+ }
50
+ }
51
+ },
52
+ "howItWorks": {
53
+ "title": "How Co-Code GGW Works",
54
+ "subtitle": "Upload reports, get insights, and stay on top of preventive care—all in one secure platform.",
55
+ "features": {
56
+ "ocr": {
57
+ "title": "Report OCR",
58
+ "description": "Upload blood tests, dental reports, scans—extract key values automatically."
59
+ },
60
+ "reminders": {
61
+ "title": "Smart Reminders",
62
+ "description": "Dynamic reminders for checkups + medicines based on your profile and history."
63
+ },
64
+ "index": {
65
+ "title": "Health Index",
66
+ "description": "Your health score + trends, highlighting areas that need attention."
67
+ }
68
+ },
69
+ "cta": "View All Features"
70
+ },
71
+ "belief": {
72
+ "message": "Most health issues don't start as emergencies. They start quietly. Co-Code GGW keeps your health history organized and nudges you at the right time—so prevention becomes automatic.",
73
+ "tagline": "Built as a suggestion system, not a doctor."
74
+ },
75
+ "news": {
76
+ "label": "In the News",
77
+ "readMore": "Read more",
78
+ "articles": {
79
+ "abha": {
80
+ "title": "India's ABHA Digital Mission Crosses 600M Records",
81
+ "source": "Ministry of Health & Family Welfare",
82
+ "snippet": "The Ayushman Bharat Digital Mission has generated over 600 million Ayushman Bharat Health Accounts (ABHA), enabling citizens to securely store and share their medical records digitally."
83
+ },
84
+ "nppa": {
85
+ "title": "NPPA Ensures Pricing Measures for Essential Medicines",
86
+ "source": "Press Information Bureau",
87
+ "snippet": "The National Pharmaceutical Pricing Authority announced new measures to regulate prices of 800+ essential drugs, aiming to improve accessibility and affordability for preventive care."
88
+ },
89
+ "ocr": {
90
+ "title": "OCR Transforms Healthcare Document Management",
91
+ "source": "Healthcare IT Today",
92
+ "snippet": "Optical Character Recognition technology is revolutionizing how healthcare providers extract and analyze medical records, reducing manual data entry errors by up to 90%."
93
+ }
94
+ }
95
+ },
96
+ "faq": {
97
+ "title": "The Art Of",
98
+ "titleHighlight": "Prevention",
99
+ "subtitle": "Co-Code GGW makes preventive care simple. Upload reports, track trends, and get nudges at the right time—so staying healthy doesn't feel like work.",
100
+ "items": {
101
+ "isDoctor": {
102
+ "question": "Is Co-Code GGW a doctor?",
103
+ "answer": "No. Co-Code GGW is not a doctor and does not provide medical advice, diagnosis, or treatment. It is a suggestion system that helps you organize lab reports, track health trends, and receive smart reminders—always consult a licensed clinician for medical decisions."
104
+ },
105
+ "reports": {
106
+ "question": "What reports can I upload?",
107
+ "answer": "You can upload lab reports, diagnostic images, prescriptions, and medical documents in PDF, JPG, or PNG format. Our OCR extracts key values like glucose, cholesterol, hemoglobin, and more."
108
+ },
109
+ "ocr": {
110
+ "question": "How does OCR work and what do you extract?",
111
+ "answer": "Optical Character Recognition (OCR) scans your uploaded reports and automatically extracts biomarker values, test names, dates, and reference ranges. This eliminates manual data entry and enables trend analysis over time."
112
+ },
113
+ "reminders": {
114
+ "question": "How are reminders personalized?",
115
+ "answer": "Based on your report history, age, and past checkup dates, Co-Code GGW suggests when to schedule follow-ups, refill medicines, or repeat tests. Reminders adapt dynamically as you upload new reports."
116
+ },
117
+ "security": {
118
+ "question": "How do you keep my data secure?",
119
+ "answer": "All reports are encrypted at rest and in transit. We follow HIPAA-equivalent security standards, use multi-factor authentication, and never share your data with third parties without explicit consent."
120
+ },
121
+ "export": {
122
+ "question": "Can I export or delete my data?",
123
+ "answer": "Yes. You can export all your reports and extracted data as a ZIP file anytime. You also have the right to permanently delete your account and all associated data from our servers."
124
+ }
125
+ }
126
+ },
127
+ "footer": {
128
+ "description": "Unified Medical Platform for preventive care. Upload reports, track trends, and get nudges at the right time—so staying healthy doesn't feel like work.",
129
+ "product": {
130
+ "title": "Product"
131
+ },
132
+ "cta": {
133
+ "title": "Ready to take control of your health?",
134
+ "contact": "Contact Us",
135
+ "demo": "Book Demo"
136
+ },
137
+ "bottom": {
138
+ "privacy": "Privacy",
139
+ "terms": "Terms",
140
+ "copyright": "Copyright @2026 - Made by team GitGoneWild"
141
+ }
142
+ },
143
+ "language": {
144
+ "select": "Select Language",
145
+ "english": "English",
146
+ "hindi": "हिंदी",
147
+ "marathi": "मराठी"
148
+ }
149
+ }
frontend/src/i18n/locales/hi.json ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "header": {
3
+ "nav": {
4
+ "features": "विशेषताएं",
5
+ "howItWorks": "यह कैसे काम करता है",
6
+ "privacySecurity": "गोपनीयता और सुरक्षा",
7
+ "news": "समाचार",
8
+ "faq": "सामान्य प्रश्न",
9
+ "contact": "संपर्क करें"
10
+ },
11
+ "cta": "शुरू करें"
12
+ },
13
+ "hero": {
14
+ "tagline": "सबसे पहली प्राथमिकता है",
15
+ "taglineHighlight": "आपका स्वास्थ्य",
16
+ "subtitle": "ट्रैक करें। समझें। रोकें।",
17
+ "description": "अपनी जांच रिपोर्ट अपलोड करें, उनका विश्लेषण प्राप्त करें, और नियमित जांच व दवाइयों के लिए स्मार्ट स्मरण पाएं। Co-Code GGW आपको रोकथाम में मदद करता है—आपके डॉक्टर बने बिना।",
18
+ "disclaimer": "यह चिकित्सा सलाह नहीं है। निदान/उपचार के लिए हमेशा लाइसेंस प्राप्त चिकित्सक से परामर्श करें।",
19
+ "cta": {
20
+ "upload": "रिपोर्ट अपलोड करें",
21
+ "howItWorks": "देखें यह कैसे काम करता है"
22
+ },
23
+ "images": {
24
+ "labReport": "फोन पर जांच रिपोर्ट स्कैन करता व्यक्ति",
25
+ "dashboard": "स्वास्थ्य डैशबोर्ड विश्लेषण देखते डॉक्टर",
26
+ "smartwatch": "स्मार्टवॉच स्वास्थ्य मेट्रिक्स ट्रैकिंग",
27
+ "medicine": "दवाइयों का पैकेट और फार्मेसी"
28
+ }
29
+ },
30
+ "services": {
31
+ "title": "एकीकृत चिकित्सा मंच",
32
+ "subtitle": "आपकी रिपोर्ट, स्मरण, और स्वास्थ्य जानकारी के लिए एक सुरक्षित स्थान।",
33
+ "cards": {
34
+ "preventive": {
35
+ "title": "रोकथाम",
36
+ "description": "उम्र, इतिहास, BMI, और पिछली रिपोर्ट के आधार पर व्यक्तिगत जांच कार्यक्रम।"
37
+ },
38
+ "tracking": {
39
+ "title": "सचेत ट्रैकिंग",
40
+ "description": "खान-पान की आदतें और जीवनशैली दर्ज करें ताकि पैटर्न पहचान सकें।"
41
+ },
42
+ "reminders": {
43
+ "title": "स्मार्ट स्मरण",
44
+ "description": "आपके स्वास्थ्य प्रोफ़ाइल के आधार पर जांच और दवाइयों के लिए गतिशील अलर्ट।"
45
+ },
46
+ "index": {
47
+ "title": "स्वास्थ्य सूचकांक",
48
+ "description": "सरल स्कोर जो रुझान दिखाता है और बताता है कि आपके स्वास्थ्य डेटा में किस पर ध्यान देना है।"
49
+ }
50
+ }
51
+ },
52
+ "howItWorks": {
53
+ "title": "Co-Code GGW कैसे काम करता है",
54
+ "subtitle": "रिपोर्ट अपलोड करें, जानकारी पाएं, और एक सुरक्षित मंच पर रोकथाम देखभाल के शीर्ष पर रहें।",
55
+ "features": {
56
+ "ocr": {
57
+ "title": "रिपोर्ट OCR",
58
+ "description": "रक्त परीक्षण, दंत रिपोर्ट, स्कैन अपलोड करें—मुख्य मान स्वचालित रूप से निकालें।"
59
+ },
60
+ "reminders": {
61
+ "title": "स्मार्ट स्मरण",
62
+ "description": "आपके प्रोफ़ाइल और इतिहास के आधार पर जांच और दवाइयों के लिए गतिशील स्मरण।"
63
+ },
64
+ "index": {
65
+ "title": "स्वास्थ्य सूचकांक",
66
+ "description": "आपका स्वास्थ्य स्कोर और रुझान, उन क्षेत्रों को उजागर करते हुए जिन पर ध्यान देने की जरूरत है।"
67
+ }
68
+ },
69
+ "cta": "सभी विशेषताएं देखें"
70
+ },
71
+ "belief": {
72
+ "message": "अधिकतर स्वास्थ्य समस्याएं आपातकाल के रूप में शुरू नहीं होतीं। वे चुपचाप शुरू होती हैं। Co-Code GGW आपके स्वास्थ्य इतिहास को व्यवस्थित रखता है और सही समय पर आपको याद दिलाता है—ताकि रोकथाम स्वचालित हो जाए।",
73
+ "tagline": "एक सुझाव प्रणाली के रूप में बनाया गया, डॉक्टर के रूप में नहीं।"
74
+ },
75
+ "news": {
76
+ "label": "समाचारों में",
77
+ "readMore": "और पढ़ें",
78
+ "articles": {
79
+ "abha": {
80
+ "title": "भारत का ABHA डिजिटल मिशन 60 करोड़ रिकॉर्ड पार",
81
+ "source": "स्वास्थ्य और परिवार कल्याण मंत्रालय",
82
+ "snippet": "आयुष्मान भारत डिजिटल मिशन ने 60 करोड़ से अधिक आयुष्मान भारत स्वास्थ्य खाते (ABHA) बनाए हैं, जो नागरिकों को अपने चिकित्सा रिकॉर्ड सुरक्षित रूप से संग्रहीत और साझा करने में सक्षम बनाता है।"
83
+ },
84
+ "nppa": {
85
+ "title": "NPPA आवश्यक दवाइयों के लिए मूल्य निर्धारण उपाय सुनिश्चित करता है",
86
+ "source": "प्रेस सूचना ब्यूरो",
87
+ "snippet": "राष्ट्रीय फार्मास्युटिकल मूल्य निर्धारण प्राधिकरण ने 800+ आवश्यक दवाओं की कीमतों को विनियमित करने के लिए नए उपायों की घोषणा की, जिसका उद्देश्य रोकथाम देखभाल के लिए पहुंच और सामर्थ्य में सुधार करना है।"
88
+ },
89
+ "ocr": {
90
+ "title": "OCR स्वास्थ्य दस्तावेज़ प्रबंधन को बदल रहा है",
91
+ "source": "Healthcare IT Today",
92
+ "snippet": "ऑप्टिकल कैरेक्टर रिकग्निशन तकनीक स्वास्थ्य सेवा प्रदाताओं द्वारा चिकित्सा रिकॉर्ड निकालने और विश्लेषण करने के तरीके में क्रांति ला रही है, मैनुअल डेटा एंट्री त्रुटियों को 90% तक कम कर रही है।"
93
+ }
94
+ }
95
+ },
96
+ "faq": {
97
+ "title": "रोकथाम की",
98
+ "titleHighlight": "कला",
99
+ "subtitle": "Co-Code GGW रोकथाम देखभाल को सरल बनाता है। रिपोर्ट अपलोड करें, रुझान ट्रैक करें, और सही समय पर याद दिलाएं—ताकि स्वस्थ रहना काम जैसा न लगे।",
100
+ "items": {
101
+ "isDoctor": {
102
+ "question": "क्या Co-Code GGW एक डॉक्टर है?",
103
+ "answer": "नहीं। Co-Code GGW डॉक्टर नहीं है और चिकित्सा सलाह, निदान या उपचार प्रदान नहीं करता है। यह एक सुझाव प्रणाली है जो आपको जांच रिपोर्ट व्यवस्थित करने, स्वास्थ्य रुझान ट्रैक करने और स्मार्ट स्मरण प्राप्त करने में मदद करती है—चिकित्सा निर्णयों के लिए हमेशा लाइसेंस प्राप्त चिकित्सक से परामर्श करें।"
104
+ },
105
+ "reports": {
106
+ "question": "मैं कौन सी रिपोर्ट अपलोड कर सकता हूं?",
107
+ "answer": "आप PDF, JPG, या PNG प्रारूप में जांच रिपोर्ट, नैदानिक छवियां, नुस्खे और चिकित्सा दस्तावेज़ अपलोड कर सकते हैं। हमारा OCR ग्लूकोज़, कोलेस्ट्रॉल, हीमोग्लोबिन जैसे ���ुख्य मान निकालता है।"
108
+ },
109
+ "ocr": {
110
+ "question": "OCR कैसे काम करता है और आप क्या निकालते हैं?",
111
+ "answer": "ऑप्टिकल कैरेक्टर रिकग्निशन (OCR) आपकी अपलोड की गई रिपोर्ट को स्कैन करता है और स्वचालित रूप से बायोमार्कर मान, परीक्षण नाम, तारीखें और संदर्भ रेंज निकालता है। यह मैनुअल डेटा एंट्री को समाप्त करता है और समय के साथ रुझान विश्लेषण को सक्षम बनाता है।"
112
+ },
113
+ "reminders": {
114
+ "question": "स्मरण कैसे व्यक्तिगत किए जाते हैं?",
115
+ "answer": "आपकी रिपोर्ट इतिहास, उम्र और पिछली जांच तिथियों के आधार पर, Co-Code GGW सुझाव देता है कि फॉलो-अप कब शेड्यूल करें, दवाइयां फिर से भरें या परीक्षण दोहराएं। स्मरण गतिशील रूप से अनुकूलित होते हैं जैसे-जैसे आप नई रिपोर्ट अपलोड करते हैं।"
116
+ },
117
+ "security": {
118
+ "question": "आप मेरा डेटा कैसे सुरक्षित रखते हैं?",
119
+ "answer": "सभी रिपोर्ट आराम और ट्रांजिट में एन्क्रिप्ट की जाती हैं। हम HIPAA-समतुल्य सुरक्षा मानकों का पालन करते हैं, मल्टी-फैक्टर प्रमाणीकरण का उपयोग करते हैं, और स्पष्ट सहमति के बिना तीसरे पक्षों के साथ आपका डेटा कभी साझा नहीं करते।"
120
+ },
121
+ "export": {
122
+ "question": "क्या मैं अपना डेटा निर्यात या हटा सकता हूं?",
123
+ "answer": "हां। आप किसी भी समय अपनी सभी रिपोर्ट और निकाले गए डेटा को ZIP फ़ाइल के रूप में निर्यात कर सकते हैं। आपको हमारे सर्वर से अपना खाता और सभी संबंधित डेटा स्थायी रूप से हटाने का भी अधिकार है।"
124
+ }
125
+ }
126
+ },
127
+ "footer": {
128
+ "description": "रोकथाम देखभाल के लिए एकीकृत चिकित्सा मंच। रिपोर्ट अपलोड करें, रुझान ट्रैक करें, और सही समय पर याद दिलाएं—ताकि स्वस्थ रहना काम जैसा न लगे।",
129
+ "product": {
130
+ "title": "उत्पाद"
131
+ },
132
+ "cta": {
133
+ "title": "अपने स्वास्थ्य पर नियंत्रण लेने के लिए तैयार?",
134
+ "contact": "हमसे संपर्क करें",
135
+ "demo": "डेमो बुक करें"
136
+ },
137
+ "bottom": {
138
+ "privacy": "गोपनीयता",
139
+ "terms": "नियम और शर्तें",
140
+ "copyright": "कॉपीराइट @2026 - टीम GitGoneWild द्वारा निर्मित"
141
+ }
142
+ },
143
+ "language": {
144
+ "select": "भाषा चुनें",
145
+ "english": "English",
146
+ "hindi": "हिंदी",
147
+ "marathi": "मराठी"
148
+ }
149
+ }
frontend/src/i18n/locales/mr.json ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "header": {
3
+ "nav": {
4
+ "features": "वैशिष्ट्ये",
5
+ "howItWorks": "हे कसे काम करते",
6
+ "privacySecurity": "गोपनीयता आणि सुरक्षा",
7
+ "news": "बातम्या",
8
+ "faq": "सामान्य प्रश्न",
9
+ "contact": "संपर्क करा"
10
+ },
11
+ "cta": "सुरू करा"
12
+ },
13
+ "hero": {
14
+ "tagline": "पहिली प्राधान्यता आहे",
15
+ "taglineHighlight": "तुमचे आरोग्य",
16
+ "subtitle": "ट्रॅक करा। समजून घ्या। प्रतिबंध करा।",
17
+ "description": "तुमचे तपासणी अहवाल अपलोड करा, त्यांचे विश्लेषण मिळवा, आणि नियमित तपासणी व औषधांसाठी स्मार्ट स्मरणपत्र मिळवा। Co-Code GGW तुम्हाला प्रतिबंधात मदत करते—तुमचे डॉक्टर न बनता।",
18
+ "disclaimer": "हा वैद्यकीय सल्ला नाही. निदान/उपचारासाठी नेहमी परवानाधारक वैद्यांचा सल्ला घ्या।",
19
+ "cta": {
20
+ "upload": "अहवाल अपलोड करा",
21
+ "howItWorks": "पहा हे कसे काम करते"
22
+ },
23
+ "images": {
24
+ "labReport": "फोनवर तपासणी अहवाल स्कॅन करणारी व्यक्ती",
25
+ "dashboard": "आरोग्य डॅशबोर्ड विश्लेषण पाहणारे डॉक्टर",
26
+ "smartwatch": "स्मार्टवॉच आरोग्य मेट्रिक्स ट्रॅकिंग",
27
+ "medicine": "औषधांचे पॅकेट आणि फार्मसी"
28
+ }
29
+ },
30
+ "services": {
31
+ "title": "एकत्रित वैद्यकीय व्यासपीठ",
32
+ "subtitle": "तुमचे अहवाल, स्मरणपत्र आणि आरोग्य माहितीसाठी एक सुरक्षित ठिकाण।",
33
+ "cards": {
34
+ "preventive": {
35
+ "title": "प्रतिबंधात्मक",
36
+ "description": "वय, इतिहास, BMI आणि मागील अहवालांवर आधारित वैयक्तिक तपासणी वेळापत्रक।"
37
+ },
38
+ "tracking": {
39
+ "title": "जागरूक ट्रॅकिंग",
40
+ "description": "खाण्याच्या सवयी आणि जीवनशैली नोंदवा जेणेकरून पॅटर्न ओळखू शकता।"
41
+ },
42
+ "reminders": {
43
+ "title": "स्मार्ट स्मरणपत्र",
44
+ "description": "तुमच्या आरोग्य प्रोफाइलवर आधारित तपासणी आणि औषधांसाठी डायनॅमिक सूचना।"
45
+ },
46
+ "index": {
47
+ "title": "आरोग्य निर्देशांक",
48
+ "description": "साधा स्कोर जो ट्रेंड दाखवतो आणि सांगतो की तुमच्या आरोग्य डेटामध्ये कशावर लक्ष देणे आवश्यक आहे।"
49
+ }
50
+ }
51
+ },
52
+ "howItWorks": {
53
+ "title": "Co-Code GGW कसे काम करते",
54
+ "subtitle": "अहवाल अपलोड करा, माहिती मिळवा आणि एका सुरक्षित व्यासपीठावर प्रतिबंधात्मक काळजीच्या शीर्षस्थानी रहा।",
55
+ "features": {
56
+ "ocr": {
57
+ "title": "अहवाल OCR",
58
+ "description": "रक्त चाचण्या, दंत अहवाल, स्कॅन अपलोड करा—मुख्य मूल्ये आपोआप काढा।"
59
+ },
60
+ "reminders": {
61
+ "title": "स्मार्ट स्मरणपत्र",
62
+ "description": "तुमच्या प्रोफाइल आणि इतिहासावर आधारित तपासणी आणि औषधांसाठी डायनॅमिक स्मरणपत्र।"
63
+ },
64
+ "index": {
65
+ "title": "आरोग्य निर्देशांक",
66
+ "description": "तुमचा आरोग्य स्कोर आणि ट्रेंड, त्या क्षेत्रांना ठळक करत ज्यांवर लक्ष देणे आवश्यक आहे।"
67
+ }
68
+ },
69
+ "cta": "सर्व वैशिष��ट्ये पहा"
70
+ },
71
+ "belief": {
72
+ "message": "बहुतेक आरोग्य समस्या आणीबाणी म्हणून सुरू होत नाहीत. त्या शांतपणे सुरू होतात। Co-Code GGW तुमचा आरोग्य इतिहास व्यवस्थित ठेवते आणि योग्य वेळी तुम्हाला आठवण करून देते—जेणेकरून प्रतिबंध स्वयंचलित होईल।",
73
+ "tagline": "एक सूचना प्रणाली म्हणून तयार केले, डॉक्टर म्हणून नाही।"
74
+ },
75
+ "news": {
76
+ "label": "बातम्यांमध्ये",
77
+ "readMore": "अधिक वाचा",
78
+ "articles": {
79
+ "abha": {
80
+ "title": "भारताचे ABHA डिजिटल मिशन 60 कोटी रेकॉर्ड पार",
81
+ "source": "आरोग्य आणि कुटुंब कल्याण मंत्रालय",
82
+ "snippet": "आयुष्मान भारत डिजिटल मिशनने 60 कोटींहून अधिक आयुष्मान भारत आरोग्य खाती (ABHA) तयार केली आहेत, जी नागरिकांना त्यांचे वैद्यकीय रेकॉर्ड सुरक्षितपणे साठवण्यास आणि सामायिक करण्यास सक्षम करते।"
83
+ },
84
+ "nppa": {
85
+ "title": "NPPA आवश्यक औषधांसाठी किंमत निर्धारण उपाय सुनिश्चित करते",
86
+ "source": "प्रेस माहिती ब्युरो",
87
+ "snippet": "राष्ट्रीय फार्मास्युटिकल किंमत निर्धारण प्राधिकरणाने 800+ आवश्यक औषधांच्या किमती नियंत्रित करण्यासाठी नवीन उपायांची घोषणा केली, ज्याचा उद्देश प्रतिबंधात्मक काळजीसाठी प्रवेश आणि परवडणारीपणा सुधारणे आहे।"
88
+ },
89
+ "ocr": {
90
+ "title": "OCR आरोग्य दस्तऐवज व्यवस्थापन बदलत आहे",
91
+ "source": "Healthcare IT Today",
92
+ "snippet": "ऑप्टिकल कॅरेक्टर रेकग्निशन तंत्रज्ञान आरोग्य सेवा प्रदात्यांद्वारे वैद्यकीय रेकॉर्ड काढण्याच्या आणि विश्लेषणाच्या पद्धतीत क्रांती घडवत आहे, मॅन्युअल डेटा एंट्री त्रुटी 90% पर्यंत कमी करत आहे।"
93
+ }
94
+ }
95
+ },
96
+ "faq": {
97
+ "title": "प्रतिबंधाची",
98
+ "titleHighlight": "कला",
99
+ "subtitle": "Co-Code GGW प्रतिबंधात्मक काळजी सोपी करते। अहवाल अपलोड करा, ट्रेंड ट्रॅक करा आणि योग्य वेळी आठवण करून द्या—जेणेकरून निरोगी राहणे कामासारखे वाटणार नाही।",
100
+ "items": {
101
+ "isDoctor": {
102
+ "question": "Co-Code GGW डॉक्टर आहे का?",
103
+ "answer": "नाही। Co-Code GGW डॉक्टर नाही आणि वैद्यकीय सल्ला, निदान किंवा उपचार प्रदान करत नाही। ही एक सूचना प्रणाली आहे जी तुम्हाला तपासणी अहवाल व्यवस्थित करण्यात, आरोग्य ट्रेंड ट्रॅक करण्यात आणि स्मार्ट स्मरणपत्र प्राप्त करण्यात मदत करते—वैद्यकीय निर्णयांसाठी नेहमी परवानाधारक वैद्यांचा सल्ला घ्या।"
104
+ },
105
+ "reports": {
106
+ "question": "मी कोणते अहवाल अपलोड करू शकतो?",
107
+ "answer": "तुम्ही PDF, JPG किंवा PNG स्वरूपात तपासणी अहवाल, निदान प्रतिमा, प्रिस्क्रिप्शन आणि वैद्यकीय दस्तऐवज अपलोड करू शकता। आमचे OCR ग्लुको���, कोलेस्टेरॉल, हिमोग्लोबिन सारख्या मुख्य मूल्ये काढते।"
108
+ },
109
+ "ocr": {
110
+ "question": "OCR कसे काम करते आणि तुम्ही काय काढता?",
111
+ "answer": "ऑप्टिकल कॅरेक्टर रेकग्निशन (OCR) तुमचे अपलोड केलेले अहवाल स्कॅन करते आणि बायोमार्कर मूल्ये, चाचणी नावे, तारखा आणि संदर्भ श्रेणी आपोआप काढते। यामुळे मॅन्युअल डेटा एंट्री संपते आणि कालांतराने ट्रेंड विश्लेषण सक्षम होते।"
112
+ },
113
+ "reminders": {
114
+ "question": "स्मरणपत्र वैयक्तिक कसे केली जातात?",
115
+ "answer": "तुमच्या अहवाल इतिहास, वय आणि मागील तपासणी तारखांच्या आधारे, Co-Code GGW सुचवते की फॉलो-अप केव्हा शेड्यूल करावे, औषधे पुन्हा भरावीत किंवा चाचण्या पुन्हा करावीत। स्मरणपत्र डायनॅमिकपणे जुळवले जातात जसे तुम्ही नवीन अहवाल अपलोड करता।"
116
+ },
117
+ "security": {
118
+ "question": "तुम्ही माझा डेटा कसा सुरक्षित ठेवता?",
119
+ "answer": "सर्व अहवाल विश्रांतीच्या आणि ट्रान्झिटमध्ये एन्क्रिप्टेड आहेत। आम्ही HIPAA-समतुल्य सुरक्षा मानकांचे पालन करतो, मल्टी-फॅक्टर ऑथेंटिकेशन वापरतो आणि स्पष्ट संमतीशिवाय तृतीय पक्षांसह तुमचा डेटा कधीही शेअर करत नाही।"
120
+ },
121
+ "export": {
122
+ "question": "मी माझा डेटा निर्यात किंवा हटवू शकतो का?",
123
+ "answer": "होय। तुम्ही कधीही ZIP फाइल म्हणून तुमचे सर्व अहवाल आणि काढलेला डेटा निर्यात करू शकता। तुम्हाला आमच्या सर्व्हरवरून तुमचे खाते आणि सर्व संबंधित डेटा कायमचा हटवण्याचा अधिकार देखील आहे।"
124
+ }
125
+ }
126
+ },
127
+ "footer": {
128
+ "description": "प्रतिबंधात्मक काळजीसाठी एकत्रित वैद्यकीय व्यासपीठ। अहवाल अपलोड करा, ट्रेंड ट्रॅक करा आणि योग्य वेळी आठवण करून द्या—जेणेकरून निरोगी राहणे कामासारखे वाटणार नाही।",
129
+ "product": {
130
+ "title": "उत्पादन"
131
+ },
132
+ "cta": {
133
+ "title": "तुमच्या आरोग्यावर नियंत्रण घेण्यासाठी तयार?",
134
+ "contact": "आमच्याशी संपर्क साधा",
135
+ "demo": "डेमो बुक करा"
136
+ },
137
+ "bottom": {
138
+ "privacy": "गोपनीयता",
139
+ "terms": "अटी आणि शर्ती",
140
+ "copyright": "कॉपीराइट @2026 - टीम GitGoneWild द्वारा निर्मित"
141
+ }
142
+ },
143
+ "language": {
144
+ "select": "भाषा निवडा",
145
+ "english": "English",
146
+ "hindi": "हिंदी",
147
+ "marathi": "मराठी"
148
+ }
149
+ }
frontend/src/index.css ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ html {
8
+ font-size: 16px;
9
+ }
10
+
11
+ body {
12
+ font-family: 'DM Sans', sans-serif;
13
+ background-color: #f5f0e8;
14
+ color: #2d2d2d;
15
+ line-height: 1.6;
16
+ -webkit-font-smoothing: antialiased;
17
+ -moz-osx-font-smoothing: grayscale;
18
+ }
19
+
20
+ a {
21
+ text-decoration: none;
22
+ color: inherit;
23
+ }
24
+
25
+ ul {
26
+ list-style: none;
27
+ }
28
+
29
+ button {
30
+ cursor: pointer;
31
+ border: none;
32
+ outline: none;
33
+ font-family: inherit;
34
+ }
35
+
36
+ img {
37
+ max-width: 100%;
38
+ display: block;
39
+ }
frontend/src/main.tsx ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react'
2
+ import ReactDOM from 'react-dom/client'
3
+ import App from './App'
4
+ import './index.css'
5
+ import './i18n/config'
6
+
7
+ ReactDOM.createRoot(document.getElementById('root')!).render(
8
+ <React.StrictMode>
9
+ <App />
10
+ </React.StrictMode>,
11
+ )
frontend/src/vite-env.d.ts ADDED
@@ -0,0 +1 @@
 
 
1
+ /// <reference types="vite/client" />
frontend/tsconfig.json ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "useDefineForClassFields": true,
5
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+ "moduleResolution": "bundler",
9
+ "allowImportingTsExtensions": true,
10
+ "resolveJsonModule": true,
11
+ "isolatedModules": true,
12
+ "noEmit": true,
13
+ "jsx": "react-jsx",
14
+ "strict": true,
15
+ "noUnusedLocals": true,
16
+ "noUnusedParameters": true,
17
+ "noFallthroughCasesInSwitch": true
18
+ },
19
+ "include": ["src"],
20
+ "references": [{ "path": "./tsconfig.node.json" }]
21
+ }
frontend/tsconfig.node.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "composite": true,
4
+ "skipLibCheck": true,
5
+ "module": "ESNext",
6
+ "moduleResolution": "bundler",
7
+ "allowSyntheticDefaultImports": true
8
+ },
9
+ "include": ["vite.config.ts"]
10
+ }
frontend/vite.config.ts ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import { defineConfig } from 'vite'
2
+ import react from '@vitejs/plugin-react'
3
+
4
+ export default defineConfig({
5
+ plugins: [react()],
6
+ })