Disini Ruhansa Kodagoda Hettige commited on
Commit
9be21ef
·
0 Parent(s):

Deploy EmpowerHer app

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .dockerignore +12 -0
  2. .gitattributes +40 -0
  3. .gitignore +6 -0
  4. Dockerfile +33 -0
  5. FRONTEND/.gitignore +24 -0
  6. FRONTEND/README.md +73 -0
  7. FRONTEND/eslint.config.js +23 -0
  8. FRONTEND/images/Celebrating sisterhood in soft pastels.png +3 -0
  9. FRONTEND/images/Logo.png +3 -0
  10. FRONTEND/images/activity_diagram.mmd +32 -0
  11. FRONTEND/images/activity_diagram.png +3 -0
  12. FRONTEND/images/class_diagram.mmd +52 -0
  13. FRONTEND/images/class_diagram.png +3 -0
  14. FRONTEND/images/cover.jpg +3 -0
  15. FRONTEND/images/landpic.avif +3 -0
  16. FRONTEND/images/sequence_diagram.mmd +33 -0
  17. FRONTEND/images/sequence_diagram.png +3 -0
  18. FRONTEND/images/sitecover.png +3 -0
  19. FRONTEND/images/wireframe_desktop.png +3 -0
  20. FRONTEND/images/wireframe_empty_state.png +3 -0
  21. FRONTEND/images/wireframe_mobile.png +3 -0
  22. FRONTEND/index.html +13 -0
  23. FRONTEND/package-lock.json +0 -0
  24. FRONTEND/package.json +31 -0
  25. FRONTEND/public/images/Logo.png +3 -0
  26. FRONTEND/public/images/cover.jpg +3 -0
  27. FRONTEND/public/images/landpic.jpg +3 -0
  28. FRONTEND/public/vite.svg +1 -0
  29. FRONTEND/src/App.css +970 -0
  30. FRONTEND/src/App.tsx +648 -0
  31. FRONTEND/src/app.jsx +191 -0
  32. FRONTEND/src/assets/react.svg +1 -0
  33. FRONTEND/src/index.css +20 -0
  34. FRONTEND/src/main.tsx +10 -0
  35. FRONTEND/tsconfig.app.json +28 -0
  36. FRONTEND/tsconfig.json +7 -0
  37. FRONTEND/tsconfig.node.json +26 -0
  38. FRONTEND/vite.config.ts +11 -0
  39. README.md +12 -0
  40. README_DEPLOY.md +26 -0
  41. app/app.py +59 -0
  42. app/templates/chat.html +51 -0
  43. eval/__init__.py +0 -0
  44. eval/compare_emotion_vs_noemotion.py +23 -0
  45. eval/compare_kb_vs_nokb.py +25 -0
  46. eval/compare_rag_vs_nonrag.py +32 -0
  47. eval/dg_eval.csv +145 -0
  48. eval/dg_results.csv +747 -0
  49. eval/emotion_eval.csv +149 -0
  50. eval/evaluate_emotion_classifier.py +94 -0
