Spaces:
Sleeping
Sleeping
Disini Ruhansa Kodagoda Hettige commited on
Commit ·
9be21ef
0
Parent(s):
Deploy EmpowerHer app
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .dockerignore +12 -0
- .gitattributes +40 -0
- .gitignore +6 -0
- Dockerfile +33 -0
- FRONTEND/.gitignore +24 -0
- FRONTEND/README.md +73 -0
- FRONTEND/eslint.config.js +23 -0
- FRONTEND/images/Celebrating sisterhood in soft pastels.png +3 -0
- FRONTEND/images/Logo.png +3 -0
- FRONTEND/images/activity_diagram.mmd +32 -0
- FRONTEND/images/activity_diagram.png +3 -0
- FRONTEND/images/class_diagram.mmd +52 -0
- FRONTEND/images/class_diagram.png +3 -0
- FRONTEND/images/cover.jpg +3 -0
- FRONTEND/images/landpic.avif +3 -0
- FRONTEND/images/sequence_diagram.mmd +33 -0
- FRONTEND/images/sequence_diagram.png +3 -0
- FRONTEND/images/sitecover.png +3 -0
- FRONTEND/images/wireframe_desktop.png +3 -0
- FRONTEND/images/wireframe_empty_state.png +3 -0
- FRONTEND/images/wireframe_mobile.png +3 -0
- FRONTEND/index.html +13 -0
- FRONTEND/package-lock.json +0 -0
- FRONTEND/package.json +31 -0
- FRONTEND/public/images/Logo.png +3 -0
- FRONTEND/public/images/cover.jpg +3 -0
- FRONTEND/public/images/landpic.jpg +3 -0
- FRONTEND/public/vite.svg +1 -0
- FRONTEND/src/App.css +970 -0
- FRONTEND/src/App.tsx +648 -0
- FRONTEND/src/app.jsx +191 -0
- FRONTEND/src/assets/react.svg +1 -0
- FRONTEND/src/index.css +20 -0
- FRONTEND/src/main.tsx +10 -0
- FRONTEND/tsconfig.app.json +28 -0
- FRONTEND/tsconfig.json +7 -0
- FRONTEND/tsconfig.node.json +26 -0
- FRONTEND/vite.config.ts +11 -0
- README.md +12 -0
- README_DEPLOY.md +26 -0
- app/app.py +59 -0
- app/templates/chat.html +51 -0
- eval/__init__.py +0 -0
- eval/compare_emotion_vs_noemotion.py +23 -0
- eval/compare_kb_vs_nokb.py +25 -0
- eval/compare_rag_vs_nonrag.py +32 -0
- eval/dg_eval.csv +145 -0
- eval/dg_results.csv +747 -0
- eval/emotion_eval.csv +149 -0
- 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
|
FRONTEND/images/Logo.png
ADDED
|
Git LFS Details
|
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
|
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
|
FRONTEND/images/cover.jpg
ADDED
|
Git LFS Details
|
FRONTEND/images/landpic.avif
ADDED
|
Git LFS Details
|
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
|
FRONTEND/images/sitecover.png
ADDED
|
Git LFS Details
|
FRONTEND/images/wireframe_desktop.png
ADDED
|
Git LFS Details
|
FRONTEND/images/wireframe_empty_state.png
ADDED
|
Git LFS Details
|
FRONTEND/images/wireframe_mobile.png
ADDED
|
Git LFS Details
|
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
|
FRONTEND/public/images/cover.jpg
ADDED
|
Git LFS Details
|
FRONTEND/public/images/landpic.jpg
ADDED
|
Git LFS Details
|
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()
|