diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml
index f96f68360..0014088c7 100644
--- a/.github/workflows/docker-publish.yml
+++ b/.github/workflows/docker-publish.yml
@@ -80,7 +80,7 @@ jobs:
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0
+ uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
# GHCR rejects repository refs with uppercase letters. `IMAGE_NAME`
# is derived from `github.repository`, which preserves the case of
@@ -106,7 +106,7 @@ jobs:
- name: Compute image labels
id: meta
- uses: docker/metadata-action@80c7e94dd9b9319bd5eb7a0e0fe9291e23a2a2e9 # v6.1.0
+ uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6.2.0
with:
images: ${{ env.IMAGE_REF }}
labels: |
@@ -206,7 +206,7 @@ jobs:
# arm64 layer never poisons an amd64 build).
- name: Build & push by digest
id: build
- uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0
+ uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
with:
context: .
file: ./Dockerfile
@@ -284,7 +284,7 @@ jobs:
merge-multiple: true
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0
+ uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
# GHCR requires the repository ref to be lowercase. See the same
# step in the `build` job above for the longer rationale.
@@ -301,7 +301,7 @@ jobs:
- name: Compute image tags & labels
id: meta
- uses: docker/metadata-action@80c7e94dd9b9319bd5eb7a0e0fe9291e23a2a2e9 # v6.1.0
+ uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6.2.0
with:
images: ${{ env.IMAGE_REF }}
tags: |
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d656043df..5ad103531 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,19 @@
## [Unreleased]
+## [1.27.10] — 2026-07-05 — Two new check-ins: wellbeing and sleep
+
+### Added
+
+- The WHO-5 wellbeing check-in joins the mental-wellbeing page: five positively worded questions about the last two weeks, scored 0–100 per the WHO's official scheme. A lower result gently points to the PHQ-9 check-in — a hint, never a diagnosis. The questionnaire uses the WHO's own official translations in all six app languages.
+- The Sleep Condition Indicator (SCI) adds a sleep check-in: eight questions, aligned with how sleep problems are clinically described, shown with neutral wording. The validated English questionnaire is used; languages without a validated translation show the English items with an honest note.
+- Both scores persist as measurements (server-computed, like the existing screening scores) and can be scheduled as preventive-care reminders that satisfy themselves when a check-in is completed.
+
+### Changed
+
+- The mental-wellbeing page now leads with the four instrument cards; the result history moved off the landing page. Each card opens a detail view with the score trend chart, the dated history, and the start button.
+- Dependency refresh: Next.js 16.2.10, TanStack Query 5.101.2, nodemailer 9.0.3, react-hook-form 7.81.0, @types/node 26, and current Docker build-action pins.
+
## [1.27.9] — 2026-07-05 — Coach plans you can accept
### Added
diff --git a/docs/api/openapi.yaml b/docs/api/openapi.yaml
index ab95da7d7..8513e4890 100644
--- a/docs/api/openapi.yaml
+++ b/docs/api/openapi.yaml
@@ -1,7 +1,7 @@
openapi: 3.1.0
info:
title: HealthLog API
- version: 1.27.9
+ version: 1.27.10
description: >-
Self-hosted personal-health-tracking PWA — public API surface for the iOS native client and external ingest.
@@ -2103,6 +2103,8 @@ paths:
- PAIN_NRS
- WAIST_CIRCUMFERENCE
- WAIST_TO_HEIGHT
+ - WHO5_SCORE
+ - SCI_SCORE
- in: query
name: from
schema:
@@ -2299,6 +2301,8 @@ paths:
- PAIN_NRS
- WAIST_CIRCUMFERENCE
- WAIST_TO_HEIGHT
+ - WHO5_SCORE
+ - SCI_SCORE
value:
type: number
measuredAt:
@@ -5878,6 +5882,8 @@ paths:
- PAIN_NRS
- WAIST_CIRCUMFERENCE
- WAIST_TO_HEIGHT
+ - WHO5_SCORE
+ - SCI_SCORE
description: "The measurement type to read (single metric — no fan-out). Closed enum: an unknown type 422s."
required: true
description: "The measurement type to read (single metric — no fan-out). Closed enum: an unknown type 422s."
@@ -8116,8 +8122,8 @@ paths:
tags:
- Mental health
summary: List the caller's screener history
- description: Returns PHQ-9 / GAD-7 administrations (newest first). Totals + bands + flags only; raw item answers are
- never returned.
+ description: Returns PHQ-9 / GAD-7 / WHO-5 / SCI administrations (newest first). Totals + bands + flags only; raw item
+ answers are never returned.
parameters:
- in: query
name: instrument
@@ -8126,6 +8132,8 @@ paths:
enum:
- PHQ9
- GAD7
+ - WHO5
+ - SCI
- in: query
name: limit
schema:
@@ -8151,10 +8159,11 @@ paths:
post:
tags:
- Mental health
- summary: Record a completed PHQ-9 / GAD-7 screener
+ summary: Record a completed screener
description: Stores one administration (item answers encrypted) and writes the derived total as a server-owned
- PHQ9_SCORE / GAD7_SCORE measurement (source COMPUTED — never client-writable). On a positive PHQ-9 item-9 the
- response carries the locale-aware crisis-resource set.
+ PHQ9_SCORE / GAD7_SCORE / WHO5_SCORE / SCI_SCORE measurement (source COMPUTED — never client-writable). WHO-5
+ and SCI totals run HIGHER = better; their follow-up thresholds point downwards (≤ 50 / ≤ 16). On a positive
+ PHQ-9 item-9 the response carries the locale-aware crisis-resource set.
requestBody:
content:
application/json:
@@ -8166,6 +8175,8 @@ paths:
enum:
- PHQ9
- GAD7
+ - WHO5
+ - SCI
items:
minItems: 1
maxItems: 12
@@ -8173,7 +8184,7 @@ paths:
items:
type: integer
minimum: 0
- maximum: 3
+ maximum: 5
functionalDifficulty:
type: integer
minimum: 0
@@ -11158,9 +11169,11 @@ components:
- BODY_MASS_INDEX
- PHQ9_SCORE
- GAD7_SCORE
- description: Auto-resolve target metric (vitals + body-composition family + the PHQ-9 / GAD-7 screenings). BP resolves
- on BLOOD_PRESSURE_SYS (the SYS row is the 'a BP was measured' sentinel); a screening reminder resolves on the
- server-written PHQ9_SCORE / GAD7_SCORE row when a check-in completes. Omit for a free-text Vorsorge that
+ - WHO5_SCORE
+ - SCI_SCORE
+ description: Auto-resolve target metric (vitals + body-composition family + the PHQ-9 / GAD-7 / WHO-5 / SCI screenings).
+ BP resolves on BLOOD_PRESSURE_SYS (the SYS row is the 'a BP was measured' sentinel); a screening reminder
+ resolves on the server-written *_SCORE row when a check-in completes. Omit for a free-text Vorsorge that
resolves only on a manual satisfy or a matching lab result.
MeasurementReminderUpdate:
type: object
@@ -13917,6 +13930,8 @@ components:
- PAIN_NRS
- WAIST_CIRCUMFERENCE
- WAIST_TO_HEIGHT
+ - WHO5_SCORE
+ - SCI_SCORE
value:
type: number
unit:
@@ -14240,6 +14255,8 @@ components:
- PAIN_NRS
- WAIST_CIRCUMFERENCE
- WAIST_TO_HEIGHT
+ - WHO5_SCORE
+ - SCI_SCORE
additionalProperties:
type: array
items:
@@ -14323,6 +14340,8 @@ components:
- PAIN_NRS
- WAIST_CIRCUMFERENCE
- WAIST_TO_HEIGHT
+ - WHO5_SCORE
+ - SCI_SCORE
value:
type: number
description: Daily mean (spot metrics) or SUM (cumulative).
@@ -14427,6 +14446,8 @@ components:
- PAIN_NRS
- WAIST_CIRCUMFERENCE
- WAIST_TO_HEIGHT
+ - WHO5_SCORE
+ - SCI_SCORE
description: Per-type daily series, keyed by MeasurementType.
required:
- series
@@ -14666,6 +14687,8 @@ components:
- PAIN_NRS
- WAIST_CIRCUMFERENCE
- WAIST_TO_HEIGHT
+ - WHO5_SCORE
+ - SCI_SCORE
value:
type: number
unit:
@@ -25232,6 +25255,8 @@ components:
enum:
- PHQ9
- GAD7
+ - WHO5
+ - SCI
locale:
type: string
version:
diff --git a/messages/de.json b/messages/de.json
index 26a0cc13e..0afda8c76 100644
--- a/messages/de.json
+++ b/messages/de.json
@@ -599,7 +599,9 @@
"typeWaistCircumference": "Taillenumfang",
"typeWaistToHeight": "Taille-Größe-Verhältnis",
"unitScore": "Pkt.",
- "unitRatio": "Verhältnis"
+ "unitRatio": "Verhältnis",
+ "typeWho5Score": "WHO-5-Wert",
+ "typeSciScore": "SCI-Wert"
},
"mood": {
"title": "Stimmung",
@@ -7667,8 +7669,7 @@
},
"mentalHealth": {
"pageTitle": "Check-in zum seelischen Wohlbefinden",
- "pageDescription": "Zwei validierte, freiwillige Selbsttests — PHQ-9 (Stimmung) und GAD-7 (Sorgen) — ergänzend zu deinem Stimmungstagebuch. Aussagekräftig ist der Verlauf über die Zeit, nicht ein einzelner Wert.",
- "pageRhythmHint": "Beide Tests blicken auf die letzten zwei Wochen zurück — ein Check-in alle zwei bis vier Wochen ist deshalb ein guter Rhythmus.",
+ "pageDescription": "Vier validierte, freiwillige Selbsttests — PHQ-9 (Stimmung), GAD-7 (Sorgen), WHO-5 (Wohlbefinden) und SCI (Schlaf) — ergänzend zu deinem Stimmungstagebuch. Aussagekräftig ist der Verlauf über die Zeit, nicht ein einzelner Wert.",
"attributionLabel": "Quelle",
"choosePrompt": "Check-in auswählen",
"start": "Starten",
@@ -7677,14 +7678,17 @@
"submitting": "Wird gespeichert…",
"saved": "Gespeichert",
"error": "Etwas ist schiefgelaufen. Bitte versuche es erneut.",
- "considerProfessional": "Dein Wert liegt in einem Bereich, in dem ein Gespräch mit einer Fachperson helfen kann. Das ist ein behutsamer Hinweis, keine Diagnose.",
"instrument": {
"phq9": "PHQ-9 · Stimmung",
- "gad7": "GAD-7 · Sorgen"
+ "gad7": "GAD-7 · Sorgen",
+ "who5": "WHO-5 · Wohlbefinden",
+ "sci": "SCI · Schlaf"
},
"instrumentSub": {
"phq9": "Depressions-Screening, 9 Fragen",
- "gad7": "Angst-Screening, 7 Fragen"
+ "gad7": "Angst-Screening, 7 Fragen",
+ "who5": "Wohlbefindens-Check, 5 Fragen",
+ "sci": "Schlaf-Check, 8 Fragen"
},
"options": {
"0": "Überhaupt nicht",
@@ -7719,16 +7723,23 @@
"mild": "Leicht",
"moderate": "Mittelgradig",
"severe": "Schwer"
+ },
+ "WHO5": {
+ "low": "Niedrigeres Wohlbefinden",
+ "good": "Gutes Wohlbefinden"
+ },
+ "SCI": {
+ "belowThreshold": "Möglicher Insomnie-Bereich",
+ "aboveThreshold": "Kein Insomnie-Hinweis"
}
},
"history": {
"title": "Dein Verlauf",
"empty": "Noch keine Check-ins. Dein Verlauf erscheint hier, sobald du einen abgeschlossen hast.",
"flaggedBadge": "Hilfe angezeigt",
- "tab": {
- "phq9": "PHQ-9",
- "gad7": "GAD-7"
- }
+ "chartTitle": "Punkteverlauf",
+ "totalLabel": "Punkte",
+ "bandLabel": "Einstufung"
},
"crisis": {
"title": "Du musst das nicht allein durchstehen",
@@ -7756,6 +7767,23 @@
"5": "Rastlosigkeit, sodass Stillsitzen schwerfällt",
"6": "Schnelle Verärgerung oder Gereiztheit",
"7": "Gefühl der Angst, als würde etwas Schlimmes passieren"
+ },
+ "who5": {
+ "1": "… war ich froh und guter Laune",
+ "2": "… habe ich mich ruhig und entspannt gefühlt",
+ "3": "… habe ich mich energisch und aktiv gefühlt",
+ "4": "… habe ich mich beim Aufwachen frisch und ausgeruht gefühlt",
+ "5": "… war mein Alltag voller Dinge, die mich interessieren"
+ },
+ "sci": {
+ "1": "… how long does it take you to fall asleep?",
+ "2": "… if you then wake up during the night … how long are you awake for in total? (add all the wakenings up)",
+ "3": "… how many nights a week do you have a problem with your sleep?",
+ "4": "… how would you rate your sleep quality?",
+ "5": "… affected your mood, energy, or relationships?",
+ "6": "… affected your concentration, productivity, or ability to stay awake?",
+ "7": "… troubled you in general?",
+ "8": "… how long have you had a problem with your sleep?"
}
},
"crisisResource": {
@@ -7783,14 +7811,79 @@
},
"instrumentDescription": {
"phq9": "Depressions-Screening mit 9 Fragen. Beziehe dich auf die letzten zwei Wochen.",
- "gad7": "Angst-Screening mit 7 Fragen. Beziehe dich auf die letzten zwei Wochen."
+ "gad7": "Angst-Screening mit 7 Fragen. Beziehe dich auf die letzten zwei Wochen.",
+ "who5": "Wohlbefindens-Check mit 5 Fragen. Beziehe dich auf die letzten zwei Wochen; höhere Werte bedeuten besseres Wohlbefinden.",
+ "sci": "Schlaf-Check mit 8 Fragen. Die meisten Fragen beziehen sich auf den letzten Monat; höhere Werte bedeuten besseren Schlaf."
},
"progress": "{current} / {total}",
"next": "Weiter",
"lastResult": "Letzter Test",
"lastScore": "Letztes Ergebnis",
"noResultYet": "Noch kein Check-in",
- "backToList": "Übersicht"
+ "backToList": "Übersicht",
+ "followUpHint": {
+ "phq9": "Dein Wert liegt in einem Bereich, in dem ein Gespräch mit einer Fachperson helfen kann. Das ist ein behutsamer Hinweis, keine Diagnose.",
+ "gad7": "Dein Wert liegt in einem Bereich, in dem ein Gespräch mit einer Fachperson helfen kann. Das ist ein behutsamer Hinweis, keine Diagnose.",
+ "who5": "Ein Wohlbefindens-Wert von 50 oder darunter kann einen genaueren Blick wert sein. Wenn du magst, schaut der PHQ-9-Check-in auf dieser Seite genauer auf die Stimmung. Das ist ein behutsamer Hinweis, keine Diagnose.",
+ "sci": "In der Studie zu diesem Fragebogen waren Werte von 16 oder darunter mit wahrscheinlicher Insomnie verbunden. Wenn schlechter Schlaf dich weiter belastet, kann ein Gespräch mit einer Fachperson helfen. Das ist keine Diagnose."
+ },
+ "validatedInEnglishNote": "Dieser Fragebogen ist in englischer Sprache validiert; die Fragen erscheinen im englischen Original.",
+ "who5Options": {
+ "5": "Die ganze Zeit",
+ "4": "Meistens",
+ "3": "Etwas mehr als die Hälfte der Zeit",
+ "2": "Etwas weniger als die Hälfte der Zeit",
+ "1": "Ab und zu",
+ "0": "Zu keinem Zeitpunkt"
+ },
+ "sciOptions": {
+ "duration": {
+ "4": "0–15 min",
+ "3": "16–30 min",
+ "2": "31–45 min",
+ "1": "46–60 min",
+ "0": "≥ 61 min"
+ },
+ "nights": {
+ "4": "0–1",
+ "3": "2",
+ "2": "3",
+ "1": "4",
+ "0": "5–7"
+ },
+ "quality": {
+ "4": "Very good",
+ "3": "Good",
+ "2": "Average",
+ "1": "Poor",
+ "0": "Very poor"
+ },
+ "impact": {
+ "4": "Not at all",
+ "3": "A little",
+ "2": "Somewhat",
+ "1": "Much",
+ "0": "Very much"
+ },
+ "problemDuration": {
+ "4": "I don't have a problem / < 1 month",
+ "3": "1–2 months",
+ "2": "3–6 months",
+ "1": "7–12 months",
+ "0": "> 1 year"
+ }
+ },
+ "stems": {
+ "who5": {
+ "period": "In den letzten zwei Wochen …"
+ },
+ "sci": {
+ "night": "Thinking about a typical night in the last month …",
+ "impact": "Thinking about the past month, to what extent has poor sleep …",
+ "finally": "Finally …"
+ }
+ },
+ "openDetail": "Details anzeigen"
},
"records": {
"disclaimer": "Das sind deine eigenen Angaben, keine ärztliche Diagnose. HealthLog stellt keine Diagnose, behandelt nicht und deutet nichts.",
diff --git a/messages/en.json b/messages/en.json
index 5d9a30932..946fff862 100644
--- a/messages/en.json
+++ b/messages/en.json
@@ -599,7 +599,9 @@
"typeWaistCircumference": "Waist circumference",
"typeWaistToHeight": "Waist-to-height ratio",
"unitScore": "pts",
- "unitRatio": "ratio"
+ "unitRatio": "ratio",
+ "typeWho5Score": "WHO-5 score",
+ "typeSciScore": "SCI score"
},
"mood": {
"title": "Mood",
@@ -7667,8 +7669,7 @@
},
"mentalHealth": {
"pageTitle": "Mental wellbeing check-in",
- "pageDescription": "Two validated, opt-in self-assessments — PHQ-9 (mood) and GAD-7 (worry) — that sit beside your mood tracking. The value is the trend over time, not any single number.",
- "pageRhythmHint": "Both tests look back over the last two weeks, so a check-in every two to four weeks is a comfortable rhythm.",
+ "pageDescription": "Validated, opt-in self-checks — PHQ-9 (mood), GAD-7 (worry), WHO-5 (well-being) and SCI (sleep) — that sit beside your mood tracking. The value is the trend over time, not any single number.",
"attributionLabel": "Attribution",
"choosePrompt": "Choose a check-in",
"start": "Start",
@@ -7677,14 +7678,17 @@
"submitting": "Saving…",
"saved": "Saved",
"error": "Something went wrong. Please try again.",
- "considerProfessional": "Your score is in a range where talking to a health professional may help. This is a gentle suggestion, not a diagnosis.",
"instrument": {
"phq9": "PHQ-9 · mood",
- "gad7": "GAD-7 · worry"
+ "gad7": "GAD-7 · worry",
+ "who5": "WHO-5 · well-being",
+ "sci": "SCI · sleep"
},
"instrumentSub": {
"phq9": "Depression screen, 9 questions",
- "gad7": "Anxiety screen, 7 questions"
+ "gad7": "Anxiety screen, 7 questions",
+ "who5": "Well-being check, 5 questions",
+ "sci": "Sleep check, 8 questions"
},
"options": {
"0": "Not at all",
@@ -7719,16 +7723,23 @@
"mild": "Mild",
"moderate": "Moderate",
"severe": "Severe"
+ },
+ "WHO5": {
+ "low": "Lower well-being",
+ "good": "Good well-being"
+ },
+ "SCI": {
+ "belowThreshold": "Possible insomnia range",
+ "aboveThreshold": "No insomnia indication"
}
},
"history": {
"title": "Your history",
"empty": "No check-ins yet. Your trend will appear here once you complete one.",
"flaggedBadge": "Support shown",
- "tab": {
- "phq9": "PHQ-9",
- "gad7": "GAD-7"
- }
+ "chartTitle": "Score trend",
+ "totalLabel": "Score",
+ "bandLabel": "Category"
},
"crisis": {
"title": "You don't have to face this alone",
@@ -7756,6 +7767,23 @@
"5": "Being so restless that it is hard to sit still",
"6": "Becoming easily annoyed or irritable",
"7": "Feeling afraid as if something awful might happen"
+ },
+ "who5": {
+ "1": "I have felt cheerful and in good spirits",
+ "2": "I have felt calm and relaxed",
+ "3": "I have felt active and vigorous",
+ "4": "I woke up feeling fresh and rested",
+ "5": "My daily life has been filled with things that interest me"
+ },
+ "sci": {
+ "1": "… how long does it take you to fall asleep?",
+ "2": "… if you then wake up during the night … how long are you awake for in total? (add all the wakenings up)",
+ "3": "… how many nights a week do you have a problem with your sleep?",
+ "4": "… how would you rate your sleep quality?",
+ "5": "… affected your mood, energy, or relationships?",
+ "6": "… affected your concentration, productivity, or ability to stay awake?",
+ "7": "… troubled you in general?",
+ "8": "… how long have you had a problem with your sleep?"
}
},
"crisisResource": {
@@ -7783,14 +7811,79 @@
},
"instrumentDescription": {
"phq9": "9-question depression screen. Answer for the last two weeks.",
- "gad7": "7-question anxiety screen. Answer for the last two weeks."
+ "gad7": "7-question anxiety screen. Answer for the last two weeks.",
+ "who5": "5-question well-being check. Answer for the last two weeks; higher numbers mean better well-being.",
+ "sci": "8-question sleep check. Most questions ask about the past month; higher scores mean better sleep."
},
"progress": "{current} / {total}",
"next": "Next",
"lastResult": "Last test",
"lastScore": "Last result",
"noResultYet": "No check-in yet",
- "backToList": "Overview"
+ "backToList": "Overview",
+ "followUpHint": {
+ "phq9": "Your score is in a range where talking to a health professional may help. This is a gentle suggestion, not a diagnosis.",
+ "gad7": "Your score is in a range where talking to a health professional may help. This is a gentle suggestion, not a diagnosis.",
+ "who5": "A well-being score of 50 or below can be worth a closer look. If you like, the PHQ-9 check-in on this page looks at mood in more depth. This is a gentle suggestion, not a diagnosis.",
+ "sci": "In the study behind this questionnaire, scores of 16 or below were associated with probable insomnia. If poor sleep keeps troubling you, talking to a health professional may help. This is not a diagnosis."
+ },
+ "validatedInEnglishNote": "This questionnaire is validated in English; the questions are shown in the original English wording.",
+ "who5Options": {
+ "5": "All of the time",
+ "4": "Most of the time",
+ "3": "More than half of the time",
+ "2": "Less than half of the time",
+ "1": "Some of the time",
+ "0": "At no time"
+ },
+ "sciOptions": {
+ "duration": {
+ "4": "0–15 min",
+ "3": "16–30 min",
+ "2": "31–45 min",
+ "1": "46–60 min",
+ "0": "≥ 61 min"
+ },
+ "nights": {
+ "4": "0–1",
+ "3": "2",
+ "2": "3",
+ "1": "4",
+ "0": "5–7"
+ },
+ "quality": {
+ "4": "Very good",
+ "3": "Good",
+ "2": "Average",
+ "1": "Poor",
+ "0": "Very poor"
+ },
+ "impact": {
+ "4": "Not at all",
+ "3": "A little",
+ "2": "Somewhat",
+ "1": "Much",
+ "0": "Very much"
+ },
+ "problemDuration": {
+ "4": "I don't have a problem / < 1 month",
+ "3": "1–2 months",
+ "2": "3–6 months",
+ "1": "7–12 months",
+ "0": "> 1 year"
+ }
+ },
+ "stems": {
+ "who5": {
+ "period": "Over the last two weeks …"
+ },
+ "sci": {
+ "night": "Thinking about a typical night in the last month …",
+ "impact": "Thinking about the past month, to what extent has poor sleep …",
+ "finally": "Finally …"
+ }
+ },
+ "openDetail": "Show details"
},
"records": {
"disclaimer": "These are your own records, not a medical diagnosis. HealthLog does not diagnose, treat, or interpret them.",
diff --git a/messages/es.json b/messages/es.json
index 7f44c1b69..54bc72f7b 100644
--- a/messages/es.json
+++ b/messages/es.json
@@ -599,7 +599,9 @@
"typeWaistCircumference": "Perímetro de cintura",
"typeWaistToHeight": "Índice cintura-altura",
"unitScore": "pts",
- "unitRatio": "ratio"
+ "unitRatio": "ratio",
+ "typeWho5Score": "Puntuación WHO-5",
+ "typeSciScore": "Puntuación SCI"
},
"mood": {
"title": "Estado de ánimo",
@@ -7667,8 +7669,7 @@
},
"mentalHealth": {
"pageTitle": "Revisión de bienestar mental",
- "pageDescription": "Dos autoevaluaciones validadas y opcionales — PHQ-9 (estado de ánimo) y GAD-7 (preocupación) — junto a tu registro de ánimo. Lo valioso es la tendencia en el tiempo, no un único número.",
- "pageRhythmHint": "Ambos tests se refieren a las últimas dos semanas, por lo que un check-in cada dos a cuatro semanas es un buen ritmo.",
+ "pageDescription": "Cuatro autoevaluaciones validadas y opcionales — PHQ-9 (estado de ánimo), GAD-7 (preocupación), WHO-5 (bienestar) y SCI (sueño) — junto a tu registro de ánimo. Lo valioso es la tendencia en el tiempo, no un único número.",
"attributionLabel": "Fuente",
"choosePrompt": "Elige una revisión",
"start": "Empezar",
@@ -7677,14 +7678,17 @@
"submitting": "Guardando…",
"saved": "Guardado",
"error": "Algo salió mal. Inténtalo de nuevo.",
- "considerProfessional": "Tu puntuación está en un rango en el que hablar con un profesional de salud puede ayudar. Es una sugerencia amable, no un diagnóstico.",
"instrument": {
"phq9": "PHQ-9 · ánimo",
- "gad7": "GAD-7 · preocupación"
+ "gad7": "GAD-7 · preocupación",
+ "who5": "WHO-5 · bienestar",
+ "sci": "SCI · sueño"
},
"instrumentSub": {
"phq9": "Cribado de depresión, 9 preguntas",
- "gad7": "Cribado de ansiedad, 7 preguntas"
+ "gad7": "Cribado de ansiedad, 7 preguntas",
+ "who5": "Test de bienestar, 5 preguntas",
+ "sci": "Test de sueño, 8 preguntas"
},
"options": {
"0": "Nunca",
@@ -7719,16 +7723,23 @@
"mild": "Leve",
"moderate": "Moderada",
"severe": "Grave"
+ },
+ "WHO5": {
+ "low": "Bienestar más bajo",
+ "good": "Buen bienestar"
+ },
+ "SCI": {
+ "belowThreshold": "Rango de posible insomnio",
+ "aboveThreshold": "Sin indicios de insomnio"
}
},
"history": {
"title": "Tu historial",
"empty": "Aún no hay revisiones. Tu tendencia aparecerá aquí cuando completes una.",
"flaggedBadge": "Apoyo mostrado",
- "tab": {
- "phq9": "PHQ-9",
- "gad7": "GAD-7"
- }
+ "chartTitle": "Evolución de la puntuación",
+ "totalLabel": "Puntuación",
+ "bandLabel": "Categoría"
},
"crisis": {
"title": "No tienes que afrontar esto a solas",
@@ -7756,6 +7767,23 @@
"5": "Estar tan inquieto/a que es difícil quedarse sentado/a tranquilamente",
"6": "Molestarse o irritarse fácilmente",
"7": "Sentir miedo como si algo terrible fuera a suceder"
+ },
+ "who5": {
+ "1": "Me he sentido alegre y de buen humor",
+ "2": "Me he sentido tranquilo y relajado",
+ "3": "Me he sentido activo y enérgico",
+ "4": "Me he despertado fresco y descansado",
+ "5": "Mi vida cotidiana ha estado llena de cosas que me interesan"
+ },
+ "sci": {
+ "1": "… how long does it take you to fall asleep?",
+ "2": "… if you then wake up during the night … how long are you awake for in total? (add all the wakenings up)",
+ "3": "… how many nights a week do you have a problem with your sleep?",
+ "4": "… how would you rate your sleep quality?",
+ "5": "… affected your mood, energy, or relationships?",
+ "6": "… affected your concentration, productivity, or ability to stay awake?",
+ "7": "… troubled you in general?",
+ "8": "… how long have you had a problem with your sleep?"
}
},
"crisisResource": {
@@ -7783,14 +7811,79 @@
},
"instrumentDescription": {
"phq9": "Cribado de depresión de 9 preguntas. Responde pensando en las últimas dos semanas.",
- "gad7": "Cribado de ansiedad de 7 preguntas. Responde pensando en las últimas dos semanas."
+ "gad7": "Cribado de ansiedad de 7 preguntas. Responde pensando en las últimas dos semanas.",
+ "who5": "Test de bienestar de 5 preguntas. Responde pensando en las últimas dos semanas; cifras mayores significan mayor bienestar.",
+ "sci": "Test de sueño de 8 preguntas. La mayoría se refiere al último mes; puntuaciones mayores significan mejor sueño."
},
"progress": "{current} / {total}",
"next": "Siguiente",
"lastResult": "Última prueba",
"lastScore": "Último resultado",
"noResultYet": "Aún sin check-in",
- "backToList": "Vista general"
+ "backToList": "Vista general",
+ "followUpHint": {
+ "phq9": "Tu puntuación está en un rango en el que hablar con un profesional de salud puede ayudar. Es una sugerencia amable, no un diagnóstico.",
+ "gad7": "Tu puntuación está en un rango en el que hablar con un profesional de salud puede ayudar. Es una sugerencia amable, no un diagnóstico.",
+ "who5": "Una puntuación de bienestar de 50 o menos puede merecer una mirada más atenta. Si quieres, el PHQ-9 de esta página explora el estado de ánimo con más detalle. Es una sugerencia amable, no un diagnóstico.",
+ "sci": "En el estudio de este cuestionario, puntuaciones de 16 o menos se asociaron con insomnio probable. Si dormir mal te sigue afectando, hablar con un profesional de salud puede ayudar. No es un diagnóstico."
+ },
+ "validatedInEnglishNote": "Este cuestionario está validado en inglés; las preguntas se muestran en su versión original en inglés.",
+ "who5Options": {
+ "5": "Todo el tiempo",
+ "4": "La mayor parte del tiempo",
+ "3": "Más de la mitad del tiempo",
+ "2": "Menos de la mitad del tiempo",
+ "1": "De vez en cuando",
+ "0": "Nunca"
+ },
+ "sciOptions": {
+ "duration": {
+ "4": "0–15 min",
+ "3": "16–30 min",
+ "2": "31–45 min",
+ "1": "46–60 min",
+ "0": "≥ 61 min"
+ },
+ "nights": {
+ "4": "0–1",
+ "3": "2",
+ "2": "3",
+ "1": "4",
+ "0": "5–7"
+ },
+ "quality": {
+ "4": "Very good",
+ "3": "Good",
+ "2": "Average",
+ "1": "Poor",
+ "0": "Very poor"
+ },
+ "impact": {
+ "4": "Not at all",
+ "3": "A little",
+ "2": "Somewhat",
+ "1": "Much",
+ "0": "Very much"
+ },
+ "problemDuration": {
+ "4": "I don't have a problem / < 1 month",
+ "3": "1–2 months",
+ "2": "3–6 months",
+ "1": "7–12 months",
+ "0": "> 1 year"
+ }
+ },
+ "stems": {
+ "who5": {
+ "period": "Durante las últimas dos semanas:"
+ },
+ "sci": {
+ "night": "Thinking about a typical night in the last month …",
+ "impact": "Thinking about the past month, to what extent has poor sleep …",
+ "finally": "Finally …"
+ }
+ },
+ "openDetail": "Ver detalles"
},
"records": {
"disclaimer": "Son tus propios registros, no un diagnóstico médico. HealthLog no diagnostica, no trata ni los interpreta.",
diff --git a/messages/fr.json b/messages/fr.json
index c150ab3d4..ffad926a0 100644
--- a/messages/fr.json
+++ b/messages/fr.json
@@ -599,7 +599,9 @@
"typeWaistCircumference": "Tour de taille",
"typeWaistToHeight": "Rapport taille-taille",
"unitScore": "pts",
- "unitRatio": "ratio"
+ "unitRatio": "ratio",
+ "typeWho5Score": "Score WHO-5",
+ "typeSciScore": "Score SCI"
},
"mood": {
"title": "Humeur",
@@ -7667,8 +7669,7 @@
},
"mentalHealth": {
"pageTitle": "Point sur le bien-être mental",
- "pageDescription": "Deux auto-évaluations validées et facultatives — PHQ-9 (humeur) et GAD-7 (inquiétude) — en complément de ton suivi de l'humeur. Ce qui compte, c'est la tendance dans le temps, pas un chiffre isolé.",
- "pageRhythmHint": "Les deux tests portent sur les deux dernières semaines — un check-in toutes les deux à quatre semaines est donc un bon rythme.",
+ "pageDescription": "Quatre auto-évaluations validées et facultatives — PHQ-9 (humeur), GAD-7 (inquiétude), WHO-5 (bien-être) et SCI (sommeil) — en complément de ton suivi de l'humeur. Ce qui compte, c'est la tendance dans le temps, pas un chiffre isolé.",
"attributionLabel": "Source",
"choosePrompt": "Choisis un bilan",
"start": "Commencer",
@@ -7677,14 +7678,17 @@
"submitting": "Enregistrement…",
"saved": "Enregistré",
"error": "Une erreur est survenue. Réessaie.",
- "considerProfessional": "Ton score se situe dans une plage où parler à un professionnel de santé peut aider. C'est une suggestion bienveillante, pas un diagnostic.",
"instrument": {
"phq9": "PHQ-9 · humeur",
- "gad7": "GAD-7 · inquiétude"
+ "gad7": "GAD-7 · inquiétude",
+ "who5": "WHO-5 · bien-être",
+ "sci": "SCI · sommeil"
},
"instrumentSub": {
"phq9": "Dépistage de la dépression, 9 questions",
- "gad7": "Dépistage de l'anxiété, 7 questions"
+ "gad7": "Dépistage de l'anxiété, 7 questions",
+ "who5": "Test de bien-être, 5 questions",
+ "sci": "Test de sommeil, 8 questions"
},
"options": {
"0": "Jamais",
@@ -7719,16 +7723,23 @@
"mild": "Légère",
"moderate": "Modérée",
"severe": "Sévère"
+ },
+ "WHO5": {
+ "low": "Bien-être plus faible",
+ "good": "Bon bien-être"
+ },
+ "SCI": {
+ "belowThreshold": "Zone d'insomnie possible",
+ "aboveThreshold": "Pas d'indice d'insomnie"
}
},
"history": {
"title": "Ton historique",
"empty": "Aucun bilan pour le moment. Ta tendance apparaîtra ici dès que tu en auras terminé un.",
"flaggedBadge": "Aide affichée",
- "tab": {
- "phq9": "PHQ-9",
- "gad7": "GAD-7"
- }
+ "chartTitle": "Évolution du score",
+ "totalLabel": "Score",
+ "bandLabel": "Catégorie"
},
"crisis": {
"title": "Tu n'as pas à affronter cela seul(e)",
@@ -7756,6 +7767,23 @@
"5": "Être si agité(e) qu'il est difficile de rester tranquille",
"6": "Devenir facilement contrarié(e) ou irritable",
"7": "Avoir peur que quelque chose d'épouvantable puisse arriver"
+ },
+ "who5": {
+ "1": "Je me suis senti(e) bien et de bonne humeur",
+ "2": "Je me suis senti(e) calme et tranquille",
+ "3": "Je me suis senti(e) plein(e) d'énergie et vigoureux(se)",
+ "4": "Je me suis réveillé(e) en me sentant frais(che) et dispos(e)",
+ "5": "Ma vie quotidienne a été remplie de choses intéressantes"
+ },
+ "sci": {
+ "1": "… how long does it take you to fall asleep?",
+ "2": "… if you then wake up during the night … how long are you awake for in total? (add all the wakenings up)",
+ "3": "… how many nights a week do you have a problem with your sleep?",
+ "4": "… how would you rate your sleep quality?",
+ "5": "… affected your mood, energy, or relationships?",
+ "6": "… affected your concentration, productivity, or ability to stay awake?",
+ "7": "… troubled you in general?",
+ "8": "… how long have you had a problem with your sleep?"
}
},
"crisisResource": {
@@ -7783,14 +7811,79 @@
},
"instrumentDescription": {
"phq9": "Dépistage de la dépression en 9 questions. Répondez en pensant aux deux dernières semaines.",
- "gad7": "Dépistage de l'anxiété en 7 questions. Répondez en pensant aux deux dernières semaines."
+ "gad7": "Dépistage de l'anxiété en 7 questions. Répondez en pensant aux deux dernières semaines.",
+ "who5": "Test de bien-être en 5 questions. Répondez en pensant aux deux dernières semaines ; des chiffres plus élevés signifient un meilleur bien-être.",
+ "sci": "Test de sommeil en 8 questions. La plupart des questions portent sur le dernier mois ; des scores plus élevés signifient un meilleur sommeil."
},
"progress": "{current} / {total}",
"next": "Suivant",
"lastResult": "Dernier test",
"lastScore": "Dernier résultat",
"noResultYet": "Pas encore de check-in",
- "backToList": "Vue d'ensemble"
+ "backToList": "Vue d'ensemble",
+ "followUpHint": {
+ "phq9": "Ton score se situe dans une plage où parler à un professionnel de santé peut aider. C'est une suggestion bienveillante, pas un diagnostic.",
+ "gad7": "Ton score se situe dans une plage où parler à un professionnel de santé peut aider. C'est une suggestion bienveillante, pas un diagnostic.",
+ "who5": "Un score de bien-être de 50 ou moins peut mériter un regard plus attentif. Si tu le souhaites, le PHQ-9 sur cette page explore l'humeur plus en détail. C'est une suggestion bienveillante, pas un diagnostic.",
+ "sci": "Dans l'étude de ce questionnaire, des scores de 16 ou moins étaient associés à une insomnie probable. Si un mauvais sommeil continue de te peser, parler à un professionnel de santé peut aider. Ce n'est pas un diagnostic."
+ },
+ "validatedInEnglishNote": "Ce questionnaire est validé en anglais ; les questions sont affichées dans leur version originale anglaise.",
+ "who5Options": {
+ "5": "Tout le temps",
+ "4": "La plupart du temps",
+ "3": "Plus de la moitié du temps",
+ "2": "Moins de la moitié du temps",
+ "1": "De temps en temps",
+ "0": "Jamais"
+ },
+ "sciOptions": {
+ "duration": {
+ "4": "0–15 min",
+ "3": "16–30 min",
+ "2": "31–45 min",
+ "1": "46–60 min",
+ "0": "≥ 61 min"
+ },
+ "nights": {
+ "4": "0–1",
+ "3": "2",
+ "2": "3",
+ "1": "4",
+ "0": "5–7"
+ },
+ "quality": {
+ "4": "Very good",
+ "3": "Good",
+ "2": "Average",
+ "1": "Poor",
+ "0": "Very poor"
+ },
+ "impact": {
+ "4": "Not at all",
+ "3": "A little",
+ "2": "Somewhat",
+ "1": "Much",
+ "0": "Very much"
+ },
+ "problemDuration": {
+ "4": "I don't have a problem / < 1 month",
+ "3": "1–2 months",
+ "2": "3–6 months",
+ "1": "7–12 months",
+ "0": "> 1 year"
+ }
+ },
+ "stems": {
+ "who5": {
+ "period": "Au cours des deux dernières semaines"
+ },
+ "sci": {
+ "night": "Thinking about a typical night in the last month …",
+ "impact": "Thinking about the past month, to what extent has poor sleep …",
+ "finally": "Finally …"
+ }
+ },
+ "openDetail": "Voir les détails"
},
"records": {
"disclaimer": "Ce sont vos propres informations, pas un diagnostic médical. HealthLog ne diagnostique pas, ne traite pas et ne les interprète pas.",
diff --git a/messages/it.json b/messages/it.json
index 61a2d52e7..aa5902b27 100644
--- a/messages/it.json
+++ b/messages/it.json
@@ -599,7 +599,9 @@
"typeWaistCircumference": "Circonferenza vita",
"typeWaistToHeight": "Rapporto vita-altezza",
"unitScore": "pti",
- "unitRatio": "rapporto"
+ "unitRatio": "rapporto",
+ "typeWho5Score": "Punteggio WHO-5",
+ "typeSciScore": "Punteggio SCI"
},
"mood": {
"title": "Umore",
@@ -7667,8 +7669,7 @@
},
"mentalHealth": {
"pageTitle": "Check-in sul benessere mentale",
- "pageDescription": "Due autovalutazioni validate e facoltative — PHQ-9 (umore) e GAD-7 (preoccupazione) — accanto al tuo diario dell'umore. Ciò che conta è l'andamento nel tempo, non un singolo numero.",
- "pageRhythmHint": "Entrambi i test riguardano le ultime due settimane, quindi un check-in ogni due-quattro settimane è un buon ritmo.",
+ "pageDescription": "Quattro autovalutazioni validate e facoltative — PHQ-9 (umore), GAD-7 (preoccupazione), WHO-5 (benessere) e SCI (sonno) — accanto al tuo diario dell'umore. Ciò che conta è l'andamento nel tempo, non un singolo numero.",
"attributionLabel": "Fonte",
"choosePrompt": "Scegli un check-in",
"start": "Inizia",
@@ -7677,14 +7678,17 @@
"submitting": "Salvataggio…",
"saved": "Salvato",
"error": "Qualcosa è andato storto. Riprova.",
- "considerProfessional": "Il tuo punteggio è in un intervallo in cui parlare con un professionista sanitario può aiutare. È un suggerimento gentile, non una diagnosi.",
"instrument": {
"phq9": "PHQ-9 · umore",
- "gad7": "GAD-7 · preoccupazione"
+ "gad7": "GAD-7 · preoccupazione",
+ "who5": "WHO-5 · benessere",
+ "sci": "SCI · sonno"
},
"instrumentSub": {
"phq9": "Screening della depressione, 9 domande",
- "gad7": "Screening dell'ansia, 7 domande"
+ "gad7": "Screening dell'ansia, 7 domande",
+ "who5": "Test sul benessere, 5 domande",
+ "sci": "Test sul sonno, 8 domande"
},
"options": {
"0": "Per niente",
@@ -7719,16 +7723,23 @@
"mild": "Lieve",
"moderate": "Moderata",
"severe": "Grave"
+ },
+ "WHO5": {
+ "low": "Benessere più basso",
+ "good": "Buon benessere"
+ },
+ "SCI": {
+ "belowThreshold": "Fascia di possibile insonnia",
+ "aboveThreshold": "Nessun indizio di insonnia"
}
},
"history": {
"title": "La tua cronologia",
"empty": "Ancora nessun check-in. Il tuo andamento apparirà qui dopo che ne avrai completato uno.",
"flaggedBadge": "Supporto mostrato",
- "tab": {
- "phq9": "PHQ-9",
- "gad7": "GAD-7"
- }
+ "chartTitle": "Andamento del punteggio",
+ "totalLabel": "Punteggio",
+ "bandLabel": "Categoria"
},
"crisis": {
"title": "Non devi affrontare tutto questo da solo/a",
@@ -7756,6 +7767,23 @@
"5": "Essere così irrequieto/a da far fatica a stare seduto/a fermo/a",
"6": "Infastidirsi o irritarsi facilmente",
"7": "Avere paura come se potesse accadere qualcosa di terribile"
+ },
+ "who5": {
+ "1": "Mi sono sentito/a allegro/a e di buon umore",
+ "2": "Mi sono sentito/a calmo/a e rilassato/a",
+ "3": "Mi sono sentito/a attivo/a ed energico/a",
+ "4": "Mi sono svegliato/a sentendomi fresco/a e riposato/a",
+ "5": "La mia vita di tutti i giorni è stata piena di cose che mi interessano"
+ },
+ "sci": {
+ "1": "… how long does it take you to fall asleep?",
+ "2": "… if you then wake up during the night … how long are you awake for in total? (add all the wakenings up)",
+ "3": "… how many nights a week do you have a problem with your sleep?",
+ "4": "… how would you rate your sleep quality?",
+ "5": "… affected your mood, energy, or relationships?",
+ "6": "… affected your concentration, productivity, or ability to stay awake?",
+ "7": "… troubled you in general?",
+ "8": "… how long have you had a problem with your sleep?"
}
},
"crisisResource": {
@@ -7783,14 +7811,79 @@
},
"instrumentDescription": {
"phq9": "Screening della depressione in 9 domande. Rispondi pensando alle ultime due settimane.",
- "gad7": "Screening dell'ansia in 7 domande. Rispondi pensando alle ultime due settimane."
+ "gad7": "Screening dell'ansia in 7 domande. Rispondi pensando alle ultime due settimane.",
+ "who5": "Test sul benessere in 5 domande. Rispondi pensando alle ultime due settimane; numeri più alti indicano un maggior benessere.",
+ "sci": "Test sul sonno in 8 domande. La maggior parte riguarda l'ultimo mese; punteggi più alti indicano un sonno migliore."
},
"progress": "{current} / {total}",
"next": "Avanti",
"lastResult": "Ultimo test",
"lastScore": "Ultimo risultato",
"noResultYet": "Ancora nessun check-in",
- "backToList": "Panoramica"
+ "backToList": "Panoramica",
+ "followUpHint": {
+ "phq9": "Il tuo punteggio è in un intervallo in cui parlare con un professionista sanitario può aiutare. È un suggerimento gentile, non una diagnosi.",
+ "gad7": "Il tuo punteggio è in un intervallo in cui parlare con un professionista sanitario può aiutare. È un suggerimento gentile, non una diagnosi.",
+ "who5": "Un punteggio di benessere pari o inferiore a 50 può meritare uno sguardo più attento. Se vuoi, il PHQ-9 in questa pagina esplora l'umore più in dettaglio. È un suggerimento gentile, non una diagnosi.",
+ "sci": "Nello studio di questo questionario, punteggi pari o inferiori a 16 erano associati a insonnia probabile. Se dormire male continua a pesarti, parlare con un professionista sanitario può aiutare. Non è una diagnosi."
+ },
+ "validatedInEnglishNote": "Questo questionario è validato in inglese; le domande sono mostrate nella versione originale inglese.",
+ "who5Options": {
+ "5": "Sempre",
+ "4": "La maggior parte del tempo",
+ "3": "Più della metà del tempo",
+ "2": "Meno della metà del tempo",
+ "1": "A volte",
+ "0": "Mai"
+ },
+ "sciOptions": {
+ "duration": {
+ "4": "0–15 min",
+ "3": "16–30 min",
+ "2": "31–45 min",
+ "1": "46–60 min",
+ "0": "≥ 61 min"
+ },
+ "nights": {
+ "4": "0–1",
+ "3": "2",
+ "2": "3",
+ "1": "4",
+ "0": "5–7"
+ },
+ "quality": {
+ "4": "Very good",
+ "3": "Good",
+ "2": "Average",
+ "1": "Poor",
+ "0": "Very poor"
+ },
+ "impact": {
+ "4": "Not at all",
+ "3": "A little",
+ "2": "Somewhat",
+ "1": "Much",
+ "0": "Very much"
+ },
+ "problemDuration": {
+ "4": "I don't have a problem / < 1 month",
+ "3": "1–2 months",
+ "2": "3–6 months",
+ "1": "7–12 months",
+ "0": "> 1 year"
+ }
+ },
+ "stems": {
+ "who5": {
+ "period": "Nelle ultime due settimane"
+ },
+ "sci": {
+ "night": "Thinking about a typical night in the last month …",
+ "impact": "Thinking about the past month, to what extent has poor sleep …",
+ "finally": "Finally …"
+ }
+ },
+ "openDetail": "Mostra dettagli"
},
"records": {
"disclaimer": "Sono i tuoi dati, non una diagnosi medica. HealthLog non diagnostica, non cura e non li interpreta.",
diff --git a/messages/pl.json b/messages/pl.json
index 218e6eea5..fe0d8e170 100644
--- a/messages/pl.json
+++ b/messages/pl.json
@@ -599,7 +599,9 @@
"typeWaistCircumference": "Obwód talii",
"typeWaistToHeight": "Stosunek talii do wzrostu",
"unitScore": "pkt",
- "unitRatio": "stosunek"
+ "unitRatio": "stosunek",
+ "typeWho5Score": "Wynik WHO-5",
+ "typeSciScore": "Wynik SCI"
},
"mood": {
"title": "Nastrój",
@@ -7667,8 +7669,7 @@
},
"mentalHealth": {
"pageTitle": "Sprawdzenie dobrostanu psychicznego",
- "pageDescription": "Dwa zwalidowane, dobrowolne testy — PHQ-9 (nastrój) i GAD-7 (lęk) — obok Twojego dziennika nastroju. Liczy się trend w czasie, a nie pojedynczy wynik.",
- "pageRhythmHint": "Oba testy dotyczą ostatnich dwóch tygodni, dlatego check-in co dwa–cztery tygodnie to dobry rytm.",
+ "pageDescription": "Cztery zwalidowane, dobrowolne testy — PHQ-9 (nastrój), GAD-7 (lęk), WHO-5 (samopoczucie) i SCI (sen) — obok Twojego dziennika nastroju. Liczy się trend w czasie, a nie pojedynczy wynik.",
"attributionLabel": "Źródło",
"choosePrompt": "Wybierz sprawdzenie",
"start": "Rozpocznij",
@@ -7677,14 +7678,17 @@
"submitting": "Zapisywanie…",
"saved": "Zapisano",
"error": "Coś poszło nie tak. Spróbuj ponownie.",
- "considerProfessional": "Twój wynik mieści się w zakresie, w którym rozmowa ze specjalistą może pomóc. To życzliwa sugestia, a nie diagnoza.",
"instrument": {
"phq9": "PHQ-9 · nastrój",
- "gad7": "GAD-7 · lęk"
+ "gad7": "GAD-7 · lęk",
+ "who5": "WHO-5 · samopoczucie",
+ "sci": "SCI · sen"
},
"instrumentSub": {
"phq9": "Przesiew depresji, 9 pytań",
- "gad7": "Przesiew lęku, 7 pytań"
+ "gad7": "Przesiew lęku, 7 pytań",
+ "who5": "Test samopoczucia, 5 pytań",
+ "sci": "Test snu, 8 pytań"
},
"options": {
"0": "Wcale",
@@ -7719,16 +7723,23 @@
"mild": "Łagodny",
"moderate": "Umiarkowany",
"severe": "Ciężki"
+ },
+ "WHO5": {
+ "low": "Niższe samopoczucie",
+ "good": "Dobre samopoczucie"
+ },
+ "SCI": {
+ "belowThreshold": "Zakres możliwej bezsenności",
+ "aboveThreshold": "Brak wskazań na bezsenność"
}
},
"history": {
"title": "Twoja historia",
"empty": "Brak sprawdzeń. Twój trend pojawi się tutaj po ukończeniu pierwszego.",
"flaggedBadge": "Pokazano wsparcie",
- "tab": {
- "phq9": "PHQ-9",
- "gad7": "GAD-7"
- }
+ "chartTitle": "Przebieg wyniku",
+ "totalLabel": "Wynik",
+ "bandLabel": "Kategoria"
},
"crisis": {
"title": "Nie musisz mierzyć się z tym sam(a)",
@@ -7756,6 +7767,23 @@
"5": "Niepokój tak duży, że trudno usiedzieć w miejscu",
"6": "Łatwe wpadanie w rozdrażnienie lub irytację",
"7": "Odczuwanie lęku, jakby miało się zdarzyć coś strasznego"
+ },
+ "who5": {
+ "1": "Czułam się wesoła/Czułem się wesoły i w dobrym nastroju",
+ "2": "Czułam się spokojna i odprężona/Czułem się spokojny i odprężony",
+ "3": "Czułam się aktywna i energiczna/Czułem się aktywny i energiczny",
+ "4": "Budziłam się z uczuciem świeżości i wypoczęta/Budziłem się z uczuciem świeżości i wypoczęty",
+ "5": "Moje życie codzienne było wypełnione interesującymi mnie sprawami"
+ },
+ "sci": {
+ "1": "… how long does it take you to fall asleep?",
+ "2": "… if you then wake up during the night … how long are you awake for in total? (add all the wakenings up)",
+ "3": "… how many nights a week do you have a problem with your sleep?",
+ "4": "… how would you rate your sleep quality?",
+ "5": "… affected your mood, energy, or relationships?",
+ "6": "… affected your concentration, productivity, or ability to stay awake?",
+ "7": "… troubled you in general?",
+ "8": "… how long have you had a problem with your sleep?"
}
},
"crisisResource": {
@@ -7783,14 +7811,79 @@
},
"instrumentDescription": {
"phq9": "Przesiew w kierunku depresji, 9 pytań. Odpowiadaj, myśląc o ostatnich dwóch tygodniach.",
- "gad7": "Przesiew w kierunku lęku, 7 pytań. Odpowiadaj, myśląc o ostatnich dwóch tygodniach."
+ "gad7": "Przesiew w kierunku lęku, 7 pytań. Odpowiadaj, myśląc o ostatnich dwóch tygodniach.",
+ "who5": "Test samopoczucia, 5 pytań. Odpowiadaj, myśląc o ostatnich dwóch tygodniach; wyższe cyfry oznaczają lepsze samopoczucie.",
+ "sci": "Test snu, 8 pytań. Większość pytań dotyczy ostatniego miesiąca; wyższe wyniki oznaczają lepszy sen."
},
"progress": "{current} / {total}",
"next": "Dalej",
"lastResult": "Ostatni test",
"lastScore": "Ostatni wynik",
"noResultYet": "Brak check-inów",
- "backToList": "Przegląd"
+ "backToList": "Przegląd",
+ "followUpHint": {
+ "phq9": "Twój wynik mieści się w zakresie, w którym rozmowa ze specjalistą może pomóc. To życzliwa sugestia, a nie diagnoza.",
+ "gad7": "Twój wynik mieści się w zakresie, w którym rozmowa ze specjalistą może pomóc. To życzliwa sugestia, a nie diagnoza.",
+ "who5": "Wynik samopoczucia 50 lub niższy może być wart bliższego spojrzenia. Jeśli chcesz, PHQ-9 na tej stronie przygląda się nastrojowi dokładniej. To życzliwa sugestia, a nie diagnoza.",
+ "sci": "W badaniu tego kwestionariusza wyniki 16 lub niższe wiązały się z prawdopodobną bezsennością. Jeśli zły sen nadal Ci doskwiera, rozmowa ze specjalistą może pomóc. To nie jest diagnoza."
+ },
+ "validatedInEnglishNote": "Ten kwestionariusz jest zwalidowany w języku angielskim; pytania są wyświetlane w angielskim oryginale.",
+ "who5Options": {
+ "5": "Cały czas",
+ "4": "Prawie cały czas",
+ "3": "Więcej niż połowę czasu",
+ "2": "Mniej niż połowę czasu",
+ "1": "Od czasu do czasu",
+ "0": "Nigdy"
+ },
+ "sciOptions": {
+ "duration": {
+ "4": "0–15 min",
+ "3": "16–30 min",
+ "2": "31–45 min",
+ "1": "46–60 min",
+ "0": "≥ 61 min"
+ },
+ "nights": {
+ "4": "0–1",
+ "3": "2",
+ "2": "3",
+ "1": "4",
+ "0": "5–7"
+ },
+ "quality": {
+ "4": "Very good",
+ "3": "Good",
+ "2": "Average",
+ "1": "Poor",
+ "0": "Very poor"
+ },
+ "impact": {
+ "4": "Not at all",
+ "3": "A little",
+ "2": "Somewhat",
+ "1": "Much",
+ "0": "Very much"
+ },
+ "problemDuration": {
+ "4": "I don't have a problem / < 1 month",
+ "3": "1–2 months",
+ "2": "3–6 months",
+ "1": "7–12 months",
+ "0": "> 1 year"
+ }
+ },
+ "stems": {
+ "who5": {
+ "period": "W ciągu ostatnich dwóch tygodni"
+ },
+ "sci": {
+ "night": "Thinking about a typical night in the last month …",
+ "impact": "Thinking about the past month, to what extent has poor sleep …",
+ "finally": "Finally …"
+ }
+ },
+ "openDetail": "Pokaż szczegóły"
},
"records": {
"disclaimer": "To Twoje własne wpisy, a nie diagnoza lekarska. HealthLog nie diagnozuje, nie leczy i ich nie interpretuje.",
diff --git a/package.json b/package.json
index 0e71cf960..d9c828e9f 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "healthlog",
- "version": "1.27.9",
+ "version": "1.27.10",
"description": "Self-hosted personal-health-tracking PWA with Withings integration, AI insights, and doctor-report PDF export.",
"license": "PolyForm-Noncommercial-1.0.0",
"homepage": "https://healthlog.dev",
@@ -63,7 +63,7 @@
"@prisma/client": "^7.8.0",
"@simplewebauthn/browser": "^13.3.0",
"@simplewebauthn/server": "^13.3.1",
- "@tanstack/react-query": "^5.101.0",
+ "@tanstack/react-query": "5.101.2",
"@types/sax": "^1.2.7",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
@@ -74,9 +74,9 @@
"jspdf-autotable": "^5.0.8",
"lucide-react": "^1.18.0",
"mmdb-lib": "^3.0.2",
- "next": "16.2.9",
+ "next": "16.2.10",
"next-themes": "^0.4.6",
- "nodemailer": "^9.0.1",
+ "nodemailer": "9.0.3",
"otpauth": "^9.5.1",
"p-limit": "^7.3.0",
"pg-boss": "^12.20.0",
@@ -86,7 +86,7 @@
"react": "19.2.7",
"react-day-picker": "^10.0.1",
"react-dom": "19.2.7",
- "react-hook-form": "^7.78.0",
+ "react-hook-form": "7.81.0",
"recharts": "^3.8.1",
"rrule": "^2.8.1",
"sax": "^1.6.0",
@@ -106,7 +106,7 @@
"@playwright/test": "^1.60.0",
"@tailwindcss/postcss": "^4",
"@testcontainers/postgresql": "^12.0.3",
- "@types/node": "^25.9.2",
+ "@types/node": "26.1.0",
"@types/nodemailer": "^8.0.1",
"@types/pg": "^8.20.0",
"@types/qrcode": "^1.5.6",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 94a282d5a..a23c7c62a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -26,7 +26,7 @@ importers:
version: 3.2.2(react@19.2.7)
'@hookform/resolvers':
specifier: ^5.4.0
- version: 5.4.0(react-hook-form@7.78.0(react@19.2.7))
+ version: 5.4.0(react-hook-form@7.81.0(react@19.2.7))
'@modelcontextprotocol/sdk':
specifier: ^1.29.0
version: 1.29.0(zod@4.4.3)
@@ -49,8 +49,8 @@ importers:
specifier: ^13.3.1
version: 13.3.1
'@tanstack/react-query':
- specifier: ^5.101.0
- version: 5.101.0(react@19.2.7)
+ specifier: 5.101.2
+ version: 5.101.2(react@19.2.7)
'@types/sax':
specifier: ^1.2.7
version: 1.2.7
@@ -82,14 +82,14 @@ importers:
specifier: ^3.0.2
version: 3.0.2
next:
- specifier: 16.2.9
- version: 16.2.9(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ specifier: 16.2.10
+ version: 16.2.10(@babel/core@7.29.7)(@playwright/test@1.60.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
next-themes:
specifier: ^0.4.6
version: 0.4.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
nodemailer:
- specifier: ^9.0.1
- version: 9.0.1
+ specifier: 9.0.3
+ version: 9.0.3
otpauth:
specifier: ^9.5.1
version: 9.5.1
@@ -118,8 +118,8 @@ importers:
specifier: 19.2.7
version: 19.2.7(react@19.2.7)
react-hook-form:
- specifier: ^7.78.0
- version: 7.78.0(react@19.2.7)
+ specifier: 7.81.0
+ version: 7.81.0(react@19.2.7)
recharts:
specifier: ^3.8.1
version: 3.8.1(@types/react@19.2.14)(react-dom@19.2.7(react@19.2.7))(react-is@16.13.1)(react@19.2.7)(redux@5.0.1)
@@ -173,8 +173,8 @@ importers:
specifier: ^12.0.3
version: 12.0.3
'@types/node':
- specifier: ^25.9.2
- version: 25.9.2
+ specifier: 26.1.0
+ version: 26.1.0
'@types/nodemailer':
specifier: ^8.0.1
version: 8.0.1
@@ -195,7 +195,7 @@ importers:
version: 3.6.4
'@vitejs/plugin-react':
specifier: ^5.1.4
- version: 5.1.4(vite@7.3.1(@types/node@25.9.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4))
+ version: 5.1.4(vite@7.3.1(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4))
'@vitest/coverage-v8':
specifier: ^4.1.5
version: 4.1.5(vitest@4.1.5)
@@ -225,7 +225,7 @@ importers:
version: 0.8.0(prettier@3.9.1)
shadcn:
specifier: ^4.9.0
- version: 4.9.0(@types/node@25.9.2)(typescript@6.0.3)
+ version: 4.9.0(@types/node@26.1.0)(typescript@6.0.3)
tailwindcss:
specifier: ^4
version: 4.3.1
@@ -240,7 +240,7 @@ importers:
version: 6.0.3
vitest:
specifier: ^4.1.5
- version: 4.1.5(@types/node@25.9.2)(@vitest/coverage-v8@4.1.5)(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@7.3.1(@types/node@25.9.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4))
+ version: 4.1.5(@types/node@26.1.0)(@vitest/coverage-v8@4.1.5)(msw@2.14.6(@types/node@26.1.0)(typescript@6.0.3))(vite@7.3.1(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4))
packages:
@@ -1218,60 +1218,60 @@ packages:
'@next/bundle-analyzer@16.2.9':
resolution: {integrity: sha512-yGWyLbC8MMn+hk9j6l6GammpbUz5S3yZzl3lpoWfVXhIpJfh6kAWG7JwF4WoG3f0VnYRY959yo1QQEI8mV/+jg==}
- '@next/env@16.2.9':
- resolution: {integrity: sha512-ki5VxxXfzD/9TDe13wyeTKIjQTAwBVpnr8KhRDUr8ltMUq1/NBpWNT5tiPoxiGl+PHM4X2ahSOiPk6iAimIzPg==}
+ '@next/env@16.2.10':
+ resolution: {integrity: sha512-zLPxg9M0MEHmygpj5OuxjQ+vHMiy/K7cSp74G8ecYolmgUWw0RwN02tF56npup/+qaI8JB97hQgS/r2Hb6QwVA==}
'@next/eslint-plugin-next@16.2.6':
resolution: {integrity: sha512-Z8l6o4JWKUl755x4R+wogD86KPeU+Ckw4K+SYG4kHeOJtRenDeK+OSbGcqZpDtbwn9DsJVdir2UxmwXuinUbUw==}
- '@next/swc-darwin-arm64@16.2.9':
- resolution: {integrity: sha512-HkfxNYUCmcct0Xsqib5KxqMSHV4AHJq857BNRchyBDs4YS19aHzVfn1kDuBYKqLLQBjXgnkIsjV2Kd4d2wzYhw==}
+ '@next/swc-darwin-arm64@16.2.10':
+ resolution: {integrity: sha512-v9IdJCa0H0mbo+8z5zwUpOk1Vj7RjkcI5uNYf5Ws1y6szf/p3Mzl9hLaST8SCt6L9h8NGnruZcd2+o0NTNwDhA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@next/swc-darwin-x64@16.2.9':
- resolution: {integrity: sha512-7IAtK4MeybpqRV9GRABWEhJ62mOS+rzWOzOTFie4cSEtm12xsoOMJRcECoZx3FHPzFAqN/IJtHqWAFOLfl152w==}
+ '@next/swc-darwin-x64@16.2.10':
+ resolution: {integrity: sha512-17IS0jJRViROGmA9uGdNR8VPJpfbnaVG7E9qhso5jDLkmyd0lSDORWxbcKINzcFqzZqGwGtMSnrFRxBpuUYjLQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@next/swc-linux-arm64-gnu@16.2.9':
- resolution: {integrity: sha512-hBD75iWpUtkL9SmQmcRhmLomn9jgkPzCEkbOcLgHymPEKzv+6ONy13RRiIEz/iEObjkS2Jlb5gYS2XGoS3X4rw==}
+ '@next/swc-linux-arm64-gnu@16.2.10':
+ resolution: {integrity: sha512-GRQRsRtuciNJvB54AvvuQTiq0oZtFwa1owQqtZD8wwnGpM2L39MV22kpI72YSXLKIyY40LC66EiLFv4PiicXxg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@next/swc-linux-arm64-musl@16.2.9':
- resolution: {integrity: sha512-qZTI3pf9SGc/obr8NkQAekBxmp1QK+kVm+VAf3BALLfFAj+1kUhkTxmrWpVos9R/UYIA8AWX2p6cGI5WdwzVUA==}
+ '@next/swc-linux-arm64-musl@16.2.10':
+ resolution: {integrity: sha512-zkN9MQYS7UQBro+FnISUq1itaQjXI9xqISzuQ+2bc921NcJ1x4yPCqrn77tVN6/dOOXaaWVX3k6/bR07pPwK+A==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@next/swc-linux-x64-gnu@16.2.9':
- resolution: {integrity: sha512-xm0HfRNX+UkH4R3c18ynswjj5o5uEj/7iI9p9omdtTSIsRCzQqkGMA+10nzJ4EHnYC3as65IMhbbl5fWRUWHYg==}
+ '@next/swc-linux-x64-gnu@16.2.10':
+ resolution: {integrity: sha512-iCVJnwvrPYECvA6WM/7+oo+OiTvedIKLxtCLAZP4xZR3nXa1zmzZyLPbYCmWvpd4CvMYF1EMTafd0ii3DygLvA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@next/swc-linux-x64-musl@16.2.9':
- resolution: {integrity: sha512-QumimHkGEG6vM3PfEDWKyKen03NcqLOkeKB1EfcPe7VxzmEiCa4jNnMyBn/US5zcd/VE1CI+O8Ovb3lfjVHfGw==}
+ '@next/swc-linux-x64-musl@16.2.10':
+ resolution: {integrity: sha512-ov2g4H0dHY9bPoOU83m91hWT7Iq5qy13bUnyyshLU3HGR1Ownn0X9QpmDPc5iIUaahTp7f7LeGAhV4DSFtackw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [musl]
- '@next/swc-win32-arm64-msvc@16.2.9':
- resolution: {integrity: sha512-hzQpKZvw8rAwI6A2uQh6SacCSvNAXaIkPNsWwzqqfRiIMiXMfH936skDhz1OO6KpvdKkJrgHHtqQOq5PIXOvdQ==}
+ '@next/swc-win32-arm64-msvc@16.2.10':
+ resolution: {integrity: sha512-DwAnhLX76HQiFFQNgWlcK+JzlnD1rZ+UK/WY0ZMI/deXpvgnesjNYrqcfo1JzBuz4Kf7o3brIBL0glI1junatA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@next/swc-win32-x64-msvc@16.2.9':
- resolution: {integrity: sha512-qr2VL3Ce5QrwgO2yh1ujSBawrimjVKX8FGF/cOynmdYKJY0BdHpGVNIRK1tqONB10Vkm25Ub1BD2bkjWs4+96w==}
+ '@next/swc-win32-x64-msvc@16.2.10':
+ resolution: {integrity: sha512-0JXq3b85Jk9Jg4ntLUbXSPvoDw3gpZou7twuKdoFG2jOw635v7+IiXfTaa0TxVMyx78pUjnrVYwLgjKfX4e6/A==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@@ -2860,11 +2860,11 @@ packages:
'@tailwindcss/postcss@4.3.0':
resolution: {integrity: sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==}
- '@tanstack/query-core@5.101.0':
- resolution: {integrity: sha512-cQetA74EB+seWySv1TTKr828TnP0u39m6LykwDXIo84SNortpDkp30TMEjkqtYCNP9c40uT/iwl6MLiufEt0Ow==}
+ '@tanstack/query-core@5.101.2':
+ resolution: {integrity: sha512-hH5MLoJhF7KaIGd7q3xTXGXvslI+GYlM1Z/35aSHHWaCJWB7XvTSHYuV3eM7tw+aE0mT/xMro4M4Q9rCGHT0lw==}
- '@tanstack/react-query@5.101.0':
- resolution: {integrity: sha512-rLlJXSpkqfizLWgkR5+eLeIk0MvTx/meEIR7LRjxic+qxiQP8zVjq7BqQkiCMNLQBlLfuOLqqr6KO5GtrDlmSg==}
+ '@tanstack/react-query@5.101.2':
+ resolution: {integrity: sha512-seDkr6kzGzX1okaaTtZPtgA688CDPlXUz1C6xSg0ESqn04Vuc8tlrYms1s3de+znBqhPVxFRfpAfUf+6XvfPWg==}
peerDependencies:
react: ^18 || ^19
@@ -2943,8 +2943,8 @@ packages:
'@types/node@18.19.130':
resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==}
- '@types/node@25.9.2':
- resolution: {integrity: sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==}
+ '@types/node@26.1.0':
+ resolution: {integrity: sha512-O0A1G3xPGy4w7AgQdAQYUlQ+BKk2Oovw8eRpofyp5KdBZULnbe+WqaOVNrm705SHphCiG4XHsACrSmPu1f+Kgw==}
'@types/nodemailer@8.0.1':
resolution: {integrity: sha512-PxpaInm8V1JQDd4j0ds5HfvWQk8JupS1C0Picb96QJsrrRDjBH+DlK7L4ZdNSqNULhiZRQHc40nLVShaGxXAMw==}
@@ -5247,8 +5247,8 @@ packages:
react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
- next@16.2.9:
- resolution: {integrity: sha512-MEOJiq/UvuezAdqVSceHbqDgZt1kDw2tpGVOlsdIoJsQdbN2JY2hpVG4xnXGkbdJUOEWhnRfiu/O4Hpc9Juwww==}
+ next@16.2.10:
+ resolution: {integrity: sha512-2som5AVXb3kE6Yjine3/mNbBayYF58eguBWIVVUdr1y/L426xyVEgYxgBG+1QC34P2x5E+tcDup6XkuOAX3dCA==}
engines: {node: '>=20.9.0'}
hasBin: true
peerDependencies:
@@ -5298,8 +5298,8 @@ packages:
resolution: {integrity: sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==}
engines: {node: '>=18'}
- nodemailer@9.0.1:
- resolution: {integrity: sha512-Gwv8SQewT616ZM/URn0H54b8PWo/Wum7md3EW2aWy1lO27+WZCX+Xyak3J+NlmHUjDh5ME+uesJUDRbR3Ye8Bw==}
+ nodemailer@9.0.3:
+ resolution: {integrity: sha512-n+YP+NKwR5zRWa60k3GiQ6Q3B4KXCoAw40dAKeCtYn020iNN74aWK2liXIC3ZEATeGql7we3tE3t8QwhY0eskw==}
engines: {node: '>=6.0.0'}
non-error@0.1.0:
@@ -5803,8 +5803,8 @@ packages:
peerDependencies:
react: ^19.2.7
- react-hook-form@7.78.0:
- resolution: {integrity: sha512-EEZqc+N23moyzTlz61Pj+JvcXo76ICkpfOZo8JZw+sM4+wLQGh6nI2Ms+PdMOYNluFu0ghlM7B8mCzhRYtJCnA==}
+ react-hook-form@7.81.0:
+ resolution: {integrity: sha512-ocbmr2p5KBMoAfj4WCUvped33lVi1Kd5DuDUvQDnB6VEAacOjPI/jMbtDdbhco4y9ct4xUuCmMY0b/C9L0QHjw==}
engines: {node: '>=18.0.0'}
peerDependencies:
react: ^16.8.0 || ^17 || ^18 || ^19
@@ -6468,8 +6468,8 @@ packages:
undici-types@5.26.5:
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
- undici-types@7.24.6:
- resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==}
+ undici-types@8.3.0:
+ resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==}
undici@8.5.0:
resolution: {integrity: sha512-xamtWoB1EshgjpmlXd7GGm2VfdDtw1+rD8uhry8pSNW3If6S8E0m2T2+orSKeZXEn/aPJMviCpDBA65WJt8zhg==}
@@ -7625,10 +7625,10 @@ snapshots:
dependencies:
hono: 4.12.25
- '@hookform/resolvers@5.4.0(react-hook-form@7.78.0(react@19.2.7))':
+ '@hookform/resolvers@5.4.0(react-hook-form@7.81.0(react@19.2.7))':
dependencies:
'@standard-schema/utils': 0.3.0
- react-hook-form: 7.78.0(react@19.2.7)
+ react-hook-form: 7.81.0(react@19.2.7)
'@humanfs/core@0.19.1': {}
@@ -7740,30 +7740,30 @@ snapshots:
'@inquirer/ansi@2.0.7': {}
- '@inquirer/confirm@6.1.1(@types/node@25.9.2)':
+ '@inquirer/confirm@6.1.1(@types/node@26.1.0)':
dependencies:
- '@inquirer/core': 11.2.1(@types/node@25.9.2)
- '@inquirer/type': 4.0.7(@types/node@25.9.2)
+ '@inquirer/core': 11.2.1(@types/node@26.1.0)
+ '@inquirer/type': 4.0.7(@types/node@26.1.0)
optionalDependencies:
- '@types/node': 25.9.2
+ '@types/node': 26.1.0
- '@inquirer/core@11.2.1(@types/node@25.9.2)':
+ '@inquirer/core@11.2.1(@types/node@26.1.0)':
dependencies:
'@inquirer/ansi': 2.0.7
'@inquirer/figures': 2.0.7
- '@inquirer/type': 4.0.7(@types/node@25.9.2)
+ '@inquirer/type': 4.0.7(@types/node@26.1.0)
cli-width: 4.1.0
fast-wrap-ansi: 0.2.2
mute-stream: 3.0.0
signal-exit: 4.1.0
optionalDependencies:
- '@types/node': 25.9.2
+ '@types/node': 26.1.0
'@inquirer/figures@2.0.7': {}
- '@inquirer/type@4.0.7(@types/node@25.9.2)':
+ '@inquirer/type@4.0.7(@types/node@26.1.0)':
optionalDependencies:
- '@types/node': 25.9.2
+ '@types/node': 26.1.0
'@isaacs/cliui@8.0.2':
dependencies:
@@ -7922,34 +7922,34 @@ snapshots:
- bufferutil
- utf-8-validate
- '@next/env@16.2.9': {}
+ '@next/env@16.2.10': {}
'@next/eslint-plugin-next@16.2.6':
dependencies:
fast-glob: 3.3.1
- '@next/swc-darwin-arm64@16.2.9':
+ '@next/swc-darwin-arm64@16.2.10':
optional: true
- '@next/swc-darwin-x64@16.2.9':
+ '@next/swc-darwin-x64@16.2.10':
optional: true
- '@next/swc-linux-arm64-gnu@16.2.9':
+ '@next/swc-linux-arm64-gnu@16.2.10':
optional: true
- '@next/swc-linux-arm64-musl@16.2.9':
+ '@next/swc-linux-arm64-musl@16.2.10':
optional: true
- '@next/swc-linux-x64-gnu@16.2.9':
+ '@next/swc-linux-x64-gnu@16.2.10':
optional: true
- '@next/swc-linux-x64-musl@16.2.9':
+ '@next/swc-linux-x64-musl@16.2.10':
optional: true
- '@next/swc-win32-arm64-msvc@16.2.9':
+ '@next/swc-win32-arm64-msvc@16.2.10':
optional: true
- '@next/swc-win32-x64-msvc@16.2.9':
+ '@next/swc-win32-x64-msvc@16.2.10':
optional: true
'@noble/ciphers@1.3.0': {}
@@ -9443,11 +9443,11 @@ snapshots:
postcss: 8.5.14
tailwindcss: 4.3.0
- '@tanstack/query-core@5.101.0': {}
+ '@tanstack/query-core@5.101.2': {}
- '@tanstack/react-query@5.101.0(react@19.2.7)':
+ '@tanstack/react-query@5.101.2(react@19.2.7)':
dependencies:
- '@tanstack/query-core': 5.101.0
+ '@tanstack/query-core': 5.101.2
react: 19.2.7
'@testcontainers/postgresql@12.0.3':
@@ -9524,13 +9524,13 @@ snapshots:
'@types/docker-modem@3.0.6':
dependencies:
- '@types/node': 25.9.2
+ '@types/node': 26.1.0
'@types/ssh2': 1.15.5
'@types/dockerode@4.0.1':
dependencies:
'@types/docker-modem': 3.0.6
- '@types/node': 25.9.2
+ '@types/node': 26.1.0
'@types/ssh2': 1.15.5
'@types/estree@1.0.8': {}
@@ -9545,25 +9545,25 @@ snapshots:
dependencies:
undici-types: 5.26.5
- '@types/node@25.9.2':
+ '@types/node@26.1.0':
dependencies:
- undici-types: 7.24.6
+ undici-types: 8.3.0
'@types/nodemailer@8.0.1':
dependencies:
- '@types/node': 18.19.130
+ '@types/node': 26.1.0
'@types/pako@2.0.4': {}
'@types/pg@8.20.0':
dependencies:
- '@types/node': 25.9.2
+ '@types/node': 26.1.0
pg-protocol: 1.13.0
pg-types: 2.2.0
'@types/qrcode@1.5.6':
dependencies:
- '@types/node': 25.9.2
+ '@types/node': 26.1.0
'@types/raf@3.4.3':
optional: true
@@ -9578,19 +9578,19 @@ snapshots:
'@types/sax@1.2.7':
dependencies:
- '@types/node': 25.9.2
+ '@types/node': 26.1.0
'@types/set-cookie-parser@2.4.10':
dependencies:
- '@types/node': 18.19.130
+ '@types/node': 26.1.0
'@types/ssh2-streams@0.1.13':
dependencies:
- '@types/node': 25.9.2
+ '@types/node': 26.1.0
'@types/ssh2@0.5.52':
dependencies:
- '@types/node': 25.9.2
+ '@types/node': 26.1.0
'@types/ssh2-streams': 0.1.13
'@types/ssh2@1.15.5':
@@ -9608,7 +9608,7 @@ snapshots:
'@types/web-push@3.6.4':
dependencies:
- '@types/node': 25.9.2
+ '@types/node': 26.1.0
'@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@9.39.3(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.3(jiti@2.7.0))(typescript@6.0.3)':
dependencies:
@@ -9760,7 +9760,7 @@ snapshots:
'@unrs/resolver-binding-win32-x64-msvc@1.11.1':
optional: true
- '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@25.9.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4))':
+ '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4))':
dependencies:
'@babel/core': 7.29.0
'@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0)
@@ -9768,7 +9768,7 @@ snapshots:
'@rolldown/pluginutils': 1.0.0-rc.3
'@types/babel__core': 7.20.5
react-refresh: 0.18.0
- vite: 7.3.1(@types/node@25.9.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4)
+ vite: 7.3.1(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4)
transitivePeerDependencies:
- supports-color
@@ -9784,7 +9784,7 @@ snapshots:
obug: 2.1.1
std-env: 4.1.0
tinyrainbow: 3.1.0
- vitest: 4.1.5(@types/node@25.9.2)(@vitest/coverage-v8@4.1.5)(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@7.3.1(@types/node@25.9.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4))
+ vitest: 4.1.5(@types/node@26.1.0)(@vitest/coverage-v8@4.1.5)(msw@2.14.6(@types/node@26.1.0)(typescript@6.0.3))(vite@7.3.1(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4))
'@vitest/expect@4.1.5':
dependencies:
@@ -9795,14 +9795,14 @@ snapshots:
chai: 6.2.2
tinyrainbow: 3.1.0
- '@vitest/mocker@4.1.5(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@7.3.1(@types/node@25.9.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4))':
+ '@vitest/mocker@4.1.5(msw@2.14.6(@types/node@26.1.0)(typescript@6.0.3))(vite@7.3.1(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4))':
dependencies:
'@vitest/spy': 4.1.5
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
- msw: 2.14.6(@types/node@25.9.2)(typescript@6.0.3)
- vite: 7.3.1(@types/node@25.9.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4)
+ msw: 2.14.6(@types/node@26.1.0)(typescript@6.0.3)
+ vite: 7.3.1(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4)
'@vitest/pretty-format@4.1.5':
dependencies:
@@ -11909,9 +11909,9 @@ snapshots:
ms@2.1.3: {}
- msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3):
+ msw@2.14.6(@types/node@26.1.0)(typescript@6.0.3):
dependencies:
- '@inquirer/confirm': 6.1.1(@types/node@25.9.2)
+ '@inquirer/confirm': 6.1.1(@types/node@26.1.0)
'@mswjs/interceptors': 0.41.9
'@open-draft/deferred-promise': 3.0.0
'@types/statuses': 2.0.6
@@ -11970,25 +11970,25 @@ snapshots:
react: 19.2.7
react-dom: 19.2.7(react@19.2.7)
- next@16.2.9(@babel/core@7.29.0)(@playwright/test@1.60.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
+ next@16.2.10(@babel/core@7.29.7)(@playwright/test@1.60.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
dependencies:
- '@next/env': 16.2.9
+ '@next/env': 16.2.10
'@swc/helpers': 0.5.15
baseline-browser-mapping: 2.10.38
caniuse-lite: 1.0.30001799
postcss: 8.4.31
react: 19.2.7
react-dom: 19.2.7(react@19.2.7)
- styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.2.7)
+ styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.2.7)
optionalDependencies:
- '@next/swc-darwin-arm64': 16.2.9
- '@next/swc-darwin-x64': 16.2.9
- '@next/swc-linux-arm64-gnu': 16.2.9
- '@next/swc-linux-arm64-musl': 16.2.9
- '@next/swc-linux-x64-gnu': 16.2.9
- '@next/swc-linux-x64-musl': 16.2.9
- '@next/swc-win32-arm64-msvc': 16.2.9
- '@next/swc-win32-x64-msvc': 16.2.9
+ '@next/swc-darwin-arm64': 16.2.10
+ '@next/swc-darwin-x64': 16.2.10
+ '@next/swc-linux-arm64-gnu': 16.2.10
+ '@next/swc-linux-arm64-musl': 16.2.10
+ '@next/swc-linux-x64-gnu': 16.2.10
+ '@next/swc-linux-x64-musl': 16.2.10
+ '@next/swc-win32-arm64-msvc': 16.2.10
+ '@next/swc-win32-x64-msvc': 16.2.10
'@playwright/test': 1.60.0
sharp: 0.34.5
transitivePeerDependencies:
@@ -12018,7 +12018,7 @@ snapshots:
node-releases@2.0.46: {}
- nodemailer@9.0.1: {}
+ nodemailer@9.0.3: {}
non-error@0.1.0: {}
@@ -12443,7 +12443,7 @@ snapshots:
'@protobufjs/path': 1.1.2
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.1
- '@types/node': 25.9.2
+ '@types/node': 26.1.0
long: 5.3.2
proxy-addr@2.0.7:
@@ -12573,7 +12573,7 @@ snapshots:
react: 19.2.7
scheduler: 0.27.0
- react-hook-form@7.78.0(react@19.2.7):
+ react-hook-form@7.81.0(react@19.2.7):
dependencies:
react: 19.2.7
@@ -12893,7 +12893,7 @@ snapshots:
setprototypeof@1.2.0: {}
- shadcn@4.9.0(@types/node@25.9.2)(typescript@6.0.3):
+ shadcn@4.9.0(@types/node@26.1.0)(typescript@6.0.3):
dependencies:
'@babel/core': 7.29.7
'@babel/parser': 7.29.7
@@ -12914,7 +12914,7 @@ snapshots:
fuzzysort: 3.1.0
https-proxy-agent: 7.0.6
kleur: 4.1.5
- msw: 2.14.6(@types/node@25.9.2)(typescript@6.0.3)
+ msw: 2.14.6(@types/node@26.1.0)(typescript@6.0.3)
node-fetch: 3.3.2
open: 11.0.0
ora: 8.2.0
@@ -13177,12 +13177,12 @@ snapshots:
strip-json-comments@5.0.3: {}
- styled-jsx@5.1.6(@babel/core@7.29.0)(react@19.2.7):
+ styled-jsx@5.1.6(@babel/core@7.29.7)(react@19.2.7):
dependencies:
client-only: 0.0.1
react: 19.2.7
optionalDependencies:
- '@babel/core': 7.29.0
+ '@babel/core': 7.29.7
supports-color@7.2.0:
dependencies:
@@ -13447,7 +13447,7 @@ snapshots:
undici-types@5.26.5: {}
- undici-types@7.24.6: {}
+ undici-types@8.3.0: {}
undici@8.5.0: {}
@@ -13550,7 +13550,7 @@ snapshots:
d3-time: 3.1.0
d3-timer: 3.0.1
- vite@7.3.1(@types/node@25.9.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4):
+ vite@7.3.1(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4):
dependencies:
esbuild: 0.27.7
fdir: 6.5.0(picomatch@4.0.4)
@@ -13559,16 +13559,16 @@ snapshots:
rollup: 4.62.2
tinyglobby: 0.2.17
optionalDependencies:
- '@types/node': 25.9.2
+ '@types/node': 26.1.0
fsevents: 2.3.3
jiti: 2.7.0
lightningcss: 1.32.0
yaml: 2.8.4
- vitest@4.1.5(@types/node@25.9.2)(@vitest/coverage-v8@4.1.5)(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@7.3.1(@types/node@25.9.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4)):
+ vitest@4.1.5(@types/node@26.1.0)(@vitest/coverage-v8@4.1.5)(msw@2.14.6(@types/node@26.1.0)(typescript@6.0.3))(vite@7.3.1(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4)):
dependencies:
'@vitest/expect': 4.1.5
- '@vitest/mocker': 4.1.5(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@7.3.1(@types/node@25.9.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4))
+ '@vitest/mocker': 4.1.5(msw@2.14.6(@types/node@26.1.0)(typescript@6.0.3))(vite@7.3.1(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4))
'@vitest/pretty-format': 4.1.5
'@vitest/runner': 4.1.5
'@vitest/snapshot': 4.1.5
@@ -13585,10 +13585,10 @@ snapshots:
tinyexec: 1.1.1
tinyglobby: 0.2.16
tinyrainbow: 3.1.0
- vite: 7.3.1(@types/node@25.9.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4)
+ vite: 7.3.1(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.4)
why-is-node-running: 2.3.0
optionalDependencies:
- '@types/node': 25.9.2
+ '@types/node': 26.1.0
'@vitest/coverage-v8': 4.1.5(vitest@4.1.5)
transitivePeerDependencies:
- msw
diff --git a/prisma/migrations/0226_v1279_screening_scores/migration.sql b/prisma/migrations/0226_v1279_screening_scores/migration.sql
new file mode 100644
index 000000000..ab9f6f77b
--- /dev/null
+++ b/prisma/migrations/0226_v1279_screening_scores/migration.sql
@@ -0,0 +1,15 @@
+-- v1.27.9 — screening-score enum values for the two new self-report
+-- instruments: the WHO-5 well-being index (percentage 0–100, raw sum × 4)
+-- and the Sleep Condition Indicator (total 0–32, higher = better sleep).
+--
+-- Same contract as PHQ9_SCORE / GAD7_SCORE (0213/0225 lineage): the value is
+-- server-derived from a completed MentalHealthAssessment and written as a
+-- `COMPUTED`-source Measurement row, so clients can never forge a trend point
+-- through the measurement write surfaces. Additive, idempotent.
+ALTER TYPE "measurement_type" ADD VALUE IF NOT EXISTS 'WHO5_SCORE';
+ALTER TYPE "measurement_type" ADD VALUE IF NOT EXISTS 'SCI_SCORE';
+
+-- The assessment discriminator learns the two new instruments (0213 created
+-- it with PHQ9/GAD7 only).
+ALTER TYPE "assessment_instrument" ADD VALUE IF NOT EXISTS 'WHO5';
+ALTER TYPE "assessment_instrument" ADD VALUE IF NOT EXISTS 'SCI';
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index 4c25019fb..a4f69bf9c 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -1284,17 +1284,26 @@ enum MeasurementType {
// waist-to-height ratio (WHtR; keep waist < half your height ⇒ < 0.5).
WAIST_CIRCUMFERENCE // cm — waist circumference (WHO bands; ethnicity-aware at display).
WAIST_TO_HEIGHT // ratio — waist-to-height ratio (WHtR ≥ 0.5 = increased risk).
+ // ── v1.27.9 — screening scores (WHO-5 well-being + Sleep Condition Indicator) ──
+ // Same contract as PHQ9_SCORE / GAD7_SCORE: server-derived from a completed
+ // `MentalHealthAssessment`, `source = COMPUTED`, one row per administration.
+ // Note the inverted direction versus PHQ-9 / GAD-7: HIGHER is better for both.
+ WHO5_SCORE // score (0–100) — WHO-5 well-being percentage (raw 0–25 × 4). Opt-in. See MentalHealthAssessment.
+ SCI_SCORE // score (0–32) — Sleep Condition Indicator total; higher = better sleep. Opt-in. See MentalHealthAssessment.
@@map("measurement_type")
}
/// v1.25 — validated mental-health self-assessment instruments: PHQ-9
/// (depression) + GAD-7 (anxiety). The discriminator on
-/// `MentalHealthAssessment`; extensible (WHO-5 / PSS-10 are natural future
-/// siblings) without a schema change.
+/// `MentalHealthAssessment`. v1.27.9 adds the WHO-5 well-being index and the
+/// Sleep Condition Indicator (SCI) — same administration contract, inverted
+/// score direction (higher = better).
enum AssessmentInstrument {
PHQ9
GAD7
+ WHO5
+ SCI
@@map("assessment_instrument")
}
diff --git a/public/sw.js b/public/sw.js
index ef29fe654..00a96c38a 100644
--- a/public/sw.js
+++ b/public/sw.js
@@ -36,7 +36,7 @@ try {
// v1.4.38.4 → v1.4.42. Do not hand-edit; bump `package.json` and rebuild.
const CACHE_VERSION =
(typeof self !== "undefined" && self.__APP_VERSION__) ||
- /* @sw-version-fallback */ "v1.27.9";
+ /* @sw-version-fallback */ "v1.27.10";
const STATIC_CACHE = `healthlog-static-${CACHE_VERSION}`;
const PAGE_CACHE = `healthlog-pages-${CACHE_VERSION}`;
// v1.18.6 — read-only data cache for a curated allowlist of safe GET `/api/*`
diff --git a/src/__tests__/i18n-english-leak-guard.test.ts b/src/__tests__/i18n-english-leak-guard.test.ts
index 9a3b00612..fadc16f8f 100644
--- a/src/__tests__/i18n-english-leak-guard.test.ts
+++ b/src/__tests__/i18n-english-leak-guard.test.ts
@@ -155,6 +155,39 @@ const LEGIT_IDENTICAL = new Set
+ {t("mentalHealth.history.empty")}
+
- {t("mentalHealth.history.empty")}
-
- {t("mentalHealth.considerProfessional")}
+ {/* Direction-aware follow-up hint: PHQ-9/GAD-7 point up (≥ 10),
+ WHO-5 (≤ 50 → gentle PHQ-9 pointer) and SCI (≤ 16 → the paper's
+ neutral band wording) point down. Soft suggestions, never a
+ diagnosis. */}
+ {needsFollowUp(instrument, result.assessment.totalScore) && (
+
+ {t(`mentalHealth.followUpHint.${key}`)}
+
{t("mentalHealth.attributionLabel")}:
{" "}
- {PHQ_GAD_ATTRIBUTION}
+ {def.attribution}
- {forTab.map((row) => {
- const flagged = row.item9Flagged;
- const open = openCrisisRowId === row.id;
- return (
-
- )}
- >
- )}
-
-
+
+ {forInstrument.map((row) => {
+ const flagged = row.item9Flagged;
+ const open = openCrisisRowId === row.id;
+ return (
+
+
+ {t(`mentalHealth.stems.${stem}`)} +
+ )}