.dockerignore ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .git
2
+ .gitignore
3
+ .env
4
+ venv
5
+ __pycache__
6
+ *.pyc
7
+ *.pyo
8
+ *.pyd
9
+ *.log
10
+ node_modules
11
+ FRONTEND/node_modules
12
+ FRONTEND/dist
.gitattributes ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ *.png filter=lfs diff=lfs merge=lfs -text
37
+ *.jpg filter=lfs diff=lfs merge=lfs -text
38
+ *.jpeg filter=lfs diff=lfs merge=lfs -text
39
+ *.webp filter=lfs diff=lfs merge=lfs -text
40
+ *.avif filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ venv/
2
+ __pycache__/
3
+ *.pyc
4
+ .env
5
+ FRONTEND/node_modules/
6
+ FRONTEND/dist/
Dockerfile ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.11-slim
2
+
3
+ ENV PYTHONDONTWRITEBYTECODE=1
4
+ ENV PYTHONUNBUFFERED=1
5
+ ENV PIP_NO_CACHE_DIR=1
6
+ ENV PORT=7860
7
+
8
+ WORKDIR /app
9
+
10
+ RUN apt-get update && apt-get install -y --no-install-recommends \
11
+ curl \
12
+ ca-certificates \
13
+ gnupg \
14
+ build-essential \
15
+ && mkdir -p /etc/apt/keyrings \
16
+ && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \
17
+ && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \
18
+ && apt-get update && apt-get install -y --no-install-recommends nodejs \
19
+ && rm -rf /var/lib/apt/lists/*
20
+
21
+ COPY requirements.txt ./
22
+ RUN pip install --upgrade pip && pip install -r requirements.txt
23
+
24
+ COPY FRONTEND/package.json FRONTEND/package-lock.json ./FRONTEND/
25
+ RUN cd FRONTEND && npm ci
26
+
27
+ COPY . .
28
+
29
+ RUN cd FRONTEND && npm run build
30
+
31
+ EXPOSE 7860
32
+
33
+ CMD ["gunicorn", "--bind", "0.0.0.0:7860", "--timeout", "300", "app.app:app"]
FRONTEND/.gitignore ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ pnpm-debug.log*
8
+ lerna-debug.log*
9
+
10
+ node_modules
11
+ dist
12
+ dist-ssr
13
+ *.local
14
+
15
+ # Editor directories and files
16
+ .vscode/*
17
+ !.vscode/extensions.json
18
+ .idea
19
+ .DS_Store
20
+ *.suo
21
+ *.ntvs*
22
+ *.njsproj
23
+ *.sln
24
+ *.sw?
FRONTEND/README.md ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # React + TypeScript + Vite
2
+
3
+ This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4
+
5
+ Currently, two official plugins are available:
6
+
7
+ - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
8
+ - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9
+
10
+ ## React Compiler
11
+
12
+ The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
13
+
14
+ ## Expanding the ESLint configuration
15
+
16
+ If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
17
+
18
+ ```js
19
+ export default defineConfig([
20
+ globalIgnores(['dist']),
21
+ {
22
+ files: ['**/*.{ts,tsx}'],
23
+ extends: [
24
+ // Other configs...
25
+
26
+ // Remove tseslint.configs.recommended and replace with this
27
+ tseslint.configs.recommendedTypeChecked,
28
+ // Alternatively, use this for stricter rules
29
+ tseslint.configs.strictTypeChecked,
30
+ // Optionally, add this for stylistic rules
31
+ tseslint.configs.stylisticTypeChecked,
32
+
33
+ // Other configs...
34
+ ],
35
+ languageOptions: {
36
+ parserOptions: {
37
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
38
+ tsconfigRootDir: import.meta.dirname,
39
+ },
40
+ // other options...
41
+ },
42
+ },
43
+ ])
44
+ ```
45
+
46
+ You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
47
+
48
+ ```js
49
+ // eslint.config.js
50
+ import reactX from 'eslint-plugin-react-x'
51
+ import reactDom from 'eslint-plugin-react-dom'
52
+
53
+ export default defineConfig([
54
+ globalIgnores(['dist']),
55
+ {
56
+ files: ['**/*.{ts,tsx}'],
57
+ extends: [
58
+ // Other configs...
59
+ // Enable lint rules for React
60
+ reactX.configs['recommended-typescript'],
61
+ // Enable lint rules for React DOM
62
+ reactDom.configs.recommended,
63
+ ],
64
+ languageOptions: {
65
+ parserOptions: {
66
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
67
+ tsconfigRootDir: import.meta.dirname,
68
+ },
69
+ // other options...
70
+ },
71
+ },
72
+ ])
73
+ ```
FRONTEND/eslint.config.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import js from '@eslint/js'
2
+ import globals from 'globals'
3
+ import reactHooks from 'eslint-plugin-react-hooks'
4
+ import reactRefresh from 'eslint-plugin-react-refresh'
5
+ import tseslint from 'typescript-eslint'
6
+ import { defineConfig, globalIgnores } from 'eslint/config'
7
+
8
+ export default defineConfig([
9
+ globalIgnores(['dist']),
10
+ {
11
+ files: ['**/*.{ts,tsx}'],
12
+ extends: [
13
+ js.configs.recommended,
14
+ tseslint.configs.recommended,
15
+ reactHooks.configs.flat.recommended,
16
+ reactRefresh.configs.vite,
17
+ ],
18
+ languageOptions: {
19
+ ecmaVersion: 2020,
20
+ globals: globals.browser,
21
+ },
22
+ },
23
+ ])
FRONTEND/images/Celebrating sisterhood in soft pastels.png ADDED

Git LFS Details

  • SHA256: 1bba128c0e40703b0cb1d5a9a11a262e117abfd2ccb46d54cae2c899481867ef
  • Pointer size: 132 Bytes
  • Size of remote file: 2.17 MB
FRONTEND/images/Logo.png ADDED

Git LFS Details

  • SHA256: 8d81153b45e0369bdbf10217fed2714647b6c5e5de4e9611416678e1afbbb5bb
  • Pointer size: 132 Bytes
  • Size of remote file: 2.19 MB
FRONTEND/images/activity_diagram.mmd ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ flowchart TD
2
+ A([Start]) --> B[User types message in UI]
3
+ B --> C[Frontend sends POST /chat]
4
+ C --> D[Flask receives request]
5
+ D --> E[ChatService.generate_reply]
6
+
7
+ E --> F{Message empty?}
8
+ F -- Yes --> G[Return default prompt]
9
+ F -- No --> H{Emotions enabled?}
10
+ H -- Yes --> I[EmotionClassifier predicts emotions]
11
+ H -- No --> J[Skip emotions]
12
+
13
+ I --> K[Detect intent + topic]
14
+ J --> K
15
+
16
+ K --> L{Use KB and intent is info/symptom?}
17
+ L -- Yes --> M[KB Retriever search]
18
+ M --> N[Format KB answer]
19
+ N --> O{KB answer exists?}
20
+ O -- Yes --> P[Compose KB-based reply]
21
+ O -- No --> Q[Compose fallback question]
22
+
23
+ L -- No --> R[Compose support/calming reply]
24
+
25
+ P --> S[Apply safety constraints]
26
+ Q --> S
27
+ R --> S
28
+ G --> S
29
+
30
+ S --> T[Return JSON response]
31
+ T --> U[Frontend displays reply]
32
+ U --> V([End])
FRONTEND/images/activity_diagram.png ADDED

Git LFS Details

  • SHA256: 2da4153c7d7b5e27ffe1803a4dc57493e8fc3da78358ce7e8b6cb9bfc1fe9a0c
  • Pointer size: 130 Bytes
  • Size of remote file: 65.4 kB
FRONTEND/images/class_diagram.mmd ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ classDiagram
2
+ class ChatService {
3
+ +bool use_emotions
4
+ +bool use_kb
5
+ +EmotionClassifier emotion_model
6
+ +KnowledgeBaseRetriever kb
7
+ +generate_reply(user_message: str) ChatResult
8
+ }
9
+
10
+ class ChatResult {
11
+ +str reply
12
+ +List[str] emotions
13
+ +Any raw_emotions
14
+ +str topic
15
+ +str intent
16
+ +List[str] kb_sources
17
+ }
18
+
19
+ class EmotionClassifier {
20
+ +predict_emotions(text: str, top_k: int) List[dict]
21
+ }
22
+
23
+ class KnowledgeBaseRetriever {
24
+ +Path docs_dir
25
+ +int chunk_size
26
+ +float min_score
27
+ +str backend
28
+ +str embed_model_name
29
+ +List[str] chunks
30
+ +List[str] sources
31
+ +search(query: str, top_k: int) List[KBHit]
32
+ }
33
+
34
+ class KBHit {
35
+ +str chunk
36
+ +str source
37
+ +float score
38
+ }
39
+
40
+ class TfidfVectorizer
41
+ class cosine_similarity
42
+ class AutoTokenizer
43
+ class AutoModel
44
+
45
+ ChatService --> EmotionClassifier
46
+ ChatService --> KnowledgeBaseRetriever
47
+ ChatService --> ChatResult
48
+ KnowledgeBaseRetriever --> KBHit
49
+ KnowledgeBaseRetriever ..> TfidfVectorizer : tfidf
50
+ KnowledgeBaseRetriever ..> cosine_similarity : tfidf
51
+ KnowledgeBaseRetriever ..> AutoTokenizer : embedding
52
+ KnowledgeBaseRetriever ..> AutoModel : embedding
FRONTEND/images/class_diagram.png ADDED

Git LFS Details

  • SHA256: 8a3a13e097c965c1ed5684bb3d16679f1cee7acbee58b2a794ac0a1604bc3a4a
  • Pointer size: 130 Bytes
  • Size of remote file: 45 kB
FRONTEND/images/cover.jpg ADDED

Git LFS Details

  • SHA256: 928dea0712493be4b1005081f54973ef63b982af9078c4268a241d366ac82a87
  • Pointer size: 130 Bytes
  • Size of remote file: 27.2 kB
FRONTEND/images/landpic.avif ADDED

Git LFS Details

  • SHA256: 9d9065a424900ffa49d23c525d0d7fbaebe67e7bcd4972723459c46f8c72ad45
  • Pointer size: 130 Bytes
  • Size of remote file: 66 kB
FRONTEND/images/sequence_diagram.mmd ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ sequenceDiagram
2
+ participant U as User
3
+ participant FE as Frontend (React)
4
+ participant BE as Flask API
5
+ participant CS as ChatService
6
+ participant EC as EmotionClassifier
7
+ participant KB as KnowledgeBaseRetriever
8
+ participant DOCS as kb/docs/*.txt
9
+
10
+ U->>FE: Type message
11
+ FE->>BE: POST /chat {message}
12
+ BE->>CS: generate_reply(message)
13
+
14
+ opt Emotions enabled
15
+ CS->>EC: predict_emotions(text, top_k=3)
16
+ EC-->>CS: raw_emotions + labels
17
+ end
18
+
19
+ CS->>CS: detect_intent(text)
20
+ CS->>CS: detect_topic(text)
21
+
22
+ alt intent == info_question or symptom and KB enabled
23
+ CS->>KB: search(text, top_k=2)
24
+ KB->>DOCS: load/index if needed
25
+ KB-->>CS: kb_hits + sources
26
+ else no KB or not info/symptom
27
+ CS-->>CS: skip KB
28
+ end
29
+
30
+ CS->>CS: compose reply + safety constraints
31
+ CS-->>BE: ChatResult
32
+ BE-->>FE: JSON {reply, emotions, raw_emotions, topic, intent, kb_sources}
33
+ FE-->>U: Display reply
FRONTEND/images/sequence_diagram.png ADDED

Git LFS Details

  • SHA256: d08413f802eb2517580257f33258bc173412f37c47103cca6b6f271bb1f9f47b
  • Pointer size: 130 Bytes
  • Size of remote file: 39.7 kB
FRONTEND/images/sitecover.png ADDED

Git LFS Details

  • SHA256: 6b8d2002bcbd7a129120250f1c138f42ed56f22860e1d36b6d0308ff1c66ba85
  • Pointer size: 132 Bytes
  • Size of remote file: 1.94 MB
FRONTEND/images/wireframe_desktop.png ADDED

Git LFS Details

  • SHA256: c2f29cb11c3dc9a6b39477c227d52c8f79189aa9663bc5424b23cfd67e3d5023
  • Pointer size: 130 Bytes
  • Size of remote file: 17 kB
FRONTEND/images/wireframe_empty_state.png ADDED

Git LFS Details

  • SHA256: ab4e031a20d2f6f49c9efd1e1285e0a783e890db7d538e98f090313017f93fc7
  • Pointer size: 130 Bytes
  • Size of remote file: 12.2 kB
FRONTEND/images/wireframe_mobile.png ADDED

Git LFS Details

  • SHA256: a706aa81ce74d38d8cdbea1a4dfe243dc0ac2e882893515c9d7180dbfa53e9eb
  • Pointer size: 130 Bytes
  • Size of remote file: 17.2 kB
FRONTEND/index.html ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>EmpowerHer</title>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/main.tsx"></script>
12
+ </body>
13
+ </html>
FRONTEND/package-lock.json ADDED
The diff for this file is too large to render. See raw diff
 
FRONTEND/package.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "frontend",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "tsc -b && vite build",
9
+ "lint": "eslint .",
10
+ "preview": "vite preview"
11
+ },
12
+ "dependencies": {
13
+ "react": "^19.2.0",
14
+ "react-dom": "^19.2.0"
15
+ },
16
+ "devDependencies": {
17
+ "@eslint/js": "^9.39.1",
18
+ "@mermaid-js/mermaid-cli": "^11.12.0",
19
+ "@types/node": "^24.10.1",
20
+ "@types/react": "^19.2.5",
21
+ "@types/react-dom": "^19.2.3",
22
+ "@vitejs/plugin-react": "^5.1.1",
23
+ "eslint": "^9.39.1",
24
+ "eslint-plugin-react-hooks": "^7.0.1",
25
+ "eslint-plugin-react-refresh": "^0.4.24",
26
+ "globals": "^16.5.0",
27
+ "typescript": "~5.9.3",
28
+ "typescript-eslint": "^8.46.4",
29
+ "vite": "^7.2.4"
30
+ }
31
+ }
FRONTEND/public/images/Logo.png ADDED

Git LFS Details

  • SHA256: 8d81153b45e0369bdbf10217fed2714647b6c5e5de4e9611416678e1afbbb5bb
  • Pointer size: 132 Bytes
  • Size of remote file: 2.19 MB
FRONTEND/public/images/cover.jpg ADDED

Git LFS Details

  • SHA256: 928dea0712493be4b1005081f54973ef63b982af9078c4268a241d366ac82a87
  • Pointer size: 130 Bytes
  • Size of remote file: 27.2 kB
FRONTEND/public/images/landpic.jpg ADDED

Git LFS Details

  • SHA256: 12a70bd816bd55927680d95e85e629c802d2e41eecdf3e0330e35788d0c01e02
  • Pointer size: 131 Bytes
  • Size of remote file: 146 kB
FRONTEND/public/vite.svg ADDED
FRONTEND/src/App.css ADDED
@@ -0,0 +1,970 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ --bg: #f4edf8;
3
+ --paper: #ffffff;
4
+ --paper-soft: #f2e7f6;
5
+ --hero-dark: #4f4155;
6
+ --hero-mid: #6a5a73;
7
+ --hero-accent: #8f76a0;
8
+ --ink: #2f2940;
9
+ --muted: #7d748f;
10
+ --line: rgba(122, 95, 146, 0.18);
11
+ --violet: #8449a9;
12
+ --violet-strong: #723e92;
13
+ --violet-soft: #d8c7e8;
14
+ --shadow: 0 18px 40px rgba(47, 41, 64, 0.08);
15
+ }
16
+
17
+ html,
18
+ body,
19
+ #root {
20
+ min-height: 100%;
21
+ height: 100%;
22
+ }
23
+
24
+ * {
25
+ box-sizing: border-box;
26
+ }
27
+
28
+ body {
29
+ margin: 0;
30
+ font-family: "Trebuchet MS", "Segoe UI", sans-serif;
31
+ color: var(--ink);
32
+ background: var(--bg);
33
+ }
34
+
35
+ button,
36
+ textarea {
37
+ font: inherit;
38
+ }
39
+
40
+ .bootScreen {
41
+ min-height: 100vh;
42
+ display: grid;
43
+ place-items: center;
44
+ padding: 24px;
45
+ background:
46
+ linear-gradient(135deg, rgba(79, 65, 85, 0.88), rgba(143, 118, 160, 0.68)),
47
+ url("/images/cover.jpg") center/cover no-repeat;
48
+ }
49
+
50
+ .bootCard {
51
+ width: min(420px, 92vw);
52
+ padding: 28px 24px;
53
+ border-radius: 24px;
54
+ background: rgba(255, 255, 255, 0.9);
55
+ box-shadow: var(--shadow);
56
+ text-align: center;
57
+ }
58
+
59
+ .bootLogo {
60
+ width: 72px;
61
+ height: 72px;
62
+ margin: 0 auto 14px;
63
+ border-radius: 22px;
64
+ overflow: hidden;
65
+ box-shadow: var(--shadow);
66
+ }
67
+
68
+ .bootLogo img {
69
+ width: 100%;
70
+ height: 100%;
71
+ object-fit: cover;
72
+ }
73
+
74
+ .bootCard h1 {
75
+ margin: 0;
76
+ font-size: 32px;
77
+ }
78
+
79
+ .bootCard p {
80
+ margin: 8px 0 18px;
81
+ color: var(--muted);
82
+ }
83
+
84
+ .bootBar {
85
+ height: 10px;
86
+ border-radius: 999px;
87
+ background: rgba(114, 62, 146, 0.1);
88
+ overflow: hidden;
89
+ }
90
+
91
+ .bootBar span {
92
+ display: block;
93
+ width: 42%;
94
+ height: 100%;
95
+ background: linear-gradient(90deg, var(--violet-soft), var(--violet), var(--violet-soft));
96
+ animation: bootSlide 1.1s infinite;
97
+ }
98
+
99
+ .siteShell {
100
+ min-height: 100vh;
101
+ }
102
+
103
+ .siteNav {
104
+ position: sticky;
105
+ top: 0;
106
+ z-index: 20;
107
+ display: flex;
108
+ justify-content: space-between;
109
+ align-items: center;
110
+ padding: 16px 34px;
111
+ background: rgba(79, 65, 85, 0.94);
112
+ color: white;
113
+ backdrop-filter: blur(12px);
114
+ }
115
+
116
+ .siteBrand,
117
+ .siteLinks button,
118
+ .footerGrid button {
119
+ border: none;
120
+ background: transparent;
121
+ cursor: pointer;
122
+ }
123
+
124
+ .siteBrand {
125
+ color: white;
126
+ font-size: 26px;
127
+ font-weight: 700;
128
+ letter-spacing: 0.4px;
129
+ }
130
+
131
+ .siteLinks {
132
+ display: flex;
133
+ align-items: center;
134
+ gap: 22px;
135
+ }
136
+
137
+ .siteLinks button {
138
+ color: rgba(255, 255, 255, 0.88);
139
+ font-weight: 600;
140
+ }
141
+
142
+ .siteLinks .navCta {
143
+ color: white;
144
+ font-weight: 800;
145
+ }
146
+
147
+ .heroSection {
148
+ position: relative;
149
+ min-height: 500px;
150
+ display: flex;
151
+ align-items: center;
152
+ justify-content: center;
153
+ padding: 72px 24px;
154
+ background:
155
+ linear-gradient(130deg, rgba(58, 46, 67, 0.54), rgba(111, 92, 124, 0.38)),
156
+ linear-gradient(145deg, rgba(255, 255, 255, 0.04) 18%, transparent 18%, transparent 37%, rgba(255, 255, 255, 0.03) 37%, rgba(255, 255, 255, 0.03) 58%, transparent 58%),
157
+ url("/images/sitecover.png") center/cover no-repeat;
158
+ color: white;
159
+ overflow: hidden;
160
+ }
161
+
162
+ .heroOverlay {
163
+ position: absolute;
164
+ inset: 0;
165
+ background:
166
+ linear-gradient(125deg, rgba(255, 255, 255, 0.04) 18%, transparent 18%, transparent 40%, rgba(255, 255, 255, 0.03) 40%, rgba(255, 255, 255, 0.03) 68%, transparent 68%);
167
+ pointer-events: none;
168
+ }
169
+
170
+ .heroContent {
171
+ position: relative;
172
+ width: min(980px, 100%);
173
+ text-align: center;
174
+ }
175
+
176
+ .heroLead {
177
+ margin: 0;
178
+ font-size: clamp(26px, 4vw, 52px);
179
+ font-weight: 300;
180
+ }
181
+
182
+ .heroContent h1 {
183
+ margin: 10px 0 0;
184
+ font-size: clamp(48px, 7vw, 96px);
185
+ line-height: 0.95;
186
+ color: #d98fff;
187
+ }
188
+
189
+ .heroContent h2 {
190
+ margin: 4px 0 0;
191
+ font-size: clamp(28px, 4vw, 56px);
192
+ font-weight: 400;
193
+ }
194
+
195
+ .heroSubtext {
196
+ width: min(760px, 100%);
197
+ margin: 28px auto 0;
198
+ font-size: 19px;
199
+ line-height: 1.7;
200
+ color: rgba(255, 255, 255, 0.9);
201
+ }
202
+
203
+ .heroActions {
204
+ margin-top: 28px;
205
+ display: flex;
206
+ justify-content: center;
207
+ gap: 16px;
208
+ flex-wrap: wrap;
209
+ }
210
+
211
+ .primaryBtn,
212
+ .secondaryBtn,
213
+ .ghost,
214
+ .sendBtn {
215
+ border-radius: 8px;
216
+ cursor: pointer;
217
+ transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease;
218
+ }
219
+
220
+ .primaryBtn {
221
+ border: none;
222
+ background: var(--violet);
223
+ color: white;
224
+ padding: 13px 24px;
225
+ font-weight: 700;
226
+ box-shadow: 0 10px 24px rgba(114, 62, 146, 0.26);
227
+ }
228
+
229
+ .primaryBtn:hover,
230
+ .secondaryBtn:hover,
231
+ .ghost:hover,
232
+ .sendBtn:hover {
233
+ transform: translateY(-1px);
234
+ }
235
+
236
+ .secondaryBtn {
237
+ border: 1px solid rgba(255, 255, 255, 0.65);
238
+ background: rgba(255, 255, 255, 0.08);
239
+ color: white;
240
+ padding: 13px 24px;
241
+ font-weight: 700;
242
+ }
243
+
244
+ .wide {
245
+ width: 100%;
246
+ }
247
+
248
+ .container {
249
+ width: min(1120px, calc(100vw - 48px));
250
+ margin: 0 auto;
251
+ }
252
+
253
+ .container.narrow {
254
+ width: min(920px, calc(100vw - 48px));
255
+ }
256
+
257
+ .introBand,
258
+ .lavenderSection,
259
+ .copyrightBar {
260
+ background: var(--paper-soft);
261
+ }
262
+
263
+ .introBand {
264
+ padding: 28px 0;
265
+ text-align: center;
266
+ }
267
+
268
+ .introBand p {
269
+ margin: 0;
270
+ font-size: 20px;
271
+ line-height: 1.8;
272
+ color: var(--muted);
273
+ }
274
+
275
+ .contentSection,
276
+ .splitSection,
277
+ .lavenderSection {
278
+ padding: 72px 0;
279
+ }
280
+
281
+ .sectionHeading {
282
+ margin: 0 auto 34px;
283
+ max-width: 760px;
284
+ text-align: center;
285
+ }
286
+
287
+ .sectionHeading h2 {
288
+ margin: 0;
289
+ font-size: 48px;
290
+ }
291
+
292
+ .sectionHeading p {
293
+ margin: 14px 0 0;
294
+ color: var(--muted);
295
+ font-size: 18px;
296
+ line-height: 1.7;
297
+ }
298
+
299
+ .featureGrid,
300
+ .miniGrid {
301
+ display: grid;
302
+ gap: 26px;
303
+ align-items: stretch;
304
+ justify-content: center;
305
+ }
306
+
307
+ .featureGrid {
308
+ grid-template-columns: repeat(3, minmax(0, 1fr));
309
+ max-width: 980px;
310
+ margin: 0 auto;
311
+ }
312
+
313
+ .miniGrid {
314
+ grid-template-columns: repeat(4, minmax(0, 1fr));
315
+ max-width: 1120px;
316
+ margin: 0 auto;
317
+ }
318
+
319
+ .featureCard,
320
+ .miniCard,
321
+ .signupCard,
322
+ .benefitPanel,
323
+ .chatIntroCard,
324
+ .card {
325
+ background: var(--paper);
326
+ border: 1px solid var(--line);
327
+ box-shadow: var(--shadow);
328
+ }
329
+
330
+ .featureCard,
331
+ .miniCard {
332
+ padding: 28px 24px;
333
+ border-radius: 18px;
334
+ text-align: center;
335
+ min-height: 320px;
336
+ display: flex;
337
+ flex-direction: column;
338
+ align-items: center;
339
+ }
340
+
341
+ .featureIcon,
342
+ .miniIcon {
343
+ margin: 0 auto 20px;
344
+ font-size: 32px;
345
+ min-height: 40px;
346
+ display: flex;
347
+ align-items: center;
348
+ justify-content: center;
349
+ }
350
+
351
+ .featureCard h3,
352
+ .miniCard h3 {
353
+ margin: 0 0 14px;
354
+ font-size: 24px;
355
+ color: var(--violet-strong);
356
+ min-height: 64px;
357
+ display: flex;
358
+ align-items: center;
359
+ justify-content: center;
360
+ }
361
+
362
+ .featureCard p,
363
+ .miniCard p {
364
+ margin: 0;
365
+ color: var(--muted);
366
+ line-height: 1.65;
367
+ max-width: 250px;
368
+ }
369
+
370
+ .splitLayout,
371
+ .supportGrid {
372
+ display: grid;
373
+ grid-template-columns: 1fr 1fr;
374
+ gap: 34px;
375
+ align-items: center;
376
+ }
377
+
378
+ .imagePanel {
379
+ border-radius: 18px;
380
+ overflow: hidden;
381
+ box-shadow: var(--shadow);
382
+ }
383
+
384
+ .imagePanel img {
385
+ display: block;
386
+ width: 100%;
387
+ height: 100%;
388
+ min-height: 420px;
389
+ object-fit: cover;
390
+ }
391
+
392
+ .textPanel h2,
393
+ .signupCard h2,
394
+ .benefitPanel h2 {
395
+ margin: 0 0 18px;
396
+ font-size: 42px;
397
+ }
398
+
399
+ .offerList,
400
+ .benefitList {
401
+ display: flex;
402
+ flex-direction: column;
403
+ gap: 18px;
404
+ }
405
+
406
+ .offerList {
407
+ list-style: none;
408
+ margin: 0;
409
+ padding: 0;
410
+ }
411
+
412
+ .offerList li,
413
+ .benefitList div {
414
+ display: flex;
415
+ flex-direction: column;
416
+ gap: 6px;
417
+ padding-bottom: 16px;
418
+ border-bottom: 1px solid var(--line);
419
+ }
420
+
421
+ .offerList strong,
422
+ .benefitList strong {
423
+ color: var(--violet-strong);
424
+ font-size: 18px;
425
+ }
426
+
427
+ .offerList span,
428
+ .benefitList span,
429
+ .signupCard p,
430
+ .finePrint,
431
+ .siteFooter p,
432
+ .siteFooter span {
433
+ color: var(--muted);
434
+ line-height: 1.7;
435
+ }
436
+
437
+ .signupCard,
438
+ .benefitPanel {
439
+ padding: 30px;
440
+ border-radius: 20px;
441
+ }
442
+
443
+ .ctaStack {
444
+ margin-top: 24px;
445
+ display: flex;
446
+ flex-direction: column;
447
+ gap: 12px;
448
+ }
449
+
450
+ .finePrint {
451
+ margin: 18px 0 0;
452
+ font-size: 14px;
453
+ }
454
+
455
+ .siteFooter {
456
+ padding-top: 44px;
457
+ background: var(--paper-soft);
458
+ }
459
+
460
+ .footerGrid {
461
+ display: grid;
462
+ grid-template-columns: 1.2fr 1fr 1fr;
463
+ gap: 32px;
464
+ padding-bottom: 36px;
465
+ }
466
+
467
+ .footerGrid h3 {
468
+ margin: 0 0 16px;
469
+ font-size: 22px;
470
+ }
471
+
472
+ .footerGrid button,
473
+ .footerGrid span {
474
+ display: block;
475
+ margin-bottom: 10px;
476
+ text-align: left;
477
+ color: var(--muted);
478
+ }
479
+
480
+ .copyrightBar {
481
+ padding: 18px 24px 26px;
482
+ text-align: center;
483
+ color: var(--muted);
484
+ font-size: 14px;
485
+ }
486
+
487
+ .app {
488
+ min-height: 100vh;
489
+ display: flex;
490
+ flex-direction: column;
491
+ }
492
+
493
+ .app.chatPage {
494
+ height: 100vh;
495
+ overflow: hidden;
496
+ }
497
+
498
+ .topbar {
499
+ display: flex;
500
+ justify-content: space-between;
501
+ align-items: center;
502
+ gap: 16px;
503
+ padding: 16px 24px;
504
+ background: rgba(255, 255, 255, 0.92);
505
+ border-bottom: 1px solid var(--line);
506
+ backdrop-filter: blur(12px);
507
+ }
508
+
509
+ .brand {
510
+ display: flex;
511
+ align-items: center;
512
+ gap: 14px;
513
+ }
514
+
515
+ .logo {
516
+ width: 50px;
517
+ height: 50px;
518
+ border-radius: 16px;
519
+ overflow: hidden;
520
+ box-shadow: var(--shadow);
521
+ }
522
+
523
+ .logo img {
524
+ width: 100%;
525
+ height: 100%;
526
+ object-fit: cover;
527
+ }
528
+
529
+ .topbar h1 {
530
+ margin: 0;
531
+ font-size: 28px;
532
+ }
533
+
534
+ .topbar p {
535
+ margin: 4px 0 0;
536
+ color: var(--muted);
537
+ }
538
+
539
+ .topActions {
540
+ display: flex;
541
+ gap: 10px;
542
+ }
543
+
544
+ .ghost {
545
+ border: 1px solid var(--line);
546
+ background: white;
547
+ color: var(--ink);
548
+ padding: 12px 16px;
549
+ font-weight: 700;
550
+ }
551
+
552
+ .main {
553
+ flex: 1;
554
+ display: grid;
555
+ grid-template-columns: 1fr 340px;
556
+ gap: 18px;
557
+ padding: 16px 24px 16px;
558
+ align-items: stretch;
559
+ min-height: 0;
560
+ overflow: hidden;
561
+ }
562
+
563
+ .chatArea {
564
+ display: flex;
565
+ flex-direction: column;
566
+ gap: 12px;
567
+ min-height: 0;
568
+ height: 100%;
569
+ }
570
+
571
+ .chatIntroCard,
572
+ .card {
573
+ padding: 16px 18px;
574
+ border-radius: 18px;
575
+ }
576
+
577
+ .chatIntroCard {
578
+ display: flex;
579
+ flex-direction: column;
580
+ gap: 16px;
581
+ }
582
+
583
+ .chatIntroTop {
584
+ display: flex;
585
+ justify-content: space-between;
586
+ align-items: flex-start;
587
+ gap: 18px;
588
+ }
589
+
590
+ .introBadge {
591
+ padding: 8px 12px;
592
+ border-radius: 999px;
593
+ background: rgba(132, 73, 169, 0.1);
594
+ color: var(--violet-strong);
595
+ font-size: 13px;
596
+ font-weight: 700;
597
+ white-space: nowrap;
598
+ }
599
+
600
+ .chatIntroCard h2,
601
+ .card h2 {
602
+ margin: 0 0 8px;
603
+ font-size: 24px;
604
+ }
605
+
606
+ .chatIntroCard p,
607
+ .muted {
608
+ margin: 0;
609
+ color: var(--muted);
610
+ line-height: 1.5;
611
+ font-size: 16px;
612
+ }
613
+
614
+ .chatBox {
615
+ flex: 1;
616
+ min-height: 0;
617
+ overflow-y: auto;
618
+ padding: 16px;
619
+ border-radius: 20px;
620
+ background: rgba(255, 255, 255, 0.88);
621
+ border: 1px solid var(--line);
622
+ box-shadow: var(--shadow);
623
+ }
624
+
625
+ .row {
626
+ display: flex;
627
+ margin-bottom: 14px;
628
+ }
629
+
630
+ .row.user {
631
+ justify-content: flex-end;
632
+ }
633
+
634
+ .bubble {
635
+ max-width: min(760px, 90%);
636
+ padding: 14px 16px;
637
+ border-radius: 18px;
638
+ background: white;
639
+ border: 1px solid var(--line);
640
+ box-shadow: 0 8px 20px rgba(47, 41, 64, 0.05);
641
+ }
642
+
643
+ .bubble.user {
644
+ background: linear-gradient(135deg, rgba(132, 73, 169, 0.12), rgba(132, 73, 169, 0.04));
645
+ }
646
+
647
+ .bubbleText {
648
+ white-space: pre-wrap;
649
+ line-height: 1.6;
650
+ }
651
+
652
+ .meta {
653
+ margin-top: 10px;
654
+ display: flex;
655
+ flex-wrap: wrap;
656
+ gap: 8px;
657
+ }
658
+
659
+ .chip {
660
+ padding: 5px 9px;
661
+ border-radius: 999px;
662
+ border: 1px solid var(--line);
663
+ background: rgba(244, 237, 248, 0.95);
664
+ color: var(--violet-strong);
665
+ font-size: 12px;
666
+ }
667
+
668
+ .composer {
669
+ display: flex;
670
+ gap: 12px;
671
+ padding: 12px;
672
+ border-radius: 18px;
673
+ background: rgba(255, 255, 255, 0.92);
674
+ border: 1px solid var(--line);
675
+ box-shadow: var(--shadow);
676
+ }
677
+
678
+ .suggestionBtn {
679
+ text-align: left;
680
+ border: 1px solid var(--line);
681
+ background: rgba(250, 242, 252, 0.92);
682
+ border-radius: 16px;
683
+ padding: 12px 14px;
684
+ cursor: pointer;
685
+ color: var(--violet-strong);
686
+ box-shadow: 0 6px 14px rgba(47, 41, 64, 0.04);
687
+ }
688
+
689
+ textarea {
690
+ flex: 1;
691
+ resize: none;
692
+ border-radius: 12px;
693
+ border: 1px solid var(--line);
694
+ padding: 12px 14px;
695
+ min-height: 74px;
696
+ outline: none;
697
+ }
698
+
699
+ textarea:focus {
700
+ border-color: rgba(132, 73, 169, 0.44);
701
+ box-shadow: 0 0 0 3px rgba(132, 73, 169, 0.12);
702
+ }
703
+
704
+ .sendBtn {
705
+ min-width: 122px;
706
+ border: none;
707
+ background: var(--violet);
708
+ color: white;
709
+ font-weight: 800;
710
+ }
711
+
712
+ .sendBtn:disabled {
713
+ opacity: 0.6;
714
+ cursor: not-allowed;
715
+ }
716
+
717
+ .sidePanel {
718
+ display: flex;
719
+ flex-direction: column;
720
+ gap: 14px;
721
+ min-height: 0;
722
+ height: 100%;
723
+ overflow-y: auto;
724
+ padding-right: 4px;
725
+ }
726
+
727
+ .suggestions {
728
+ display: flex;
729
+ flex-direction: column;
730
+ gap: 8px;
731
+ margin-top: 10px;
732
+ }
733
+
734
+ .suggestionBtn:hover {
735
+ background: rgba(244, 232, 249, 0.98);
736
+ border-color: rgba(132, 73, 169, 0.28);
737
+ }
738
+
739
+ .sidePanel .card {
740
+ padding: 14px 16px;
741
+ border-radius: 16px;
742
+ }
743
+
744
+ .sidePanel .card h2 {
745
+ margin-bottom: 6px;
746
+ font-size: 22px;
747
+ }
748
+
749
+ .sidePanel .muted {
750
+ font-size: 15px;
751
+ line-height: 1.45;
752
+ }
753
+
754
+ .sidePanel .suggestionBtn {
755
+ padding: 10px 14px;
756
+ border-radius: 14px;
757
+ font-size: 15px;
758
+ line-height: 1.35;
759
+ }
760
+
761
+ .medicalShortcut {
762
+ gap: 10px;
763
+ }
764
+
765
+ .typing {
766
+ display: flex;
767
+ gap: 6px;
768
+ }
769
+
770
+ .compactInfo {
771
+ padding-top: 16px;
772
+ }
773
+
774
+ .medicalShortcut {
775
+ display: flex;
776
+ flex-direction: column;
777
+ gap: 14px;
778
+ }
779
+
780
+ .medicalShell {
781
+ padding: 18px 24px 24px;
782
+ display: flex;
783
+ flex-direction: column;
784
+ gap: 18px;
785
+ }
786
+
787
+ .medicalHero {
788
+ padding: 24px;
789
+ }
790
+
791
+ .medicalHero h2 {
792
+ margin: 0 0 10px;
793
+ font-size: 36px;
794
+ }
795
+
796
+ .medicalGrid {
797
+ display: grid;
798
+ grid-template-columns: repeat(2, minmax(0, 1fr));
799
+ gap: 18px;
800
+ align-items: start;
801
+ }
802
+
803
+ .medicalCard {
804
+ padding: 22px;
805
+ align-self: start;
806
+ }
807
+
808
+ .medicalCard h3 {
809
+ margin: 0 0 12px;
810
+ font-size: 24px;
811
+ color: var(--violet-strong);
812
+ }
813
+
814
+ .doctorList {
815
+ display: flex;
816
+ flex-direction: column;
817
+ gap: 18px;
818
+ }
819
+
820
+ .doctorList > div {
821
+ padding-bottom: 16px;
822
+ border-bottom: 1px solid var(--line);
823
+ }
824
+
825
+ .doctorList > div:last-child {
826
+ padding-bottom: 0;
827
+ border-bottom: none;
828
+ }
829
+
830
+ .doctorList strong {
831
+ display: block;
832
+ margin-bottom: 6px;
833
+ color: var(--ink);
834
+ }
835
+
836
+ .doctorList p {
837
+ margin: 4px 0;
838
+ color: var(--muted);
839
+ line-height: 1.65;
840
+ }
841
+
842
+ .medicalList {
843
+ margin: 0;
844
+ padding-left: 20px;
845
+ color: var(--muted);
846
+ line-height: 1.8;
847
+ }
848
+
849
+ .medicalActions {
850
+ margin-top: 18px;
851
+ }
852
+
853
+ .medicalDoctors {
854
+ grid-row: span 2;
855
+ }
856
+
857
+ .typing span {
858
+ width: 8px;
859
+ height: 8px;
860
+ border-radius: 999px;
861
+ background: var(--violet);
862
+ animation: bounce 1.1s infinite;
863
+ }
864
+
865
+ .typing span:nth-child(2) {
866
+ animation-delay: 0.15s;
867
+ }
868
+
869
+ .typing span:nth-child(3) {
870
+ animation-delay: 0.3s;
871
+ }
872
+
873
+ @media (max-width: 980px) {
874
+ .siteNav,
875
+ .topbar {
876
+ flex-direction: column;
877
+ align-items: flex-start;
878
+ }
879
+
880
+ .siteLinks {
881
+ flex-wrap: wrap;
882
+ gap: 12px;
883
+ }
884
+
885
+ .featureGrid,
886
+ .miniGrid,
887
+ .splitLayout,
888
+ .supportGrid,
889
+ .footerGrid,
890
+ .main,
891
+ .medicalGrid {
892
+ grid-template-columns: 1fr;
893
+ }
894
+
895
+ .miniGrid {
896
+ max-width: none;
897
+ }
898
+
899
+ .chatIntroTop {
900
+ flex-direction: column;
901
+ }
902
+
903
+ .heroContent h1 {
904
+ font-size: clamp(44px, 12vw, 78px);
905
+ }
906
+
907
+ .heroContent h2 {
908
+ font-size: clamp(26px, 7vw, 42px);
909
+ }
910
+ }
911
+
912
+ @media (max-width: 720px) {
913
+ .siteNav,
914
+ .topbar,
915
+ .main,
916
+ .medicalShell {
917
+ padding-left: 16px;
918
+ padding-right: 16px;
919
+ }
920
+
921
+ .container,
922
+ .container.narrow {
923
+ width: min(100vw - 32px, 100%);
924
+ }
925
+
926
+ .heroSection {
927
+ min-height: 420px;
928
+ }
929
+
930
+ .sectionHeading h2,
931
+ .textPanel h2,
932
+ .signupCard h2,
933
+ .benefitPanel h2 {
934
+ font-size: 34px;
935
+ }
936
+
937
+ .bubble {
938
+ max-width: 100%;
939
+ }
940
+
941
+ .composer {
942
+ flex-direction: column;
943
+ }
944
+
945
+ .sendBtn {
946
+ min-height: 48px;
947
+ }
948
+ }
949
+
950
+ @keyframes bootSlide {
951
+ 0% {
952
+ transform: translateX(-60%);
953
+ }
954
+ 100% {
955
+ transform: translateX(160%);
956
+ }
957
+ }
958
+
959
+ @keyframes bounce {
960
+ 0%,
961
+ 80%,
962
+ 100% {
963
+ transform: translateY(0);
964
+ opacity: 0.45;
965
+ }
966
+ 40% {
967
+ transform: translateY(-5px);
968
+ opacity: 1;
969
+ }
970
+ }
FRONTEND/src/App.tsx ADDED
@@ -0,0 +1,648 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import type { KeyboardEventHandler } from "react";
2
+ import { useEffect, useMemo, useRef, useState } from "react";
3
+ import "./App.css";
4
+ import appLogo from "../images/Logo.png";
5
+
6
+ type ChatMeta = {
7
+ intent?: string;
8
+ topic?: string;
9
+ emotions?: string[];
10
+ kb_sources?: string[];
11
+ };
12
+
13
+ type ChatMessage = {
14
+ role: "user" | "bot";
15
+ text: string;
16
+ meta?: ChatMeta;
17
+ };
18
+
19
+ type ChatResponse = {
20
+ reply?: string;
21
+ emotions?: string[];
22
+ raw_emotions?: unknown;
23
+ topic?: string;
24
+ intent?: string;
25
+ kb_sources?: string[];
26
+ };
27
+
28
+ type SectionKey = "home" | "about" | "features" | "why" | "support";
29
+
30
+ const initialBotMessage: ChatMessage = {
31
+ role: "bot",
32
+ text: "Hi, I'm EmpowerHer. I'm here to listen and help with questions about periods, moods, or anything you're feeling. What's on your mind today?",
33
+ };
34
+
35
+ function Bubble({ role, text, meta }: ChatMessage) {
36
+ return (
37
+ <div className={`row ${role}`}>
38
+ <div className={`bubble ${role}`}>
39
+ <div className="bubbleText">{text}</div>
40
+
41
+ {role === "bot" && meta && (
42
+ <div className="meta">
43
+ <span className="chip">Intent: {meta.intent ?? "-"}</span>
44
+ <span className="chip">Topic: {meta.topic ?? "-"}</span>
45
+ <span className="chip">
46
+ Emotions:{" "}
47
+ {meta.emotions && meta.emotions.length
48
+ ? meta.emotions.join(", ")
49
+ : "-"}
50
+ </span>
51
+ <span className="chip">
52
+ KB:{" "}
53
+ {meta.kb_sources && meta.kb_sources.length
54
+ ? meta.kb_sources.join(", ")
55
+ : "-"}
56
+ </span>
57
+ </div>
58
+ )}
59
+ </div>
60
+ </div>
61
+ );
62
+ }
63
+
64
+ export default function App() {
65
+ const [booting, setBooting] = useState(true);
66
+ const [showLanding, setShowLanding] = useState(true);
67
+ const [chatView, setChatView] = useState<"chat" | "medical">("chat");
68
+ const [messages, setMessages] = useState<ChatMessage[]>([initialBotMessage]);
69
+ const [input, setInput] = useState("");
70
+ const [loading, setLoading] = useState(false);
71
+
72
+ const endRef = useRef<HTMLDivElement | null>(null);
73
+ const sectionRefs: Record<SectionKey, React.RefObject<HTMLDivElement | null>> =
74
+ {
75
+ home: useRef<HTMLDivElement | null>(null),
76
+ about: useRef<HTMLDivElement | null>(null),
77
+ features: useRef<HTMLDivElement | null>(null),
78
+ why: useRef<HTMLDivElement | null>(null),
79
+ support: useRef<HTMLDivElement | null>(null),
80
+ };
81
+
82
+ const suggestions = useMemo(
83
+ () => [
84
+ "My period is late and I'm scared.",
85
+ "How can I reduce cramps naturally?",
86
+ "Is it okay to eat ice cream during periods?",
87
+ "Why does my period smell fishy?",
88
+ "Help me calm down, I'm overthinking.",
89
+ ],
90
+ []
91
+ );
92
+
93
+ useEffect(() => {
94
+ endRef.current?.scrollIntoView({ behavior: "smooth" });
95
+ }, [messages, loading]);
96
+
97
+ useEffect(() => {
98
+ const timer = window.setTimeout(() => setBooting(false), 1200);
99
+ return () => window.clearTimeout(timer);
100
+ }, []);
101
+
102
+ const scrollToSection = (key: SectionKey) => {
103
+ sectionRefs[key].current?.scrollIntoView({ behavior: "smooth", block: "start" });
104
+ };
105
+
106
+ const sendMessage = async (text?: string) => {
107
+ const msg = (text ?? input).trim();
108
+ if (!msg || loading) return;
109
+
110
+ setMessages((prev) => [...prev, { role: "user", text: msg }]);
111
+ setInput("");
112
+ setLoading(true);
113
+
114
+ try {
115
+ const res = await fetch("/chat", {
116
+ method: "POST",
117
+ headers: { "Content-Type": "application/json" },
118
+ body: JSON.stringify({
119
+ message: msg,
120
+ history: messages.slice(-6),
121
+ }),
122
+ });
123
+
124
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
125
+
126
+ const data: ChatResponse = await res.json();
127
+ const reply =
128
+ data.reply?.trim() ||
129
+ "Sorry, I could not generate a reply right now.";
130
+
131
+ const meta: ChatMeta = {
132
+ intent: data.intent ?? undefined,
133
+ topic: data.topic ?? undefined,
134
+ emotions: Array.isArray(data.emotions) ? data.emotions : undefined,
135
+ kb_sources: Array.isArray(data.kb_sources)
136
+ ? data.kb_sources
137
+ : undefined,
138
+ };
139
+
140
+ setMessages((prev) => [...prev, { role: "bot", text: reply, meta }]);
141
+ } catch {
142
+ setMessages((prev) => [
143
+ ...prev,
144
+ {
145
+ role: "bot",
146
+ text: "Oops, I could not connect to the backend. Is Flask running on http://127.0.0.1:5000 ?",
147
+ },
148
+ ]);
149
+ } finally {
150
+ setLoading(false);
151
+ }
152
+ };
153
+
154
+ const onKeyDown: KeyboardEventHandler<HTMLTextAreaElement> = (e) => {
155
+ if (e.key === "Enter" && !e.shiftKey) {
156
+ e.preventDefault();
157
+ void sendMessage();
158
+ }
159
+ };
160
+
161
+ if (booting) {
162
+ return (
163
+ <div className="bootScreen">
164
+ <div className="bootCard">
165
+ <div className="bootLogo">
166
+ <img src={appLogo} alt="EmpowerHer logo" />
167
+ </div>
168
+ <h1>EmpowerHer</h1>
169
+ <p>Preparing your safe support space...</p>
170
+ <div className="bootBar">
171
+ <span />
172
+ </div>
173
+ </div>
174
+ </div>
175
+ );
176
+ }
177
+
178
+ if (showLanding) {
179
+ return (
180
+ <div className="siteShell">
181
+ <header className="siteNav">
182
+ <button className="siteBrand" onClick={() => scrollToSection("home")}>
183
+ EmpowerHer
184
+ </button>
185
+ <nav className="siteLinks">
186
+ <button onClick={() => scrollToSection("home")}>Home</button>
187
+ <button onClick={() => scrollToSection("about")}>About</button>
188
+ <button onClick={() => scrollToSection("features")}>Features</button>
189
+ <button onClick={() => scrollToSection("why")}>Why EmpowerHer</button>
190
+ <button className="navCta" onClick={() => scrollToSection("support")}>
191
+ Get Support
192
+ </button>
193
+ </nav>
194
+ </header>
195
+
196
+ <section className="heroSection" ref={sectionRefs.home}>
197
+ <div className="heroOverlay" />
198
+ <div className="heroContent">
199
+ <p className="heroLead">A safe and supportive</p>
200
+ <h1>Menstrual Health Chatbot</h1>
201
+ <h2>for Adolescents</h2>
202
+ <p className="heroSubtext">
203
+ Private menstrual health support with emotionally supportive responses,
204
+ clear guidance, and a safe space to ask sensitive questions.
205
+ </p>
206
+ <div className="heroActions">
207
+ <button className="primaryBtn" onClick={() => setShowLanding(false)}>
208
+ Explore the Chatbot
209
+ </button>
210
+ <button className="secondaryBtn" onClick={() => scrollToSection("support")}>
211
+ Learn More
212
+ </button>
213
+ </div>
214
+ </div>
215
+ </section>
216
+
217
+ <section className="introBand" ref={sectionRefs.about}>
218
+ <div className="container narrow">
219
+ <p>
220
+ EmpowerHer provides private, emotionally supportive, and easy-to-understand
221
+ menstrual health support for adolescents and young women seeking safe digital guidance.
222
+ </p>
223
+ </div>
224
+ </section>
225
+
226
+ <section className="contentSection">
227
+ <div className="container">
228
+ <div className="sectionHeading">
229
+ <h2>Why EmpowerHer Matters</h2>
230
+ <p>
231
+ EmpowerHer was created for adolescents who may feel shy, anxious, or unsupported
232
+ when seeking menstrual health information.
233
+ </p>
234
+ </div>
235
+
236
+ <div className="featureGrid">
237
+ <article className="featureCard">
238
+ <div className="featureIcon">🔒</div>
239
+ <h3>Private and Safe</h3>
240
+ <p>
241
+ A judgment-free place where users can ask sensitive questions without worrying
242
+ about privacy or stigma.
243
+ </p>
244
+ </article>
245
+ <article className="featureCard">
246
+ <div className="featureIcon">💜</div>
247
+ <h3>Emotionally Supportive</h3>
248
+ <p>
249
+ Responses are designed to acknowledge fear, stress, confusion, and other emotional
250
+ needs around menstruation.
251
+ </p>
252
+ </article>
253
+ <article className="featureCard">
254
+ <div className="featureIcon">📘</div>
255
+ <h3>Educational</h3>
256
+ <p>
257
+ Reliable, age-appropriate menstrual health guidance using a curated local knowledge base.
258
+ </p>
259
+ </article>
260
+ </div>
261
+ </div>
262
+ </section>
263
+
264
+ <section className="splitSection" ref={sectionRefs.features}>
265
+ <div className="container splitLayout">
266
+ <div className="imagePanel">
267
+ <img
268
+ src="/images/Celebrating sisterhood in soft pastels.png"
269
+ alt="EmpowerHer support illustration"
270
+ />
271
+ </div>
272
+ <div className="textPanel">
273
+ <h2>What EmpowerHer Offers</h2>
274
+ <ul className="offerList">
275
+ <li>
276
+ <strong>24/7 chatbot support</strong>
277
+ <span>Ask menstrual health questions anytime in a private space.</span>
278
+ </li>
279
+ <li>
280
+ <strong>Emotional reassurance</strong>
281
+ <span>Get supportive responses that validate feelings and reduce fear.</span>
282
+ </li>
283
+ <li>
284
+ <strong>Health education</strong>
285
+ <span>Learn about periods, symptoms, hygiene, food, and warning signs.</span>
286
+ </li>
287
+ <li>
288
+ <strong>Confidence building</strong>
289
+ <span>Understand your body with simple explanations designed for adolescents.</span>
290
+ </li>
291
+ </ul>
292
+ </div>
293
+ </div>
294
+ </section>
295
+
296
+ <section className="lavenderSection" ref={sectionRefs.why}>
297
+ <div className="container">
298
+ <div className="sectionHeading">
299
+ <h2>Who It Is For</h2>
300
+ <p>
301
+ EmpowerHer is designed for young users seeking trustworthy menstrual health support.
302
+ </p>
303
+ </div>
304
+ <div className="miniGrid">
305
+ <article className="miniCard">
306
+ <div className="miniIcon">👩</div>
307
+ <h3>Adolescents</h3>
308
+ <p>Young women starting their menstrual health journey.</p>
309
+ </article>
310
+ <article className="miniCard">
311
+ <div className="miniIcon">🛡️</div>
312
+ <h3>Privacy Seekers</h3>
313
+ <p>Users who prefer anonymous and supportive health conversations.</p>
314
+ </article>
315
+ <article className="miniCard">
316
+ <div className="miniIcon">📝</div>
317
+ <h3>Learners</h3>
318
+ <p>Anyone who wants reliable menstrual health information in simple language.</p>
319
+ </article>
320
+ <article className="miniCard">
321
+ <div className="miniIcon">💬</div>
322
+ <h3>Support Seekers</h3>
323
+ <p>Users who want emotional reassurance alongside health guidance.</p>
324
+ </article>
325
+ </div>
326
+ </div>
327
+ </section>
328
+
329
+ <section className="contentSection" ref={sectionRefs.support}>
330
+ <div className="container supportGrid">
331
+ <div className="signupCard">
332
+ <h2>Get Support</h2>
333
+ <p>
334
+ Start chatting with EmpowerHer for private menstrual health support, period guidance,
335
+ and gentle reassurance.
336
+ </p>
337
+ <div className="ctaStack">
338
+ <button className="primaryBtn wide" onClick={() => setShowLanding(false)}>
339
+ Open Chat Support
340
+ </button>
341
+ <button className="secondaryBtn wide" onClick={() => scrollToSection("features")}>
342
+ View Features
343
+ </button>
344
+ </div>
345
+ <p className="finePrint">
346
+ EmpowerHer provides general support and education. It does not replace medical care.
347
+ </p>
348
+ </div>
349
+
350
+ <div className="benefitPanel">
351
+ <h2>Why Join Us?</h2>
352
+ <p>
353
+ A private digital space built for menstrual health confidence, awareness, and emotional support.
354
+ </p>
355
+ <div className="benefitList">
356
+ <div>
357
+ <strong>Private chat support</strong>
358
+ <span>Ask questions without fear of judgment or embarrassment.</span>
359
+ </div>
360
+ <div>
361
+ <strong>Educational resources</strong>
362
+ <span>Access guidance about periods, symptoms, hygiene, and healthy habits.</span>
363
+ </div>
364
+ <div>
365
+ <strong>Safe reassurance</strong>
366
+ <span>Receive calm responses designed for adolescents and young women.</span>
367
+ </div>
368
+ <div>
369
+ <strong>Always available</strong>
370
+ <span>Use the chatbot whenever you need support, day or night.</span>
371
+ </div>
372
+ </div>
373
+ </div>
374
+ </div>
375
+ </section>
376
+
377
+ <footer className="siteFooter">
378
+ <div className="container footerGrid">
379
+ <div>
380
+ <h3>EmpowerHer</h3>
381
+ <p>
382
+ A safe, private, and emotionally supportive menstrual health chatbot designed to
383
+ help adolescents and young women understand their bodies and receive reliable guidance.
384
+ </p>
385
+ </div>
386
+ <div>
387
+ <h3>Quick Links</h3>
388
+ <button onClick={() => scrollToSection("home")}>Home</button>
389
+ <button onClick={() => scrollToSection("about")}>About</button>
390
+ <button onClick={() => scrollToSection("features")}>Features</button>
391
+ <button onClick={() => setShowLanding(false)}>Chatbot</button>
392
+ <button onClick={() => scrollToSection("support")}>Contact</button>
393
+ </div>
394
+ <div>
395
+ <h3>Follow Us</h3>
396
+ <span>Facebook</span>
397
+ <span>Instagram</span>
398
+ <span>Twitter (X)</span>
399
+ <span>LinkedIn</span>
400
+ <span>YouTube</span>
401
+ </div>
402
+ </div>
403
+ <div className="copyrightBar">
404
+ <span>© 2026 EmpowerHer. A final year project dedicated to adolescent menstrual health support.</span>
405
+ </div>
406
+ </footer>
407
+ </div>
408
+ );
409
+ }
410
+
411
+ return (
412
+ <div className={`app ${chatView === "chat" ? "chatPage" : ""}`}>
413
+ <header className="topbar">
414
+ <div className="brand">
415
+ <div className="logo">
416
+ <img src={appLogo} alt="EmpowerHer logo" />
417
+ </div>
418
+ <div>
419
+ <h1>EmpowerHer</h1>
420
+ <p>Private chat support for periods, moods, and menstrual health questions.</p>
421
+ </div>
422
+ </div>
423
+
424
+ <div className="topActions">
425
+ {chatView === "medical" && (
426
+ <button className="ghost" onClick={() => setChatView("chat")}>
427
+ Back to Chat
428
+ </button>
429
+ )}
430
+ <button className="ghost" onClick={() => setShowLanding(true)}>
431
+ Back to Home
432
+ </button>
433
+ <button
434
+ className="ghost"
435
+ onClick={() => {
436
+ setMessages([initialBotMessage]);
437
+ setChatView("chat");
438
+ }}
439
+ >
440
+ Clear Chat
441
+ </button>
442
+ </div>
443
+ </header>
444
+
445
+ {chatView === "medical" ? (
446
+ <main className="medicalShell">
447
+ <section className="medicalHero card">
448
+ <h2>Medical Information</h2>
449
+ <p>
450
+ General menstrual health guidance about doctors, clinics, hospitals, and when you should
451
+ seek urgent help.
452
+ </p>
453
+ </section>
454
+
455
+ <section className="medicalGrid">
456
+ <article className="card medicalCard">
457
+ <h3>When to See a Doctor or Clinic</h3>
458
+ <ul className="medicalList">
459
+ <li>Periods are missing for several months or are repeatedly very irregular.</li>
460
+ <li>Cramps are severe or stop you from school, sleep, or normal activities.</li>
461
+ <li>You have unusual discharge, strong smell, itching, burning, or pain.</li>
462
+ <li>You feel worried about changes in bleeding, smell, or cycle timing.</li>
463
+ </ul>
464
+ </article>
465
+
466
+ <article className="card medicalCard">
467
+ <h3>When to Go to a Hospital Urgently</h3>
468
+ <ul className="medicalList">
469
+ <li>Very heavy bleeding that soaks pads quickly.</li>
470
+ <li>Fainting, severe dizziness, chest pain, or extreme weakness.</li>
471
+ <li>Strong pain with fever, vomiting, or feeling very unwell.</li>
472
+ <li>Any situation where you feel unsafe or cannot manage at home.</li>
473
+ </ul>
474
+ </article>
475
+
476
+ <article className="card medicalCard">
477
+ <h3>What to Tell the Doctor</h3>
478
+ <ul className="medicalList">
479
+ <li>How long symptoms have been happening.</li>
480
+ <li>How heavy the bleeding is and whether there are clots.</li>
481
+ <li>If there is pain, fever, dizziness, smell, itching, or unusual discharge.</li>
482
+ <li>Your age, the date of your last period, and what makes symptoms worse or better.</li>
483
+ </ul>
484
+ </article>
485
+
486
+ <article className="card medicalCard">
487
+ <h3>Finding Help</h3>
488
+ <p className="muted">
489
+ If symptoms are worrying, speak to a trusted adult, school nurse, clinic, family doctor,
490
+ gynecology service, or the nearest hospital. For urgent symptoms, do not wait for the chatbot.
491
+ </p>
492
+ <div className="medicalActions">
493
+ <button className="primaryBtn" onClick={() => setChatView("chat")}>
494
+ Back to Chat Support
495
+ </button>
496
+ </div>
497
+ </article>
498
+
499
+ <article className="card medicalCard medicalDoctors">
500
+ <h3>Menstrual Health / Gynecology Doctors (Sri Lanka)</h3>
501
+ <div className="doctorList">
502
+ <div>
503
+ <strong>1. Dr. Nadira Dassanayake</strong>
504
+ <p>Obstetrics and Gynecology</p>
505
+ <p>Focus: Menstrual disorders, PCOS, fertility</p>
506
+ <p>Hospitals: Asiri Hospital, Nawaloka Hospital</p>
507
+ <p>Why important: Well-known consultant for women’s reproductive health</p>
508
+ </div>
509
+ <div>
510
+ <strong>2. Dr. Harsha Atapattu</strong>
511
+ <p>Consultant Obstetrician and Gynecologist</p>
512
+ <p>Focus: Hormonal issues, menstrual irregularities, adolescent gynecology</p>
513
+ <p>Hospitals: Lanka Hospitals</p>
514
+ <p>Strength: Strong experience with teenage and young women’s health</p>
515
+ </div>
516
+ <div>
517
+ <strong>3. Dr. Rishya Manikavasagar</strong>
518
+ <p>Obstetrics and Gynecology</p>
519
+ <p>Focus: Menstrual pain, reproductive health, counseling</p>
520
+ <p>Hospitals: Durdans Hospital</p>
521
+ <p>Why useful: Good for emotional and physical health combined care</p>
522
+ </div>
523
+ <div>
524
+ <strong>4. Dr. Kapila Jayaratne</strong>
525
+ <p>Obstetrics and Gynecology</p>
526
+ <p>Focus: PCOS, menstrual cycle management, fertility</p>
527
+ <p>Hospitals: Ninewells Hospital</p>
528
+ <p>Highlight: Popular among young women</p>
529
+ </div>
530
+ <div>
531
+ <strong>5. Dr. Shiromi Maduwage</strong>
532
+ <p>Women’s health and pregnancy care</p>
533
+ <p>Focus: Menstrual health education, reproductive wellbeing</p>
534
+ <p>Hospitals: Castle Street Hospital for Women</p>
535
+ <p>Why important: Government sector expertise</p>
536
+ </div>
537
+ </div>
538
+ </article>
539
+
540
+ <article className="card medicalCard">
541
+ <h3>Government Clinics and Public Health Support</h3>
542
+ <ul className="medicalList">
543
+ <li><strong>Family Planning Association of Sri Lanka</strong> offers menstrual health advice, clinics, and education support.</li>
544
+ <li><strong>Ministry of Health Sri Lanka</strong> provides public health services, education programs, and government clinic access.</li>
545
+ <li>These services can be important for free or lower-cost menstrual health guidance and reproductive wellbeing support.</li>
546
+ </ul>
547
+ </article>
548
+ </section>
549
+ </main>
550
+ ) : (
551
+ <main className="main">
552
+ <section className="chatArea">
553
+ <div className="chatIntroCard">
554
+ <div className="chatIntroTop">
555
+ <div>
556
+ <h2>Get Support</h2>
557
+ <p>
558
+ Ask a question, describe a symptom, or continue a conversation in a private space.
559
+ </p>
560
+ </div>
561
+ <div className="introBadge">Private and supportive</div>
562
+ </div>
563
+ </div>
564
+
565
+ <div className="chatBox">
566
+ {messages.map((m, i) => (
567
+ <Bubble
568
+ key={`${m.role}-${i}-${m.text.slice(0, 8)}`}
569
+ role={m.role}
570
+ text={m.text}
571
+ meta={m.meta}
572
+ />
573
+ ))}
574
+
575
+ {loading && (
576
+ <div className="row bot">
577
+ <div className="bubble bot">
578
+ <div className="typing">
579
+ <span />
580
+ <span />
581
+ <span />
582
+ </div>
583
+ </div>
584
+ </div>
585
+ )}
586
+
587
+ <div ref={endRef} />
588
+ </div>
589
+
590
+ <div className="composer">
591
+ <textarea
592
+ value={input}
593
+ onChange={(e) => setInput(e.target.value)}
594
+ onKeyDown={onKeyDown}
595
+ placeholder="Type your question here..."
596
+ rows={2}
597
+ />
598
+ <button
599
+ className="sendBtn"
600
+ disabled={loading || !input.trim()}
601
+ onClick={() => void sendMessage()}
602
+ >
603
+ Send
604
+ </button>
605
+ </div>
606
+ </section>
607
+
608
+ <aside className="sidePanel">
609
+ <div className="card">
610
+ <h2>Quick Prompts</h2>
611
+ <p className="muted">Tap one to start faster.</p>
612
+ <div className="suggestions">
613
+ {suggestions.map((s) => (
614
+ <button
615
+ key={s}
616
+ className="suggestionBtn"
617
+ onClick={() => void sendMessage(s)}
618
+ >
619
+ {s}
620
+ </button>
621
+ ))}
622
+ </div>
623
+ </div>
624
+
625
+ <div className="card">
626
+ <h2>Safety Note</h2>
627
+ <p className="muted">
628
+ EmpowerHer offers general support, not medical diagnosis. If symptoms are severe,
629
+ such as fainting, fever, or very heavy bleeding, please speak to a trusted adult or
630
+ healthcare provider.
631
+ </p>
632
+ </div>
633
+
634
+ <div className="card compactInfo medicalShortcut">
635
+ <h2>Need Medical Info?</h2>
636
+ <p className="muted">
637
+ Read quick guidance about menstrual health, clinics, doctors, and hospital warning signs.
638
+ </p>
639
+ <button className="primaryBtn wide" onClick={() => setChatView("medical")}>
640
+ Medical Info
641
+ </button>
642
+ </div>
643
+ </aside>
644
+ </main>
645
+ )}
646
+ </div>
647
+ );
648
+ }
FRONTEND/src/app.jsx ADDED
@@ -0,0 +1,191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useEffect, useMemo, useRef, useState } from "react";
2
+ import "./App.css";
3
+
4
+ function Bubble({ role, text, meta }) {
5
+ return (
6
+ <div className={`row ${role}`}>
7
+ <div className={`bubble ${role}`}>
8
+ <div className="bubbleText">{text}</div>
9
+
10
+ {role === "bot" && meta && (
11
+ <div className="meta">
12
+ <span className="chip">Intent: {meta.intent || "-"}</span>
13
+ <span className="chip">Topic: {meta.topic || "-"}</span>
14
+
15
+ <span className="chip">
16
+ Emotions:{" "}
17
+ {Array.isArray(meta.emotions) && meta.emotions.length
18
+ ? meta.emotions.join(", ")
19
+ : "-"}
20
+ </span>
21
+
22
+ <span className="chip">
23
+ KB:{" "}
24
+ {Array.isArray(meta.kb_sources) && meta.kb_sources.length
25
+ ? meta.kb_sources.join(", ")
26
+ : "-"}
27
+ </span>
28
+ </div>
29
+ )}
30
+ </div>
31
+ </div>
32
+ );
33
+ }
34
+
35
+ export default function App() {
36
+ const [messages, setMessages] = useState([
37
+ {
38
+ role: "bot",
39
+ text: "Hi 💗 I’m EmpowerHer. You can talk to me about your feelings, or ask questions about periods. What’s on your mind?",
40
+ },
41
+ ]);
42
+ const [input, setInput] = useState("");
43
+ const [loading, setLoading] = useState(false);
44
+
45
+ const endRef = useRef(null);
46
+
47
+ const suggestions = useMemo(
48
+ () => [
49
+ "My period is late and I’m scared 😟",
50
+ "How can I reduce cramps naturally?",
51
+ "Is it okay to eat ice cream during periods?",
52
+ "I feel angry and sad before my period",
53
+ "Help me calm down, I’m overthinking",
54
+ ],
55
+ []
56
+ );
57
+
58
+ useEffect(() => {
59
+ endRef.current?.scrollIntoView({ behavior: "smooth" });
60
+ }, [messages, loading]);
61
+
62
+ async function sendMessage(text) {
63
+ const msg = (text ?? input).trim();
64
+ if (!msg || loading) return;
65
+
66
+ setMessages((prev) => [...prev, { role: "user", text: msg }]);
67
+ setInput("");
68
+ setLoading(true);
69
+
70
+ try {
71
+ const res = await fetch("/chat", {
72
+ method: "POST",
73
+ headers: { "Content-Type": "application/json" },
74
+ body: JSON.stringify({ message: msg }),
75
+ });
76
+
77
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
78
+
79
+ const data = await res.json();
80
+ const reply = data?.reply || "Sorry 😕 I couldn’t generate a reply.";
81
+
82
+ setMessages((prev) => [
83
+ ...prev,
84
+ { role: "bot", text: reply, meta: data },
85
+ ]);
86
+ } catch (e) {
87
+ setMessages((prev) => [
88
+ ...prev,
89
+ {
90
+ role: "bot",
91
+ text: "Oops 😕 I can’t connect to the backend. Is Flask running on http://127.0.0.1:5000 ?",
92
+ },
93
+ ]);
94
+ } finally {
95
+ setLoading(false);
96
+ }
97
+ }
98
+
99
+ function onKeyDown(e) {
100
+ if (e.key === "Enter" && !e.shiftKey) {
101
+ e.preventDefault();
102
+ sendMessage();
103
+ }
104
+ }
105
+
106
+ return (
107
+ <div className="app">
108
+ <header className="topbar">
109
+ <div className="brand">
110
+ <div className="logo">🌸</div>
111
+ <div>
112
+ <h1>EmpowerHer</h1>
113
+ <p>Menstrual Support Chatbot • Emotion + Knowledge Base</p>
114
+ </div>
115
+ </div>
116
+
117
+ <div className="topActions">
118
+ <button className="ghost" onClick={() => setMessages(messages.slice(0, 1))}>
119
+ Clear Chat
120
+ </button>
121
+ </div>
122
+ </header>
123
+
124
+ <main className="main">
125
+ <section className="chatArea">
126
+ <div className="chatBox">
127
+ {messages.map((m, i) => (
128
+ <Bubble key={i} role={m.role} text={m.text} meta={m.meta} />
129
+ ))}
130
+
131
+ {loading && (
132
+ <div className="row bot">
133
+ <div className="bubble bot">
134
+ <div className="typing">
135
+ <span />
136
+ <span />
137
+ <span />
138
+ </div>
139
+ </div>
140
+ </div>
141
+ )}
142
+
143
+ <div ref={endRef} />
144
+ </div>
145
+
146
+ <div className="composer">
147
+ <textarea
148
+ value={input}
149
+ onChange={(e) => setInput(e.target.value)}
150
+ onKeyDown={onKeyDown}
151
+ placeholder="Type here… (Enter = send, Shift+Enter = new line)"
152
+ rows={2}
153
+ />
154
+ <button className="sendBtn" disabled={loading || !input.trim()} onClick={() => sendMessage()}>
155
+ Send 💌
156
+ </button>
157
+ </div>
158
+ </section>
159
+
160
+ <aside className="sidePanel">
161
+ <div className="card">
162
+ <h2>Quick Prompts ✨</h2>
163
+ <p className="muted">Click one to test instantly.</p>
164
+
165
+ <div className="suggestions">
166
+ {suggestions.map((s) => (
167
+ <button key={s} className="suggestionBtn" onClick={() => sendMessage(s)}>
168
+ {s}
169
+ </button>
170
+ ))}
171
+ </div>
172
+ </div>
173
+
174
+ <div className="card">
175
+ <h2>Safety Note 🩷</h2>
176
+ <p className="muted">
177
+ I can give general guidance, not medical diagnosis. If symptoms are severe (fainting, heavy bleeding, fever),
178
+ please talk to a trusted adult or a clinic.
179
+ </p>
180
+ </div>
181
+ </aside>
182
+ </main>
183
+
184
+ <footer className="footer">
185
+ <span>© EmpowerHer • Local Demo</span>
186
+ <span className="dot">•</span>
187
+ <span>Backend: Flask /chat</span>
188
+ </footer>
189
+ </div>
190
+ );
191
+ }
FRONTEND/src/assets/react.svg ADDED
FRONTEND/src/index.css ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ font-family: system-ui, Arial, sans-serif;
3
+ color: #1f2937;
4
+ background-color: #ffffff;
5
+ text-rendering: optimizeLegibility;
6
+ -webkit-font-smoothing: antialiased;
7
+ -moz-osx-font-smoothing: grayscale;
8
+ }
9
+
10
+ * {
11
+ box-sizing: border-box;
12
+ }
13
+
14
+ body {
15
+ margin: 0;
16
+ }
17
+
18
+ #root {
19
+ min-height: 100vh;
20
+ }
FRONTEND/src/main.tsx ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import { StrictMode } from 'react'
2
+ import { createRoot } from 'react-dom/client'
3
+ import './index.css'
4
+ import App from './App.tsx'
5
+
6
+ createRoot(document.getElementById('root')!).render(
7
+ <StrictMode>
8
+ <App />
9
+ </StrictMode>,
10
+ )
FRONTEND/tsconfig.app.json ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4
+ "target": "ES2022",
5
+ "useDefineForClassFields": true,
6
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
7
+ "module": "ESNext",
8
+ "types": ["vite/client"],
9
+ "skipLibCheck": true,
10
+
11
+ /* Bundler mode */
12
+ "moduleResolution": "bundler",
13
+ "allowImportingTsExtensions": true,
14
+ "verbatimModuleSyntax": true,
15
+ "moduleDetection": "force",
16
+ "noEmit": true,
17
+ "jsx": "react-jsx",
18
+
19
+ /* Linting */
20
+ "strict": true,
21
+ "noUnusedLocals": true,
22
+ "noUnusedParameters": true,
23
+ "erasableSyntaxOnly": true,
24
+ "noFallthroughCasesInSwitch": true,
25
+ "noUncheckedSideEffectImports": true
26
+ },
27
+ "include": ["src"]
28
+ }
FRONTEND/tsconfig.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ { "path": "./tsconfig.app.json" },
5
+ { "path": "./tsconfig.node.json" }
6
+ ]
7
+ }
FRONTEND/tsconfig.node.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4
+ "target": "ES2023",
5
+ "lib": ["ES2023"],
6
+ "module": "ESNext",
7
+ "types": ["node"],
8
+ "skipLibCheck": true,
9
+
10
+ /* Bundler mode */
11
+ "moduleResolution": "bundler",
12
+ "allowImportingTsExtensions": true,
13
+ "verbatimModuleSyntax": true,
14
+ "moduleDetection": "force",
15
+ "noEmit": true,
16
+
17
+ /* Linting */
18
+ "strict": true,
19
+ "noUnusedLocals": true,
20
+ "noUnusedParameters": true,
21
+ "erasableSyntaxOnly": true,
22
+ "noFallthroughCasesInSwitch": true,
23
+ "noUncheckedSideEffectImports": true
24
+ },
25
+ "include": ["vite.config.ts"]
26
+ }
FRONTEND/vite.config.ts ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { defineConfig } from "vite";
2
+ import react from "@vitejs/plugin-react";
3
+
4
+ export default defineConfig({
5
+ plugins: [react()],
6
+ server: {
7
+ proxy: {
8
+ "/chat": "http://127.0.0.1:5000",
9
+ },
10
+ },
11
+ });
README.md ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: EmpowerHer
3
+ emoji: 😻
4
+ colorFrom: purple
5
+ colorTo: blue
6
+ sdk: docker
7
+ pinned: false
8
+ license: mit
9
+ short_description: An emotionally sensitive menstrual health Chatbot
10
+ ---
11
+
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
README_DEPLOY.md ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Deployment
2
+
3
+ This project is prepared for free deployment on Hugging Face Spaces using Docker.
4
+
5
+ ## What is included
6
+
7
+ - `Dockerfile`: builds the React frontend and serves the Flask app with Gunicorn
8
+ - `requirements.txt`: Python runtime dependencies
9
+ - `.dockerignore`: excludes local virtualenvs, build output, and caches
10
+
11
+ ## Deploy steps
12
+
13
+ 1. Push the `EmpowerHer_Chatbot` folder contents to your GitHub repository.
14
+ 2. Go to Hugging Face Spaces.
15
+ 3. Create a new Space.
16
+ 4. Choose `Docker` as the SDK.
17
+ 5. Link the Space to your GitHub repository or upload these files.
18
+ 6. Wait for the image build to finish.
19
+ 7. Open the Space URL and test the chatbot.
20
+
21
+ ## Runtime notes
22
+
23
+ - The app listens on port `7860`.
24
+ - The frontend is built from `FRONTEND/` during the Docker build.
25
+ - Flask serves the built frontend and the `/chat` API from one container.
26
+ - The first startup may take longer because transformer models need to download.
app/app.py ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # app/app.py
2
+
3
+ from pathlib import Path
4
+ from flask import Flask, request, jsonify, send_from_directory
5
+ from flask_cors import CORS
6
+ from services.chat_service import ChatService
7
+
8
+ BASE_DIR = Path(__file__).resolve().parent.parent
9
+ FRONTEND_DIST = BASE_DIR / "FRONTEND" / "dist"
10
+
11
+ app = Flask(
12
+ __name__,
13
+ static_folder=str(FRONTEND_DIST),
14
+ static_url_path="/",
15
+ )
16
+ CORS(app)
17
+
18
+ chatbot = ChatService()
19
+
20
+ @app.route("/")
21
+ def index():
22
+ index_path = FRONTEND_DIST / "index.html"
23
+ if index_path.exists():
24
+ return send_from_directory(app.static_folder, "index.html")
25
+ return (
26
+ "React build not found. Run `npm install` and `npm run build` in "
27
+ "EmpowerHer_Chatbot/FRONTEND, then start the backend.",
28
+ 404,
29
+ )
30
+
31
+
32
+ @app.route("/<path:path>")
33
+ def static_proxy(path: str):
34
+ file_path = FRONTEND_DIST / path
35
+ if file_path.exists():
36
+ return send_from_directory(app.static_folder, path)
37
+ return send_from_directory(app.static_folder, "index.html")
38
+
39
+ @app.route("/chat", methods=["POST"])
40
+ def chat():
41
+ data = request.json
42
+ message = data.get("message", "")
43
+ history = data.get("history", [])
44
+
45
+ result = chatbot.generate_reply(message, history=history)
46
+
47
+ return jsonify({
48
+ "reply": result.reply,
49
+ "emotions": result.emotions,
50
+ "raw_emotions": result.raw_emotions,
51
+ "topic": result.topic,
52
+ "intent": result.intent,
53
+ "kb_sources": result.kb_sources,
54
+ })
55
+
56
+
57
+
58
+ if __name__ == "__main__":
59
+ app.run(debug=True)
app/templates/chat.html ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>EmpowerHer Chatbot</title>
5
+ <style>
6
+ body { font-family: Arial, sans-serif; background: #fce8f2; padding: 20px; }
7
+ #chat-box { width: 100%; height: 500px; border: 1px solid #ccc; padding: 10px; overflow-y: scroll; background: white; }
8
+ #msg { width: 80%; padding: 10px; }
9
+ #send { padding: 10px; background: #e91e63; color: white; border: none; }
10
+ .meta { color: #444; font-size: 12px; margin: 2px 0 10px 0; }
11
+ .meta span { margin-right: 12px; }
12
+ </style>
13
+ </head>
14
+ <body>
15
+
16
+ <h2>EmpowerHer – Menstrual Support Chatbot</h2>
17
+
18
+ <div id="chat-box"></div>
19
+
20
+ <input id="msg" type="text" placeholder="Type your message...">
21
+ <button id="send">Send</button>
22
+
23
+ <script>
24
+ document.getElementById("send").onclick = async function() {
25
+ const msg = document.getElementById("msg").value;
26
+ if (!msg) return;
27
+
28
+ const box = document.getElementById("chat-box");
29
+ box.innerHTML += `<p><b>You:</b> ${msg}</p>`;
30
+
31
+ const res = await fetch("http://127.0.0.1:5000/chat", {
32
+ method: "POST",
33
+ headers: {"Content-Type": "application/json"},
34
+ body: JSON.stringify({ message: msg })
35
+ });
36
+
37
+ const data = await res.json();
38
+ const emotions = Array.isArray(data.emotions) && data.emotions.length ? data.emotions.join(", ") : "none";
39
+ const intent = data.intent || "unknown";
40
+ const topic = data.topic || "unknown";
41
+
42
+ box.innerHTML += `<p><b>Bot:</b> ${data.reply}</p>`;
43
+ box.innerHTML += `<div class="meta"><span><b>Emotions:</b> ${emotions}</span><span><b>Intent:</b> ${intent}</span><span><b>Topic:</b> ${topic}</span></div>`;
44
+ box.scrollTop = box.scrollHeight;
45
+
46
+ document.getElementById("msg").value = "";
47
+ };
48
+ </script>
49
+
50
+ </body>
51
+ </html>
eval/__init__.py ADDED
File without changes
eval/compare_emotion_vs_noemotion.py ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from services.chat_service import ChatService
2
+
3
+ TESTS = [
4
+ "I feel scared because my period is late.",
5
+ "Can I drink coffee when I have cramps?",
6
+ "I feel lonely and I have nobody to talk to.",
7
+ "Is it normal to have smell during periods?",
8
+ "How can I reduce cramps naturally?",
9
+ ]
10
+
11
+ bot_emotion = ChatService(use_emotions=True)
12
+ bot_no_emotion = ChatService(use_emotions=False)
13
+
14
+ for msg in TESTS:
15
+ r1 = bot_emotion.generate_reply(msg).reply
16
+ r2 = bot_no_emotion.generate_reply(msg).reply
17
+
18
+ print("\n" + "="*70)
19
+ print("USER:", msg)
20
+ print("\n--- WITH EMOTION ---")
21
+ print(r1)
22
+ print("\n--- WITHOUT EMOTION ---")
23
+ print(r2)
eval/compare_kb_vs_nokb.py ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from services.chat_service import ChatService
2
+
3
+ TESTS = [
4
+ "I feel scared because my period is late.",
5
+ "Can I drink coffee when I have cramps?",
6
+ "I feel lonely and I have nobody to talk to.",
7
+ "Is it normal to have smell during periods?",
8
+ "How can I reduce cramps naturally?",
9
+ ]
10
+
11
+ bot_with_kb = ChatService(use_kb=True)
12
+ bot_without_kb = ChatService(use_kb=False)
13
+
14
+ for msg in TESTS:
15
+ r_with = bot_with_kb.generate_reply(msg)
16
+ r_without = bot_without_kb.generate_reply(msg)
17
+
18
+ print("\n" + "=" * 70)
19
+ print("USER:", msg)
20
+ print("\n--- WITH KB ---")
21
+ print(r_with.reply)
22
+ if r_with.kb_sources:
23
+ print("KB sources:", ", ".join(r_with.kb_sources))
24
+ print("\n--- WITHOUT KB ---")
25
+ print(r_without.reply)
eval/compare_rag_vs_nonrag.py ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from services.chat_service import ChatService
2
+
3
+
4
+ TESTS = [
5
+ "I feel scared because my period is late.",
6
+ "Can I drink coffee when I have cramps?",
7
+ "Is it normal to have smell during periods?",
8
+ "How can I reduce cramps naturally?",
9
+ "I have brown spotting and I am worried. What should I do?",
10
+ ]
11
+
12
+
13
+ bot_with_rag = ChatService(use_kb=True, use_rag=True)
14
+ bot_without_rag = ChatService(use_kb=True, use_rag=False)
15
+
16
+
17
+ for msg in TESTS:
18
+ r_rag = bot_with_rag.generate_reply(msg)
19
+ r_nonrag = bot_without_rag.generate_reply(msg)
20
+
21
+ print("\n" + "=" * 70)
22
+ print("USER:", msg)
23
+
24
+ print("\n--- WITH RAG ---")
25
+ print(r_rag.reply)
26
+ if r_rag.kb_sources:
27
+ print("KB sources:", ", ".join(r_rag.kb_sources))
28
+
29
+ print("\n--- WITHOUT RAG ---")
30
+ print(r_nonrag.reply)
31
+ if r_nonrag.kb_sources:
32
+ print("KB sources:", ", ".join(r_nonrag.kb_sources))
eval/dg_eval.csv ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ user_message
2
+ How can I reduce cramps naturally?
3
+ Is it normal to have brown spotting before my period?
4
+ What helps with dizziness during periods?
5
+ Can I drink coffee when I have cramps?
6
+ How often should I change my pad?
7
+ Is a late period normal for teens?
8
+ How do I clean a menstrual cup safely?
9
+ Can stress make my period late?
10
+ Is it okay to exercise with cramps?
11
+ What does a fishy smell mean during periods?
12
+ How do I deal with heavy bleeding at school?
13
+ Is back pain normal during periods?
14
+ Can I swim while on my period?
15
+ What foods help with bloating?
16
+ How do I track my cycle better?
17
+ Is light spotting after my period normal?
18
+ Can dehydration make cramps worse?
19
+ How to sleep better with period pain?
20
+ Is it normal to feel angry before my period?
21
+ When should I see a doctor about cramps?
22
+ Can I use a hot water bottle for cramps?
23
+ What should I do if I bleed through at night?
24
+ How do I handle cramps during exams?
25
+ Is mild nausea normal during periods?
26
+ Can hormones cause mood swings before bleeding?
27
+ How do I talk to my mom about period pain?
28
+ Is it okay to take pain relief for cramps?
29
+ What is normal cycle length for teens?
30
+ Why do I feel tired on my period?
31
+ How to manage period odors safely?
32
+ Can I shower while on my period?
33
+ Is it normal to have small clots?
34
+ How do I handle cramps in PE class?
35
+ Can skipping meals affect my period?
36
+ What should I do if I feel faint during my period?
37
+ Is it normal to bleed longer than seven days?
38
+ How do I calm anxiety about leaking?
39
+ Can I wear a tampon overnight?
40
+ What helps with breast soreness before period?
41
+ Is it normal to have diarrhea during my period?
42
+ I am worried my period is late again.
43
+ My cramps make me nervous about school tomorrow.
44
+ I am anxious because the bleeding is heavier than usual.
45
+ I feel panic when I think about my period starting in class.
46
+ I am scared the smell means something is wrong.
47
+ I am worried about fainting during sports.
48
+ My heart races when the pain comes back.
49
+ I am nervous to tell my mom about the spotting.
50
+ I feel shaky when I see small clots.
51
+ I am afraid I will leak through my pad.
52
+ I am anxious because I missed my period last month.
53
+ I cannot stop worrying about the discharge color.
54
+ I am nervous about taking a bus while cramping.
55
+ I am scared because I woke up dizzy on my period.
56
+ I feel uneasy about going to the clinic alone.
57
+ I am worried the cramps mean something serious.
58
+ I feel tense every time the pain starts.
59
+ I am anxious my friends will notice the smell.
60
+ I am scared the cramps will not stop.
61
+ I worry I will faint in class.
62
+ I feel restless waiting for my period to come.
63
+ I am anxious because my cycle is irregular.
64
+ I fear I might have an infection.
65
+ I am nervous to try a tampon.
66
+ I am scared because my back hurts a lot.
67
+ I am worried the bleeding might soak through at night.
68
+ I feel sad and low during my period.
69
+ My mood drops and I want to cry.
70
+ I feel lonely dealing with cramps by myself.
71
+ I am discouraged because the pain keeps coming back.
72
+ I feel down when I miss activities because of cramps.
73
+ I feel heavy-hearted when I see blood again.
74
+ I am upset that my period makes me stay home.
75
+ I feel gloomy and tired all day.
76
+ I feel hopeless when the cramps wake me up.
77
+ I am disappointed that I missed practice.
78
+ I feel blue and just want to sleep.
79
+ I feel miserable because my stomach hurts.
80
+ I feel weepy for no reason before my period.
81
+ I am sad that I have to cancel plans again.
82
+ I feel drained and unmotivated.
83
+ I am heartbroken that I cannot focus in class.
84
+ I feel tearful thinking about the pain returning.
85
+ I am down because my clothes got stained.
86
+ I feel sorrowful and isolated.
87
+ I feel low energy and want to curl up.
88
+ I am sad that my mom is busy when I need support.
89
+ I feel depressed when I see heavy bleeding.
90
+ I feel gloomy about having cramps every month.
91
+ I am upset that nothing seems to help.
92
+ I feel melancholy during PMS days.
93
+ I feel empty and just want quiet time.
94
+ I am angry that cramps ruin my day.
95
+ I feel irritated by the constant pain.
96
+ I am frustrated that my period is so unpredictable.
97
+ I feel mad when people tell me it is normal pain.
98
+ I am annoyed I have to skip sports again.
99
+ I feel rage when cramps hit in class.
100
+ I am upset that no one takes my pain seriously.
101
+ I am irritated by the smell during my period.
102
+ I feel anger when my pad leaks.
103
+ I am mad that medicines do not always work.
104
+ I am annoyed that my back hurts this much.
105
+ I am frustrated by the mood swings.
106
+ I feel furious about the heavy bleeding.
107
+ I am irritated that I cannot sleep because of cramps.
108
+ I am annoyed that I have to change pads so often.
109
+ I am resentful that my period starts on big days.
110
+ I feel cross when my stomach cramps so hard.
111
+ I am annoyed by the dizziness that comes with it.
112
+ I feel upset when I stain clothes at school.
113
+ I am mad at my body for hurting.
114
+ I am irritated that cramps ruin my focus.
115
+ I am frustrated that I cannot predict the timing.
116
+ I feel angry about the constant bloating.
117
+ I am mad that the pain keeps coming back.
118
+ I am annoyed that I have to carry pads everywhere.
119
+ I feel heated because my mood is out of control.
120
+ I feel mixed emotions about my late period.
121
+ I am unsure if I am worried or just tired.
122
+ I feel both sad and relieved when my period starts.
123
+ I am confused whether this pain is normal.
124
+ I feel anxious and hopeful at the same time.
125
+ I am both scared and curious about using a cup.
126
+ I feel uneasy but also proud for handling this.
127
+ I am conflicted about telling my friend how I feel.
128
+ I feel nervous yet calm when I breathe slowly.
129
+ I feel uncertain about the spotting I see.
130
+ I am both annoyed and grateful for support.
131
+ I feel a mix of fear and determination during cramps.
132
+ I am torn between resting and going to class.
133
+ I feel both shy and relieved to ask my mom for help.
134
+ I am unsure whether to see a doctor now.
135
+ I feel nervous but also empowered to track my cycle.
136
+ I am feeling a mix of anger and sadness today.
137
+ I feel both hopeful and worried about the pain easing.
138
+ I am conflicted about trying a heating pad at school.
139
+ I feel both tense and comforted by talking here.
140
+ I am unsure if my mood swings are normal.
141
+ I feel a blend of tiredness and courage.
142
+ I am both anxious and ready to learn about periods.
143
+ I feel uncertain but want clear answers.
144
+ I am mixed between being scared and staying calm.
145
+ I feel both irritated and understanding of my body.
eval/dg_results.csv ADDED
@@ -0,0 +1,747 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ user_message,reply,user_emotions,bot_emotions,user_bucket,bot_bucket,emotion_match,intent,topic
2
+ How can I reduce cramps naturally?,"Thank you for opening up — it is really brave to share how you feel.
3
+
4
+ What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles. What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period.
5
+
6
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
7
+
8
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,gratitude|caring|approval,mixed,mixed,1,info_question,pain_cramps
9
+ Is it normal to have brown spotting before my period?,"Thank you for opening up — it is really brave to share how you feel.
10
+
11
+ What it is: Spotting means light bleeding between periods. Brown discharge is often old blood leaving the body. What is normal: Light spotting or brown discharge can happen at the start or end of a period, or due to hormone changes. What it is: The first period usually happens between ages 9–15. Common signs before first period: White discharge, breast development, body hair growth, mood changes. How to prepare: Keep pads in your bag and talk to a trusted adult.
12
+
13
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
14
+
15
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,gratitude|caring|approval,mixed,mixed,1,info_question,spotting
16
+ What helps with dizziness during periods?,"Thank you for opening up — it is really brave to share how you feel.
17
+
18
+ What it means: Some girls have heavier periods than others. Heavy bleeding means soaking through pads very quickly or bleeding for many days. Signs of heavy bleeding: Needing to change pads every 1–2 hours, passing large blood clots, feeling very tired, dizzy, or weak. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
19
+
20
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
21
+
22
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,gratitude|caring|approval,mixed,mixed,1,info_question,unknown
23
+ Can I drink coffee when I have cramps?,"I am here with you. Let us take this one step at a time.
24
+
25
+ What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles. What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period.
26
+
27
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
28
+
29
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|neutral|confusion,caring|neutral|approval,mixed,mixed,1,info_question,pain_cramps
30
+ How often should I change my pad?,"Thank you for opening up — it is really brave to share how you feel.
31
+
32
+ Why hygiene matters: Good hygiene helps prevent irritation, infection, and discomfort during periods. Pad changing: Many people change pads every 4–6 hours, depending on flow. Change sooner if the pad feels wet or uncomfortable. What it means: Some girls have heavier periods than others. Heavy bleeding means soaking through pads very quickly or bleeding for many days. Signs of heavy bleeding: Needing to change pads every 1–2 hours, passing large blood clots, feeling very tired, dizzy, or weak.
33
+
34
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
35
+
36
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|neutral|confusion,gratitude|caring|approval,mixed,mixed,1,info_question,hygiene
37
+ Is a late period normal for teens?,"Thank you for opening up — it is really brave to share how you feel.
38
+
39
+ What it means: A period can sometimes come earlier or later than expected. In teenagers, periods are often irregular during the first 1–3 years after the first period. Common reasons: Stress, school exams, lack of sleep, sudden weight changes, illness, heavy exercise, and normal hormone changes can delay a period. Why it happens: Stress, exams, changes in sleep, illness, travel, sudden weight changes, heavy sports, and normal hormone shifts can all make a period come later than expected. In the first 1–3 years after your first period, it is...
40
+
41
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
42
+
43
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,gratitude|caring|approval,mixed,mixed,1,info_question,late_period
44
+ How do I clean a menstrual cup safely?,"It is okay to have mixed feelings. You are doing your best.
45
+
46
+ Why hygiene matters: Good hygiene helps prevent irritation, infection, and discomfort during periods. Pad changing: Many people change pads every 4–6 hours, depending on flow. Change sooner if the pad feels wet or uncomfortable. What is normal: A mild, earthy smell during periods can happen because blood and tissue are leaving the body. Clear or white discharge with little or no smell between periods is also normal. Freshness tips: Change pads regularly, wash the vulva with water (no harsh soaps inside the vagina), and wear breathable cotton...
47
+
48
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
49
+
50
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",confusion|curiosity|neutral,caring|approval|neutral,mixed,mixed,1,info_question,hygiene
51
+ Can stress make my period late?,"Thank you for opening up — it is really brave to share how you feel.
52
+
53
+ Why it happens: Stress, exams, changes in sleep, illness, travel, sudden weight changes, heavy sports, and normal hormone shifts can all make a period come later than expected. In the first 1–3 years after your first period, it is common to be irregular. What to watch: Track your cycle dates, sleep, and stress. What it means: A period can sometimes come earlier or later than expected. In teenagers, periods are often irregular during the first 1–3 years after the first period. Common reasons: Stress, school exams, lack of sleep, sudden weight...
54
+
55
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
56
+
57
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,gratitude|caring|approval,mixed,mixed,1,info_question,late_period
58
+ Is it okay to exercise with cramps?,"I am here with you. Let us take this one step at a time.
59
+
60
+ Is exercise allowed: Yes, light to moderate exercise is usually safe during periods. Possible benefits: Exercise can help reduce cramps and improve mood for some people. Listen to your body: If you feel very tired or have strong pain, it is okay to rest. What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period.
61
+
62
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
63
+
64
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|neutral|confusion,caring|approval|neutral,mixed,mixed,1,info_question,pain_cramps
65
+ What does a fishy smell mean during periods?,"It is okay to have mixed feelings. You are doing your best.
66
+
67
+ What is normal: A mild, earthy smell during periods can happen because blood and tissue are leaving the body. Clear or white discharge with little or no smell between periods is also normal. Freshness tips: Change pads regularly, wash the vulva with water (no harsh soaps inside the vagina), and wear breathable cotton underwear. Why hygiene matters: Good hygiene helps prevent irritation, infection, and discomfort during periods. Pad changing: Many people change pads every 4–6 hours, depending on flow. Change sooner if the pad feels wet or...
68
+
69
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
70
+
71
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,caring|approval|neutral,mixed,mixed,1,info_question,unknown
72
+ How do I deal with heavy bleeding at school?,"I am here with you. Let us take this one step at a time.
73
+
74
+ What it means: Some girls have heavier periods than others. Heavy bleeding means soaking through pads very quickly or bleeding for many days. Signs of heavy bleeding: Needing to change pads every 1–2 hours, passing large blood clots, feeling very tired, dizzy, or weak. Seek help if you have: Very heavy bleeding Severe pain Fainting or dizziness Fever Strong bad-smelling discharge Periods missing for many months Feeling unsafe or very distressed Talking to a doctor or clinic is safe and confidential. You deserve care and support.
75
+
76
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
77
+
78
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,caring|approval|neutral,mixed,mixed,1,info_question,heavy_bleeding
79
+ Is back pain normal during periods?,"I am here with you. Let us take this one step at a time.
80
+
81
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
82
+
83
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
84
+
85
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|neutral|confusion,caring|neutral|approval,mixed,mixed,1,info_question,pain_cramps
86
+ Can I swim while on my period?,"Thank you for opening up — it is really brave to share how you feel.
87
+
88
+ Is it safe: Yes, bathing during your period is safe and helps you feel clean and comfortable. Swimming: Some people choose to swim using appropriate menstrual products. Others prefer to avoid swimming during heavy flow. Is exercise allowed: Yes, light to moderate exercise is usually safe during periods. Possible benefits: Exercise can help reduce cramps and improve mood for some people. Listen to your body: If you feel very tired or have strong pain, it is okay to rest.
89
+
90
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
91
+
92
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|neutral|confusion,gratitude|caring|approval,mixed,mixed,1,info_question,unknown
93
+ What foods help with bloating?,"It is okay to have mixed feelings. You are doing your best.
94
+
95
+ Ice cream and cold foods: Eating ice cream is usually safe during periods. Cold foods do not stop periods. What to notice: Some people feel cold foods make cramps worse. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
96
+
97
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
98
+
99
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|neutral|confusion,caring|neutral|approval,mixed,mixed,1,info_question,food_diet
100
+ How do I track my cycle better?,"I am here with you. Let us take this one step at a time.
101
+
102
+ Why it happens: Stress, exams, changes in sleep, illness, travel, sudden weight changes, heavy sports, and normal hormone shifts can all make a period come later than expected. In the first 1–3 years after your first period, it is common to be irregular. What to watch: Track your cycle dates, sleep, and stress. Why hygiene matters: Good hygiene helps prevent irritation, infection, and discomfort during periods. Pad changing: Many people change pads every 4–6 hours, depending on flow. Change sooner if the pad feels wet or uncomfortable.
103
+
104
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
105
+
106
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,caring|neutral|approval,mixed,mixed,1,info_question,unknown
107
+ Is light spotting after my period normal?,"I am here with you. Let us take this one step at a time.
108
+
109
+ What it is: Spotting means light bleeding between periods. Brown discharge is often old blood leaving the body. What is normal: Light spotting or brown discharge can happen at the start or end of a period, or due to hormone changes. What is normal: A mild, earthy smell during periods can happen because blood and tissue are leaving the body. Clear or white discharge with little or no smell between periods is also normal. Freshness tips: Change pads regularly, wash the vulva with water (no harsh soaps inside the vagina), and wear breathable...
110
+
111
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
112
+
113
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,caring|neutral|approval,mixed,mixed,1,info_question,spotting
114
+ Can dehydration make cramps worse?,"I am here with you. Let us take this one step at a time.
115
+
116
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
117
+
118
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
119
+
120
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,caring|neutral|approval,mixed,mixed,1,info_question,pain_cramps
121
+ How to sleep better with period pain?,"Thank you for opening up — it is really brave to share how you feel.
122
+
123
+ What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles. What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period.
124
+
125
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
126
+
127
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|caring,gratitude|caring|approval,mixed,mixed,1,info_question,pain_cramps
128
+ Is it normal to feel angry before my period?,"I am here with you. Let us take this one step at a time.
129
+
130
+ What it is: Hormone changes before periods can affect mood, causing sadness, anger, or irritation. What is normal: Feeling more emotional before a period is common. What may help: Rest, calming music, talking to someone you trust, and light activity. What it is: The first period usually happens between ages 9–15. Common signs before first period: White discharge, breast development, body hair growth, mood changes. How to prepare: Keep pads in your bag and talk to a trusted adult.
131
+
132
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
133
+
134
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,caring|neutral|approval,mixed,mixed,1,info_question,mood_swings
135
+ When should I see a doctor about cramps?,"Thank you for opening up — it is really brave to share how you feel.
136
+
137
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
138
+
139
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
140
+
141
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,gratitude|caring|approval,mixed,mixed,1,info_question,pain_cramps
142
+ Can I use a hot water bottle for cramps?,"Thank you for opening up — it is really brave to share how you feel.
143
+
144
+ Ice cream and cold foods: Eating ice cream is usually safe during periods. Cold foods do not stop periods. What to notice: Some people feel cold foods make cramps worse. What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period.
145
+
146
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
147
+
148
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|neutral|confusion,gratitude|caring|approval,mixed,mixed,1,info_question,pain_cramps
149
+ What should I do if I bleed through at night?,"I am here with you. Let us take this one step at a time.
150
+
151
+ What it means: Some girls have heavier periods than others. Heavy bleeding means soaking through pads very quickly or bleeding for many days. Signs of heavy bleeding: Needing to change pads every 1–2 hours, passing large blood clots, feeling very tired, dizzy, or weak. Seek help if you have: Very heavy bleeding Severe pain Fainting or dizziness Fever Strong bad-smelling discharge Periods missing for many months Feeling unsafe or very distressed Talking to a doctor or clinic is safe and confidential. You deserve care and support.
152
+
153
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
154
+
155
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",confusion|curiosity|neutral,caring|approval|neutral,mixed,mixed,1,info_question,unknown
156
+ How do I handle cramps during exams?,"Thank you for opening up — it is really brave to share how you feel.
157
+
158
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
159
+
160
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
161
+
162
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,gratitude|caring|approval,mixed,mixed,1,info_question,pain_cramps
163
+ Is mild nausea normal during periods?,"Thank you for opening up — it is really brave to share how you feel.
164
+
165
+ What is normal: A mild, earthy smell during periods can happen because blood and tissue are leaving the body. Clear or white discharge with little or no smell between periods is also normal. Freshness tips: Change pads regularly, wash the vulva with water (no harsh soaps inside the vagina), and wear breathable cotton underwear. What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or...
166
+
167
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
168
+
169
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,gratitude|caring|approval,mixed,mixed,1,info_question,unknown
170
+ Can hormones cause mood swings before bleeding?,"Thank you for opening up — it is really brave to share how you feel.
171
+
172
+ What it is: Hormone changes before periods can affect mood, causing sadness, anger, or irritation. What is normal: Feeling more emotional before a period is common. What may help: Rest, calming music, talking to someone you trust, and light activity. Why it happens: Stress, exams, changes in sleep, illness, travel, sudden weight changes, heavy sports, and normal hormone shifts can all make a period come later than expected. In the first 1–3 years after your first period, it is common to be irregular. What to watch: Track your cycle dates,...
173
+
174
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
175
+
176
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,gratitude|caring|approval,mixed,mixed,1,info_question,mood_swings
177
+ How do I talk to my mom about period pain?,"Thank you for opening up — it is really brave to share how you feel.
178
+
179
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
180
+
181
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
182
+
183
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,gratitude|caring|approval,mixed,mixed,1,info_question,pain_cramps
184
+ Is it okay to take pain relief for cramps?,"Thank you for opening up — it is really brave to share how you feel.
185
+
186
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
187
+
188
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
189
+
190
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|caring|neutral,gratitude|caring|approval,mixed,mixed,1,info_question,pain_cramps
191
+ What is normal cycle length for teens?,"Thank you for opening up — it is really brave to share how you feel.
192
+
193
+ What it means: A period can sometimes come earlier or later than expected. In teenagers, periods are often irregular during the first 1–3 years after the first period. Common reasons: Stress, school exams, lack of sleep, sudden weight changes, illness, heavy exercise, and normal hormone changes can delay a period. What it is: The first period usually happens between ages 9–15. Common signs before first period: White discharge, breast development, body hair growth, mood changes. How to prepare: Keep pads in your bag and talk to a trusted adult.
194
+
195
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
196
+
197
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|neutral|confusion,gratitude|caring|approval,mixed,mixed,1,info_question,unknown
198
+ Why do I feel tired on my period?,"I am here with you. Let us take this one step at a time.
199
+
200
+ Why it happens: Stress, exams, changes in sleep, illness, travel, sudden weight changes, heavy sports, and normal hormone shifts can all make a period come later than expected. In the first 1–3 years after your first period, it is common to be irregular. What to watch: Track your cycle dates, sleep, and stress. What it means: Some girls have heavier periods than others. Heavy bleeding means soaking through pads very quickly or bleeding for many days. Signs of heavy bleeding: Needing to change pads every 1–2 hours, passing large blood clots,...
201
+
202
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
203
+
204
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,caring|neutral|approval,mixed,mixed,1,info_question,unknown
205
+ How to manage period odors safely?,"Thank you for opening up — it is really brave to share how you feel.
206
+
207
+ What is normal: A mild, earthy smell during periods can happen because blood and tissue are leaving the body. Clear or white discharge with little or no smell between periods is also normal. Freshness tips: Change pads regularly, wash the vulva with water (no harsh soaps inside the vagina), and wear breathable cotton underwear. Why hygiene matters: Good hygiene helps prevent irritation, infection, and discomfort during periods. Pad changing: Many people change pads every 4–6 hours, depending on flow. Change sooner if the pad feels wet or...
208
+
209
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
210
+
211
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,gratitude|caring|approval,mixed,mixed,1,info_question,unknown
212
+ Can I shower while on my period?,"It is okay to have mixed feelings. You are doing your best.
213
+
214
+ Is it safe: Yes, bathing during your period is safe and helps you feel clean and comfortable. Swimming: Some people choose to swim using appropriate menstrual products. Others prefer to avoid swimming during heavy flow. What is normal: A mild, earthy smell during periods can happen because blood and tissue are leaving the body. Clear or white discharge with little or no smell between periods is also normal. Freshness tips: Change pads regularly, wash the vulva with water (no harsh soaps inside the vagina), and wear breathable cotton underwear.
215
+
216
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
217
+
218
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|neutral|confusion,caring|approval|neutral,mixed,mixed,1,info_question,unknown
219
+ Is it normal to have small clots?,"I am here with you. Let us take this one step at a time.
220
+
221
+ What it means: Some girls have heavier periods than others. Heavy bleeding means soaking through pads very quickly or bleeding for many days. Signs of heavy bleeding: Needing to change pads every 1–2 hours, passing large blood clots, feeling very tired, dizzy, or weak. Seek help if you have: Very heavy bleeding Severe pain Fainting or dizziness Fever Strong bad-smelling discharge Periods missing for many months Feeling unsafe or very distressed Talking to a doctor or clinic is safe and confidential. You deserve care and support.
222
+
223
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
224
+
225
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,caring|approval|neutral,mixed,mixed,1,info_question,heavy_bleeding
226
+ How do I handle cramps in PE class?,"Thank you for opening up — it is really brave to share how you feel.
227
+
228
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
229
+
230
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
231
+
232
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,gratitude|caring|approval,mixed,mixed,1,info_question,pain_cramps
233
+ Can skipping meals affect my period?,"I am here with you. Let us take this one step at a time.
234
+
235
+ What it means: A period can sometimes come earlier or later than expected. In teenagers, periods are often irregular during the first 1–3 years after the first period. Common reasons: Stress, school exams, lack of sleep, sudden weight changes, illness, heavy exercise, and normal hormone changes can delay a period. Ice cream and cold foods: Eating ice cream is usually safe during periods. Cold foods do not stop periods. What to notice: Some people feel cold foods make cramps worse.
236
+
237
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
238
+
239
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|neutral|confusion,caring|neutral|approval,mixed,mixed,1,info_question,unknown
240
+ What should I do if I feel faint during my period?,"It is okay to feel low sometimes, especially when your body feels confusing.
241
+
242
+ Seek help if you have: Very heavy bleeding Severe pain Fainting or dizziness Fever Strong bad-smelling discharge Periods missing for many months Feeling unsafe or very distressed Talking to a doctor or clinic is safe and confidential. You deserve care and support. What it means: Some girls have heavier periods than others. Heavy bleeding means soaking through pads very quickly or bleeding for many days. Signs of heavy bleeding: Needing to change pads every 1–2 hours, passing large blood clots, feeling very tired, dizzy, or weak.
243
+
244
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
245
+
246
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.
247
+
248
+ If you have severe pain, fainting, fever, or very heavy bleeding, please tell a trusted adult and visit a clinic as soon as possible.",curiosity|confusion|sadness,caring|approval|neutral,sad,mixed,0,info_question,unknown
249
+ Is it normal to bleed longer than seven days?,"It is okay to have mixed feelings. You are doing your best.
250
+
251
+ What it means: Some girls have heavier periods than others. Heavy bleeding means soaking through pads very quickly or bleeding for many days. Signs of heavy bleeding: Needing to change pads every 1–2 hours, passing large blood clots, feeling very tired, dizzy, or weak. What it is: Spotting means light bleeding between periods. Brown discharge is often old blood leaving the body. What is normal: Light spotting or brown discharge can happen at the start or end of a period, or due to hormone changes.
252
+
253
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
254
+
255
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,caring|neutral|approval,mixed,mixed,1,info_question,unknown
256
+ How do I calm anxiety about leaking?,"That sounds really scary right now, and your feelings are completely valid.
257
+
258
+ Why hygiene matters: Good hygiene helps prevent irritation, infection, and discomfort during periods. Pad changing: Many people change pads every 4–6 hours, depending on flow. Change sooner if the pad feels wet or uncomfortable.
259
+
260
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
261
+
262
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|nervousness,caring|approval|fear,anxious,anxious,1,info_question,unknown
263
+ Can I wear a tampon overnight?,"Thank you for opening up — it is really brave to share how you feel.
264
+
265
+ Is it safe: Yes, bathing during your period is safe and helps you feel clean and comfortable. Swimming: Some people choose to swim using appropriate menstrual products. Others prefer to avoid swimming during heavy flow. Is exercise allowed: Yes, light to moderate exercise is usually safe during periods. Possible benefits: Exercise can help reduce cramps and improve mood for some people. Listen to your body: If you feel very tired or have strong pain, it is okay to rest.
266
+
267
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
268
+
269
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|neutral|confusion,gratitude|caring|approval,mixed,mixed,1,info_question,hygiene
270
+ What helps with breast soreness before period?,"I am here with you. Let us take this one step at a time.
271
+
272
+ Ice cream and cold foods: Eating ice cream is usually safe during periods. Cold foods do not stop periods. What to notice: Some people feel cold foods make cramps worse. What it is: The first period usually happens between ages 9–15. Common signs before first period: White discharge, breast development, body hair growth, mood changes. How to prepare: Keep pads in your bag and talk to a trusted adult.
273
+
274
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
275
+
276
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|neutral|confusion,caring|neutral|approval,mixed,mixed,1,info_question,unknown
277
+ Is it normal to have diarrhea during my period?,"I am here with you. Let us take this one step at a time.
278
+
279
+ What is normal: A mild, earthy smell during periods can happen because blood and tissue are leaving the body. Clear or white discharge with little or no smell between periods is also normal. Freshness tips: Change pads regularly, wash the vulva with water (no harsh soaps inside the vagina), and wear breathable cotton underwear. What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or...
280
+
281
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
282
+
283
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",curiosity|confusion|neutral,caring|neutral|approval,mixed,mixed,1,info_question,unknown
284
+ I am worried my period is late again.,"It is okay to feel anxious — you are not alone in this.
285
+
286
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",nervousness|fear|caring,caring|curiosity|approval,anxious,mixed,0,support,late_period
287
+ My cramps make me nervous about school tomorrow.,"That sounds really scary right now, and your feelings are completely valid.
288
+
289
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
290
+
291
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
292
+
293
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",nervousness|fear|sadness,caring|approval|neutral,anxious,mixed,0,symptom,pain_cramps
294
+ I am anxious because the bleeding is heavier than usual.,"That sounds really scary right now, and your feelings are completely valid.
295
+
296
+ What it means: Some girls have heavier periods than others. Heavy bleeding means soaking through pads very quickly or bleeding for many days. Signs of heavy bleeding: Needing to change pads every 1–2 hours, passing large blood clots, feeling very tired, dizzy, or weak. Seek help if you have: Very heavy bleeding Severe pain Fainting or dizziness Fever Strong bad-smelling discharge Periods missing for many months Feeling unsafe or very distressed Talking to a doctor or clinic is safe and confidential. You deserve care and support.
297
+
298
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
299
+
300
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",nervousness|fear|sadness,caring|approval|fear,anxious,anxious,1,symptom,unknown
301
+ I feel panic when I think about my period starting in class.,"I can hear how worried you are, and it makes complete sense to feel that way.
302
+
303
+ Let us do a quick breathing step: breathe in for 4 seconds, hold for 2, and breathe out for 6. Repeat 3 times.
304
+
305
+ If you want, tell me what is making you feel worried right now — I am listening.",fear|nervousness|neutral,caring|neutral|nervousness,anxious,anxious,1,calming,unknown
306
+ I am scared the smell means something is wrong.,"I can hear how worried you are, and it makes complete sense to feel that way.
307
+
308
+ What is normal: A mild, earthy smell during periods can happen because blood and tissue are leaving the body. Clear or white discharge with little or no smell between periods is also normal. Freshness tips: Change pads regularly, wash the vulva with water (no harsh soaps inside the vagina), and wear breathable cotton underwear. What it is: Discharge is a fluid that helps keep the vagina clean and healthy. What is normal: Clear or white discharge with little or no smell is normal. It may change during the cycle.
309
+
310
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
311
+
312
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",fear|nervousness|neutral,caring|approval|neutral,anxious,mixed,0,symptom,unknown
313
+ I am worried about fainting during sports.,"It is okay to feel anxious — you are not alone in this.
314
+
315
+ Seek help if you have: Very heavy bleeding Severe pain Fainting or dizziness Fever Strong bad-smelling discharge Periods missing for many months Feeling unsafe or very distressed Talking to a doctor or clinic is safe and confidential. You deserve care and support. Is exercise allowed: Yes, light to moderate exercise is usually safe during periods. Possible benefits: Exercise can help reduce cramps and improve mood for some people. Listen to your body: If you feel very tired or have strong pain, it is okay to rest.
316
+
317
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
318
+
319
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.
320
+
321
+ If you have severe pain, fainting, fever, or very heavy bleeding, please tell a trusted adult and visit a clinic as soon as possible.",nervousness|fear|caring,caring|approval|neutral,anxious,mixed,0,symptom,unknown
322
+ My heart races when the pain comes back.,"That sounds really scary right now, and your feelings are completely valid.
323
+
324
+ I can help! Just to answer accurately: can you tell me a bit more (how long it has been, your age, and any pain, heavy bleeding, fever, or dizziness)?
325
+
326
+ If you feel very unwell or scared, please reach out to a trusted adult or a clinic.",sadness|fear|nervousness,approval|caring|fear,anxious,anxious,1,symptom,pain_cramps
327
+ I am nervous to tell my mom about the spotting.,"It is okay to feel anxious — you are not alone in this.
328
+
329
+ What it is: Spotting means light bleeding between periods. Brown discharge is often old blood leaving the body. What is normal: Light spotting or brown discharge can happen at the start or end of a period, or due to hormone changes. What it means: Some girls have heavier periods than others. Heavy bleeding means soaking through pads very quickly or bleeding for many days. Signs of heavy bleeding: Needing to change pads every 1–2 hours, passing large blood clots, feeling very tired, dizzy, or weak.
330
+
331
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
332
+
333
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",nervousness|fear|caring,caring|neutral|approval,anxious,mixed,0,symptom,spotting
334
+ I feel shaky when I see small clots.,"I can hear how worried you are, and it makes complete sense to feel that way.
335
+
336
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|nervousness|fear,caring|neutral|curiosity,anxious,mixed,0,support,heavy_bleeding
337
+ I am afraid I will leak through my pad.,"I can hear how worried you are, and it makes complete sense to feel that way.
338
+
339
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",fear|nervousness|neutral,caring|neutral|curiosity,anxious,mixed,0,support,hygiene
340
+ I am anxious because I missed my period last month.,"I can hear how worried you are, and it makes complete sense to feel that way.
341
+
342
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",nervousness|sadness|fear,caring|neutral|curiosity,anxious,mixed,0,support,unknown
343
+ I cannot stop worrying about the discharge color.,"I can hear how worried you are, and it makes complete sense to feel that way.
344
+
345
+ What it is: Discharge is a fluid that helps keep the vagina clean and healthy. What is normal: Clear or white discharge with little or no smell is normal. It may change during the cycle. What it is: Spotting means light bleeding between periods. Brown discharge is often old blood leaving the body. What is normal: Light spotting or brown discharge can happen at the start or end of a period, or due to hormone changes.
346
+
347
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
348
+
349
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",nervousness|fear|caring,caring|neutral|approval,anxious,mixed,0,symptom,unknown
350
+ I am nervous about taking a bus while cramping.,"It is okay to feel anxious — you are not alone in this.
351
+
352
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
353
+
354
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
355
+
356
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",nervousness|fear|sadness,caring|neutral|approval,anxious,mixed,0,symptom,pain_cramps
357
+ I am scared because I woke up dizzy on my period.,"It is okay to feel anxious — you are not alone in this.
358
+
359
+ What it means: Some girls have heavier periods than others. Heavy bleeding means soaking through pads very quickly or bleeding for many days. Signs of heavy bleeding: Needing to change pads every 1–2 hours, passing large blood clots, feeling very tired, dizzy, or weak. Seek help if you have: Very heavy bleeding Severe pain Fainting or dizziness Fever Strong bad-smelling discharge Periods missing for many months Feeling unsafe or very distressed Talking to a doctor or clinic is safe and confidential. You deserve care and support.
360
+
361
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
362
+
363
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",fear|nervousness|neutral,caring|approval|neutral,anxious,mixed,0,symptom,unknown
364
+ I feel uneasy about going to the clinic alone.,"It is okay to feel anxious — you are not alone in this.
365
+
366
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",nervousness|fear|sadness,caring|curiosity|approval,anxious,mixed,0,support,unknown
367
+ I am worried the cramps mean something serious.,"It is okay to feel anxious — you are not alone in this.
368
+
369
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
370
+
371
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
372
+
373
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",nervousness|fear|caring,caring|neutral|approval,anxious,mixed,0,symptom,pain_cramps
374
+ I feel tense every time the pain starts.,"It is okay to feel anxious — you are not alone in this.
375
+
376
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. Why it happens: Stress, exams, changes in sleep, illness, travel, sudden weight changes, heavy sports, and normal hormone shifts can all make a period come later than expected. In the first 1–3 years after your first period, it is common to be irregular. What to watch: Track your cycle dates, sleep, and...
377
+
378
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
379
+
380
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",nervousness|sadness|neutral,caring|neutral|approval,anxious,mixed,0,symptom,pain_cramps
381
+ I am anxious my friends will notice the smell.,"I can hear how worried you are, and it makes complete sense to feel that way.
382
+
383
+ What is normal: A mild, earthy smell during periods can happen because blood and tissue are leaving the body. Clear or white discharge with little or no smell between periods is also normal. Freshness tips: Change pads regularly, wash the vulva with water (no harsh soaps inside the vagina), and wear breathable cotton underwear. What it is: Discharge is a fluid that helps keep the vagina clean and healthy. What is normal: Clear or white discharge with little or no smell is normal. It may change during the cycle.
384
+
385
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
386
+
387
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",nervousness|fear|excitement,caring|approval|neutral,anxious,mixed,0,symptom,unknown
388
+ I am scared the cramps will not stop.,"It is okay to feel anxious — you are not alone in this.
389
+
390
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
391
+
392
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
393
+
394
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",fear|nervousness|neutral,caring|neutral|approval,anxious,mixed,0,symptom,pain_cramps
395
+ I worry I will faint in class.,"That sounds really scary right now, and your feelings are completely valid.
396
+
397
+ Seek help if you have: Very heavy bleeding Severe pain Fainting or dizziness Fever Strong bad-smelling discharge Periods missing for many months Feeling unsafe or very distressed Talking to a doctor or clinic is safe and confidential. You deserve care and support.
398
+
399
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
400
+
401
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.
402
+
403
+ If you have severe pain, fainting, fever, or very heavy bleeding, please tell a trusted adult and visit a clinic as soon as possible.",nervousness|fear|sadness,caring|approval|fear,anxious,anxious,1,symptom,unknown
404
+ I feel restless waiting for my period to come.,"Thank you for opening up — it is really brave to share how you feel.
405
+
406
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",neutral|desire|excitement,gratitude|caring|curiosity,mixed,mixed,1,support,unknown
407
+ I am anxious because my cycle is irregular.,"That sounds really scary right now, and your feelings are completely valid.
408
+
409
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",nervousness|fear|sadness,approval|caring|fear,anxious,anxious,1,support,unknown
410
+ I fear I might have an infection.,"I can hear how worried you are, and it makes complete sense to feel that way.
411
+
412
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",fear|nervousness|neutral,caring|neutral|curiosity,anxious,mixed,0,support,unknown
413
+ I am nervous to try a tampon.,"That sounds really scary right now, and your feelings are completely valid.
414
+
415
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",nervousness|fear|neutral,approval|caring|fear,anxious,anxious,1,support,hygiene
416
+ I am scared because my back hurts a lot.,"It is okay to feel anxious — you are not alone in this.
417
+
418
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",fear|nervousness|sadness,caring|curiosity|approval,anxious,mixed,0,support,pain_cramps
419
+ I am worried the bleeding might soak through at night.,"It is okay to feel anxious — you are not alone in this.
420
+
421
+ What it means: Some girls have heavier periods than others. Heavy bleeding means soaking through pads very quickly or bleeding for many days. Signs of heavy bleeding: Needing to change pads every 1–2 hours, passing large blood clots, feeling very tired, dizzy, or weak. Seek help if you have: Very heavy bleeding Severe pain Fainting or dizziness Fever Strong bad-smelling discharge Periods missing for many months Feeling unsafe or very distressed Talking to a doctor or clinic is safe and confidential. You deserve care and support.
422
+
423
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
424
+
425
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",nervousness|fear|caring,caring|approval|neutral,anxious,mixed,0,symptom,unknown
426
+ I feel sad and low during my period.,"I am really sorry you are feeling this way — that sounds heavy on you.
427
+
428
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|disappointment|grief,remorse|sadness|caring,sad,sad,1,support,mood_swings
429
+ My mood drops and I want to cry.,"Thank you for sharing this. Your feelings matter.
430
+
431
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|disappointment|neutral,gratitude|curiosity|caring,sad,mixed,0,support,mood_swings
432
+ I feel lonely dealing with cramps by myself.,"Thank you for sharing this. Your feelings matter.
433
+
434
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
435
+
436
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
437
+
438
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",sadness|disappointment|neutral,gratitude|caring|approval,sad,mixed,0,symptom,pain_cramps
439
+ I am discouraged because the pain keeps coming back.,"It is okay to feel low sometimes, especially when your body feels confusing.
440
+
441
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
442
+
443
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
444
+
445
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",disappointment|sadness|neutral,caring|neutral|approval,sad,mixed,0,symptom,pain_cramps
446
+ I feel down when I miss activities because of cramps.,"It is okay to feel low sometimes, especially when your body feels confusing.
447
+
448
+ What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles. What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period.
449
+
450
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
451
+
452
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",sadness|disappointment|neutral,caring|neutral|approval,sad,mixed,0,symptom,pain_cramps
453
+ I feel heavy-hearted when I see blood again.,"Thank you for sharing this. Your feelings matter.
454
+
455
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|disappointment|neutral,gratitude|curiosity|caring,sad,mixed,0,support,unknown
456
+ I am upset that my period makes me stay home.,"It is okay to feel low sometimes, especially when your body feels confusing.
457
+
458
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",disappointment|sadness|annoyance,caring|curiosity|neutral,sad,mixed,0,support,unknown
459
+ I feel gloomy and tired all day.,"Thank you for sharing this. Your feelings matter.
460
+
461
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|disappointment|neutral,gratitude|curiosity|caring,sad,mixed,0,support,unknown
462
+ I feel hopeless when the cramps wake me up.,"I am really sorry you are feeling this way — that sounds heavy on you.
463
+
464
+ What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles. What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period.
465
+
466
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
467
+
468
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",disappointment|sadness|neutral,caring|remorse|sadness,sad,sad,1,symptom,pain_cramps
469
+ I am disappointed that I missed practice.,"It is okay to feel low sometimes, especially when your body feels confusing.
470
+
471
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",disappointment|sadness|annoyance,caring|curiosity|neutral,sad,mixed,0,support,unknown
472
+ I feel blue and just want to sleep.,"Thank you for sharing this. Your feelings matter.
473
+
474
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",desire|sadness|neutral,gratitude|curiosity|caring,sad,mixed,0,support,unknown
475
+ I feel miserable because my stomach hurts.,"I am really sorry you are feeling this way — that sounds heavy on you.
476
+
477
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|disappointment|neutral,remorse|sadness|caring,sad,sad,1,support,pain_cramps
478
+ I feel weepy for no reason before my period.,"It is okay to feel low sometimes, especially when your body feels confusing.
479
+
480
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|disappointment|neutral,caring|curiosity|neutral,sad,mixed,0,support,unknown
481
+ I am sad that I have to cancel plans again.,"I am really sorry you are feeling this way — that sounds heavy on you.
482
+
483
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|disappointment|neutral,remorse|sadness|caring,sad,sad,1,support,mood_swings
484
+ I feel drained and unmotivated.,"It is okay to feel low sometimes, especially when your body feels confusing.
485
+
486
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",disappointment|sadness|annoyance,caring|curiosity|neutral,sad,mixed,0,support,unknown
487
+ I am heartbroken that I cannot focus in class.,"Thank you for sharing this. Your feelings matter.
488
+
489
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|disappointment|neutral,gratitude|curiosity|caring,sad,mixed,0,support,unknown
490
+ I feel tearful thinking about the pain returning.,"It is okay to feel low sometimes, especially when your body feels confusing.
491
+
492
+ Seek help if you have: Very heavy bleeding Severe pain Fainting or dizziness Fever Strong bad-smelling discharge Periods missing for many months Feeling unsafe or very distressed Talking to a doctor or clinic is safe and confidential. You deserve care and support.
493
+
494
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
495
+
496
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",sadness|disappointment|neutral,caring|approval|neutral,sad,mixed,0,symptom,pain_cramps
497
+ I am down because my clothes got stained.,"I am really sorry you are feeling this way — that sounds heavy on you.
498
+
499
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|disappointment|neutral,remorse|sadness|caring,sad,sad,1,support,unknown
500
+ I feel sorrowful and isolated.,"Thank you for sharing this. Your feelings matter.
501
+
502
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|disappointment|remorse,gratitude|curiosity|caring,sad,mixed,0,support,late_period
503
+ I feel low energy and want to curl up.,"It is okay to feel low sometimes, especially when your body feels confusing.
504
+
505
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|neutral|disappointment,caring|curiosity|neutral,sad,mixed,0,support,unknown
506
+ I am sad that my mom is busy when I need support.,"I am really sorry you are feeling this way — that sounds heavy on you.
507
+
508
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|disappointment|grief,remorse|sadness|caring,sad,sad,1,support,mood_swings
509
+ I feel depressed when I see heavy bleeding.,"It is okay to feel low sometimes, especially when your body feels confusing.
510
+
511
+ What it means: Some girls have heavier periods than others. Heavy bleeding means soaking through pads very quickly or bleeding for many days. Signs of heavy bleeding: Needing to change pads every 1–2 hours, passing large blood clots, feeling very tired, dizzy, or weak. Seek help if you have: Very heavy bleeding Severe pain Fainting or dizziness Fever Strong bad-smelling discharge Periods missing for many months Feeling unsafe or very distressed Talking to a doctor or clinic is safe and confidential. You deserve care and support.
512
+
513
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
514
+
515
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",sadness|disappointment|neutral,caring|approval|neutral,sad,mixed,0,symptom,heavy_bleeding
516
+ I feel gloomy about having cramps every month.,"I can hear how worried you are, and it makes complete sense to feel that way.
517
+
518
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
519
+
520
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
521
+
522
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",sadness|disappointment|nervousness,caring|neutral|approval,anxious,mixed,0,symptom,pain_cramps
523
+ I am upset that nothing seems to help.,"I am really sorry you are feeling this way — that sounds heavy on you.
524
+
525
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",disappointment|sadness|annoyance,remorse|sadness|caring,sad,sad,1,support,unknown
526
+ I feel melancholy during PMS days.,"It is okay to feel low sometimes, especially when your body feels confusing.
527
+
528
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|disappointment|neutral,caring|curiosity|neutral,sad,mixed,0,support,mood_swings
529
+ I feel empty and just want quiet time.,"I am really sorry you are feeling this way — that sounds heavy on you.
530
+
531
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",desire|sadness|disappointment,remorse|sadness|caring,sad,sad,1,support,unknown
532
+ I am angry that cramps ruin my day.,"It is understandable to feel angry or frustrated — your feelings matter.
533
+
534
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
535
+
536
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
537
+
538
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",anger|annoyance|neutral,caring|neutral|approval,angry,mixed,0,symptom,pain_cramps
539
+ I feel irritated by the constant pain.,"It is okay to feel low sometimes, especially when your body feels confusing.
540
+
541
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
542
+
543
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
544
+
545
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",sadness|annoyance|disappointment,caring|neutral|approval,sad,mixed,0,symptom,pain_cramps
546
+ I am frustrated that my period is so unpredictable.,"Thank you for sharing this. Your feelings matter.
547
+
548
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",annoyance|anger|disappointment,gratitude|curiosity|caring,sad,mixed,0,support,unknown
549
+ I feel mad when people tell me it is normal pain.,"It is okay to feel low sometimes, especially when your body feels confusing.
550
+
551
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Hormone changes before periods can affect mood, causing sadness, anger, or irritation. What is normal: Feeling more emotional before a period is common. What may help: Rest, calming music, talking to someone you trust, and light activity.
552
+
553
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
554
+
555
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",anger|annoyance|sadness,caring|approval|neutral,sad,mixed,0,symptom,pain_cramps
556
+ I am annoyed I have to skip sports again.,"That irritation makes sense, especially if you are in pain or stressed.
557
+
558
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",annoyance|anger|neutral,caring|curiosity|neutral,angry,mixed,0,support,unknown
559
+ I feel rage when cramps hit in class.,"It is understandable to feel angry or frustrated — your feelings matter.
560
+
561
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
562
+
563
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
564
+
565
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",anger|neutral|annoyance,caring|neutral|approval,angry,mixed,0,symptom,pain_cramps
566
+ I am upset that no one takes my pain seriously.,"Thank you for sharing this. Your feelings matter.
567
+
568
+ I can help! Just to answer accurately: can you tell me a bit more (how long it has been, your age, and any pain, heavy bleeding, fever, or dizziness)?
569
+
570
+ If you feel very unwell or scared, please reach out to a trusted adult or a clinic.",disappointment|sadness|annoyance,gratitude|curiosity|caring,sad,mixed,0,symptom,pain_cramps
571
+ I am irritated by the smell during my period.,"Thank you for sharing this. Your feelings matter.
572
+
573
+ What is normal: A mild, earthy smell during periods can happen because blood and tissue are leaving the body. Clear or white discharge with little or no smell between periods is also normal. Freshness tips: Change pads regularly, wash the vulva with water (no harsh soaps inside the vagina), and wear breathable cotton underwear. Why hygiene matters: Good hygiene helps prevent irritation, infection, and discomfort during periods. Pad changing: Many people change pads every 4–6 hours, depending on flow. Change sooner if the pad feels wet or...
574
+
575
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
576
+
577
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",annoyance|disappointment|disgust,gratitude|caring|approval,sad,mixed,0,symptom,unknown
578
+ I feel anger when my pad leaks.,"I am really sorry you are feeling this way — that sounds heavy on you.
579
+
580
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",anger|sadness|annoyance,remorse|sadness|caring,sad,sad,1,support,hygiene
581
+ I am mad that medicines do not always work.,"That irritation makes sense, especially if you are in pain or stressed.
582
+
583
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",annoyance|anger|neutral,caring|curiosity|neutral,angry,mixed,0,support,unknown
584
+ I am annoyed that my back hurts this much.,"Thank you for sharing this. Your feelings matter.
585
+
586
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",annoyance|anger|disappointment,gratitude|curiosity|caring,sad,mixed,0,support,pain_cramps
587
+ I am frustrated by the mood swings.,"It is okay to feel low sometimes, especially when your body feels confusing.
588
+
589
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",annoyance|anger|disappointment,caring|curiosity|neutral,sad,mixed,0,support,mood_swings
590
+ I feel furious about the heavy bleeding.,"You are not too much — this can be a tough time for many girls.
591
+
592
+ What it means: Some girls have heavier periods than others. Heavy bleeding means soaking through pads very quickly or bleeding for many days. Signs of heavy bleeding: Needing to change pads every 1–2 hours, passing large blood clots, feeling very tired, dizzy, or weak. Seek help if you have: Very heavy bleeding Severe pain Fainting or dizziness Fever Strong bad-smelling discharge Periods missing for many months Feeling unsafe or very distressed Talking to a doctor or clinic is safe and confidential. You deserve care and support.
593
+
594
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
595
+
596
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",anger|annoyance|neutral,caring|neutral|approval,angry,mixed,0,symptom,heavy_bleeding
597
+ I am irritated that I cannot sleep because of cramps.,"Thank you for sharing this. Your feelings matter.
598
+
599
+ What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles. What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period.
600
+
601
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
602
+
603
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",annoyance|disappointment|sadness,gratitude|caring|approval,sad,mixed,0,symptom,pain_cramps
604
+ I am annoyed that I have to change pads so often.,"You are not too much — this can be a tough time for many girls.
605
+
606
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",annoyance|anger|neutral,caring|neutral|curiosity,angry,mixed,0,support,hygiene
607
+ I am resentful that my period starts on big days.,"It is understandable to feel angry or frustrated — your feelings matter.
608
+
609
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",annoyance|anger|neutral,caring|curiosity|approval,angry,mixed,0,support,unknown
610
+ I feel cross when my stomach cramps so hard.,"I am really sorry you are feeling this way — that sounds heavy on you.
611
+
612
+ What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles. What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period.
613
+
614
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
615
+
616
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",sadness|neutral|disappointment,caring|remorse|sadness,sad,sad,1,symptom,pain_cramps
617
+ I am annoyed by the dizziness that comes with it.,"That irritation makes sense, especially if you are in pain or stressed.
618
+
619
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",annoyance|anger|neutral,caring|curiosity|neutral,angry,mixed,0,support,unknown
620
+ I feel upset when I stain clothes at school.,"I am really sorry you are feeling this way — that sounds heavy on you.
621
+
622
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|disappointment|annoyance,remorse|sadness|caring,sad,sad,1,support,unknown
623
+ I am mad at my body for hurting.,"Thank you for sharing this. Your feelings matter.
624
+
625
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|anger|annoyance,gratitude|curiosity|caring,sad,mixed,0,support,pain_cramps
626
+ I am irritated that cramps ruin my focus.,"It is okay to feel low sometimes, especially when your body feels confusing.
627
+
628
+ What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles. What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period.
629
+
630
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
631
+
632
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",annoyance|anger|disappointment,caring|neutral|approval,sad,mixed,0,symptom,pain_cramps
633
+ I am frustrated that I cannot predict the timing.,"I am really sorry you are feeling this way — that sounds heavy on you.
634
+
635
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",annoyance|anger|disappointment,remorse|sadness|caring,sad,sad,1,support,unknown
636
+ I feel angry about the constant bloating.,"That irritation makes sense, especially if you are in pain or stressed.
637
+
638
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",anger|annoyance|neutral,caring|curiosity|neutral,angry,mixed,0,support,mood_swings
639
+ I am mad that the pain keeps coming back.,"It is okay to feel low sometimes, especially when your body feels confusing.
640
+
641
+ What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles. What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period.
642
+
643
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
644
+
645
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",anger|annoyance|sadness,caring|neutral|approval,sad,mixed,0,symptom,pain_cramps
646
+ I am annoyed that I have to carry pads everywhere.,"That irritation makes sense, especially if you are in pain or stressed.
647
+
648
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",annoyance|anger|neutral,caring|curiosity|neutral,angry,mixed,0,support,hygiene
649
+ I feel heated because my mood is out of control.,"Thank you for sharing this. Your feelings matter.
650
+
651
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",annoyance|disappointment|sadness,gratitude|curiosity|caring,sad,mixed,0,support,mood_swings
652
+ I feel mixed emotions about my late period.,"I can hear how worried you are, and it makes complete sense to feel that way.
653
+
654
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",neutral|confusion|nervousness,caring|neutral|curiosity,anxious,mixed,0,support,late_period
655
+ I am unsure if I am worried or just tired.,"That sounds really scary right now, and your feelings are completely valid.
656
+
657
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",confusion|nervousness|curiosity,approval|caring|fear,anxious,anxious,1,support,unknown
658
+ I feel both sad and relieved when my period starts.,"It is okay to feel low sometimes, especially when your body feels confusing.
659
+
660
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|joy|disappointment,caring|curiosity|neutral,sad,mixed,0,support,mood_swings
661
+ I am confused whether this pain is normal.,"It is okay to have mixed feelings. You are doing your best.
662
+
663
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Discharge is a fluid that helps keep the vagina clean and healthy. What is normal: Clear or white discharge with little or no smell is normal. It may change during the cycle.
664
+
665
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
666
+
667
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",confusion|curiosity|neutral,caring|approval|neutral,mixed,mixed,1,symptom,pain_cramps
668
+ I feel anxious and hopeful at the same time.,"That sounds really scary right now, and your feelings are completely valid.
669
+
670
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",nervousness|fear|caring,approval|caring|fear,anxious,anxious,1,support,unknown
671
+ I am both scared and curious about using a cup.,"That sounds really scary right now, and your feelings are completely valid.
672
+
673
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",curiosity|fear|confusion,approval|caring|fear,anxious,anxious,1,support,hygiene
674
+ I feel uneasy but also proud for handling this.,"Thank you for opening up — it is really brave to share how you feel.
675
+
676
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",pride|admiration|approval,gratitude|caring|curiosity,mixed,mixed,1,support,unknown
677
+ I am conflicted about telling my friend how I feel.,"I am here with you. Let us take this one step at a time.
678
+
679
+ I can help! Just to answer accurately: can you tell me a bit more (how long it has been, your age, and any pain, heavy bleeding, fever, or dizziness)?
680
+
681
+ If you feel very unwell or scared, please reach out to a trusted adult or a clinic.",confusion|neutral|approval,caring|neutral|curiosity,mixed,mixed,1,info_question,unknown
682
+ I feel nervous yet calm when I breathe slowly.,"It is okay to feel anxious — you are not alone in this.
683
+
684
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",nervousness|caring|fear,caring|curiosity|approval,anxious,mixed,0,support,food_diet
685
+ I feel uncertain about the spotting I see.,"I am here with you. Let us take this one step at a time.
686
+
687
+ What it is: Spotting means light bleeding between periods. Brown discharge is often old blood leaving the body. What is normal: Light spotting or brown discharge can happen at the start or end of a period, or due to hormone changes. What it means: Some girls have heavier periods than others. Heavy bleeding means soaking through pads very quickly or bleeding for many days. Signs of heavy bleeding: Needing to change pads every 1–2 hours, passing large blood clots, feeling very tired, dizzy, or weak.
688
+
689
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
690
+
691
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",confusion|neutral|curiosity,caring|neutral|approval,mixed,mixed,1,symptom,spotting
692
+ I am both annoyed and grateful for support.,"That irritation makes sense, especially if you are in pain or stressed.
693
+
694
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",annoyance|anger|gratitude,caring|curiosity|neutral,angry,mixed,0,support,unknown
695
+ I feel a mix of fear and determination during cramps.,"That sounds really scary right now, and your feelings are completely valid.
696
+
697
+ What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period. What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles.
698
+
699
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
700
+
701
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",fear|nervousness|neutral,caring|approval|neutral,anxious,mixed,0,symptom,pain_cramps
702
+ I am torn between resting and going to class.,"I am really sorry you are feeling this way — that sounds heavy on you.
703
+
704
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",neutral|sadness|disappointment,remorse|sadness|caring,sad,sad,1,support,unknown
705
+ I feel both shy and relieved to ask my mom for help.,"I can hear how worried you are, and it makes complete sense to feel that way.
706
+
707
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",joy|nervousness|relief,caring|neutral|curiosity,anxious,mixed,0,support,unknown
708
+ I am unsure whether to see a doctor now.,"I am here with you. Let us take this one step at a time.
709
+
710
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",confusion|neutral|curiosity,caring|neutral|curiosity,mixed,mixed,1,support,unknown
711
+ I feel nervous but also empowered to track my cycle.,"It is okay to feel anxious — you are not alone in this.
712
+
713
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",nervousness|approval|fear,caring|curiosity|approval,anxious,mixed,0,support,unknown
714
+ I am feeling a mix of anger and sadness today.,"Thank you for sharing this. Your feelings matter.
715
+
716
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",sadness|disappointment|anger,gratitude|curiosity|caring,sad,mixed,0,support,mood_swings
717
+ I feel both hopeful and worried about the pain easing.,"That sounds really scary right now, and your feelings are completely valid.
718
+
719
+ What it is: Period cramps happen when the uterus tightens to push out the lining. They can show up in the lower belly or lower back. Self-care steps: Sip warm water or ginger tea, use a warm pad on your belly or back, stretch gently, and try light walks to loosen muscles. What it is: Period cramps happen when the uterus tightens to release menstrual blood. Many girls feel cramps in the lower belly or back. What is normal: Mild to moderate cramps are common, especially on the first one or two days of a period.
720
+
721
+ If you have severe pain, fainting, fever, very heavy bleeding, or you feel unsafe, please talk to a trusted adult or visit a clinic.
722
+
723
+ I cannot diagnose what is happening, but a doctor or clinic can help check safely.",caring|nervousness|optimism,caring|approval|neutral,anxious,mixed,0,symptom,pain_cramps
724
+ I am conflicted about trying a heating pad at school.,"Thank you for opening up — it is really brave to share how you feel.
725
+
726
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",confusion|neutral|approval,gratitude|caring|curiosity,mixed,mixed,1,support,hygiene
727
+ I feel both tense and comforted by talking here.,"It is okay to have mixed feelings. You are doing your best.
728
+
729
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",approval|joy|neutral,caring|approval|curiosity,mixed,mixed,1,support,unknown
730
+ I am unsure if my mood swings are normal.,"Thank you for opening up — it is really brave to share how you feel.
731
+
732
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",confusion|neutral|approval,gratitude|caring|curiosity,mixed,mixed,1,support,mood_swings
733
+ I feel a blend of tiredness and courage.,"It is okay to have mixed feelings. You are doing your best.
734
+
735
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",neutral|approval|realization,caring|approval|curiosity,mixed,mixed,1,support,unknown
736
+ I am both anxious and ready to learn about periods.,"That sounds really scary right now, and your feelings are completely valid.
737
+
738
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",nervousness|excitement|neutral,approval|caring|fear,anxious,anxious,1,support,unknown
739
+ I feel uncertain but want clear answers.,"I am here with you. Let us take this one step at a time.
740
+
741
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",confusion|curiosity|neutral,caring|neutral|curiosity,mixed,mixed,1,support,unknown
742
+ I am mixed between being scared and staying calm.,"That sounds really scary right now, and your feelings are completely valid.
743
+
744
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",fear|nervousness|neutral,approval|caring|fear,anxious,anxious,1,support,unknown
745
+ I feel both irritated and understanding of my body.,"It is okay to feel low sometimes, especially when your body feels confusing.
746
+
747
+ You do not have to handle this alone. If you want, tell me what is happening in your body or what you are worried about.",annoyance|disappointment|anger,caring|curiosity|neutral,sad,mixed,0,support,unknown
eval/emotion_eval.csv ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ text,true_label
2
+ "My period is late and I'm really scared something is wrong.",fear
3
+ "I feel nervous because my period might start in class.",nervousness
4
+ "I keep worrying about stains and people noticing.",nervousness
5
+ "I feel like crying today and I don't know why.",sadness
6
+ "I feel so sad and alone about my body changes.",sadness
7
+ "I'm angry at everyone and I don't know why.",anger
8
+ "I get irritated over small things before my period.",annoyance
9
+ "I'm disappointed because I thought my cramps would be less this month.",disappointment
10
+ "I'm confused because my cycle is not regular at all.",confusion
11
+ "I'm embarrassed to buy pads at the shop.",embarrassment
12
+ "I feel disgusted by the smell of blood and I feel bad about it.",disgust
13
+ "I'm relieved my period finally came.",relief
14
+ "I just realized my stress might be affecting my cycle.",realization
15
+ "I'm grateful my friend helped me when I got my period.",gratitude
16
+ "I'm happy my cramps are not bad today.",joy
17
+ "I'm excited because I learned how to track my cycle.",excitement
18
+ "I feel hopeful that things will get better.",optimism
19
+ "I feel proud that I handled my period at school confidently.",pride
20
+ "I love that my sister supports me during my period.",love
21
+ "I feel remorse for snapping at my mom because I'm moody.",remorse
22
+ "I feel grief because I miss my grandma and everything feels heavy.",grief
23
+ "I'm surprised my period came early this month.",surprise
24
+ "I feel curious why I get headaches before my period.",curiosity
25
+ "I really want to understand what's happening to my body.",desire
26
+ "I appreciate the advice, it makes me feel calmer.",approval
27
+ "I feel cared for when someone listens to me.",caring
28
+ "I admire women who talk openly about periods.",admiration
29
+ "I laughed because my friend made a funny joke to cheer me up.",amusement
30
+ "I'm shocked by how intense my cramps are today.",surprise
31
+ "My mood is neutral today, nothing special.",neutral
32
+ "I feel fine, just asking a general question about periods.",neutral
33
+ "I'm scared because my bleeding seems heavier than usual.",fear
34
+ "I'm nervous to talk to a doctor about my period.",nervousness
35
+ "I feel sad because my period pain stops me from going out.",sadness
36
+ "I'm angry that people make fun of periods.",anger
37
+ "I'm annoyed because I feel bloated and uncomfortable.",annoyance
38
+ "I'm disappointed that my period is late again.",disappointment
39
+ "I'm confused about what is normal discharge.",confusion
40
+ "I'm embarrassed because I leaked at school once.",embarrassment
41
+ "I feel disgusted when someone says periods are dirty.",disgust
42
+ "I'm relieved that the pain reduced after resting.",relief
43
+ "I just realized I forgot to drink water and that might worsen cramps.",realization
44
+ "I'm grateful for my teacher who allowed me to rest.",gratitude
45
+ "I'm happy that my period tracker app helps me.",joy
46
+ "I'm excited to try gentle stretching for cramps.",excitement
47
+ "I'm optimistic that I can manage school and my period.",optimism
48
+ "I'm proud that I carried pads and was prepared.",pride
49
+ "I love how my best friend checks on me.",love
50
+ "I feel remorse for saying something mean while PMS-ing.",remorse
51
+ "I feel sad and tired during my period.",sadness
52
+ "I'm scared because I feel dizzy during my period.",fear
53
+ "I'm confused why I have cramps even without bleeding.",confusion
54
+ "I'm nervous because my cycle is longer than my friends'.",nervousness
55
+ "I'm angry and frustrated because the pain keeps coming back.",anger
56
+ "I feel anxious that my period will start during tuition class.",nervousness
57
+ "I'm worried I might stain my uniform at school.",nervousness
58
+ "I'm scared to ask questions because people might judge me.",fear
59
+ "I feel embarrassed when someone talks loudly about periods.",embarrassment
60
+ "I'm disappointed because the cramps ruined my plans again.",disappointment
61
+ "I'm confused because my period is lighter than usual.",confusion
62
+ "I'm relieved that I found pads in my bag.",relief
63
+ "I'm grateful my mom explained what PMS is.",gratitude
64
+ "I'm proud I stayed calm and handled a small leak.",pride
65
+ "I'm happy I had no cramps today.",joy
66
+ "I'm excited to learn more about menstrual hygiene.",excitement
67
+ "I feel hopeful my cycle will become regular soon.",optimism
68
+ "I feel cared for when my friend checks if I need anything.",caring
69
+ "I love that my aunt gives me kind advice.",love
70
+ "I feel remorse that I ignored my friend because I was moody.",remorse
71
+ "I feel angry when someone says girls are overreacting.",anger
72
+ "I'm annoyed by the back pain I get before my period.",annoyance
73
+ "I'm disgusted by the mean comments people make about periods.",disgust
74
+ "I'm curious why I feel sleepy before my period.",curiosity
75
+ "I want to understand why my cramps are sometimes worse.",desire
76
+ "I'm surprised my period ended faster than usual.",surprise
77
+ "I admire teachers who allow girls to take breaks kindly.",admiration
78
+ "I laughed when my friend tried to distract me with jokes.",amusement
79
+ "I appreciate that you explained this simply.",approval
80
+ "My mood is neutral; I just want information.",neutral
81
+ "I'm scared because the pain feels stronger than last time.",fear
82
+ "I'm nervous to buy pads because the cashier might be rude.",nervousness
83
+ "I feel sad because I feel alone dealing with this.",sadness
84
+ "I'm angry that I can't concentrate because of cramps.",anger
85
+ "I'm annoyed that my skin breaks out before my period.",annoyance
86
+ "I'm disappointed that my period came on a special day.",disappointment
87
+ "I'm confused whether spotting is normal for me.",confusion
88
+ "I'm embarrassed to tell my dad I need pads.",embarrassment
89
+ "I'm relieved that the spotting stopped.",relief
90
+ "I just realized my sleep schedule affects my mood a lot.",realization
91
+ "I'm grateful my friend shared a pad with me.",gratitude
92
+ "I'm happy that warm water helped a bit.",joy
93
+ "I'm excited to try a period tracking app.",excitement
94
+ "I'm optimistic I can manage this better next month.",optimism
95
+ "I'm proud that I asked a question instead of staying silent.",pride
96
+ "I love when my sister makes me tea and comforts me.",love
97
+ "I feel remorse for being rude to my teacher today.",remorse
98
+ "I'm surprised I didn't get cramps this cycle.",surprise
99
+ "I'm curious why I get cravings before my period.",curiosity
100
+ "I really want to know what causes irregular cycles in teens.",desire
101
+ "I feel cared for when someone says it's okay to rest.",caring
102
+ "I admire girls who are confident about their bodies.",admiration
103
+ "I laughed because my friend said something silly to cheer me up.",amusement
104
+ "I appreciate your kind response; it helps me breathe.",approval
105
+ "I feel neutral today; I'm just checking what's normal.",neutral
106
+ "I'm scared because my period is very heavy today.",fear
107
+ "I'm nervous because I have PE class during my period.",nervousness
108
+ "I feel sad because I missed an outing due to cramps.",sadness
109
+ "I'm angry that people tease girls for period stains.",anger
110
+ "I'm annoyed that I feel tired and irritated all day.",annoyance
111
+ "I'm disappointed that painkillers didn't help much last time.",disappointment
112
+ "I'm confused about why discharge changes during the month.",confusion
113
+ "I'm embarrassed because I had to ask for a pad at school.",embarrassment
114
+ "I feel disgusted when someone calls periods 'unclean'.",disgust
115
+ "I'm relieved that my cramps eased after resting.",relief
116
+ "I just realized stress before exams makes my period late.",realization
117
+ "I'm grateful my school nurse spoke kindly to me.",gratitude
118
+ "I'm happy that I managed my day even with cramps.",joy
119
+ "I'm excited to try light stretching and breathing.",excitement
120
+ "I'm hopeful that talking about this will make it easier.",optimism
121
+ "I'm proud that I stayed prepared with extra pads.",pride
122
+ "I love how supportive my best friend is during PMS.",love
123
+ "I feel remorse because I shouted at my brother.",remorse
124
+ "I feel grief because I miss someone and it hurts more now.",grief
125
+ "I'm surprised I got cramps before bleeding started.",surprise
126
+ "I feel curious why some months are more painful.",curiosity
127
+ "I really want to understand what PMS means clearly.",desire
128
+ "I appreciate that you didn't judge me.",approval
129
+ "I feel cared for when someone listens without laughing.",caring
130
+ "I admire women who educate others about menstrual health.",admiration
131
+ "I laughed because a meme made me feel better.",amusement
132
+ "My mood feels neutral; I just need tips for hygiene.",neutral
133
+ "I'm scared to tell anyone because I'm embarrassed.",fear
134
+ "I'm nervous because I think I might leak during assembly.",nervousness
135
+ "I feel sad because I feel like my body is against me.",sadness
136
+ "I'm angry that cramps stop me from studying properly.",anger
137
+ "I'm annoyed because everything feels irritating today.",annoyance
138
+ "I'm disappointed because my period ruined my sleep.",disappointment
139
+ "I'm confused if it is normal to have cramps without much blood.",confusion
140
+ "I'm embarrassed to ask my mom questions about discharge.",embarrassment
141
+ "I'm relieved that I found a private place to change my pad.",relief
142
+ "I just realized drinking water helps me feel better.",realization
143
+ "I'm grateful someone reassured me that I'm normal.",gratitude
144
+ "I'm happy I learned how often to change pads.",joy
145
+ "I'm excited to feel more confident about periods.",excitement
146
+ "I'm optimistic that next month will be easier.",optimism
147
+ "I'm proud I spoke up when I needed help.",pride
148
+ "I love when my family supports me quietly and kindly.",love
149
+ "I feel remorse because I blamed someone unfairly while PMS-ing.",remorse
eval/evaluate_emotion_classifier.py ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # eval/evaluate_emotion_classifier.py
2
+ # Run from project root:
3
+ # python -m eval.evaluate_emotion_classifier
4
+
5
+ from __future__ import annotations
6
+
7
+ from dataclasses import dataclass
8
+ from typing import List, Dict, Tuple
9
+ import os
10
+
11
+ import pandas as pd
12
+ from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
13
+
14
+ from models.emotion_classifier import EmotionClassifier
15
+
16
+
17
+ @dataclass
18
+ class EvalResult:
19
+ top1_acc: float
20
+ top3_acc: float
21
+ top5_acc: float
22
+
23
+
24
+ def topk_hit(pred_labels: List[str], true_label: str, k: int) -> bool:
25
+ return true_label in pred_labels[:k]
26
+
27
+
28
+ def normalize_label(x: str) -> str:
29
+ return (x or "").strip().lower()
30
+
31
+
32
+ def main():
33
+ # --- 1) Load your evaluation CSV ---
34
+ # Create: eval/emotion_eval.csv with columns: text,true_label
35
+ csv_path = os.path.join("eval", "emotion_eval.csv")
36
+ if not os.path.exists(csv_path):
37
+ print(f"[ERROR] Missing file: {csv_path}")
38
+ print("Create eval/emotion_eval.csv with columns: text,true_label")
39
+ return
40
+
41
+ df = pd.read_csv(csv_path)
42
+ if "text" not in df.columns or "true_label" not in df.columns:
43
+ print("[ERROR] CSV must have columns: text,true_label")
44
+ return
45
+
46
+ texts = df["text"].astype(str).tolist()
47
+ true_labels = [normalize_label(x) for x in df["true_label"].astype(str).tolist()]
48
+
49
+ # --- 2) Load classifier ---
50
+ clf = EmotionClassifier()
51
+
52
+ # --- 3) Predict + compute Top-k accuracy ---
53
+ pred_top1 = []
54
+ top3_hits = 0
55
+ top5_hits = 0
56
+
57
+ for text, true_lab in zip(texts, true_labels):
58
+ preds = clf.predict_emotions(text, top_k=5)
59
+
60
+ # preds looks like: [{'label': 'fear', 'score': 0.88}, ...]
61
+ pred_labels = [normalize_label(p.get("label", "")) for p in preds]
62
+
63
+ if pred_labels:
64
+ pred_top1.append(pred_labels[0])
65
+ else:
66
+ pred_top1.append("")
67
+
68
+ if topk_hit(pred_labels, true_lab, 3):
69
+ top3_hits += 1
70
+ if topk_hit(pred_labels, true_lab, 5):
71
+ top5_hits += 1
72
+
73
+ top1 = accuracy_score(true_labels, pred_top1)
74
+ top3 = top3_hits / len(true_labels)
75
+ top5 = top5_hits / len(true_labels)
76
+
77
+ print("\n========== Emotion Classifier Evaluation ==========")
78
+ print(f"Samples: {len(true_labels)}")
79
+ print(f"Top-1 Accuracy: {top1:.3f}")
80
+ print(f"Top-3 Accuracy: {top3:.3f}")
81
+ print(f"Top-5 Accuracy: {top5:.3f}")
82
+
83
+ print("\n--- Classification Report (Top-1) ---")
84
+ print(classification_report(true_labels, pred_top1, zero_division=0))
85
+
86
+ print("\n--- Confusion Matrix (Top-1) ---")
87
+ labels_sorted = sorted(list(set(true_labels)))
88
+ cm = confusion_matrix(true_labels, pred_top1, labels=labels_sorted)
89
+ cm_df = pd.DataFrame(cm, index=labels_sorted, columns=labels_sorted)
90
+ print(cm_df.to_string())
91
+
92
+
93
+ if __name__ == "__main__":
94
+ main()