@alfadocs/ui-kit-debug 1.90.0 → 1.90.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{anamnesis-summary-rows-DUMERHK3.js → anamnesis-summary-rows-fbEQwcuW.js} +661 -653
- package/dist/_chunks/anamnesis-summary-rows-fbEQwcuW.js.map +1 -0
- package/dist/_chunks/{balance-badge-cell-C9-hyfxy.js → balance-badge-cell-C4FYwmrZ.js} +2 -2
- package/dist/_chunks/{balance-badge-cell-C9-hyfxy.js.map → balance-badge-cell-C4FYwmrZ.js.map} +1 -1
- package/dist/_chunks/browser-D5CD3WOj.js +565 -0
- package/dist/_chunks/browser-D5CD3WOj.js.map +1 -0
- package/dist/_chunks/{calendar-appointment-editor-dialog-D8Wkbm8_.js → calendar-appointment-editor-dialog-C1v2MNE4.js} +2 -2
- package/dist/_chunks/{calendar-appointment-editor-dialog-D8Wkbm8_.js.map → calendar-appointment-editor-dialog-C1v2MNE4.js.map} +1 -1
- package/dist/_chunks/{data-table-D7EGpqOn.js → data-table-B_IcS0Ke.js} +552 -551
- package/dist/_chunks/data-table-B_IcS0Ke.js.map +1 -0
- package/dist/_chunks/{file-manager-DQbWBTfk.js → file-manager-C9YOT-Dn.js} +2 -2
- package/dist/_chunks/{file-manager-DQbWBTfk.js.map → file-manager-C9YOT-Dn.js.map} +1 -1
- package/dist/_chunks/{heatmap-BJB6V9yJ.js → heatmap-HTz3Jvzy.js} +2 -2
- package/dist/_chunks/{heatmap-BJB6V9yJ.js.map → heatmap-HTz3Jvzy.js.map} +1 -1
- package/dist/_chunks/index-CpVcVNBu.js +2326 -0
- package/dist/_chunks/index-CpVcVNBu.js.map +1 -0
- package/dist/_chunks/{index.es-Bpb8_NrX.js → index.es-Beo-XicE.js} +2 -2
- package/dist/_chunks/{index.es-Bpb8_NrX.js.map → index.es-Beo-XicE.js.map} +1 -1
- package/dist/_chunks/jspdf.es.min-BW7y6yhl.js +9674 -0
- package/dist/_chunks/jspdf.es.min-BW7y6yhl.js.map +1 -0
- package/dist/agent-catalog.json +1 -1
- package/dist/components/data-table/index.js +1 -1
- package/dist/components/data-table/toolbar.d.ts.map +1 -1
- package/dist/components/data-table/xlsx-export.d.ts +13 -0
- package/dist/components/data-table/xlsx-export.d.ts.map +1 -0
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/heatmap/index.js +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/index.js +6 -6
- package/dist/patterns/anamnesis/anamnesis-export-download.d.ts +1 -1
- package/dist/patterns/anamnesis/anamnesis-export-download.d.ts.map +1 -1
- package/dist/patterns/anamnesis/anamnesis-export.d.ts +3 -1
- package/dist/patterns/anamnesis/anamnesis-export.d.ts.map +1 -1
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/package.json +4 -8
- package/dist/_chunks/anamnesis-summary-rows-DUMERHK3.js.map +0 -1
- package/dist/_chunks/data-table-D7EGpqOn.js.map +0 -1
- package/dist/_chunks/exceljs.min-D2MHbJsF.js +0 -23046
- package/dist/_chunks/exceljs.min-D2MHbJsF.js.map +0 -1
- package/dist/_chunks/jspdf.es.min-Cal6Nuw_.js +0 -10007
- package/dist/_chunks/jspdf.es.min-Cal6Nuw_.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anamnesis-summary-rows-fbEQwcuW.js","sources":["../../node_modules/lucide-react/dist/esm/icons/archive-restore.mjs","../../node_modules/lucide-react/dist/esm/icons/archive.mjs","../../node_modules/lucide-react/dist/esm/icons/send-horizontal.mjs","../../src/patterns/anamnesis/anamnesis-catalogue.ts","../../src/patterns/anamnesis/anamnesis-config.ts","../../src/patterns/anamnesis/anamnesis-derive.ts","../../src/patterns/anamnesis/anamnesis-format.ts","../../src/patterns/anamnesis/anamnesis-digest.tsx","../../src/patterns/anamnesis/anamnesis-indicators.tsx","../../src/patterns/anamnesis/anamnesis-summary.tsx","../../src/patterns/anamnesis/anamnesis-compile-blocks.ts","../../src/patterns/anamnesis/anamnesis-baseline.ts","../../src/patterns/anamnesis/anamnesis-events.ts","../../src/patterns/anamnesis/anamnesis-event-bar.tsx","../../src/patterns/anamnesis/anamnesis-visit-note.tsx","../../src/patterns/anamnesis/anamnesis-matrix.tsx","../../src/patterns/anamnesis/anamnesis-window.ts","../../src/patterns/anamnesis/anamnesis-evolution-grid.tsx","../../src/patterns/anamnesis/anamnesis-source-blocks.ts","../../src/patterns/anamnesis/anamnesis-evolution.tsx","../../src/patterns/anamnesis/anamnesis-disclosure.ts","../../src/patterns/anamnesis/anamnesis-export.ts","../../src/patterns/anamnesis/anamnesis-export-download.ts","../../src/patterns/anamnesis/anamnesis-export-pdf.ts","../../src/patterns/anamnesis/anamnesis-export-menu.tsx","../../src/patterns/anamnesis/anamnesis-highlight.ts","../../src/patterns/anamnesis/anamnesis-field.tsx","../../src/patterns/anamnesis/anamnesis-targets.ts","../../src/patterns/anamnesis/anamnesis-target-editor.tsx","../../src/patterns/_shared/target-tile.tsx","../../src/patterns/anamnesis/anamnesis-target-strip.tsx","../../src/patterns/anamnesis/anamnesis-compile.tsx","../../src/patterns/anamnesis/anamnesis-intake.tsx","../../src/patterns/anamnesis/anamnesis-readonly.tsx","../../src/patterns/anamnesis/anamnesis-questionnaire.tsx","../../src/patterns/anamnesis/anamnesis.tsx","../../src/patterns/anamnesis/anamnesis-reorder.tsx","../../src/patterns/anamnesis/anamnesis-config-editor.tsx","../../src/patterns/anamnesis/anamnesis-notes.ts","../../src/patterns/anamnesis/locales/ar.ts","../../src/patterns/anamnesis/locales/de.ts","../../src/patterns/anamnesis/locales/el.ts","../../src/patterns/anamnesis/locales/en.ts","../../src/patterns/anamnesis/locales/es.ts","../../src/patterns/anamnesis/locales/fr.ts","../../src/patterns/anamnesis/locales/hi.ts","../../src/patterns/anamnesis/locales/it.ts","../../src/patterns/anamnesis/locales/ja.ts","../../src/patterns/anamnesis/locales/nl.ts","../../src/patterns/anamnesis/locales/pl.ts","../../src/patterns/anamnesis/locales/pt.ts","../../src/patterns/anamnesis/locales/ro.ts","../../src/patterns/anamnesis/locales/ru.ts","../../src/patterns/anamnesis/locales/sq.ts","../../src/patterns/anamnesis/locales/sv.ts","../../src/patterns/anamnesis/locales/tr.ts","../../src/patterns/anamnesis/locales/zh.ts","../../src/patterns/anamnesis/anamnesis-i18n.ts","../../src/patterns/anamnesis/anamnesis-summary-rows.ts"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"20\", height: \"5\", x: \"2\", y: \"3\", rx: \"1\", key: \"1wp1u1\" }],\n [\"path\", { d: \"M4 8v11a2 2 0 0 0 2 2h2\", key: \"tvwodi\" }],\n [\"path\", { d: \"M20 8v11a2 2 0 0 1-2 2h-2\", key: \"1gkqxj\" }],\n [\"path\", { d: \"m9 15 3-3 3 3\", key: \"1pd0qc\" }],\n [\"path\", { d: \"M12 12v9\", key: \"192myk\" }]\n];\nconst ArchiveRestore = createLucideIcon(\"archive-restore\", __iconNode);\n\nexport { __iconNode, ArchiveRestore as default };\n//# sourceMappingURL=archive-restore.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"20\", height: \"5\", x: \"2\", y: \"3\", rx: \"1\", key: \"1wp1u1\" }],\n [\"path\", { d: \"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8\", key: \"1s80jp\" }],\n [\"path\", { d: \"M10 12h4\", key: \"a56b0p\" }]\n];\nconst Archive = createLucideIcon(\"archive\", __iconNode);\n\nexport { __iconNode, Archive as default };\n//# sourceMappingURL=archive.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M3.714 3.048a.498.498 0 0 0-.683.627l2.843 7.627a2 2 0 0 1 0 1.396l-2.842 7.627a.498.498 0 0 0 .682.627l18-8.5a.5.5 0 0 0 0-.904z\",\n key: \"117uat\"\n }\n ],\n [\"path\", { d: \"M6 12h16\", key: \"s4cdu5\" }]\n];\nconst SendHorizontal = createLucideIcon(\"send-horizontal\", __iconNode);\n\nexport { __iconNode, SendHorizontal as default };\n//# sourceMappingURL=send-horizontal.mjs.map\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — configuration catalogues */\n/* */\n/* Language-neutral configuration: the numeric parameter definitions */\n/* (anthropometrics + a REPRESENTATIVE lab subset with reference ranges), */\n/* the mock pathology taxonomy, and the declarative intake field registry */\n/* that both the patient intake form and the clinician compile view render */\n/* from. This is deliberately a small, extensible slice — a real practice */\n/* would configure ~50 lab parameters and a full ICD-shaped taxonomy. */\n/* */\n/* Labels are resolved at render time via i18n keys derived from each */\n/* `key`/`code` (e.g. `anamnesis.param.<key>`), so nothing here is a */\n/* user-visible string. Unit SYMBOLS (kg, mg/dL, %) are locale-invariant */\n/* scientific notation and are carried as data on the definition. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\nimport type {\n IntakeSectionDef,\n LabParameterDefinition,\n NumericParameterDef,\n PathologyCode,\n} from './anamnesis-types';\n\n/* ------------------------- Anthropometric params ------------------------ */\n\nexport const ANTHRO_PARAMETERS: NumericParameterDef[] = [\n {\n key: 'weight',\n goal: true,\n targetable: true,\n group: 'anthropometric',\n unit: 'kg',\n betterDirection: 'down',\n precision: 1,\n },\n {\n key: 'height',\n group: 'anthropometric',\n unit: 'cm',\n betterDirection: 'toRange',\n precision: 0,\n },\n // BMI is computed from weight + height; healthy band 18.5–24.9 (toRange).\n {\n key: 'bmi',\n goal: true,\n targetable: true,\n group: 'anthropometric',\n unit: 'kg/m²',\n betterDirection: 'toRange',\n referenceRange: { min: 18.5, max: 24.9 },\n precision: 1,\n computed: true,\n },\n {\n key: 'waist',\n targetable: true,\n group: 'anthropometric',\n unit: 'cm',\n betterDirection: 'down',\n precision: 0,\n },\n {\n key: 'hips',\n group: 'anthropometric',\n unit: 'cm',\n betterDirection: 'down',\n precision: 0,\n },\n {\n key: 'arm',\n group: 'anthropometric',\n unit: 'cm',\n betterDirection: 'down',\n precision: 1,\n },\n // Bioimpedance phase angle — higher is healthier (cellular integrity).\n {\n key: 'phaseAngle',\n group: 'anthropometric',\n unit: '°',\n betterDirection: 'up',\n precision: 1,\n },\n];\n\n/* ------------------------------ Lab params ------------------------------ */\n/* A representative 12-parameter subset. `betterDirection: 'toRange'` means\n * moving into the reference range is the improvement, so the sign of a delta\n * cannot say good/bad on its own — the crux the evolution grid demonstrates. */\n\nexport const LAB_PARAMETERS: LabParameterDefinition[] = [\n {\n key: 'fastingGlucose',\n group: 'lab',\n unit: 'mg/dL',\n referenceRange: { min: 70, max: 99 },\n betterDirection: 'toRange',\n precision: 0,\n },\n {\n key: 'hba1c',\n group: 'lab',\n unit: '%',\n referenceRange: { min: 4.0, max: 5.6 },\n betterDirection: 'toRange',\n precision: 1,\n },\n {\n key: 'totalCholesterol',\n group: 'lab',\n unit: 'mg/dL',\n referenceRange: { max: 200 },\n betterDirection: 'down',\n precision: 0,\n },\n {\n key: 'ldl',\n group: 'lab',\n unit: 'mg/dL',\n referenceRange: { max: 115 },\n betterDirection: 'down',\n precision: 0,\n },\n {\n key: 'hdl',\n group: 'lab',\n unit: 'mg/dL',\n referenceRange: { min: 50 },\n betterDirection: 'up',\n precision: 0,\n },\n {\n key: 'triglycerides',\n group: 'lab',\n unit: 'mg/dL',\n referenceRange: { max: 150 },\n betterDirection: 'down',\n precision: 0,\n },\n {\n key: 'haemoglobin',\n group: 'lab',\n unit: 'g/dL',\n referenceRange: { min: 12.0, max: 15.5 },\n betterDirection: 'toRange',\n precision: 1,\n },\n {\n key: 'vitaminD',\n group: 'lab',\n unit: 'ng/mL',\n referenceRange: { min: 30, max: 100 },\n betterDirection: 'up',\n precision: 0,\n },\n {\n key: 'tsh',\n group: 'lab',\n unit: 'mIU/L',\n referenceRange: { min: 0.4, max: 4.0 },\n betterDirection: 'toRange',\n precision: 1,\n },\n {\n key: 'ferritin',\n group: 'lab',\n unit: 'ng/mL',\n referenceRange: { min: 15, max: 150 },\n betterDirection: 'toRange',\n precision: 0,\n },\n {\n key: 'crp',\n group: 'lab',\n unit: 'mg/L',\n referenceRange: { max: 5 },\n betterDirection: 'down',\n precision: 1,\n },\n {\n key: 'creatinine',\n group: 'lab',\n unit: 'mg/dL',\n referenceRange: { min: 0.5, max: 1.1 },\n betterDirection: 'toRange',\n precision: 2,\n },\n];\n\n/* --------------------------- Dietary-intake params ---------------------- */\n/* What the patient EATS, estimated at each visit — the two figures a nutrition\n * plan is written in. Neither a measurement of the body nor a drawn sample, so\n * a third group with a storage array of its own. `betterDirection` differs per\n * parameter; see each. */\n\nexport const DIETARY_PARAMETERS: NumericParameterDef[] = [\n // No reference range, deliberately: 1,600 kcal/d is a success for one\n // patient and starvation for another, so the only honest reference is the\n // patient's own target and `toRange` reads every change as neutral.\n {\n key: 'energy',\n goal: true,\n targetable: true,\n group: 'dietary',\n unit: 'kcal/d',\n betterDirection: 'toRange',\n precision: 0,\n },\n // `up` against the RDA floor (≈0.8 g/kg/day) — the shape used for HDL and\n // vitamin D. In weight management the failure mode is eating too little.\n {\n key: 'protein',\n goal: true,\n targetable: true,\n group: 'dietary',\n unit: 'g/d',\n referenceRange: { min: 60 },\n betterDirection: 'up',\n precision: 0,\n },\n];\n\n/** Every numeric parameter, in evolution-grid row order (anthropometrics,\n * dietary intake, then labs). Callers can slice this to build a smaller grid.\n * Intake sits beside the anthropometrics it explains, and above the bloods\n * that are only drawn once or twice a year. */\nexport const ALL_NUMERIC_PARAMETERS: NumericParameterDef[] = [\n ...ANTHRO_PARAMETERS,\n ...DIETARY_PARAMETERS,\n ...LAB_PARAMETERS,\n];\n\n/** Fast lookup by key. */\nexport const PARAMETER_BY_KEY: Record<string, NumericParameterDef> =\n Object.fromEntries(ALL_NUMERIC_PARAMETERS.map((p) => [p.key, p]));\n\n/* --------------------------- Pathology taxonomy ------------------------- */\n/* 8 families, 2 of them (E66 Obesity, E11 Type 2 diabetes) carrying\n * sub-codes — enough to demonstrate code + sub-code selection, assigned-code\n * badges, and removal. A patient can hold several at once (many-to-many). */\n\nexport const PATHOLOGY_TAXONOMY: PathologyCode[] = [\n { code: 'E66' },\n { code: 'E66.0', parentCode: 'E66' },\n { code: 'E66.9', parentCode: 'E66' },\n { code: 'E11' },\n { code: 'E11.9', parentCode: 'E11' },\n { code: 'E11.6', parentCode: 'E11' },\n { code: 'E78' },\n { code: 'I10' },\n { code: 'E03' },\n { code: 'K58' },\n { code: 'D50' },\n { code: 'E55' },\n];\n\nexport const PATHOLOGY_BY_CODE: Record<string, PathologyCode> =\n Object.fromEntries(PATHOLOGY_TAXONOMY.map((p) => [p.code, p]));\n\n/** i18next uses '.' as its key separator, so a pathology code like `E66.0`\n * must be sanitised before it can be used as an i18n key segment. */\nexport const pathologyLabelKey = (code: string): string =>\n `anamnesis.pathology.${code.replace(/\\./g, '_')}`;\n\n/** Only the leaf/assignable codes (a parent family with sub-codes is a\n * heading, not itself assignable). Parents without sub-codes stay assignable. */\nexport const ASSIGNABLE_PATHOLOGY_CODES: string[] = PATHOLOGY_TAXONOMY.filter(\n (p) => !PATHOLOGY_TAXONOMY.some((c) => c.parentCode === p.code),\n).map((p) => p.code);\n\n/* --------------------------- Intake field registry ---------------------- */\n/* Declarative registry both intake and compile render from — one source of\n * truth for the patient-answerable questionnaire. Field/section/option labels\n * resolve via i18n keys derived from the keys below. */\n\nexport const INTAKE_SECTIONS: IntakeSectionDef[] = [\n {\n key: 'reason',\n fields: [{ key: 'reasonForVisit', required: true, type: 'textarea' }],\n },\n {\n key: 'pharmacological',\n fields: [\n { key: 'knownConditions', required: true, type: 'textarea' },\n { key: 'dailyMedications', required: true, type: 'textarea' },\n { key: 'currentSupplements', type: 'textarea' },\n ],\n },\n {\n key: 'familyHistory',\n fields: [\n { key: 'familyParents', type: 'text' },\n { key: 'familySiblings', type: 'text' },\n { key: 'familyGrandparents', type: 'text' },\n ],\n },\n {\n key: 'symptoms',\n fields: [\n { key: 'bloating', type: 'yesNoDetail', detail: true },\n // Flagged on \"yes\": the seed's one highlight rule, so every story\n // shows a highlighted answer the way a practice's rules would.\n {\n key: 'refluxGastritis',\n type: 'yesNoDetail',\n detail: true,\n highlight: 'whenYes',\n },\n { key: 'tiredness', type: 'yesNoDetail', detail: true },\n {\n key: 'sleepQuality',\n type: 'choice',\n options: ['good', 'fair', 'poor'],\n },\n { key: 'sleepDifficulty', type: 'yesNoDetail', detail: true },\n {\n key: 'bowelHabits',\n type: 'choice',\n options: ['regular', 'constipated', 'diarrhoeal', 'alternating'],\n },\n { key: 'stoolCharacteristics', type: 'text' },\n { key: 'haemorrhoids', type: 'yesNoDetail', detail: true },\n { key: 'diverticula', type: 'yesNoDetail', detail: true },\n { key: 'regularUrination', type: 'yesNoDetail', detail: true },\n {\n key: 'menstrualCycle',\n type: 'choice',\n options: ['regular', 'irregular', 'absent'],\n relevance: 'female',\n },\n ],\n },\n {\n key: 'otherHistory',\n fields: [\n {\n key: 'foodAllergies',\n required: true,\n type: 'yesNoDetail',\n detail: true,\n },\n { key: 'drugAllergies', type: 'yesNoDetail', detail: true },\n { key: 'otherAllergies', type: 'yesNoDetail', detail: true },\n { key: 'foodIntolerances', type: 'yesNoDetail', detail: true },\n {\n key: 'smoking',\n required: true,\n type: 'choice',\n options: ['never', 'former', 'current'],\n },\n { key: 'pastSurgery', type: 'yesNoDetail', detail: true },\n {\n key: 'pregnancies',\n type: 'yesNoDetail',\n detail: true,\n relevance: 'female',\n },\n ],\n },\n {\n key: 'dietaryHistory',\n fields: [\n { key: 'weightSelf', required: true, type: 'number' },\n { key: 'heightSelf', required: true, type: 'number' },\n { key: 'physicalActivity', type: 'textarea' },\n { key: 'lifestyle', type: 'textarea' },\n { key: 'waterPerDay', type: 'number' },\n {\n key: 'fizzyDrinks',\n type: 'choice',\n options: ['never', 'occasionally', 'daily'],\n },\n {\n key: 'alcohol',\n type: 'choice',\n options: ['never', 'occasionally', 'daily'],\n },\n { key: 'coffeePerDay', type: 'number' },\n { key: 'coffeeSugar', type: 'choice', options: ['yes', 'no'] },\n ],\n },\n {\n key: 'recall24h',\n fields: [\n { key: 'breakfast', required: true, type: 'meal' },\n { key: 'morningSnack', type: 'meal' },\n { key: 'lunch', required: true, type: 'meal' },\n { key: 'afternoonSnack', type: 'meal' },\n { key: 'dinner', required: true, type: 'meal' },\n { key: 'afterDinner', type: 'meal' },\n ],\n },\n {\n key: 'foodFrequency',\n fields: [\n { key: 'pulses', type: 'frequency' },\n { key: 'fish', type: 'frequency', detail: true },\n { key: 'eggs', type: 'frequency' },\n { key: 'meatCuredMeat', type: 'frequency', detail: true },\n { key: 'dairy', type: 'frequency', detail: true },\n ],\n },\n];\n\n/** Flat list of every intake field key (in registry order). */\nexport const INTAKE_FIELD_KEYS: string[] = INTAKE_SECTIONS.flatMap((s) =>\n s.fields.map((f) => f.key),\n);\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — practice configuration resolvers */\n/* */\n/* A practice owns its own vocabulary. The kit SEEDS a working default */\n/* (the catalogues) and the practice may relabel, reorder, add to and */\n/* archive it. Three keys are LOCKED — `weight`, `height`, `bmi` — because */\n/* the derivation engine hard-depends on them: BMI is computed from weight */\n/* + height, and the WHO banding only means anything for `bmi`. */\n/* */\n/* `locked` constrains EXISTENCE and IDENTITY, never presentation: a */\n/* locked parameter can be relabelled, given help text and reordered like */\n/* any other; it can never be archived, renamed or deleted. */\n/* */\n/* TWO resolver families, deliberately: */\n/* • configured* — CAPTURE surfaces. Archived descriptors are */\n/* dropped; nothing new can be recorded. */\n/* • all*IncludingArchived — HISTORY surfaces (read-only, evolution, */\n/* the clinician's review of past answers). */\n/* Archived descriptors stay, so archiving a */\n/* field never erases answers recorded under */\n/* it. */\n/* */\n/* Pure and i18n-free: label RESOLUTION (practice label vs i18n key) lives */\n/* in `anamnesis-format.ts`. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\nimport {\n ALL_NUMERIC_PARAMETERS,\n INTAKE_SECTIONS,\n PARAMETER_BY_KEY,\n PATHOLOGY_TAXONOMY,\n} from './anamnesis-catalogue';\nimport type {\n ConfigurableDescriptor,\n IntakeFieldDef,\n IntakeSectionDef,\n NumericParameterDef,\n ParameterGroup,\n PathologyCode,\n} from './anamnesis-types';\n\n/* ------------------------------- Locked tier ---------------------------- */\n\n/** The only keys the derivation engine cannot lose. `bmi` is computed from\n * `weight` + `height`; every other key in the kit is read generically. */\nexport const LOCKED_PARAMETER_KEYS: ReadonlySet<string> = new Set([\n 'weight',\n 'height',\n 'bmi',\n]);\n\n/** Whether a numeric parameter is locked against archiving / deletion. */\nexport function isParameterLocked(key: string): boolean {\n return LOCKED_PARAMETER_KEYS.has(key);\n}\n\n/* ----------------------------- Targetable tier -------------------------- */\n\n/** Whether a per-patient target can be set for this parameter. Decided by the\n * definition, not by a fixed list: its own `targetable` flag, or `goal` — a\n * goal the practice tracks is targetable by definition. Not every number is\n * one: a height is a fact about the patient, and a blood test carries a\n * population reference range rather than a target. The kit seeds `targetable`\n * on the four figures the nutrition plan is written in — weight, BMI, daily\n * energy, protein — plus waist, which practices have long set a goal for; a\n * host sets it (or `goal`) on any numeric question a practice marks as a\n * goal. */\nexport function isParameterTargetable(def: NumericParameterDef): boolean;\n/** @deprecated Pass the `NumericParameterDef`. A bare key answers for the\n * kit's seeded catalogue only — it cannot see a practice's own vocabulary, so\n * a parameter the practice added is never targetable through this form. */\nexport function isParameterTargetable(key: string): boolean;\nexport function isParameterTargetable(\n keyOrDef: string | NumericParameterDef,\n): boolean {\n const def =\n typeof keyOrDef === 'string' ? PARAMETER_BY_KEY[keyOrDef] : keyOrDef;\n if (!def) return false;\n // A def that says nothing inherits its seed's flag, so a practice config\n // stored before the flag existed keeps waist (and an untracked seeded\n // goal) targetable. An explicit `false` on a seeded key is a host opt-out.\n const targetable =\n def.targetable ?? PARAMETER_BY_KEY[def.key]?.targetable ?? false;\n return targetable || def.goal === true;\n}\n\n/** The kit's seeded targetable parameters — weight, BMI, waist, daily energy,\n * protein. Derived from the catalogue, so it describes the seed and is not the\n * rule: a practice's own vocabulary is answered by `isParameterTargetable`\n * on the definition. */\nexport const TARGETABLE_PARAMETER_KEYS: ReadonlySet<string> = new Set(\n ALL_NUMERIC_PARAMETERS.filter((def) => isParameterTargetable(def)).map(\n (def) => def.key,\n ),\n);\n\n/* ------------------------------- The config ----------------------------- */\n\n/** A practice's anamnesis vocabulary. Every list is optional: an omitted list\n * falls back to the kit-seeded catalogue, so `undefined` is a fully working\n * configuration and every existing mount keeps rendering unchanged. */\nexport interface PracticeAnamnesisConfig {\n /** Numeric parameters (anthropometrics + labs), in the practice's order. */\n parameters?: readonly NumericParameterDef[];\n /** The intake questionnaire — the practice's own form, transcribed. */\n intakeSections?: readonly IntakeSectionDef[];\n /** The coded pathology taxonomy. */\n pathologies?: readonly PathologyCode[];\n}\n\n/** What the kit ships when a practice has configured nothing. Seeded, not\n * empty — an empty vocabulary renders an empty record. */\nexport const SEEDED_ANAMNESIS_CONFIG: Required<PracticeAnamnesisConfig> = {\n parameters: ALL_NUMERIC_PARAMETERS,\n intakeSections: INTAKE_SECTIONS,\n pathologies: PATHOLOGY_TAXONOMY,\n};\n\n/** Fill every omitted list from the seed. */\nexport function resolveConfig(\n config?: PracticeAnamnesisConfig,\n): Required<PracticeAnamnesisConfig> {\n return {\n parameters: config?.parameters ?? SEEDED_ANAMNESIS_CONFIG.parameters,\n intakeSections:\n config?.intakeSections ?? SEEDED_ANAMNESIS_CONFIG.intakeSections,\n pathologies: config?.pathologies ?? SEEDED_ANAMNESIS_CONFIG.pathologies,\n };\n}\n\n/* --------------------------- Ordering + archiving ----------------------- */\n\n/** Stable sort by `order`, falling back to the descriptor's seeded position so\n * a partially-ordered list never scrambles. */\nfunction ordered<T extends ConfigurableDescriptor>(list: readonly T[]): T[] {\n return list\n .map((item, index) => ({ item, index }))\n .sort(\n (a, b) =>\n (a.item.order ?? a.index) - (b.item.order ?? b.index) ||\n a.index - b.index,\n )\n .map((entry) => entry.item);\n}\n\n/** A descriptor is live unless it was explicitly archived. `enabled` is\n * tri-state on purpose: `undefined` means \"never configured\", i.e. live. */\nfunction isLive(descriptor: ConfigurableDescriptor): boolean {\n return descriptor.enabled !== false;\n}\n\n/* ---------------------------- Numeric parameters ------------------------ */\n\n/** Stamp `locked` from the locked-key set so every consumer reads one source\n * of truth rather than trusting whatever the config claimed. */\nfunction stampLock(def: NumericParameterDef): NumericParameterDef {\n const locked = isParameterLocked(def.key);\n return def.locked === locked ? def : { ...def, locked };\n}\n\n/** Parameters grouped as the grid renders them: group blocks keep their order\n * of first appearance, and `order` sorts WITHIN a group. Sorting across groups\n * would interleave anthropometrics and labs under the grid's group banners. */\nfunction orderedParameters(\n list: readonly NumericParameterDef[],\n): NumericParameterDef[] {\n const groups: ParameterGroup[] = [];\n for (const def of list) {\n if (!groups.includes(def.group)) groups.push(def.group);\n }\n return groups.flatMap((group) =>\n ordered(list.filter((def) => def.group === group)),\n );\n}\n\n/** CAPTURE surfaces: live parameters only. A locked parameter is never\n * dropped, whatever the config says — archiving `weight` would silently break\n * BMI everywhere. */\nexport function configuredParameters(\n config?: PracticeAnamnesisConfig,\n group?: ParameterGroup,\n): NumericParameterDef[] {\n const all = resolveConfig(config).parameters.map(stampLock);\n const live = all.filter((def) => isLive(def) || def.locked);\n const scoped = group ? live.filter((def) => def.group === group) : live;\n return orderedParameters(scoped);\n}\n\n/** HISTORY surfaces: every parameter, archived ones included, so a value\n * recorded under an archived parameter still renders. */\nexport function allParametersIncludingArchived(\n config?: PracticeAnamnesisConfig,\n group?: ParameterGroup,\n): NumericParameterDef[] {\n const all = resolveConfig(config).parameters.map(stampLock);\n const scoped = group ? all.filter((def) => def.group === group) : all;\n return orderedParameters(scoped);\n}\n\n/** Lookup over every parameter, archived included — callers resolving a key\n * read from a record must never miss an archived one. */\nexport function parameterLookup(\n config?: PracticeAnamnesisConfig,\n): Record<string, NumericParameterDef> {\n return Object.fromEntries(\n allParametersIncludingArchived(config).map((def) => [def.key, def]),\n );\n}\n\n/* ---------------------------- Intake questionnaire ---------------------- */\n\nfunction orderedSection(section: IntakeSectionDef): IntakeSectionDef {\n return { ...section, fields: ordered(section.fields) };\n}\n\n/** CAPTURE: the questionnaire as the patient sees it — archived sections and\n * fields dropped, and a section left with no live field dropped with them. */\nexport function configuredSections(\n config?: PracticeAnamnesisConfig,\n): IntakeSectionDef[] {\n return ordered(resolveConfig(config).intakeSections)\n .filter(isLive)\n .map((section) => ({\n ...section,\n fields: ordered(section.fields.filter(isLive)),\n }))\n .filter((section) => section.fields.length > 0);\n}\n\n/** HISTORY: every section and field ever configured, so answers recorded under\n * a since-archived question still render in the record and the read-only view.\n * Using `configuredSections` here would erase them from the screen. */\nexport function allSectionsIncludingArchived(\n config?: PracticeAnamnesisConfig,\n): IntakeSectionDef[] {\n return ordered(resolveConfig(config).intakeSections).map(orderedSection);\n}\n\n/** Flat field lookup across every section, archived included. */\nexport function intakeFieldLookup(\n config?: PracticeAnamnesisConfig,\n): Record<string, IntakeFieldDef> {\n return Object.fromEntries(\n allSectionsIncludingArchived(config).flatMap((section) =>\n section.fields.map((field) => [field.key, field] as const),\n ),\n );\n}\n\n/* ---------------------------- Pathology taxonomy ------------------------ */\n\n/** CAPTURE: live codes, in configured order. */\nexport function configuredPathologies(\n config?: PracticeAnamnesisConfig,\n): PathologyCode[] {\n return ordered(resolveConfig(config).pathologies.filter(isLive));\n}\n\n/** HISTORY: every code, archived included. A code assigned last year must\n * still render its label this year. */\nexport function allPathologiesIncludingArchived(\n config?: PracticeAnamnesisConfig,\n): PathologyCode[] {\n return ordered(resolveConfig(config).pathologies);\n}\n\n/** Lookup by code over the FULL taxonomy. Without this, reading\n * `entry.parentCode` off a practice-added code throws. */\nexport function pathologyLookup(\n config?: PracticeAnamnesisConfig,\n): Record<string, PathologyCode> {\n return Object.fromEntries(\n allPathologiesIncludingArchived(config).map((entry) => [entry.code, entry]),\n );\n}\n\n/** Assignable codes: a family that carries sub-codes is a heading, not itself\n * assignable. Derived from the LIVE taxonomy so an archived code cannot be\n * newly assigned, but stays resolvable for history. */\nexport function assignablePathologyCodes(\n config?: PracticeAnamnesisConfig,\n): string[] {\n const live = configuredPathologies(config);\n return live\n .filter((entry) => !live.some((child) => child.parentCode === entry.code))\n .map((entry) => entry.code);\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — derivations */\n/* */\n/* Pure functions over the domain model. Everything here is DERIVED and */\n/* never stored on the record: BMI, patient age, out-of-range flags, the */\n/* per-visit deltas (with direction-aware good/bad valence), the */\n/* sparkline series, and the two-visit diff used by compare mode. */\n/* */\n/* Valence is the crux: \"down\" is good for weight against a loss target */\n/* but bad for haemoglobin below its reference range, so good/bad is */\n/* derived from the parameter's `betterDirection` + reference range, never */\n/* from the sign of the delta alone. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\nimport { computeBmi as kitComputeBmi } from '../../components/bmi-calculator/bmi';\nimport type {\n AnamnesisRecord,\n MeasurementResult,\n MedicationEntry,\n NumericParameterDef,\n Visit,\n} from './anamnesis-types';\n\n/* ----------------------------- Anthropometrics -------------------------- */\n\n/** Anthropometric parameter keys map to AnthropometricSet fields; `bmi` is\n * computed. Kept as a lookup so the grid can treat anthropometrics + labs\n * uniformly. */\nexport const ANTHRO_FIELD_BY_KEY: Record<\n string,\n keyof Visit['anthropometrics']\n> = {\n weight: 'weightKg',\n height: 'heightCm',\n waist: 'waistCm',\n hips: 'hipsCm',\n arm: 'armCm',\n phaseAngle: 'phaseAngleDeg',\n};\n\n/** `Timestamp` options for the record's calendar dates (visit date, date of\n * birth, cycle start). Every one of them is a date-only ISO string, which\n * `Date` parses as UTC midnight — rendered with the viewer's zone that shows a\n * phantom time (\"13 Apr 2026, 2:00\" in CEST) and, west of UTC, the WRONG DAY.\n * Dropping the time fields and pinning the zone to UTC makes the calendar date\n * render as written, identically in every timezone (and so deterministically\n * in Chromatic). */\nexport const CALENDAR_DATE_FORMAT: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n timeZone: 'UTC',\n};\n\n/** `Timestamp` options for a visit stamped with a clock time\n * (`YYYY-MM-DDTHH:mm`, no zone suffix). `Date` parses that form as LOCAL\n * time, so the zone is deliberately NOT pinned here: the UTC pin above would\n * move a 00:30 visit onto the previous day everywhere east of Greenwich. */\nexport const CALENDAR_DATETIME_FORMAT: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n};\n\nconst CLOCK_TIME_RE = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}/;\nconst CALENDAR_DAY_RE = /^\\d{4}-\\d{2}-\\d{2}/;\n\n/** Whether a stored ISO string carries a clock time (`YYYY-MM-DDTHH:mm…`).\n * A visit is now an interview with a time stamp, and two interviews of one\n * module on the same day are two visits — the time is what tells them apart. */\nexport function hasClockTime(iso: string | null | undefined): boolean {\n return iso != null && CLOCK_TIME_RE.test(iso);\n}\n\n/** The `YYYY-MM-DD` prefix of a stored date, for day arithmetic that must not\n * see the time: a date-only string is returned unchanged. */\nfunction calendarDayOf(iso: string): string {\n return CALENDAR_DAY_RE.test(iso) ? iso.slice(0, 10) : iso;\n}\n\n/** The `Timestamp` options that render a stored date AS WRITTEN: the UTC pin\n * for a date-only string, local time for a datetime string. One helper, so a\n * header cannot pin a datetime to UTC and print the wrong day. */\nexport function calendarFormatFor(iso: string): Intl.DateTimeFormatOptions {\n return hasClockTime(iso) ? CALENDAR_DATETIME_FORMAT : CALENDAR_DATE_FORMAT;\n}\n\n/** BMI = kg / m². Thin `undefined`-tolerant wrapper over the kit's canonical\n * BMI maths — the anthropometric set leaves unmeasured fields `undefined`,\n * which `bmi-calculator/bmi` (a form-backed component) does not model. The\n * formula itself lives there and is not restated here. */\nexport function computeBmi(\n weightKg: number | null | undefined,\n heightCm: number | null | undefined,\n): number | null {\n return kitComputeBmi(weightKg ?? null, heightCm ?? null);\n}\n\n/** Whether a stored ISO string is a date `Date` can actually read. An archive\n * holds blanks and typos; nothing downstream may throw or print \"NaN\" on one. */\nexport function isReadableDate(iso: string | null | undefined): boolean {\n return iso != null && !Number.isNaN(new Date(iso).getTime());\n}\n\n/** Whole-years age at a reference instant, or `null` when either date is\n * unreadable OR the reference predates the birth — an unknown age is absent,\n * never `NaN` and never negative. Reference is the record's\n * own visit date (deterministic for stories / Chromatic), not the wall clock.\n * Read in UTC because both inputs are date-only strings, which `Date` parses as\n * UTC midnight: local getters return the previous day west of UTC. */\nexport function ageAt(dobIso: string, referenceIso: string): number | null {\n if (!isReadableDate(dobIso) || !isReadableDate(referenceIso)) return null;\n // Calendar days only: a reference visit stamped 00:30 local parses to the\n // previous UTC day west of Greenwich, and the UTC getters below would then\n // read a birthday as one day short.\n const dob = new Date(calendarDayOf(dobIso));\n const ref = new Date(calendarDayOf(referenceIso));\n let age = ref.getUTCFullYear() - dob.getUTCFullYear();\n const monthDiff = ref.getUTCMonth() - dob.getUTCMonth();\n if (\n monthDiff < 0 ||\n (monthDiff === 0 && ref.getUTCDate() < dob.getUTCDate())\n ) {\n age -= 1;\n }\n // A DOB typed as 2026 instead of 1926 would otherwise print \"-6 years\" on\n // three headers. A negative age is not an age.\n return age < 0 ? null : age;\n}\n\n/* ------------------------------ Storage seam ---------------------------- */\n\n/** Where a parameter's value actually lives on a `Visit`. */\nexport type ParameterStorage =\n | 'computed'\n | 'anthropometric'\n | 'dietary'\n | 'lab';\n\n/** Keys stored in `visit.dietaryIntake`. Explicit, like `ANTHRO_FIELD_BY_KEY`:\n * the kit's two shipped intake parameters have a drawer of their own, and\n * anything else a practice adds falls through to the open-ended one below. */\nexport const DIETARY_STORAGE_KEYS: ReadonlySet<string> = new Set([\n 'energy',\n 'protein',\n]);\n\n/** Resolve a parameter's STORAGE HOME. Read and write branch on this, never on\n * `def.group`: `AnthropometricSet` is a fixed shape, so a practice-added\n * anthropometric has no field of its own and must round-trip through the\n * open-ended `labs` array. Branching on `group` made it read null and store\n * nothing. `bmi` keeps its explicit guard — `def.computed` is a bare boolean\n * with no formula registry to dispatch on.\n *\n * `labs` stays the FALLBACK, so a key with no drawer of its own still stores\n * and reads back. There is no such thing as a parameter with no storage home. */\nexport function parameterStorage(def: NumericParameterDef): ParameterStorage {\n if (def.key === 'bmi') return 'computed';\n if (def.key in ANTHRO_FIELD_BY_KEY) return 'anthropometric';\n return DIETARY_STORAGE_KEYS.has(def.key) ? 'dietary' : 'lab';\n}\n\n/* ------------------------------ Parameter values ------------------------ */\n\n/** Absent, for a number read off a record. `0` is a measurement like any other,\n * so this is `== null` plus a finiteness test — never a truthiness test. A\n * stored `NaN` / `Infinity` is not a measurement and reads as absent, which is\n * what stops it reaching a delta, a range flag, a sparkline or a cell. */\nfunction readNumber(value: number | null | undefined): number | null {\n return value != null && Number.isFinite(value) ? value : null;\n}\n\n/** The raw numeric value of a parameter at a visit (BMI computed on the fly,\n * the six shipped anthropometrics read from the set, everything else looked up\n * in `labs` by key). Non-finite stored values read as absent. */\nexport function parameterValueAt(\n visit: Visit,\n def: NumericParameterDef,\n): number | null {\n switch (parameterStorage(def)) {\n case 'computed':\n return computeBmi(\n readNumber(visit.anthropometrics.weightKg),\n readNumber(visit.anthropometrics.heightCm),\n );\n case 'anthropometric':\n return readNumber(visit.anthropometrics[ANTHRO_FIELD_BY_KEY[def.key]]);\n case 'dietary': {\n const hit = visit.dietaryIntake?.find((d) => d.parameterKey === def.key);\n return hit ? readNumber(hit.value) : null;\n }\n case 'lab': {\n const hit = visit.labs.find((l) => l.parameterKey === def.key);\n return hit ? readNumber(hit.value) : null;\n }\n }\n}\n\n/** The MOST RECENT recorded value of a parameter, and the visit it was\n * recorded at — walking backwards from the newest visit to the first one that\n * measured it.\n *\n * Not the same question as `parameterValueAt(latestVisit, def)`, and the\n * difference is what a goal tile lives on: a practice that weighs the patient\n * on the 1st and sees them again on the 10th has a weight on record, and a\n * tile reading only the newest visit called it \"not yet measured\". Every\n * surface that answers \"where is this patient now\" wants this one; the grid,\n * which is per-column by construction, wants the other.\n *\n * `null` when no visit ever measured it. */\nexport function latestParameterValue(\n visits: readonly Visit[],\n def: NumericParameterDef,\n): { value: number; visit: Visit } | null {\n for (let index = visits.length - 1; index >= 0; index -= 1) {\n const visit = visits[index];\n const value = parameterValueAt(visit, def);\n if (value != null) return { value, visit };\n }\n return null;\n}\n\n/** Upsert a value into a by-key measurement list, returning a new list. */\nfunction upsertMeasurement(\n list: readonly MeasurementResult[],\n parameterKey: string,\n value: number | null,\n): MeasurementResult[] {\n return list.some((entry) => entry.parameterKey === parameterKey)\n ? list.map((entry) =>\n entry.parameterKey === parameterKey ? { ...entry, value } : entry,\n )\n : [...list, { parameterKey, value }];\n}\n\n/** Write a numeric value onto a visit at its storage home, returning a new\n * visit. Computed parameters are never written. Pure — the surfaces call it\n * through their own working-state setters. */\nexport function setNumericOnVisit(\n visit: Visit,\n def: NumericParameterDef,\n value: number | null,\n): Visit {\n const storage = parameterStorage(def);\n if (storage === 'computed' || def.computed) return visit;\n if (storage === 'anthropometric') {\n return {\n ...visit,\n anthropometrics: {\n ...visit.anthropometrics,\n [ANTHRO_FIELD_BY_KEY[def.key]]: value,\n },\n };\n }\n if (storage === 'dietary') {\n return {\n ...visit,\n dietaryIntake: upsertMeasurement(\n visit.dietaryIntake ?? [],\n def.key,\n value,\n ),\n };\n }\n return { ...visit, labs: upsertMeasurement(visit.labs, def.key, value) };\n}\n\n/* -------------------------------- Targets ------------------------------- */\n\n/** Set or clear a per-patient target, returning a new record. `null` clears\n * it. Pure — the surfaces call it through their own working-state setters,\n * exactly as they call `setNumericOnVisit`. A non-finite target is not a goal\n * and clears rather than storing \"NaN\". */\nexport function setTargetOnRecord(\n record: AnamnesisRecord,\n parameterKey: string,\n target: number | null,\n): AnamnesisRecord {\n const usable = target != null && Number.isFinite(target) ? target : null;\n if (usable == null) {\n const targets = record.targets.filter(\n (entry) => entry.parameterKey !== parameterKey,\n );\n return targets.length === record.targets.length\n ? record\n : { ...record, targets };\n }\n const exists = record.targets.some(\n (entry) => entry.parameterKey === parameterKey,\n );\n const targets = exists\n ? record.targets.map((entry) =>\n entry.parameterKey === parameterKey\n ? { ...entry, target: usable }\n : entry,\n )\n : [...record.targets, { parameterKey, target: usable }];\n return { ...record, targets };\n}\n\n/* ------------------------------ Out of range ---------------------------- */\n\nexport type RangeFlag = 'low' | 'high' | null;\n\n/** Whether a value sits outside its reference range. */\nexport function outOfRange(\n value: number | null,\n range: NumericParameterDef['referenceRange'],\n): RangeFlag {\n if (value == null || !Number.isFinite(value) || !range) return null;\n if (range.min != null && value < range.min) return 'low';\n if (range.max != null && value > range.max) return 'high';\n return null;\n}\n\n/** Signed distance from the nearest edge of the range (0 when inside). Used\n * to judge whether a `toRange` parameter moved closer to healthy. */\nfunction rangeDistance(\n value: number,\n range: NumericParameterDef['referenceRange'],\n): number {\n if (!range) return 0;\n if (range.min != null && value < range.min) return range.min - value;\n if (range.max != null && value > range.max) return value - range.max;\n return 0;\n}\n\n/* -------------------------------- Deltas -------------------------------- */\n\nexport type DeltaDirection = 'up' | 'down' | 'flat';\nexport type DeltaValence = 'good' | 'bad' | 'neutral';\n\nexport interface DeltaInfo {\n /** Signed change vs the previous visit (current − previous). */\n abs: number;\n direction: DeltaDirection;\n valence: DeltaValence;\n}\n\n/** Direction-aware good/bad. Uses the parameter's `betterDirection` and, for\n * `toRange`, the reference range — never the sign of the delta alone. */\nexport function deltaInfo(\n current: number | null,\n previous: number | null,\n def: NumericParameterDef,\n): DeltaInfo | null {\n // A change between two things that are not numbers is not a change.\n if (current == null || previous == null) return null;\n if (!Number.isFinite(current) || !Number.isFinite(previous)) return null;\n const abs = current - previous;\n const direction: DeltaDirection = abs > 0 ? 'up' : abs < 0 ? 'down' : 'flat';\n\n let valence: DeltaValence = 'neutral';\n if (abs !== 0) {\n switch (def.betterDirection) {\n case 'down':\n valence = abs < 0 ? 'good' : 'bad';\n break;\n case 'up':\n valence = abs > 0 ? 'good' : 'bad';\n break;\n case 'toRange': {\n const before = rangeDistance(previous, def.referenceRange);\n const after = rangeDistance(current, def.referenceRange);\n if (after < before) valence = 'good';\n else if (after > before) valence = 'bad';\n else valence = 'neutral';\n break;\n }\n }\n }\n return { abs, direction, valence };\n}\n\n/* --------------------------- Grid row assembly -------------------------- */\n\nexport interface ParameterCell {\n visitId: string;\n value: number | null;\n outOfRange: RangeFlag;\n /** Change vs the immediately preceding visit; null for the first column. */\n delta: DeltaInfo | null;\n}\n\nexport interface ParameterRow {\n def: NumericParameterDef;\n /** One cell per record visit, aligned to `record.visits` order. */\n cells: ParameterCell[];\n /** ONE ENTRY PER RECORD VISIT, in visit order — the sparkline series. A\n * `null` is a visit where this parameter was not measured, and it holds its\n * place: dropping it would compress a four-times-measured lab across the\n * same width as a thirteen-times-measured weight, and an event annotation\n * would then land on a different date in each row. */\n series: (number | null)[];\n /** Per-patient target for this parameter, when one is configured. */\n target: number | null;\n}\n\n/** Build the transposed grid: one row per parameter definition, one cell per\n * visit, with derived deltas / out-of-range flags / sparkline series. */\nexport function buildParameterRows(\n record: AnamnesisRecord,\n defs: NumericParameterDef[],\n): ParameterRow[] {\n const targetByKey = new Map(\n record.targets.map((t) => [t.parameterKey, t.target] as const),\n );\n return defs.map((def) => {\n const cells: ParameterCell[] = record.visits.map((visit, index) => {\n const value = parameterValueAt(visit, def);\n const previous =\n index > 0 ? parameterValueAt(record.visits[index - 1], def) : null;\n return {\n visitId: visit.id,\n value,\n outOfRange: outOfRange(value, def.referenceRange),\n delta: index > 0 ? deltaInfo(value, previous, def) : null,\n };\n });\n const series = cells.map((c) => c.value);\n return {\n def,\n cells,\n series,\n target: targetByKey.get(def.key) ?? null,\n };\n });\n}\n\n/* ------------------------------- Compare -------------------------------- */\n\nexport interface NumericChange {\n def: NumericParameterDef;\n from: number | null;\n to: number | null;\n delta: DeltaInfo | null;\n}\n\nexport interface PathologyChange {\n code: string;\n change: 'added' | 'removed';\n}\n\nexport interface MedicationChange {\n entry: MedicationEntry;\n change: 'added' | 'removed' | 'changed';\n previous?: MedicationEntry;\n}\n\nexport type TextField = 'nutritionalProposal' | 'clinicalNotes';\n\n/** The free-text fields a visit carries, in diff order. */\nexport const TEXT_FIELDS: readonly TextField[] = [\n 'nutritionalProposal',\n 'clinicalNotes',\n];\n\nexport interface TextChange {\n field: TextField;\n from?: string;\n to?: string;\n}\n\nexport interface VisitDiff {\n from: Visit;\n to: Visit;\n numeric: NumericChange[];\n pathologies: PathologyChange[];\n medications: MedicationChange[];\n texts: TextChange[];\n}\n\nfunction roundTo(value: number, precision: number): number {\n const factor = 10 ** precision;\n return Math.round(value * factor) / factor;\n}\n\n/** `roundTo` that carries absence through, so `null` stays `null`. */\nfunction round(value: number | null, precision: number): number | null {\n return value == null ? null : roundTo(value, precision);\n}\n\n/** Everything that changed between two visits — numeric parameters plus the\n * non-numeric fields (pathologies added/removed, medications added/removed/\n * changed, free-text notes edited). Only entries that actually differ are\n * returned, so compare mode can mark exactly the changed cells. */\nexport function compareVisits(\n from: Visit,\n to: Visit,\n defs: NumericParameterDef[],\n): VisitDiff {\n const numeric: NumericChange[] = [];\n for (const def of defs) {\n const precision = def.precision ?? 1;\n // Round BEFORE diffing, and diff the rounded pair. Deciding \"changed\" at\n // display precision but measuring the delta raw prints \"worsened, 0\".\n const a = round(parameterValueAt(from, def), precision);\n const b = round(parameterValueAt(to, def), precision);\n if (a !== b) {\n numeric.push({ def, from: a, to: b, delta: deltaInfo(b, a, def) });\n }\n }\n\n const pathologies: PathologyChange[] = [];\n for (const code of to.pathologyCodes) {\n if (!from.pathologyCodes.includes(code)) {\n pathologies.push({ code, change: 'added' });\n }\n }\n for (const code of from.pathologyCodes) {\n if (!to.pathologyCodes.includes(code)) {\n pathologies.push({ code, change: 'removed' });\n }\n }\n\n const medications: MedicationChange[] = [];\n const fromById = new Map(from.therapy.map((m) => [m.id, m] as const));\n const toById = new Map(to.therapy.map((m) => [m.id, m] as const));\n for (const entry of to.therapy) {\n const prev = fromById.get(entry.id);\n if (!prev) {\n medications.push({ entry, change: 'added' });\n } else if (prev.name !== entry.name || prev.dose !== entry.dose) {\n medications.push({ entry, change: 'changed', previous: prev });\n }\n }\n for (const entry of from.therapy) {\n if (!toById.has(entry.id)) {\n medications.push({ entry, change: 'removed' });\n }\n }\n\n const texts: TextChange[] = [];\n for (const field of TEXT_FIELDS) {\n const a = from[field] ?? '';\n const b = to[field] ?? '';\n if (a !== b) texts.push({ field, from: from[field], to: to[field] });\n }\n\n return { from, to, numeric, pathologies, medications, texts };\n}\n\n/* ----------------------------- Compare a span --------------------------- */\n\n/* N-WAY COMPARE — the semantics, stated once.\n *\n * A row is reported when its value is NOT CONSTANT across the compared\n * visits, and the single change it reports is the NET one: first compared\n * visit → last compared visit. Two consequences are deliberate.\n *\n * • At two visits this is exactly `compareVisits`, so the default view is\n * unchanged by the generalisation.\n * • A value that moved and came back reports a row with a net change of\n * zero. That is the honest answer to \"how far have we come\", and the\n * excursion is what the row's sparkline is there to show — the number\n * and the shape answer different halves of the question.\n *\n * Consecutive per-column deltas are NOT used: the evolution grid already\n * draws \"versus the previous visit\" in every cell, so repeating it here\n * would make compare a second grid rather than a second question.\n *\n * Visits are read in the order given, which every caller resolves in RECORD\n * order — a set of ticked visits has no order of its own, and columns that\n * disagreed with the grid above would be unreadable.\n */\n\nexport interface NumericSpanChange {\n def: NumericParameterDef;\n /** One entry per compared visit, rounded to the parameter's precision. */\n values: (number | null)[];\n /** Net change, first compared visit → last. Null when either end is absent. */\n delta: DeltaInfo | null;\n}\n\nexport interface PathologySpanChange {\n code: string;\n /** Whether the code was assigned at each compared visit. */\n present: boolean[];\n}\n\nexport interface MedicationSpanChange {\n id: string;\n /** The entry at each compared visit; `undefined` where it was not carried. */\n entries: (MedicationEntry | undefined)[];\n}\n\nexport interface TextSpanChange {\n field: TextField;\n /** The field's text at each compared visit, trimmed; '' where absent. */\n values: string[];\n}\n\nexport interface SpanDiff {\n /** The compared visits, in the order given (record order). Never below two. */\n visits: Visit[];\n numeric: NumericSpanChange[];\n pathologies: PathologySpanChange[];\n medications: MedicationSpanChange[];\n texts: TextSpanChange[];\n}\n\n/** Whether every entry equals the first — the one inclusion test every\n * category uses, so a category cannot decide \"changed\" on its own terms. */\nfunction isConstant<T>(\n values: readonly T[],\n same: (a: T, b: T) => boolean = (a, b) => a === b,\n): boolean {\n return values.every((value) => same(value, values[0]));\n}\n\nfunction sameMedication(\n a: MedicationEntry | undefined,\n b: MedicationEntry | undefined,\n): boolean {\n if (a == null || b == null) return a == null && b == null;\n return a.name === b.name && a.dose === b.dose;\n}\n\n/** Everything that is not constant across two or more visits. `null` below\n * two visits — there is no span to read, and an empty diff would claim there\n * was nothing to report. */\nexport function compareVisitSpan(\n visits: readonly Visit[],\n defs: NumericParameterDef[],\n): SpanDiff | null {\n if (visits.length < 2) return null;\n\n const numeric: NumericSpanChange[] = [];\n for (const def of defs) {\n const precision = def.precision ?? 1;\n // Round BEFORE diffing, at display precision: a sub-precision wobble is\n // not a change anybody can see, and reporting one prints a zero delta.\n const values = visits.map((visit) =>\n round(parameterValueAt(visit, def), precision),\n );\n if (isConstant(values)) continue;\n numeric.push({\n def,\n values,\n delta: deltaInfo(values[values.length - 1], values[0], def),\n });\n }\n\n const pathologies: PathologySpanChange[] = [];\n for (const code of unionInOrder(visits, (visit) => visit.pathologyCodes)) {\n const present = visits.map((visit) => visit.pathologyCodes.includes(code));\n if (isConstant(present)) continue;\n pathologies.push({ code, present });\n }\n\n const medications: MedicationSpanChange[] = [];\n for (const id of unionInOrder(visits, (visit) =>\n visit.therapy.map((entry) => entry.id),\n )) {\n const entries = visits.map((visit) =>\n visit.therapy.find((entry) => entry.id === id),\n );\n if (isConstant(entries, sameMedication)) continue;\n medications.push({ id, entries });\n }\n\n const texts: TextSpanChange[] = [];\n for (const field of TEXT_FIELDS) {\n // Trimmed before diffing: whitespace-only is not a note, so gaining or\n // losing three spaces is not an edit anyone needs to read about.\n const values = visits.map((visit) => visit[field]?.trim() ?? '');\n if (isConstant(values)) continue;\n texts.push({ field, values });\n }\n\n return { visits: [...visits], numeric, pathologies, medications, texts };\n}\n\n/** Every id seen at any compared visit, in first-seen order — so a subject\n * that only ever appears at the last visit still gets a row. */\nfunction unionInOrder(\n visits: readonly Visit[],\n read: (visit: Visit) => readonly string[],\n): string[] {\n const seen: string[] = [];\n for (const visit of visits) {\n for (const id of read(visit)) if (!seen.includes(id)) seen.push(id);\n }\n return seen;\n}\n\n/* ------------------------------- Helpers -------------------------------- */\n\n/** The newest visit — the editable one in compile mode, and the record's one\n * reference instant for anything dated against \"now\": the patient's age, the\n * header's visit date. Every surface must read it from here. Intake used to\n * date itself to `visits[0]` while compile and read-only used the last visit,\n * which printed two different ages for the same patient. */\nexport function latestVisit(record: AnamnesisRecord): Visit | undefined {\n return record.visits[record.visits.length - 1];\n}\n\n/** The one string every absent value renders as. Never a bare hyphen, never a\n * blank, never \"NaN\". */\nexport const ABSENT_VALUE = '—';\n\nconst numberFormatters = new Map<string, Intl.NumberFormat>();\n\n/** One `Intl.NumberFormat` per locale × precision. The grid formats every cell\n * of every visit on each render, and constructing a formatter is the costly\n * half of `Intl` — the format call itself is cheap. */\nfunction numberFormatter(\n locale: string | undefined,\n precision: number,\n): Intl.NumberFormat {\n const key = `${locale ?? ''}|${precision}`;\n let formatter = numberFormatters.get(key);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, {\n minimumFractionDigits: precision,\n maximumFractionDigits: precision,\n useGrouping: false,\n });\n numberFormatters.set(key, formatter);\n }\n return formatter;\n}\n\n/** Format a numeric value to its parameter precision in the app locale (a\n * comma decimal under `it`), or an em dash when absent. `0` formats as a\n * value; a non-finite number is absent, because `Intl` would print \"NaN\" and\n * that must never reach a cell. No grouping: \"1234,5\" is a lab value, not a\n * sum of money. Callers append the unit separately. */\nexport function formatValue(\n value: number | null,\n precision = 1,\n locale?: string,\n): string {\n if (value == null || !Number.isFinite(value)) return ABSENT_VALUE;\n return numberFormatter(locale, precision).format(value);\n}\n\n/** Localised medium date (e.g. \"12 May 2025\") from an ISO date string.\n * @deprecated Pins neither timezone nor locale. Use `visitDateLabel`\n * (anamnesis-format.ts) for anything date-only; it is the reason this has no\n * callers left. */\nexport function formatDateMedium(iso: string): string {\n if (!isReadableDate(iso)) return ABSENT_VALUE;\n return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium' }).format(\n new Date(iso),\n );\n}\n\n/** Localised calendar date from a date-only ISO string, pinned to UTC through\n * `CALENDAR_DATE_FORMAT`. Prefer `visitDateLabel` (anamnesis-format.ts), which\n * resolves `locale` from the surface's `t` — omitting it falls back to the\n * BROWSER locale, which disagrees with `<Timestamp>` on the same screen.\n * An unreadable date renders the em dash: `Intl` THROWS on one, which would\n * take down the whole evolution surface rather than blank one label. */\nexport function formatCalendarDate(iso: string, locale?: string): string {\n if (!isReadableDate(iso)) return ABSENT_VALUE;\n return new Intl.DateTimeFormat(locale, CALENDAR_DATE_FORMAT).format(\n new Date(iso),\n );\n}\n\n/** Localised calendar date + short time from a `YYYY-MM-DDTHH:mm` string\n * (e.g. \"25 ago 2026, 15:27\" under `it`). Parsed as LOCAL time and rendered\n * in the viewer's zone — never through the UTC pin, which is for date-only\n * strings. Same em-dash rule as `formatCalendarDate`. */\nexport function formatCalendarDateTime(iso: string, locale?: string): string {\n if (!isReadableDate(iso)) return ABSENT_VALUE;\n return new Intl.DateTimeFormat(locale, CALENDAR_DATETIME_FORMAT).format(\n new Date(iso),\n );\n}\n\n/** Signed, precision-formatted delta string (e.g. \"+2.4\", \"−1.0\"; \"+2,4\"\n * under `it`). Uses a real minus sign for the negative case. */\nexport function formatDelta(\n abs: number,\n precision = 1,\n locale?: string,\n): string {\n if (!Number.isFinite(abs)) return ABSENT_VALUE;\n const rounded = roundTo(abs, precision);\n if (rounded === 0) return '0';\n const sign = rounded > 0 ? '+' : '−';\n return `${sign}${formatValue(Math.abs(rounded), precision, locale)}`;\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — i18n-aware descriptor + answer formatting */\n/* */\n/* The one place a descriptor becomes a string a clinician reads. Deliber- */\n/* ately NOT in `anamnesis-derive.ts`, which stays pure (no i18n, no */\n/* React, no `t`). */\n/* */\n/* Label resolution rule, applied uniformly: a practice-authored `label` */\n/* wins over the i18n key derived from the descriptor's key. Practice */\n/* wording is DATA (the `PatientCustomFieldDef.label` precedent), so it is */\n/* exempt from `useTranslation` — the kit cannot translate a word it has */\n/* never seen. Where no practice label exists, the kit's own translated */\n/* string is used. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\nimport type { TFunction } from 'i18next';\nimport { pathologyLabelKey } from './anamnesis-catalogue';\nimport {\n ABSENT_VALUE,\n ageAt,\n formatCalendarDate,\n formatCalendarDateTime,\n hasClockTime,\n latestVisit,\n} from './anamnesis-derive';\nimport type {\n AnamnesisRecord,\n IntakeAnswer,\n IntakeFieldDef,\n IntakeSectionDef,\n NumericParameterDef,\n PathologyCode,\n PatientSex,\n Visit,\n} from './anamnesis-types';\n\n/* ------------------------------ Visibility ------------------------------ */\n\n/** Only show a field when it is relevant to the patient's recorded sex.\n * Single definition — this previously existed three times (intake, compile,\n * read-only) and drifting copies are a correctness risk, not just noise. */\nexport function fieldVisible(def: IntakeFieldDef, sex: PatientSex): boolean {\n const relevance = def.relevance ?? 'any';\n return relevance === 'any' || relevance === sex;\n}\n\n/* -------------------------------- Dates --------------------------------- */\n\n/** The locale a `t` is fixed to. Both `useTranslation('ui')` and a locale-pinned\n * `getFixedT(lng, ns)` set it, so this is the app language on every surface. */\nexport function localeOf(t: TFunction): string | undefined {\n const lng = (t as TFunction & { lng?: unknown }).lng;\n return typeof lng === 'string' ? lng : undefined;\n}\n\n/** Every stored date rendered outside a JSX `<Timestamp>`, in the app locale\n * so one visit cannot render two ways on one screen. A date-only string is\n * pinned to UTC and renders as written; a `YYYY-MM-DDTHH:mm` string is a\n * LOCAL instant and renders as date + short time — never through the UTC\n * pin, which would print the wrong day for an early-morning visit. */\nexport function visitDateLabel(iso: string, t: TFunction): string {\n const locale = localeOf(t);\n return hasClockTime(iso)\n ? formatCalendarDateTime(iso, locale)\n : formatCalendarDate(iso, locale);\n}\n\n/** A stored `YYYY-MM-DD` as a LOCAL calendar date. `new Date(iso)` would parse\n * it as UTC midnight and render the previous day west of Greenwich — the\n * off-by-one this pattern has already had to fix once. A datetime string\n * yields its calendar day: the day is what a date control edits. */\nexport function parseCalendarDate(iso: string): Date | undefined {\n const [y, m, d] = iso.slice(0, 10).split('-').map(Number);\n if (!y || !m || !d) return undefined;\n return new Date(y, m - 1, d);\n}\n\n/** The `THH:mm` tail of a datetime string, or `''` for a date-only one — so a\n * control that edits only the calendar day writes the day back without\n * discarding the time the visit was stamped with. */\nexport function clockSuffix(iso: string): string {\n return hasClockTime(iso) ? iso.slice(10, 16) : '';\n}\n\n/** A local calendar date back to `YYYY-MM-DD`. `toISOString()` would convert to\n * UTC first and can land on the wrong day; these are the local components. */\nexport function toCalendarIso(date: Date): string {\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n}\n\n/** One visit as an option label. The ordinal disambiguates two visits recorded\n * on the same calendar day, which would otherwise read identically.\n *\n * `hasNote` marks a visit whose note is only readable once that visit is a\n * column — without it the picker gives the reader no reason to pick it, and\n * the note is unreachable in practice rather than one tick away. */\nexport function visitOptionLabel(\n visit: Visit,\n index: number,\n t: TFunction,\n hasNote = false,\n): string {\n const base = t('anamnesis.compare.visitOption', {\n index: index + 1,\n visitType: t(`anamnesis.visitType.${visit.visitType}`),\n date: visitDateLabel(visit.dateIso, t),\n });\n // The source (the module the numbers came from) tells two visits minutes\n // apart from different questionnaires apart, as it does in the column.\n const label = visit.sourceLabel\n ? t('anamnesis.compare.visitOptionSource', {\n label: base,\n source: visit.sourceLabel,\n })\n : base;\n return hasNote ? t('anamnesis.window.optionHasNote', { label }) : label;\n}\n\n/* --------------------------------- Age ---------------------------------- */\n\n/** Age at an EXPLICIT reference instant. An unreadable date of birth or\n * reference date renders the em dash — the same absence marker every other\n * unknown uses, and never the \"NaN years\" the raw subtraction used to print.\n * Surfaces call `patientAgeLabel`; this stays for a caller that genuinely has\n * its own reference date. */\nexport function ageLabel(\n dateOfBirthIso: string,\n referenceIso: string,\n t: TFunction,\n): string {\n const age = ageAt(dateOfBirthIso, referenceIso);\n return age == null ? ABSENT_VALUE : t('anamnesis.header.years', { age });\n}\n\n/** The patient header's age line, on every surface. Takes the RECORD rather\n * than a date, so no call site can pick its own reference visit — picking one\n * per surface is exactly how intake and compile came to print two different\n * ages for the same patient. A record with no visit has no age to state. */\nexport function patientAgeLabel(record: AnamnesisRecord, t: TFunction): string {\n const reference = latestVisit(record);\n if (!reference) return ABSENT_VALUE;\n return ageLabel(record.patient.dateOfBirthIso, reference.dateIso, t);\n}\n\n/* -------------------------------- Labels -------------------------------- */\n\n/** A practice label only wins when it carries actual text. */\nfunction practiceLabel(label: string | undefined): string | null {\n const trimmed = label?.trim();\n return trimmed ? trimmed : null;\n}\n\n/** Numeric parameter label — practice wording, else `anamnesis.param.<key>`. */\nexport function parameterLabel(def: NumericParameterDef, t: TFunction): string {\n return (\n practiceLabel(def.label) ??\n t(`anamnesis.param.${def.key}`, { defaultValue: def.key })\n );\n}\n\n/** Parameter label with its unit appended, as the form fields render it. Unit\n * symbols (kg, mg/dL) are locale-invariant scientific notation. */\nexport function parameterLabelWithUnit(\n def: NumericParameterDef,\n t: TFunction,\n): string {\n const label = parameterLabel(def, t);\n return def.unit ? `${label} (${def.unit})` : label;\n}\n\n/** Intake field label — practice wording, else `anamnesis.field.<key>.label`. */\nexport function intakeFieldLabel(def: IntakeFieldDef, t: TFunction): string {\n return (\n practiceLabel(def.label) ??\n t(`anamnesis.field.${def.key}.label`, { defaultValue: def.key })\n );\n}\n\n/** Intake field label with its unit appended — what a `number` field renders,\n * so the reader knows whether 85 is kilograms or pounds before typing it.\n *\n * Practice units only in practice: no kit-seeded intake field carries `unit`\n * (the seeded labels spell theirs out), which is why this is a sibling helper\n * and not folded into `intakeFieldLabel` — that one also feeds the config\n * editor's rename placeholder, where a unit would end up inside the wording. */\nexport function intakeFieldLabelWithUnit(\n def: IntakeFieldDef,\n t: TFunction,\n): string {\n const label = intakeFieldLabel(def, t);\n return def.unit ? `${label} (${def.unit})` : label;\n}\n\n/** Optional help text under an intake field. Practice help text wins; the kit\n * key is optional and resolves to `undefined` when unset. */\nexport function intakeFieldHelp(\n def: IntakeFieldDef,\n t: TFunction,\n): string | undefined {\n const practice = practiceLabel(def.helpText);\n if (practice) return practice;\n const translated = t(`anamnesis.field.${def.key}.help`, { defaultValue: '' });\n return translated || undefined;\n}\n\n/** Section heading — practice wording, else `anamnesis.section.<key>`. */\nexport function sectionLabel(section: IntakeSectionDef, t: TFunction): string {\n return (\n practiceLabel(section.label) ??\n t(`anamnesis.section.${section.key}`, { defaultValue: section.key })\n );\n}\n\n/** Pathology description. The code itself is never translated; the entry may\n * be absent from the taxonomy entirely, in which case the code stands alone.\n * `pathologyLabelKey` sanitises the dot — i18next reads `.` as a separator, so\n * `E66.0` must never be concatenated into a key by hand. */\nexport function pathologyLabel(\n code: string,\n t: TFunction,\n entry?: PathologyCode,\n): string {\n return (\n practiceLabel(entry?.label) ??\n t(pathologyLabelKey(code), { defaultValue: code })\n );\n}\n\n/** `E66.0 — Obesity due to excess calories`, the form the pickers and badges\n * render. Falls back to the bare code when nothing describes it. */\nexport function pathologyCodeWithLabel(\n code: string,\n t: TFunction,\n entry?: PathologyCode,\n): string {\n const label = pathologyLabel(code, t, entry);\n return label === code ? code : `${code} — ${label}`;\n}\n\n/* ----------------------------- Answer values ---------------------------- */\n\n/** Whether an answer carries a real response. Shared by the progress meter,\n * the digest and the mandatory-answer check, so all three agree. \"Not sure\"\n * counts as UNANSWERED — provisional, pending the customer's own rule. Zero is\n * a value: every numeric branch is `!= null`, never a truthiness test. */\nexport function isIntakeAnswered(answer: IntakeAnswer | undefined): boolean {\n if (!answer) return false;\n switch (answer.kind) {\n case 'text':\n return answer.text.trim() !== '';\n case 'number':\n return answer.value != null;\n case 'yesNo':\n return answer.present !== 'unknown';\n case 'choice':\n return answer.selected != null;\n case 'multiChoice':\n return answer.selected.length > 0;\n case 'frequency':\n return answer.perWeek != null;\n case 'meal':\n return answer.description.trim() !== '';\n }\n}\n\n/** One intake answer as a read-only string. Absent values render an em dash —\n * never \"undefined\", never a bare hyphen. Zero is a value: every check here is\n * `!= null`, never a truthiness test on a number. */\nexport function formatIntakeAnswer(\n answer: IntakeAnswer,\n def: IntakeFieldDef,\n t: TFunction,\n): string {\n switch (answer.kind) {\n case 'text':\n return answer.text.trim() || '—';\n case 'number':\n // As entered, in the app locale: the field beside it renders 72,5 under\n // Italian, so the summary and the export must not say 72.5.\n return answer.value != null\n ? new Intl.NumberFormat(localeOf(t), {\n maximumFractionDigits: 10,\n useGrouping: false,\n }).format(answer.value)\n : '—';\n case 'yesNo': {\n const yn =\n answer.present === 'unknown'\n ? t('anamnesis.common.notSure')\n : t(`anamnesis.common.${answer.present}`);\n return answer.detail ? `${yn} — ${answer.detail}` : yn;\n }\n case 'choice': {\n if (!answer.selected) return '—';\n const selectedLabel = t(\n `anamnesis.field.${def.key}.option.${answer.selected}`,\n { defaultValue: answer.selected },\n );\n return answer.detail\n ? `${selectedLabel} — ${answer.detail}`\n : selectedLabel;\n }\n case 'multiChoice':\n return answer.selected.length > 0\n ? answer.selected\n .map((opt) =>\n t(`anamnesis.field.${def.key}.option.${opt}`, {\n defaultValue: opt,\n }),\n )\n .join(', ')\n : '—';\n case 'frequency': {\n const base =\n answer.perWeek != null\n ? t('anamnesis.readOnly.perWeek', { times: answer.perWeek })\n : '—';\n return answer.detail ? `${base} — ${answer.detail}` : base;\n }\n case 'meal':\n return (\n [answer.time, answer.description].filter(Boolean).join(' · ') || '—'\n );\n }\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — at-a-glance intake digest + missing-answer alert */\n/* */\n/* The clinician's read of a returned questionnaire: why the patient came, */\n/* what they already carry, what they report, what they do every day. It */\n/* REPLACES the editable answer list as the default view — the full form */\n/* stays one closed disclosure below, so no answer is rendered twice. */\n/* */\n/* The mandatory list is PROVISIONAL — the customer's real one has not */\n/* arrived. The `required` flag on the field defs is the swap point. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { RefObject } from 'react';\nimport type { TFunction } from 'i18next';\nimport { Alert, type AlertAnnounce } from '../../components/alert';\nimport { Button } from '../../components/button';\nimport { DescriptionList } from '../../components/description-list';\nimport { EmptyState } from '../../components/empty-state';\nimport {\n fieldVisible,\n formatIntakeAnswer,\n intakeFieldLabel,\n isIntakeAnswered,\n} from './anamnesis-format';\nimport type {\n IntakeAnswer,\n IntakeFieldDef,\n IntakeSectionDef,\n PatientSex,\n} from './anamnesis-types';\n\n/* ------------------------------ Vocabulary ------------------------------ */\n\n/** How one digest group is built. Phase 3 adds a group by adding an entry\n * here — the renderer switches on `kind` and never on a group id. */\nexport type DigestGroupKind = 'prose' | 'facts' | 'flags';\n\nexport type DigestGroupDef =\n | { id: string; kind: 'prose'; fieldKeys: readonly string[] }\n | { id: string; kind: 'facts'; fieldKeys: readonly string[] }\n | { id: string; kind: 'flags' };\n\n/** Reading order for a clinician with the patient in the room: why they came,\n * what they already carry, what they report, what they do every day. */\nexport const DIGEST_GROUPS: readonly DigestGroupDef[] = [\n { id: 'reason', kind: 'prose', fieldKeys: ['reasonForVisit'] },\n {\n id: 'history',\n kind: 'prose',\n fieldKeys: ['knownConditions', 'dailyMedications', 'currentSupplements'],\n },\n { id: 'flags', kind: 'flags' },\n {\n id: 'habits',\n kind: 'facts',\n fieldKeys: [\n 'coffeePerDay',\n 'coffeeSugar',\n 'waterPerDay',\n 'alcohol',\n 'fizzyDrinks',\n 'smoking',\n 'sleepQuality',\n 'bowelHabits',\n 'physicalActivity',\n ],\n },\n];\n\n/* Which questions are mandatory now lives ON the field defs\n * (`IntakeFieldDef.required`) — kit-seeded on ten questions as the\n * provisional stand-in the `.mdx` documents, and practice-configurable like\n * `enabled`/`order`. The old kit-constant set is gone: a platform host maps\n * its per-question required flags straight onto the defs. */\n\n/* -------------------------------- Model --------------------------------- */\n\n/** Reads one answer by field key. Both surfaces hold their answers in a\n * different shape (a working map vs `Sourced<IntakeAnswer>`), so the digest\n * takes a reader rather than either shape. */\nexport type AnswerReader = (key: string) => IntakeAnswer | undefined;\n\nexport interface DigestItem {\n key: string;\n label: string;\n /** Already display-ready. Absent numerics are an em dash, never \"NaN\". */\n value: string;\n}\n\nexport interface DigestGroup {\n id: string;\n kind: DigestGroupKind;\n items: DigestItem[];\n}\n\nexport interface IntakeDigest {\n /** Only groups that have something to say. */\n groups: DigestGroup[];\n answered: number;\n total: number;\n}\n\nexport interface MissingAnswer {\n key: string;\n sectionKey: string;\n label: string;\n}\n\n/* ------------------------------- Builders ------------------------------- */\n\nfunction visibleFields(\n sections: readonly IntakeSectionDef[],\n sex: PatientSex,\n): IntakeFieldDef[] {\n return sections.flatMap((section) =>\n section.fields.filter((field) => fieldVisible(field, sex)),\n );\n}\n\nfunction itemFor(\n def: IntakeFieldDef,\n read: AnswerReader,\n t: TFunction,\n): DigestItem | null {\n const answer = read(def.key);\n if (!answer || !isIntakeAnswered(answer)) return null;\n return {\n key: def.key,\n label: intakeFieldLabel(def, t),\n value: formatIntakeAnswer(answer, def, t),\n };\n}\n\n/** Everything the patient answered \"yes\" to, wherever it lives in the form —\n * derived, so a practice-added yes/no question shows up without config. */\nfunction flagItems(\n fields: readonly IntakeFieldDef[],\n read: AnswerReader,\n t: TFunction,\n): DigestItem[] {\n const out: DigestItem[] = [];\n for (const def of fields) {\n const answer = read(def.key);\n if (!answer || answer.kind !== 'yesNo' || answer.present !== 'yes')\n continue;\n out.push({\n key: def.key,\n label: intakeFieldLabel(def, t),\n value: answer.detail?.trim() || t('anamnesis.common.yes'),\n });\n }\n return out;\n}\n\n/** The whole digest. Pure apart from `t`; safe on an absent questionnaire, a\n * half-answered one, and a practice that archived half the form. */\nexport function buildIntakeDigest(\n sections: readonly IntakeSectionDef[],\n read: AnswerReader,\n sex: PatientSex,\n t: TFunction,\n): IntakeDigest {\n const fields = visibleFields(sections, sex);\n const byKey = new Map(fields.map((f) => [f.key, f] as const));\n\n const groups: DigestGroup[] = [];\n for (const group of DIGEST_GROUPS) {\n const items =\n group.kind === 'flags'\n ? flagItems(fields, read, t)\n : group.fieldKeys\n .map((key) => {\n const def = byKey.get(key);\n return def ? itemFor(def, read, t) : null;\n })\n .filter((item): item is DigestItem => item != null);\n if (items.length > 0)\n groups.push({ id: group.id, kind: group.kind, items });\n }\n\n let answered = 0;\n for (const def of fields) {\n const answer = read(def.key);\n if (answer && isIntakeAnswered(answer)) answered += 1;\n }\n\n return { groups, answered, total: fields.length };\n}\n\n/** Mandatory questions the patient has not answered, in questionnaire order.\n * \"Not sure\" counts as unanswered — provisional, and flagged in the `.mdx`. */\nexport function missingMandatoryAnswers(\n sections: readonly IntakeSectionDef[],\n read: AnswerReader,\n sex: PatientSex,\n t: TFunction,\n): MissingAnswer[] {\n const out: MissingAnswer[] = [];\n for (const section of sections) {\n for (const def of section.fields) {\n if (def.required !== true || !fieldVisible(def, sex)) continue;\n const answer = read(def.key);\n if (answer && isIntakeAnswered(answer)) continue;\n out.push({\n key: def.key,\n sectionKey: section.key,\n label: intakeFieldLabel(def, t),\n });\n }\n }\n return out;\n}\n\n/* ------------------------------- Jump seam ------------------------------ */\n\n// Every clause excludes tabindex=\"-1\": a RadioGroup's unchecked items are\n// buttons with a roving -1, so a bare `button` clause lands on the wrong one.\nconst FOCUSABLE_CONTROL =\n 'input:not([tabindex=\"-1\"]), textarea:not([tabindex=\"-1\"]), select:not([tabindex=\"-1\"]), button:not([tabindex=\"-1\"]), [tabindex]:not([tabindex=\"-1\"])';\n\n/** Moves focus to a field the caller has just revealed. Returns false when the\n * target is still not mounted, so the hook can wait one more frame. */\nfunction focusIntakeField(root: HTMLElement | null, key: string): boolean {\n const host = root?.querySelector<HTMLElement>(\n `[data-testid=\"anamnesis-field-${key}\"]`,\n );\n const control = host?.querySelector<HTMLElement>(FOCUSABLE_CONTROL);\n if (!control) return false;\n control.focus();\n return true;\n}\n\nconst MAX_JUMP_FRAMES = 4;\n\n/** Jump-to-field seam. The caller opens whatever disclosures hide the target\n * (on compile that is BOTH the section block and the answer review), then asks\n * for the jump; this waits for the reveal to mount before moving focus. */\nexport function useFieldJump(): {\n containerRef: RefObject<HTMLDivElement | null>;\n requestJump: (key: string) => void;\n} {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [pending, setPending] = useState<string | null>(null);\n\n useEffect(() => {\n if (pending == null) return;\n let frames = 0;\n let raf = 0;\n const attempt = () => {\n if (focusIntakeField(containerRef.current, pending)) {\n setPending(null);\n return;\n }\n frames += 1;\n if (frames >= MAX_JUMP_FRAMES) {\n setPending(null);\n return;\n }\n raf = window.requestAnimationFrame(attempt);\n };\n raf = window.requestAnimationFrame(attempt);\n return () => window.cancelAnimationFrame(raf);\n }, [pending]);\n\n const requestJump = useCallback((key: string) => setPending(key), []);\n\n return { containerRef, requestJump };\n}\n\n/* ------------------------- Missing-answer alert ------------------------- */\n\nexport interface AnamnesisMissingAnswersProps {\n missing: readonly MissingAnswer[];\n t: TFunction;\n /** Reveals the first missing answer and moves focus to it. */\n onJump: (missing: MissingAnswer) => void;\n /** How loudly this is announced. Pass `'off'` where the list RECOMPUTES as\n * the user types — a live region re-announces its whole content on every\n * change, so a per-keystroke summary is noise, not help. Default `'polite'`\n * suits a list fixed at mount. */\n announce?: AlertAnnounce;\n /** Label for the jump action. Override where the jump LEAVES the surface —\n * a button that changes tab has to say so before it moves focus. */\n jumpKey?: string;\n}\n\n/** Guidance, not an interruption. Tint and urgency are independent in the kit,\n * so the `info` tint here is a visual choice, separate from `announce`. */\nexport function AnamnesisMissingAnswers({\n missing,\n t,\n onJump,\n announce = 'polite',\n jumpKey = 'anamnesis.digest.missing.jump',\n}: AnamnesisMissingAnswersProps) {\n const first = missing[0];\n if (!first) return null;\n const separator = t('anamnesis.digest.missing.separator');\n const list = missing.map((m) => m.label).join(separator);\n\n return (\n <Alert\n variant=\"info\"\n announce={announce}\n data-testid=\"anamnesis-digest-missing\"\n >\n <Alert.Title as=\"p\">\n {t('anamnesis.digest.missing.title', { count: missing.length })}\n </Alert.Title>\n <Alert.Description>\n {t('anamnesis.digest.missing.list', { list })}\n </Alert.Description>\n <Alert.Action>\n <Button\n intent=\"tonal\"\n size=\"sm\"\n data-testid=\"anamnesis-digest-jump\"\n onClick={() => onJump(first)}\n >\n {t(jumpKey, { field: first.label })}\n </Button>\n </Alert.Action>\n </Alert>\n );\n}\n\n/* -------------------------------- Digest -------------------------------- */\n\nexport interface AnamnesisDigestProps {\n digest: IntakeDigest;\n t: TFunction;\n}\n\n/** Free text reads as prose; everything else as a term↔detail list. Group\n * headings are h3 — the digest always sits under the section's h2. */\nfunction DigestGroupBlock({ group, t }: { group: DigestGroup; t: TFunction }) {\n return (\n <div\n data-testid={`anamnesis-digest-group-${group.id}`}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n <h3 className=\"type-title-item ds:m-0 ds:text-[color:var(--foreground)]\">\n {t(`anamnesis.digest.group.${group.id}`)}\n </h3>\n <DescriptionList\n layout={group.kind === 'prose' ? 'stacked' : 'inline'}\n labelWidth=\"fixed\"\n density=\"compact\"\n divider=\"between\"\n >\n {group.items.map((item) => (\n <DescriptionList.Row key={item.key}>\n <DescriptionList.Term>{item.label}</DescriptionList.Term>\n <DescriptionList.Detail>{item.value}</DescriptionList.Detail>\n </DescriptionList.Row>\n ))}\n </DescriptionList>\n </div>\n );\n}\n\nexport function AnamnesisDigest({ digest, t }: AnamnesisDigestProps) {\n if (digest.groups.length === 0) {\n return (\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={t('anamnesis.digest.nothing.title')}\n description={t('anamnesis.digest.nothing.description')}\n />\n );\n }\n return (\n <div\n data-testid=\"anamnesis-digest-panel\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n {digest.groups.map((group) => (\n <DigestGroupBlock key={group.id} group={group} t={t} />\n ))}\n </div>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — shared visual indicators */\n/* */\n/* The vocabulary that makes \"changes are immediately visible\" work, */\n/* reused across intake, compile, the evolution grid, and read-only: */\n/* • DeltaIndicator — direction-aware arrow + signed change, coloured by */\n/* good/bad VALENCE (not the raw sign), with a redundant text/aria cue. */\n/* • OriginMarker — the \"from patient\" badge (info family) on values the */\n/* clinician has not yet confirmed. */\n/* • OutOfRangeBadge — the H/L flag for a lab outside its reference range. */\n/* • TrendSparkline — a compact inline trend for a numeric series. */\n/* */\n/* Colour never carries meaning alone (WCAG 1.4.1): deltas pair colour with */\n/* a direction glyph + signed number + an \"improved/worsened\" aria phrase; */\n/* range flags pair colour with a glyph + dot + aria; the origin marker */\n/* carries a glyph + text. */\n/* -------------------------------------------------------------------- */\n\nimport { cva } from 'class-variance-authority';\nimport type { TFunction } from 'i18next';\nimport { ArrowDown, ArrowUp, Minus, User } from 'lucide-react';\nimport { Badge } from '../../components/badge';\nimport {\n Sparkline,\n type SparklineAnnotation,\n} from '../../components/sparkline';\nimport {\n deltaInfo,\n formatDelta,\n type DeltaInfo,\n type RangeFlag,\n} from './anamnesis-derive';\nimport { localeOf, parameterLabel } from './anamnesis-format';\nimport type { NumericParameterDef } from './anamnesis-types';\n\n/* ------------------------------ DeltaIndicator -------------------------- */\n\nconst deltaVariants = cva(\n 'type-meta ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)] ds:tabular-nums',\n {\n variants: {\n valence: {\n // Deep semantic ramp steps so the 12px delta text clears AA at small\n // sizes on both the white card surface and the warm-grey app shell.\n good: 'ds:text-[color:var(--success-foreground)]',\n bad: 'ds:text-[color:var(--error-foreground)]',\n neutral: 'ds:text-[color:var(--muted-foreground)]',\n },\n },\n defaultVariants: { valence: 'neutral' },\n },\n);\n\nexport interface DeltaIndicatorProps {\n /** The derived change vs the previous visit; `null` renders nothing (first\n * visit has no delta — never render a broken arrow). */\n delta: DeltaInfo | null;\n def: NumericParameterDef;\n t: TFunction;\n}\n\n/** Arrow + signed change vs the previous visit, coloured by whether the change\n * is an improvement for THIS parameter. */\nexport function DeltaIndicator({ delta, def, t }: DeltaIndicatorProps) {\n if (!delta) return null;\n const Icon =\n delta.direction === 'up'\n ? ArrowUp\n : delta.direction === 'down'\n ? ArrowDown\n : Minus;\n const changeText = `${formatDelta(delta.abs, def.precision ?? 1, localeOf(t))}${\n def.unit ? ` ${def.unit}` : ''\n }`;\n const valenceLabel =\n delta.valence === 'good'\n ? t('anamnesis.delta.improved')\n : delta.valence === 'bad'\n ? t('anamnesis.delta.worsened')\n : t('anamnesis.delta.unchanged');\n return (\n <span\n role=\"img\"\n className={deltaVariants({ valence: delta.valence })}\n aria-label={t('anamnesis.delta.aria', {\n valence: valenceLabel,\n change: changeText,\n })}\n >\n <Icon aria-hidden=\"true\" className=\"ds:size-4\" />\n <span aria-hidden=\"true\">{changeText}</span>\n </span>\n );\n}\n\n/* ------------------------------ OriginMarker ---------------------------- */\n\nexport interface OriginMarkerProps {\n t: TFunction;\n}\n\n/** \"From patient\" badge shown against a value the patient submitted and the\n * clinician has not yet confirmed or edited. Uses the info family (calm,\n * informational — distinct from the clinical status colours). */\nexport function OriginMarker({ t }: OriginMarkerProps) {\n return (\n <Badge variant=\"info\" size=\"sm\" leading={<User aria-hidden=\"true\" />}>\n {t('anamnesis.origin.fromPatient')}\n </Badge>\n );\n}\n\n/* ----------------------------- OutOfRangeBadge -------------------------- */\n\nexport interface OutOfRangeBadgeProps {\n flag: RangeFlag;\n t: TFunction;\n /** Icon-only chip for dense grid cells; otherwise shows a short label. */\n compact?: boolean;\n}\n\n/** H/L flag for a lab value outside its reference range. Warning tone +\n * direction glyph + colour-blind dot; the accessible name says above/below. */\nexport function OutOfRangeBadge({\n flag,\n t,\n compact = false,\n}: OutOfRangeBadgeProps) {\n if (!flag) return null;\n const label =\n flag === 'high'\n ? t('anamnesis.range.aboveRange')\n : t('anamnesis.range.belowRange');\n const Icon = flag === 'high' ? ArrowUp : ArrowDown;\n return (\n <Badge\n variant=\"warning\"\n size=\"sm\"\n withDot\n leading={<Icon aria-hidden=\"true\" />}\n aria-label={label}\n >\n {compact ? null : label}\n </Badge>\n );\n}\n\n/* ----------------------------- TrendSparkline --------------------------- */\n\nconst TREND_COLOUR: Record<'good' | 'bad' | 'neutral', string> = {\n good: 'var(--success)',\n bad: 'var(--error)',\n neutral: 'var(--muted-foreground)',\n};\n\nexport interface TrendSparklineProps {\n /** ONE ENTRY PER RECORD VISIT, in visit order. `null` is a visit where this\n * parameter was not measured, and it HOLDS its place on the x extent —\n * that is what keeps a lab drawn four times over a thirteen-visit history\n * on the same x scale as a weight drawn thirteen times, so an event\n * annotation lands on the same date in both. */\n series: (number | null)[];\n def: NumericParameterDef;\n t: TFunction;\n /** Event reference lines. The SAME array is handed to every row, so one\n * event is one vertical line down the whole grid. */\n annotations?: readonly SparklineAnnotation[];\n /** Make those lines pointer-selectable. Supplied ⇒ pressing one does what\n * pressing its chip in the bar above does. The chip bar is the keyboard\n * route and stays the only one — the lines live inside a `role=\"img\"`. */\n onSelectAnnotation?: (eventId: string) => void;\n}\n\n/** Compact inline trend across all visits, tinted by the overall valence\n * (first → last measurement) for the parameter. Reduced motion is honoured by\n * Sparkline internally. Renders nothing below two measurements (no trend to\n * draw) — the gaps do not count towards that. Always as wide as its cell:\n * the event lines are drawn over the cell, so a narrower plot would put them\n * beside the measurements they mark rather than on them. */\nexport function TrendSparkline({\n series,\n def,\n t,\n annotations,\n onSelectAnnotation,\n}: TrendSparklineProps) {\n const measured = series.filter((value): value is number => value != null);\n if (measured.length < 2) return null;\n const overall = deltaInfo(measured[measured.length - 1], measured[0], def);\n const valence = overall?.valence ?? 'neutral';\n return (\n <Sparkline\n data={series}\n variant=\"line\"\n size=\"sm\"\n /* A percentage, never the measured container width: the trend tab is\n `display:none` until it is selected, so the first measurement is 0 and\n ApexCharts would keep a chart narrower than the cell for good. */\n width=\"100%\"\n color={TREND_COLOUR[valence]}\n annotations={annotations}\n onAnnotationSelect={onSelectAnnotation}\n label={t('anamnesis.grid.trendLabel', {\n parameter: parameterLabel(def, t),\n })}\n />\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — Summary tab (the questionnaire, read-only) */\n/* */\n/* The clinician's arrival read: what the patient reported before the */\n/* visit, answered at a glance. It carries the digest built in */\n/* `anamnesis-digest.tsx` (why they came, what they carry, what they */\n/* report, what they do daily), the missing-answer alert, and the full */\n/* questionnaire one closed disclosure below — all READ-ONLY. Filling a */\n/* gap is data entry, so it happens on Compile; the alert's action crosses */\n/* to it rather than turning this panel into a form. */\n/* */\n/* `AnamnesisAnswerList` is the single read-only questionnaire renderer, */\n/* shared with the read-only care-plan surface. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\nimport type { TFunction } from 'i18next';\nimport { ChevronDown } from 'lucide-react';\nimport { Badge } from '../../components/badge';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '../../components/collapsible';\nimport { DescriptionList } from '../../components/description-list';\nimport {\n AnamnesisDigest,\n AnamnesisMissingAnswers,\n type IntakeDigest,\n type MissingAnswer,\n} from './anamnesis-digest';\nimport {\n fieldVisible,\n formatIntakeAnswer,\n intakeFieldLabel,\n sectionLabel,\n} from './anamnesis-format';\nimport { OriginMarker } from './anamnesis-indicators';\nimport type {\n IntakeResponse,\n IntakeSectionDef,\n PatientSex,\n} from './anamnesis-types';\n\n/** The kit's token-driven focus ring for an unstyled `CollapsibleTrigger`.\n * Without it the UA outline shows, which neither widens under\n * `.theme-accessible` nor uses `--ring`. */\nexport const TRIGGER_FOCUS_RING =\n ' ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid' +\n ' ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]';\n\n/* --------------------- Read-only questionnaire list --------------------- */\n\nexport interface AnamnesisAnswerListProps {\n intake: IntakeResponse;\n /** History vocabulary, not the live one — archiving a question must never\n * erase the answer already recorded under it. */\n sections: readonly IntakeSectionDef[];\n sex: PatientSex;\n t: TFunction;\n}\n\n/** Every recorded answer as term ↔ detail, grouped by questionnaire section,\n * with the \"from patient\" marker on values the clinician has not touched.\n * Zero edit affordances — this is a read presentation, not a disabled form. */\nexport function AnamnesisAnswerList({\n intake,\n sections,\n sex,\n t,\n}: AnamnesisAnswerListProps) {\n const blocks = sections\n .map((section) => ({\n section,\n fields: section.fields\n .filter((field) => fieldVisible(field, sex))\n .filter((field) => intake.answers[field.key]),\n }))\n .filter(({ fields }) => fields.length > 0);\n\n if (blocks.length === 0) {\n return (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.summary.noAnswers')}\n </p>\n );\n }\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {blocks.map(({ section, fields }) => (\n <div\n key={section.key}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n <h3 className=\"type-title-item ds:m-0 ds:text-[color:var(--foreground)]\">\n {sectionLabel(section, t)}\n </h3>\n <DescriptionList layout=\"stacked\" density=\"compact\" divider=\"between\">\n {fields.map((field) => {\n const sourced = intake.answers[field.key];\n if (!sourced) return null;\n return (\n <DescriptionList.Row key={field.key}>\n <DescriptionList.Term>\n {intakeFieldLabel(field, t)}\n </DescriptionList.Term>\n <DescriptionList.Detail>\n <span className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span>{formatIntakeAnswer(sourced.value, field, t)}</span>\n {sourced.origin === 'patient' ? (\n <OriginMarker t={t} />\n ) : null}\n </span>\n </DescriptionList.Detail>\n </DescriptionList.Row>\n );\n })}\n </DescriptionList>\n </div>\n ))}\n </div>\n );\n}\n\n/* ------------------------------ Summary tab ----------------------------- */\n\nexport interface AnamnesisSummaryProps {\n /** Absent = no questionnaire was ever sent back. */\n intake: IntakeResponse | undefined;\n sections: readonly IntakeSectionDef[];\n sex: PatientSex;\n digest: IntakeDigest;\n missing: readonly MissingAnswer[];\n /** Hands the gap to the Compile tab, which is where answers are recorded. */\n onJump: (missing: MissingAnswer) => void;\n t: TFunction;\n}\n\n/** The Summary panel. One h2 for the tab's subject, the digest's groups as\n * h3 under it, then the full questionnaire behind its own h2 trigger — so the\n * heading order is h1 → h2 → h3 with no jump, on a panel with no inputs. */\nexport function AnamnesisSummary({\n intake,\n sections,\n sex,\n digest,\n missing,\n onJump,\n t,\n}: AnamnesisSummaryProps) {\n return (\n <section\n data-testid=\"anamnesis-summary\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n <h2 className=\"type-title-section ds:m-0 ds:text-[color:var(--foreground)]\">\n {t('anamnesis.section.patientIntake')}\n </h2>\n {intake ? (\n <>\n {/* Fixed at mount — the questionnaire has already come back — so a\n polite live region is a summary, not a per-keystroke re-read. */}\n {missing.length > 0 ? (\n <AnamnesisMissingAnswers\n missing={missing}\n t={t}\n onJump={onJump}\n jumpKey=\"anamnesis.summary.jump\"\n />\n ) : null}\n <AnamnesisDigest digest={digest} t={t} />\n <Collapsible variant=\"default\">\n <h2 className=\"type-title-section ds:m-0 ds:text-[color:var(--foreground)]\">\n <CollapsibleTrigger\n data-testid=\"anamnesis-summary-full\"\n className={\n 'type-label ds:flex ds:w-full ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:text-start' +\n TRIGGER_FOCUS_RING\n }\n >\n <span className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n {t('anamnesis.summary.fullQuestionnaire')}\n <Badge variant=\"neutral\" size=\"sm\">\n {t('anamnesis.intake.sectionProgress', {\n answered: digest.answered,\n total: digest.total,\n })}\n </Badge>\n </span>\n <ChevronDown\n aria-hidden=\"true\"\n className=\"ds:size-5 ds:shrink-0 ds:text-[color:var(--muted-foreground)] ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none ds:[[data-state=open]_&]:rotate-180\"\n />\n </CollapsibleTrigger>\n </h2>\n {/* Named after its own trigger: both derive role=\"group\", and two\n nested groups sharing a name are unnavigable. */}\n <CollapsibleContent\n aria-label={t('anamnesis.summary.fullQuestionnaire')}\n >\n <div className=\"ds:pt-[var(--spacing-md)]\">\n <AnamnesisAnswerList\n intake={intake}\n sections={sections}\n sex={sex}\n t={t}\n />\n </div>\n </CollapsibleContent>\n </Collapsible>\n </>\n ) : (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.compile.noIntake')}\n </p>\n )}\n </section>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — compile-surface density policy */\n/* */\n/* The compile tab is ten titled blocks. Opening all ten made the page a */\n/* very long scroll, most of it reference material the clinician does not */\n/* touch at a follow-up. The policy here is a DEFAULT, not a control: the */\n/* blocks a clinician fills or must recall at every visit are open on */\n/* arrival, the occasional ones are folded — and every folded block states */\n/* how much it holds AND how much of that is out of range, so folding */\n/* hides the detail and never the existence of a record or a flag. */\n/* */\n/* Pure: no i18n, no JSX, no React. The badge wording lives with the */\n/* renderer; the policy lives here so it can be read and tested on its own. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\nimport { outOfRange } from './anamnesis-derive';\nimport type { NumericParameterDef, Visit } from './anamnesis-types';\n\n/* -------------------------------- Blocks -------------------------------- */\n\n/** Open on arrival: the blocks a clinician records at — or must recall at —\n * EVERY consultation. Visit details and anthropometrics are recorded each\n * time; an unanswered required question is this visit's to-do list; the\n * pathology list and the current therapy are the \"what does this patient carry\n * / already take\" memory aids, and proposing a supplement without seeing the\n * current medication is exactly the recall failure this surface prevents.\n * The questionnaire itself is read on the Summary tab, not here. */\nexport const EVERY_VISIT_BLOCKS = [\n 'visitMeta',\n 'intakeGaps',\n 'anthropometrics',\n 'pathologies',\n 'therapy',\n 'proposal',\n] as const;\n\n/** Folded on arrival at a FOLLOW-UP: reference or occasional. Oncological\n * history is blank for most patients; bloods are drawn a few times a year;\n * fasting cycles and the annual programme are yearly. Each keeps a fill\n * summary in its header, so folding hides the detail and never the existence\n * of a record. A first visit opens all of them — see `compileBlockDensity`. */\nexport const OCCASIONAL_BLOCKS = [\n 'oncological',\n 'labs',\n 'fmd',\n 'annual',\n] as const;\n\nexport type EveryVisitBlockId = (typeof EVERY_VISIT_BLOCKS)[number];\nexport type OccasionalBlockId = (typeof OCCASIONAL_BLOCKS)[number];\n\n/** One titled block of the compile form whose arrival state this module\n * decides. Adding an id to this union without listing it in one of the two\n * arrays above is a type error. It does NOT catch a `<Block>` rendered in the\n * JSX with no id at all — that block simply keeps the shell's own default. */\nexport type CompileBlockId = EveryVisitBlockId | OccasionalBlockId;\n\nexport interface CompileBlockDensity {\n /** Open on arrival. */\n open: boolean;\n /** How much this block already holds, for the header summary. `null` on the\n * always-open blocks, where a count beside visible content is noise. */\n fill: number | null;\n /** Of that fill, how many values sit outside their reference range. Named in\n * the header so a folded block can never hide a flagged result. */\n flagged: number;\n}\n\n/* -------------------------------- Fills --------------------------------- */\n\nfunction filledText(value: string | undefined): boolean {\n return (value ?? '').trim() !== '';\n}\n\n/** Oncological entries recorded: each answered field counts once. */\nfunction oncologicalFill(visit: Visit): number {\n const onc = visit.oncological;\n if (!onc) return 0;\n let filled = 0;\n if (filledText(onc.tumourType)) filled += 1;\n if (filledText(onc.stage)) filled += 1;\n if (onc.metastases && onc.metastases.present !== 'unknown') filled += 1;\n if (filledText(onc.treatmentStatus)) filled += 1;\n return filled;\n}\n\n/** Labs the BLOCK will actually render, not the raw `visit.labs` array: a\n * since-archived parameter, or a value round-tripped through `labs` for a\n * practice-added anthropometric, would otherwise be counted in a header whose\n * open state shows something else. `0` is a measurement; `NaN` / `Infinity`\n * are not, so this is `!= null` plus a finiteness test, never truthiness. */\nfunction labValues(\n visit: Visit,\n labDefs: readonly NumericParameterDef[],\n): { def: NumericParameterDef; value: number }[] {\n const byKey = new Map(visit.labs.map((lab) => [lab.parameterKey, lab.value]));\n const hits: { def: NumericParameterDef; value: number }[] = [];\n for (const def of labDefs) {\n const value = byKey.get(def.key);\n if (value != null && Number.isFinite(value)) hits.push({ def, value });\n }\n return hits;\n}\n\n/** The annual programme is one decision, and \"recorded\" means a decision was\n * taken — an explicit \"not proposed\" holds no proposal to read. */\nfunction annualFill(visit: Visit): number {\n const annual = visit.annualProgramme;\n if (!annual) return 0;\n return annual.proposed || annual.accepted ? 1 : 0;\n}\n\n/* --------------------------------- API ---------------------------------- */\n\n/** How each compile block opens for the visit being recorded.\n *\n * A FIRST visit opens everything: there is no history to fold away, and an\n * empty block on a first consultation means \"to be filled\", not \"nothing to\n * see\". A follow-up folds the occasional blocks behind their fill summary.\n *\n * `labDefs` is the practice's live lab vocabulary — the same list the Blood\n * tests block renders. Pass it, or the lab fill and flag counts describe a\n * different set of values from the one the opened block shows.\n *\n * Safe on a record with no visit — everything falls back to the arrival\n * default with no fill. */\nexport function compileBlockDensity(\n visit: Visit | undefined,\n labDefs: readonly NumericParameterDef[] = [],\n): Record<CompileBlockId, CompileBlockDensity> {\n const labs = visit ? labValues(visit, labDefs) : [];\n const firstVisit = visit?.visitType === 'first';\n\n const fills: Record<OccasionalBlockId, number> = {\n oncological: visit ? oncologicalFill(visit) : 0,\n labs: labs.length,\n fmd: visit ? visit.fmdCycles.length : 0,\n annual: visit ? annualFill(visit) : 0,\n };\n const flags: Record<OccasionalBlockId, number> = {\n oncological: 0,\n labs: labs.filter(({ def, value }) => outOfRange(value, def.referenceRange))\n .length,\n fmd: 0,\n annual: 0,\n };\n\n const density = {} as Record<CompileBlockId, CompileBlockDensity>;\n for (const id of EVERY_VISIT_BLOCKS)\n density[id] = { open: true, fill: null, flagged: 0 };\n for (const id of OCCASIONAL_BLOCKS)\n density[id] = { open: firstVisit, fill: fills[id], flagged: flags[id] };\n return density;\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — the merged \"first visit\" baseline */\n/* */\n/* In the platform a visit is one interview of one module, and each */\n/* module's opening interview is its own FIRST visit — minutes apart, */\n/* asking different questions. Plotted as columns, the leftmost one is */\n/* whichever module happened to open first, and every parameter the other */\n/* modules own reads \"—\" there while their own baselines sit further */\n/* right. The reader wants ONE baseline: per parameter, the value it had */\n/* at its module's first visit. */\n/* */\n/* This folds every `visitType === 'first'` visit into one synthetic */\n/* `Visit` the rest of the surface reads like any other column. It is */\n/* DERIVED here and never stored on the record; with fewer than two first */\n/* visits the input passes through untouched, so a single-module record */\n/* renders exactly as it always has. */\n/* */\n/* Pure: no i18n, no JSX, no React. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\nimport { hasClockTime, isReadableDate } from './anamnesis-derive';\nimport type {\n AnthropometricSet,\n MeasurementResult,\n Visit,\n} from './anamnesis-types';\n\n/** Column id of the synthetic merged first visit. A record must not hold a\n * real visit with this id. */\nexport const BASELINE_VISIT_ID = 'baseline';\n\nexport interface VisitBaseline {\n /** The synthetic merged first visit; `null` when the record holds fewer\n * than two first visits. */\n baseline: Visit | null;\n /** The first visits folded into it, oldest first. Empty when `baseline`\n * is null. */\n sources: Visit[];\n /** The list every downstream read runs on: `[baseline, ...non-first visits\n * in record order]` — or the INPUT ARRAY ITSELF when nothing merged. */\n visits: Visit[];\n /** What the picker may toggle: `visits` minus the baseline (the input\n * array itself when nothing merged). */\n pickable: Visit[];\n}\n\nexport interface ResolveBaselineOptions {\n /** A visit that stays its own column even when it is a first visit —\n * compile mode's editable newest visit. Omitted = every first visit folds. */\n keepId?: string;\n}\n\n/* ------------------------------- Helpers -------------------------------- */\n\n/** One sort key for every source, on the event axis's rule: with any\n * date-only stamp among them all compare by UTC-anchored calendar DAY, else\n * by instant — so the merge order never depends on the viewer's time zone.\n * Unreadable dates sort last; `Array.sort` is stable, so ties keep record\n * order. */\nexport function visitSortKey(\n visits: readonly Visit[],\n): (iso: string) => number {\n const byDay = visits.some(\n (visit) => isReadableDate(visit.dateIso) && !hasClockTime(visit.dateIso),\n );\n return (iso) => {\n if (!isReadableDate(iso)) return Number.POSITIVE_INFINITY;\n if (!byDay) return new Date(iso).getTime();\n const [y, m, d] = iso.slice(0, 10).split('-').map(Number);\n return y && m && d ? Date.UTC(y, m - 1, d) : Number.POSITIVE_INFINITY;\n };\n}\n\nfunction finite(value: number | null | undefined): value is number {\n return value != null && Number.isFinite(value);\n}\n\nconst ANTHRO_KEYS: readonly (keyof AnthropometricSet)[] = [\n 'weightKg',\n 'heightCm',\n 'waistCm',\n 'hipsCm',\n 'armCm',\n 'phaseAngleDeg',\n];\n\n/** Per key, the value from the EARLIEST source that has a finite one; keys\n * are unioned in first-seen order, and a key nobody measured stays null. */\nfunction mergeMeasurements(\n lists: readonly (readonly MeasurementResult[])[],\n): MeasurementResult[] {\n const merged: MeasurementResult[] = [];\n const at = new Map<string, number>();\n for (const list of lists) {\n for (const entry of list) {\n const index = at.get(entry.parameterKey);\n if (index == null) {\n at.set(entry.parameterKey, merged.length);\n merged.push({\n parameterKey: entry.parameterKey,\n value: finite(entry.value) ? entry.value : null,\n });\n } else if (merged[index].value == null && finite(entry.value)) {\n merged[index] = {\n parameterKey: entry.parameterKey,\n value: entry.value,\n };\n }\n }\n }\n return merged;\n}\n\n/** Trimmed, non-empty texts oldest first: none → absent, one → that text,\n * several → joined by a blank line. The simplest union that loses nothing. */\nfunction mergeText(texts: readonly (string | undefined)[]): string | undefined {\n const kept = texts\n .map((text) => text?.trim() ?? '')\n .filter((text) => text.length > 0);\n return kept.length > 0 ? kept.join('\\n\\n') : undefined;\n}\n\nfunction firstDefined<T>(values: readonly (T | undefined)[]): T | undefined {\n return values.find((value) => value !== undefined);\n}\n\n/* --------------------------------- API ---------------------------------- */\n\nexport function isBaselineVisit(visit: Visit): boolean {\n return visit.id === BASELINE_VISIT_ID;\n}\n\n/** Resolve the effective visit list. Never mutates `visits` or any visit in\n * it; the synthetic visit is built field by field so nothing of a source's\n * identity (id, source label, practitioner) leaks into it. */\nexport function resolveBaseline(\n visits: readonly Visit[],\n { keepId }: ResolveBaselineOptions = {},\n): VisitBaseline {\n const folds = (visit: Visit) =>\n visit.visitType === 'first' && visit.id !== keepId;\n const firsts = visits.filter(folds);\n if (firsts.length < 2) {\n const same = visits as Visit[];\n return { baseline: null, sources: [], visits: same, pickable: same };\n }\n\n const key = visitSortKey(firsts);\n const sources = [...firsts].sort((a, b) => key(a.dateIso) - key(b.dateIso));\n\n const anthropometrics = {} as AnthropometricSet;\n for (const key of ANTHRO_KEYS) {\n const hit = sources.find((source) => finite(source.anthropometrics[key]));\n anthropometrics[key] = hit ? hit.anthropometrics[key] : null;\n }\n\n const intakeLists = sources\n .map((source) => source.dietaryIntake)\n .filter((list): list is MeasurementResult[] => list != null);\n\n const pathologyCodes: string[] = [];\n for (const source of sources) {\n for (const code of source.pathologyCodes) {\n if (!pathologyCodes.includes(code)) pathologyCodes.push(code);\n }\n }\n\n const therapy: Visit['therapy'] = [];\n for (const source of sources) {\n for (const entry of source.therapy) {\n if (!therapy.some((kept) => kept.id === entry.id)) therapy.push(entry);\n }\n }\n\n const baseline: Visit = {\n id: BASELINE_VISIT_ID,\n visitType: 'first',\n dateIso: sources[0].dateIso,\n practitioner: undefined,\n sourceLabel: undefined,\n anthropometrics,\n labs: mergeMeasurements(sources.map((source) => source.labs)),\n // Absent stays absent: \"not measured\" must not become \"zero\".\n dietaryIntake:\n intakeLists.length > 0 ? mergeMeasurements(intakeLists) : undefined,\n pathologyCodes,\n oncological: firstDefined(sources.map((source) => source.oncological)),\n therapy,\n fmdCycles: sources.flatMap((source) => source.fmdCycles),\n nutritionalProposal: mergeText(\n sources.map((source) => source.nutritionalProposal),\n ),\n clinicalNotes: mergeText(sources.map((source) => source.clinicalNotes)),\n annualProgramme: firstDefined(\n sources.map((source) => source.annualProgramme),\n ),\n };\n\n const rest = visits.filter((visit) => !folds(visit));\n return { baseline, sources, visits: [baseline, ...rest], pickable: rest };\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — clinical events, and where they sit on the trend */\n/* */\n/* The release-annotation pattern, applied to a care record: something */\n/* happened on a date — therapy started, a diet started, a fasting cycle */\n/* began, surgery, the gym — and the question is what the measurements did */\n/* around it. Picking an event drops one vertical line down EVERY row's */\n/* sparkline, so a variation can be read against the thing that caused it. */\n/* */\n/* TWO PROPERTIES MAKE THAT WORK, and both come from positioning by DATE */\n/* rather than by data-point index: */\n/* */\n/* 1. An event need not fall ON a visit. The oncologist starts */\n/* chemotherapy on a day the patient is not in front of this practice; */\n/* an accident happens between check-ups. Interpolating the date */\n/* between the two visits that bracket it places those at all. */\n/* */\n/* 2. Every row shares ONE x domain — the record's visit ordinals. Row k */\n/* of the grid plots one point per visit (an unmeasured visit is a */\n/* `null` that HOLDS its place, see the grid), so point i of every row */\n/* sits at i/(n-1) and a fraction derived here lands at the same x in */\n/* all of them. Deriving it per row from that row's own point count */\n/* would put the same event at a different x in a lab row than in an */\n/* anthropometric one, and the vertical read is the whole point. */\n/* */\n/* Pure: no i18n, no JSX, no React, below the label section. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\nimport type { TFunction } from 'i18next';\nimport type { MarkerShape } from '../../components/annotation-marker';\nimport type {\n SparklineAnnotation,\n SparklineAnnotationTone,\n} from '../../components/sparkline';\nimport { hasClockTime, isReadableDate } from './anamnesis-derive';\nimport { visitDateLabel } from './anamnesis-format';\nimport type {\n ClinicalEvent,\n ClinicalEventCategory,\n Visit,\n} from './anamnesis-types';\n\n/* -------------------------------- Model --------------------------------- */\n\n/**\n * ONE shape per category, and that is the whole vocabulary — five distinct\n * glyphs, no per-category hue.\n *\n * Five saturated semantic tones (error / success / accent / warning / info)\n * used to ride these shapes. Three or four events picked at once put four\n * competing hues across a 32px-tall sparkline, nineteen rows deep, and the\n * annotations then out-shouted the trend line they exist to annotate. Shape\n * is already the accessible channel here (WCAG 1.4.1, and the kit's rule in\n * `src/components/annotation-marker/`), so the hue was reinforcement the\n * reader was paying for in noise.\n */\nexport const EVENT_SHAPE: Record<ClinicalEventCategory, MarkerShape> = {\n therapy: 'cross',\n diet: 'circle',\n fmd: 'diamond',\n surgery: 'triangle',\n lifestyle: 'square',\n};\n\n/**\n * The single restrained tone every annotation wears, chip and line alike.\n *\n * `neutral` resolves to `--muted-foreground`, the only hueless token that\n * clears WCAG 1.4.11's 3:1 for a non-text graphic in all four themes\n * (measured 6.9:1 light, 7.5:1 dark, 18.4:1 / 13.9:1 accessible, against\n * `--card`). Hueless is the point: the trend line is tinted by VALENCE —\n * green improving, red worsening — and an annotation with a hue of its own\n * competes with that read.\n */\nexport const EVENT_TONE: SparklineAnnotationTone = 'neutral';\n\n/** An event that HAS a place on the plot, with the fraction it sits at. */\nexport interface EventMark {\n event: ClinicalEvent;\n /** Fraction of the shared x domain: 0 = first visit, 1 = latest. */\n position: number;\n}\n\n/* ------------------------------ Positioning ------------------------------ */\n\n/**\n * Where an event sits on the domain every row shares, or `null` when it has\n * no place on the plot.\n *\n * `null` — rather than a clamp to 0 or 1 — for an event outside the visit\n * span: the plot covers first visit → latest, and pinning an event that\n * predates the record to the left edge would invent a correlation with a\n * measurement taken before it happened. Also `null` below two visits (no\n * extent to sit on) and on any unreadable date.\n *\n * `visits` is read in ARRAY ORDER, and chronological order is an UNCHECKED\n * precondition: an out-of-order array can bracket the event on a span that\n * runs backwards and place the marker accordingly.\n */\nexport function eventPosition(\n event: ClinicalEvent,\n visits: readonly Visit[],\n): number | null {\n const spans = visits.length - 1;\n if (spans < 1 || !isReadableDate(event.dateIso)) return null;\n\n // One axis for both stamp forms. A bare calendar date and a local\n // date-time cannot be compared as instants — `new Date` puts the first at\n // UTC midnight and the second at local time, and a same-day event then\n // falls outside the visit it belongs to anywhere off Greenwich. When either\n // side is date-only the comparison is by calendar DAY, every day anchored\n // at UTC midnight so days are uniform (local midnights are not across a\n // DST change) and an all-date-only record positions exactly as it always\n // has; only an all-datetime record positions by the clock.\n const byDay =\n !hasClockTime(event.dateIso) ||\n visits.some((visit) => !hasClockTime(visit.dateIso));\n const instant = (iso: string): number => {\n if (!byDay) return new Date(iso).getTime();\n const [y, m, d] = iso.slice(0, 10).split('-').map(Number);\n return y && m && d ? Date.UTC(y, m - 1, d) : Number.NaN;\n };\n const times = visits.map((visit) => instant(visit.dateIso));\n const at = instant(event.dateIso);\n\n for (let i = 0; i < spans; i += 1) {\n const from = times[i];\n const to = times[i + 1];\n // NaN from an unreadable visit date fails both comparisons, so a corrupt\n // visit costs that one span rather than the whole annotation.\n if (!(at >= from && at <= to)) continue;\n // Two visits recorded on the same day are one instant, not a span to\n // interpolate across — the event sits on the earlier ordinal.\n const within = to > from ? (at - from) / (to - from) : 0;\n return (i + within) / spans;\n }\n return null;\n}\n\n/** The events that can be drawn, in the order they happened. */\nexport function eventMarks(\n events: readonly ClinicalEvent[] | undefined,\n visits: readonly Visit[],\n): EventMark[] {\n return (events ?? [])\n .flatMap((event) => {\n const position = eventPosition(event, visits);\n return position == null ? [] : [{ event, position }];\n })\n .sort((a, b) => a.position - b.position);\n}\n\n/* -------------------------------- Labels -------------------------------- */\n\n/** \"Chemotherapy started · 2 Sep 2024\" — what the chip says. */\nexport function eventLabel(event: ClinicalEvent, t: TFunction): string {\n return t('anamnesis.event.chip', {\n label: t(`anamnesis.event.label.${event.labelKey}`),\n date: visitDateLabel(event.dateIso, t),\n });\n}\n\n/** Rides the chip as its accessible description: what kind of thing this was,\n * and — when it was not this practice's own decision — who recorded it. */\nexport function eventDetail(event: ClinicalEvent, t: TFunction): string {\n const category = t(`anamnesis.event.category.${event.category}`);\n if (!event.sourceKey) return category;\n return t('anamnesis.event.external', {\n category,\n source: t(`anamnesis.event.source.${event.sourceKey}`),\n });\n}\n\n/** The picked events as sparkline annotations. Every row of the grid is given\n * this SAME array, which is what pins one event to one x down the column. */\nexport function eventAnnotations(\n marks: readonly EventMark[],\n activeIds: ReadonlySet<string>,\n t: TFunction,\n): SparklineAnnotation[] {\n return marks\n .filter((mark) => activeIds.has(mark.event.id))\n .map(({ event, position }) => ({\n id: event.id,\n position,\n label: eventLabel(event, t),\n shape: EVENT_SHAPE[event.category],\n tone: EVENT_TONE,\n }));\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — the event bar above the evolution grid */\n/* */\n/* One row of toggles, one per dated thing that happened to the patient. */\n/* Picking one drops a reference line down every sparkline in the grid at */\n/* the same x, so the reader sees what the measurements did around it. */\n/* Picking none is the arrival state: the grid answers its own question */\n/* first, and the events are the second question. */\n/* */\n/* THREE CHANNELS, NEVER COLOUR ALONE: */\n/* • shape — an AnnotationMarker glyph per category, the same glyph */\n/* capping the line it draws, so chip and line pair up. */\n/* • pressed — `aria-pressed` plus the filled/outline button intent. */\n/* • text — the chip names the event and its date, and a description */\n/* beside it says what kind of thing it was and, when it was */\n/* not this practice's decision, who recorded it. */\n/* */\n/* NO TOOLTIP. The chip's whole hover popup used to be the one-word */\n/* category the marker glyph already carries — a popup that told the */\n/* reader nothing, and unreachable by touch. The same words now ride the */\n/* chip as an `aria-describedby` description, so the detail survives */\n/* without a second surface to open. */\n/* */\n/* Turning a chip ON also routes the host's side panel to that event when */\n/* the host wired one, so the reader lands on what the line means without */\n/* a second control. Turning it OFF only removes the line: navigating away */\n/* from something the reader just dismissed is not what the click meant. */\n/* The description says so when a host is wired — a control that moves the */\n/* reader's eye has to admit it, the same rule the note trigger follows. */\n/* The panel is a READING POSITION, not a mirror of the drawn set: it goes */\n/* on holding the last event asked about after that line is dismissed. */\n/* */\n/* The lines themselves are svg strokes and say nothing aloud, so the bar */\n/* also carries a polite live region naming the picked events — that is */\n/* the screen-reader equivalent of the vertical read. */\n/* -------------------------------------------------------------------- */\n\nimport { Fragment, useId } from 'react';\nimport type { TFunction } from 'i18next';\nimport { AnnotationMarker } from '../../components/annotation-marker';\nimport { Button } from '../../components/button';\nimport {\n EVENT_SHAPE,\n EVENT_TONE,\n eventDetail,\n eventLabel,\n type EventMark,\n} from './anamnesis-events';\n\n/* -------------------------------- Props --------------------------------- */\n\nexport interface AnamnesisEventBarProps {\n /** Events that HAVE a position on the plot, in the order they happened.\n * One with no place on it never reaches here — see `eventMarks`. */\n marks: readonly EventMark[];\n activeIds: ReadonlySet<string>;\n onToggle: (eventId: string) => void;\n t: TFunction;\n}\n\n/* ------------------------------- Component ------------------------------ */\n\nexport function AnamnesisEventBar({\n marks,\n activeIds,\n onToggle,\n t,\n}: AnamnesisEventBarProps) {\n const labelId = useId();\n const detailId = useId();\n // Nothing dated to draw ⇒ no bar. An empty toolbar of controls that cannot\n // do anything is chrome the clinician has to read past.\n if (marks.length === 0) return null;\n\n const active = marks.filter((mark) => activeIds.has(mark.event.id));\n\n return (\n <div\n data-testid=\"anamnesis-event-bar\"\n role=\"group\"\n aria-labelledby={labelId}\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n <span\n id={labelId}\n className=\"type-eyebrow ds:text-[color:var(--muted-foreground)]\"\n >\n {t('anamnesis.event.barLabel')}\n </span>\n {marks.map(({ event }) => {\n const pressed = activeIds.has(event.id);\n return (\n <Fragment key={event.id}>\n <Button\n size=\"sm\"\n intent={pressed ? 'primary' : 'outline'}\n aria-pressed={pressed}\n aria-describedby={`${detailId}-${event.id}`}\n data-testid={`anamnesis-event-chip-${event.id}`}\n startIcon={\n <AnnotationMarker\n shape={EVENT_SHAPE[event.category]}\n tone={EVENT_TONE}\n size=\"sm\"\n />\n }\n // A chip is a pure LINE toggle: pressing it draws or removes\n // the event's reference line and nothing else. OPENING the\n // event's note is the line's own pointer band (and the host's\n // notes-view entry point for keyboard readers) — a toggle that\n // also opened a modal covered the very grid it had just\n // annotated.\n onClick={() => onToggle(event.id)}\n >\n {eventLabel(event, t)}\n </Button>\n {/* The category (and the outside source, where there is one) in\n words. The chip only toggles the line, so the description\n never claims a navigation it no longer performs. */}\n <span id={`${detailId}-${event.id}`} className=\"ds:sr-only\">\n {eventDetail(event, t)}\n </span>\n </Fragment>\n );\n })}\n {/* The vertical read, in words. Polite so it follows the click rather\n than interrupting it. */}\n <p className=\"ds:sr-only\" aria-live=\"polite\">\n {active.length === 0\n ? t('anamnesis.event.noneShown')\n : t('anamnesis.event.shown', {\n list: active\n .map(({ event }) => eventLabel(event, t))\n .join(t('anamnesis.event.separator')),\n })}\n </p>\n </div>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — the notes bound to one visit */\n/* */\n/* What happened at THIS check-up, read where the check-up is: a note */\n/* affordance in the evolution grid's visit-column header. The trigger */\n/* exists only when the visit actually carries a note, so a column with */\n/* nothing to say shows no dead button. Both free-text fields the visit */\n/* already holds are read together — the clinical note (what was observed) */\n/* first, the nutritional proposal (what was decided) second. */\n/* */\n/* A note recorded at a visit the reader has not picked in the visit */\n/* multi-select is reached by picking that visit — the selection is explicit, */\n/* so nothing is hidden behind a column that is not there. */\n/* */\n/* WHERE THE NOTE OPENS depends on whether the host has a side panel: */\n/* • host wired (`onOpenNote`) — the trigger hands the visit id OUT and */\n/* the host's panel navigates to it. One place notes live, so the grid */\n/* does not carry a second copy of the reading surface. */\n/* • no host — the trigger opens the note in place. This is the only way */\n/* a standalone anamnesis can read a past visit's note at all, and only */\n/* ONE of the two branches ever renders, so nothing is duplicated. */\n/* */\n/* Clinician-only: the `visit.note` row in anamnesis-disclosure.ts. */\n/* -------------------------------------------------------------------- */\n\nimport type { TFunction } from 'i18next';\nimport { NotebookPen } from 'lucide-react';\nimport { DescriptionList } from '../../components/description-list';\nimport { IconButton } from '../../components/icon-button';\nimport { Popover } from '../../components/popover';\nimport { Timestamp } from '../../components/timestamp';\nimport { calendarFormatFor, type TextField } from './anamnesis-derive';\nimport { visitDateLabel } from './anamnesis-format';\nimport type { OpenAnamnesisNote, Visit } from './anamnesis-types';\n\n/* -------------------------------- Model --------------------------------- */\n\n/** One free-text note recorded at a visit. */\nexport interface VisitNote {\n field: TextField;\n text: string;\n}\n\n/** Reading order: what was observed, then what was proposed. */\nconst NOTE_FIELDS: readonly TextField[] = [\n 'clinicalNotes',\n 'nutritionalProposal',\n];\n\n/** The visit's notes, blank ones dropped. Whitespace-only text is not a note —\n * an empty string would otherwise open a popover onto nothing. */\nexport function visitNotes(visit: Visit): VisitNote[] {\n return NOTE_FIELDS.flatMap((field) => {\n const text = visit[field]?.trim();\n return text ? [{ field, text }] : [];\n });\n}\n\n/** Whether this visit has anything to read. Drives the trigger's existence. */\nexport function hasVisitNotes(visit: Visit): boolean {\n return visitNotes(visit).length > 0;\n}\n\n/* ----------------------------- Shared body ------------------------------ */\n\n/** One visit's notes as a term↔detail list, under the same labels the compile\n * form uses. Exported so a HOST side panel renders the note the same way the\n * in-place fallback does — one definition of what a note looks like. */\nexport function AnamnesisVisitNoteList({\n visit,\n t,\n}: {\n visit: Visit;\n t: TFunction;\n}) {\n return (\n <DescriptionList layout=\"stacked\" divider=\"between\">\n {visitNotes(visit).map((note) => (\n <DescriptionList.Row key={note.field}>\n <DescriptionList.Term>\n {t(`anamnesis.field.${note.field}.label`)}\n </DescriptionList.Term>\n <DescriptionList.Detail>\n <span className=\"ds:block ds:break-words ds:whitespace-pre-line\">\n {note.text}\n </span>\n </DescriptionList.Detail>\n </DescriptionList.Row>\n ))}\n </DescriptionList>\n );\n}\n\n/** The scroll region every note panel puts its body in. A long note scrolls\n * inside the popover rather than growing past the viewport, and the region\n * takes a tab stop so a keyboard user can reach the scrollbar. */\nconst NOTE_SCROLL_CLASS =\n 'ds:mt-[var(--spacing-md)] ds:max-h-[min(20rem,var(--radix-popover-content-available-height))] ds:overflow-y-auto ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]';\n\n/* -------------------------------- Props --------------------------------- */\n\nexport interface AnamnesisVisitNoteProps {\n visit: Visit;\n t: TFunction;\n /** Render already open. Chromatic never runs play functions, so the story\n * that snapshots the note has to mount it open. Ignored when `onOpenNote`\n * is wired — the host owns the panel and its open state. */\n defaultOpen?: boolean;\n /** The host's side panel. Supplied ⇒ the trigger routes there instead of\n * opening a popover; omitted ⇒ it opens the note in place. Wiring it obliges\n * the host to render a panel AND to move focus to or announce the addressed\n * note — see `OpenAnamnesisNote`. */\n onOpenNote?: OpenAnamnesisNote;\n}\n\n/* ------------------------------- Component ------------------------------ */\n\nexport function AnamnesisVisitNote({\n visit,\n t,\n defaultOpen = false,\n onOpenNote,\n}: AnamnesisVisitNoteProps) {\n const notes = visitNotes(visit);\n if (notes.length === 0) return null;\n\n const visitTypeLabel = t(`anamnesis.visitType.${visit.visitType}`);\n const dateLabel = visitDateLabel(visit.dateIso, t);\n // Names the visit, not just \"Notes\": in a grid of columns the reader has to\n // know which check-up the note belongs to before opening it. The routed name\n // also says WHERE it opens, because the answer arrives off to the side.\n const triggerLabel = t(\n onOpenNote\n ? 'anamnesis.visitNote.openInPanel'\n : 'anamnesis.visitNote.trigger',\n { visitType: visitTypeLabel, date: dateLabel },\n );\n\n if (onOpenNote) {\n return (\n <IconButton\n icon={<NotebookPen aria-hidden=\"true\" />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={triggerLabel}\n data-testid={`anamnesis-visit-note-trigger-${visit.id}`}\n onClick={() => onOpenNote({ kind: 'visit', visitId: visit.id })}\n />\n );\n }\n\n return (\n <Popover defaultOpen={defaultOpen}>\n <Popover.Trigger asChild>\n <IconButton\n icon={<NotebookPen aria-hidden=\"true\" />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={triggerLabel}\n data-testid={`anamnesis-visit-note-trigger-${visit.id}`}\n />\n </Popover.Trigger>\n <Popover.Content\n size=\"lg\"\n align=\"start\"\n data-testid={`anamnesis-visit-note-panel-${visit.id}`}\n // Mounted-open is a demo state, not a user action: stealing focus there\n // would scroll the docs page to the canvas on load.\n onOpenAutoFocus={\n defaultOpen ? (event) => event.preventDefault() : undefined\n }\n >\n <Popover.Close />\n <Popover.Heading>{t('anamnesis.visitNote.title')}</Popover.Heading>\n <Popover.Description>\n {visitTypeLabel}\n {' · '}\n <Timestamp\n value={visit.dateIso}\n format=\"absolute\"\n shape=\"bare\"\n absoluteFormat={calendarFormatFor(visit.dateIso)}\n />\n {visit.practitioner ? (\n <>\n {' · '}\n <span className=\"ds:break-words\">{visit.practitioner}</span>\n </>\n ) : null}\n </Popover.Description>\n <div\n /* eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- a long note scrolls inside the popover; axe scrollable-region-focusable needs the tab stop */\n tabIndex={0}\n role=\"group\"\n aria-label={t('anamnesis.visitNote.title')}\n className={NOTE_SCROLL_CLASS}\n >\n <AnamnesisVisitNoteList visit={visit} t={t} />\n </div>\n </Popover.Content>\n </Popover>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — the across-visits matrix shell */\n/* */\n/* ONE definition of the shape both across-visits reads wear: the */\n/* evolution grid and the compare panel below it. COLUMN ORDER LIVES HERE */\n/* AND NOWHERE ELSE — */\n/* identity → the first compared visit → the trend sparkline → */\n/* every remaining visit → an optional trailing column. */\n/* Two surfaces re-deriving that order is exactly how they drift apart, */\n/* and the customer reads them one under the other. */\n/* */\n/* The shell owns the scroll region and its tab stop, the sticky edges, */\n/* the caption and the group banners. Each surface supplies its own */\n/* <th>/<td> ELEMENTS, because what a cell holds differs (an editable */\n/* input here, a diff value there) while where it sits must not. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\nimport type { ReactNode } from 'react';\nimport type { TFunction } from 'i18next';\nimport { Badge } from '../../components/badge';\nimport { Timestamp } from '../../components/timestamp';\nimport { calendarFormatFor } from './anamnesis-derive';\nimport type { OpenAnamnesisNote, Visit } from './anamnesis-types';\nimport { AnamnesisVisitNote } from './anamnesis-visit-note';\nimport type { VisitColumn } from './anamnesis-window';\n\n/* -------------------------------- Sizing -------------------------------- */\n\n/** Static class literals — Tailwind has to see every arbitrary value at build\n * time, and a class built by interpolation emits no CSS at all. */\n/** Floored at the longest parameter label + its unit and reference range on\n * ONE line — measured across en / ar / ja under `.theme-accessible`, whose\n * larger type is the widest case (ja \"HDLコレステロール\", 147px + 16px of cell\n * padding). Below that the label wraps and the cell goes to three lines. */\nexport const MATRIX_IDENTITY_CLASS = 'ds:min-w-[11rem]';\n/** Floored by the editable cell, not by the number it shows: `NumberInput`\n * spends 56px on its two spinners and 16px on input padding before a digit is\n * drawn, so 128px of column is 40px of readable value. It cannot go lower. */\nexport const MATRIX_VISIT_COLUMN_CLASS = 'ds:min-w-[8rem]';\n/**\n * A PERCENTAGE, not a rem cap — that is what redirects the spare pixels.\n *\n * Under `table-layout: auto` the spare width of a table narrower than its\n * container goes to whichever columns declare no width, and `max-width` on a\n * table cell is only honoured while some other column is left to absorb. The\n * old `w-[9rem] max-w-[10rem]` therefore pinned the trend at 160px and handed\n * everything else to the identity and value columns — 325px and 443px of\n * mostly whitespace at 1440px wide. Claiming a share instead inverts that.\n * When the table DOES overflow, the percentage stops applying and the\n * min-width is what the trend gets.\n */\nexport const MATRIX_TREND_COLUMN_CLASS = 'ds:w-[40%] ds:min-w-[14rem]';\n\nconst IDENTITY_HEADER_CLASS =\n 'type-label ds:sticky ds:start-0 ds:top-0 ds:z-[3] ds:bg-[color:var(--card)] ds:px-[var(--spacing-sm)] ds:py-[var(--spacing-sm)] ds:text-start ds:shadow-[var(--shadow-chrome-end)]';\nconst COLUMN_HEADER_CLASS =\n 'ds:sticky ds:top-0 ds:z-[2] ds:px-[var(--spacing-sm)] ds:py-[var(--spacing-sm)] ds:text-start ds:shadow-[var(--shadow-chrome-down)]';\n/** The trailing column mirrors the identity column on the opposite edge: it\n * carries the answer, and horizontal scroll must not be what takes it away. */\nconst TRAILING_HEADER_CLASS =\n 'type-label ds:sticky ds:end-0 ds:top-0 ds:z-[3] ds:bg-[color:var(--card)] ds:px-[var(--spacing-sm)] ds:py-[var(--spacing-sm)] ds:text-start ds:shadow-[var(--shadow-chrome-start)]';\n\n/** Apply to every `<td>` a surface hands to `trailing`, so the column sticks\n * as one piece rather than only in its header. */\nexport const MATRIX_TRAILING_CELL_CLASS =\n 'ds:sticky ds:end-0 ds:z-[1] ds:bg-[color:var(--card)] ds:shadow-[var(--shadow-chrome-start)]';\n\n/** Every body cell in a value column. Exported so both surfaces open from the\n * same padding / alignment rather than each picking its own. */\nexport const MATRIX_CELL_CLASS =\n 'ds:px-[var(--spacing-sm)] ds:py-[var(--spacing-xs)] ds:align-top';\n\n/* ----------------------------- Visit header ----------------------------- */\n\nexport interface MatrixVisitHeaderProps {\n column: VisitColumn;\n t: TFunction;\n /** Muted fill — the column is one of the compared pair/set. */\n emphasised?: boolean;\n /** Adds the \"Editable\" chip; compile mode's newest column only. */\n editable?: boolean;\n /** Render this visit's note popover already open (demo hook). */\n defaultOpenNoteVisitId?: string;\n /** Offer the note affordance. The compare panel sets this `false`: its\n * columns repeat the grid's, and two note triggers with the same accessible\n * name on one screen is a control the reader has to disambiguate. */\n withNote?: boolean;\n /** Route the note to the host's side panel instead of opening it in place. */\n onOpenNote?: OpenAnamnesisNote;\n /** The first visits this column merges, oldest first. Set only on the\n * synthetic baseline column: the header then lists them instead of one\n * date, and offers no note trigger (there is no single visit to open). */\n mergedFrom?: readonly Visit[];\n}\n\n/** One visit's `<th scope=\"col\">`, identical wherever the visit is a column. */\nexport function MatrixVisitHeader({\n column,\n t,\n emphasised = false,\n editable = false,\n defaultOpenNoteVisitId,\n withNote = true,\n onOpenNote,\n mergedFrom,\n}: MatrixVisitHeaderProps) {\n const { visit } = column;\n const headerClass = [\n MATRIX_VISIT_COLUMN_CLASS,\n COLUMN_HEADER_CLASS,\n emphasised ? 'ds:bg-[color:var(--muted)]' : 'ds:bg-[color:var(--card)]',\n ].join(' ');\n\n if (mergedFrom) {\n return (\n <th\n scope=\"col\"\n data-testid=\"anamnesis-baseline-header\"\n className={headerClass}\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <span className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <Badge variant=\"brand\" size=\"sm\">\n {t('anamnesis.visitType.first')}\n </Badge>\n {editable ? (\n <Badge variant=\"accentSoft\" size=\"sm\">\n {t('anamnesis.grid.editable')}\n </Badge>\n ) : null}\n </span>\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.grid.baselineMerged', { total: mergedFrom.length })}\n </span>\n {/* One line per merged module, oldest first — the same Timestamp\n the real columns use, so dates format identically across. */}\n {mergedFrom.map((source) => (\n <span\n key={source.id}\n data-testid={`anamnesis-baseline-source-${source.id}`}\n className=\"type-meta ds:text-[color:var(--muted-foreground)]\"\n >\n {source.sourceLabel ? (\n <>\n {source.sourceLabel}\n {' · '}\n </>\n ) : null}\n <Timestamp\n value={source.dateIso}\n format=\"absolute\"\n shape=\"bare\"\n absoluteFormat={calendarFormatFor(source.dateIso)}\n />\n </span>\n ))}\n </div>\n </th>\n );\n }\n\n return (\n <th scope=\"col\" className={headerClass}>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n {/* The note sits at the column's top-end corner in every column that\n has one, so it scans across at one glance. It renders nothing\n when the visit carries no note. */}\n <span className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-label ds:text-[color:var(--foreground)]\">\n {/* A visit stamped with a time shows it: two interviews of one\n module on the same day are two columns, told apart here. */}\n <Timestamp\n value={visit.dateIso}\n format=\"absolute\"\n shape=\"bare\"\n absoluteFormat={calendarFormatFor(visit.dateIso)}\n />\n </span>\n {withNote ? (\n <AnamnesisVisitNote\n visit={visit}\n t={t}\n defaultOpen={visit.id === defaultOpenNoteVisitId}\n onOpenNote={onOpenNote}\n />\n ) : null}\n </span>\n {visit.sourceLabel ? (\n <span\n data-testid={`anamnesis-visit-source-${visit.id}`}\n className=\"type-meta ds:text-[color:var(--muted-foreground)]\"\n >\n {visit.sourceLabel}\n </span>\n ) : null}\n <span className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <Badge\n variant={visit.visitType === 'first' ? 'brand' : 'neutral'}\n size=\"sm\"\n >\n {t(`anamnesis.visitType.${visit.visitType}`)}\n </Badge>\n {editable ? (\n <Badge variant=\"accentSoft\" size=\"sm\">\n {t('anamnesis.grid.editable')}\n </Badge>\n ) : null}\n </span>\n </div>\n </th>\n );\n}\n\n/* --------------------------------- Rows --------------------------------- */\n\nexport interface MatrixRowSpec {\n key: string;\n /** Full-width group banner. When set, every other field is ignored. */\n banner?: string;\n /** The row's `<th scope=\"row\">` element. */\n header?: ReactNode;\n /** One `<td>` per visit column, in column order. */\n cells?: readonly ReactNode[];\n /** The `<td>` under the trend column. */\n trend?: ReactNode;\n /** The `<td>` under the trailing column, where the table declares one. */\n trailing?: ReactNode;\n}\n\n/* -------------------------------- Props --------------------------------- */\n\nexport interface AnamnesisMatrixProps {\n captionId: string;\n /** Screen-reader caption naming what the table holds. */\n caption: string;\n /** Header of the sticky identity column. */\n identityLabel: string;\n /** Header of the trend column. */\n trendLabel: string;\n /** Test hook on the trend header. Only one matrix on screen may claim it,\n * so the grid takes it and the compare panel below goes without. */\n trendTestId?: string;\n /** One `<th scope=\"col\">` per visit column — build them with\n * `MatrixVisitHeader` so the two surfaces cannot disagree. */\n visitHeaders: readonly ReactNode[];\n /** Header of a column rendered after every visit. Omitted = no such column. */\n trailingLabel?: string;\n /** Test hook on the trailing header — the surface names it, not the shell. */\n trailingTestId?: string;\n rows: readonly MatrixRowSpec[];\n /** Draw the outer border + surface. `false` inside a card, to avoid a\n * box-in-a-box. */\n framed?: boolean;\n testId?: string;\n}\n\n/* ------------------------------- Component ------------------------------ */\n\nexport function AnamnesisMatrix({\n captionId,\n caption,\n identityLabel,\n trendLabel,\n trendTestId,\n visitHeaders,\n trailingLabel,\n trailingTestId,\n rows,\n framed = true,\n testId,\n}: AnamnesisMatrixProps) {\n // Identity + trend + every visit + the optional trailing column. The group\n // banner spans all of them, so it must be counted here rather than guessed.\n const columnCount = visitHeaders.length + 2 + (trailingLabel ? 1 : 0);\n\n return (\n <div\n /* eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- horizontal-scroll comparison grid needs a keyboard tab stop (axe scrollable-region-focusable); the semantic table is the accessible source of truth */\n tabIndex={0}\n role=\"group\"\n aria-labelledby={captionId}\n data-testid={testId}\n className={[\n 'ds:w-full ds:overflow-x-auto ds:outline-none ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n framed\n ? 'ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--border)] ds:bg-[color:var(--card)]'\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <table className=\"ds:w-full ds:border-collapse\">\n <caption id={captionId} className=\"ds:sr-only\">\n {caption}\n </caption>\n <thead>\n <tr>\n {/* Top-start corner — sticky on both axes, highest layer */}\n <th\n scope=\"col\"\n className={`${MATRIX_IDENTITY_CLASS} ${IDENTITY_HEADER_CLASS}`}\n >\n {identityLabel}\n </th>\n {visitHeaders[0]}\n <th\n scope=\"col\"\n data-testid={trendTestId}\n className={[\n MATRIX_TREND_COLUMN_CLASS,\n 'type-label ds:bg-[color:var(--card)]',\n COLUMN_HEADER_CLASS,\n ].join(' ')}\n >\n {trendLabel}\n </th>\n {visitHeaders.slice(1)}\n {trailingLabel ? (\n <th\n scope=\"col\"\n data-testid={trailingTestId}\n className={`${MATRIX_VISIT_COLUMN_CLASS} ${TRAILING_HEADER_CLASS}`}\n >\n {trailingLabel}\n </th>\n ) : null}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) =>\n row.banner != null ? (\n <tr key={row.key} className=\"ds:bg-[color:var(--muted)]\">\n {/* Full-width section banner heading the rows below it;\n `scope` is intentionally omitted (it heads rows, not a\n column). */}\n {/* No sticky: the cell already spans the whole table, so\n pinning it moves nothing and only risks a see-through\n layer over scrolled content. */}\n <th\n colSpan={columnCount}\n className=\"type-eyebrow ds:px-[var(--spacing-sm)] ds:py-[var(--spacing-2xs)] ds:text-start ds:text-[color:var(--muted-foreground)]\"\n >\n {row.banner}\n </th>\n </tr>\n ) : (\n <tr key={row.key}>\n {row.header}\n {row.cells?.[0]}\n {row.trend}\n {row.cells?.slice(1)}\n {row.trailing}\n </tr>\n ),\n )}\n </tbody>\n </table>\n </div>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — visit window (which visit columns are rendered) */\n/* */\n/* The comparison IS the grid: the picker lists every visit and opens with */\n/* ALL of them ticked, so every column and every adjacent delta is on */\n/* screen on arrival. Un-ticking a visit removes its column — the reader */\n/* narrows the history, never widens it. */\n/* */\n/* Nothing stands in for an un-ticked visit: the omission is the reader's */\n/* own choice, so a column naming it would be noise. */\n/* */\n/* Pure: no i18n, no JSX, no React. It filters RENDERED COLUMNS only, */\n/* never the maths. `buildParameterRows` always runs over the full */\n/* `record.visits`, so a cell's delta never depends on the selection. */\n/* Visits are read in ARRAY ORDER and never re-sorted, for the same */\n/* reason. */\n/* */\n/* The merged first-visit baseline is pinned through `alwaysShowIds`: it */\n/* renders in every window and is never counted as shown or hidden. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\nimport type { Visit } from './anamnesis-types';\n\n/* -------------------------------- Columns ------------------------------- */\n\n/** One rendered column. `index` is the position in the FULL visit array, so\n * the grid still reads the cell whose delta was computed there. */\nexport interface VisitColumn {\n key: string;\n visit: Visit;\n index: number;\n}\n\nexport interface VisitWindow {\n columns: VisitColumn[];\n shownCount: number;\n totalCount: number;\n hiddenCount: number;\n /** First / last date among the SHOWN columns, in record order (never\n * re-sorted). Null when nothing is shown. */\n firstIso: string | null;\n lastIso: string | null;\n}\n\nexport interface VisitWindowOptions {\n /** Ids rendered in every window and EXCLUDED from the counts — the merged\n * baseline. \"Showing N of M\" counts only what the picker can toggle. */\n alwaysShowIds?: Iterable<string>;\n}\n\n/* --------------------------------- API ---------------------------------- */\n\n/** The selection the picker opens on: every visit, in record order. Empty\n * on an empty record. Also the export's fallback when a host passed no\n * selection, so a file with no mirrored picker matches the on-screen default. */\nexport function defaultSelectedVisitIds(visits: readonly Visit[]): string[] {\n return visits.map((v) => v.id);\n}\n\n/** Resolve which visit columns render, in RECORD order — never in the order\n * the reader happened to tick them. Safe on an empty record, a single-visit\n * record, same-date visits and out-of-order visits. */\nexport function windowVisits(\n visits: readonly Visit[],\n selectedIds: Iterable<string>,\n options: VisitWindowOptions = {},\n): VisitWindow {\n const pinned = new Set<string>(options.alwaysShowIds ?? []);\n const shown = new Set<string>(selectedIds);\n for (const id of pinned) shown.add(id);\n\n const columns: VisitColumn[] = [];\n visits.forEach((visit, index) => {\n if (shown.has(visit.id)) columns.push({ key: visit.id, visit, index });\n });\n\n // A pinned column is neither shown-by-choice nor hidden, so it drops out of\n // every count and the readout says only what the reader can change.\n const pinnedShown = columns.filter((c) => pinned.has(c.visit.id)).length;\n const pinnedTotal = visits.filter((v) => pinned.has(v.id)).length;\n const shownCount = columns.length - pinnedShown;\n const totalCount = visits.length - pinnedTotal;\n\n return {\n columns,\n shownCount,\n totalCount,\n hiddenCount: totalCount - shownCount,\n firstIso: columns[0]?.visit.dateIso ?? null,\n lastIso: columns[columns.length - 1]?.visit.dateIso ?? null,\n };\n}\n\n/** Every visit as its own column — the unwindowed default. */\nexport function allVisitColumns(visits: readonly Visit[]): VisitColumn[] {\n return windowVisits(visits, defaultSelectedVisitIds(visits)).columns;\n}\n\n/** Whether the picker has more than one visit to offer. With one visit it is\n * chrome the clinician has to read and cannot use, so the toolbar leaves it\n * out entirely. */\nexport function visitPickerIsUseful(visits: readonly Visit[]): boolean {\n return visits.length >= 2;\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — evolution grid (the Excel replacement) */\n/* */\n/* The parameters-as-rows, visits-as-columns matrix, modernised. A real */\n/* semantic <table> inside a keyboard-focusable horizontal-scroll region */\n/* (axe scrollable-region-focusable). The parameter column is sticky on the */\n/* INLINE-START edge (flips correctly under RTL — logical, not \"left\"), the */\n/* visit-header row is sticky on the block-start edge; both use opaque */\n/* surface tokens + the chrome-divider shadows so scrolled cells are */\n/* occluded. Each cell shows the value, an out-of-range flag, and the */\n/* direction-aware delta vs the previous visit. The newest visit column is */\n/* editable; older columns are read-only. */\n/* */\n/* COLUMN ORDER, and nothing may be inserted into it: */\n/* parameter identity → the first picked visit → the trend sparkline → */\n/* every remaining picked visit. */\n/* The baseline value sits beside the parameter it belongs to, and the */\n/* sparkline reads as the bridge from it to the columns that follow. */\n/* */\n/* A visit-column header carries the note affordance for that visit, when — */\n/* and only when — that visit has a note to read. A note recorded at a visit */\n/* the reader has not picked is reached by picking that visit. */\n/* */\n/* Columns are supplied by the visit window, which by default renders every */\n/* visit. A delta is drawn only where the column before it on screen IS the */\n/* visit it was measured against — un-ticking a visit hides the chip after it. */\n/* -------------------------------------------------------------------- */\n\nimport { useId } from 'react';\nimport type { TFunction } from 'i18next';\nimport { NumberInput } from '../../components/number-input';\nimport { isBaselineVisit } from './anamnesis-baseline';\nimport { EmptyState } from '../../components/empty-state';\nimport type { SparklineAnnotation } from '../../components/sparkline';\nimport {\n buildParameterRows,\n formatValue,\n type ParameterCell,\n type ParameterRow,\n} from './anamnesis-derive';\nimport { localeOf, parameterLabel } from './anamnesis-format';\nimport {\n DeltaIndicator,\n OutOfRangeBadge,\n TrendSparkline,\n} from './anamnesis-indicators';\nimport {\n AnamnesisMatrix,\n MATRIX_CELL_CLASS,\n MATRIX_IDENTITY_CLASS,\n MATRIX_TREND_COLUMN_CLASS,\n MATRIX_VISIT_COLUMN_CLASS,\n MatrixVisitHeader,\n type MatrixRowSpec,\n} from './anamnesis-matrix';\nimport { allVisitColumns, type VisitColumn } from './anamnesis-window';\nimport type {\n AnamnesisRecord,\n NumericParameterDef,\n OpenAnamnesisNote,\n Visit,\n} from './anamnesis-types';\n\n/* -------------------------------- Sizing -------------------------------- */\n\n/** Stand-in for a column whose cell was never computed — a caller can pass\n * columns resolved against a different record. Reads as \"not measured\" rather\n * than throwing on `undefined.value`. */\nconst UNMEASURED_CELL: ParameterCell = {\n visitId: '',\n value: null,\n outOfRange: null,\n delta: null,\n};\n\n/* ------------------------------- Helpers -------------------------------- */\n\n/** A delta was measured against the immediately preceding visit in the record.\n * It may only be drawn where that visit is the column before it on screen —\n * otherwise the chip reads as the change across everything left out. */\nfunction deltaIsLegible(columns: readonly VisitColumn[], at: number): boolean {\n const column = columns[at];\n const previous = columns[at - 1];\n if (!previous) return column.index === 0;\n return previous.index === column.index - 1;\n}\n\n/** A reference bound at its own precision — \"18.5\", never \"18.50\" or \"19\" —\n * in the app locale, like every figure in the cells beside it. */\nfunction formatBound(bound: number, locale: string | undefined): string {\n const decimals = (String(bound).split('.')[1] ?? '').length;\n return formatValue(bound, Math.min(decimals, 3), locale);\n}\n\nfunction formatRange(\n range: NumericParameterDef['referenceRange'],\n t: TFunction,\n locale: string | undefined,\n): string | null {\n if (!range) return null;\n if (range.min != null && range.max != null)\n return `${formatBound(range.min, locale)}–${formatBound(range.max, locale)}`;\n if (range.max != null)\n return t('anamnesis.range.atMost', {\n value: formatBound(range.max, locale),\n });\n if (range.min != null)\n return t('anamnesis.range.atLeast', {\n value: formatBound(range.min, locale),\n });\n return null;\n}\n\n/* -------------------------------- Props --------------------------------- */\n\nexport interface AnamnesisEvolutionGridProps {\n record: AnamnesisRecord;\n defs: NumericParameterDef[];\n t: TFunction;\n /** Make the newest visit column editable (compile mode). */\n editable?: boolean;\n /** The visit whose column takes the inputs, by id. Omitted = the record's\n * last visit. The evolution section sets it from the REAL record: on the\n * merged view the last position need not be the visit being compiled. */\n editableVisitId?: string;\n onCellChange?: (\n visit: Visit,\n def: NumericParameterDef,\n value: number | null,\n ) => void;\n /** Draw the outer border + surface (standalone use). Set `false` when the\n * grid already sits inside a card, to avoid a box-in-a-box. */\n framed?: boolean;\n /** Mount this visit's note popover already open. Demo/story hook only —\n * Chromatic skips play functions, so a click-opened popover is never\n * snapshotted. Ignored once `onOpenNote` is wired. */\n defaultOpenNoteVisitId?: string;\n /** Route a visit's note to the host's side panel instead of opening it in\n * place. Omitted = read in place, which is all a standalone grid can do. */\n onOpenNote?: OpenAnamnesisNote;\n /** Which columns render, from the visit window. Omitted = every visit.\n * Column order and `index` always follow `record.visits`; the window\n * changes what is SHOWN, never what was computed. */\n visitColumns?: readonly VisitColumn[];\n /** Keys the practice still captures. A key outside this set renders its\n * history read-only: archiving stops capture, it never erases the record.\n * Omitted = every def is capturable. */\n capturableKeys?: ReadonlySet<string>;\n /** Event reference lines, positioned as a fraction of the record's visit\n * span. Every row gets this SAME array, which is what makes one event one\n * vertical line down the whole grid rather than one line per row. */\n annotations?: readonly SparklineAnnotation[];\n /** Make those lines pointer-selectable — pressing one is pressing the\n * event's chip in the bar above. Omitted = the lines stay decorative, which\n * is all a grid with no event bar above it can honestly offer. */\n onSelectAnnotation?: (eventId: string) => void;\n /** The first visits the leftmost column merges, oldest first; the header\n * lists them. Omitted = no column is synthetic. */\n baselineSources?: readonly Visit[];\n /** Insert the parameter-group banner rows. `false` when the caller has\n * already headed the table — a per-source block names its module above\n * it, and \"Blood tests\" over a questionnaire's water question misleads. */\n groupBanners?: boolean;\n /** The table's caption. A per-source block names its module here so N\n * tables on one page do not share one accessible name. */\n caption?: string;\n}\n\n/* ------------------------------- Component ------------------------------ */\n\nexport function AnamnesisEvolutionGrid({\n record,\n defs,\n t,\n editable = false,\n editableVisitId,\n onCellChange,\n framed = true,\n defaultOpenNoteVisitId,\n onOpenNote,\n visitColumns,\n capturableKeys,\n annotations,\n onSelectAnnotation,\n baselineSources,\n groupBanners = true,\n caption,\n}: AnamnesisEvolutionGridProps) {\n const captionId = useId();\n const locale = localeOf(t);\n const rows = buildParameterRows(record, defs);\n const visits = record.visits;\n const editableId = editableVisitId ?? visits[visits.length - 1]?.id;\n const columns = visitColumns ?? allVisitColumns(visits);\n\n // Insert a group-heading row whenever the parameter group changes.\n const renderedRows: MatrixRowSpec[] = [];\n let lastGroup: string | null = null;\n\n rows.forEach((row: ParameterRow) => {\n if (groupBanners && row.def.group !== lastGroup) {\n lastGroup = row.def.group;\n renderedRows.push({\n key: `group-${row.def.group}`,\n banner: t(`anamnesis.group.${row.def.group}`),\n });\n }\n\n const rangeText = formatRange(row.def.referenceRange, t, locale);\n\n // One <td> per rendered column, built in column order; the trend cell is\n // spliced in after the first of them below.\n const valueCells = columns.map((column, columnIndex) => {\n const { visit, index } = column;\n const cell = row.cells[index] ?? UNMEASURED_CELL;\n // Identity, not position: the merged view folds first visits away, so\n // the last column can be an older visit than the one being compiled.\n // The synthetic baseline is nobody's visit and never takes an input.\n const isEditableVisit =\n visit.id === editableId && !isBaselineVisit(visit);\n const capturable =\n capturableKeys == null || capturableKeys.has(row.def.key);\n const editableCell =\n editable && isEditableVisit && capturable && !row.def.computed;\n const deltaHidden = !deltaIsLegible(columns, columnIndex);\n return (\n <td\n key={column.key}\n className={[\n MATRIX_VISIT_COLUMN_CLASS,\n MATRIX_CELL_CLASS,\n 'ds:tabular-nums',\n ].join(' ')}\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n {editableCell ? (\n <NumberInput\n size=\"sm\"\n value={cell.value}\n mode={(row.def.precision ?? 0) > 0 ? 'decimal' : 'integer'}\n aria-label={t('anamnesis.grid.editCell', {\n parameter: parameterLabel(row.def, t),\n })}\n onChange={(next) => onCellChange?.(visit, row.def, next)}\n />\n ) : (\n <span className=\"type-body-sm ds:font-[var(--font-weight-medium)] ds:text-[color:var(--foreground)]\">\n {formatValue(cell.value, row.def.precision, locale)}\n </span>\n )}\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-2xs)]\">\n {cell.outOfRange ? (\n <OutOfRangeBadge flag={cell.outOfRange} t={t} compact />\n ) : null}\n {deltaHidden ? null : (\n <DeltaIndicator delta={cell.delta} def={row.def} t={t} />\n )}\n </div>\n </div>\n </td>\n );\n });\n\n renderedRows.push({\n key: row.def.key,\n // Sticky parameter column (inline-start). The shell splices the trend\n // in after the first value cell — the order is not decided here.\n header: (\n <th\n scope=\"row\"\n className={`${MATRIX_IDENTITY_CLASS} ds:sticky ds:start-0 ds:z-[1] ds:bg-[color:var(--card)] ds:text-start ds:shadow-[var(--shadow-chrome-end)] ${MATRIX_CELL_CLASS}`}\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-label ds:text-[color:var(--foreground)]\">\n {parameterLabel(row.def, t)}\n </span>\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {row.def.unit}\n {rangeText ? (\n <>\n {' · '}\n {rangeText}\n </>\n ) : null}\n </span>\n {row.target != null ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.grid.target', {\n value: formatValue(row.target, row.def.precision, locale),\n unit: row.def.unit ?? '',\n })}\n </span>\n ) : null}\n </div>\n </th>\n ),\n cells: valueCells,\n trend: (\n <td className={`${MATRIX_TREND_COLUMN_CLASS} ${MATRIX_CELL_CLASS}`}>\n <TrendSparkline\n series={row.series}\n def={row.def}\n t={t}\n annotations={annotations}\n onSelectAnnotation={onSelectAnnotation}\n />\n </td>\n ),\n });\n });\n\n // A practice can configure its parameter list down to nothing. A table of\n // headers with no rows is a blank box, not a grid — say what is missing.\n if (rows.length === 0) {\n return (\n <div\n className=\"ds:w-full\"\n data-testid=\"anamnesis-evolution-no-parameters\"\n >\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={t('anamnesis.empty.noParameters.title')}\n description={t('anamnesis.empty.noParameters.description')}\n />\n </div>\n );\n }\n\n const visitHeaders = columns.map((column) => (\n <MatrixVisitHeader\n key={column.key}\n column={column}\n t={t}\n editable={\n editable &&\n column.visit.id === editableId &&\n !isBaselineVisit(column.visit)\n }\n defaultOpenNoteVisitId={defaultOpenNoteVisitId}\n onOpenNote={onOpenNote}\n mergedFrom={isBaselineVisit(column.visit) ? baselineSources : undefined}\n />\n ));\n\n return (\n <AnamnesisMatrix\n captionId={captionId}\n caption={caption ?? t('anamnesis.grid.caption')}\n identityLabel={t('anamnesis.grid.parameter')}\n trendLabel={t('anamnesis.grid.trend')}\n trendTestId=\"anamnesis-grid-trend\"\n visitHeaders={visitHeaders}\n rows={renderedRows}\n framed={framed}\n />\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — visits grouped by source (one table per module) */\n/* */\n/* In the platform a visit is one interview of one anamnesis MODULE, and */\n/* modules ask different questions: a pre-visit questionnaire asks how */\n/* much water the patient drinks, a blood-test module asks for glucose. */\n/* Values from different modules cannot share a column set — one grid */\n/* over every visit shows dashes wherever a module never asked, and */\n/* compares numbers that were never meant to sit side by side. */\n/* */\n/* This groups a record's visits by `sourceLabel` so the trend can draw */\n/* one table per module, each holding only that module's visits and only */\n/* the parameters that module ever measured. */\n/* */\n/* Pure: no i18n, no JSX, no React. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\nimport { visitSortKey } from './anamnesis-baseline';\nimport { parameterValueAt } from './anamnesis-derive';\nimport type { NumericParameterDef, Visit } from './anamnesis-types';\n\n/** Key of the block holding visits with no `sourceLabel`. */\nexport const UNLABELLED_BLOCK_KEY = 'unlabelled';\n\n/** Key of the single block the un-partitioned surface renders. */\nexport const WHOLE_RECORD_BLOCK_KEY = 'record';\n\nexport interface SourceBlock {\n /** Stable key for React and for the selection union: `source:<label>`,\n * `unlabelled`, or `record` for the whole-record block. */\n key: string;\n /** The heading the block wears — a module name, or the unlabelled\n * fallback. Empty for the whole-record block. */\n label: string;\n /** This block's visits, in RECORD order (never re-sorted). */\n visits: Visit[];\n}\n\n/* --------------------------------- API ---------------------------------- */\n\n/** The single block the un-partitioned surface renders: every visit, no\n * label. Returns the INPUT ARRAY ITSELF so the caller can hand the original\n * record through untouched. */\nexport function wholeRecordBlock(visits: readonly Visit[]): SourceBlock {\n return { key: WHOLE_RECORD_BLOCK_KEY, label: '', visits: visits as Visit[] };\n}\n\n/** Group visits by `sourceLabel`, blocks ordered by their OLDEST visit.\n * `unlabelledLabel` is already translated by the caller — this module stays\n * i18n-free. Visits inside a block keep record order. */\nexport function partitionVisitsBySource(\n visits: readonly Visit[],\n unlabelledLabel: string,\n): SourceBlock[] {\n const blocks = new Map<string, SourceBlock>();\n for (const visit of visits) {\n const label = visit.sourceLabel?.trim() ?? '';\n const key = label === '' ? UNLABELLED_BLOCK_KEY : `source:${label}`;\n const block = blocks.get(key);\n if (block) {\n block.visits.push(visit);\n } else {\n blocks.set(key, {\n key,\n label: label === '' ? unlabelledLabel : label,\n visits: [visit],\n });\n }\n }\n // One key rule for the whole record, so the by-day / by-instant choice is\n // made once and block order never depends on the viewer's time zone.\n const sortKey = visitSortKey(visits);\n const oldest = (block: SourceBlock) =>\n Math.min(...block.visits.map((visit) => sortKey(visit.dateIso)));\n return [...blocks.values()].sort((a, b) => oldest(a) - oldest(b));\n}\n\n/** Parameters worth a row in a block: measured at least once in its visits,\n * or force-kept by the caller. Order follows `defs`. */\nexport function measuredParameters(\n visits: readonly Visit[],\n defs: readonly NumericParameterDef[],\n keep?: (def: NumericParameterDef) => boolean,\n): NumericParameterDef[] {\n return defs.filter(\n (def) =>\n keep?.(def) === true ||\n visits.some((visit) => parameterValueAt(visit, def) != null),\n );\n}\n\n/** Concatenate per-block reports in block order; first occurrence wins. */\nexport function unionShownVisitIds(\n reports: readonly (readonly string[])[],\n): string[] {\n const seen = new Set<string>();\n const union: string[] = [];\n for (const report of reports) {\n for (const id of report) {\n if (seen.has(id)) continue;\n seen.add(id);\n union.push(id);\n }\n }\n return union;\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — evolution section (the across-visits grid) */\n/* */\n/* The across-visits view, shared by compile mode (editable newest column) */\n/* and read-only mode (no edit affordances). */\n/* */\n/* The comparison IS the grid: every visit is a column on arrival, */\n/* un-ticking a visit in the picker removes its column, and the delta */\n/* between two adjacent shown columns is always drawn. There is no */\n/* separate compare mode. */\n/* */\n/* The section renders ONE OR MORE BLOCKS. By default there is exactly one */\n/* block holding every visit. With `partitionBySource` the record's visits */\n/* are grouped by module (`sourceLabel`) and each module gets its own */\n/* block — its own picker, baseline and event marks — so values two */\n/* modules never asked for in the same interview are not laid out as if */\n/* they had been. The empty state (no visit at all) belongs to the */\n/* section, not to a block: a block always holds at least one visit. */\n/* */\n/* FIXED VERTICAL ORDER inside a block — four slots, nothing else inserted: */\n/* 0. Block heading — only when partitioned by source; names the */\n/* module the table below belongs to */\n/* 1. Toolbar — one wrapping row: the visit menu (one button */\n/* opening checkbox items) and its readout, then */\n/* the host's export control at the inline end */\n/* (`exportSlot`) */\n/* 2. Event bar — one toggle per dated event; picking one drops a */\n/* reference line down every sparkline below it. */\n/* Directly above the grid because that is what it */\n/* annotates; nothing picked on arrival */\n/* 3. Grid — the primary read; never moves, never collapses. */\n/* Its leftmost column may be the MERGED first */\n/* visit (anamnesis-baseline.ts), derived here and */\n/* never stored on the record */\n/* */\n/* Under `partitionBySource` the export control sits ONCE above the blocks */\n/* rather than inside any of them: a file of the whole trend must not be */\n/* owned by one module's region. A host that mounts the trend on a bare */\n/* surface asks for `cardBlocks`, and each block then wears its OWN */\n/* elevated card — stacked loose in one surface the modules ran together */\n/* and the reader lost which table belonged to which — with the card gap */\n/* dividing them, so no rule is drawn between blocks. A host that has */\n/* already carded the trend leaves the flag off rather than nesting cards. */\n/* -------------------------------------------------------------------- */\n\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { ChevronDown } from 'lucide-react';\nimport { Button } from '../../components/button';\nimport { Card } from '../../components/card';\nimport { DropdownMenu } from '../../components/dropdown-menu';\nimport { EmptyState } from '../../components/empty-state';\nimport { BASELINE_VISIT_ID, resolveBaseline } from './anamnesis-baseline';\nimport {\n allParametersIncludingArchived,\n configuredParameters,\n type PracticeAnamnesisConfig,\n} from './anamnesis-config';\nimport { AnamnesisEventBar } from './anamnesis-event-bar';\nimport { eventAnnotations, eventMarks } from './anamnesis-events';\nimport { visitDateLabel, visitOptionLabel } from './anamnesis-format';\nimport { hasVisitNotes } from './anamnesis-visit-note';\nimport { AnamnesisEvolutionGrid } from './anamnesis-evolution-grid';\nimport {\n measuredParameters,\n partitionVisitsBySource,\n unionShownVisitIds,\n wholeRecordBlock,\n} from './anamnesis-source-blocks';\nimport { visitPickerIsUseful, windowVisits } from './anamnesis-window';\nimport type {\n AnamnesisRecord,\n NumericParameterDef,\n OpenAnamnesisNote,\n Visit,\n} from './anamnesis-types';\n\n/* -------------------------------- Props --------------------------------- */\n\nexport interface AnamnesisEvolutionProps {\n record: AnamnesisRecord;\n t: TFunction;\n editable?: boolean;\n onCellChange?: (\n visit: Visit,\n def: NumericParameterDef,\n value: number | null,\n ) => void;\n /** Draw the grid's own border/surface. `false` when this sits inside a card. */\n framed?: boolean;\n /** The practice's configured vocabulary. Omitted = the kit-seeded default. */\n config?: PracticeAnamnesisConfig;\n /** One table per anamnesis type: visits grouped by `sourceLabel`, each\n * group with its own header, picker and matrix. Default false — every\n * visit in one grid, as before. */\n partitionBySource?: boolean;\n /** Give each per-module block its own elevated card. The HOST decides,\n * because only the host knows what surface the trend sits on: a surface\n * that already cards the trend would otherwise nest a card in a card.\n * Only read under `partitionBySource` — the single whole-record block is\n * never carded here. */\n cardBlocks?: boolean;\n /** Mount with this visit selection instead of every visit. Demo/story hook\n * only — Chromatic skips play functions, so a click-narrowed grid is never\n * snapshotted. Under `partitionBySource` each block keeps the ids it holds\n * and ignores the rest. */\n defaultVisitIds?: readonly string[];\n /** Mount with these events already drawn. Demo/story hook only — the\n * arrival state picks none, and Chromatic skips play functions. */\n defaultEventIds?: readonly string[];\n /** The picker's live selection, whenever it changes (and once on mount).\n * A host's export control needs to know which visit columns are on screen\n * — the file must be the view that was asked for. Under\n * `partitionBySource` it is the union of every block's columns. */\n onVisitSelectionChange?: (visitIds: readonly string[]) => void;\n /** The host's side panel. Wired ⇒ a visit's note trigger routes there\n * instead of opening a popover, and turning an event chip on navigates the\n * panel to that event. Omitted ⇒ the note opens in place and the chip only\n * draws its line, which is all a standalone surface can do. */\n onOpenNote?: OpenAnamnesisNote;\n /** Rendered at the inline end of the trend's toolbar row — the host's\n * export control. Under `partitionBySource` it sits above the blocks, once,\n * for the whole trend. */\n exportSlot?: ReactNode;\n}\n\n/* ------------------------------- Section -------------------------------- */\n\nexport function AnamnesisEvolution({\n record,\n t,\n editable = false,\n config,\n partitionBySource = false,\n cardBlocks = false,\n onVisitSelectionChange,\n exportSlot,\n ...blockProps\n}: AnamnesisEvolutionProps) {\n // Compile mode writes to the record's newest visit — decided on the REAL\n // record and kept out of the merge: a new module's first interview is the\n // newest visit, and folding it would hand the inputs to an older one.\n const editableVisitId = editable\n ? record.visits[record.visits.length - 1]?.id\n : undefined;\n // History surface: archived parameters stay, so a value recorded under a\n // since-archived parameter still renders.\n const allDefs = useMemo(\n () => allParametersIncludingArchived(config),\n [config],\n );\n // ...but capture follows the LIVE list: an archived parameter keeps its\n // history and loses its input.\n const capturableKeys = useMemo(\n () => new Set(configuredParameters(config).map((d) => d.key)),\n [config],\n );\n\n const unlabelled = t('anamnesis.grid.unlabelledSource');\n const blocks = useMemo(\n () =>\n partitionBySource\n ? partitionVisitsBySource(record.visits, unlabelled)\n : [wholeRecordBlock(record.visits)],\n [partitionBySource, record.visits, unlabelled],\n );\n const views = useMemo(\n () =>\n blocks.map((block) => {\n // A module never asked for a parameter nobody measured in it, so the\n // row would be dashes only. The block being compiled keeps every\n // capturable input regardless: an empty row is where the value goes.\n const compiling =\n editableVisitId != null &&\n block.visits.some((visit) => visit.id === editableVisitId);\n return {\n block,\n // Same reference when nothing was partitioned, so downstream memos\n // keep their identity.\n record:\n block.visits === record.visits\n ? record\n : { ...record, visits: block.visits },\n defs: partitionBySource\n ? measuredParameters(\n block.visits,\n allDefs,\n compiling\n ? (def) => capturableKeys.has(def.key) && !def.computed\n : undefined,\n )\n : allDefs,\n };\n }),\n [\n blocks,\n record,\n partitionBySource,\n allDefs,\n editableVisitId,\n capturableKeys,\n ],\n );\n\n // A ref, not state: each block's effect re-fires when its callback changes\n // identity, so a setState here would re-render, mint new closures and loop.\n // Only live blocks count — a swapped record leaves stale keys behind.\n const shownByBlock = useRef(new Map<string, readonly string[]>());\n const reportBlock = useCallback(\n (key: string, ids: readonly string[]) => {\n shownByBlock.current.set(key, ids);\n onVisitSelectionChange?.(\n unionShownVisitIds(\n blocks.map((block) => shownByBlock.current.get(block.key) ?? []),\n ),\n );\n },\n [blocks, onVisitSelectionChange],\n );\n const reporters = useMemo(\n () =>\n new Map(\n blocks.map((block) => [\n block.key,\n (ids: readonly string[]) => reportBlock(block.key, ids),\n ]),\n ),\n [blocks, reportBlock],\n );\n\n /* ---- SLOT 0 — no visits: nothing to plot, nothing to compare ---- */\n if (record.visits.length === 0) {\n return (\n <div className=\"ds:w-full\" data-testid=\"anamnesis-evolution-empty\">\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={t('anamnesis.empty.noVisits.title')}\n description={t('anamnesis.empty.noVisits.description')}\n />\n </div>\n );\n }\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]\">\n {/* One export control for the whole trend. Partitioned blocks are\n module regions, and a file of everything must not sit inside one. */}\n {partitionBySource && exportSlot ? (\n <div\n data-testid=\"anamnesis-evolution-actions\"\n className=\"ds:flex ds:justify-end\"\n >\n {exportSlot}\n </div>\n ) : null}\n {views.map(({ block, record: blockRecord, defs }) => (\n <EvolutionBlock\n key={block.key}\n {...blockProps}\n record={blockRecord}\n defs={defs}\n t={t}\n editable={editable}\n editableVisitId={editableVisitId}\n capturableKeys={capturableKeys}\n heading={\n partitionBySource\n ? { label: block.label, count: block.visits.length }\n : undefined\n }\n groupBanners={!partitionBySource}\n carded={partitionBySource && cardBlocks}\n onVisitSelectionChange={reporters.get(block.key)}\n toolbarEnd={partitionBySource ? undefined : exportSlot}\n />\n ))}\n </div>\n );\n}\n\n/* ------------------------------- Host hook ------------------------------ */\n\n/** Mirror of the trend's shown columns for a host's export control. Bails\n * on an identical set: the child reports on every mount, and a fresh array\n * each time would re-render the host. */\nexport function useShownVisitIds(): [\n readonly string[],\n (ids: readonly string[]) => void,\n] {\n const [ids, setIds] = useState<readonly string[]>([]);\n const track = useCallback((next: readonly string[]) => {\n setIds((prev) =>\n prev.length === next.length && prev.every((id, i) => id === next[i])\n ? prev\n : [...next],\n );\n }, []);\n return [ids, track];\n}\n\n/* -------------------------------- Block --------------------------------- */\n\ninterface EvolutionBlockProps extends Omit<\n AnamnesisEvolutionProps,\n 'partitionBySource' | 'cardBlocks' | 'config' | 'exportSlot'\n> {\n /** The rows this block draws — already narrowed by the section. */\n defs: NumericParameterDef[];\n capturableKeys: ReadonlySet<string>;\n /** Decided by the section on the REAL record, never on a block's slice. */\n editableVisitId?: string;\n /** The module this block belongs to. Omitted = the block is the record. */\n heading?: { label: string; count: number };\n /** Parameter-group banner rows inside the grid. Off when the heading\n * already names the module the table belongs to. */\n groupBanners: boolean;\n /** Give the block its own elevated card. On per module when the host asked\n * for it; off for the single whole-record block, which is already whatever\n * surface the host put it on. */\n carded: boolean;\n /** The section's export control, when this block's toolbar is to hold it. */\n toolbarEnd?: ReactNode;\n}\n\nfunction EvolutionBlock({\n record,\n t,\n defs,\n capturableKeys,\n editable = false,\n editableVisitId,\n onCellChange,\n framed = true,\n heading,\n groupBanners,\n carded,\n defaultVisitIds,\n defaultEventIds,\n onVisitSelectionChange,\n onOpenNote,\n toolbarEnd,\n}: EvolutionBlockProps) {\n // Several modules each open with their own first interview; the reader\n // wants ONE baseline column, so those first visits fold into a synthetic one.\n const merge = useMemo(\n () => resolveBaseline(record.visits, { keepId: editableVisitId }),\n [record.visits, editableVisitId],\n );\n const { visits, pickable, baseline } = merge;\n // The record every derivation reads. Same reference when nothing merged.\n const view = useMemo<AnamnesisRecord>(\n () => (baseline ? { ...record, visits } : record),\n [record, baseline, visits],\n );\n const pinnedIds = useMemo(\n () => (baseline ? [BASELINE_VISIT_ID] : []),\n [baseline],\n );\n const headingId = useId();\n const readoutId = useId();\n const [refusalNote, setRefusalNote] = useState('');\n\n /* ---- Visit picker: which columns render (never which maths run) ---- */\n // Every visit on arrival — the grid is the comparison. The baseline is\n // pinned, never picked, so it is not part of the selection.\n const [pickedVisitIds, setPickedVisitIds] = useState<string[]>(() =>\n (defaultVisitIds ? [...defaultVisitIds] : pickable.map((v) => v.id)).filter(\n (id) => id !== BASELINE_VISIT_ID,\n ),\n );\n const pickerUseful = visitPickerIsUseful(pickable);\n // A host that swaps the record leaves the state holding ids this one does\n // not have. Dropping them can empty the selection, which would render a grid\n // with no visit column at all — fall back to every visit rather than to\n // nothing. Same floor the picker enforces on deselection. A baseline-only\n // record has nothing to pick, and stays empty rather than looping back.\n const selectedVisitIds = useMemo(() => {\n const live = pickedVisitIds.filter((id) =>\n pickable.some((v) => v.id === id),\n );\n if (live.length > 0 || pickable.length === 0) return live;\n return pickable.map((v) => v.id);\n }, [pickedVisitIds, pickable]);\n\n const visitWindow = useMemo(\n () => windowVisits(visits, selectedVisitIds, { alwaysShowIds: pinnedIds }),\n [visits, selectedVisitIds, pinnedIds],\n );\n\n // Reported, never owned: the host only mirrors what the grid draws. The\n // synthetic column expands to the real visits it merges: the host and the\n // export only know ids that exist on the record.\n const shownVisitIds = useMemo(\n () =>\n visitWindow.columns.flatMap((column) =>\n column.visit.id === BASELINE_VISIT_ID\n ? merge.sources.map((source) => source.id)\n : [column.visit.id],\n ),\n [visitWindow, merge],\n );\n useEffect(() => {\n onVisitSelectionChange?.(shownVisitIds);\n }, [shownVisitIds, onVisitSelectionChange]);\n\n // Ordinals count from the baseline's \"1.\".\n const visitItems = useMemo(() => {\n const offset = baseline ? 1 : 0;\n return pickable.map((visit, index) => ({\n id: visit.id,\n label: visitOptionLabel(visit, index + offset, t, hasVisitNotes(visit)),\n }));\n }, [pickable, baseline, t]);\n const allShown = selectedVisitIds.length === pickable.length;\n const triggerText = t('anamnesis.window.pickerTrigger', {\n shown: visitWindow.shownCount,\n total: visitWindow.totalCount,\n });\n\n // The floor is a REFUSAL, not a disabled row: the last shown visit stays\n // tickable so the reader hears why nothing changed.\n const refuseFloor = () => setRefusalNote(t('anamnesis.window.minimum'));\n // Built on the live set, not the raw state, so a stale id from a swapped\n // record cannot resurrect.\n const setVisitShown = (visitId: string, shown: boolean) => {\n if (!shown && selectedVisitIds.length === 1) return refuseFloor();\n setRefusalNote('');\n setPickedVisitIds(\n shown\n ? [...selectedVisitIds, visitId]\n : selectedVisitIds.filter((id) => id !== visitId),\n );\n };\n // An action, not a toggle: a checkbox row that can never be un-ticked\n // exposes a state nobody can set (WCAG 4.1.2).\n const selectAllVisits = () => {\n setRefusalNote('');\n setPickedVisitIds(pickable.map((visit) => visit.id));\n };\n\n const windowReadout = useMemo(() => {\n const from = visitWindow.firstIso\n ? visitDateLabel(visitWindow.firstIso, t)\n : '';\n const to = visitWindow.lastIso\n ? visitDateLabel(visitWindow.lastIso, t)\n : '';\n const shown =\n visitWindow.hiddenCount > 0\n ? t('anamnesis.window.showing', {\n shown: visitWindow.shownCount,\n total: visitWindow.totalCount,\n from,\n to,\n })\n : t('anamnesis.window.showingAll', {\n total: visitWindow.totalCount,\n from,\n to,\n });\n // Under a per-module block the readout names the module, so N pickers\n // do not share one description.\n const parts = heading ? [heading.label, shown] : [shown];\n // Said only where it applies: at one visit the next removal is the one the\n // picker refuses, and silence there reads as a broken control.\n if (selectedVisitIds.length === 1)\n parts.push(t('anamnesis.window.minimum'));\n return parts.join(' · ');\n }, [visitWindow, selectedVisitIds, t, heading]);\n\n /* ---- Events: one shared x domain, one line per picked event ---- */\n // Positions come from the block's visit span, NOT from any row's point\n // count and NOT from the visit selection — the sparklines plot the whole\n // block, so windowing columns must not move a marker.\n const marks = useMemo(\n () => eventMarks(record.events, visits),\n [record.events, visits],\n );\n const [pickedEventIds, setPickedEventIds] = useState<string[]>(() =>\n defaultEventIds ? [...defaultEventIds] : [],\n );\n // A host that swaps the record leaves ids this one cannot draw. Nothing\n // falls back here: an unpicked event is the arrival state, so dropping a\n // dead id lands on a state the reader already understands.\n const activeEventIds = useMemo(() => {\n const drawable = new Set(marks.map((mark) => mark.event.id));\n return new Set(pickedEventIds.filter((id) => drawable.has(id)));\n }, [pickedEventIds, marks]);\n\n const annotations = useMemo(\n () => eventAnnotations(marks, activeEventIds, t),\n [marks, activeEventIds, t],\n );\n\n const toggleEvent = (eventId: string) =>\n setPickedEventIds((current) =>\n current.includes(eventId)\n ? current.filter((id) => id !== eventId)\n : [...current, eventId],\n );\n\n // Pressing a drawn line is the SECOND half of pressing its chip, never the\n // first: the line only exists because the chip is already on, so the press\n // means \"what was this?\", not \"toggle it\". It therefore only routes the\n // panel — and only where a host wired one, which is also the only case where\n // it becomes pressable at all. No host panel, no pointer affordance: an\n // interactive-looking line that does nothing is worse than a drawn one.\n const selectAnnotation = useMemo(\n () =>\n onOpenNote\n ? (eventId: string) => onOpenNote({ kind: 'event', eventId })\n : undefined,\n [onOpenNote],\n );\n\n const block = (\n <div\n data-testid=\"anamnesis-evolution-block\"\n role={heading ? 'region' : undefined}\n aria-labelledby={heading ? headingId : undefined}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n {/* SLOT 0 — block heading. The module is the grouping, which is why the\n grid below draws no parameter-group banners of its own. */}\n {heading ? (\n <div\n data-testid=\"anamnesis-evolution-block-header\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\"\n >\n <h3\n id={headingId}\n className=\"type-title-item ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {heading.label}\n </h3>\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.grid.blockVisits', { count: heading.count })}\n </p>\n </div>\n ) : null}\n\n {/* SLOT 1 — toolbar. One wrapping row; rendered only when it has a\n control to hold, so a single-visit record shows no empty bar. */}\n {pickerUseful || toolbarEnd != null ? (\n <div\n data-testid=\"anamnesis-evolution-toolbar\"\n className=\"ds:flex ds:flex-wrap ds:items-start ds:gap-[var(--spacing-md)]\"\n >\n {pickerUseful ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {/* Non-modal: the host page runs its own pointer/focus\n handling, as its other kit menus do. */}\n <DropdownMenu.Root modal={false}>\n <DropdownMenu.Trigger asChild>\n <Button\n type=\"button\"\n intent=\"outline\"\n size=\"sm\"\n /* The column stretches its children, so without this the\n trigger grew to the readout's width — 549px of button\n for a five-word label. The readout stays stretched. */\n className=\"ds:w-fit\"\n endIcon={<ChevronDown aria-hidden=\"true\" />}\n /* WCAG 2.5.3: the name OPENS with the visible text, then\n says what the control is. */\n aria-label={`${triggerText} · ${t('anamnesis.window.label')}`}\n /* The readout already opens with the module name per\n block, so the heading is not read twice. */\n aria-describedby={readoutId}\n data-testid=\"anamnesis-window-picker\"\n >\n {triggerText}\n </Button>\n </DropdownMenu.Trigger>\n {/* No clear-all: the grid needs at least one visit column, so\n an affordance that empties the selection would be a control\n whose effect is refused. Ticking keeps the menu open. */}\n <DropdownMenu.Content align=\"start\">\n <DropdownMenu.Label>\n {t('anamnesis.window.label')}\n </DropdownMenu.Label>\n <DropdownMenu.Item\n disabled={allShown}\n onSelect={(event) => {\n event.preventDefault();\n selectAllVisits();\n }}\n >\n {t('anamnesis.window.selectAll')}\n </DropdownMenu.Item>\n <DropdownMenu.Separator />\n {visitItems.map((item) => (\n <DropdownMenu.CheckboxItem\n key={item.id}\n checked={selectedVisitIds.includes(item.id)}\n onCheckedChange={(checked) =>\n setVisitShown(item.id, checked)\n }\n onSelect={(event) => event.preventDefault()}\n >\n {item.label}\n </DropdownMenu.CheckboxItem>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n <p\n id={readoutId}\n data-testid=\"anamnesis-window-readout\"\n className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\"\n >\n {windowReadout}\n </p>\n {/* The floor is enforced by REFUSING the change, and a\n description never re-read explains nothing to a reader who\n cannot see it. */}\n <span\n role=\"status\"\n data-testid=\"anamnesis-window-floor\"\n className=\"ds:sr-only\"\n >\n {refusalNote}\n </span>\n </div>\n ) : null}\n\n {toolbarEnd ? <div className=\"ds:ms-auto\">{toolbarEnd}</div> : null}\n </div>\n ) : null}\n\n {/* SLOT 2 — events. Renders nothing when the record has none that fall\n inside the plotted span. */}\n <AnamnesisEventBar\n marks={marks}\n activeIds={activeEventIds}\n onToggle={toggleEvent}\n t={t}\n />\n\n {/* SLOT 3 — the primary read. */}\n <AnamnesisEvolutionGrid\n record={view}\n defs={defs}\n t={t}\n editable={editable}\n editableVisitId={editableVisitId}\n onCellChange={onCellChange}\n /* The card is the frame — a bordered table inside it is a box in a box. */\n framed={carded ? false : framed}\n visitColumns={visitWindow.columns}\n capturableKeys={capturableKeys}\n annotations={annotations}\n onSelectAnnotation={selectAnnotation}\n onOpenNote={onOpenNote}\n baselineSources={baseline ? merge.sources : undefined}\n groupBanners={groupBanners}\n caption={\n heading\n ? t('anamnesis.grid.captionInModule', { module: heading.label })\n : undefined\n }\n />\n </div>\n );\n\n return carded ? (\n <Card variant=\"elevated\">\n <Card.Body>{block}</Card.Body>\n </Card>\n ) : (\n block\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — patient-copy boundary */\n/* */\n/* ONE table answering one question: which audience may see a concept. */\n/* Reason codes, the export audience matrix, the read-only render and the */\n/* AI framing all resolve here — there is no second mechanism, no */\n/* `canPatientSee` boolean and no `audience` field on a domain type. */\n/* */\n/* THIS IS DOCUMENTATION PLUS A RESOLVER. It enforces NOTHING at runtime */\n/* and is NOT a security boundary — the real guarantee is a server-side */\n/* check on the document-generation and portal paths. Later stages ADD */\n/* ROWS; they never edit an existing row and never change the shape. */\n/* */\n/* Every row is provisional: our judgement, not the customer's. None of it */\n/* has been signed off. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\n/** Who a concept may be disclosed to. `clinician` is implicit on every row. */\nexport type DisclosureAudience = 'clinician' | 'patient' | 'external';\n\nexport interface DisclosureRule {\n /** Stable concept id — never a UI label, never a data-model field path. */\n id: string;\n /** Where the concept is captured or rendered. */\n surface: 'intake' | 'compile' | 'evolution' | 'readOnly' | 'export';\n /** Audiences allowed to see it. Always includes 'clinician'. */\n audiences: readonly DisclosureAudience[];\n /** One English sentence, for the customer sign-off walkthrough. */\n rationale: string;\n /** 'provisional' = our judgement, not the customer's. */\n status: 'provisional' | 'signedOff';\n}\n\nconst CLINICIAN_ONLY: readonly DisclosureAudience[] = ['clinician'];\nconst CLINICIAN_AND_PATIENT: readonly DisclosureAudience[] = [\n 'clinician',\n 'patient',\n];\n\nexport const DISCLOSURE_RULES: readonly DisclosureRule[] = [\n {\n id: 'patient.identity',\n surface: 'intake',\n audiences: CLINICIAN_AND_PATIENT,\n rationale: 'The patient supplied their own identifying details.',\n status: 'provisional',\n },\n {\n id: 'visit.date',\n surface: 'evolution',\n audiences: CLINICIAN_AND_PATIENT,\n rationale: 'The patient attended the visit and knows when it happened.',\n status: 'provisional',\n },\n {\n id: 'visit.type',\n surface: 'evolution',\n audiences: CLINICIAN_AND_PATIENT,\n rationale: 'First visit versus follow-up carries no clinical judgement.',\n status: 'provisional',\n },\n {\n id: 'visit.practitioner',\n surface: 'compile',\n audiences: CLINICIAN_AND_PATIENT,\n rationale: 'The patient met the practitioner.',\n status: 'provisional',\n },\n {\n id: 'visit.reason',\n surface: 'compile',\n audiences: CLINICIAN_AND_PATIENT,\n rationale:\n 'The human-readable reason for the visit is what the patient came for. Renders nothing today.',\n status: 'provisional',\n },\n {\n id: 'visit.reasonCode',\n surface: 'compile',\n audiences: CLINICIAN_ONLY,\n rationale:\n 'The coded reason is internal: the patient-facing artefact must be code-free. Separate row from visit.reason on purpose.',\n status: 'provisional',\n },\n {\n id: 'intake.answers',\n surface: 'intake',\n audiences: CLINICIAN_AND_PATIENT,\n rationale: 'The patient authored them.',\n status: 'provisional',\n },\n {\n id: 'anthropometrics.values',\n surface: 'compile',\n audiences: CLINICIAN_AND_PATIENT,\n rationale: 'Measured with the patient present, and motivating to track.',\n status: 'provisional',\n },\n {\n id: 'dietary.intake',\n surface: 'compile',\n audiences: CLINICIAN_AND_PATIENT,\n rationale:\n 'Estimated daily energy and protein describe what the patient eats — their own behaviour, and the thing the plan asks them to change.',\n status: 'provisional',\n },\n {\n id: 'derived.bmi',\n surface: 'compile',\n audiences: CLINICIAN_AND_PATIENT,\n rationale: 'Derived from weight and height, both already disclosed.',\n status: 'provisional',\n },\n {\n id: 'lab.values',\n surface: 'compile',\n audiences: CLINICIAN_ONLY,\n rationale:\n 'Our guess: raw lab values without interpretation can alarm. Needs customer sign-off.',\n status: 'provisional',\n },\n {\n id: 'pathology.codes',\n surface: 'compile',\n audiences: CLINICIAN_ONLY,\n rationale: 'Diagnostic codes are internal coding, not patient copy.',\n status: 'provisional',\n },\n {\n id: 'oncological.history',\n surface: 'compile',\n audiences: CLINICIAN_ONLY,\n rationale: 'Staging and treatment status need a clinician to deliver them.',\n status: 'provisional',\n },\n {\n id: 'therapy.entries',\n surface: 'compile',\n audiences: CLINICIAN_AND_PATIENT,\n rationale: 'The patient takes them and needs the list.',\n status: 'provisional',\n },\n {\n id: 'fmd.cycles',\n surface: 'compile',\n audiences: CLINICIAN_AND_PATIENT,\n rationale: 'The patient follows the programme.',\n status: 'provisional',\n },\n {\n id: 'notes.clinicalNotes',\n surface: 'compile',\n audiences: CLINICIAN_ONLY,\n rationale: \"The clinician's own working notes, not a patient letter.\",\n status: 'provisional',\n },\n {\n id: 'notes.nutritionalProposal',\n surface: 'compile',\n audiences: CLINICIAN_AND_PATIENT,\n rationale: 'This is the plan the patient is asked to follow.',\n status: 'provisional',\n },\n {\n id: 'annual.programme',\n surface: 'compile',\n audiences: CLINICIAN_AND_PATIENT,\n rationale: 'The patient accepts or declines it.',\n status: 'provisional',\n },\n {\n id: 'compare.diff',\n surface: 'evolution',\n audiences: CLINICIAN_ONLY,\n rationale:\n 'The diff spans lab values and codes; the strictest member governs the whole surface.',\n status: 'provisional',\n },\n {\n id: 'visit.note',\n surface: 'evolution',\n audiences: CLINICIAN_ONLY,\n rationale:\n 'Renders clinical notes and the nutritional proposal together; the strictest member governs.',\n status: 'provisional',\n },\n {\n id: 'intake.digest',\n surface: 'compile',\n audiences: CLINICIAN_AND_PATIENT,\n rationale: 'A summary of answers the patient wrote themselves.',\n status: 'provisional',\n },\n {\n id: 'symptom.observations',\n surface: 'compile',\n audiences: CLINICIAN_ONLY,\n rationale:\n 'Clinician-recorded observations, not patient self-report. Renders nothing today.',\n status: 'provisional',\n },\n {\n id: 'event.timeline',\n surface: 'evolution',\n audiences: CLINICIAN_ONLY,\n rationale:\n 'Clinical events carry third-party attribution — an event started by an outside professional names that professional.',\n status: 'provisional',\n },\n {\n id: 'export.workbook',\n surface: 'export',\n audiences: CLINICIAN_ONLY,\n rationale:\n 'Nothing in this track exports; the row reserves the boundary before anything does.',\n status: 'provisional',\n },\n {\n id: 'export.tabDocument',\n surface: 'export',\n audiences: CLINICIAN_AND_PATIENT,\n rationale:\n 'The per-tab export ENVELOPE — a title, a meta block and a list of tables. It carries no clinical content of its own: every table inside is gated on the concept it renders, so this row decides only whether a file may be produced at all. The whole-record workbook stays reserved by export.workbook.',\n status: 'provisional',\n },\n];\n\nconst RULE_BY_ID: ReadonlyMap<string, DisclosureRule> = new Map(\n DISCLOSURE_RULES.map((rule) => [rule.id, rule] as const),\n);\n\n/** The one resolver. Never inline this logic. An unknown id is NOT disclosed —\n * a concept with no row is a concept nobody has thought about yet. */\nexport function disclosedTo(id: string, audience: DisclosureAudience): boolean {\n const rule = RULE_BY_ID.get(id);\n if (!rule) return false;\n return rule.audiences.includes(audience);\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — export serialisation */\n/* */\n/* Three tabs, ONE tabular shape. Summary, Compile and Evolution each */\n/* serialise to an `ExportDocument` — a title, a meta block and a list of */\n/* `ExportTable`s — and every writer (CSV here, Excel here, PDF later) */\n/* consumes that one shape. Without it, three writers become three */\n/* different readings of the same screen. */\n/* */\n/* AUDIENCE IS A PARAMETER, NOT AN AFTERTHOUGHT. Every table and every */\n/* parameter row resolves through `disclosedTo()` in */\n/* `anamnesis-disclosure.ts`. A concept with no rule is NOT disclosed, so */\n/* a table nobody has classified stays out of a patient copy by default. */\n/* This module is not a security boundary — the real guarantee is a */\n/* server-side check on the document-generation path. */\n/* */\n/* PURE: no React, no DOM, no `document`. The writers return Blobs; the */\n/* download trigger lives in `anamnesis-export-download.ts`. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\nimport type { TFunction } from 'i18next';\nimport type { Cell, Sheet, SheetData } from 'write-excel-file/universal';\nimport {\n allParametersIncludingArchived,\n allSectionsIncludingArchived,\n configuredParameters,\n type PracticeAnamnesisConfig,\n pathologyLookup,\n} from './anamnesis-config';\nimport {\n buildParameterRows,\n isReadableDate,\n latestVisit,\n outOfRange,\n parameterValueAt,\n type ParameterRow,\n type RangeFlag,\n} from './anamnesis-derive';\nimport { type DisclosureAudience, disclosedTo } from './anamnesis-disclosure';\nimport {\n fieldVisible,\n formatIntakeAnswer,\n intakeFieldLabel,\n localeOf,\n parameterLabel,\n pathologyLabel,\n patientAgeLabel,\n sectionLabel,\n visitDateLabel,\n} from './anamnesis-format';\nimport {\n allVisitColumns,\n defaultSelectedVisitIds,\n type VisitColumn,\n windowVisits,\n} from './anamnesis-window';\nimport type {\n AnamnesisRecord,\n NumericParameterDef,\n Visit,\n} from './anamnesis-types';\n\n/* ------------------------- The one tabular shape ------------------------ */\n\n/** A cell. `null` is ABSENT and every writer renders it as an empty cell —\n * never the em dash the screen uses, which a spreadsheet cannot compute on. */\nexport type ExportValue = string | number | null;\n\nexport interface ExportColumn {\n /** Stable key — the Excel column key, never rendered. */\n key: string;\n /** Translated header text. */\n header: string;\n /** Numbers land in this column: right-aligned and number-formatted. */\n numeric?: boolean;\n /** Decimal places for numeric cells, when the whole column shares one. */\n precision?: number;\n}\n\nexport interface ExportRow {\n /** `section` is a group banner: cell 0 carries the label, the rest is blank. */\n kind?: 'data' | 'section';\n /** Aligned to `columns` by index; short rows are padded by the writer. */\n cells: ExportValue[];\n /** Decimal places for THIS row's numeric cells — a parameter row carries its\n * own precision, and the column cannot know it. Wins over the column. */\n precision?: number;\n}\n\nexport interface ExportTable {\n /** Stable id — the worksheet key and the PDF anchor. */\n id: string;\n title: string;\n columns: ExportColumn[];\n rows: ExportRow[];\n /** Rendered in place of the rows when there are none. */\n emptyText?: string;\n}\n\nexport interface ExportMetaEntry {\n label: string;\n value: string;\n}\n\n/** Which tab was exported. */\nexport type AnamnesisExportTab = 'summary' | 'compile' | 'evolution';\n\nexport interface ExportDocument {\n tab: AnamnesisExportTab;\n audience: DisclosureAudience;\n /** Filename without an extension — see `exportFileName`. */\n fileStem: string;\n title: string;\n /** Who the copy names, or `null` when identity is not disclosed to this\n * audience. Lifted out of `meta` so a writer can stamp every page with it. */\n patientName: string | null;\n /** The audience, translated — the \"Copy for\" value, in one place. */\n audienceLabel: string;\n meta: ExportMetaEntry[];\n tables: ExportTable[];\n /** Translated notes rendered under the tables. */\n footnotes: string[];\n /** Disclosure concept IDS held back from this document. Metadata for the UI\n * and the tests — writers never print it, because an id is not a value. */\n withheld: string[];\n /** App locale, resolved from `t`. Drives the CSV dialect. */\n locale?: string;\n}\n\n/* ------------------------------- Options -------------------------------- */\n\nexport interface AnamnesisExportOptions {\n record: AnamnesisRecord;\n /** Who the file is for. Filters every table through `disclosedTo`. */\n audience: DisclosureAudience;\n t: TFunction;\n config?: PracticeAnamnesisConfig;\n /** Generation instant. Defaults to now — pass one to keep a test stable. */\n generatedAtIso?: string;\n}\n\n/** `selected` exports the columns the picker is showing; `all` exports every\n * visit. Defaults to `selected`: exporting thirteen visits from a screen\n * showing three is a different document from the one that was asked for. */\nexport type EvolutionExportScope = 'selected' | 'all';\n\nexport interface EvolutionExportOptions extends AnamnesisExportOptions {\n /** The picker's current selection. Omitted = the picker's own default\n * (first visit + latest), never \"everything\". */\n selectedVisitIds?: Iterable<string>;\n scope?: EvolutionExportScope;\n}\n\n/* ---------------------------- Disclosure gate --------------------------- */\n\n/** The envelope's own rule. Denied ⇒ no file at all, and the reason is named. */\nconst DOCUMENT_CONCEPT = 'export.tabDocument';\n\n/** Collects what a build withheld, so the document can say so without naming\n * a single value. Local to one build call — nothing observable escapes. */\ninterface Gate {\n audience: DisclosureAudience;\n withheld: Set<string>;\n}\n\nfunction allow(gate: Gate, conceptId: string): boolean {\n if (disclosedTo(conceptId, gate.audience)) return true;\n gate.withheld.add(conceptId);\n return false;\n}\n\n/** A parameter's disclosure concept, from its DISPLAY group — not from\n * `parameterStorage`, which routes a practice-added anthropometric through the\n * `labs` array and would classify it as a lab value. */\nexport function parameterConcept(def: NumericParameterDef): string {\n if (def.key === 'bmi') return 'derived.bmi';\n switch (def.group) {\n case 'anthropometric':\n return 'anthropometrics.values';\n case 'dietary':\n return 'dietary.intake';\n case 'lab':\n return 'lab.values';\n }\n}\n\n/* ------------------------------- Helpers -------------------------------- */\n\nfunction sectionRow(label: string): ExportRow {\n return { kind: 'section', cells: [label] };\n}\n\nfunction textCell(value: string | undefined | null): ExportValue {\n const trimmed = value?.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction referenceRangeText(\n def: NumericParameterDef,\n t: TFunction,\n): ExportValue {\n const range = def.referenceRange;\n if (!range) return null;\n if (range.min != null && range.max != null)\n return `${range.min}–${range.max}`;\n if (range.max != null)\n return t('anamnesis.range.atMost', { value: range.max });\n if (range.min != null)\n return t('anamnesis.range.atLeast', { value: range.min });\n return null;\n}\n\nfunction flagText(flag: RangeFlag, t: TFunction): ExportValue {\n if (flag === 'high') return t('anamnesis.range.aboveRange');\n if (flag === 'low') return t('anamnesis.range.belowRange');\n return null;\n}\n\n/** ASCII slug for a filename. A name with no Latin letters (Arabic, Japanese)\n * collapses to nothing, so the caller falls back to a neutral stem. */\nfunction slugify(value: string): string {\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nfunction calendarPart(iso: string | undefined): string | null {\n if (!iso) return null;\n const day = iso.slice(0, 10);\n return isReadableDate(day) ? day : null;\n}\n\n/** The audience rides in the STEM, not just in the document. Outside the app —\n * in a Downloads folder, on a USB stick, attached to an email — the filename is\n * the only thing left that says which of the two copies this is; without it the\n * second one is silently `… (1).pdf`. */\nfunction buildFileStem(\n tab: AnamnesisExportTab,\n record: AnamnesisRecord,\n referenceIso: string | null,\n namesDisclosed: boolean,\n audience: DisclosureAudience,\n): string {\n const name = namesDisclosed\n ? slugify(`${record.patient.lastName} ${record.patient.firstName}`)\n : '';\n const parts = [\n 'anamnesis',\n tab,\n audience,\n name || 'patient',\n referenceIso ?? '',\n ];\n return parts.filter(Boolean).join('-');\n}\n\nfunction audienceLabel(audience: DisclosureAudience, t: TFunction): string {\n return t(`anamnesis.export.audience.${audience}`);\n}\n\nfunction tabLabel(tab: AnamnesisExportTab, t: TFunction): string {\n return t(`anamnesis.export.tab.${tab}`);\n}\n\n/** The tab's name AS A DOCUMENT. \"Compile\" is a fine label on a tab strip and a\n * poor title for a clinical record — worse in Italian, where \"Compila\" reads as\n * an instruction to whoever is holding the sheet. Falls back to the control's\n * own tab name for a locale that carries only the evolution slice. */\nfunction docTabLabel(tab: AnamnesisExportTab, t: TFunction): string {\n return t(`anamnesis.export.docTab.${tab}`, {\n defaultValue: tabLabel(tab, t),\n });\n}\n\n/** The patient / generation meta every document carries. Identity is gated:\n * a copy that may not name the patient names nobody. */\nfunction baseMeta(\n record: AnamnesisRecord,\n gate: Gate,\n t: TFunction,\n generatedAtIso: string,\n): { meta: ExportMetaEntry[]; patientName: string | null } {\n const meta: ExportMetaEntry[] = [];\n const identity = allow(gate, 'patient.identity');\n const patientName = identity\n ? `${record.patient.firstName} ${record.patient.lastName}`.trim()\n : null;\n\n if (patientName) {\n meta.push({ label: t('anamnesis.header.name'), value: patientName });\n meta.push({\n label: t('anamnesis.header.dob'),\n value: visitDateLabel(record.patient.dateOfBirthIso, t),\n });\n meta.push({\n label: t('anamnesis.header.age'),\n value: patientAgeLabel(record, t),\n });\n }\n meta.push({\n label: t('anamnesis.export.generated'),\n value: visitDateLabel(generatedAtIso.slice(0, 10), t),\n });\n meta.push({\n label: t('anamnesis.export.audienceLabel'),\n value: audienceLabel(gate.audience, t),\n });\n return { meta, patientName };\n}\n\nfunction documentTitle(\n tab: AnamnesisExportTab,\n patientName: string | null,\n t: TFunction,\n): string {\n const tabText = docTabLabel(tab, t);\n return patientName\n ? t('anamnesis.export.docTitle', { tab: tabText, patient: patientName })\n : tabText;\n}\n\n/** The document produced when the envelope itself is not disclosed. Empty on\n * purpose: no tables, no meta, and the reason named in `withheld`. */\nfunction refusedDocument(\n tab: AnamnesisExportTab,\n audience: DisclosureAudience,\n t: TFunction,\n): ExportDocument {\n return {\n tab,\n audience,\n fileStem: `anamnesis-${tab}-${audience}`,\n title: docTabLabel(tab, t),\n patientName: null,\n audienceLabel: audienceLabel(audience, t),\n meta: [],\n tables: [],\n footnotes: [t('anamnesis.export.withheld')],\n withheld: [DOCUMENT_CONCEPT],\n locale: localeOf(t),\n };\n}\n\nfunction finish(\n document: Omit<\n ExportDocument,\n 'withheld' | 'footnotes' | 'locale' | 'audienceLabel'\n >,\n gate: Gate,\n t: TFunction,\n extraFootnotes: string[] = [],\n): ExportDocument {\n const withheld = [...gate.withheld].sort();\n const footnotes = [...extraFootnotes];\n if (withheld.length > 0) footnotes.push(t('anamnesis.export.withheld'));\n return {\n ...document,\n audienceLabel: audienceLabel(gate.audience, t),\n footnotes,\n withheld,\n locale: localeOf(t),\n };\n}\n\n/* ------------------------------- Summary -------------------------------- */\n\n/** The Summary tab: the patient's own questionnaire, one row per answered\n * question, grouped by section, with who authored each answer. */\nexport function buildSummaryExport(\n options: AnamnesisExportOptions,\n): ExportDocument {\n const { record, audience, t, config } = options;\n const generatedAtIso = options.generatedAtIso ?? new Date().toISOString();\n const gate: Gate = { audience, withheld: new Set() };\n\n if (!allow(gate, DOCUMENT_CONCEPT))\n return refusedDocument('summary', audience, t);\n\n const { meta, patientName } = baseMeta(record, gate, t, generatedAtIso);\n const tables: ExportTable[] = [];\n const footnotes: string[] = [];\n\n const intake = record.intake;\n if (allow(gate, 'intake.answers') && intake) {\n const rows: ExportRow[] = [];\n for (const section of allSectionsIncludingArchived(config)) {\n const answered = section.fields\n .filter((field) => fieldVisible(field, record.patient.sex))\n .filter((field) => intake.answers[field.key]);\n if (answered.length === 0) continue;\n rows.push(sectionRow(sectionLabel(section, t)));\n for (const field of answered) {\n const sourced = intake.answers[field.key];\n if (!sourced) continue;\n rows.push({\n cells: [\n intakeFieldLabel(field, t),\n textCell(formatIntakeAnswer(sourced.value, field, t)),\n t(`anamnesis.export.source.${sourced.origin}`),\n ],\n });\n }\n }\n tables.push({\n id: 'questionnaire',\n title: t('anamnesis.section.patientIntake'),\n columns: [\n { key: 'question', header: t('anamnesis.export.column.question') },\n { key: 'answer', header: t('anamnesis.export.column.answer') },\n { key: 'source', header: t('anamnesis.export.column.source') },\n ],\n rows,\n emptyText: t('anamnesis.summary.noAnswers'),\n });\n } else if (!intake) {\n footnotes.push(t('anamnesis.compile.noIntake'));\n }\n\n const referenceIso =\n calendarPart(intake?.submittedAtIso) ??\n calendarPart(latestVisit(record)?.dateIso) ??\n calendarPart(generatedAtIso);\n\n return finish(\n {\n tab: 'summary',\n audience,\n fileStem: buildFileStem(\n 'summary',\n record,\n referenceIso,\n !!patientName,\n audience,\n ),\n title: documentTitle('summary', patientName, t),\n patientName,\n meta,\n tables,\n },\n gate,\n t,\n footnotes,\n );\n}\n\n/* ------------------------------- Compile -------------------------------- */\n\nfunction measurementTable(\n id: string,\n title: string,\n defs: NumericParameterDef[],\n visit: Visit,\n gate: Gate,\n t: TFunction,\n withRange: boolean,\n): ExportTable | null {\n const rows: ExportRow[] = [];\n let anyAllowed = false;\n for (const def of defs) {\n if (!allow(gate, parameterConcept(def))) continue;\n anyAllowed = true;\n const value = parameterValueAt(visit, def);\n const cells: ExportValue[] = [\n parameterLabel(def, t),\n value,\n def.unit ?? null,\n ];\n if (withRange) {\n cells.push(referenceRangeText(def, t));\n cells.push(flagText(outOfRange(value, def.referenceRange), t));\n }\n rows.push({ cells, precision: def.precision });\n }\n if (!anyAllowed) return null;\n\n const columns: ExportColumn[] = [\n { key: 'parameter', header: t('anamnesis.grid.parameter') },\n { key: 'value', header: t('anamnesis.export.column.value'), numeric: true },\n { key: 'unit', header: t('anamnesis.export.column.unit') },\n ];\n if (withRange) {\n columns.push({\n key: 'referenceRange',\n header: t('anamnesis.export.column.referenceRange'),\n });\n columns.push({ key: 'flag', header: t('anamnesis.export.column.flag') });\n }\n return { id, title, columns, rows, emptyText: t('anamnesis.export.none') };\n}\n\nfunction fieldValueTable(\n id: string,\n title: string,\n rows: ExportRow[],\n t: TFunction,\n): ExportTable {\n return {\n id,\n title,\n columns: [\n { key: 'field', header: t('anamnesis.export.column.field') },\n { key: 'value', header: t('anamnesis.export.column.value') },\n ],\n rows,\n emptyText: t('anamnesis.export.none'),\n };\n}\n\n/** The Compile tab: the visit being recorded, block by block, in the order the\n * form presents them. Each block is gated on its own disclosure concept. */\nexport function buildCompileExport(\n options: AnamnesisExportOptions,\n): ExportDocument {\n const { record, audience, t, config } = options;\n const generatedAtIso = options.generatedAtIso ?? new Date().toISOString();\n const gate: Gate = { audience, withheld: new Set() };\n\n if (!allow(gate, DOCUMENT_CONCEPT))\n return refusedDocument('compile', audience, t);\n\n const { meta, patientName } = baseMeta(record, gate, t, generatedAtIso);\n const visit = latestVisit(record);\n const tables: ExportTable[] = [];\n const footnotes: string[] = [];\n\n if (!visit) {\n footnotes.push(t('anamnesis.export.none'));\n return finish(\n {\n tab: 'compile',\n audience,\n fileStem: buildFileStem(\n 'compile',\n record,\n calendarPart(generatedAtIso),\n !!patientName,\n audience,\n ),\n title: documentTitle('compile', patientName, t),\n patientName,\n meta,\n tables,\n },\n gate,\n t,\n footnotes,\n );\n }\n\n if (allow(gate, 'visit.date')) {\n meta.push({\n label: t('anamnesis.header.visitDate'),\n value: visitDateLabel(visit.dateIso, t),\n });\n }\n\n /* Visit details — each line its own concept, so a patient copy can carry the\n date and the practitioner without carrying anything else. */\n const visitRows: ExportRow[] = [];\n if (allow(gate, 'visit.type')) {\n visitRows.push({\n cells: [\n t('anamnesis.field.visitType.label'),\n t(`anamnesis.visitType.${visit.visitType}`),\n ],\n });\n }\n if (allow(gate, 'visit.date')) {\n visitRows.push({\n cells: [\n t('anamnesis.header.visitDate'),\n visitDateLabel(visit.dateIso, t),\n ],\n });\n }\n if (allow(gate, 'visit.practitioner') && visit.practitioner) {\n visitRows.push({\n cells: [\n t('anamnesis.field.practitioner.label'),\n textCell(visit.practitioner),\n ],\n });\n }\n if (visitRows.length > 0) {\n tables.push(\n fieldValueTable('visit', t('anamnesis.section.visitMeta'), visitRows, t),\n );\n }\n\n const anthro = measurementTable(\n 'anthropometrics',\n t('anamnesis.section.anthropometrics'),\n configuredParameters(config, 'anthropometric'),\n visit,\n gate,\n t,\n false,\n );\n if (anthro) tables.push(anthro);\n\n const dietary = measurementTable(\n 'dietary',\n t('anamnesis.section.dietary'),\n configuredParameters(config, 'dietary'),\n visit,\n gate,\n t,\n false,\n );\n if (dietary) tables.push(dietary);\n\n if (allow(gate, 'pathology.codes')) {\n const lookup = pathologyLookup(config);\n tables.push({\n id: 'pathologies',\n title: t('anamnesis.section.pathologies'),\n columns: [\n { key: 'code', header: t('anamnesis.export.column.code') },\n {\n key: 'description',\n header: t('anamnesis.export.column.description'),\n },\n ],\n rows: visit.pathologyCodes.map((code) => ({\n cells: [code, pathologyLabel(code, t, lookup[code])],\n })),\n emptyText: t('anamnesis.export.none'),\n });\n }\n\n if (allow(gate, 'oncological.history')) {\n const onc = visit.oncological;\n const rows: ExportRow[] = [];\n if (onc) {\n if (textCell(onc.tumourType))\n rows.push({\n cells: [\n t('anamnesis.field.tumourType.label'),\n textCell(onc.tumourType),\n ],\n });\n if (textCell(onc.stage))\n rows.push({\n cells: [t('anamnesis.field.stage.label'), textCell(onc.stage)],\n });\n if (onc.metastases) {\n const present = t(`anamnesis.common.${onc.metastases.present}`);\n const site = textCell(onc.metastases.site);\n rows.push({\n cells: [\n t('anamnesis.field.metastases.label'),\n site ? `${present} — ${site}` : present,\n ],\n });\n }\n if (textCell(onc.treatmentStatus))\n rows.push({\n cells: [\n t('anamnesis.field.treatmentStatus.label'),\n textCell(onc.treatmentStatus),\n ],\n });\n }\n tables.push(\n fieldValueTable(\n 'oncological',\n t('anamnesis.section.oncological'),\n rows,\n t,\n ),\n );\n }\n\n if (allow(gate, 'therapy.entries')) {\n tables.push({\n id: 'therapy',\n title: t('anamnesis.section.therapy'),\n columns: [\n { key: 'name', header: t('anamnesis.export.column.name') },\n { key: 'dose', header: t('anamnesis.export.column.dose') },\n { key: 'kind', header: t('anamnesis.export.column.kind') },\n ],\n rows: visit.therapy.map((entry) => ({\n cells: [\n textCell(entry.name),\n textCell(entry.dose),\n t(`anamnesis.medKind.${entry.kind}`),\n ],\n })),\n emptyText: t('anamnesis.compile.noTherapy'),\n });\n }\n\n const labs = measurementTable(\n 'labs',\n t('anamnesis.section.labs'),\n configuredParameters(config, 'lab'),\n visit,\n gate,\n t,\n true,\n );\n if (labs) tables.push(labs);\n\n if (allow(gate, 'fmd.cycles')) {\n tables.push({\n id: 'fmd',\n title: t('anamnesis.section.fmd'),\n columns: [\n { key: 'cycle', header: t('anamnesis.export.column.cycle') },\n { key: 'startDate', header: t('anamnesis.export.column.startDate') },\n { key: 'status', header: t('anamnesis.export.column.status') },\n { key: 'notes', header: t('anamnesis.export.column.notes') },\n ],\n rows: visit.fmdCycles.map((cycle) => ({\n cells: [\n t('anamnesis.compile.cycleNumber', { number: cycle.cycleNumber }),\n visitDateLabel(cycle.startDateIso, t),\n cycle.completed\n ? t('anamnesis.compile.cycleCompleted')\n : t('anamnesis.compile.cycleInProgress'),\n textCell(cycle.notes),\n ],\n })),\n emptyText: t('anamnesis.compile.noFmd'),\n });\n }\n\n if (allow(gate, 'annual.programme')) {\n const annual = visit.annualProgramme;\n const rows: ExportRow[] = [];\n if (annual) {\n const yesNo = (value: boolean) =>\n value ? t('anamnesis.common.yes') : t('anamnesis.common.no');\n rows.push({\n cells: [\n t('anamnesis.field.annualProposed.label'),\n yesNo(annual.proposed),\n ],\n });\n rows.push({\n cells: [\n t('anamnesis.field.annualAccepted.label'),\n yesNo(annual.accepted),\n ],\n });\n if (textCell(annual.declineReason))\n rows.push({\n cells: [\n t('anamnesis.field.annualDeclineReason.label'),\n textCell(annual.declineReason),\n ],\n });\n }\n tables.push(\n fieldValueTable('annual', t('anamnesis.section.annual'), rows, t),\n );\n }\n\n const noteRows: ExportRow[] = [];\n if (\n allow(gate, 'notes.nutritionalProposal') &&\n textCell(visit.nutritionalProposal)\n ) {\n noteRows.push({\n cells: [\n t('anamnesis.field.nutritionalProposal.label'),\n textCell(visit.nutritionalProposal),\n ],\n });\n }\n if (allow(gate, 'notes.clinicalNotes') && textCell(visit.clinicalNotes)) {\n noteRows.push({\n cells: [\n t('anamnesis.field.clinicalNotes.label'),\n textCell(visit.clinicalNotes),\n ],\n });\n }\n if (noteRows.length > 0) {\n tables.push({\n id: 'notes',\n title: t('anamnesis.section.proposal'),\n columns: [\n { key: 'note', header: t('anamnesis.export.column.note') },\n { key: 'text', header: t('anamnesis.export.column.text') },\n ],\n rows: noteRows,\n emptyText: t('anamnesis.export.none'),\n });\n }\n\n return finish(\n {\n tab: 'compile',\n audience,\n fileStem: buildFileStem(\n 'compile',\n record,\n calendarPart(visit.dateIso) ?? calendarPart(generatedAtIso),\n !!patientName,\n audience,\n ),\n title: documentTitle('compile', patientName, t),\n patientName,\n meta,\n tables,\n },\n gate,\n t,\n footnotes,\n );\n}\n\n/* ------------------------------ Evolution ------------------------------- */\n\nfunction outOfRangeText(\n row: ParameterRow,\n columns: readonly VisitColumn[],\n t: TFunction,\n): ExportValue {\n const flagged = columns\n .map((column) => {\n const flag = row.cells[column.index]?.outOfRange ?? null;\n if (!flag) return null;\n return t('anamnesis.export.flagged', {\n date: visitDateLabel(column.visit.dateIso, t),\n flag: flagText(flag, t),\n });\n })\n .filter((entry): entry is string => entry != null);\n if (flagged.length === 0) return null;\n return flagged.join(t('anamnesis.export.listSeparator'));\n}\n\n/** Change ACROSS THE SHOWN WINDOW — last shown value minus first shown value.\n * The grid draws a per-cell delta against the previous visit; a single column\n * in a file has to say which two figures it compares, so the header names the\n * two dates. On the default two-column selection the two readings coincide. */\nfunction windowChange(\n row: ParameterRow,\n columns: readonly VisitColumn[],\n): number | null {\n if (columns.length < 2) return null;\n const first = row.cells[columns[0].index]?.value ?? null;\n const last = row.cells[columns[columns.length - 1].index]?.value ?? null;\n if (first == null || last == null) return null;\n return last - first;\n}\n\n/** The Evolution tab: parameters as rows, the SHOWN visits as columns, plus\n * target, window change and which visits fell out of range. */\nexport function buildEvolutionExport(\n options: EvolutionExportOptions,\n): ExportDocument {\n const { record, audience, t, config } = options;\n const generatedAtIso = options.generatedAtIso ?? new Date().toISOString();\n const scope: EvolutionExportScope = options.scope ?? 'selected';\n const gate: Gate = { audience, withheld: new Set() };\n\n if (!allow(gate, DOCUMENT_CONCEPT))\n return refusedDocument('evolution', audience, t);\n\n const { meta, patientName } = baseMeta(record, gate, t, generatedAtIso);\n const tables: ExportTable[] = [];\n const footnotes: string[] = [];\n\n /* An EMPTY selection is not a selection. `?? default` alone lets a `[]` from\n a host that has not yet mirrored the picker through, and that yields a\n document with no matrix, no withheld concepts, and a menu line reading \"a\n patient copy leaves nothing out\" over a copy that dropped every lab. */\n const passed = options.selectedVisitIds\n ? [...options.selectedVisitIds]\n : null;\n const selectedIds =\n passed && passed.length > 0\n ? passed\n : defaultSelectedVisitIds(record.visits);\n const columns =\n scope === 'all'\n ? allVisitColumns(record.visits)\n : windowVisits(record.visits, selectedIds).columns;\n\n meta.push({\n label: t('anamnesis.export.visitsLabel'),\n value:\n scope === 'all'\n ? t('anamnesis.export.visitsAll', { total: record.visits.length })\n : t('anamnesis.export.visitsSelected', {\n shown: columns.length,\n total: record.visits.length,\n }),\n });\n\n /* The matrix is unreadable without dated columns, so the whole table hangs\n off `visit.date` rather than emitting columns nobody may name. */\n if (allow(gate, 'visit.date') && columns.length > 0) {\n const defs = allParametersIncludingArchived(config);\n const parameterRows = buildParameterRows(record, defs);\n const fromDate = visitDateLabel(columns[0].visit.dateIso, t);\n const toDate = visitDateLabel(columns[columns.length - 1].visit.dateIso, t);\n\n const tableColumns: ExportColumn[] = [\n { key: 'parameter', header: t('anamnesis.grid.parameter') },\n { key: 'unit', header: t('anamnesis.export.column.unit') },\n {\n key: 'referenceRange',\n header: t('anamnesis.export.column.referenceRange'),\n },\n ...columns.map((column) => ({\n key: `visit-${column.visit.id}`,\n header: visitDateLabel(column.visit.dateIso, t),\n numeric: true,\n })),\n {\n key: 'target',\n header: t('anamnesis.export.column.target'),\n numeric: true,\n },\n {\n key: 'change',\n header: t('anamnesis.export.column.change', {\n from: fromDate,\n to: toDate,\n }),\n numeric: true,\n },\n { key: 'outOfRange', header: t('anamnesis.export.column.outOfRange') },\n ];\n\n const rows: ExportRow[] = [];\n let lastGroup: string | null = null;\n for (const row of parameterRows) {\n if (!allow(gate, parameterConcept(row.def))) continue;\n if (row.def.group !== lastGroup) {\n lastGroup = row.def.group;\n rows.push(sectionRow(t(`anamnesis.group.${row.def.group}`)));\n }\n rows.push({\n precision: row.def.precision,\n cells: [\n parameterLabel(row.def, t),\n row.def.unit ?? null,\n referenceRangeText(row.def, t),\n ...columns.map((column) => row.cells[column.index]?.value ?? null),\n row.target,\n windowChange(row, columns),\n outOfRangeText(row, columns, t),\n ],\n });\n }\n\n tables.push({\n id: 'matrix',\n title: t('anamnesis.section.evolution'),\n columns: tableColumns,\n rows,\n emptyText: t('anamnesis.export.none'),\n });\n } else if (columns.length === 0) {\n footnotes.push(t('anamnesis.export.none'));\n }\n\n const referenceIso =\n calendarPart(columns[columns.length - 1]?.visit.dateIso) ??\n calendarPart(generatedAtIso);\n\n return finish(\n {\n tab: 'evolution',\n audience,\n fileStem: buildFileStem(\n 'evolution',\n record,\n referenceIso,\n !!patientName,\n audience,\n ),\n title: documentTitle('evolution', patientName, t),\n patientName,\n meta,\n tables,\n },\n gate,\n t,\n footnotes,\n );\n}\n\n/** One entry point for a tab id — the UI stage switches on the active tab. */\nexport function buildAnamnesisExport(\n tab: AnamnesisExportTab,\n options: EvolutionExportOptions,\n): ExportDocument {\n switch (tab) {\n case 'summary':\n return buildSummaryExport(options);\n case 'compile':\n return buildCompileExport(options);\n case 'evolution':\n return buildEvolutionExport(options);\n }\n}\n\n/* -------------------- What a copy holds and holds back ------------------- */\n\n/** A withheld concept's translated name. The id carries dots and i18next reads\n * a dot as a level, so the key flattens them — `lab.values` reads\n * `anamnesis.export.concept.lab_values`. An id with no key falls back to the\n * id rather than to a blank, so a rule nobody has named still shows up. */\nexport function conceptLabel(conceptId: string, t: TFunction): string {\n return t(`anamnesis.export.concept.${conceptId.replace(/\\./g, '_')}`, {\n defaultValue: conceptId,\n });\n}\n\nexport interface DocumentDisclosure {\n /** Table titles the document actually carries, in document order. */\n included: string[];\n /** Translated names of the concepts held back, alphabetical. */\n excluded: string[];\n}\n\n/** What this document gives the audience and what it holds back — the share\n * dialog's whole content, and the menu's exclusion line. Reads the built\n * document rather than re-deriving the rules, so the preview cannot disagree\n * with the file. */\nexport function documentDisclosure(\n document: ExportDocument,\n t: TFunction,\n): DocumentDisclosure {\n return {\n included: document.tables.map((table) => table.title),\n excluded: document.withheld\n .map((id) => conceptLabel(id, t))\n .sort((a, b) => a.localeCompare(b, document.locale)),\n };\n}\n\n/* --------------------------------- CSV ---------------------------------- */\n\nexport const CSV_MIME = 'text/csv;charset=utf-8';\nexport const XLSX_MIME =\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n\nexport interface CsvDialect {\n /** Field separator. `;` wherever the decimal mark is a comma. */\n delimiter: ',' | ';';\n decimal: '.' | ',';\n eol: string;\n /** Emit a UTF-8 BOM so Excel detects the encoding instead of guessing. */\n bom: boolean;\n}\n\n/** RFC 4180, and the line ending Excel expects on every platform. */\nconst CSV_EOL = '\\r\\n';\n\n/** A leading `=` `+` `-` `@` (or tab / CR) turns a text cell into a formula in\n * Excel and Sheets. Guarded on TEXT cells only — a numeric cell goes down the\n * number path, so `-12.5` is never mangled into `'-12.5`. */\nconst CSV_INJECTION = /^[=+\\-@\\t\\r]/;\n\nfunction decimalSeparatorFor(locale: string | undefined): '.' | ',' {\n if (!locale) return '.';\n try {\n const parts = new Intl.NumberFormat(locale, {\n useGrouping: false,\n }).formatToParts(1.5);\n return parts.find((part) => part.type === 'decimal')?.value === ','\n ? ','\n : '.';\n } catch {\n return '.';\n }\n}\n\n/** The CSV convention Excel expects for a locale. Italian (and every other\n * decimal-comma locale) gets `;` + `,`; English gets `,` + `.`. A locale whose\n * decimal mark is neither — Arabic's `٫` — takes the point convention, because\n * the numbers written here are Latin digits either way. */\nexport function csvDialectFor(locale?: string): CsvDialect {\n return decimalSeparatorFor(locale) === ','\n ? { delimiter: ';', decimal: ',', eol: CSV_EOL, bom: true }\n : { delimiter: ',', decimal: '.', eol: CSV_EOL, bom: true };\n}\n\nfunction formatCsvNumber(\n value: number,\n precision: number | undefined,\n dialect: CsvDialect,\n): string {\n if (!Number.isFinite(value)) return '';\n const text = precision == null ? String(value) : value.toFixed(precision);\n return dialect.decimal === ',' ? text.replace('.', ',') : text;\n}\n\nfunction escapeCsvText(raw: string, dialect: CsvDialect): string {\n const guarded = CSV_INJECTION.test(raw) ? `'${raw}` : raw;\n const mustQuote =\n guarded.includes(dialect.delimiter) ||\n guarded.includes('\"') ||\n guarded.includes('\\n') ||\n guarded.includes('\\r') ||\n guarded !== guarded.trim();\n return mustQuote ? `\"${guarded.replace(/\"/g, '\"\"')}\"` : guarded;\n}\n\n/** One cell, escaped. Exported for the tests that pin the escaping rules. */\nexport function csvCell(\n value: ExportValue,\n dialect: CsvDialect,\n precision?: number,\n): string {\n if (value == null) return '';\n if (typeof value === 'number')\n return formatCsvNumber(value, precision, dialect);\n return escapeCsvText(value, dialect);\n}\n\nfunction cellPrecision(\n row: ExportRow,\n column: ExportColumn | undefined,\n): number | undefined {\n return row.precision ?? column?.precision;\n}\n\n/** The document as one CSV. Tables run in order, each behind its own title\n * row and separated by a blank line — the report shape every spreadsheet\n * reader already understands. */\nexport function toCsv(\n document: ExportDocument,\n dialect: CsvDialect = csvDialectFor(document.locale),\n): string {\n const lines: string[] = [];\n const push = (fields: readonly string[]) =>\n lines.push(fields.join(dialect.delimiter));\n\n push([escapeCsvText(document.title, dialect)]);\n for (const entry of document.meta) {\n push([\n escapeCsvText(entry.label, dialect),\n escapeCsvText(entry.value, dialect),\n ]);\n }\n\n for (const table of document.tables) {\n lines.push('');\n push([escapeCsvText(table.title, dialect)]);\n push(table.columns.map((column) => escapeCsvText(column.header, dialect)));\n if (table.rows.length === 0 && table.emptyText) {\n push([escapeCsvText(table.emptyText, dialect)]);\n continue;\n }\n for (const row of table.rows) {\n if (row.kind === 'section') {\n push([csvCell(row.cells[0] ?? null, dialect)]);\n continue;\n }\n push(\n table.columns.map((column, index) =>\n csvCell(\n row.cells[index] ?? null,\n dialect,\n cellPrecision(row, column),\n ),\n ),\n );\n }\n }\n\n if (document.footnotes.length > 0) {\n lines.push('');\n for (const note of document.footnotes) push([escapeCsvText(note, dialect)]);\n }\n\n return lines.join(dialect.eol) + dialect.eol;\n}\n\nexport function toCsvBlob(\n document: ExportDocument,\n dialect: CsvDialect = csvDialectFor(document.locale),\n): Blob {\n const body = toCsv(document, dialect);\n return new Blob([dialect.bom ? `\\uFEFF${body}` : body], { type: CSV_MIME });\n}\n\n/* -------------------------------- Excel --------------------------------- */\n\n/** Excel forbids `\\ / ? * [ ] :` in a sheet name and caps it at 31 chars. */\nfunction sheetName(raw: string, used: Set<string>): string {\n const cleaned = raw\n .replace(/[\\\\/?*[\\]:]/g, ' ')\n .trim()\n .slice(0, 31);\n let name = cleaned || 'Sheet';\n let index = 2;\n while (used.has(name.toLowerCase())) {\n const suffix = ` (${index})`;\n name = `${cleaned.slice(0, 31 - suffix.length)}${suffix}`;\n index += 1;\n }\n used.add(name.toLowerCase());\n return name;\n}\n\nfunction numberFormatFor(precision: number | undefined): string | undefined {\n if (precision == null) return undefined;\n return precision > 0 ? `0.${'0'.repeat(precision)}` : '0';\n}\n\nconst MIN_COLUMN_WIDTH = 12;\nconst MAX_COLUMN_WIDTH = 60;\n\nfunction columnWidth(header: string, cells: readonly ExportValue[]): number {\n const longest = cells.reduce<number>(\n (max, cell) => Math.max(max, cell == null ? 0 : String(cell).length),\n header.length,\n );\n return Math.min(MAX_COLUMN_WIDTH, Math.max(MIN_COLUMN_WIDTH, longest + 2));\n}\n\n/** The document as an `.xlsx` — the info block on its own sheet, then one\n * sheet per table. No colour: the kit's tokens are CSS custom properties that\n * only resolve against a live DOM, and this module has none. Weight and\n * freeze-panes carry the hierarchy instead. The workbook library is\n * dynamic-imported so it stays out of the bundle of a consumer who never\n * exports. */\nexport async function toXlsxBlob(document: ExportDocument): Promise<Blob> {\n const { default: writeExcelFile } =\n await import('write-excel-file/universal');\n const used = new Set<string>();\n const bold = (value: ExportValue): Cell =>\n value == null ? null : { value, fontWeight: 'bold' };\n\n const infoData: SheetData = [[bold(document.title)]];\n for (const entry of document.meta) infoData.push([entry.label, entry.value]);\n if (document.footnotes.length > 0) {\n infoData.push([null]);\n for (const note of document.footnotes) infoData.push([note]);\n }\n const sheets: Sheet<Blob>[] = [\n {\n data: infoData,\n sheet: sheetName(document.title, used),\n columns: [{ width: 28 }, { width: 48 }],\n },\n ];\n\n for (const table of document.tables) {\n const data: SheetData = [\n table.columns.map((column) => bold(column.header)),\n ];\n if (table.rows.length === 0 && table.emptyText) {\n data.push([table.emptyText]);\n }\n for (const row of table.rows) {\n if (row.kind === 'section') {\n data.push([bold(row.cells[0] ?? null)]);\n continue;\n }\n data.push(\n table.columns.map((column, index): Cell => {\n const value = row.cells[index] ?? null;\n if (typeof value !== 'number') return value;\n const format = numberFormatFor(cellPrecision(row, column));\n return {\n value,\n type: Number,\n align: 'right',\n ...(format ? { format } : {}),\n };\n }),\n );\n }\n sheets.push({\n data,\n sheet: sheetName(table.title, used),\n stickyRowsCount: 1,\n columns: table.columns.map((column, index) => ({\n width: columnWidth(\n column.header,\n table.rows.map((row) => row.cells[index] ?? null),\n ),\n })),\n });\n }\n\n return writeExcelFile(sheets).toBlob();\n}\n\n/* ------------------------------ Filenames ------------------------------- */\n\nexport type ExportFormat = 'csv' | 'xlsx' | 'pdf';\n\n/** Deterministic, meaningful, and free of anything a filesystem rejects. */\nexport function exportFileName(\n document: ExportDocument,\n format: ExportFormat,\n): string {\n return `${document.fileStem}.${format}`;\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — the download trigger */\n/* */\n/* The ONLY part of the export path that touches the DOM. Kept out of */\n/* `anamnesis-export.ts` so the serialisers and the writers stay pure and */\n/* unit-testable without a browser. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\nimport {\n type CsvDialect,\n csvDialectFor,\n type ExportDocument,\n exportFileName,\n toCsvBlob,\n toXlsxBlob,\n} from './anamnesis-export';\n\n/** Hand a Blob to the browser as a download. Returns `false` where there is no\n * DOM to hand it to (SSR, a node test), so callers can fall back rather than\n * throw. */\nexport function downloadBlob(blob: Blob, filename: string): boolean {\n if (\n typeof window === 'undefined' ||\n typeof document === 'undefined' ||\n typeof URL === 'undefined' ||\n typeof URL.createObjectURL !== 'function'\n ) {\n return false;\n }\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n // NOT in this tick. Chrome starts the fetch inside the click dispatch, but\n // Safari and older Firefox revoke first and the download silently aborts —\n // no file, no error to catch, and the caller still says \"ready\".\n window.setTimeout(() => URL.revokeObjectURL(url), 0);\n return true;\n}\n\n/** Download the document as a `.csv` in the dialect its locale calls for. */\nexport function downloadCsv(\n doc: ExportDocument,\n dialect: CsvDialect = csvDialectFor(doc.locale),\n): boolean {\n return downloadBlob(toCsvBlob(doc, dialect), exportFileName(doc, 'csv'));\n}\n\n/** Download the document as an `.xlsx`. Async: the workbook library is dynamic-imported. */\nexport async function downloadXlsx(doc: ExportDocument): Promise<boolean> {\n return downloadBlob(await toXlsxBlob(doc), exportFileName(doc, 'xlsx'));\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — the PDF writer, and the print path */\n/* */\n/* The fourth writer over the ONE `ExportDocument` shape from */\n/* `anamnesis-export.ts`. CSV and Excel are for a spreadsheet; this is the */\n/* human-readable copy — and it is also what PRINTS. */\n/* */\n/* WHY PRINT ROUTES THROUGH HERE. There is no `@media print` anywhere in */\n/* the kit, so `window.print()` prints the app shell — sidebar, header, */\n/* rail — around the record. A pattern-scoped print stylesheet would not */\n/* fix it either: Radix Tabs unmounts the inactive panels, so the only */\n/* thing on the page to print is the ACTIVE tab's live DOM — a form of */\n/* inputs on Compile, a sticky horizontally-scrolled matrix on Evolution. */\n/* Printing the DOCUMENT instead means print and PDF are the same bytes, */\n/* and print honours the disclosure gate for free. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\nimport type { Table as AutoTable, UserOptions } from 'jspdf-autotable';\nimport {\n type ExportDocument,\n type ExportRow,\n type ExportTable,\n type ExportValue,\n exportFileName,\n} from './anamnesis-export';\nimport { downloadBlob } from './anamnesis-export-download';\nimport {\n canonicalLocale,\n numberLocale,\n} from '../../components/_shared/intl-locale';\n\nexport const PDF_MIME = 'application/pdf';\n\n/* ------------------------------- Palette -------------------------------- */\n\nexport type PdfRgb = [number, number, number];\n\nexport interface PdfPalette {\n headerFill: PdfRgb;\n headerText: PdfRgb;\n bodyText: PdfRgb;\n mutedText: PdfRgb;\n zebraFill: PdfRgb;\n sectionFill: PdfRgb;\n}\n\n/** Legible without a DOM to read tokens from — a light fill and a dark text\n * everywhere, never white-on-white. Only ever a fallback. */\nconst PDF_FALLBACK: PdfPalette = {\n headerFill: [237, 237, 240],\n headerText: [24, 24, 27],\n bodyText: [24, 24, 27],\n mutedText: [96, 96, 106],\n zebraFill: [249, 249, 250],\n sectionFill: [232, 232, 236],\n};\n\n/** Resolve a DS colour token to `[r, g, b]` by letting the browser do it.\n *\n * READ THE TOKEN, THEN RESOLVE IT — two steps, not one. The kit's colour\n * tokens hold finished colour VALUES (`--muted: var(--color-blue-50)` →\n * `#eaeaee`), not the raw `H S% L%` triplets shadcn ships, so wrapping them in\n * `hsl()` produces an invalid declaration; `color` is inherited, so an invalid\n * one silently resolves to the parent's text colour and every role comes back\n * the same. Assigning the raw value instead makes a bad token detectable: the\n * CSSOM rejects it at parse time and `.style.color` stays empty, which is the\n * one honest signal to take the fallback.\n *\n * The token is read from INSIDE the pattern (not `<body>`), or the theme class\n * on the kit's wrapper would not apply. Mutating `.style` on a throwaway probe\n * that never enters JSX is the same escape hatch the DataTable's PDF path\n * takes (src/docs/23-constraints.mdx). */\nfunction resolveTokenRgb(\n varName: string,\n fallback: PdfRgb,\n scope: Element | null | undefined,\n): PdfRgb {\n if (typeof document === 'undefined' || typeof getComputedStyle !== 'function')\n return fallback;\n const host = scope ?? document.body;\n if (!host) return fallback;\n const value = getComputedStyle(host).getPropertyValue(varName).trim();\n if (!value) return fallback;\n const probe = document.createElement('span');\n probe.style.color = value;\n // Rejected at parse time ⇒ not a colour this browser understands.\n if (!probe.style.color) return fallback;\n probe.style.position = 'absolute';\n probe.style.visibility = 'hidden';\n host.appendChild(probe);\n const computed = getComputedStyle(probe).color;\n probe.remove();\n const match = computed.match(/rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)/i);\n if (!match) return fallback;\n return [Number(match[1]), Number(match[2]), Number(match[3])];\n}\n\n/** The document palette for the theme `scope` is rendered in. Pass the pattern\n * root; omit it and the fallback greys are used. */\nexport function pdfPalette(scope?: Element | null): PdfPalette {\n return {\n headerFill: resolveTokenRgb('--muted', PDF_FALLBACK.headerFill, scope),\n headerText: resolveTokenRgb('--foreground', PDF_FALLBACK.headerText, scope),\n bodyText: resolveTokenRgb(\n '--card-foreground',\n PDF_FALLBACK.bodyText,\n scope,\n ),\n mutedText: resolveTokenRgb(\n '--muted-foreground',\n PDF_FALLBACK.mutedText,\n scope,\n ),\n zebraFill: resolveTokenRgb('--card', PDF_FALLBACK.zebraFill, scope),\n sectionFill: resolveTokenRgb('--muted', PDF_FALLBACK.sectionFill, scope),\n };\n}\n\n/* --------------------------- Character coverage -------------------------- */\n\n/* jsPDF's built-in faces are the standard-14, and those are WinAnsi (cp1252).\n * ONE character outside it flips the WHOLE string to UTF-16, which a\n * standard-14 font cannot draw — so a single `→` in a column header does not\n * lose the arrow, it loses the header. The symbols below are the ones the kit's\n * own strings reach for; they are respelled rather than dropped so the meaning\n * survives. Characters from another script are left alone: there is nothing to\n * respell them as, and a font subset is the only real fix (FOLLOW-UPS.md). */\nconst WINANSI_SUBSTITUTIONS: ReadonlyArray<readonly [string, string]> = [\n ['→', '->'], // → the Evolution change header\n ['←', '<-'],\n ['↔', '<->'],\n ['⇒', '=>'],\n ['↑', '^'],\n ['↓', 'v'],\n ['≥', '>='], // ≥ reference range, at least\n ['≤', '<='], // ≤ reference range, at most\n ['≈', '~'],\n ['≠', '!='],\n ['−', '-'], // minus sign\n ['‐', '-'], // hyphen\n ['‑', '-'], // non-breaking hyphen\n ['‒', '-'], // figure dash\n ['Δ', 'D'], // Δ\n ['∞', 'inf'],\n ['⁄', '/'],\n // Spaces `Intl.NumberFormat` groups with in several locales.\n ['\\u202f', ' '], // narrow no-break space\n ['\\u2009', ' '], // thin space\n ['\\u2007', ' '], // figure space\n ['\\u2060', ''], // word joiner\n];\n\n/** The cp1252 0x80–0x9f block, which Latin-1 does not cover: the curly\n * quotes, the dashes, the bullet, the ellipsis, the per-mille. */\nconst WINANSI_SPECIALS = new Set(\n [\n 0x20ac, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030,\n 0x0160, 0x2039, 0x0152, 0x017d, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022,\n 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x017e, 0x0178,\n ].map((code) => String.fromCodePoint(code)),\n);\n\n/** True when jsPDF can draw `text` with a built-in face — i.e. it will not be\n * silently re-encoded as UTF-16. */\nexport function isWinAnsiSafe(text: string): boolean {\n for (const character of text) {\n const code = character.codePointAt(0) ?? 0;\n if (code === 0x0a || code === 0x0d || code === 0x09) continue;\n if (code >= 0x20 && code <= 0x7e) continue;\n if (code >= 0xa0 && code <= 0xff) continue;\n if (WINANSI_SPECIALS.has(character)) continue;\n return false;\n }\n return true;\n}\n\n/** Respell the symbols a standard-14 face cannot draw. Applied at the writer\n * boundary, so the arrow survives on screen and in the spreadsheet. */\nexport function pdfSafeText(text: string): string {\n let out = text;\n for (const [from, to] of WINANSI_SUBSTITUTIONS) {\n if (out.includes(from)) out = out.split(from).join(to);\n }\n return out;\n}\n\n/* ------------------------------ Page layout ----------------------------- */\n\n/* Millimetres. A4 portrait is 210 wide; a matrix of visit columns needs more\n * than that, so the orientation follows the widest table. */\nconst MARGIN = 14;\nconst WIDE_TABLE_COLUMNS = 6;\nconst TITLE_SIZE = 15;\nconst META_SIZE = 9;\nconst TABLE_TITLE_SIZE = 11;\nconst BODY_SIZE = 8.5;\nconst FOOTNOTE_SIZE = 8;\nconst LINE = 5;\n\nfunction isWide(document: ExportDocument): boolean {\n return document.tables.some(\n (table) => table.columns.length > WIDE_TABLE_COLUMNS,\n );\n}\n\n/** Latin digits with the reader's decimal mark — this is a document a person\n * reads, not a cell a spreadsheet computes on, so it follows the locale\n * rather than the CSV dialect. */\nfunction formatNumber(\n value: number,\n precision: number | undefined,\n locale: string | undefined,\n): string {\n if (!Number.isFinite(value)) return '';\n try {\n // The kit's number tag: Albanian borrows Polish digits on Chromium.\n return new Intl.NumberFormat(\n locale ? numberLocale(canonicalLocale(locale)) : undefined,\n {\n minimumFractionDigits: precision ?? 0,\n maximumFractionDigits: precision ?? 3,\n },\n ).format(value);\n } catch {\n return precision == null ? String(value) : value.toFixed(precision);\n }\n}\n\nfunction cellText(\n value: ExportValue,\n precision: number | undefined,\n locale: string | undefined,\n): string {\n if (value == null) return '';\n return pdfSafeText(\n typeof value === 'number' ? formatNumber(value, precision, locale) : value,\n );\n}\n\nfunction rowText(\n row: ExportRow,\n table: ExportTable,\n locale: string | undefined,\n): string[] {\n return table.columns.map((column, index) =>\n cellText(\n row.cells[index] ?? null,\n row.precision ?? column.precision,\n locale,\n ),\n );\n}\n\n/* --------------------------------- Writer ------------------------------- */\n\nexport interface PdfOptions {\n palette?: PdfPalette;\n /** Set the PDF's own open action so the viewer raises the print dialog.\n * This is what the Print item uses; a downloaded PDF leaves it off. */\n autoPrint?: boolean;\n}\n\n/** The document as a paged PDF. jspdf + jspdf-autotable are dynamic-imported,\n * so neither ships to a consumer who never exports. */\nexport async function toPdfBlob(\n document: ExportDocument,\n options: PdfOptions = {},\n): Promise<Blob> {\n const [{ jsPDF }, { default: autoTable }] = await Promise.all([\n import('jspdf'),\n import('jspdf-autotable'),\n ]);\n\n const palette = options.palette ?? PDF_FALLBACK;\n const locale = document.locale;\n const doc = new jsPDF({\n orientation: isWide(document) ? 'landscape' : 'portrait',\n unit: 'mm',\n format: 'a4',\n });\n const pageWidth = doc.internal.pageSize.getWidth();\n const pageHeight = doc.internal.pageSize.getHeight();\n const contentWidth = pageWidth - MARGIN * 2;\n\n // jsPDF's built-in faces are the only ones in the file without embedding a\n // subset; `helvetica` is the same one the DataTable's PDF path uses. The\n // kit's own faces are CSS tokens and cannot be handed to jsPDF.\n const setFace = (weight: 'normal' | 'bold', size: number, colour: PdfRgb) => {\n doc.setFont('helvetica', weight);\n doc.setFontSize(size);\n doc.setTextColor(colour[0], colour[1], colour[2]);\n };\n\n let cursorY = MARGIN;\n\n setFace('bold', TITLE_SIZE, palette.headerText);\n for (const line of doc.splitTextToSize(\n pdfSafeText(document.title),\n contentWidth,\n )) {\n doc.text(line, MARGIN, cursorY);\n cursorY += LINE + 1;\n }\n cursorY += 1;\n\n setFace('normal', META_SIZE, palette.mutedText);\n for (const entry of document.meta) {\n doc.text(pdfSafeText(`${entry.label}: ${entry.value}`), MARGIN, cursorY);\n cursorY += LINE - 0.6;\n }\n\n for (const table of document.tables) {\n cursorY += LINE;\n if (cursorY > pageHeight - MARGIN * 2) {\n doc.addPage();\n cursorY = MARGIN;\n }\n setFace('bold', TABLE_TITLE_SIZE, palette.headerText);\n doc.text(pdfSafeText(table.title), MARGIN, cursorY);\n cursorY += 2;\n\n if (table.rows.length === 0 && table.emptyText) {\n cursorY += LINE;\n setFace('normal', BODY_SIZE, palette.mutedText);\n doc.text(pdfSafeText(table.emptyText), MARGIN, cursorY);\n cursorY += 1;\n continue;\n }\n\n // A section row banners its group: the label sits in the first cell and\n // spans the table, which is why it is styled rather than laid out.\n const sectionRows = new Set<number>();\n const body = table.rows.map((row, index) => {\n if (row.kind === 'section') {\n sectionRows.add(index);\n return [\n cellText(row.cells[0] ?? null, undefined, locale),\n ...table.columns.slice(1).map(() => ''),\n ];\n }\n return rowText(row, table, locale);\n });\n\n const capture: { table?: AutoTable } = {};\n const settings: UserOptions = {\n head: [table.columns.map((column) => pdfSafeText(column.header))],\n body,\n startY: cursorY + 2,\n margin: { left: MARGIN, right: MARGIN, bottom: MARGIN + LINE },\n theme: 'grid',\n styles: {\n font: 'helvetica',\n fontSize: BODY_SIZE,\n cellPadding: 1.6,\n textColor: palette.bodyText,\n lineColor: palette.headerFill,\n lineWidth: 0.1,\n overflow: 'linebreak',\n },\n headStyles: {\n fillColor: palette.headerFill,\n textColor: palette.headerText,\n fontStyle: 'bold',\n },\n alternateRowStyles: { fillColor: palette.zebraFill },\n columnStyles: Object.fromEntries(\n table.columns.map((column, index) => [\n index,\n column.numeric ? { halign: 'right' as const } : {},\n ]),\n ),\n didParseCell: (data) => {\n if (data.section !== 'body') return;\n if (!sectionRows.has(data.row.index)) return;\n data.cell.styles.fillColor = palette.sectionFill;\n data.cell.styles.textColor = palette.headerText;\n data.cell.styles.fontStyle = 'bold';\n },\n didDrawPage: (data) => {\n capture.table = data.table;\n },\n };\n autoTable(doc, settings);\n cursorY = capture.table?.finalY ?? cursorY + LINE;\n }\n\n if (document.footnotes.length > 0) {\n cursorY += LINE + 1;\n if (cursorY > pageHeight - MARGIN * 2) {\n doc.addPage();\n cursorY = MARGIN;\n }\n setFace('normal', FOOTNOTE_SIZE, palette.mutedText);\n for (const note of document.footnotes) {\n for (const line of doc.splitTextToSize(pdfSafeText(note), contentWidth)) {\n doc.text(line, MARGIN, cursorY);\n cursorY += LINE - 1;\n }\n }\n }\n\n // Page 2 of a loose clinical record identifies nobody, and a practice copy\n // and a patient copy are otherwise the same object on a desk. Both ride\n // every page.\n const stamp = pdfSafeText(\n [document.patientName, document.audienceLabel].filter(Boolean).join(' · '),\n );\n const pages = doc.getNumberOfPages();\n for (let page = 1; page <= pages; page += 1) {\n doc.setPage(page);\n setFace('normal', FOOTNOTE_SIZE, palette.mutedText);\n if (stamp) doc.text(stamp, MARGIN, pageHeight - MARGIN + 4);\n doc.text(\n `${page} / ${pages}`,\n pageWidth - MARGIN,\n pageHeight - MARGIN + 4,\n { align: 'right' },\n );\n }\n\n if (options.autoPrint) doc.autoPrint();\n return doc.output('blob');\n}\n\n/* ----------------------------- Download / print -------------------------- */\n\n/** Download the document as a `.pdf`. */\nexport async function downloadPdf(\n document: ExportDocument,\n options: PdfOptions = {},\n): Promise<boolean> {\n return downloadBlob(\n await toPdfBlob(document, options),\n exportFileName(document, 'pdf'),\n );\n}\n\n/** Point an off-screen frame at the document with the print action armed, and\n * hand the object URL back so the caller can revoke it. `null` means there was\n * no frame or no `URL.createObjectURL` to build one with. */\nexport async function printPdf(\n document: ExportDocument,\n frame: HTMLIFrameElement | null,\n options: PdfOptions = {},\n): Promise<string | null> {\n if (!frame) return null;\n if (typeof URL === 'undefined' || typeof URL.createObjectURL !== 'function')\n return null;\n const blob = await toPdfBlob(document, { ...options, autoPrint: true });\n const url = URL.createObjectURL(blob);\n frame.setAttribute('src', url);\n return url;\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — the one export / share control */\n/* */\n/* ONE affordance for the whole Diagnosis surface, not one per table. It */\n/* acts on the tab that is currently selected and says so, in the trigger's */\n/* accessible name and again in the menu's own header. */\n/* */\n/* ORDER CARRIES A MESSAGE. Share → PDF → Print → Excel → CSV: the routes */\n/* that keep the record in the practice come first, the spreadsheet last. */\n/* Excel is not hidden — a clinician who wants it is one item away — but a */\n/* menu that leads with it teaches \"take the data out and work elsewhere\". */\n/* */\n/* AUDIENCE IS THE SAFETY FEATURE. One radio governs all five routes, and */\n/* whenever the patient copy is chosen the menu names, on screen, what that */\n/* copy leaves out. Nothing here is a security boundary — the real */\n/* guarantee is a server-side check on the document-generation path. */\n/* */\n/* SHARE IS A MOCK. The dialog shows the SHAPE of a share and says so. It */\n/* transmits nothing, and no string in it claims otherwise. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\nimport type { TFunction } from 'i18next';\nimport {\n ChevronDown,\n Download,\n FileSpreadsheet,\n FileText,\n Printer,\n Share2,\n} from 'lucide-react';\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Alert } from '../../components/alert';\nimport { Badge } from '../../components/badge';\nimport { Button } from '../../components/button';\nimport { Dialog } from '../../components/dialog';\nimport { DropdownMenu } from '../../components/dropdown-menu';\nimport { Radio, RadioGroup } from '../../components/radio-group';\nimport type { PracticeAnamnesisConfig } from './anamnesis-config';\nimport type { DisclosureAudience } from './anamnesis-disclosure';\nimport {\n type AnamnesisExportTab,\n type ExportDocument,\n buildAnamnesisExport,\n documentDisclosure,\n} from './anamnesis-export';\nimport { downloadCsv, downloadXlsx } from './anamnesis-export-download';\nimport { downloadPdf, pdfPalette, printPdf } from './anamnesis-export-pdf';\nimport type { AnamnesisRecord } from './anamnesis-types';\n\n/** The audiences this control offers. `external` is deliberately absent: no\n * disclosure rule discloses anything to it today, so choosing it could only\n * ever produce an empty file. */\ntype OfferedAudience = 'clinician' | 'patient';\n\nconst OFFERED_AUDIENCES: readonly OfferedAudience[] = ['clinician', 'patient'];\n\nexport interface AnamnesisExportMenuProps {\n /** The tab the surface is showing. The control acts on THIS view. */\n tab: AnamnesisExportTab;\n record: AnamnesisRecord;\n t: TFunction;\n config?: PracticeAnamnesisConfig;\n /** Evolution only: the visit columns the grid is currently showing. */\n shownVisitIds?: readonly string[];\n /** Mount with the menu open. Demo/story hook only — Chromatic skips play\n * functions, so a click-opened menu is never snapshotted. */\n defaultOpen?: boolean;\n /** Mount with the share preview open. Demo/story hook, same reason. */\n defaultShareOpen?: boolean;\n /** Mount on this audience instead of the practice copy. Demo/story hook. */\n defaultAudience?: DisclosureAudience;\n}\n\nexport function AnamnesisExportMenu({\n tab,\n record,\n t,\n config,\n shownVisitIds,\n defaultOpen = false,\n defaultShareOpen = false,\n defaultAudience = 'clinician',\n}: AnamnesisExportMenuProps) {\n const [audience, setAudience] = useState<DisclosureAudience>(defaultAudience);\n const [everyVisit, setEveryVisit] = useState(false);\n const [menuOpen, setMenuOpen] = useState(defaultOpen);\n const [shareOpen, setShareOpen] = useState(defaultShareOpen);\n const [shareAudience, setShareAudience] =\n useState<DisclosureAudience>(defaultAudience);\n // `seq` alternates a zero-width space onto the text, so exporting the same\n // file twice still changes the live region and is announced twice.\n const [status, setStatus] = useState({ text: '', seq: 0 });\n\n const rootRef = useRef<HTMLDivElement>(null);\n const frameRef = useRef<HTMLIFrameElement>(null);\n // The previous print's object URL. Revoked when the next print replaces it —\n // never on load, which would pull the file out from under the viewer.\n const printUrlRef = useRef<string | null>(null);\n // One route at a time: Excel awaits a dynamic import, and a second click\n // during that await writes the same file twice.\n const busyRef = useRef(false);\n const describedById = useId();\n\n // The last print's blob outlives the last print. Released with the surface.\n useEffect(\n () => () => {\n if (printUrlRef.current) URL.revokeObjectURL(printUrlRef.current);\n },\n [],\n );\n\n const build = useCallback(\n (forAudience: DisclosureAudience): ExportDocument =>\n buildAnamnesisExport(tab, {\n record,\n audience: forAudience,\n t,\n config,\n selectedVisitIds: shownVisitIds,\n scope: everyVisit ? 'all' : 'selected',\n }),\n [tab, record, t, config, shownVisitIds, everyVisit],\n );\n\n const tabName = t(`anamnesis.export.tab.${tab}`);\n const audienceBadge = t('anamnesis.export.control.audienceBadge');\n\n /* WHAT THIS COPY DOES AND DOES NOT CARRY — said in BOTH states, not only the\n safe one. The likeliest sequence at the chairside never opens the audience\n control at all, so a menu that only speaks up for the patient copy is\n silent in exactly the state that hands over diagnostic codes and lab\n values. Both lines are derived from the same built patient document, so\n neither can drift from the file. Built only while the menu is open: the\n record is the compile form's live state and rebuilding it per keystroke\n would serialise the whole matrix on every character. */\n const patientExcluded = useMemo(\n () => (menuOpen ? documentDisclosure(build('patient'), t).excluded : []),\n [menuOpen, build, t],\n );\n\n const disclosureLine: Record<OfferedAudience, string> = {\n clinician:\n patientExcluded.length > 0\n ? t('anamnesis.export.control.holds', {\n list: patientExcluded.join(t('anamnesis.export.listSeparator')),\n })\n : t('anamnesis.export.control.holdsNone'),\n patient:\n patientExcluded.length > 0\n ? t('anamnesis.export.control.excludes', {\n list: patientExcluded.join(t('anamnesis.export.listSeparator')),\n })\n : t('anamnesis.export.control.excludesNone'),\n };\n\n // The share preview reads its OWN audience: the dialog is where the choice\n // is made, and it must re-describe the copy as the choice changes.\n const sharePreview = useMemo(\n () =>\n shareOpen\n ? documentDisclosure(build(shareAudience), t)\n : { included: [], excluded: [] },\n [shareOpen, build, shareAudience, t],\n );\n\n const say = (text: string) =>\n setStatus((prev) => ({ text, seq: prev.seq + 1 }));\n\n const run = (\n format: 'pdf' | 'xlsx' | 'csv',\n write: (document: ExportDocument) => boolean | Promise<boolean>,\n ) => {\n if (busyRef.current) return;\n busyRef.current = true;\n const document = build(audience);\n void Promise.resolve(write(document))\n .then((ok) =>\n say(\n ok\n ? t('anamnesis.export.control.ready', {\n file: `${document.fileStem}.${format}`,\n })\n : t('anamnesis.export.control.failed'),\n ),\n )\n .catch(() => say(t('anamnesis.export.control.failed')))\n .finally(() => {\n busyRef.current = false;\n });\n };\n\n const palette = () => pdfPalette(rootRef.current);\n\n const handlePdf = () =>\n run('pdf', (document) => downloadPdf(document, { palette: palette() }));\n const handleXlsx = () => run('xlsx', downloadXlsx);\n const handleCsv = () => run('csv', downloadCsv);\n\n const handlePrint = () => {\n if (busyRef.current) return;\n busyRef.current = true;\n void printPdf(build(audience), frameRef.current, { palette: palette() })\n .then((url) => {\n if (!url) {\n say(t('anamnesis.export.control.failed'));\n return;\n }\n if (printUrlRef.current) URL.revokeObjectURL(printUrlRef.current);\n printUrlRef.current = url;\n say(t('anamnesis.export.control.printing'));\n })\n .catch(() => say(t('anamnesis.export.control.failed')))\n .finally(() => {\n busyRef.current = false;\n });\n };\n\n const openShare = () => {\n setShareAudience(audience);\n setShareOpen(true);\n };\n\n const confirmShare = () => {\n setAudience(shareAudience);\n setShareOpen(false);\n say(\n t('anamnesis.export.share.confirmed', {\n audience: t(`anamnesis.export.audience.${shareAudience}`),\n }),\n );\n };\n\n return (\n <div\n ref={rootRef}\n data-component=\"anamnesis-export-menu\"\n data-tab={tab}\n data-audience={audience}\n className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-end ds:gap-[var(--spacing-xs)]\"\n >\n {/* The audience is sticky across tabs and across every later export, and\n the closed control would otherwise say nothing about it. The one\n setting here that cannot be walked back is the one that gets an\n ambient mark. */}\n {audience !== 'clinician' ? (\n <Badge\n variant=\"warning\"\n size=\"sm\"\n data-testid=\"anamnesis-export-audience\"\n >\n {audienceBadge}\n </Badge>\n ) : null}\n\n {/* `modal` follows the story hook: a menu that mounts open would\n otherwise make the rest of a docs page inert. In the product the\n menu opens from a click and stays modal. */}\n <DropdownMenu.Root\n open={menuOpen}\n onOpenChange={setMenuOpen}\n modal={!defaultOpen}\n >\n <DropdownMenu.Trigger asChild>\n <Button\n type=\"button\"\n intent=\"outline\"\n size=\"sm\"\n endIcon={<ChevronDown aria-hidden=\"true\" />}\n /* WCAG 2.5.3: the accessible name OPENS with the visible label, so\n a speech-input user saying what they read still hits it. */\n aria-label={\n audience === 'clinician'\n ? t('anamnesis.export.control.triggerLabel', { tab: tabName })\n : t('anamnesis.export.control.triggerLabelAudience', {\n tab: tabName,\n audience: audienceBadge,\n })\n }\n data-testid=\"anamnesis-export-trigger\"\n >\n {t('anamnesis.export.control.trigger')}\n </Button>\n </DropdownMenu.Trigger>\n\n <DropdownMenu.Content align=\"end\">\n <DropdownMenu.Label>\n {t('anamnesis.export.control.menuLabel', { tab: tabName })}\n </DropdownMenu.Label>\n <DropdownMenu.Separator />\n\n <DropdownMenu.Label>\n {t('anamnesis.export.audienceLabel')}\n </DropdownMenu.Label>\n <DropdownMenu.RadioGroup\n value={audience}\n onValueChange={(next) => setAudience(next as DisclosureAudience)}\n >\n {OFFERED_AUDIENCES.map((option) => (\n <DropdownMenu.RadioItem\n key={option}\n value={option}\n /* The consequence is part of the option, not a caption beside\n it: a `DropdownMenu.Label` is a bare div that Radix's roving\n focus steps straight past, so without this a screen-reader\n clinician picks the patient copy and hears only \"checked\". */\n aria-describedby={`${describedById}-${option}`}\n // Keeps the menu open: the audience is a setting for the five\n // items below it, not an action of its own.\n onSelect={(event) => event.preventDefault()}\n >\n {t(`anamnesis.export.audience.${option}`)}\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n\n <DropdownMenu.Label data-testid=\"anamnesis-export-disclosure\">\n {disclosureLine[audience === 'patient' ? 'patient' : 'clinician']}\n </DropdownMenu.Label>\n {/* One description per option, so each is read on the option it\n belongs to rather than describing whatever is currently ticked. */}\n {OFFERED_AUDIENCES.map((option) => (\n <span\n key={option}\n id={`${describedById}-${option}`}\n className=\"ds:sr-only\"\n >\n {disclosureLine[option]}\n </span>\n ))}\n\n {tab === 'evolution' ? (\n /* SwitchItem, not CheckboxItem: a setting the menu keeps open,\n whose OFF state has to be visible — an unticked checkbox row\n renders as an empty slot. */\n <DropdownMenu.SwitchItem\n checked={everyVisit}\n onCheckedChange={setEveryVisit}\n >\n {t('anamnesis.export.control.everyVisit')}\n </DropdownMenu.SwitchItem>\n ) : null}\n\n <DropdownMenu.Separator />\n\n {/* Share → PDF → Print → Excel → CSV. Deliberate: see the header. */}\n <DropdownMenu.Item\n startIcon={<Share2 aria-hidden=\"true\" />}\n onSelect={openShare}\n >\n {t('anamnesis.export.control.share')}\n </DropdownMenu.Item>\n <DropdownMenu.Item\n startIcon={<FileText aria-hidden=\"true\" />}\n onSelect={handlePdf}\n >\n {t('anamnesis.export.control.pdf')}\n </DropdownMenu.Item>\n <DropdownMenu.Item\n startIcon={<Printer aria-hidden=\"true\" />}\n onSelect={handlePrint}\n >\n {t('anamnesis.export.control.print')}\n </DropdownMenu.Item>\n\n <DropdownMenu.Separator />\n\n <DropdownMenu.Item\n startIcon={<FileSpreadsheet aria-hidden=\"true\" />}\n onSelect={handleXlsx}\n >\n {t('anamnesis.export.control.xlsx')}\n </DropdownMenu.Item>\n <DropdownMenu.Item\n startIcon={<Download aria-hidden=\"true\" />}\n onSelect={handleCsv}\n >\n {t('anamnesis.export.control.csv')}\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n\n <AnamnesisShareDialog\n open={shareOpen}\n onOpenChange={setShareOpen}\n audience={shareAudience}\n onAudienceChange={setShareAudience}\n preview={sharePreview}\n onConfirm={confirmShare}\n tabName={tabName}\n t={t}\n />\n\n {/* The print target. Zero-sized rather than `hidden`: a display:none\n frame does not paginate, and the viewer inside it is what raises the\n print dialog. Inert — titled, aria-hidden and out of the tab ring. */}\n <iframe\n ref={frameRef}\n title={t('anamnesis.export.control.printFrame')}\n aria-hidden=\"true\"\n tabIndex={-1}\n data-testid=\"anamnesis-print-frame\"\n className=\"ds:fixed ds:size-0 ds:border-0\"\n />\n\n {/* VISIBLE, not sr-only. Every route's only feedback lands here — a\n sighted clinician whose download was blocked, or whose print dialog\n never came up, would otherwise be looking at a control that appears\n to do nothing and would click it again. */}\n <span\n aria-live=\"polite\"\n data-testid=\"anamnesis-export-status\"\n className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\"\n >\n {status.text ? `${status.text}${status.seq % 2 ? '\\u200b' : ''}` : ''}\n </span>\n </div>\n );\n}\n\n/* ------------------------------ Share dialog ----------------------------- */\n\ninterface AnamnesisShareDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n audience: DisclosureAudience;\n onAudienceChange: (audience: DisclosureAudience) => void;\n preview: { included: string[]; excluded: string[] };\n onConfirm: () => void;\n tabName: string;\n t: TFunction;\n}\n\n/** The SHAPE of a share, not a share. It picks a recipient and describes what\n * that recipient's copy holds and holds back — and it says, in the first thing\n * the reader sees, that nothing leaves this screen. Real delivery is a signed\n * expiring link, a consent gate and an audit of who received what over which\n * channel: platform work, none of which a pattern can stand in for. */\nfunction AnamnesisShareDialog({\n open,\n onOpenChange,\n audience,\n onAudienceChange,\n preview,\n onConfirm,\n tabName,\n t,\n}: AnamnesisShareDialogProps) {\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Content size=\"md\" data-testid=\"anamnesis-share-dialog\">\n <Dialog.Header>\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n <Dialog.Title>\n {t('anamnesis.export.share.title', { tab: tabName })}\n </Dialog.Title>\n <Badge variant=\"warning\" size=\"sm\">\n {t('anamnesis.export.share.mockBadge')}\n </Badge>\n </div>\n <Dialog.Description>\n {t('anamnesis.export.share.subtitle')}\n </Dialog.Description>\n </Dialog.Header>\n\n <Dialog.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <Alert variant=\"warning\" data-testid=\"anamnesis-share-notice\">\n <Alert.Title>{t('anamnesis.export.share.noticeTitle')}</Alert.Title>\n <Alert.Description>\n {t('anamnesis.export.share.notice')}\n </Alert.Description>\n </Alert>\n\n <RadioGroup\n label={t('anamnesis.export.share.audienceLabel')}\n value={audience}\n onValueChange={(next) =>\n onAudienceChange(next as DisclosureAudience)\n }\n >\n {OFFERED_AUDIENCES.map((option) => (\n <Radio\n key={option}\n value={option}\n label={t(`anamnesis.export.audience.${option}`)}\n />\n ))}\n </RadioGroup>\n\n <DisclosureList\n title={t('anamnesis.export.share.includes')}\n items={preview.included}\n emptyText={t('anamnesis.export.share.includesNone')}\n testId=\"anamnesis-share-includes\"\n />\n <DisclosureList\n title={t('anamnesis.export.share.excludes')}\n items={preview.excluded}\n emptyText={t('anamnesis.export.share.excludesNone')}\n testId=\"anamnesis-share-excludes\"\n />\n </Dialog.Body>\n\n <Dialog.Footer divider>\n <Dialog.Close asChild>\n <Button type=\"button\" intent=\"ghost\" size=\"sm\">\n {t('anamnesis.export.share.cancel')}\n </Button>\n </Dialog.Close>\n <Button\n type=\"button\"\n intent=\"primary\"\n size=\"sm\"\n onClick={onConfirm}\n data-testid=\"anamnesis-share-confirm\"\n >\n {t('anamnesis.export.share.confirm')}\n </Button>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\nfunction DisclosureList({\n title,\n items,\n emptyText,\n testId,\n}: {\n title: string;\n items: string[];\n emptyText: string;\n testId: string;\n}) {\n return (\n <section\n data-testid={testId}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\"\n >\n <h3 className=\"type-label ds:m-0 ds:text-[color:var(--foreground)]\">\n {title}\n </h3>\n {items.length === 0 ? (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {emptyText}\n </p>\n ) : (\n <ul className=\"type-body-sm ds:m-0 ds:flex ds:list-disc ds:flex-col ds:gap-[var(--spacing-2xs)] ds:ps-[var(--spacing-md)] ds:text-[color:var(--muted-foreground)]\">\n {items.map((item) => (\n <li key={item}>{item}</li>\n ))}\n </ul>\n )}\n </section>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — highlighted-answer rule */\n/* */\n/* A practice can flag a question so that certain answers demand the */\n/* clinician's attention — an allergy answered \"yes\", a consent answered */\n/* \"no\", or a free-text question that must always be read. The rule lives */\n/* on the field definition; this helper evaluates it against one answer */\n/* so the field renderer, an overview card and a host's archive row all */\n/* agree on what counts as highlighted. */\n/* -------------------------------------------------------------------- */\n\nimport { isIntakeAnswered } from './anamnesis-format';\nimport type { IntakeAnswer, IntakeFieldDef } from './anamnesis-types';\n\n/** Whether `answer` satisfies the field's highlight rule. An absent rule or\n * a blank answer is never highlighted: the marker flags what the patient\n * SAID, not what they were asked — so `always` still waits for an answer. */\nexport function isHighlightedAnswer(\n def: IntakeFieldDef,\n answer: IntakeAnswer | undefined,\n): boolean {\n if (!def.highlight || !answer) return false;\n switch (def.highlight) {\n case 'always':\n return isIntakeAnswered(answer);\n case 'whenYes':\n return answer.kind === 'yesNo' && answer.present === 'yes';\n case 'whenNo':\n return answer.kind === 'yesNo' && answer.present === 'no';\n default:\n return false;\n }\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — intake field renderer */\n/* */\n/* Turns one declarative IntakeFieldDef + its current answer into the */\n/* correct kit primitive — never a bare text field where a structured */\n/* answer fits: */\n/* text/textarea → TextInput / TextArea */\n/* number → NumberInput (plain, sized to the answer, the unit */\n/* shown inside the field rather than in the label; */\n/* integer unless the def's `decimal` flag or the legacy */\n/* key set says decimal) */\n/* yesNoDetail → RadioGroup (yes/no/not sure) + conditional detail */\n/* choice → Select (closed enumerated list, one answer) */\n/* multiChoice → Checkbox group (closed list, any number of answers) */\n/* frequency → NumberInput (times/week) + optional detail */\n/* meal → TimePicker + TextInput (24-hour recall entry) */\n/* */\n/* Shared by the patient intake form and the clinician's compile-mode */\n/* review of the patient's answers. In compile mode `showOrigin` renders */\n/* the \"from patient\" marker until the clinician edits the value, at which */\n/* point the surface flips the origin to `clinician` and the marker drops. */\n/* -------------------------------------------------------------------- */\n\nimport type { TFunction } from 'i18next';\nimport { HeartPulse } from 'lucide-react';\nimport { Badge } from '../../components/badge';\nimport { Checkbox } from '../../components/checkbox';\nimport { FormField } from '../../components/form-field';\nimport { TextInput } from '../../components/text-input';\nimport { StateBackedTextInput } from '../../components/_shared/state-backed-text-input';\nimport { TextArea } from '../../components/text-area';\nimport { NumberInput } from '../../components/number-input';\nimport { RadioGroup, Radio } from '../../components/radio-group';\nimport { Select, type SelectOption } from '../../components/select';\nimport { TimePicker } from '../../components/time-picker';\nimport type { TimeValue } from '../../components/_shared/time';\nimport {\n intakeFieldHelp,\n intakeFieldLabel,\n intakeFieldLabelWithUnit,\n} from './anamnesis-format';\nimport { isHighlightedAnswer } from './anamnesis-highlight';\nimport { OriginMarker } from './anamnesis-indicators';\nimport type {\n AnswerOrigin,\n IntakeAnswer,\n IntakeFieldDef,\n YesNo,\n} from './anamnesis-types';\n\n/* ------------------------------- Helpers -------------------------------- */\n\nfunction timeToValue(time: string): TimeValue | undefined {\n if (!time) return undefined;\n const [h, m] = time.split(':').map((n) => Number.parseInt(n, 10));\n if (Number.isNaN(h) || Number.isNaN(m)) return undefined;\n return { hours: h, minutes: m };\n}\n\nfunction valueToTime(value: TimeValue): string {\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${pad(value.hours)}:${pad(value.minutes)}`;\n}\n\n/** Is this field's free-text \"Dettagli\" box on screen right now? Mirrors what\n * the case blocks below actually render — a frequency detail is up from the\n * start, a choice detail waits for a selection, a yes/no detail for a \"yes\" —\n * so the intake can hand the whole row to any field showing one. */\nexport function isDetailVisible(\n def: IntakeFieldDef,\n answer?: IntakeAnswer,\n): boolean {\n if (def.detail !== true) return false;\n switch (def.type) {\n case 'yesNoDetail':\n return answer?.kind === 'yesNo' && answer.present === 'yes';\n case 'frequency':\n return true;\n case 'choice':\n return answer?.kind === 'choice' && Boolean(answer.selected);\n default:\n return false;\n }\n}\n\n/** The flag is the heart alone on every question: the words repeated down a\n * column of questions read as noise, and the meaning is in the tooltip and\n * the accessible name either way. */\nconst HIGHLIGHT_WORDS_SR_ONLY = 'ds:sr-only';\n/** With no words the chip is a round mark, not a short pill. */\nconst HIGHLIGHT_CHIP_COMPACT = 'ds:aspect-square ds:justify-center ds:px-0';\n/** Optically centred on the FIRST line of a question that wraps. */\nconst HIGHLIGHT_CHIP_ALIGN = 'ds:mt-[var(--spacing-2xs)]';\n\n/** Number fields captured to one decimal place vs whole numbers. */\nconst DECIMAL_NUMBER_FIELDS = new Set(['weightSelf', 'waterPerDay']);\n\n/** A number field is sized to its answer: four digits fit the small width,\n * a declared bound of 10 000 or more widens it. `IntakeFieldDef` carries no\n * `max` today, so every seeded field takes the small width. */\n/* ------------------------------------------------------------------ */\n/* One width scale for every control */\n/* */\n/* A control that sizes itself invents its own width, and a form of */\n/* four different widths reads as an accident. Three steps only, and a */\n/* field that spans the row keeps its control at its own step rather */\n/* than running the width of the card. */\n/* ------------------------------------------------------------------ */\n\n/** Everything that is not a number: selects, one-line text, details boxes and\n * prose alike. ONE measure — two text boxes of different widths stacked on\n * each other read as an accident, whatever the reason for the difference. */\nconst CONTROL_MEASURE = 'ds:w-full ds:max-w-[44rem]';\n\nfunction numberInline(\n def: Pick<IntakeFieldDef, 'key'> & { max?: number },\n): 'sm' | 'md' {\n return def.max !== undefined && def.max >= 10000 ? 'md' : 'sm';\n}\n\n/* -------------------------------- Props --------------------------------- */\n\nexport interface AnamnesisFieldProps {\n def: IntakeFieldDef;\n answer?: IntakeAnswer;\n onChange: (answer: IntakeAnswer) => void;\n /** Show the \"from patient\" marker when the value still carries patient origin\n * (compile mode). Intake mode leaves this off — the patient owns the form. */\n showOrigin?: boolean;\n origin?: AnswerOrigin;\n /** Render the answer without letting it be changed — the state a compiled\n * questionnaire arrives in, until the reader asks to edit it. Every control\n * is disabled rather than swapped for text, so nothing shifts under the\n * reader when editing is unlocked. */\n readOnly?: boolean;\n /** Grid placement handed down by the section that lays the field out — the\n * whole row for a question that needs the width. */\n className?: string;\n t: TFunction;\n}\n\n/* ------------------------------- Component ------------------------------ */\n\nexport function AnamnesisField({\n def,\n answer,\n onChange,\n showOrigin = false,\n origin,\n readOnly = false,\n className,\n t,\n}: AnamnesisFieldProps) {\n // A number shows its unit inside the field, so its label keeps the\n // question alone; every other type still spells the unit out in the label.\n const label =\n def.type === 'number'\n ? intakeFieldLabel(def, t)\n : intakeFieldLabelWithUnit(def, t);\n const description = intakeFieldHelp(def, t);\n const showMarker = showOrigin && origin === 'patient';\n // Evaluated on the CURRENT answer, so the marker appears the moment the\n // clinician ticks \"yes\" on a flagged question and leaves when they change\n // their mind — the read-only render then shows exactly what was saved.\n const highlighted = isHighlightedAnswer(def, answer);\n // The flag LEADS the question: at the inline end it read as a mark on\n // whatever came next. The origin marker keeps the end — it qualifies the\n // answer, not the question.\n const highlightLabel = t('anamnesis.field.highlighted');\n const labelStart = highlighted ? (\n <span data-testid={`anamnesis-field-${def.key}-highlight`}>\n <Badge\n variant=\"accentSoft\"\n size=\"sm\"\n className={`${HIGHLIGHT_CHIP_ALIGN} ${HIGHLIGHT_CHIP_COMPACT}`}\n leading={<HeartPulse aria-hidden=\"true\" />}\n >\n <span className={HIGHLIGHT_WORDS_SR_ONLY}>{highlightLabel}</span>\n </Badge>\n </span>\n ) : undefined;\n const labelEnd = showMarker ? <OriginMarker t={t} /> : undefined;\n\n let control: React.ReactNode = null;\n\n switch (def.type) {\n case 'text': {\n const value = answer?.kind === 'text' ? answer.text : '';\n control = (\n <FormField\n label={label}\n labelStart={labelStart}\n labelEnd={labelEnd}\n description={description}\n >\n <StateBackedTextInput\n className={CONTROL_MEASURE}\n disabled={readOnly}\n value={value}\n onChange={(e) => onChange({ kind: 'text', text: e.target.value })}\n />\n </FormField>\n );\n break;\n }\n case 'textarea': {\n const value = answer?.kind === 'text' ? answer.text : '';\n control = (\n <FormField\n label={label}\n labelStart={labelStart}\n labelEnd={labelEnd}\n description={description}\n >\n <TextArea\n disabled={readOnly}\n value={value}\n autoResize\n minRows={2}\n className={CONTROL_MEASURE}\n onChange={(e) => onChange({ kind: 'text', text: e.target.value })}\n />\n </FormField>\n );\n break;\n }\n case 'number': {\n const value = answer?.kind === 'number' ? answer.value : null;\n control = (\n <FormField\n label={label}\n labelStart={labelStart}\n labelEnd={labelEnd}\n description={description}\n >\n <NumberInput\n disabled={readOnly}\n value={value}\n min={0}\n variant=\"plain\"\n unit={def.unit}\n inline={numberInline(def)}\n mode={\n def.decimal || DECIMAL_NUMBER_FIELDS.has(def.key)\n ? 'decimal'\n : 'integer'\n }\n onChange={(next) => onChange({ kind: 'number', value: next })}\n />\n </FormField>\n );\n break;\n }\n case 'frequency': {\n const perWeek = answer?.kind === 'frequency' ? answer.perWeek : null;\n const detail = answer?.kind === 'frequency' ? (answer.detail ?? '') : '';\n control = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <FormField\n label={label}\n labelStart={labelStart}\n labelEnd={labelEnd}\n description={description}\n >\n <NumberInput\n disabled={readOnly}\n value={perWeek}\n min={0}\n max={21}\n variant=\"plain\"\n inline=\"sm\"\n mode=\"integer\"\n onChange={(next) =>\n onChange({\n kind: 'frequency',\n perWeek: next,\n detail: detail || undefined,\n })\n }\n />\n </FormField>\n {def.detail ? (\n <FormField label={t(`anamnesis.field.${def.key}.detailLabel`)}>\n <StateBackedTextInput\n className={CONTROL_MEASURE}\n disabled={readOnly}\n value={detail}\n onChange={(e) =>\n onChange({\n kind: 'frequency',\n perWeek,\n detail: e.target.value || undefined,\n })\n }\n />\n </FormField>\n ) : null}\n </div>\n );\n break;\n }\n case 'yesNoDetail': {\n const present: YesNo =\n answer?.kind === 'yesNo' ? answer.present : 'unknown';\n const detail = answer?.kind === 'yesNo' ? (answer.detail ?? '') : '';\n control = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <RadioGroup\n disabled={readOnly}\n label={label}\n labelStart={labelStart}\n labelEnd={labelEnd}\n description={description}\n variant=\"horizontal\"\n value={present}\n onValueChange={(next) =>\n onChange({\n kind: 'yesNo',\n present: next as YesNo,\n detail: detail || undefined,\n })\n }\n >\n <Radio\n disabled={readOnly}\n value=\"yes\"\n label={t('anamnesis.common.yes')}\n />\n <Radio\n disabled={readOnly}\n value=\"no\"\n label={t('anamnesis.common.no')}\n />\n <Radio\n disabled={readOnly}\n value=\"unknown\"\n label={t('anamnesis.common.notSure')}\n />\n </RadioGroup>\n {isDetailVisible(def, answer) ? (\n <FormField label={t('anamnesis.common.details')}>\n <StateBackedTextInput\n className={CONTROL_MEASURE}\n disabled={readOnly}\n value={detail}\n onChange={(e) =>\n onChange({\n kind: 'yesNo',\n present,\n detail: e.target.value || undefined,\n })\n }\n />\n </FormField>\n ) : def.detail === true && !readOnly ? (\n /* The row is reserved for this question either way, so the space\n it will need reads as waiting rather than wasted. Inert: it is\n a preview of a control, not one. */\n <div aria-hidden=\"true\" className=\"ds:opacity-50\">\n <FormField label={t('anamnesis.common.details')}>\n <TextInput\n className={CONTROL_MEASURE}\n disabled\n value=\"\"\n placeholder={t('anamnesis.common.detailsPending')}\n />\n </FormField>\n </div>\n ) : null}\n </div>\n );\n break;\n }\n case 'choice': {\n const selected = answer?.kind === 'choice' ? (answer.selected ?? '') : '';\n const detail = answer?.kind === 'choice' ? (answer.detail ?? '') : '';\n const options: SelectOption[] = (def.options ?? []).map((opt) => ({\n value: opt,\n // A practice-added option has no kit translation; show it verbatim\n // rather than the unresolved key.\n label: t(`anamnesis.field.${def.key}.option.${opt}`, {\n defaultValue: opt,\n }),\n }));\n control = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <FormField\n label={label}\n labelStart={labelStart}\n labelEnd={labelEnd}\n description={description}\n >\n <Select\n className={CONTROL_MEASURE}\n disabled={readOnly}\n options={options}\n value={selected}\n placeholder={t('anamnesis.common.choose')}\n onValueChange={(next) =>\n onChange({\n kind: 'choice',\n selected: next || null,\n detail: detail || undefined,\n })\n }\n />\n </FormField>\n {/* The platform's dropdown_with_text: a free-text detail beside the\n selection, under the SAME shared label the yes/no detail uses. */}\n {def.detail && selected ? (\n <FormField label={t('anamnesis.common.details')}>\n <StateBackedTextInput\n className={CONTROL_MEASURE}\n disabled={readOnly}\n value={detail}\n onChange={(e) =>\n onChange({\n kind: 'choice',\n selected,\n detail: e.target.value || undefined,\n })\n }\n />\n </FormField>\n ) : null}\n </div>\n );\n break;\n }\n case 'multiChoice': {\n const selected = answer?.kind === 'multiChoice' ? answer.selected : [];\n const toggle = (opt: string) =>\n onChange({\n kind: 'multiChoice',\n selected: selected.includes(opt)\n ? selected.filter((entry) => entry !== opt)\n : [...selected, opt],\n });\n control = (\n <fieldset className=\"ds:m-0 ds:border-0 ds:p-0\">\n <legend className=\"type-label ds:mb-[var(--spacing-2xs)] ds:w-full ds:text-[color:var(--foreground)]\">\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {labelStart}\n {labelStart ? ' ' : null}\n <span>{label}</span>\n {labelEnd ? ' ' : null}\n {labelEnd ? (\n <span className=\"ds:ms-auto ds:inline-flex ds:shrink-0 ds:items-center\">\n {labelEnd}\n </span>\n ) : null}\n </span>\n </legend>\n {description ? (\n <p className=\"type-body-sm ds:m-0 ds:mb-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n {description}\n </p>\n ) : null}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {(def.options ?? []).map((opt) => (\n <Checkbox\n disabled={readOnly}\n key={opt}\n // A practice-added option has no kit translation; show it\n // verbatim rather than the unresolved key.\n label={t(`anamnesis.field.${def.key}.option.${opt}`, {\n defaultValue: opt,\n })}\n checked={selected.includes(opt)}\n onCheckedChange={() => toggle(opt)}\n />\n ))}\n </div>\n </fieldset>\n );\n break;\n }\n case 'meal': {\n const time = answer?.kind === 'meal' ? answer.time : '';\n const desc = answer?.kind === 'meal' ? answer.description : '';\n control = (\n <fieldset className=\"ds:m-0 ds:border-0 ds:p-0\">\n <legend className=\"type-label ds:mb-[var(--spacing-2xs)] ds:w-full ds:text-[color:var(--foreground)]\">\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {labelStart}\n {labelStart ? ' ' : null}\n <span>{label}</span>\n {labelEnd ? ' ' : null}\n {labelEnd ? (\n <span className=\"ds:ms-auto ds:inline-flex ds:shrink-0 ds:items-center\">\n {labelEnd}\n </span>\n ) : null}\n </span>\n </legend>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:sm:flex-row ds:sm:items-start\">\n <FormField label={t('anamnesis.common.time')}>\n <TimePicker\n disabled={readOnly}\n value={timeToValue(time)}\n onChange={(next) =>\n onChange({\n kind: 'meal',\n time: valueToTime(next),\n description: desc,\n })\n }\n />\n </FormField>\n <div className=\"ds:grow\">\n <FormField label={t('anamnesis.common.whatEaten')}>\n <StateBackedTextInput\n className={CONTROL_MEASURE}\n disabled={readOnly}\n value={desc}\n onChange={(e) =>\n onChange({\n kind: 'meal',\n time,\n description: e.target.value,\n })\n }\n />\n </FormField>\n </div>\n </div>\n </fieldset>\n );\n break;\n }\n }\n\n return (\n <div\n data-testid={`anamnesis-field-${def.key}`}\n data-highlighted={highlighted ? 'true' : undefined}\n // A highlighted answer is \"in risalto\": the brand ACCENT, never the\n // error red — a flagged answer is a clinical fact to notice, not a\n // mistake to fix. The mark is the chip on the question line; the\n // block itself stays unframed so the form keeps one rhythm.\n className={`ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]${\n className ? ` ${className}` : ''\n }`}\n >\n {control}\n </div>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — target arithmetic for the Diagnosis summary strip */\n/* */\n/* Two derivations, both pure and both per-parameter: */\n/* */\n/* • {@link targetStatus} — where the patient stands against one goal, */\n/* as the traffic light the care plan's tiles already speak. */\n/* • {@link targetBoundsFor} — the sane input range the target editor */\n/* accepts, so a mistyped goal cannot become a clinical figure. */\n/* */\n/* There is deliberately NO single percentage across the four metrics. A */\n/* 10% miss on protein is one yoghurt; a 10% miss on weight is seven kilos */\n/* and a different plan. Each band below states the clinical reason it is */\n/* the width it is. */\n/* -------------------------------------------------------------------- */\n\nimport type { TargetStatus } from '../_shared/target-tile';\nimport { configuredParameters } from './anamnesis-config';\nimport type { PracticeAnamnesisConfig } from './anamnesis-config';\nimport type { NumericParameterDef } from './anamnesis-types';\n\nexport type { TargetStatus };\n\n/* ------------------------------ Strip scope ----------------------------- */\n\n/** The strip is the practice's CHOSEN goals — every live parameter whose\n * `goal` flag is set, in capture display order. The kit seeds the four\n * figures a nutrition plan is written in (weight, BMI, daily energy,\n * protein), and the configuration editor's Targets tab toggles the set. A\n * parameter the practice archived is simply absent, so a practice that does\n * not estimate intake gets a two-tile strip rather than a tile reading from\n * nothing. */\nexport function stripParameters(\n config?: PracticeAnamnesisConfig,\n): NumericParameterDef[] {\n return configuredParameters(config).filter((def) => def.goal === true);\n}\n\n/* ------------------------------ Status bands ---------------------------- */\n\n/** How wide \"on target\" and \"approaching\" are for one parameter.\n *\n * `kind` — `absolute` bands are in the parameter's own unit; `relative` ones\n * are a fraction of the target. Absolute is right where the scale itself is\n * narrow and fixed (BMI); relative is right where the target's magnitude\n * varies patient to patient (weight, energy, protein).\n *\n * `sided` — `both` counts an overshoot as a miss; `atLeast` treats the target\n * as a FLOOR (at or above it is met); `atMost` as a CAP. */\nexport interface TargetBand {\n kind: 'absolute' | 'relative';\n /** Within this of the target = on target. */\n onTarget: number;\n /** Within this = approaching; beyond it = off target. */\n approaching: number;\n sided: 'both' | 'atLeast' | 'atMost';\n}\n\n/** Per-parameter bands. Each comment is the clinical reason for the width. */\nexport const TARGET_BANDS: Readonly<Record<string, TargetBand>> = {\n // ±2% of goal weight (≈1.2 kg at 62 kg) is the day-to-day hydration and\n // gut-content swing — indistinguishable from being at target. 10% is the\n // clinically meaningful unit of weight change (the 5–10% loss guidelines are\n // written in), so inside it is the last leg. Two-sided: undershooting a\n // weight goal is not a success, it is a different conversation.\n weight: { kind: 'relative', onTarget: 0.02, approaching: 0.1, sided: 'both' },\n // A circumference goal behaves like a mass goal — same shape, same reasons.\n waist: { kind: 'relative', onTarget: 0.02, approaching: 0.1, sided: 'both' },\n // Absolute, because the BMI scale is narrow and fixed for everyone. 0.5\n // kg/m² is roughly the move a 1.5 kg weighing difference makes at adult\n // height; 2.0 is about a third of the 18.5–24.9 healthy band, so \"still\n // inside the same part of the scale\".\n bmi: { kind: 'absolute', onTarget: 0.5, approaching: 2, sided: 'both' },\n // Dietary-recall energy estimates carry roughly ±10–20% error, so a 5% gap\n // is below the noise floor of the measurement itself and 15% is a different\n // diet, not a rounding difference. Two-sided: over- and under-eating both\n // miss the plan.\n energy: {\n kind: 'relative',\n onTarget: 0.05,\n approaching: 0.15,\n sided: 'both',\n },\n // A FLOOR, not a set-point: the protein target is the amount to reach, and\n // eating more of it is not a miss. Below it, 10% (≈9 g at a 90 g target — an\n // egg and a yoghurt) is a closable gap; beyond that the plan is not running.\n protein: {\n kind: 'relative',\n onTarget: 0,\n approaching: 0.1,\n sided: 'atLeast',\n },\n};\n\n/** The band for a parameter the practice added itself. Two-sided 5% / 15% —\n * wide enough not to shout at a measurement's own noise, narrow enough that\n * \"on target\" still means something. */\nexport const DEFAULT_TARGET_BAND: TargetBand = {\n kind: 'relative',\n onTarget: 0.05,\n approaching: 0.15,\n sided: 'both',\n};\n\n/** The band a parameter is judged by. Never throws on an unknown key. */\nexport function targetBandFor(parameterKey: string): TargetBand {\n return TARGET_BANDS[parameterKey] ?? DEFAULT_TARGET_BAND;\n}\n\n/** A band edge in the parameter's own unit. A relative band against a target\n * of 0 collapses to 0, which is correct: \"within 5% of zero\" is zero. */\nfunction tolerance(band: TargetBand, edge: number, target: number): number {\n return band.kind === 'absolute' ? edge : Math.abs(target) * edge;\n}\n\n/** Where `now` stands against `target`. `null` whenever the question cannot be\n * asked — no target set, or nothing measured yet — so the tile shows no\n * traffic light rather than a green one it has not earned. */\nexport function targetStatus(\n now: number | null,\n target: number | null,\n parameterKey: string,\n): TargetStatus | null {\n if (now == null || !Number.isFinite(now)) return null;\n if (target == null || !Number.isFinite(target)) return null;\n const band = targetBandFor(parameterKey);\n const gap = now - target;\n // The met side of a one-sided goal is met at any distance.\n if (band.sided === 'atLeast' && gap >= 0) return 'onTarget';\n if (band.sided === 'atMost' && gap <= 0) return 'onTarget';\n const distance = Math.abs(gap);\n if (distance <= tolerance(band, band.onTarget, target)) return 'onTarget';\n if (distance <= tolerance(band, band.approaching, target)) {\n return 'approaching';\n }\n return 'offTarget';\n}\n\n/* ------------------------------ Input bounds ---------------------------- */\n\n/** The range and granularity the target editor accepts for one parameter. */\nexport interface TargetBounds {\n min: number;\n max: number;\n step: number;\n}\n\n/** Physiologically sane editor bounds. Wide enough for any real patient,\n * narrow enough that a slipped decimal point is rejected at the input. */\nexport const TARGET_BOUNDS: Readonly<Record<string, TargetBounds>> = {\n weight: { min: 20, max: 400, step: 0.1 },\n bmi: { min: 10, max: 60, step: 0.1 },\n waist: { min: 30, max: 250, step: 1 },\n energy: { min: 500, max: 6000, step: 50 },\n protein: { min: 10, max: 400, step: 5 },\n};\n\n/** Bounds for a parameter, falling back to a non-negative range stepped at the\n * parameter's own precision so a practice-added target is still editable. */\nexport function targetBoundsFor(def: NumericParameterDef): TargetBounds {\n const known = TARGET_BOUNDS[def.key];\n if (known) return known;\n const precision = def.precision ?? 0;\n return { min: 0, max: 10000, step: 10 ** -precision };\n}\n\n/** Whether a drafted target may be committed. Out-of-bounds is rejected at the\n * editor rather than clamped: silently changing a clinician's 620 to 400 is\n * worse than refusing it. `null` is always committable — it clears. */\nexport function isTargetInBounds(\n draft: number | null,\n bounds: TargetBounds,\n): boolean {\n if (draft == null) return true;\n if (!Number.isFinite(draft)) return false;\n return draft >= bounds.min && draft <= bounds.max;\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — the one target editor */\n/* */\n/* A per-patient target is a clinical goal, not a measurement, and it is */\n/* set from exactly one control wherever it appears: a labelled edit */\n/* button that opens a small popover form (value, unit, bounds, Save, */\n/* Clear). Two surfaces mount it — the Diagnosis summary strip and the */\n/* capture blocks' target line — and they must not offer two different */\n/* affordances for the same number. */\n/* */\n/* Why a form and not a live input: both host surfaces are read at a */\n/* glance mid-consultation, where an always-live field turns a stray */\n/* scroll-wheel or tab-through into a changed clinical goal. The form also */\n/* buys room for a real label, the unit, the accepted range, a dirty */\n/* marker and a Clear — a target must be clearable, not only changeable. */\n/* Discoverability is bought back by making the trigger a persistent, */\n/* named button (never hover-only) and by letting an unset target say so */\n/* in the readout it replaces. */\n/* -------------------------------------------------------------------- */\n\nimport { useState } from 'react';\nimport type { TFunction } from 'i18next';\nimport { Pencil } from 'lucide-react';\nimport { Button } from '../../components/button';\nimport { FormField } from '../../components/form-field';\nimport { IconButton } from '../../components/icon-button';\nimport { NumberInput } from '../../components/number-input';\nimport { Popover } from '../../components/popover';\nimport { parameterLabelWithUnit } from './anamnesis-format';\nimport {\n isTargetInBounds,\n targetBoundsFor,\n type TargetBounds,\n} from './anamnesis-targets';\nimport type { NumericParameterDef } from './anamnesis-types';\n\n/* -------------------------------- Props --------------------------------- */\n\nexport interface TargetEditorProps {\n def: NumericParameterDef;\n /** The host's own label for the metric, for the trigger's accessible name. */\n label: string;\n /** The committed target, or `null` when none is set. */\n committed: number | null;\n /** The current-value line (\"Now 74.5 kg\"), reused as the form's context. */\n nowLabel: string;\n t: TFunction;\n onCommit: (target: number | null) => void;\n}\n\n/** Whether two targets are the same goal. `null` is a value here (no target). */\nfunction sameTarget(a: number | null, b: number | null): boolean {\n if (a == null || b == null) return a === b;\n return a === b;\n}\n\nfunction boundsLabel(bounds: TargetBounds, def: NumericParameterDef): string {\n return def.unit\n ? `${bounds.min}–${bounds.max} ${def.unit}`\n : `${bounds.min}–${bounds.max}`;\n}\n\n/** The edit affordance: a labelled button on the tile that opens a small form.\n * The draft is local and discarded on dismiss — nothing is committed until\n * Save, which is the tile's committed/dirty boundary. */\nexport function TargetEditor({\n def,\n label,\n committed,\n nowLabel,\n t,\n onCommit,\n}: TargetEditorProps) {\n const [open, setOpen] = useState(false);\n const [draft, setDraft] = useState<number | null>(committed);\n const bounds = targetBoundsFor(def);\n const inBounds = isTargetInBounds(draft, bounds);\n const dirty = !sameTarget(draft, committed);\n const parameter = parameterLabelWithUnit(def, t);\n const range = boundsLabel(bounds, def);\n\n // Re-seed the draft from the committed value every time the form opens, so a\n // dismissed edit never lingers as a stale draft on the next open.\n const handleOpenChange = (next: boolean) => {\n if (next) setDraft(committed);\n setOpen(next);\n };\n\n const commit = (target: number | null) => {\n onCommit(target);\n setOpen(false);\n };\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <Popover.Trigger asChild>\n <IconButton\n icon={<Pencil aria-hidden=\"true\" />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={t('anamnesis.targets.edit', { parameter: label })}\n data-testid={`anamnesis-target-edit-${def.key}`}\n />\n </Popover.Trigger>\n <Popover.Content\n size=\"md\"\n align=\"start\"\n data-testid={`anamnesis-target-form-${def.key}`}\n >\n <Popover.Close />\n <Popover.Heading>\n {t('anamnesis.targets.editTitle', { parameter })}\n </Popover.Heading>\n <Popover.Description>{nowLabel}</Popover.Description>\n <div className=\"ds:mt-[var(--spacing-md)] ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <FormField\n label={t('anamnesis.targets.editField')}\n description={t('anamnesis.targets.bounds', { range })}\n error={\n inBounds\n ? undefined\n : t('anamnesis.targets.outOfBounds', { range })\n }\n >\n <NumberInput\n value={draft}\n mode={(def.precision ?? 0) > 0 ? 'decimal' : 'integer'}\n min={bounds.min}\n max={bounds.max}\n step={bounds.step}\n onChange={setDraft}\n data-testid={`anamnesis-target-input-${def.key}`}\n />\n </FormField>\n {/* The dirty marker. The tile behind the popover still shows the\n committed goal, so \"changed but not saved\" has to be said. */}\n {dirty && inBounds ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.targets.unsaved')}\n </span>\n ) : null}\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-end ds:gap-[var(--spacing-sm)]\">\n {/* A target must be clearable, not only changeable — a goal that\n no longer applies is not the same as a goal of zero. */}\n <Button\n intent=\"ghost\"\n size=\"sm\"\n disabled={committed == null}\n onClick={() => commit(null)}\n data-testid={`anamnesis-target-clear-${def.key}`}\n >\n {t('anamnesis.targets.clear')}\n </Button>\n <Button\n intent=\"primary\"\n size=\"sm\"\n disabled={!dirty || !inBounds}\n onClick={() => commit(draft)}\n data-testid={`anamnesis-target-save-${def.key}`}\n >\n {t('anamnesis.targets.save')}\n </Button>\n </div>\n </div>\n </Popover.Content>\n </Popover>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Shared present-vs-target tile */\n/* */\n/* One compact KPI cell: the metric's TARGET as the headline figure, the */\n/* patient's current value beneath it, and a traffic-light status chip. */\n/* Extracted from the dietitian care-plan editor so the care plan and the */\n/* anamnesis Diagnosis strip read as one product — the two surfaces show */\n/* the same four nutrition goals and must not drift apart visually. */\n/* */\n/* Two variants: `outlined` (the default — hosts already inside a Card */\n/* keep a flat tile so cards do not nest) and `elevated` (the Card's own */\n/* elevated recipe — surface, card border, shadow — for hosts that want */\n/* the tiles to read as cards, e.g. the anamnesis goals strip). Each tile */\n/* is a `role=\"group\"` with a plain label, NOT a heading, so a host page */\n/* keeps a clean h1 → h2 outline. */\n/* */\n/* Presentational only — every string arrives already translated, and the */\n/* tile owns no state. The optional slots are what let one shell carry */\n/* both a static plan tile and an editable, gauge-carrying record tile. */\n/* -------------------------------------------------------------------- */\n\nimport type { ReactNode } from 'react';\nimport { Badge } from '../../components/badge';\n\n/** Where the patient stands against one target. */\nexport type TargetStatus = 'onTarget' | 'approaching' | 'offTarget';\n\n/** Traffic light → semantic Badge variant. green / amber / red map to the\n * kit's success / warning / error tokens (each carries its own -foreground\n * pairing, so the chip stays legible in all four themes). */\nexport const TARGET_STATUS_VARIANT: Record<\n TargetStatus,\n 'success' | 'warning' | 'error'\n> = {\n onTarget: 'success',\n approaching: 'warning',\n offTarget: 'error',\n};\n\nexport interface TargetTileProps {\n /** `outlined` (default) for hosts already inside a Card; `elevated`\n * mirrors the kit Card's elevated recipe for tiles that read as cards. */\n variant?: 'outlined' | 'elevated';\n /** Metric name, e.g. \"Target weight\". Also the group's accessible name. */\n label: string;\n /** The TARGET, formatted with its unit — the tile's headline figure. */\n target: string;\n /** The patient's current value, already phrased (\"Now 74.5 kg\"). */\n now: string;\n /** Omit (or `null`) when no target is set — the tile then shows no chip. */\n status?: TargetStatus | null;\n /** Translated status text. Required whenever `status` is set: the traffic\n * light is colour PLUS text, never colour alone (WCAG 1.4.1). */\n statusLabel?: string;\n /** Trailing affordance on the status row — e.g. an edit control. */\n action?: ReactNode;\n /** Extra body under the `now` line — e.g. a banded gauge for the current\n * value. Kept adjacent to `now` so it reads as an elaboration of the\n * measured figure, never of the headline target. */\n children?: ReactNode;\n}\n\nexport function TargetTile({\n variant = 'outlined',\n label,\n target,\n now,\n status,\n statusLabel,\n action,\n children,\n}: TargetTileProps) {\n return (\n <div\n role=\"group\"\n aria-label={label}\n className={\n 'ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)] ds:rounded-[var(--radius-md)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)] ' +\n // Mirrors the kit Card's `outlined` / `elevated` variant recipes\n // (border + surface + shadow tokens), including the accessible-theme\n // 2px border bump.\n (variant === 'elevated'\n ? 'ds:bg-[var(--card)] ds:[:where(&)]:border-[length:var(--surface-border-width,var(--border-width-sm))] ds:border-[color:var(--card-border)] ds:shadow-[var(--shadow-card)]'\n : 'ds:[:where(&)]:border-[length:var(--surface-border-width,var(--border-width-sm))] ds:border-[color:var(--border)]')\n }\n >\n <span className=\"type-label ds:text-[color:var(--muted-foreground)]\">\n {label}\n </span>\n <span className=\"type-metric ds:[--type-metric-size:var(--font-size-xl)] ds:text-[color:var(--foreground)]\">\n {target}\n </span>\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {now}\n </span>\n {children}\n {status || action ? (\n // One row: the traffic light and whatever affordance the host adds.\n // `mt-auto` pins it to the tile's foot, so a row of tiles stretched to\n // the tallest one lines its chips up instead of leaving a hole.\n <div className=\"ds:mt-auto ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n {status ? (\n <Badge variant={TARGET_STATUS_VARIANT[status]} size=\"sm\" withDot>\n {statusLabel}\n </Badge>\n ) : null}\n {action}\n </div>\n ) : null}\n </div>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — the Diagnosis summary strip */\n/* */\n/* The first thing on the Diagnosis surface, above the view switch and */\n/* therefore above Visit details: one compact row answering \"where is this */\n/* patient now against where we want them\". Four tiles — target weight, */\n/* target BMI, daily energy, protein — the same four the dietitian care */\n/* plan is written in, rendered through the SAME `_shared/target-tile` */\n/* shell so the two surfaces read as one product. */\n/* */\n/* BMI's tile is where the BMI readout moved to. It keeps the kit's */\n/* canonical BMI presentation verbatim (WHO category badge + the shared */\n/* banded gauge from `components/bmi-calculator`); those sit directly */\n/* under the \"Now\" line so the needle reads as an elaboration of the */\n/* MEASURED figure, never of the headline target. */\n/* */\n/* Setting a target is deliberate, not ambient: each tile carries a */\n/* labelled edit button that opens a small popover form (value, unit, */\n/* bounds, Save, Clear). An always-live input on a strip that is read at a */\n/* glance mid-consultation invites a stray scroll-wheel to move a clinical */\n/* goal; the tile itself stays a pure readout and shows only the committed */\n/* value. */\n/* -------------------------------------------------------------------- */\n\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport { bmiCategory } from '../../components/bmi-calculator/bmi';\nimport { TargetTile } from '../_shared/target-tile';\nimport { formatValue, latestParameterValue } from './anamnesis-derive';\nimport { localeOf, parameterLabel } from './anamnesis-format';\nimport { TargetEditor } from './anamnesis-target-editor';\nimport { targetStatus } from './anamnesis-targets';\nimport type { NumericParameterDef, Visit } from './anamnesis-types';\n\n/* ------------------------------ Formatting ------------------------------ */\n\n/** A measured or targeted figure with its unit. The figure follows the app\n * locale; unit symbols are locale-invariant scientific notation, as\n * everywhere else in this pattern. */\nfunction withUnit(\n value: number,\n def: NumericParameterDef,\n locale: string | undefined,\n): string {\n const text = formatValue(value, def.precision, locale);\n return def.unit ? `${text} ${def.unit}` : text;\n}\n\n/* ------------------------------- One tile ------------------------------- */\n\ninterface StripTileProps {\n def: NumericParameterDef;\n visits: readonly Visit[];\n target: number | null;\n t: TFunction;\n onTargetChange: (def: NumericParameterDef, target: number | null) => void;\n}\n\nfunction StripTile({ def, visits, target, t, onTargetChange }: StripTileProps) {\n // `ui.*` namespace — the WHO vocabulary belongs to the shipped BMI\n // component, not to this pattern's story-local `patterns` bundle.\n const { t: tUi } = useTranslation('ui');\n const locale = localeOf(t);\n // The MOST RECENT recording, not the newest visit's cell. A parameter\n // measured at the last appointment but not at this one is still on record,\n // and a tile that called it \"not yet measured\" was answering a question\n // nobody asked — \"where is this patient now\" spans the visits.\n const now = latestParameterValue(visits, def)?.value ?? null;\n const status = targetStatus(now, target, def.key);\n // EVERY tile label states it is a target — the seeded four and any\n // practice-chosen goal alike — via one template over the parameter's\n // effective label (units ride the values, not the label).\n const label = t('anamnesis.targets.tileLabel', {\n name: parameterLabel(def, t),\n });\n // The WHO band describes the CURRENT figure, so it rides the \"Now\" line.\n // A second chip beside the status read as clutter on the one tile that has it.\n const banded = def.computed && now != null;\n const nowLabel =\n now == null\n ? t('anamnesis.targets.nowUnset')\n : banded\n ? t('anamnesis.targets.nowBanded', {\n value: withUnit(now, def, locale),\n band: tUi(`bmiCalculator.category.${bmiCategory(now)}`),\n })\n : t('anamnesis.targets.now', { value: withUnit(now, def, locale) });\n\n return (\n <TargetTile\n variant=\"elevated\"\n label={label}\n target={\n target == null\n ? t('anamnesis.targets.unset')\n : withUnit(target, def, locale)\n }\n now={nowLabel}\n status={status}\n statusLabel={status ? t(`anamnesis.targets.status.${status}`) : undefined}\n action={\n <TargetEditor\n def={def}\n label={label}\n committed={target}\n nowLabel={nowLabel}\n t={t}\n onCommit={(next) => onTargetChange(def, next)}\n />\n }\n />\n );\n}\n\n/* -------------------------------- Props --------------------------------- */\n\nexport interface AnamnesisTargetStripProps {\n /** The record's visits, oldest first. Each tile's \"Now\" is the most recent\n * visit that actually MEASURED its parameter — not the newest visit. */\n visits: readonly Visit[];\n /** The strip's parameters, in order. See `stripParameters`. */\n defs: NumericParameterDef[];\n /** Committed targets by parameter key. */\n targets: Map<string, number>;\n t: TFunction;\n onTargetChange: (def: NumericParameterDef, target: number | null) => void;\n}\n\n/* ------------------------------- Component ------------------------------ */\n\n/** Column count for the tile grid: FOUR PER LINE at most, and never more\n * columns than there are tiles — an empty fourth column left three goals\n * huddled at three-quarters width with a hole beside them. Static class\n * strings, because Tailwind cannot see an interpolated one. */\nfunction gridColumnsClass(count: number): string {\n if (count <= 1) return 'ds:grid-cols-1';\n if (count === 2) return 'ds:grid-cols-2';\n if (count === 3) return 'ds:grid-cols-2 ds:sm:grid-cols-3';\n return 'ds:grid-cols-2 ds:sm:grid-cols-4';\n}\n\nexport function AnamnesisTargetStrip({\n visits,\n defs,\n targets,\n t,\n onTargetChange,\n}: AnamnesisTargetStripProps) {\n if (defs.length === 0) return null;\n return (\n // No wrapper card: the ELEVATED tiles sit directly on the surface as\n // dashboard cards (a card-in-card read as double chrome). The heading\n // stays for the outline and the region name, visually the tiles speak\n // for themselves — every label states it is a target.\n <section\n aria-label={t('anamnesis.targets.title')}\n data-testid=\"anamnesis-target-strip\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n <h2 className=\"ds:sr-only\">{t('anamnesis.targets.title')}</h2>\n {/* Same grid as the care plan's nutrition targets, so the plan and the\n record read as one product. */}\n <div\n className={`ds:grid ds:gap-[var(--spacing-md)] ${gridColumnsClass(defs.length)}`}\n >\n {defs.map((def) => (\n <StripTile\n key={def.key}\n def={def}\n visits={visits}\n target={targets.get(def.key) ?? null}\n t={t}\n onTargetChange={onTargetChange}\n />\n ))}\n </div>\n </section>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — compile mode (clinician-facing) */\n/* */\n/* The heart of the demo, and the replacement for the Excel file. Three */\n/* complementary views behind a Tabs switch: */\n/* A. Summary — the patient's returned questionnaire, READ-ONLY: the */\n/* at-a-glance digest, the missing-answer alert, and the full answer */\n/* list one closed disclosure below. Selected on arrival. */\n/* B. Compile — record the current (newest) visit once, no double entry: */\n/* visit meta, any required questionnaire answer that came back blank, */\n/* anthropometrics with a COMPUTED BMI and current-vs-target, a */\n/* many-to-many pathology multi-select, oncological history, therapy, */\n/* blood tests, fasting-mimicking cycles, the nutritional proposal / */\n/* notes, and the annual programme. */\n/* C. Evolution — the parameters-as-rows, visits-as-columns grid with */\n/* deltas + trends, plus a compare-two-visits mode that highlights */\n/* exactly what changed, numeric and non-numeric. */\n/* */\n/* Local, in-memory working state only. */\n/* -------------------------------------------------------------------- */\n\nimport {\n useCallback,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n useEffect,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { ChevronDown, Plus, Trash2 } from 'lucide-react';\nimport { Badge } from '../../components/badge';\nimport { Button } from '../../components/button';\nimport { Card } from '../../components/card';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '../../components/collapsible';\nimport { EmptyState } from '../../components/empty-state';\nimport { FormField } from '../../components/form-field';\nimport { IconButton } from '../../components/icon-button';\nimport { MultiSelect } from '../../components/multi-select';\nimport { NumberInput } from '../../components/number-input';\nimport { RadioGroup, Radio } from '../../components/radio-group';\nimport { Select, type SelectOption } from '../../components/select';\nimport { Tabs } from '../../components/tabs';\nimport { TextArea } from '../../components/text-area';\nimport { StateBackedTextInput } from '../../components/_shared/state-backed-text-input';\nimport { Timestamp } from '../../components/timestamp';\nimport { DatePicker } from '../../components/date-picker';\nimport {\n allSectionsIncludingArchived,\n assignablePathologyCodes,\n configuredParameters,\n configuredSections,\n isParameterTargetable,\n pathologyLookup,\n type PracticeAnamnesisConfig,\n} from './anamnesis-config';\nimport {\n CALENDAR_DATE_FORMAT,\n deltaInfo,\n formatValue,\n outOfRange,\n parameterValueAt,\n setNumericOnVisit,\n setTargetOnRecord,\n} from './anamnesis-derive';\nimport {\n buildIntakeDigest,\n missingMandatoryAnswers,\n useFieldJump,\n type MissingAnswer,\n} from './anamnesis-digest';\nimport { AnamnesisSummary, TRIGGER_FOCUS_RING } from './anamnesis-summary';\nimport {\n OCCASIONAL_BLOCKS,\n compileBlockDensity,\n} from './anamnesis-compile-blocks';\nimport type { OccasionalBlockId } from './anamnesis-compile-blocks';\nimport type { DisclosureAudience } from './anamnesis-disclosure';\nimport type { AnamnesisExportTab } from './anamnesis-export';\nimport { AnamnesisEvolution, useShownVisitIds } from './anamnesis-evolution';\nimport { AnamnesisExportMenu } from './anamnesis-export-menu';\nimport { AnamnesisField } from './anamnesis-field';\nimport { TargetEditor } from './anamnesis-target-editor';\nimport { AnamnesisTargetStrip } from './anamnesis-target-strip';\nimport { stripParameters } from './anamnesis-targets';\nimport {\n clockSuffix,\n fieldVisible,\n localeOf,\n parameterLabelWithUnit,\n parseCalendarDate,\n pathologyCodeWithLabel,\n pathologyLabel,\n patientAgeLabel,\n sectionLabel,\n toCalendarIso,\n} from './anamnesis-format';\nimport { DeltaIndicator, OutOfRangeBadge } from './anamnesis-indicators';\nimport type {\n AnamnesisRecord,\n IntakeAnswer,\n MedicationEntry,\n NumericParameterDef,\n OpenAnamnesisNote,\n PractitionerOption,\n Visit,\n YesNo,\n} from './anamnesis-types';\n\n/* ------------------------ Sub-block: numeric list ----------------------- */\n\ninterface NumericBlockProps {\n /** Keys whose target is owned by the goals strip — the block still shows\n * the goal beside the measurement but offers no second editor for it.\n * Config-driven: the practice chooses its goals in the Targets tab. */\n stripKeys: ReadonlySet<string>;\n defs: NumericParameterDef[];\n visit: Visit;\n previous?: Visit;\n targets: Map<string, number>;\n t: TFunction;\n onChange: (def: NumericParameterDef, value: number | null) => void;\n /** Make the per-patient target settable for the targetable parameters in\n * this block — the seeded five and any number the practice flagged as a\n * goal; a parameter without the flag keeps its read-only target line.\n * Omitted = no editor in this block at all. */\n onTargetChange?: (def: NumericParameterDef, target: number | null) => void;\n}\n\n/** Single-visit editable list of numeric parameters (anthropometrics, dietary\n * intake or labs): value input, unit, out-of-range flag, delta vs the previous\n * visit, and — when a target exists — a current-vs-target line.\n *\n * COMPUTED parameters are dropped: there is nothing to type, and BMI (the only\n * one the engine computes) is read in the summary strip at the top of the\n * surface, where it sits beside the targets it is judged against. */\nfunction NumericBlock({\n stripKeys,\n defs,\n visit,\n previous,\n targets,\n t,\n onChange,\n onTargetChange,\n}: NumericBlockProps) {\n const locale = localeOf(t);\n return (\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n {defs\n .filter((def) => !def.computed)\n .map((def) => {\n const value = parameterValueAt(visit, def);\n const prevValue = previous ? parameterValueAt(previous, def) : null;\n const delta = previous ? deltaInfo(value, prevValue, def) : null;\n const flag = outOfRange(value, def.referenceRange);\n const target = targets.get(def.key) ?? null;\n const labelWithUnit = parameterLabelWithUnit(def, t);\n // The strip's goals are set up there; offering a second editor for\n // the same goal on the same screen is how two copies start.\n const settableTarget =\n onTargetChange != null &&\n isParameterTargetable(def) &&\n !stripKeys.has(def.key);\n return (\n <div\n key={def.key}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\"\n >\n <FormField label={labelWithUnit}>\n <NumberInput\n value={value}\n mode={(def.precision ?? 0) > 0 ? 'decimal' : 'integer'}\n onChange={(next) => onChange(def, next)}\n />\n </FormField>\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n {flag ? <OutOfRangeBadge flag={flag} t={t} /> : null}\n <DeltaIndicator delta={delta} def={def} t={t} />\n {/* The target is one shared patient goal, read wherever it is\n relevant and set from ONE control — the same popover editor\n the summary strip mounts, never a second affordance. */}\n {settableTarget || target != null ? (\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {target == null\n ? t('anamnesis.targets.unset')\n : t('anamnesis.grid.target', {\n value: formatValue(target, def.precision, locale),\n unit: def.unit ?? '',\n })}\n </span>\n {settableTarget ? (\n <TargetEditor\n def={def}\n label={labelWithUnit}\n committed={target}\n nowLabel={t('anamnesis.targets.now', {\n value:\n `${formatValue(value, def.precision, locale)} ${def.unit ?? ''}`.trim(),\n })}\n t={t}\n onCommit={(next) => onTargetChange?.(def, next)}\n />\n ) : null}\n </span>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n/* ------------------------------ Block shell ----------------------------- */\n\nfunction Block({\n titleKey,\n t,\n defaultOpen = true,\n fill,\n fillKind = 'recorded',\n flagged = 0,\n open,\n onOpenChange,\n children,\n}: {\n titleKey: string;\n t: TFunction;\n /** Arrival state for an uncontrolled block. See `anamnesis-compile-blocks`. */\n defaultOpen?: boolean;\n /** Entries already recorded here, named in the header so a folded block never\n * hides that it holds something. `undefined` = no summary. */\n fill?: number | null;\n /** What `fill` counts. `recorded` is history already captured; `outstanding`\n * is work left to do, where \"12 recorded\" would read as the opposite. */\n fillKind?: 'recorded' | 'outstanding';\n /** Of that fill, how many sit outside their reference range. Folding must\n * never be able to hide a flagged value, so the count rides the header. */\n flagged?: number;\n /** Controlled only where something outside has to be able to open it (the\n * jump to a missing answer). Omitted = uncontrolled. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: React.ReactNode;\n}) {\n // A titled, collapsible section. The compile surface wraps the whole Tabs\n // block in a single elevated Card (like the intake surface and the\n // plan-context hero cards), so each section sits ON that card rather than\n // being its own card. The heading stays an h2 (for heading order) that\n // contains the toggle button, per the accordion-header ARIA pattern; the fill\n // badge sits inside the trigger, so its text is part of the toggle's\n // accessible name and is announced with it.\n return (\n <Collapsible\n variant=\"default\"\n defaultOpen={open === undefined ? defaultOpen : undefined}\n open={open}\n onOpenChange={onOpenChange}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n <h2 className=\"type-title-section ds:m-0 ds:text-[color:var(--foreground)]\">\n <CollapsibleTrigger\n className={\n 'ds:flex ds:w-full ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:text-start' +\n TRIGGER_FOCUS_RING\n }\n >\n <span className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n {t(titleKey)}\n {fill == null ? null : (\n <Badge\n variant={\n fillKind === 'outstanding' && fill > 0 ? 'warning' : 'neutral'\n }\n size=\"sm\"\n >\n {fillKind === 'outstanding'\n ? fill > 0\n ? t('anamnesis.compile.blockOutstanding', { count: fill })\n : t('anamnesis.compile.blockSettled')\n : fill > 0\n ? t('anamnesis.compile.blockFilled', { count: fill })\n : t('anamnesis.compile.blockEmpty')}\n </Badge>\n )}\n {flagged > 0 ? (\n <Badge variant=\"warning\" size=\"sm\">\n {t('anamnesis.compile.blockFlagged', { count: flagged })}\n </Badge>\n ) : null}\n </span>\n <ChevronDown\n aria-hidden=\"true\"\n className=\"ds:size-5 ds:shrink-0 ds:text-[color:var(--muted-foreground)] ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none ds:[[data-state=open]_&]:rotate-180\"\n />\n </CollapsibleTrigger>\n </h2>\n <CollapsibleContent\n aria-label={t(titleKey)}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n {children}\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\n/* -------------------------------- Props --------------------------------- */\n\n/** The three Diagnosis views. Also the three export tabs — one vocabulary. */\nexport type AnamnesisCompileView = AnamnesisExportTab;\n\nexport interface AnamnesisCompileProps {\n record: AnamnesisRecord;\n t: TFunction;\n /** Mount flush inside a host section tab (drops the full-page chrome + the\n * patient-name page heading — the host shows the patient banner). */\n embedded?: boolean;\n /** The practice's configured vocabulary. Omitted = the kit-seeded default. */\n config?: PracticeAnamnesisConfig;\n /** A per-patient target was set or cleared (`null` clears it). The surface\n * applies it to its own working record either way; this is the seam a\n * platform host persists through — and the one place a shared target could\n * be reconciled with the care plan, which no story can do. */\n onTargetChange?: (parameterKey: string, target: number | null) => void;\n /** Host status chips rendered at the surface header's end — the slot a\n * platform host uses to fold its OWN record state (signature status,\n * expiry, save feedback, a renew affordance) into the section instead of\n * bolting a second bar above it. Content is host-owned and already\n * translated. The surface itself claims no save state. */\n statusSlot?: ReactNode;\n /** Omit the nutrition-targets strip above the record card — for hosts\n * that present the record without the goals (the isolated single-section\n * demo). Default false: the strip renders. Target editors inside the\n * record blocks are unaffected. */\n hideTargetStrip?: boolean;\n /** Draw the evolution view as one table per anamnesis type (visits\n * grouped by `sourceLabel`). Default false: one grid over every visit. */\n partitionBySource?: boolean;\n /** Route the missing-answer jump to a host questionnaire surface instead\n * of the internal Compila gaps block (e.g. the platform island's fill\n * view). Receives the missing answer the user asked to fix. */\n onMissingAnswerJump?: (missing: MissingAnswer) => void;\n /** Every edit to the working record (visit fields, pathologies, therapy,\n * events, targets) — the persistence seam for hosts that store visit\n * data. Fires AFTER the change lands in state, with the full record;\n * hosts debounce and diff. NOT called for the initial mount. */\n onRecordChange?: (record: AnamnesisRecord) => void;\n /** The practice's operators, offered in the visit's Practitioner select.\n * Host-supplied because the roster is live platform data, not practice\n * vocabulary — it must never be written into the saved config. Omitted or\n * empty leaves a free-text input, so kit mounts without a roster keep\n * working. */\n practitioners?: PractitionerOption[];\n /** The calendar date (ISO) a NEW follow-up visit is created on. A host\n * passes its \"today\"; defaults to the latest visit's date so kit demos\n * and tests stay deterministic (the surface deliberately never reads the\n * wall clock). The date field is editable either way. */\n newVisitDateIso?: string;\n /** The host's side panel, forwarded to the Evolution view. Omitted = the\n * evolution surface reads notes in place. */\n onOpenNote?: OpenAnamnesisNote;\n /** Mount on this view instead of Summary. Demo/story hook only — Chromatic\n * skips play functions, so a click-selected tab is never snapshotted. */\n defaultView?: AnamnesisCompileView;\n /** Mount with the export menu open. Demo/story hook only — Chromatic skips\n * play functions, so a click-opened menu is never snapshotted. */\n defaultExportMenuOpen?: boolean;\n /** Mount with the share preview open. Demo/story hook, same reason. */\n defaultShareOpen?: boolean;\n /** Mount the export control on this audience. Demo/story hook. */\n defaultExportAudience?: DisclosureAudience;\n}\n\n/* ------------------------------- Component ------------------------------ */\n\nexport function AnamnesisCompile({\n record: initial,\n t,\n embedded = false,\n config,\n onTargetChange,\n hideTargetStrip = false,\n partitionBySource = false,\n statusSlot,\n onOpenNote,\n onMissingAnswerJump,\n onRecordChange,\n practitioners,\n newVisitDateIso,\n defaultView = 'summary',\n defaultExportMenuOpen = false,\n defaultShareOpen = false,\n defaultExportAudience = 'clinician',\n}: AnamnesisCompileProps) {\n const [record, setRecord] = useState<AnamnesisRecord>(() =>\n structuredClone(initial),\n );\n\n // Change seam: report every record edit AFTER it lands in state. The\n // initial mount is skipped — nothing changed yet.\n const recordChangeSeenRef = useRef(false);\n useEffect(() => {\n if (!recordChangeSeenRef.current) {\n recordChangeSeenRef.current = true;\n return;\n }\n onRecordChange?.(record);\n // onRecordChange identity changes must not re-fire for the same record.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [record]);\n const nextId = useRef(0);\n\n const { patient, visits } = record;\n const latest: Visit | undefined = visits[visits.length - 1];\n const previous = visits.length > 1 ? visits[visits.length - 2] : undefined;\n const targets = useMemo(\n () =>\n new Map(record.targets.map((x) => [x.parameterKey, x.target] as const)),\n [record.targets],\n );\n\n // CAPTURE surfaces take the live vocabulary; the review of already-recorded\n // answers takes the full one, or archiving a question would erase answers.\n const anthroDefs = useMemo(\n () => configuredParameters(config, 'anthropometric'),\n [config],\n );\n const dietaryDefs = useMemo(\n () => configuredParameters(config, 'dietary'),\n [config],\n );\n const labDefs = useMemo(() => configuredParameters(config, 'lab'), [config]);\n // The summary strip's four: target weight, target BMI, daily energy, protein.\n const stripDefs = useMemo(() => stripParameters(config), [config]);\n const stripKeys = useMemo(\n () => new Set(stripDefs.map((def) => def.key)),\n [stripDefs],\n );\n\n // Arrival density: the every-visit blocks open, the occasional ones folded\n // with a fill summary in their header. A default, not a control. `labDefs`\n // is the list the Blood tests block renders, so its count matches.\n const density = useMemo(\n () => compileBlockDensity(latest, labDefs),\n [latest, labDefs],\n );\n\n // Held HERE, not in each block: Radix Tabs unmounts an inactive panel, so an\n // uncontrolled block would re-fold on every Compile → Evolution → Compile\n // round trip. Seeded once from the arrival policy; her own toggles win after.\n const [occasionalOpen, setOccasionalOpen] = useState<\n Record<OccasionalBlockId, boolean>\n >(() => {\n const seed = compileBlockDensity(latest, labDefs);\n const state = {} as Record<OccasionalBlockId, boolean>;\n for (const id of OCCASIONAL_BLOCKS) state[id] = seed[id].open;\n return state;\n });\n const setBlockOpen = useCallback(\n (id: OccasionalBlockId) => (open: boolean) =>\n setOccasionalOpen((prev) => ({ ...prev, [id]: open })),\n [],\n );\n const historySections = useMemo(\n () => allSectionsIncludingArchived(config),\n [config],\n );\n // Only a question the practice still ASKS can be missing an answer. Demanding\n // one it archived is a gap nobody can close — the intake surface no longer\n // renders the field, so the alert would never clear.\n const liveSections = useMemo(() => configuredSections(config), [config]);\n const pathologies = useMemo(() => pathologyLookup(config), [config]);\n\n // Summary is the arrival tab: the questionnaire is read before the visit is\n // recorded, and the missing-answer alert has to be on screen when she opens\n // the record rather than behind an unselected tab. Controlled, because the\n // alert's jump crosses from Summary to Compile.\n const [view, setView] = useState<AnamnesisCompileView>(defaultView);\n const [gapsOpen, setGapsOpen] = useState(true);\n // Mirrors the evolution picker so the export control can file the view that\n // is on screen.\n const [shownVisitIds, trackShownVisits] = useShownVisitIds();\n const { containerRef, requestJump } = useFieldJump();\n const readAnswer = useCallback(\n (key: string) => record.intake?.answers[key]?.value,\n [record.intake],\n );\n const digest = useMemo(\n () => buildIntakeDigest(historySections, readAnswer, patient.sex, t),\n [historySections, readAnswer, patient.sex, t],\n );\n const missingAnswers = useMemo(\n () => missingMandatoryAnswers(liveSections, readAnswer, patient.sex, t),\n [liveSections, readAnswer, patient.sex, t],\n );\n // Frozen at mount, deliberately. The Compile tab's gap block is the visit's\n // to-do list, so a field must not vanish from under the cursor the instant\n // its answer stops being blank — the live count on Summary is the feedback.\n const [gapKeys] = useState(() => new Set(missingAnswers.map((m) => m.key)));\n\n // Recording an answer is data entry, so the jump crosses to Compile, opens\n // the gap block and lands focus — never a collapsed or unmounted target.\n const jumpToMissing = (target: MissingAnswer) => {\n // A host with its own questionnaire surface (e.g. the platform island's\n // fill view) routes the jump there instead of the Compila gaps block.\n if (onMissingAnswerJump) {\n onMissingAnswerJump(target);\n return;\n }\n setView('compile');\n setGapsOpen(true);\n requestJump(target.key);\n };\n\n // A record with no visit is a different screen, not a variant of the form:\n // there is nothing to compile against, so say so rather than render inputs\n // that write nowhere. Every hook above has already run.\n if (!latest) {\n return (\n <CompileShell embedded={embedded}>\n <Card variant=\"elevated\">\n <Card.Body>\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={t('anamnesis.empty.noRecord.title')}\n description={t('anamnesis.empty.noRecord.description')}\n />\n </Card.Body>\n </Card>\n </CompileShell>\n );\n }\n\n /* -------- working-state setters -------- */\n\n const patchLatest = (mut: (v: Visit) => Visit) => {\n setRecord((r) => {\n if (r.visits.length === 0) return r;\n const next = r.visits.slice();\n next[next.length - 1] = mut(next[next.length - 1]);\n return { ...r, visits: next };\n });\n };\n\n const onNumericChange = (def: NumericParameterDef, value: number | null) =>\n patchLatest((v) => setNumericOnVisit(v, def, value));\n\n /** Write to the visit the cell belongs to, never to whatever is last. */\n const onGridCellChange = (\n visit: Visit,\n def: NumericParameterDef,\n value: number | null,\n ) =>\n setRecord((r) => {\n return {\n ...r,\n visits: r.visits.map((v) =>\n v.id === visit.id ? setNumericOnVisit(v, def, value) : v,\n ),\n };\n });\n\n /** Targets belong to the RECORD, not to a visit — a goal is not a\n * measurement taken on a day. Same working-state idiom as the cell edits. */\n const setTarget = (def: NumericParameterDef, target: number | null) => {\n setRecord((r) => setTargetOnRecord(r, def.key, target));\n onTargetChange?.(def.key, target);\n };\n\n const setPathologies = (codes: string[]) =>\n patchLatest((v) => ({ ...v, pathologyCodes: codes }));\n\n const updateTherapy = (id: string, patch: Partial<MedicationEntry>) =>\n patchLatest((v) => ({\n ...v,\n therapy: v.therapy.map((m) => (m.id === id ? { ...m, ...patch } : m)),\n }));\n\n const removeTherapy = (id: string) =>\n patchLatest((v) => ({\n ...v,\n therapy: v.therapy.filter((m) => m.id !== id),\n }));\n\n const addTherapy = () => {\n nextId.current += 1;\n const id = `new-${nextId.current}`;\n patchLatest((v) => ({\n ...v,\n therapy: [...v.therapy, { id, name: '', dose: '', kind: 'medication' }],\n }));\n };\n\n /** Append a NEW empty follow-up visit and make it the edited \"latest\" —\n * without this the record type supports many visits but the surface offers\n * no way to ever gain one, so Evolution could never grow a second point in\n * a live host. Cloned EMPTY on purpose: measurements are taken AT the\n * visit, so carrying the previous visit's numbers forward would fabricate\n * data. Lands through the same `onRecordChange` seam as every other edit —\n * a persisting host saves it as a new visit row. */\n const addFollowUpVisit = () => {\n nextId.current += 1;\n const id = `new-visit-${nextId.current}`;\n setRecord((r) => {\n const last = r.visits[r.visits.length - 1];\n if (!last) return r;\n const visit: Visit = {\n id,\n visitType: 'followUp',\n dateIso: newVisitDateIso ?? last.dateIso,\n anthropometrics: {\n weightKg: null,\n heightCm: null,\n waistCm: null,\n hipsCm: null,\n armCm: null,\n phaseAngleDeg: null,\n },\n labs: [],\n pathologyCodes: [],\n therapy: [],\n fmdCycles: [],\n };\n return { ...r, visits: [...r.visits, visit] };\n });\n };\n\n const updateIntakeAnswer = (key: string, answer: IntakeAnswer) => {\n setRecord((r) => ({\n ...r,\n intake: {\n ...r.intake,\n answers: {\n ...r.intake?.answers,\n [key]: { value: answer, origin: 'clinician' },\n },\n },\n }));\n };\n\n /* -------- pathology multi-select options (grouped by family) -------- */\n\n // Resolved through the config LOOKUP, not the shipped constant — a\n // practice-added code has no entry in the kit's map and read `.parentCode`\n // off `undefined`.\n const pathologyOptions: SelectOption[] = assignablePathologyCodes(config).map(\n (code) => {\n const entry = pathologies[code];\n const parent = entry?.parentCode;\n return {\n value: code,\n label: pathologyCodeWithLabel(code, t, entry),\n group: parent\n ? pathologyLabel(parent, t, pathologies[parent])\n : t('anamnesis.pathology.groupGeneral'),\n };\n },\n );\n\n const latestOncological = latest.oncological ?? {};\n const latestAnnual = latest.annualProgramme ?? {\n proposed: false,\n accepted: false,\n };\n\n /* --------------------------------- render -------------------------------- */\n\n const inner = (\n <>\n {/* Header row: the page heading (standalone only) and the host's\n status chips. The surface claims NO save state of its own — the old\n mock autosave chip promised persistence nothing provided; a host\n with real persistence renders its own state via `statusSlot`. The\n row disappears entirely when it has nothing to show. */}\n {!embedded || statusSlot ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-end ds:justify-between ds:gap-[var(--spacing-sm)]\">\n {embedded ? (\n <span />\n ) : (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <h1 className=\"type-title-page ds:m-0 ds:text-[color:var(--foreground)]\">\n {patient.firstName} {patient.lastName}\n </h1>\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {patientAgeLabel(record, t)}\n {' · '}\n {t('anamnesis.compile.visitCount', { visits: visits.length })}\n </p>\n </div>\n )}\n {statusSlot ? (\n <span\n data-testid=\"anamnesis-status-slot\"\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n {statusSlot}\n </span>\n ) : null}\n </div>\n ) : null}\n\n {/* One elevated Card holds the view switch + its content, so the compile\n surface reads as a contained record (matching the intake surface and\n the plan-context hero cards) rather than a segmented tab strip and a\n stack of section cards floating on the app-shell background. */}\n {/* The summary strip — first on the surface and a SIBLING of the record\n card, not nested inside it: \"where is this patient against her goals\"\n is its own object, on screen on arrival and while she moves between\n the three views. */}\n {hideTargetStrip ? null : (\n <AnamnesisTargetStrip\n visits={visits}\n defs={stripDefs}\n targets={targets}\n t={t}\n onTargetChange={setTarget}\n />\n )}\n\n <Card variant=\"elevated\">\n <Card.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]\">\n <Tabs\n value={view}\n onValueChange={(next) => setView(next as typeof view)}\n >\n {/* ONE export/share control for the whole surface, sitting beside\n the view switch it acts on — never one per table. A sibling of\n Tabs.List, not a child: a tablist holds tabs only. */}\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <Tabs.List aria-label={t('anamnesis.compile.viewsLabel')}>\n <Tabs.Trigger value=\"summary\">\n {t('anamnesis.compile.tabSummary')}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"compile\">\n {t('anamnesis.compile.tabCompile')}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"evolution\">\n {t('anamnesis.compile.tabEvolution')}\n </Tabs.Trigger>\n </Tabs.List>\n <AnamnesisExportMenu\n tab={view}\n record={record}\n t={t}\n config={config}\n shownVisitIds={shownVisitIds}\n defaultOpen={defaultExportMenuOpen}\n defaultShareOpen={defaultShareOpen}\n defaultAudience={defaultExportAudience}\n />\n </div>\n\n {/* -------------------- Summary view -------------------- */}\n <Tabs.Content value=\"summary\">\n <div className=\"ds:pt-[var(--spacing-md)]\">\n <AnamnesisSummary\n intake={record.intake}\n sections={historySections}\n sex={patient.sex}\n digest={digest}\n missing={missingAnswers}\n onJump={jumpToMissing}\n t={t}\n />\n </div>\n </Tabs.Content>\n\n {/* -------------------- Compile view -------------------- */}\n <Tabs.Content value=\"compile\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)] ds:pt-[var(--spacing-md)]\">\n {/* Visit meta */}\n <Block titleKey=\"anamnesis.section.visitMeta\" t={t}>\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n <FormField label={t('anamnesis.field.visitType.label')}>\n <Select\n options={[\n {\n value: 'first',\n label: t('anamnesis.visitType.first'),\n },\n {\n value: 'followUp',\n label: t('anamnesis.visitType.followUp'),\n },\n ]}\n value={latest.visitType}\n onValueChange={(next) =>\n patchLatest((v) => ({\n ...v,\n visitType: (next ||\n 'followUp') as Visit['visitType'],\n }))\n }\n />\n </FormField>\n <FormField label={t('anamnesis.field.practitioner.label')}>\n {/* A practice picks the operator who saw the patient —\n free text only survives where the host has no\n roster to offer (kit demos, tests). */}\n {practitioners && practitioners.length > 0 ? (\n <Select\n options={practitioners}\n value={latest.practitioner ?? ''}\n onValueChange={(next) =>\n patchLatest((v) => ({\n ...v,\n practitioner: next || undefined,\n }))\n }\n />\n ) : (\n <StateBackedTextInput\n value={latest.practitioner ?? ''}\n onChange={(e) =>\n patchLatest((v) => ({\n ...v,\n practitioner: e.target.value,\n }))\n }\n />\n )}\n </FormField>\n <FormField label={t('anamnesis.header.visitDate')}>\n {/* A real input, like its three siblings — a bare\n readout beside them read as broken. Parsed and\n written as a LOCAL calendar date so the day cannot\n shift by a timezone; a visit stamped with a time\n keeps it, since this control edits only the day. */}\n <DatePicker\n value={parseCalendarDate(latest.dateIso)}\n onChange={(next) =>\n next &&\n patchLatest((v) => ({\n ...v,\n dateIso:\n toCalendarIso(next) + clockSuffix(v.dateIso),\n }))\n }\n />\n </FormField>\n </div>\n {/* The way a record GAINS a visit — beside the visit date\n it seeds. The fresh visit becomes the edited latest;\n everything below now writes to it. */}\n <div>\n <Button\n intent=\"outline\"\n size=\"sm\"\n startIcon={<Plus aria-hidden=\"true\" />}\n data-testid=\"anamnesis-add-visit\"\n onClick={addFollowUpVisit}\n >\n {t('anamnesis.compile.addFollowUpVisit')}\n </Button>\n </div>\n </Block>\n\n {/* Questionnaire gaps — the ONLY intake content on this tab.\n The answers themselves are read on Summary; what is left\n here is the data entry, i.e. what she fills in at the visit.\n Absent gaps, the block does not render at all. */}\n {gapKeys.size > 0 ? (\n <Block\n titleKey=\"anamnesis.section.intakeGaps\"\n t={t}\n open={gapsOpen}\n onOpenChange={setGapsOpen}\n fill={missingAnswers.length}\n fillKind=\"outstanding\"\n >\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.compile.gapsIntro')}\n </p>\n <div\n ref={containerRef}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]\"\n >\n {liveSections.map((section) => {\n const shown = section.fields\n .filter((f) => fieldVisible(f, patient.sex))\n .filter((f) => gapKeys.has(f.key));\n if (shown.length === 0) return null;\n return (\n <div\n key={section.key}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n <h3 className=\"type-title-item ds:m-0 ds:text-[color:var(--foreground)]\">\n {sectionLabel(section, t)}\n </h3>\n {shown.map((field) => {\n const sourced = record.intake?.answers[field.key];\n return (\n <AnamnesisField\n key={field.key}\n def={field}\n answer={sourced?.value}\n origin={sourced?.origin}\n showOrigin\n onChange={(a) =>\n updateIntakeAnswer(field.key, a)\n }\n t={t}\n />\n );\n })}\n </div>\n );\n })}\n </div>\n </Block>\n ) : null}\n\n {/* Anthropometrics */}\n <Block titleKey=\"anamnesis.section.anthropometrics\" t={t}>\n {/* BMI used to be a cell in this grid. It is computed, not\n typed, so it moved to the summary strip beside the\n targets it is judged against — said here so its absence\n from the block that feeds it is never a mystery. */}\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.compile.bmiInStrip')}\n </p>\n <NumericBlock\n stripKeys={stripKeys}\n defs={anthroDefs}\n visit={latest}\n previous={previous}\n targets={targets}\n t={t}\n onChange={onNumericChange}\n onTargetChange={setTarget}\n />\n </Block>\n\n {/* Dietary intake — what the patient eats, estimated at every\n visit. Its own block because it is neither a measurement of\n the body nor a blood result. Rendered only where the\n practice configured it. */}\n {dietaryDefs.length > 0 ? (\n <Block titleKey=\"anamnesis.section.dietary\" t={t}>\n <NumericBlock\n stripKeys={stripKeys}\n defs={dietaryDefs}\n visit={latest}\n previous={previous}\n targets={targets}\n t={t}\n onChange={onNumericChange}\n onTargetChange={setTarget}\n />\n </Block>\n ) : null}\n\n {/* Pathologies — many-to-many coded multi-select */}\n <Block titleKey=\"anamnesis.section.pathologies\" t={t}>\n <FormField\n label={t('anamnesis.compile.pathologiesLabel')}\n description={t('anamnesis.compile.pathologiesHelp')}\n >\n <MultiSelect\n options={pathologyOptions}\n value={latest.pathologyCodes}\n allowClear\n placeholder={t(\n 'anamnesis.compile.pathologiesPlaceholder',\n )}\n onChange={setPathologies}\n />\n </FormField>\n </Block>\n\n {/* Oncological history */}\n <Block\n titleKey=\"anamnesis.section.oncological\"\n t={t}\n open={occasionalOpen.oncological}\n onOpenChange={setBlockOpen('oncological')}\n fill={density.oncological.fill}\n >\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n <FormField label={t('anamnesis.field.tumourType.label')}>\n <StateBackedTextInput\n value={latestOncological.tumourType ?? ''}\n onChange={(e) =>\n patchLatest((v) => ({\n ...v,\n oncological: {\n ...v.oncological,\n tumourType: e.target.value,\n },\n }))\n }\n />\n </FormField>\n <FormField label={t('anamnesis.field.stage.label')}>\n <StateBackedTextInput\n value={latestOncological.stage ?? ''}\n onChange={(e) =>\n patchLatest((v) => ({\n ...v,\n oncological: {\n ...v.oncological,\n stage: e.target.value,\n },\n }))\n }\n />\n </FormField>\n <RadioGroup\n label={t('anamnesis.field.metastases.label')}\n variant=\"horizontal\"\n value={latestOncological.metastases?.present ?? 'unknown'}\n onValueChange={(next) =>\n patchLatest((v) => ({\n ...v,\n oncological: {\n ...v.oncological,\n metastases: {\n present: next as YesNo,\n site: v.oncological?.metastases?.site,\n },\n },\n }))\n }\n >\n <Radio value=\"yes\" label={t('anamnesis.common.yes')} />\n <Radio value=\"no\" label={t('anamnesis.common.no')} />\n <Radio\n value=\"unknown\"\n label={t('anamnesis.common.notSure')}\n />\n </RadioGroup>\n <FormField\n label={t('anamnesis.field.treatmentStatus.label')}\n >\n <StateBackedTextInput\n value={latestOncological.treatmentStatus ?? ''}\n onChange={(e) =>\n patchLatest((v) => ({\n ...v,\n oncological: {\n ...v.oncological,\n treatmentStatus: e.target.value,\n },\n }))\n }\n />\n </FormField>\n </div>\n </Block>\n\n {/* Therapy & supplements */}\n <Block titleKey=\"anamnesis.section.therapy\" t={t}>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {latest.therapy.length === 0 ? (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.compile.noTherapy')}\n </p>\n ) : (\n latest.therapy.map((entry) => (\n <div\n key={entry.id}\n className=\"ds:flex ds:flex-wrap ds:items-end ds:gap-[var(--spacing-sm)]\"\n >\n <div className=\"ds:grow\">\n <FormField\n label={t('anamnesis.field.medName.label')}\n >\n <StateBackedTextInput\n value={entry.name}\n onChange={(e) =>\n updateTherapy(entry.id, {\n name: e.target.value,\n })\n }\n />\n </FormField>\n </div>\n <FormField label={t('anamnesis.field.medDose.label')}>\n <StateBackedTextInput\n value={entry.dose ?? ''}\n onChange={(e) =>\n updateTherapy(entry.id, {\n dose: e.target.value,\n })\n }\n />\n </FormField>\n <Badge\n variant={\n entry.kind === 'medication' ? 'info' : 'neutral'\n }\n size=\"md\"\n >\n {t(`anamnesis.medKind.${entry.kind}`)}\n </Badge>\n <IconButton\n icon={<Trash2 aria-hidden=\"true\" />}\n intent=\"ghost\"\n aria-label={t('anamnesis.compile.removeTherapy', {\n name: entry.name,\n })}\n onClick={() => removeTherapy(entry.id)}\n />\n </div>\n ))\n )}\n <div>\n <Button\n intent=\"outline\"\n size=\"sm\"\n startIcon={<Plus aria-hidden=\"true\" />}\n onClick={addTherapy}\n >\n {t('anamnesis.compile.addTherapy')}\n </Button>\n </div>\n </div>\n </Block>\n\n {/* Blood tests */}\n <Block\n titleKey=\"anamnesis.section.labs\"\n t={t}\n open={occasionalOpen.labs}\n onOpenChange={setBlockOpen('labs')}\n fill={density.labs.fill}\n flagged={density.labs.flagged}\n >\n {/* Same target seam as the other blocks: a seeded blood test\n carries a reference range and no flag, so it still gets\n no editor; one a practice flagged as targetable does. */}\n <NumericBlock\n stripKeys={stripKeys}\n defs={labDefs}\n visit={latest}\n previous={previous}\n targets={targets}\n t={t}\n onChange={onNumericChange}\n onTargetChange={setTarget}\n />\n </Block>\n\n {/* Fasting-mimicking programme cycles */}\n <Block\n titleKey=\"anamnesis.section.fmd\"\n t={t}\n open={occasionalOpen.fmd}\n onOpenChange={setBlockOpen('fmd')}\n fill={density.fmd.fill}\n >\n {latest.fmdCycles.length === 0 ? (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.compile.noFmd')}\n </p>\n ) : (\n <ul className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-0\">\n {latest.fmdCycles.map((cycle) => (\n <li\n key={cycle.cycleNumber}\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\"\n >\n <span className=\"type-label ds:text-[color:var(--foreground)]\">\n {t('anamnesis.compile.cycleNumber', {\n number: cycle.cycleNumber,\n })}\n </span>\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n <Timestamp\n value={cycle.startDateIso}\n format=\"absolute\"\n shape=\"bare\"\n absoluteFormat={CALENDAR_DATE_FORMAT}\n />\n </span>\n <Badge\n variant={cycle.completed ? 'success' : 'warning'}\n size=\"sm\"\n withDot\n >\n {cycle.completed\n ? t('anamnesis.compile.cycleCompleted')\n : t('anamnesis.compile.cycleInProgress')}\n </Badge>\n </li>\n ))}\n </ul>\n )}\n </Block>\n\n {/* Nutritional proposal + clinical notes */}\n <Block titleKey=\"anamnesis.section.proposal\" t={t}>\n <FormField\n label={t('anamnesis.field.nutritionalProposal.label')}\n >\n <TextArea\n value={latest.nutritionalProposal ?? ''}\n autoResize\n minRows={2}\n onChange={(e) =>\n patchLatest((v) => ({\n ...v,\n nutritionalProposal: e.target.value,\n }))\n }\n />\n </FormField>\n <FormField label={t('anamnesis.field.clinicalNotes.label')}>\n <TextArea\n value={latest.clinicalNotes ?? ''}\n autoResize\n minRows={2}\n onChange={(e) =>\n patchLatest((v) => ({\n ...v,\n clinicalNotes: e.target.value,\n }))\n }\n />\n </FormField>\n </Block>\n\n {/* Annual programme */}\n <Block\n titleKey=\"anamnesis.section.annual\"\n t={t}\n open={occasionalOpen.annual}\n onOpenChange={setBlockOpen('annual')}\n fill={density.annual.fill}\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <RadioGroup\n label={t('anamnesis.field.annualProposed.label')}\n variant=\"horizontal\"\n value={latestAnnual.proposed ? 'yes' : 'no'}\n onValueChange={(next) =>\n patchLatest((v) => ({\n ...v,\n annualProgramme: {\n proposed: next === 'yes',\n accepted: v.annualProgramme?.accepted ?? false,\n declineReason: v.annualProgramme?.declineReason,\n },\n }))\n }\n >\n <Radio value=\"yes\" label={t('anamnesis.common.yes')} />\n <Radio value=\"no\" label={t('anamnesis.common.no')} />\n </RadioGroup>\n <RadioGroup\n label={t('anamnesis.field.annualAccepted.label')}\n variant=\"horizontal\"\n value={latestAnnual.accepted ? 'yes' : 'no'}\n onValueChange={(next) =>\n patchLatest((v) => ({\n ...v,\n annualProgramme: {\n proposed: v.annualProgramme?.proposed ?? false,\n accepted: next === 'yes',\n declineReason: v.annualProgramme?.declineReason,\n },\n }))\n }\n >\n <Radio value=\"yes\" label={t('anamnesis.common.yes')} />\n <Radio value=\"no\" label={t('anamnesis.common.no')} />\n </RadioGroup>\n {!latestAnnual.accepted ? (\n <FormField\n label={t('anamnesis.field.annualDeclineReason.label')}\n >\n <TextArea\n value={latestAnnual.declineReason ?? ''}\n autoResize\n minRows={2}\n onChange={(e) =>\n patchLatest((v) => ({\n ...v,\n annualProgramme: {\n proposed: v.annualProgramme?.proposed ?? false,\n accepted: v.annualProgramme?.accepted ?? false,\n declineReason: e.target.value,\n },\n }))\n }\n />\n </FormField>\n ) : null}\n </div>\n </Block>\n </div>\n </Tabs.Content>\n\n {/* -------------------- Evolution view -------------------- */}\n <Tabs.Content value=\"evolution\">\n <div className=\"ds:pt-[var(--spacing-md)]\">\n <Block titleKey=\"anamnesis.section.evolution\" t={t}>\n <AnamnesisEvolution\n record={record}\n t={t}\n editable\n config={config}\n framed={false}\n onCellChange={onGridCellChange}\n onVisitSelectionChange={trackShownVisits}\n onOpenNote={onOpenNote}\n partitionBySource={partitionBySource}\n />\n </Block>\n </div>\n </Tabs.Content>\n </Tabs>\n </Card.Body>\n </Card>\n </>\n );\n\n return <CompileShell embedded={embedded}>{inner}</CompileShell>;\n}\n\n/** The surface's page chrome, shared by the record and its empty state. */\nfunction CompileShell({\n embedded,\n children,\n}: {\n embedded: boolean;\n children: React.ReactNode;\n}) {\n if (embedded) {\n return (\n <div className=\"ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-lg)]\">\n {children}\n </div>\n );\n }\n return (\n <div className=\"ds:min-h-[100dvh] ds:w-full ds:bg-[color:var(--app-shell-background)] ds:py-[var(--spacing-lg)]\">\n <div className=\"ds:mx-auto ds:flex ds:w-full ds:max-w-[76rem] ds:flex-col ds:gap-[var(--spacing-lg)] ds:px-[var(--spacing-md)]\">\n {children}\n </div>\n </div>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — intake mode (patient-facing) */\n/* */\n/* The pre-visit questionnaire the patient completes themselves via a */\n/* link. Only patient-answerable questions (no labs, no clinician-only */\n/* measurements). A read-only visit header, an overall progress bar, free */\n/* in-page section navigation via a disclosure Accordion (any section */\n/* reachable at any time), and sex-conditional fields. Answers live in */\n/* memory and are recorded on submit — there is no draft save. */\n/* -------------------------------------------------------------------- */\n\nimport { useEffect, useMemo, useState } from 'react';\nimport type { TFunction } from 'i18next';\nimport { SendHorizontal } from 'lucide-react';\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from '../../components/accordion';\nimport { Button } from '../../components/button';\nimport { Card } from '../../components/card';\nimport { DescriptionList } from '../../components/description-list';\nimport { EmptyState } from '../../components/empty-state';\nimport { Progress } from '../../components/progress';\nimport { Timestamp } from '../../components/timestamp';\nimport {\n configuredSections,\n type PracticeAnamnesisConfig,\n} from './anamnesis-config';\nimport {\n CALENDAR_DATE_FORMAT,\n calendarFormatFor,\n latestVisit,\n} from './anamnesis-derive';\nimport {\n AnamnesisMissingAnswers,\n missingMandatoryAnswers,\n useFieldJump,\n type MissingAnswer,\n} from './anamnesis-digest';\nimport { AnamnesisField } from './anamnesis-field';\nimport {\n fieldVisible,\n isIntakeAnswered,\n patientAgeLabel,\n sectionLabel,\n} from './anamnesis-format';\nimport type {\n AnamnesisRecord,\n IntakeAnswer,\n IntakeFieldDef,\n IntakeFieldType,\n IntakeSectionDef,\n} from './anamnesis-types';\n\n/* ------------------------------- Helpers -------------------------------- */\n\n/** Field types whose control is intrinsically compact — a number, a select,\n * a times-per-week count or a yes/no row. A free-text detail no longer\n * disqualifies one: a field earns the whole row only once that detail is\n * actually on screen (see `spansRow`), not for being able to have one. */\nconst SHORT_FIELD_TYPES: ReadonlySet<IntakeFieldType> = new Set([\n 'number',\n 'choice',\n 'frequency',\n 'yesNoDetail',\n]);\n\nfunction isShortField(field: IntakeFieldDef): boolean {\n return SHORT_FIELD_TYPES.has(field.type);\n}\n\n/** A section made only of short fields reads like a lab form, so on a wide\n * card it runs up to four across; one holding any prose field runs two, which\n * is what a mixed section can fill. A single capped column left half the row\n * empty and was rejected on review. */\nexport function isLabGridSection(section: IntakeSectionDef): boolean {\n return section.fields.length > 0 && section.fields.every(isShortField);\n}\n\n/** A `text` field the practice marked long-form takes the row like prose. */\nfunction isLongFormText(field: IntakeFieldDef) {\n return field.type === 'text' && field.longForm === true;\n}\n\n/** Which questions need the whole row rather than one cell. A detail box is\n * live: the field takes the row the moment that box appears, and the\n * questions after it shuffle by a cell. Deliberately unanimated — a form\n * reflowing under the reader's cursor should be instant, not a transition. */\n/** A field that CAN reveal a details box owns its row from the start, answered\n * or not: reserving the space is what keeps the section still — letting it\n * claim the row on answer shuffled every question after it under the cursor. */\nfunction spansRow(field: IntakeFieldDef): boolean {\n if (field.type === 'textarea') return true;\n if (isLongFormText(field)) return true;\n return field.detail === true && DETAILED_FIELD_TYPES.has(field.type);\n}\n\n/** The types whose `detail: true` renders a details box — see\n * `isDetailVisible`, which decides whether it is on screen YET. */\nconst DETAILED_FIELD_TYPES: ReadonlySet<IntakeFieldType> = new Set([\n 'yesNoDetail',\n 'frequency',\n 'choice',\n]);\n\n/** The card is the container the sections size against. The thresholds are px\n * because a container query's `rem` follows the HOST root font-size, so a rem\n * threshold would move on a non-16px root. */\nconst SECTION_FIELDS_GRID =\n 'ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-lg)] ds:@[640px]/intake:grid-cols-2 ds:@[960px]/intake:grid-cols-3 ds:@[1280px]/intake:grid-cols-4';\nconst SECTION_FIELDS_MIXED =\n 'ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-lg)] ds:@[640px]/intake:grid-cols-2';\n/** Whole-row placement. In a one-column grid it is already the whole row, so\n * it needs no breakpoint of its own. */\nconst FIELD_SPANS_ROW = 'ds:col-span-full';\n\n/** Field key → answer. Exported so hosts can type the `onSubmit` seam. */\nexport type IntakeAnswerMap = Partial<Record<string, IntakeAnswer>>;\ntype AnswerMap = IntakeAnswerMap;\n\nfunction seedAnswers(record: AnamnesisRecord): AnswerMap {\n const out: AnswerMap = {};\n const source = record.intake?.answers ?? {};\n for (const [key, sourced] of Object.entries(source)) {\n if (sourced) out[key] = sourced.value;\n }\n return out;\n}\n\n/* -------------------------------- Props --------------------------------- */\n\nexport interface AnamnesisIntakeProps {\n record: AnamnesisRecord;\n t: TFunction;\n /** Mount flush inside a host section tab (drops the full-page chrome + own\n * page title). */\n embedded?: boolean;\n /** The practice's configured questionnaire. Omitted = the kit-seeded form. */\n config?: PracticeAnamnesisConfig;\n /** Demo/story hook: which section is open on mount. Defaults to the first. */\n defaultOpenSection?: string;\n /** The questionnaire was submitted: receives the full answer map. The\n * surface keeps its own draft state either way — this is the seam a\n * platform host persists through (mirrors `onTargetChange`). */\n onSubmit?: (answers: IntakeAnswerMap) => void;\n /** Open the section containing this field key and move focus to it on\n * mount — the landing half of a host-routed missing-answer jump. */\n jumpToField?: string;\n /** Render the answers without letting them be changed, and drop the footer\n * action. The state an ALREADY-COMPILED questionnaire arrives in: a reader\n * should be able to tell at a glance that this has been answered, and has\n * to ask before overwriting the patient's own words. */\n readOnly?: boolean;\n}\n\n/* ------------------------------- Component ------------------------------ */\n\nexport function AnamnesisIntake({\n record,\n t,\n embedded = false,\n config,\n defaultOpenSection,\n onSubmit,\n jumpToField,\n readOnly = false,\n}: AnamnesisIntakeProps) {\n const { patient } = record;\n // A questionnaire can be sent before any visit exists, so the header rows it\n // would date are rendered only when there is a visit to date them against.\n // The reference is the record's, not this surface's: reading `visits[0]` here\n // dated the header to the FIRST visit and aged the patient years behind the\n // same patient's compile screen.\n const referenceVisit = latestVisit(record);\n const [answers, setAnswers] = useState<AnswerMap>(() => seedAnswers(record));\n\n const [submitted, setSubmitted] = useState(\n () => record.intake?.submittedAtIso != null,\n );\n\n const onFieldChange = (key: string, answer: IntakeAnswer) => {\n setAnswers((prev) => ({ ...prev, [key]: answer }));\n };\n\n // CAPTURE surface: archived questions are not asked again.\n const visibleSections = useMemo(\n () =>\n configuredSections(config)\n .map((section) => ({\n ...section,\n fields: section.fields.filter((f) => fieldVisible(f, patient.sex)),\n }))\n .filter((section) => section.fields.length > 0),\n [config, patient.sex],\n );\n\n // Free navigation stays the default, but the missing-answer jump has to be\n // able to open a section, so the disclosure is controlled. Every section\n // opens on arrival; a section folds itself once every one of its questions\n // is answered AND the reader moves on (see collapseIfComplete) — a finished\n // section left open is noise, one folded under the cursor is a trap.\n const sectionsToOpen = (): string[] =>\n visibleSections.map((section) => section.key);\n const collapseIfComplete = (\n section: IntakeSectionDef,\n event: React.FocusEvent<HTMLDivElement>,\n ) => {\n // Only a move to ANOTHER part of the questionnaire folds it — leaving\n // the page, switching tabs or opening a menu is not \"moving on\".\n const next = event.relatedTarget;\n if (!(next instanceof Node)) return;\n if (event.currentTarget.contains(next)) return;\n if (!containerRef.current?.contains(next)) return;\n // The section the host jumped the reader to stays open on its own.\n if (section.key === defaultOpenSection) return;\n const complete = section.fields.every((field) =>\n isIntakeAnswered(answers[field.key]),\n );\n if (!complete) return;\n setOpenSections((prev) => prev.filter((key) => key !== section.key));\n };\n const [openSections, setOpenSections] = useState<string[]>(() =>\n sectionsToOpen(),\n );\n const openSectionKey = (key: string) =>\n setOpenSections((prev) => (prev.includes(key) ? prev : [...prev, key]));\n\n // Re-seed when the host swaps the QUESTIONNAIRE — `record.intake` — and\n // only then. Without any re-seed, a host that refreshes in place keeps\n // showing the PREVIOUS questionnaire's answers, and a freshly created\n // interview arrives already full. But keying it on the whole record threw\n // the reader's unsaved answers away every time the host re-read anything\n // else about the record — moving the visit's date, deleting another\n // interview from the archive — because the record object was new even\n // though the questionnaire was not. A host that keeps `intake`\n // referentially stable while its answers are unchanged keeps the draft.\n const [seededFrom, setSeededFrom] = useState(record.intake);\n if (record.intake !== seededFrom) {\n setSeededFrom(record.intake);\n const seeded = seedAnswers(record);\n setAnswers(seeded);\n setOpenSections(sectionsToOpen());\n }\n const { containerRef, requestJump } = useFieldJump();\n\n const missing = useMemo(\n () =>\n missingMandatoryAnswers(\n visibleSections,\n (key) => answers[key],\n patient.sex,\n t,\n ),\n [visibleSections, answers, patient.sex, t],\n );\n\n const jumpToMissing = (target: MissingAnswer) => {\n openSectionKey(target.sectionKey);\n requestJump(target.key);\n };\n\n // Host-routed landing: open the section holding `jumpToField` and focus\n // it once per target — the arrival half of onMissingAnswerJump.\n useEffect(() => {\n if (!jumpToField) return;\n const holder = visibleSections.find((section) =>\n section.fields.some((field) => field.key === jumpToField),\n );\n if (!holder) return;\n openSectionKey(holder.key);\n requestJump(jumpToField);\n // visibleSections is stable for a mounted surface; re-running on target\n // change only is deliberate.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [jumpToField]);\n\n const { answeredCount, totalCount } = useMemo(() => {\n let answered = 0;\n let total = 0;\n for (const section of visibleSections) {\n for (const field of section.fields) {\n total += 1;\n if (isIntakeAnswered(answers[field.key])) answered += 1;\n }\n }\n return { answeredCount: answered, totalCount: total };\n }, [visibleSections, answers]);\n\n const percentComplete =\n totalCount === 0 ? 0 : Math.round((answeredCount / totalCount) * 100);\n const progressCaption = t('anamnesis.intake.answered', {\n answered: answeredCount,\n total: totalCount,\n });\n const showMissing = missing.length > 0 && (answeredCount > 0 || submitted);\n\n const inner = (\n <>\n {/* Questionnaire title. Dropped when embedded — the host section tab\n already labels it, and the patient's identity is set by context. */}\n {embedded ? null : (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <h1 className=\"type-title-page ds:m-0 ds:text-[color:var(--foreground)]\">\n {t('anamnesis.intake.title')}\n </h1>\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.intake.subtitle')}\n </p>\n </div>\n )}\n\n {/* Read-only patient + visit header — standalone only. The patient\n self-completes via a link, so surface who the questionnaire is for.\n Dropped when embedded: the host already shows a patient banner. */}\n {embedded ? null : (\n <DescriptionList layout=\"inline\" labelWidth=\"fixed\" divider=\"between\">\n <DescriptionList.Row>\n <DescriptionList.Term>\n {t('anamnesis.header.name')}\n </DescriptionList.Term>\n <DescriptionList.Detail>\n {patient.firstName} {patient.lastName}\n </DescriptionList.Detail>\n </DescriptionList.Row>\n {referenceVisit ? (\n <DescriptionList.Row>\n <DescriptionList.Term>\n {t('anamnesis.header.age')}\n </DescriptionList.Term>\n <DescriptionList.Detail>\n {patientAgeLabel(record, t)}\n </DescriptionList.Detail>\n </DescriptionList.Row>\n ) : null}\n <DescriptionList.Row>\n <DescriptionList.Term>\n {t('anamnesis.header.dob')}\n </DescriptionList.Term>\n <DescriptionList.Detail>\n <Timestamp\n value={patient.dateOfBirthIso}\n format=\"absolute\"\n shape=\"bare\"\n absoluteFormat={CALENDAR_DATE_FORMAT}\n />\n </DescriptionList.Detail>\n </DescriptionList.Row>\n {referenceVisit ? (\n <DescriptionList.Row>\n <DescriptionList.Term>\n {t('anamnesis.header.visitDate')}\n </DescriptionList.Term>\n <DescriptionList.Detail>\n <Timestamp\n value={referenceVisit.dateIso}\n format=\"absolute\"\n shape=\"bare\"\n // A visit is an interview with a time now: the header must\n // say 15:27 when the record does, and must not UTC-pin a\n // local timestamp (the date-only DOB above keeps the pin).\n absoluteFormat={calendarFormatFor(referenceVisit.dateIso)}\n />\n </DescriptionList.Detail>\n </DescriptionList.Row>\n ) : null}\n </DescriptionList>\n )}\n\n {/* Progress indication */}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <Progress value={percentComplete} ariaLabel={progressCaption} />\n <p\n className=\"type-meta ds:m-0 ds:text-[color:var(--muted-foreground)]\"\n aria-live=\"polite\"\n >\n {progressCaption}\n </p>\n </div>\n\n {/* Missing required answers. Held back until the patient has actually\n started, so a pristine form is never met with a list of failures. */}\n {showMissing ? (\n <AnamnesisMissingAnswers\n missing={missing}\n t={t}\n onJump={jumpToMissing}\n // `missing` recomputes on every answer, so a live region would\n // re-read the whole list per keystroke. The alert sits directly\n // above the form in document order and carries its own jump button.\n announce=\"off\"\n />\n ) : null}\n\n {/* Section navigation + fields — free disclosure navigation, on a white\n card so the questions read clearly against the app-shell background. */}\n <Card variant=\"elevated\">\n <Card.Body ref={containerRef} className=\"ds:@container/intake\">\n <section\n aria-label={t('anamnesis.intake.sectionsLabel')}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n <h2 className=\"type-title-section ds:m-0 ds:text-[color:var(--foreground)]\">\n {t('anamnesis.intake.sectionsLabel')}\n </h2>\n {visibleSections.length === 0 ? (\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={t('anamnesis.empty.noQuestions.title')}\n description={t('anamnesis.empty.noQuestions.description')}\n />\n ) : (\n <Accordion\n type=\"multiple\"\n variant=\"default\"\n value={openSections}\n onValueChange={setOpenSections}\n >\n {visibleSections.map((section) => {\n const sectionAnswered = section.fields.filter((f) =>\n isIntakeAnswered(answers[f.key]),\n ).length;\n const allShort = isLabGridSection(section);\n return (\n <AccordionItem\n key={section.key}\n value={section.key}\n onBlur={(event) => collapseIfComplete(section, event)}\n >\n <AccordionTrigger>\n <span className=\"ds:flex ds:w-full ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <span>{sectionLabel(section, t)}</span>\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.intake.sectionProgress', {\n answered: sectionAnswered,\n total: section.fields.length,\n })}\n </span>\n </span>\n </AccordionTrigger>\n <AccordionContent>\n {/* Mobile is untouched either way: both layouts are\n one column until the card is wide enough to take\n a second. */}\n <div\n data-testid={`anamnesis-intake-section-${section.key}-fields`}\n data-layout={allShort ? 'short' : 'mixed'}\n className={\n allShort\n ? SECTION_FIELDS_GRID\n : SECTION_FIELDS_MIXED\n }\n >\n {section.fields.map((field) => (\n <AnamnesisField\n readOnly={readOnly}\n key={field.key}\n def={field}\n answer={answers[field.key]}\n // Only an all-short section can reach three or\n // more columns; the words then drop AT that\n // threshold, by container query, not here.\n className={\n spansRow(field) ? FIELD_SPANS_ROW : undefined\n }\n onChange={(answer) =>\n onFieldChange(field.key, answer)\n }\n t={t}\n />\n ))}\n </div>\n </AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordion>\n )}\n </section>\n </Card.Body>\n </Card>\n\n {/* Footer actions — submit only; the product has no draft save.\n Absent while read-only: there is nothing to save until the\n reader asks to edit. */}\n {readOnly ? null : (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <p\n className=\"type-meta ds:m-0 ds:text-[color:var(--muted-foreground)]\"\n aria-live=\"polite\"\n >\n {submitted\n ? t('anamnesis.intake.submittedNotice')\n : t('anamnesis.intake.unsentNotice')}\n </p>\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Button\n intent=\"primary\"\n startIcon={<SendHorizontal aria-hidden=\"true\" />}\n data-testid=\"anamnesis-intake-submit\"\n onClick={() => {\n setSubmitted(true);\n onSubmit?.(answers);\n }}\n >\n {t('anamnesis.intake.submit')}\n </Button>\n </div>\n </div>\n )}\n </>\n );\n\n if (embedded) {\n return (\n <div className=\"ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-lg)]\">\n {inner}\n </div>\n );\n }\n return (\n <div className=\"ds:min-h-[100dvh] ds:w-full ds:bg-[color:var(--app-shell-background)] ds:py-[var(--spacing-xl)]\">\n <div className=\"ds:mx-auto ds:flex ds:w-full ds:max-w-[48rem] ds:flex-col ds:gap-[var(--spacing-lg)] ds:px-[var(--spacing-md)]\">\n {inner}\n </div>\n </div>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — read-only mode (care plan section) */\n/* */\n/* The same record rendered with ZERO edit affordances: a definition-list */\n/* presentation (dt/dd values, not greyed-out form fields), read-only */\n/* badges for pathologies and statuses, and the evolution section with */\n/* editing turned off so trends, ticking visits and a file of the view stay */\n/* available. Not a screenshot of compile mode with disabled inputs — a */\n/* genuine read presentation. */\n/* -------------------------------------------------------------------- */\n\nimport type { TFunction } from 'i18next';\nimport { Badge } from '../../components/badge';\nimport { Card } from '../../components/card';\nimport { DescriptionList } from '../../components/description-list';\nimport { EmptyState } from '../../components/empty-state';\nimport { Timestamp } from '../../components/timestamp';\nimport {\n allParametersIncludingArchived,\n allSectionsIncludingArchived,\n pathologyLookup,\n type PracticeAnamnesisConfig,\n} from './anamnesis-config';\nimport {\n calendarFormatFor,\n deltaInfo,\n formatValue,\n outOfRange,\n parameterValueAt,\n} from './anamnesis-derive';\nimport { AnamnesisEvolution, useShownVisitIds } from './anamnesis-evolution';\nimport { AnamnesisExportMenu } from './anamnesis-export-menu';\nimport {\n localeOf,\n parameterLabel,\n pathologyCodeWithLabel,\n patientAgeLabel,\n} from './anamnesis-format';\nimport { DeltaIndicator, OutOfRangeBadge } from './anamnesis-indicators';\nimport { AnamnesisAnswerList } from './anamnesis-summary';\nimport type {\n AnamnesisRecord,\n NumericParameterDef,\n OpenAnamnesisNote,\n Visit,\n} from './anamnesis-types';\n\n/* ------------------------------- Helpers -------------------------------- */\n\nfunction Block({\n titleKey,\n t,\n children,\n}: {\n titleKey: string;\n t: TFunction;\n children: React.ReactNode;\n}) {\n // A plain titled section. The read-only surface wraps every section in a\n // single elevated Card (like the intake and compile surfaces), so each section\n // sits ON that card rather than being its own card — no stack of separate cards\n // floating on the app-shell background.\n return (\n <section className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <h2 className=\"type-title-section ds:m-0 ds:text-[color:var(--foreground)]\">\n {t(titleKey)}\n </h2>\n {children}\n </section>\n );\n}\n\n/* ------------------------- Read-only numeric list ----------------------- */\n\nfunction ReadOnlyNumericList({\n defs,\n visit,\n previous,\n targets,\n t,\n}: {\n defs: NumericParameterDef[];\n visit: Visit;\n previous?: Visit;\n targets: Map<string, number>;\n t: TFunction;\n}) {\n const locale = localeOf(t);\n return (\n <DescriptionList layout=\"inline\" labelWidth=\"fixed\" divider=\"between\">\n {defs.map((def) => {\n const value = parameterValueAt(visit, def);\n const prevValue = previous ? parameterValueAt(previous, def) : null;\n const delta = previous ? deltaInfo(value, prevValue, def) : null;\n const flag = outOfRange(value, def.referenceRange);\n const target = targets.get(def.key) ?? null;\n return (\n <DescriptionList.Row key={def.key}>\n <DescriptionList.Term>\n {parameterLabel(def, t)}\n {def.unit ? ` (${def.unit})` : ''}\n </DescriptionList.Term>\n <DescriptionList.Detail>\n <span className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)] ds:tabular-nums\">\n <span className=\"ds:text-[color:var(--foreground)]\">\n {formatValue(value, def.precision, locale)}\n </span>\n {flag ? <OutOfRangeBadge flag={flag} t={t} /> : null}\n <DeltaIndicator delta={delta} def={def} t={t} />\n {target != null ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.grid.target', {\n value: formatValue(target, def.precision, locale),\n unit: def.unit ?? '',\n })}\n </span>\n ) : null}\n </span>\n </DescriptionList.Detail>\n </DescriptionList.Row>\n );\n })}\n </DescriptionList>\n );\n}\n\n/* -------------------------------- Props --------------------------------- */\n\nexport interface AnamnesisReadOnlyProps {\n record: AnamnesisRecord;\n t: TFunction;\n /** Mount flush inside a host section tab (drops the full-page chrome + the\n * patient-name page heading). */\n embedded?: boolean;\n /** The practice's configured vocabulary. Omitted = the kit-seeded default. */\n config?: PracticeAnamnesisConfig;\n /** The host's side panel, forwarded to the Evolution block. Omitted = the\n * evolution surface reads notes in place. */\n onOpenNote?: OpenAnamnesisNote;\n /** Draw the evolution block as one table per anamnesis type (visits\n * grouped by `sourceLabel`). Default false: one grid over every visit. */\n partitionBySource?: boolean;\n}\n\n/* ------------------------------- Component ------------------------------ */\n\nexport function AnamnesisReadOnly({\n record,\n t,\n embedded = false,\n config,\n onOpenNote,\n partitionBySource = false,\n}: AnamnesisReadOnlyProps) {\n const { patient, visits } = record;\n const latest: Visit | undefined = visits[visits.length - 1];\n const previous = visits.length > 1 ? visits[visits.length - 2] : undefined;\n const targets = new Map(\n record.targets.map((x) => [x.parameterKey, x.target] as const),\n );\n // Every list here is HISTORY: archived descriptors stay, so a value recorded\n // under one still renders.\n const anthroDefs = allParametersIncludingArchived(config, 'anthropometric');\n const dietaryDefs = allParametersIncludingArchived(config, 'dietary');\n const labDefs = allParametersIncludingArchived(config, 'lab');\n const historySections = allSectionsIncludingArchived(config);\n const pathologies = pathologyLookup(config);\n // Before the early return: the trend's export control files the columns on\n // screen, and a hook after a conditional return would break the hook order.\n const [shownVisitIds, trackShownVisits] = useShownVisitIds();\n\n // Nothing recorded yet: a deliberate empty state, not a card of em dashes.\n if (!latest) {\n return (\n <ReadOnlyShell embedded={embedded}>\n <Card variant=\"elevated\">\n <Card.Body>\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={t('anamnesis.empty.noRecord.title')}\n description={t('anamnesis.empty.noRecord.description')}\n />\n </Card.Body>\n </Card>\n </ReadOnlyShell>\n );\n }\n\n const oncological = latest.oncological;\n const annual = latest.annualProgramme;\n\n const inner = (\n <>\n {/* Header — dropped when embedded (the host shows the patient banner). */}\n {embedded ? null : (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <h1 className=\"type-title-page ds:m-0 ds:text-[color:var(--foreground)]\">\n {patient.firstName} {patient.lastName}\n </h1>\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.readOnly.subtitle')}\n </p>\n </div>\n )}\n\n {/* One elevated Card holds every section, so the read-only surface reads\n as a contained record (matching the intake and compile surfaces)\n rather than a stack of section cards floating on the app-shell\n background. */}\n <Card variant=\"elevated\">\n <Card.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]\">\n {/* Patient + visit meta */}\n <Block titleKey=\"anamnesis.readOnly.summary\" t={t}>\n <DescriptionList\n layout=\"inline\"\n labelWidth=\"fixed\"\n divider=\"between\"\n >\n <DescriptionList.Row>\n <DescriptionList.Term>\n {t('anamnesis.header.name')}\n </DescriptionList.Term>\n <DescriptionList.Detail>\n {patient.firstName} {patient.lastName}\n </DescriptionList.Detail>\n </DescriptionList.Row>\n <DescriptionList.Row>\n <DescriptionList.Term>\n {t('anamnesis.header.age')}\n </DescriptionList.Term>\n <DescriptionList.Detail>\n {patientAgeLabel(record, t)}\n </DescriptionList.Detail>\n </DescriptionList.Row>\n <DescriptionList.Row>\n <DescriptionList.Term>\n {t('anamnesis.header.visitDate')}\n </DescriptionList.Term>\n <DescriptionList.Detail>\n <Timestamp\n value={latest.dateIso}\n format=\"absolute\"\n shape=\"bare\"\n absoluteFormat={calendarFormatFor(latest.dateIso)}\n />\n </DescriptionList.Detail>\n </DescriptionList.Row>\n {latest.practitioner ? (\n <DescriptionList.Row>\n <DescriptionList.Term>\n {t('anamnesis.field.practitioner.label')}\n </DescriptionList.Term>\n <DescriptionList.Detail>\n {latest.practitioner}\n </DescriptionList.Detail>\n </DescriptionList.Row>\n ) : null}\n </DescriptionList>\n </Block>\n\n {/* Anthropometrics */}\n <Block titleKey=\"anamnesis.section.anthropometrics\" t={t}>\n <ReadOnlyNumericList\n defs={anthroDefs}\n visit={latest}\n previous={previous}\n targets={targets}\n t={t}\n />\n </Block>\n\n {/* Dietary intake */}\n {dietaryDefs.length > 0 ? (\n <Block titleKey=\"anamnesis.section.dietary\" t={t}>\n <ReadOnlyNumericList\n defs={dietaryDefs}\n visit={latest}\n previous={previous}\n targets={targets}\n t={t}\n />\n </Block>\n ) : null}\n\n {/* Pathologies */}\n <Block titleKey=\"anamnesis.section.pathologies\" t={t}>\n {latest.pathologyCodes.length > 0 ? (\n <div className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-xs)]\">\n {latest.pathologyCodes.map((code) => (\n <Badge key={code} variant=\"neutral\" size=\"md\">\n {pathologyCodeWithLabel(code, t, pathologies[code])}\n </Badge>\n ))}\n </div>\n ) : (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.readOnly.none')}\n </p>\n )}\n </Block>\n\n {/* Oncological history */}\n {oncological ? (\n <Block titleKey=\"anamnesis.section.oncological\" t={t}>\n <DescriptionList\n layout=\"inline\"\n labelWidth=\"fixed\"\n divider=\"between\"\n >\n {oncological.tumourType ? (\n <DescriptionList.Row>\n <DescriptionList.Term>\n {t('anamnesis.field.tumourType.label')}\n </DescriptionList.Term>\n <DescriptionList.Detail>\n {oncological.tumourType}\n </DescriptionList.Detail>\n </DescriptionList.Row>\n ) : null}\n {oncological.stage ? (\n <DescriptionList.Row>\n <DescriptionList.Term>\n {t('anamnesis.field.stage.label')}\n </DescriptionList.Term>\n <DescriptionList.Detail>\n {oncological.stage}\n </DescriptionList.Detail>\n </DescriptionList.Row>\n ) : null}\n {oncological.treatmentStatus ? (\n <DescriptionList.Row>\n <DescriptionList.Term>\n {t('anamnesis.field.treatmentStatus.label')}\n </DescriptionList.Term>\n <DescriptionList.Detail>\n {oncological.treatmentStatus}\n </DescriptionList.Detail>\n </DescriptionList.Row>\n ) : null}\n </DescriptionList>\n </Block>\n ) : null}\n\n {/* Therapy & supplements */}\n <Block titleKey=\"anamnesis.section.therapy\" t={t}>\n {latest.therapy.length > 0 ? (\n <ul className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-0\">\n {latest.therapy.map((entry) => (\n <li\n key={entry.id}\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\"\n >\n <span className=\"type-label ds:text-[color:var(--foreground)]\">\n {entry.name}\n </span>\n {entry.dose ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {entry.dose}\n </span>\n ) : null}\n <Badge\n variant={entry.kind === 'medication' ? 'info' : 'neutral'}\n size=\"sm\"\n >\n {t(`anamnesis.medKind.${entry.kind}`)}\n </Badge>\n </li>\n ))}\n </ul>\n ) : (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.readOnly.none')}\n </p>\n )}\n </Block>\n\n {/* Blood tests */}\n <Block titleKey=\"anamnesis.section.labs\" t={t}>\n <ReadOnlyNumericList\n defs={labDefs}\n visit={latest}\n previous={previous}\n targets={targets}\n t={t}\n />\n </Block>\n\n {/* Nutritional proposal + notes */}\n {latest.nutritionalProposal || latest.clinicalNotes ? (\n <Block titleKey=\"anamnesis.section.proposal\" t={t}>\n {latest.nutritionalProposal ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-label ds:text-[color:var(--foreground)]\">\n {t('anamnesis.field.nutritionalProposal.label')}\n </span>\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {latest.nutritionalProposal}\n </p>\n </div>\n ) : null}\n {latest.clinicalNotes ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-label ds:text-[color:var(--foreground)]\">\n {t('anamnesis.field.clinicalNotes.label')}\n </span>\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {latest.clinicalNotes}\n </p>\n </div>\n ) : null}\n </Block>\n ) : null}\n\n {/* Annual programme */}\n {annual ? (\n <Block titleKey=\"anamnesis.section.annual\" t={t}>\n <div className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-xs)]\">\n <Badge\n variant={annual.proposed ? 'success' : 'neutral'}\n size=\"md\"\n withDot\n >\n {t('anamnesis.field.annualProposed.label')}:{' '}\n {annual.proposed\n ? t('anamnesis.common.yes')\n : t('anamnesis.common.no')}\n </Badge>\n <Badge\n variant={annual.accepted ? 'success' : 'neutral'}\n size=\"md\"\n withDot\n >\n {t('anamnesis.field.annualAccepted.label')}:{' '}\n {annual.accepted\n ? t('anamnesis.common.yes')\n : t('anamnesis.common.no')}\n </Badge>\n </div>\n </Block>\n ) : null}\n\n {/* Patient intake answers — the same read-only renderer the compile\n surface's Summary tab uses, so there is one presentation of a\n recorded questionnaire, not two that can drift apart. */}\n {record.intake && Object.keys(record.intake.answers).length > 0 ? (\n <Block titleKey=\"anamnesis.section.patientIntake\" t={t}>\n <AnamnesisAnswerList\n intake={record.intake}\n sections={historySections}\n sex={patient.sex}\n t={t}\n />\n </Block>\n ) : null}\n\n {/* Evolution — read-only grid; every visit a column, PDF/print of\n the view from the toolbar. */}\n <Block titleKey=\"anamnesis.section.evolution\" t={t}>\n <AnamnesisEvolution\n record={record}\n t={t}\n config={config}\n framed={false}\n onOpenNote={onOpenNote}\n partitionBySource={partitionBySource}\n onVisitSelectionChange={trackShownVisits}\n exportSlot={\n <AnamnesisExportMenu\n tab=\"evolution\"\n record={record}\n t={t}\n config={config}\n shownVisitIds={shownVisitIds}\n />\n }\n />\n </Block>\n </Card.Body>\n </Card>\n </>\n );\n\n return <ReadOnlyShell embedded={embedded}>{inner}</ReadOnlyShell>;\n}\n\n/** The surface's page chrome, shared by the record and its empty state. */\nfunction ReadOnlyShell({\n embedded,\n children,\n}: {\n embedded: boolean;\n children: React.ReactNode;\n}) {\n if (embedded) {\n return (\n <div className=\"ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-lg)]\">\n {children}\n </div>\n );\n }\n return (\n <div className=\"ds:min-h-[100dvh] ds:w-full ds:bg-[color:var(--app-shell-background)] ds:py-[var(--spacing-lg)]\">\n <div className=\"ds:mx-auto ds:flex ds:w-full ds:max-w-[76rem] ds:flex-col ds:gap-[var(--spacing-lg)] ds:px-[var(--spacing-md)]\">\n {children}\n </div>\n </div>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — questionnaire mode */\n/* */\n/* ONE surface for both actors. The clinician and the patient answer the */\n/* SAME questionnaire — the practice creates two forms when the two roles */\n/* must be asked different things — so there is no separate doctor-fill */\n/* form and no bespoke measurement blocks. Numeric questions carry their */\n/* own unit, which is what the trend tab plots over successive */\n/* interviews. */\n/* */\n/* Two built-in tabs, because those are the only two things this surface */\n/* does: answer the questionnaire, and compare its numbers over time. The */\n/* compile mode's eleven bespoke blocks are deliberately absent. A host */\n/* may prepend its own tabs (`leadingTabs`) — the platform island puts an */\n/* Overview of every module's latest interview first — and drive the */\n/* selected tab from outside, so \"edit this interview\" can land on the */\n/* questionnaire from a card on a tab this surface knows nothing about. */\n/* */\n/* ALWAYS EDITABLE. Editing is entered from the host's overview, so the */\n/* questionnaire tab never needs an Edit gate of its own: whoever reaches */\n/* it came here to answer. */\n/* */\n/* NO CARD OF ITS OWN. Both tab panels already bring their own surface — */\n/* the questionnaire its card, the trend its frame — so wrapping them */\n/* nested a card inside a card inside the host's own panel, three borders */\n/* deep for one questionnaire. */\n/* -------------------------------------------------------------------- */\n\nimport { useMemo, useState, type ReactNode } from 'react';\nimport type { TFunction } from 'i18next';\nimport { Card } from '../../components/card';\nimport { Tabs } from '../../components/tabs';\nimport { AnamnesisIntake, type IntakeAnswerMap } from './anamnesis-intake';\nimport { AnamnesisEvolution, useShownVisitIds } from './anamnesis-evolution';\nimport { AnamnesisExportMenu } from './anamnesis-export-menu';\nimport { EmptyState } from '../../components/empty-state';\nimport type { AnamnesisEmptyState } from './anamnesis';\nimport { AnamnesisTargetStrip } from './anamnesis-target-strip';\nimport { stripParameters } from './anamnesis-targets';\nimport { allParametersIncludingArchived } from './anamnesis-config';\nimport { setTargetOnRecord } from './anamnesis-derive';\nimport type { PracticeAnamnesisConfig } from './anamnesis-config';\nimport type { AnamnesisRecord, NumericParameterDef } from './anamnesis-types';\n\nexport interface AnamnesisQuestionnaireProps {\n record: AnamnesisRecord;\n t: TFunction;\n /** The practice's configured vocabulary. Omitted = the kit-seeded default. */\n config?: PracticeAnamnesisConfig;\n /** The questionnaire was submitted — receives the full answer map. The\n * surface keeps its own working copy either way; this is the seam a\n * platform host persists through. */\n onSubmit?: (answers: IntakeAnswerMap) => void;\n /** Open the section containing this field key and focus it on mount. */\n jumpToField?: string;\n /** Host status chips (signature / expiry / save feedback) above the tabs. */\n statusSlot?: ReactNode;\n /** A per-patient goal target was set or cleared (`null` clears it). The\n * surface keeps its own working copy either way — this is the seam a\n * platform host persists through. Omit it and the goals strip still\n * renders and still edits, it simply persists nowhere. */\n onTargetChange?: (parameterKey: string, target: number | null) => void;\n /** Omit the goals strip above the card. Default false: it renders whenever\n * the vocabulary marks at least one parameter as a goal. */\n hideTargetStrip?: boolean;\n /** Host tabs rendered BEFORE the built-in questionnaire and trend tabs,\n * inside the same tab strip. Each value must be unique and must not\n * collide with `questionnaire` / `trend`. */\n leadingTabs?: ReadonlyArray<AnamnesisLeadingTab>;\n /** Controlled selected tab — a leading tab's value, `questionnaire` or\n * `trend`. Pair with `onTabChange`; omit for uncontrolled. */\n tab?: AnamnesisQuestionnaireTab;\n /** The user picked another tab. Fires in both modes, so an uncontrolled\n * host can still observe the selection. */\n onTabChange?: (tab: AnamnesisQuestionnaireTab) => void;\n /** Uncontrolled initial tab. Defaults to the first leading tab when there\n * is one, else the questionnaire. Demo/story hook too — Chromatic skips\n * play functions, so a click-selected tab is never snapshotted. */\n defaultTab?: AnamnesisQuestionnaireTab;\n /** Lock the questionnaire (every control disabled, no footer). A host with\n * nothing to edit — no interview selected yet — must not offer a Submit\n * that would post into the void. */\n readOnly?: boolean;\n /** Render this INSTEAD of the questionnaire in its tab panel — the host's\n * restriction message when the reader may not see the answers. The tab\n * strip stays, so the trend and the host's own tabs remain reachable;\n * unmounting the whole surface for one withheld panel took them with it. */\n questionnaireSlot?: ReactNode;\n /** Rendered INSIDE the questionnaire's tab panel, above the questionnaire —\n * the host's per-interview controls (its date, its signature state). They\n * belong to the interview being answered, so they show only when it does;\n * in the shared tab header they sat beside host tabs about other things. */\n questionnaireHeaderSlot?: ReactNode;\n /** ONE empty presentation in EVERY tab panel while the record has nothing\n * to show — the host decides when. The tab strip stays exactly as it is, so\n * the layout does not jump the moment the first interview is created. */\n emptyState?: AnamnesisEmptyState;\n /** One trend table per anamnesis type instead of one grid over every\n * module's visits. Default false. */\n partitionBySource?: boolean;\n}\n\n/** A host-supplied tab that precedes the built-in ones. */\nexport interface AnamnesisLeadingTab {\n value: string;\n label: string;\n content: ReactNode;\n}\n\n/** The built-in tab values, widened so a host's leading-tab values type\n * without a cast. */\nexport type AnamnesisQuestionnaireTab =\n | 'questionnaire'\n | 'trend'\n | (string & {});\n\nconst NO_LEADING_TABS: ReadonlyArray<AnamnesisLeadingTab> = [];\n\n/** The one empty presentation of questionnaire mode. Every panel that has\n * nothing to show renders this same card, so an empty record reads as one\n * state rather than three unrelated placeholders. */\nfunction AnamnesisEmptyCard({\n variant = 'first-use',\n testId = 'anamnesis-empty-card',\n title,\n description,\n primaryAction,\n secondaryAction,\n}: AnamnesisEmptyState & {\n variant?: 'first-use' | 'no-results';\n testId?: string;\n}) {\n return (\n <Card variant=\"elevated\" data-testid={testId}>\n <Card.Body>\n <EmptyState\n variant={variant}\n size=\"md\"\n title={title}\n description={description}\n primaryAction={primaryAction}\n secondaryAction={secondaryAction}\n />\n </Card.Body>\n </Card>\n );\n}\n\nexport function AnamnesisQuestionnaire({\n record,\n t,\n config,\n onSubmit,\n jumpToField,\n statusSlot,\n onTargetChange,\n hideTargetStrip = false,\n leadingTabs = NO_LEADING_TABS,\n readOnly = false,\n questionnaireSlot,\n questionnaireHeaderSlot,\n emptyState,\n partitionBySource = false,\n tab: tabProp,\n onTabChange,\n defaultTab,\n}: AnamnesisQuestionnaireProps) {\n // Controlled when the host passes `tab`, uncontrolled otherwise — the same\n // split as the kit's Tabs itself, so a host that only wants to observe the\n // selection is not forced to own it.\n const [internalTab, setInternalTab] = useState<AnamnesisQuestionnaireTab>(\n () => defaultTab ?? leadingTabs[0]?.value ?? 'questionnaire',\n );\n const tab = tabProp ?? internalTab;\n const selectTab = (next: AnamnesisQuestionnaireTab) => {\n if (tabProp === undefined) setInternalTab(next);\n onTabChange?.(next);\n };\n\n // Targets belong to the RECORD, not to a visit — a goal is not a measurement\n // taken on a day — so edits land on a working copy of the record and the\n // host persists through the callback. Same idiom as the compile surface.\n const [working, setWorking] = useState<AnamnesisRecord>(record);\n\n // RE-SEED WHEN THE HOST HANDS US A DIFFERENT RECORD. A host that reloads the\n // page to show new data gets fresh state for free; one that swaps the record\n // in place — the AlfaDocs island creating an interview, or opening a past one\n // from its archive — does not, and this surface would go on showing the\n // PREVIOUS record's answers. That reads as \"nothing\n // happened\", which is worse than a slow reload.\n //\n // Adjusting state during render is React's own prescription for\n // derived-from-props state; it re-renders immediately, before children see\n // the stale values, and beats an effect that paints the wrong thing first.\n const [seededFrom, setSeededFrom] = useState(record);\n if (record !== seededFrom) {\n setSeededFrom(record);\n setWorking(record);\n }\n const targets = useMemo(\n () =>\n new Map(working.targets.map((x) => [x.parameterKey, x.target] as const)),\n [working.targets],\n );\n const stripDefs = useMemo(() => stripParameters(config), [config]);\n // The trend plots ONE SERIES PER NUMERIC QUESTION. A questionnaire whose\n // questions are all boolean, text or choice has nothing numeric to compare,\n // so the grid would draw an empty frame and the shared evolution empty state\n // would tell the reader to \"record the first visit\" — a concept this surface\n // does not have. Say the true thing instead.\n const numericDefs = useMemo(\n () => allParametersIncludingArchived(config),\n [config],\n );\n const setTarget = (def: NumericParameterDef, target: number | null) => {\n setWorking((r) => setTargetOnRecord(r, def.key, target));\n onTargetChange?.(def.key, target);\n };\n // The trend files what is on screen: the export control mirrors the columns\n // the picker shows. `working`, so a goal set this session rides into the file.\n const [shownVisitIds, trackShownVisits] = useShownVisitIds();\n\n const trendPanel = (\n <AnamnesisEvolution\n record={working}\n t={t}\n config={config}\n /* Read-only: values are answered in the questionnaire, never typed into\n the grid — one place to answer a question. */\n framed={false}\n partitionBySource={partitionBySource}\n /* This tab is the one host that steps back for the module cards, so it\n is the one host that asks for them — the read-only and compile\n surfaces keep their own card and leave the blocks bare. */\n cardBlocks\n onVisitSelectionChange={trackShownVisits}\n exportSlot={\n <AnamnesisExportMenu\n tab=\"evolution\"\n record={working}\n t={t}\n config={config}\n shownVisitIds={shownVisitIds}\n />\n }\n />\n );\n\n return (\n // The goals strip and the tabs are two objects, not one run-on block: an\n // explicit column gap keeps the strip from sitting flush on the card\n // below it, which read as a rendering fault rather than as a heading.\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]\">\n {/* A sibling of the card, not nested in it: \"where is this patient\n against her goals\" is its own object, on screen while she moves\n between the questionnaire and its trend. Nice-to-have scope — a\n host that has not funded goal storage omits it. */}\n {hideTargetStrip || emptyState || working.visits.length === 0 ? null : (\n <AnamnesisTargetStrip\n visits={working.visits}\n defs={stripDefs}\n targets={targets}\n t={t}\n onTargetChange={setTarget}\n />\n )}\n <Tabs value={tab} onValueChange={selectTab}>\n {/* A sibling of Tabs.List, not a child: a tablist holds tabs only. */}\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <Tabs.List aria-label={t('anamnesis.compile.viewsLabel')}>\n {leadingTabs.map((leading) => (\n <Tabs.Trigger key={leading.value} value={leading.value}>\n {leading.label}\n </Tabs.Trigger>\n ))}\n <Tabs.Trigger value=\"questionnaire\">\n {t('anamnesis.compile.tabCompile')}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"trend\">\n {t('anamnesis.compile.tabEvolution')}\n </Tabs.Trigger>\n </Tabs.List>\n {statusSlot ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n {statusSlot}\n </div>\n ) : null}\n </div>\n\n {/* `forceMount` + hidden-when-inactive keeps typed answers and the host's\n tab alive across switches; the trend remounts instead (its sparklines\n size at mount) except while `emptyState` hides them, see below. */}\n {leadingTabs.map((leading) => (\n <Tabs.Content\n key={leading.value}\n value={leading.value}\n forceMount\n className=\"ds:data-[state=inactive]:hidden\"\n >\n {emptyState ? (\n <AnamnesisEmptyCard {...emptyState} />\n ) : (\n leading.content\n )}\n </Tabs.Content>\n ))}\n\n <Tabs.Content\n value=\"questionnaire\"\n forceMount\n className=\"ds:data-[state=inactive]:hidden\"\n >\n {emptyState ? (\n <AnamnesisEmptyCard {...emptyState} />\n ) : (\n <>\n {/* `embedded` unconditionally: the questionnaire sits inside\n this card's tab panel, so its own page chrome would double\n the heading the tab already provides. */}\n {questionnaireHeaderSlot ? (\n <div className=\"ds:mb-[var(--spacing-md)] ds:flex ds:flex-wrap ds:items-end ds:justify-between ds:gap-[var(--spacing-sm)]\">\n {questionnaireHeaderSlot}\n </div>\n ) : null}\n {questionnaireSlot ?? (\n <AnamnesisIntake\n record={working}\n t={t}\n embedded\n config={config}\n onSubmit={onSubmit}\n jumpToField={jumpToField}\n readOnly={readOnly}\n />\n )}\n </>\n )}\n </Tabs.Content>\n\n {/* Force-mounted only while empty: the sparklines that must not size\n themselves behind a hidden panel are not rendered then, and the\n same card in every panel is what keeps the tab switch seamless. */}\n <Tabs.Content\n value=\"trend\"\n forceMount={emptyState ? true : undefined}\n className=\"ds:data-[state=inactive]:hidden\"\n >\n {emptyState ? (\n <AnamnesisEmptyCard {...emptyState} />\n ) : numericDefs.length === 0 ? (\n <AnamnesisEmptyCard\n variant=\"no-results\"\n testId=\"anamnesis-trend-empty\"\n title={t('anamnesis.questionnaire.noNumeric.title')}\n description={t('anamnesis.questionnaire.noNumeric.description')}\n />\n ) : working.visits.length === 0 ? (\n /* The evolution's own bare no-visits state sat on the page ground\n while the questionnaire's sat in a card: same shell for both. */\n <AnamnesisEmptyCard\n testId=\"anamnesis-trend-empty\"\n title={t('anamnesis.empty.noVisits.title')}\n description={t('anamnesis.empty.noVisits.description')}\n />\n ) : partitionBySource ? (\n /* Each module block brings its own card, so a card here would nest\n three elevated surfaces inside a fourth — a box in a box. */\n trendPanel\n ) : (\n /* One grid, so it needs the same elevated card as the\n questionnaire's sections: otherwise it is the one surface on the\n tab sitting bare on the page. */\n <Card variant=\"elevated\">\n <Card.Body>{trendPanel}</Card.Body>\n </Card>\n )}\n </Tabs.Content>\n </Tabs>\n </div>\n );\n}\n\nAnamnesisQuestionnaire.displayName = 'AnamnesisQuestionnaire';\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — mode router */\n/* */\n/* One tool, three host contexts, driven by a `mode` prop: */\n/* intake — patient self-completion (Anamnesis section) */\n/* compile — clinician record + evolution (Diagnostic section) */\n/* readOnly — the same record, no edit affordances (Care plan section) */\n/* */\n/* Standalone it renders as a full-page `<main>`. Set `embedded` when it */\n/* mounts inside a host context's section tab (e.g. the Patient Folder's */\n/* Anamnesis / Diagnosis tabs): the surface drops its full-page chrome + own */\n/* page heading, and the root renders a plain `<div>` (the host owns the */\n/* `<main>` landmark and the section heading). */\n/* */\n/* The surface takes `t` as a prop (rather than calling useTranslation */\n/* itself) so the RTL/CJK stories can drive it with a locale-pinned */\n/* `getFixedT` without the surface knowing. */\n/* -------------------------------------------------------------------- */\n\nimport type { ReactNode } from 'react';\nimport type { TFunction } from 'i18next';\nimport type { PracticeAnamnesisConfig } from './anamnesis-config';\nimport {\n AnamnesisCompile,\n type AnamnesisCompileView,\n} from './anamnesis-compile';\nimport type { DisclosureAudience } from './anamnesis-disclosure';\nimport { AnamnesisIntake, type IntakeAnswerMap } from './anamnesis-intake';\nimport type { MissingAnswer } from './anamnesis-digest';\nimport { AnamnesisReadOnly } from './anamnesis-readonly';\nimport { AnamnesisQuestionnaire } from './anamnesis-questionnaire';\nimport type {\n AnamnesisLeadingTab,\n AnamnesisQuestionnaireTab,\n} from './anamnesis-questionnaire';\nimport type {\n AnamnesisMode,\n AnamnesisRecord,\n OpenAnamnesisNote,\n PractitionerOption,\n} from './anamnesis-types';\n\n/** Rendered in EVERY tab panel of questionnaire mode while the record has\n * nothing to show — the host decides when (typically: no interview exists\n * yet) and supplies the copy and the create actions. */\nexport interface AnamnesisEmptyState {\n title: string;\n description?: string;\n primaryAction?: { label: string; onClick: () => void };\n secondaryAction?: { label: string; onClick: () => void; href?: string };\n}\n\nexport interface AnamnesisProps {\n /** Which host context to render. */\n mode: AnamnesisMode;\n record: AnamnesisRecord;\n t: TFunction;\n /** Override the cascade / test marker (defaults to `anamnesis`). Stories\n * pass a per-mode marker so each render is independently addressable. */\n dataComponent?: string;\n /** Mount flush inside a host section tab: drops the full-page chrome + own\n * page heading, and renders a `<div>` instead of a `<main>` landmark. */\n embedded?: boolean;\n /** The practice's own vocabulary — parameters, questionnaire, pathology\n * codes. Omit it and the kit-seeded default is used, so every existing\n * mount keeps working unchanged. */\n config?: PracticeAnamnesisConfig;\n /** Compile mode only: a per-patient target was set or cleared. The surface\n * keeps its own working copy either way — this is the seam a platform host\n * persists through. */\n onTargetChange?: (parameterKey: string, target: number | null) => void;\n /** Compile mode only: host status chips (signature / expiry / renew /\n * save feedback) rendered at the surface header's end. */\n statusSlot?: ReactNode;\n /** Compile mode only: omit the nutrition-targets strip above the record —\n * for hosts that present the record without the goals (e.g. the isolated\n * single-section demo). Default false: the strip renders. */\n hideTargetStrip?: boolean;\n /** Compile / readOnly modes: the host's side panel. Wire it to whatever\n * opens a panel in the host shell — in the AlfaDocs folder, the Control\n * Room's `openTool`. Omitted = notes are read in place. */\n onOpenNote?: OpenAnamnesisNote;\n /** Intake mode only: the questionnaire was submitted — receives the full\n * answer map. The surface keeps its own draft state either way; this is\n * the seam a platform host persists through (mirrors `onTargetChange`). */\n onIntakeSubmit?: (answers: IntakeAnswerMap) => void;\n /** Intake mode only: open the section containing this field key and move\n * focus to it on mount — the landing half of `onMissingAnswerJump`. */\n intakeJumpToField?: string;\n /** Intake and questionnaire modes: render the answers without letting them\n * be changed and drop the submit footer — a host's read of a past\n * interview, or a questionnaire with nothing selected to edit. */\n readOnly?: boolean;\n /** Questionnaire mode only: render this instead of the questionnaire in its\n * tab panel (a restriction message), keeping the tab strip and the trend. */\n questionnaireSlot?: ReactNode;\n /** Questionnaire mode only: the host's per-interview controls, rendered\n * inside the questionnaire panel above the questionnaire. */\n questionnaireHeaderSlot?: ReactNode;\n /** Questionnaire mode only: one empty presentation in every tab panel\n * while the record has nothing to show; the tab strip stays put. */\n emptyState?: AnamnesisEmptyState;\n /** Compile, questionnaire and readOnly modes: draw the trend as one table\n * per anamnesis type (visits grouped by `sourceLabel`). Default false. */\n partitionBySource?: boolean;\n /** Compile mode only: route the Summary's missing-answer jump to a host\n * questionnaire surface instead of the internal Compila gaps block. */\n onMissingAnswerJump?: (missing: MissingAnswer) => void;\n /** Compile mode only: every edit to the working record — the visit-data\n * persistence seam (hosts debounce + diff). See `AnamnesisCompileProps`. */\n onRecordChange?: (record: AnamnesisRecord) => void;\n /** Questionnaire mode only: host tabs rendered before the built-in\n * questionnaire and trend tabs, in the same strip. When given and no tab\n * is selected, the first one is the default. */\n leadingTabs?: ReadonlyArray<AnamnesisLeadingTab>;\n /** Questionnaire mode only: controlled selected tab — a leading tab's\n * value, `questionnaire` or `trend`. Pair with `onQuestionnaireTabChange`. */\n questionnaireTab?: AnamnesisQuestionnaireTab;\n /** Questionnaire mode only: the user picked another tab. */\n onQuestionnaireTabChange?: (tab: AnamnesisQuestionnaireTab) => void;\n /** Questionnaire mode only: uncontrolled initial tab. Demo/story hook\n * too — Chromatic skips play functions. */\n defaultQuestionnaireTab?: AnamnesisQuestionnaireTab;\n /** Compile mode only: the practice's operators, offered in the visit's\n * Practitioner select. Omitted or empty keeps the free-text input. */\n practitioners?: PractitionerOption[];\n /** Compile mode only: the calendar date a NEW follow-up visit is created\n * on. A host passes its \"today\"; defaults to the latest visit's date. */\n newVisitDateIso?: string;\n /** Compile mode only: mount on this view instead of Summary. Demo/story\n * hook only, for the same Chromatic reason as the flags below. */\n defaultView?: AnamnesisCompileView;\n /** Compile mode only: mount the export control open / on a given audience.\n * Demo/story hooks only — Chromatic skips play functions, so a click-opened\n * menu or dialog is never snapshotted. */\n defaultExportMenuOpen?: boolean;\n defaultShareOpen?: boolean;\n defaultExportAudience?: DisclosureAudience;\n}\n\nexport function Anamnesis({\n mode,\n record,\n t,\n dataComponent = 'anamnesis',\n embedded = false,\n config,\n onTargetChange,\n hideTargetStrip,\n statusSlot,\n onOpenNote,\n onIntakeSubmit,\n intakeJumpToField,\n readOnly,\n onMissingAnswerJump,\n onRecordChange,\n leadingTabs,\n questionnaireTab,\n onQuestionnaireTabChange,\n questionnaireSlot,\n questionnaireHeaderSlot,\n emptyState,\n partitionBySource,\n defaultQuestionnaireTab,\n practitioners,\n newVisitDateIso,\n defaultView,\n defaultExportMenuOpen,\n defaultShareOpen,\n defaultExportAudience,\n}: AnamnesisProps) {\n const surface =\n mode === 'intake' ? (\n <AnamnesisIntake\n record={record}\n t={t}\n embedded={embedded}\n config={config}\n onSubmit={onIntakeSubmit}\n jumpToField={intakeJumpToField}\n readOnly={readOnly}\n />\n ) : mode === 'questionnaire' ? (\n <AnamnesisQuestionnaire\n record={record}\n t={t}\n config={config}\n onSubmit={onIntakeSubmit}\n jumpToField={intakeJumpToField}\n statusSlot={statusSlot}\n onTargetChange={onTargetChange}\n hideTargetStrip={hideTargetStrip}\n leadingTabs={leadingTabs}\n tab={questionnaireTab}\n onTabChange={onQuestionnaireTabChange}\n defaultTab={defaultQuestionnaireTab}\n readOnly={readOnly}\n questionnaireSlot={questionnaireSlot}\n questionnaireHeaderSlot={questionnaireHeaderSlot}\n emptyState={emptyState}\n partitionBySource={partitionBySource}\n />\n ) : mode === 'compile' ? (\n <AnamnesisCompile\n record={record}\n t={t}\n embedded={embedded}\n config={config}\n onTargetChange={onTargetChange}\n hideTargetStrip={hideTargetStrip}\n statusSlot={statusSlot}\n onOpenNote={onOpenNote}\n onMissingAnswerJump={onMissingAnswerJump}\n onRecordChange={onRecordChange}\n practitioners={practitioners}\n newVisitDateIso={newVisitDateIso}\n defaultView={defaultView}\n defaultExportMenuOpen={defaultExportMenuOpen}\n defaultShareOpen={defaultShareOpen}\n defaultExportAudience={defaultExportAudience}\n partitionBySource={partitionBySource}\n />\n ) : (\n <AnamnesisReadOnly\n record={record}\n t={t}\n embedded={embedded}\n config={config}\n onOpenNote={onOpenNote}\n partitionBySource={partitionBySource}\n />\n );\n\n if (embedded) {\n return (\n <div\n data-component={dataComponent}\n data-mode={mode}\n className=\"ds:w-full\"\n >\n {surface}\n </div>\n );\n }\n\n return (\n <main\n data-component={dataComponent}\n data-mode={mode}\n aria-label={t('anamnesis.mainLabel', {\n mode: t(`anamnesis.mode.${mode}`),\n })}\n className=\"ds:w-full\"\n >\n {surface}\n </main>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — shared list-reorder idiom (drag + keyboard) */\n/* */\n/* MIRRORS the kit's established DnD idiom — the Sidebar favourites */\n/* section (src/components/sidebar/sidebar.tsx, SidebarFavorites / */\n/* SidebarFavoriteItem): a grip handle per row, HTML5 drag-and-drop */\n/* mounted on the ROW (buttons don't start HTML5 drags reliably in every */\n/* browser, so the whole row is the drag target and the grip is the */\n/* visual + keyboard affordance), keyboard reorder on the handle */\n/* (Alt+ArrowUp / Alt+ArrowDown, Alt+Home / Alt+End), and a polite */\n/* live-region announcement of every move. */\n/* */\n/* Mirrored rather than extracted: the sidebar's implementation is welded */\n/* to its own context (icon-mode gating, SidebarSection's live region, */\n/* reveal-on-hover chrome), so a shared helper could not be lifted without */\n/* touching the sidebar's behaviour — and components must never import */\n/* from patterns, so the shared home would have had to be a new component. */\n/* */\n/* A11y contract (the same one the sidebar keeps): */\n/* • focus stays on the moved row's handle — rows are keyed, so React */\n/* moves the DOM node instead of remounting it; */\n/* • every move is announced with the new position via aria-live; */\n/* • the handle names its row and teaches the key command. */\n/* -------------------------------------------------------------------- */\n\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n type DragEvent,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport type { TFunction } from 'i18next';\nimport { GripVertical } from 'lucide-react';\nimport { IconButton } from '../../components/icon-button';\n\n/* Drag affordances — byte-identical to the sidebar's favoriteRowClasses\n * variants. The base is empty because the host row keeps its own layout\n * classes and merges these on top. */\nconst reorderRowClasses = cva('', {\n variants: {\n dragging: {\n true: 'ds:opacity-60',\n false: '',\n },\n dropTarget: {\n true: 'ds:outline-[length:var(--focus-ring-width)] ds:outline-dashed ds:outline-[var(--primary)] ds:outline-offset-[-2px]',\n false: '',\n },\n },\n defaultVariants: { dragging: false, dropTarget: false },\n});\n\n/* -------------------------------- Context -------------------------------- */\n\ninterface ReorderContextValue {\n onReorder: (from: number, to: number) => void;\n count: number;\n dragSource: number | null;\n setDragSource: (index: number | null) => void;\n announce: (message: string) => void;\n t: TFunction;\n}\n\nconst ReorderContext = createContext<ReorderContextValue | null>(null);\n\n/* --------------------------------- Group --------------------------------- */\n\nexport interface AnamnesisReorderGroupProps {\n /** Number of rows in the group — bounds keyboard moves and gives the\n * announcement its \"of {{total}}\". */\n count: number;\n /** Move a row from `from` to `to` — both DISPLAY indices of the group. */\n onReorder: (from: number, to: number) => void;\n t: TFunction;\n children: ReactNode;\n}\n\n/** One reorderable list. Renders its children untouched plus a visually\n * hidden polite live region the rows announce their moves into. Nesting is\n * fine — a row binds to its NEAREST group, and a drag never crosses groups\n * (each group tracks its own drag source). */\nexport function AnamnesisReorderGroup({\n count,\n onReorder,\n t,\n children,\n}: AnamnesisReorderGroupProps) {\n const [dragSource, setDragSource] = useState<number | null>(null);\n const [liveMessage, setLiveMessage] = useState('');\n // Re-emit identical announcements by toggling an invisible suffix so\n // screen-readers treat repeated moves as distinct (sidebar idiom).\n const announceToggle = useRef(false);\n const announce = useCallback((message: string) => {\n announceToggle.current = !announceToggle.current;\n setLiveMessage(announceToggle.current ? message : `${message}\\u200b`);\n }, []);\n\n const value = useMemo<ReorderContextValue>(\n () => ({ onReorder, count, dragSource, setDragSource, announce, t }),\n [onReorder, count, dragSource, announce, t],\n );\n\n return (\n <ReorderContext.Provider value={value}>\n {children}\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {liveMessage}\n </span>\n </ReorderContext.Provider>\n );\n}\n\n/* ---------------------------------- Row ----------------------------------- */\n\nexport interface AnamnesisReorderRowRender {\n /** Spread onto the element that drags as one unit (the `<li>`, the section\n * header row…). `className` carries the dragging / drop-target affordances —\n * merge it with the row's own classes. */\n rowProps: {\n draggable: true;\n onDragStart: (event: DragEvent<HTMLElement>) => void;\n onDragEnd: () => void;\n onDragOver: (event: DragEvent<HTMLElement>) => void;\n onDragLeave: () => void;\n onDrop: (event: DragEvent<HTMLElement>) => void;\n className: string;\n };\n /** The grip button — mount it INSIDE the row's action group so the drag\n * affordance sits with the row's other controls. */\n handle: ReactElement;\n}\n\nexport interface AnamnesisReorderRowProps {\n /** Zero-based DISPLAY position of this row within its group. */\n index: number;\n /** Accessible name of the row — names the handle and the announcements. */\n label: string;\n children: (row: AnamnesisReorderRowRender) => ReactElement;\n}\n\nexport function AnamnesisReorderRow({\n index,\n label,\n children,\n}: AnamnesisReorderRowProps) {\n const group = useContext(ReorderContext);\n const [isDropTarget, setIsDropTarget] = useState(false);\n if (!group) {\n throw new Error(\n 'AnamnesisReorderRow must render inside an AnamnesisReorderGroup',\n );\n }\n const { t } = group;\n\n const moveFromTo = (from: number, to: number) => {\n const clamped = Math.max(0, Math.min(group.count - 1, to));\n if (clamped === from) return;\n group.onReorder(from, clamped);\n group.announce(\n t('anamnesis.configEditor.reorderAnnounce', {\n name: label,\n to: clamped + 1,\n total: group.count,\n }),\n );\n };\n\n const onHandleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (!event.altKey) return;\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n moveFromTo(index, index - 1);\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n moveFromTo(index, index + 1);\n } else if (event.key === 'Home') {\n event.preventDefault();\n moveFromTo(index, 0);\n } else if (event.key === 'End') {\n event.preventDefault();\n moveFromTo(index, group.count - 1);\n }\n };\n\n const isDragging = group.dragSource === index;\n\n const rowProps: AnamnesisReorderRowRender['rowProps'] = {\n draggable: true,\n onDragStart: (event) => {\n group.setDragSource(index);\n event.dataTransfer.effectAllowed = 'move';\n // Firefox requires data to initiate a drag.\n event.dataTransfer.setData('text/plain', String(index));\n },\n onDragEnd: () => {\n group.setDragSource(null);\n setIsDropTarget(false);\n },\n onDragOver: (event) => {\n // Only a drag that started in THIS group may target the row.\n if (group.dragSource === null) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = 'move';\n setIsDropTarget(true);\n },\n onDragLeave: () => setIsDropTarget(false),\n onDrop: (event) => {\n event.preventDefault();\n const source = group.dragSource;\n setIsDropTarget(false);\n group.setDragSource(null);\n if (source === null || source === index) return;\n moveFromTo(source, index);\n },\n className: reorderRowClasses({\n dragging: isDragging,\n dropTarget: isDropTarget && !isDragging,\n }),\n };\n\n const handle = (\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<GripVertical aria-hidden=\"true\" />}\n aria-label={t('anamnesis.configEditor.reorderHandle', { name: label })}\n className=\"ds:cursor-grab ds:active:cursor-grabbing\"\n onKeyDown={onHandleKeyDown}\n />\n );\n\n return children({ rowProps, handle });\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — practice-configuration editor */\n/* */\n/* A PROVISIONAL editor over `PracticeAnamnesisConfig` — the three */\n/* model-backed vocabularies (questionnaire sections + fields, numeric */\n/* parameters, pathology codes) with the operations the resolver contract */\n/* supports: relabel, help text (intake fields only — nothing else renders */\n/* it), reorder, archive/restore, and free-form add. The PRODUCTION */\n/* editor is still gated on the customer's real specification (six */\n/* vocabularies, mandatory / at-a-glance columns) — see anamnesis.mdx */\n/* § Practice configuration. */\n/* */\n/* Contract obligations the UI enforces (the resolvers cannot): */\n/* • Entries are NEVER removed — archive (`enabled: false`) only, so */\n/* recorded answers survive under the history resolvers. */\n/* • Locked keys (weight / height / bmi) offer no archive control — */\n/* resolvers refuse the archive, but a whole-list replace could drop */\n/* them physically, so the editor never offers the path at all. */\n/* • `locked` is never written; the resolvers stamp it from the key set. */\n/* • Keys are derived from the label at creation and immutable after — */\n/* renaming a key would orphan every answer recorded under it. */\n/* */\n/* Controlled: the host owns the config state and passes it back down to */\n/* every mounted anamnesis surface's `config` prop — one shared object is */\n/* the whole live-update story. */\n/* -------------------------------------------------------------------- */\n\nimport { useState } from 'react';\nimport type { TFunction } from 'i18next';\nimport { Archive, ArchiveRestore, Lock, Pencil, Plus } from 'lucide-react';\nimport { Badge } from '../../components/badge';\nimport { Button } from '../../components/button';\nimport { Card } from '../../components/card';\nimport { Dialog } from '../../components/dialog';\nimport { FormField } from '../../components/form-field';\nimport { IconButton } from '../../components/icon-button';\nimport { IconButtonGroup } from '../../components/icon-button-group';\nimport { List } from '../../components/list';\nimport { Select, type SelectOption } from '../../components/select';\nimport { Switch } from '../../components/switch';\nimport { Tabs } from '../../components/tabs';\nimport { TextArea } from '../../components/text-area';\nimport { StateBackedTextInput } from '../../components/_shared/state-backed-text-input';\nimport {\n SEEDED_ANAMNESIS_CONFIG,\n allParametersIncludingArchived,\n allPathologiesIncludingArchived,\n allSectionsIncludingArchived,\n configuredParameters,\n configuredPathologies,\n configuredSections,\n type PracticeAnamnesisConfig,\n} from './anamnesis-config';\nimport {\n intakeFieldHelp,\n intakeFieldLabel,\n parameterLabelWithUnit,\n pathologyCodeWithLabel,\n sectionLabel,\n} from './anamnesis-format';\nimport {\n AnamnesisReorderGroup,\n AnamnesisReorderRow,\n} from './anamnesis-reorder';\nimport type {\n BetterDirection,\n ConfigurableDescriptor,\n IntakeFieldDef,\n IntakeFieldType,\n IntakeSectionDef,\n NumericParameterDef,\n ParameterGroup,\n PathologyCode,\n} from './anamnesis-types';\n\nexport interface AnamnesisConfigEditorProps {\n /** The practice's vocabulary — materialised (every list present). Build the\n * initial value with `seededConfigDraft()`, never from the module constants\n * directly: the editor patches lists immutably, but a shared array identity\n * with the kit seed would leak one accidental in-place edit into every\n * other mount in the session. */\n config: Required<PracticeAnamnesisConfig>;\n onConfigChange: (next: Required<PracticeAnamnesisConfig>) => void;\n t: TFunction;\n /** Override the cascade / test marker (defaults to `anamnesis-config-editor`). */\n dataComponent?: string;\n}\n\n/** A per-entry deep-enough clone of the kit seed: sections own their `fields`\n * arrays and parameters their `referenceRange` objects, so no array or object\n * identity is shared with the module constants. */\nexport function seededConfigDraft(): Required<PracticeAnamnesisConfig> {\n return {\n parameters: SEEDED_ANAMNESIS_CONFIG.parameters.map((def) => ({\n ...def,\n ...(def.referenceRange\n ? { referenceRange: { ...def.referenceRange } }\n : {}),\n })),\n intakeSections: SEEDED_ANAMNESIS_CONFIG.intakeSections.map((section) => ({\n ...section,\n fields: section.fields.map((field) => ({ ...field })),\n })),\n pathologies: SEEDED_ANAMNESIS_CONFIG.pathologies.map((code) => ({\n ...code,\n })),\n };\n}\n\n/* ------------------------------ Key derivation --------------------------- */\n\n/** Derive an immutable camelCase key from a practice label — the practice\n * never types identifiers, and a labelled entry can never render as a raw\n * key. Uniquified with a numeric suffix on collision. Practice-derived keys\n * are practice-LOCAL: they do not join any shared cross-practice vocabulary\n * (the curated-library question — decision 0.3 — is still open). */\nexport function keyFromLabel(\n label: string,\n taken: ReadonlySet<string>,\n): string {\n const words = label\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^a-zA-Z0-9]+/g, ' ')\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n const base =\n words.length === 0\n ? 'entry'\n : words\n .map((word, index) =>\n index === 0\n ? word.toLowerCase()\n : word[0].toUpperCase() + word.slice(1).toLowerCase(),\n )\n .join('');\n let key = base;\n let suffix = 2;\n while (taken.has(key)) {\n key = `${base}${suffix}`;\n suffix += 1;\n }\n return key;\n}\n\n/* ------------------------------ List patching ---------------------------- */\n\n/** Move a display-ordered subset entry from `from` to `to`, returning the new\n * display order — or null when the move is out of bounds or a no-op. */\nfunction moveIndex<T>(\n displayed: readonly T[],\n from: number,\n to: number,\n): T[] | null {\n if (from === to) return null;\n if (from < 0 || from >= displayed.length) return null;\n if (to < 0 || to >= displayed.length) return null;\n const next = [...displayed];\n const [entry] = next.splice(from, 1);\n next.splice(to, 0, entry);\n return next;\n}\n\n/* ------------------------------- Dialog state ---------------------------- */\n\ntype EditTarget =\n | { kind: 'parameter'; entry: NumericParameterDef }\n | { kind: 'section'; entry: IntakeSectionDef }\n | { kind: 'field'; sectionKey: string; entry: IntakeFieldDef }\n | { kind: 'pathology'; entry: PathologyCode };\n\ntype AddTarget =\n | { kind: 'parameter' }\n | { kind: 'section' }\n | { kind: 'field'; sectionKey: string }\n | { kind: 'pathology' };\n\n/** The add dialog's answer-type list — UI-level entries: the two number\n * variants both map onto `type: 'number'`, with and without the `decimal`\n * flag; everything else maps one-to-one. */\nconst ADD_FIELD_TYPES = [\n 'text',\n 'textarea',\n 'numberInteger',\n 'numberDecimal',\n 'yesNoDetail',\n 'choice',\n 'choiceWithText',\n 'multiChoice',\n 'frequency',\n 'meal',\n] as const;\ntype AddFieldTypeChoice = (typeof ADD_FIELD_TYPES)[number];\n\n/** Seeded field keys — options on THESE are i18n key suffixes, so the editor\n * shows them read-only; a practice-added field's options are verbatim\n * practice wording and stay editable. */\nconst SEEDED_FIELD_KEYS: ReadonlySet<string> = new Set(\n SEEDED_ANAMNESIS_CONFIG.intakeSections.flatMap((section) =>\n section.fields.map((field) => field.key),\n ),\n);\n\n/** The UI label for a field's answer type — number splits into its integer /\n * decimal variants. */\nfunction fieldTypeLabel(def: IntakeFieldDef, t: TFunction): string {\n const key =\n def.type === 'number'\n ? def.decimal\n ? 'numberDecimal'\n : 'numberInteger'\n : def.type === 'choice' && def.detail\n ? 'choiceWithText'\n : def.type;\n return t(`anamnesis.configEditor.type.${key}`);\n}\n\nconst DIRECTIONS: BetterDirection[] = ['down', 'up', 'toRange'];\n\nconst GROUPS: ParameterGroup[] = ['anthropometric', 'dietary', 'lab'];\n\n/* ------------------------------- The editor ------------------------------ */\n\nexport function AnamnesisConfigEditor({\n config,\n onConfigChange,\n t,\n dataComponent = 'anamnesis-config-editor',\n}: AnamnesisConfigEditorProps) {\n const [editing, setEditing] = useState<EditTarget | null>(null);\n const [adding, setAdding] = useState<AddTarget | null>(null);\n\n /* ---------------------------- Patch helpers ---------------------------- */\n\n const patchParameters = (\n map: (def: NumericParameterDef) => NumericParameterDef,\n ) => onConfigChange({ ...config, parameters: config.parameters.map(map) });\n\n const patchSections = (\n map: (section: IntakeSectionDef) => IntakeSectionDef,\n ) =>\n onConfigChange({\n ...config,\n intakeSections: config.intakeSections.map(map),\n });\n\n const patchField = (\n sectionKey: string,\n fieldKey: string,\n map: (field: IntakeFieldDef) => IntakeFieldDef,\n ) =>\n patchSections((section) =>\n section.key === sectionKey\n ? {\n ...section,\n fields: section.fields.map((field) =>\n field.key === fieldKey ? map(field) : field,\n ),\n }\n : section,\n );\n\n const patchPathologies = (map: (code: PathologyCode) => PathologyCode) =>\n onConfigChange({ ...config, pathologies: config.pathologies.map(map) });\n\n /* ------------------------------- Reorder -------------------------------- */\n // Rewrites `order` as the displayed index across the FULL sibling subset —\n // archived rows included, because the history resolvers order the whole\n // subset while capture filters live-first; rewriting only live rows would\n // let the editor's order diverge from the history surfaces'. `from`/`to`\n // are display indices, handed over by the drag-and-drop / keyboard idiom\n // in `anamnesis-reorder.tsx`.\n\n const reorderParameter = (\n group: ParameterGroup,\n from: number,\n to: number,\n ) => {\n const displayed = allParametersIncludingArchived(config, group);\n const moved = moveIndex(displayed, from, to);\n if (!moved) return;\n // Match by key: the displayed entries are resolver-stamped copies, not\n // the config's own object identities.\n const orderByKey = new Map(moved.map((def, i) => [def.key, i] as const));\n patchParameters((def) =>\n orderByKey.has(def.key)\n ? { ...def, order: orderByKey.get(def.key) }\n : def,\n );\n };\n\n const reorderSection = (from: number, to: number) => {\n const moved = moveIndex(allSectionsIncludingArchived(config), from, to);\n if (!moved) return;\n const orderByKey = new Map(\n moved.map((section, i) => [section.key, i] as const),\n );\n patchSections((section) =>\n orderByKey.has(section.key)\n ? { ...section, order: orderByKey.get(section.key) }\n : section,\n );\n };\n\n const reorderField = (\n section: IntakeSectionDef,\n from: number,\n to: number,\n ) => {\n const moved = moveIndex(section.fields, from, to);\n if (!moved) return;\n const orderByKey = new Map(\n moved.map((field, i) => [field.key, i] as const),\n );\n patchSections((candidate) =>\n candidate.key === section.key\n ? {\n ...candidate,\n fields: candidate.fields.map((field) =>\n orderByKey.has(field.key)\n ? { ...field, order: orderByKey.get(field.key) }\n : field,\n ),\n }\n : candidate,\n );\n };\n\n /* ------------------------------ Row actions ----------------------------- */\n\n const setEnabled = (target: EditTarget, enabled: boolean | undefined) => {\n if (target.kind === 'parameter')\n patchParameters((def) =>\n def.key === target.entry.key ? { ...def, enabled } : def,\n );\n else if (target.kind === 'section')\n patchSections((section) =>\n section.key === target.entry.key ? { ...section, enabled } : section,\n );\n else if (target.kind === 'field')\n patchField(target.sectionKey, target.entry.key, (field) => ({\n ...field,\n enabled,\n }));\n else\n patchPathologies((code) =>\n code.code === target.entry.code ? { ...code, enabled } : code,\n );\n };\n\n /* -------------------------------- Render -------------------------------- */\n\n const liveParameters = configuredParameters(config).length;\n const allParameters = allParametersIncludingArchived(config).length;\n const liveFields = configuredSections(config).reduce(\n (count, section) => count + section.fields.length,\n 0,\n );\n const allFields = allSectionsIncludingArchived(config).reduce(\n (count, section) => count + section.fields.length,\n 0,\n );\n const livePathologies = configuredPathologies(config).length;\n const allPathologies = allPathologiesIncludingArchived(config).length;\n const trackedGoals = configuredParameters(config).filter(\n (def) => def.goal === true,\n ).length;\n\n return (\n <div\n data-component={dataComponent}\n data-mode=\"config\"\n className=\"ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-lg)]\"\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <h2 className=\"type-title-section ds:m-0 ds:text-[color:var(--foreground)]\">\n {t('anamnesis.configEditor.title')}\n </h2>\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.configEditor.intro')}\n </p>\n </div>\n\n <Card variant=\"elevated\">\n <Card.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <Tabs defaultValue=\"questionnaire\">\n <Tabs.List aria-label={t('anamnesis.configEditor.tabsLabel')}>\n <Tabs.Trigger value=\"questionnaire\">\n {t('anamnesis.configEditor.tabQuestionnaire')}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"parameters\">\n {t('anamnesis.configEditor.tabParameters')}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"pathologies\">\n {t('anamnesis.configEditor.tabPathologies')}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"targets\">\n {t('anamnesis.configEditor.tabTargets')}\n </Tabs.Trigger>\n </Tabs.List>\n\n {/* ------------------------ Questionnaire ----------------------- */}\n <Tabs.Content value=\"questionnaire\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)] ds:pt-[var(--spacing-md)]\">\n <p className=\"type-meta ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {`${t('anamnesis.configEditor.panelLive', {\n count: liveFields,\n })} · ${t('anamnesis.configEditor.panelNotCaptured', {\n // Not \"archived\": this also counts live questions inside\n // an archived section, which capture drops as a whole.\n count: allFields - liveFields,\n })}`}\n </p>\n <AnamnesisReorderGroup\n count={allSectionsIncludingArchived(config).length}\n onReorder={reorderSection}\n t={t}\n >\n {allSectionsIncludingArchived(config).map(\n (section, sectionIndex) => {\n const archived = section.enabled === false;\n const liveInSection = section.fields.filter(\n (field) => field.enabled !== false,\n ).length;\n return (\n <AnamnesisReorderRow\n key={section.key}\n index={sectionIndex}\n label={sectionLabel(section, t)}\n >\n {({\n rowProps: sectionRowProps,\n handle: sectionHandle,\n }) => (\n <section className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {/* The HEADER row is the drag unit — dragging the whole\n section (fields included) would make the drop target\n ambiguous under long field lists. */}\n <div\n {...sectionRowProps}\n className={[\n 'ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]',\n sectionRowProps.className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <h3 className=\"type-title-item ds:m-0 ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--foreground)]\">\n {sectionLabel(section, t)}\n {archived ? (\n <Badge size=\"sm\" variant=\"neutral\">\n {t('anamnesis.configEditor.archived')}\n </Badge>\n ) : null}\n </h3>\n <IconButtonGroup\n aria-label={t(\n 'anamnesis.configEditor.rowActions',\n {\n name: sectionLabel(section, t),\n },\n )}\n >\n {sectionHandle}\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<Pencil aria-hidden=\"true\" />}\n aria-label={t(\n 'anamnesis.configEditor.edit',\n {\n name: sectionLabel(section, t),\n },\n )}\n onClick={() =>\n setEditing({\n kind: 'section',\n entry: section,\n })\n }\n />\n {archived ? (\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={\n <ArchiveRestore aria-hidden=\"true\" />\n }\n aria-label={t(\n 'anamnesis.configEditor.restore',\n { name: sectionLabel(section, t) },\n )}\n onClick={() =>\n setEnabled(\n { kind: 'section', entry: section },\n undefined,\n )\n }\n />\n ) : (\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<Archive aria-hidden=\"true\" />}\n aria-label={t(\n 'anamnesis.configEditor.archive',\n { name: sectionLabel(section, t) },\n )}\n onClick={() =>\n setEnabled(\n { kind: 'section', entry: section },\n false,\n )\n }\n />\n )}\n </IconButtonGroup>\n </div>\n {liveInSection === 0 && !archived ? (\n <p className=\"type-meta ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t(\n 'anamnesis.configEditor.sectionEmptyCapture',\n )}\n </p>\n ) : null}\n {section.fields.length > 0 ? (\n <AnamnesisReorderGroup\n count={section.fields.length}\n onReorder={(from, to) =>\n reorderField(section, from, to)\n }\n t={t}\n >\n <List divider=\"divided\">\n {section.fields.map((field, fieldIndex) => (\n <AnamnesisReorderRow\n key={field.key}\n index={fieldIndex}\n label={intakeFieldLabel(field, t)}\n >\n {({ rowProps, handle }) => (\n <List.Item\n {...rowProps}\n title={\n <span className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n {intakeFieldLabel(field, t)}\n {field.required === true ? (\n <Badge\n size=\"sm\"\n variant=\"info\"\n >\n {t(\n 'anamnesis.configEditor.requiredBadge',\n )}\n </Badge>\n ) : null}\n {field.enabled === false ? (\n <Badge\n size=\"sm\"\n variant=\"neutral\"\n >\n {t(\n 'anamnesis.configEditor.archived',\n )}\n </Badge>\n ) : null}\n </span>\n }\n description={[\n fieldTypeLabel(field, t),\n intakeFieldHelp(field, t),\n ]\n .filter(Boolean)\n .join(' · ')}\n trailing={\n <IconButtonGroup\n aria-label={t(\n 'anamnesis.configEditor.rowActions',\n {\n name: intakeFieldLabel(\n field,\n t,\n ),\n },\n )}\n >\n {handle}\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={\n <Pencil aria-hidden=\"true\" />\n }\n aria-label={t(\n 'anamnesis.configEditor.edit',\n {\n name: intakeFieldLabel(\n field,\n t,\n ),\n },\n )}\n onClick={() =>\n setEditing({\n kind: 'field',\n sectionKey: section.key,\n entry: field,\n })\n }\n />\n {field.enabled === false ? (\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={\n <ArchiveRestore aria-hidden=\"true\" />\n }\n aria-label={t(\n 'anamnesis.configEditor.restore',\n {\n name: intakeFieldLabel(\n field,\n t,\n ),\n },\n )}\n onClick={() =>\n setEnabled(\n {\n kind: 'field',\n sectionKey:\n section.key,\n entry: field,\n },\n undefined,\n )\n }\n />\n ) : (\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={\n <Archive aria-hidden=\"true\" />\n }\n aria-label={t(\n 'anamnesis.configEditor.archive',\n {\n name: intakeFieldLabel(\n field,\n t,\n ),\n },\n )}\n onClick={() =>\n setEnabled(\n {\n kind: 'field',\n sectionKey:\n section.key,\n entry: field,\n },\n false,\n )\n }\n />\n )}\n </IconButtonGroup>\n }\n />\n )}\n </AnamnesisReorderRow>\n ))}\n </List>\n </AnamnesisReorderGroup>\n ) : null}\n {/* Free-form add stays visually secondary: the\n curated-vs-free-form question (0.3) is open, and\n the kit-seeded set is the primary story. */}\n <div>\n <Button\n intent=\"ghost\"\n size=\"sm\"\n startIcon={<Plus aria-hidden=\"true\" />}\n onClick={() =>\n setAdding({\n kind: 'field',\n sectionKey: section.key,\n })\n }\n >\n {t('anamnesis.configEditor.addQuestion')}\n </Button>\n </div>\n </section>\n )}\n </AnamnesisReorderRow>\n );\n },\n )}\n </AnamnesisReorderGroup>\n <div>\n <Button\n intent=\"outline\"\n size=\"sm\"\n startIcon={<Plus aria-hidden=\"true\" />}\n onClick={() => setAdding({ kind: 'section' })}\n >\n {t('anamnesis.configEditor.addSection')}\n </Button>\n </div>\n </div>\n </Tabs.Content>\n\n {/* ------------------------- Parameters ------------------------- */}\n <Tabs.Content value=\"parameters\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)] ds:pt-[var(--spacing-md)]\">\n <p className=\"type-meta ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {`${t('anamnesis.configEditor.panelLive', {\n count: liveParameters,\n })} · ${t('anamnesis.configEditor.panelArchived', {\n count: allParameters - liveParameters,\n })}`}\n </p>\n {GROUPS.map((group) => {\n const displayed = allParametersIncludingArchived(\n config,\n group,\n );\n if (displayed.length === 0) return null;\n return (\n <section\n key={group}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n <h3 className=\"type-title-item ds:m-0 ds:text-[color:var(--foreground)]\">\n {t(`anamnesis.group.${group}`)}\n </h3>\n <AnamnesisReorderGroup\n count={displayed.length}\n onReorder={(from, to) =>\n reorderParameter(group, from, to)\n }\n t={t}\n >\n <List divider=\"divided\">\n {displayed.map((def, index) => {\n const meta = [\n parameterRangeText(def, t),\n t(\n `anamnesis.configEditor.direction.${def.betterDirection}`,\n ),\n def.locked\n ? t('anamnesis.configEditor.lockedHint')\n : null,\n ]\n .filter(Boolean)\n .join(' · ');\n return (\n <AnamnesisReorderRow\n key={def.key}\n index={index}\n label={parameterLabelWithUnit(def, t)}\n >\n {({ rowProps, handle }) => (\n <List.Item\n {...rowProps}\n title={\n <span className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n {parameterLabelWithUnit(def, t)}\n {def.locked ? (\n <Badge\n size=\"sm\"\n variant=\"neutral\"\n leading={\n <Lock aria-hidden=\"true\" />\n }\n >\n {t('anamnesis.configEditor.locked')}\n </Badge>\n ) : null}\n {def.enabled === false ? (\n <Badge size=\"sm\" variant=\"neutral\">\n {t(\n 'anamnesis.configEditor.archived',\n )}\n </Badge>\n ) : null}\n </span>\n }\n description={meta}\n trailing={\n <IconButtonGroup\n aria-label={t(\n 'anamnesis.configEditor.rowActions',\n {\n name: parameterLabelWithUnit(\n def,\n t,\n ),\n },\n )}\n >\n {handle}\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<Pencil aria-hidden=\"true\" />}\n aria-label={t(\n 'anamnesis.configEditor.edit',\n {\n name: parameterLabelWithUnit(\n def,\n t,\n ),\n },\n )}\n onClick={() =>\n setEditing({\n kind: 'parameter',\n entry: def,\n })\n }\n />\n {def.locked ? null : def.enabled ===\n false ? (\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={\n <ArchiveRestore aria-hidden=\"true\" />\n }\n aria-label={t(\n 'anamnesis.configEditor.restore',\n {\n name: parameterLabelWithUnit(\n def,\n t,\n ),\n },\n )}\n onClick={() =>\n setEnabled(\n {\n kind: 'parameter',\n entry: def,\n },\n undefined,\n )\n }\n />\n ) : (\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={\n <Archive aria-hidden=\"true\" />\n }\n aria-label={t(\n 'anamnesis.configEditor.archive',\n {\n name: parameterLabelWithUnit(\n def,\n t,\n ),\n },\n )}\n onClick={() =>\n setEnabled(\n {\n kind: 'parameter',\n entry: def,\n },\n false,\n )\n }\n />\n )}\n </IconButtonGroup>\n }\n />\n )}\n </AnamnesisReorderRow>\n );\n })}\n </List>\n </AnamnesisReorderGroup>\n </section>\n );\n })}\n <div>\n <Button\n intent=\"outline\"\n size=\"sm\"\n startIcon={<Plus aria-hidden=\"true\" />}\n onClick={() => setAdding({ kind: 'parameter' })}\n >\n {t('anamnesis.configEditor.addParameter')}\n </Button>\n </div>\n </div>\n </Tabs.Content>\n\n {/* ------------------------- Pathologies ------------------------ */}\n <Tabs.Content value=\"pathologies\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:pt-[var(--spacing-md)]\">\n <p className=\"type-meta ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {`${t('anamnesis.configEditor.panelLive', {\n count: livePathologies,\n })} · ${t('anamnesis.configEditor.panelArchived', {\n count: allPathologies - livePathologies,\n })}`}\n </p>\n <List divider=\"divided\">\n {allPathologiesIncludingArchived(config).map((code) => {\n const isHeading = config.pathologies.some(\n (candidate) =>\n candidate.parentCode === code.code &&\n candidate.enabled !== false,\n );\n const meta = [\n code.parentCode\n ? t('anamnesis.configEditor.subCodeOf', {\n code: code.parentCode,\n })\n : null,\n isHeading\n ? t('anamnesis.configEditor.familyHeading')\n : null,\n ]\n .filter(Boolean)\n .join(' · ');\n return (\n <List.Item\n key={code.code}\n title={\n <span className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n {pathologyCodeWithLabel(code.code, t, code)}\n {code.enabled === false ? (\n <Badge size=\"sm\" variant=\"neutral\">\n {t('anamnesis.configEditor.archived')}\n </Badge>\n ) : null}\n </span>\n }\n description={meta || undefined}\n trailing={\n <IconButtonGroup\n aria-label={t('anamnesis.configEditor.rowActions', {\n name: pathologyCodeWithLabel(code.code, t, code),\n })}\n >\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<Pencil aria-hidden=\"true\" />}\n aria-label={t('anamnesis.configEditor.edit', {\n name: pathologyCodeWithLabel(\n code.code,\n t,\n code,\n ),\n })}\n onClick={() =>\n setEditing({ kind: 'pathology', entry: code })\n }\n />\n {code.enabled === false ? (\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<ArchiveRestore aria-hidden=\"true\" />}\n aria-label={t(\n 'anamnesis.configEditor.restore',\n {\n name: pathologyCodeWithLabel(\n code.code,\n t,\n code,\n ),\n },\n )}\n onClick={() =>\n setEnabled(\n { kind: 'pathology', entry: code },\n undefined,\n )\n }\n />\n ) : (\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<Archive aria-hidden=\"true\" />}\n aria-label={t(\n 'anamnesis.configEditor.archive',\n {\n name: pathologyCodeWithLabel(\n code.code,\n t,\n code,\n ),\n },\n )}\n onClick={() =>\n setEnabled(\n { kind: 'pathology', entry: code },\n false,\n )\n }\n />\n )}\n </IconButtonGroup>\n }\n />\n );\n })}\n </List>\n <div>\n <Button\n intent=\"outline\"\n size=\"sm\"\n startIcon={<Plus aria-hidden=\"true\" />}\n onClick={() => setAdding({ kind: 'pathology' })}\n >\n {t('anamnesis.configEditor.addCode')}\n </Button>\n </div>\n </div>\n </Tabs.Content>\n {/* -------------------------- Targets --------------------------- */}\n {/* The practice's tracked goals — WHICH parameters ride the goals\n strip. Membership only: each patient's target VALUE is set on\n the goal tile above the record, where the current-vs-target\n status is read. Computed BMI is a perfectly valid goal — the\n rows are the live capture set, computed included. */}\n <Tabs.Content value=\"targets\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)] ds:pt-[var(--spacing-md)]\">\n <p className=\"type-meta ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.configEditor.panelTracked', {\n count: trackedGoals,\n })}\n </p>\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.configEditor.targetsIntro')}\n </p>\n {GROUPS.map((group) => {\n const live = configuredParameters(config, group);\n if (live.length === 0) return null;\n return (\n <section\n key={group}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n <h3 className=\"type-title-item ds:m-0 ds:text-[color:var(--foreground)]\">\n {t(`anamnesis.group.${group}`)}\n </h3>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {live.map((def) => (\n <Switch\n key={def.key}\n label={parameterLabelWithUnit(def, t)}\n checked={def.goal === true}\n onCheckedChange={(checked) =>\n patchParameters((candidate) =>\n candidate.key === def.key\n ? { ...candidate, goal: checked === true }\n : candidate,\n )\n }\n />\n ))}\n </div>\n </section>\n );\n })}\n </div>\n </Tabs.Content>\n </Tabs>\n </Card.Body>\n </Card>\n\n <EditDialog\n editing={editing}\n onClose={() => setEditing(null)}\n config={config}\n onConfigChange={onConfigChange}\n t={t}\n />\n <AddDialog\n adding={adding}\n onClose={() => setAdding(null)}\n config={config}\n onConfigChange={onConfigChange}\n t={t}\n />\n </div>\n );\n}\n\n/* ------------------------------ Range display ---------------------------- */\n\nfunction parameterRangeText(\n def: NumericParameterDef,\n t: TFunction,\n): string | null {\n const range = def.referenceRange;\n if (!range) return null;\n if (range.min != null && range.max != null)\n return `${range.min}–${range.max}`;\n if (range.max != null)\n return t('anamnesis.range.atMost', { value: range.max });\n if (range.min != null)\n return t('anamnesis.range.atLeast', { value: range.min });\n return null;\n}\n\n/* ------------------------------- Edit dialog ----------------------------- */\n\n/** Relabel + help. The practice override is stored only when non-empty —\n * clearing the input deletes the override so the kit translation resumes.\n * Help text is offered on INTAKE FIELDS only; no other vocabulary renders it. */\nfunction EditDialog({\n editing,\n onClose,\n config,\n onConfigChange,\n t,\n}: {\n editing: EditTarget | null;\n onClose: () => void;\n config: Required<PracticeAnamnesisConfig>;\n onConfigChange: (next: Required<PracticeAnamnesisConfig>) => void;\n t: TFunction;\n}) {\n // Keyed remount resets the form state whenever a different row opens.\n return (\n <Dialog\n open={editing !== null}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n >\n {editing ? (\n <EditDialogBody\n key={editKeyOf(editing)}\n editing={editing}\n onClose={onClose}\n config={config}\n onConfigChange={onConfigChange}\n t={t}\n />\n ) : null}\n </Dialog>\n );\n}\n\nfunction editKeyOf(editing: EditTarget): string {\n return editing.kind === 'pathology'\n ? `pathology:${editing.entry.code}`\n : editing.kind === 'field'\n ? `field:${editing.sectionKey}:${editing.entry.key}`\n : `${editing.kind}:${editing.entry.key}`;\n}\n\nfunction EditDialogBody({\n editing,\n onClose,\n config,\n onConfigChange,\n t,\n}: {\n editing: EditTarget;\n onClose: () => void;\n config: Required<PracticeAnamnesisConfig>;\n onConfigChange: (next: Required<PracticeAnamnesisConfig>) => void;\n t: TFunction;\n}) {\n const entry = editing.entry;\n const kitLabel = effectiveKitLabel(editing, t);\n const [label, setLabel] = useState(entry.label ?? '');\n const [helpText, setHelpText] = useState(\n editing.kind === 'field' ? (entry.helpText ?? '') : '',\n );\n const [required, setRequired] = useState(\n editing.kind === 'field' && editing.entry.required === true,\n );\n // (Multi-)choice options: editable on PRACTICE-ADDED fields (verbatim\n // wording), read-only on seeded ones (i18n key suffixes — editing them\n // would break every locale's option labels).\n const editableField = editing.kind === 'field' ? editing.entry : null;\n const isChoiceField =\n editableField !== null &&\n (editableField.type === 'choice' || editableField.type === 'multiChoice');\n const optionsEditable =\n isChoiceField && !SEEDED_FIELD_KEYS.has(editableField.key);\n const [options, setOptions] = useState(\n optionsEditable ? (editableField.options ?? []).join(', ') : '',\n );\n const editedOptions = options\n .split(',')\n .map((option) => option.trim())\n .filter(Boolean);\n const optionsValid = !optionsEditable || editedOptions.length > 0;\n\n const save = () => {\n const nextLabel = label.trim();\n const patch = (descriptor: ConfigurableDescriptor) => {\n const next = { ...descriptor };\n if (nextLabel) next.label = nextLabel;\n else delete next.label;\n return next;\n };\n if (editing.kind === 'parameter')\n onConfigChange({\n ...config,\n parameters: config.parameters.map((def) =>\n def.key === editing.entry.key\n ? (patch(def) as NumericParameterDef)\n : def,\n ),\n });\n else if (editing.kind === 'section')\n onConfigChange({\n ...config,\n intakeSections: config.intakeSections.map((section) =>\n section.key === editing.entry.key\n ? (patch(section) as IntakeSectionDef)\n : section,\n ),\n });\n else if (editing.kind === 'field') {\n const nextHelp = helpText.trim();\n onConfigChange({\n ...config,\n intakeSections: config.intakeSections.map((section) =>\n section.key === editing.sectionKey\n ? {\n ...section,\n fields: section.fields.map((field) => {\n if (field.key !== editing.entry.key) return field;\n const next = patch(field) as IntakeFieldDef;\n if (nextHelp) next.helpText = nextHelp;\n else delete next.helpText;\n if (optionsEditable) next.options = editedOptions;\n if (required) next.required = true;\n else delete next.required;\n return next;\n }),\n }\n : section,\n ),\n });\n } else\n onConfigChange({\n ...config,\n pathologies: config.pathologies.map((code) =>\n code.code === (entry as PathologyCode).code\n ? (patch(code) as PathologyCode)\n : code,\n ),\n });\n onClose();\n };\n\n return (\n <Dialog.Content size=\"sm\">\n <Dialog.Header>\n <Dialog.Title>\n {t('anamnesis.configEditor.editTitle', { name: kitLabel })}\n </Dialog.Title>\n <Dialog.Description>\n {editing.kind === 'pathology'\n ? t('anamnesis.configEditor.codeLine', {\n code: (entry as PathologyCode).code,\n })\n : editing.kind === 'field'\n ? `${t('anamnesis.configEditor.keyLine', {\n key: editing.entry.key,\n })} ${t('anamnesis.configEditor.typeLine', {\n type: fieldTypeLabel(editing.entry, t),\n })}`\n : t('anamnesis.configEditor.keyLine', {\n key: (entry as { key: string }).key,\n })}\n </Dialog.Description>\n </Dialog.Header>\n <Dialog.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <FormField\n label={t('anamnesis.configEditor.labelField')}\n description={t('anamnesis.configEditor.labelFieldHelp')}\n >\n <StateBackedTextInput\n value={label}\n onChange={(event) => setLabel(event.target.value)}\n placeholder={kitLabel}\n />\n </FormField>\n {editing.kind === 'field' ? (\n <FormField label={t('anamnesis.configEditor.helpField')} optional>\n <TextArea\n value={helpText}\n onChange={(event) => setHelpText(event.target.value)}\n minRows={2}\n />\n </FormField>\n ) : null}\n {editing.kind === 'field' ? (\n <Switch\n label={t('anamnesis.configEditor.requiredField')}\n checked={required}\n onCheckedChange={(checked) => setRequired(checked === true)}\n />\n ) : null}\n {optionsEditable ? (\n <FormField\n label={t('anamnesis.configEditor.optionsField')}\n description={t('anamnesis.configEditor.optionsFieldHelp')}\n required\n >\n <StateBackedTextInput\n value={options}\n onChange={(event) => setOptions(event.target.value)}\n />\n </FormField>\n ) : isChoiceField ? (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.configEditor.optionsCurrent', {\n list: (editableField.options ?? [])\n .map((opt) =>\n t(`anamnesis.field.${editableField.key}.option.${opt}`, {\n defaultValue: opt,\n }),\n )\n .join(', '),\n })}\n </p>\n ) : null}\n </Dialog.Body>\n <Dialog.Footer>\n <Button intent=\"ghost\" onClick={onClose}>\n {t('anamnesis.configEditor.cancel')}\n </Button>\n <Button intent=\"primary\" onClick={save} disabled={!optionsValid}>\n {t('anamnesis.configEditor.save')}\n </Button>\n </Dialog.Footer>\n </Dialog.Content>\n );\n}\n\n/** The KIT label for a descriptor — what renders when no practice override is\n * set. Used as the label input's placeholder so clearing the field shows what\n * wording resumes. */\nfunction effectiveKitLabel(editing: EditTarget, t: TFunction): string {\n if (editing.kind === 'parameter')\n return parameterLabelWithUnit({ ...editing.entry, label: undefined }, t);\n if (editing.kind === 'section')\n return sectionLabel({ ...editing.entry, label: undefined }, t);\n if (editing.kind === 'field')\n return intakeFieldLabel({ ...editing.entry, label: undefined }, t);\n return pathologyCodeWithLabel(editing.entry.code, t, {\n ...editing.entry,\n label: undefined,\n });\n}\n\n/** Whether an add-dialog type choice needs an options list. */\nfunction isChoiceType(value: AddFieldTypeChoice | ''): boolean {\n return (\n value === 'choice' || value === 'choiceWithText' || value === 'multiChoice'\n );\n}\n\n/* -------------------------------- Add dialog ----------------------------- */\n\n/** Free-form add — the SECONDARY path (decision 0.3, still open: the curated\n * kit-seeded library is the primary story). Keys/codes derive from the label\n * at creation and never change; a free-form entry is practice-local. */\nfunction AddDialog({\n adding,\n onClose,\n config,\n onConfigChange,\n t,\n}: {\n adding: AddTarget | null;\n onClose: () => void;\n config: Required<PracticeAnamnesisConfig>;\n onConfigChange: (next: Required<PracticeAnamnesisConfig>) => void;\n t: TFunction;\n}) {\n return (\n <Dialog\n open={adding !== null}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n >\n {adding ? (\n <AddDialogBody\n key={\n adding.kind === 'field' ? `field:${adding.sectionKey}` : adding.kind\n }\n adding={adding}\n onClose={onClose}\n config={config}\n onConfigChange={onConfigChange}\n t={t}\n />\n ) : null}\n </Dialog>\n );\n}\n\nfunction AddDialogBody({\n adding,\n onClose,\n config,\n onConfigChange,\n t,\n}: {\n adding: AddTarget;\n onClose: () => void;\n config: Required<PracticeAnamnesisConfig>;\n onConfigChange: (next: Required<PracticeAnamnesisConfig>) => void;\n t: TFunction;\n}) {\n const [label, setLabel] = useState('');\n const [group, setGroup] = useState<ParameterGroup | ''>('');\n const [direction, setDirection] = useState<BetterDirection | ''>('');\n const [unit, setUnit] = useState('');\n const [rangeMin, setRangeMin] = useState('');\n const [rangeMax, setRangeMax] = useState('');\n const [precision, setPrecision] = useState<'0' | '1' | '2'>('0');\n const [fieldType, setFieldType] = useState<AddFieldTypeChoice | ''>('');\n const [options, setOptions] = useState('');\n const [helpText, setHelpText] = useState('');\n const [code, setCode] = useState('');\n const [required, setRequired] = useState(false);\n const [parentCode, setParentCode] = useState('');\n\n const groupOptions: SelectOption[] = GROUPS.map((value) => ({\n value,\n label: t(`anamnesis.group.${value}`),\n }));\n const directionOptions: SelectOption[] = DIRECTIONS.map((value) => ({\n value,\n label: t(`anamnesis.configEditor.direction.${value}`),\n }));\n const typeOptions: SelectOption[] = ADD_FIELD_TYPES.map((value) => ({\n value,\n label: t(`anamnesis.configEditor.type.${value}`),\n }));\n const parentOptions: SelectOption[] = config.pathologies\n // Top-level LIVE families only — a new live sub-code under an archived\n // parent would be assignable while its family heading is not offered.\n .filter((candidate) => !candidate.parentCode && candidate.enabled !== false)\n .map((candidate) => ({\n value: candidate.code,\n label: pathologyCodeWithLabel(candidate.code, t, candidate),\n }));\n\n const choiceOptions = options\n .split(',')\n .map((option) => option.trim())\n .filter(Boolean);\n\n const valid =\n adding.kind === 'parameter'\n ? label.trim() !== '' && group !== '' && direction !== ''\n : adding.kind === 'field'\n ? label.trim() !== '' &&\n fieldType !== '' &&\n (!isChoiceType(fieldType) || choiceOptions.length > 0)\n : adding.kind === 'section'\n ? label.trim() !== ''\n : label.trim() !== '' &&\n code.trim() !== '' &&\n // A duplicate code would collide with the existing entry\n // everywhere codes are matched (lookup, archive, edit) —\n // uniqueness is the add gate, matching keyFromLabel's guarantee\n // on the other vocabularies.\n !config.pathologies.some(\n (candidate) =>\n candidate.code.toLowerCase() === code.trim().toLowerCase(),\n );\n\n const save = () => {\n const trimmedLabel = label.trim();\n if (adding.kind === 'parameter') {\n const taken = new Set(config.parameters.map((def) => def.key));\n const parseBound = (raw: string): number | undefined => {\n if (raw.trim() === '') return undefined;\n const value = Number(raw);\n return Number.isFinite(value) ? value : undefined;\n };\n const min = parseBound(rangeMin);\n const max = parseBound(rangeMax);\n const entry: NumericParameterDef = {\n key: keyFromLabel(trimmedLabel, taken),\n label: trimmedLabel,\n group: group as ParameterGroup,\n betterDirection: direction as BetterDirection,\n precision: Number(precision),\n ...(unit.trim() ? { unit: unit.trim() } : {}),\n ...(min != null || max != null\n ? {\n referenceRange: {\n ...(min != null ? { min } : {}),\n ...(max != null ? { max } : {}),\n },\n }\n : {}),\n };\n onConfigChange({ ...config, parameters: [...config.parameters, entry] });\n } else if (adding.kind === 'field') {\n const taken = new Set(\n config.intakeSections.flatMap((section) =>\n section.fields.map((field) => field.key),\n ),\n );\n const resolvedType: IntakeFieldType =\n fieldType === 'numberInteger' || fieldType === 'numberDecimal'\n ? 'number'\n : fieldType === 'choiceWithText'\n ? 'choice'\n : (fieldType as IntakeFieldType);\n const entry: IntakeFieldDef = {\n key: keyFromLabel(trimmedLabel, taken),\n label: trimmedLabel,\n type: resolvedType,\n ...(fieldType === 'numberDecimal' ? { decimal: true } : {}),\n ...(fieldType === 'choiceWithText' ? { detail: true } : {}),\n ...(isChoiceType(fieldType) ? { options: choiceOptions } : {}),\n ...(helpText.trim() ? { helpText: helpText.trim() } : {}),\n ...(required ? { required: true } : {}),\n };\n onConfigChange({\n ...config,\n intakeSections: config.intakeSections.map((section) =>\n section.key === adding.sectionKey\n ? { ...section, fields: [...section.fields, entry] }\n : section,\n ),\n });\n } else if (adding.kind === 'section') {\n const taken = new Set(\n config.intakeSections.map((section) => section.key),\n );\n const entry: IntakeSectionDef = {\n key: keyFromLabel(trimmedLabel, taken),\n label: trimmedLabel,\n fields: [],\n };\n onConfigChange({\n ...config,\n intakeSections: [...config.intakeSections, entry],\n });\n } else {\n const entry: PathologyCode = {\n code: code.trim(),\n label: trimmedLabel,\n ...(parentCode ? { parentCode } : {}),\n };\n onConfigChange({\n ...config,\n pathologies: [...config.pathologies, entry],\n });\n }\n onClose();\n };\n\n const title =\n adding.kind === 'parameter'\n ? t('anamnesis.configEditor.addParameterTitle')\n : adding.kind === 'field'\n ? t('anamnesis.configEditor.addQuestionTitle', {\n section: sectionLabelForKey(config, adding.sectionKey, t),\n })\n : adding.kind === 'section'\n ? t('anamnesis.configEditor.addSectionTitle')\n : t('anamnesis.configEditor.addCodeTitle');\n\n return (\n <Dialog.Content size=\"sm\">\n <Dialog.Header>\n <Dialog.Title>{title}</Dialog.Title>\n <Dialog.Description>\n {t('anamnesis.configEditor.addNote')}\n </Dialog.Description>\n </Dialog.Header>\n <Dialog.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {adding.kind === 'pathology' ? (\n <FormField label={t('anamnesis.configEditor.codeField')} required>\n <StateBackedTextInput\n value={code}\n onChange={(event) => setCode(event.target.value)}\n />\n </FormField>\n ) : null}\n <FormField label={t('anamnesis.configEditor.labelField')} required>\n <StateBackedTextInput\n value={label}\n onChange={(event) => setLabel(event.target.value)}\n />\n </FormField>\n {adding.kind === 'parameter' ? (\n <>\n <FormField label={t('anamnesis.configEditor.groupField')} required>\n <Select\n options={groupOptions}\n value={group}\n onValueChange={(value) => setGroup(value as ParameterGroup)}\n placeholder={t('anamnesis.configEditor.selectPlaceholder')}\n aria-label={t('anamnesis.configEditor.groupField')}\n />\n </FormField>\n <FormField\n label={t('anamnesis.configEditor.directionField')}\n required\n >\n <Select\n options={directionOptions}\n value={direction}\n onValueChange={(value) =>\n setDirection(value as BetterDirection)\n }\n placeholder={t('anamnesis.configEditor.selectPlaceholder')}\n aria-label={t('anamnesis.configEditor.directionField')}\n />\n </FormField>\n <div className=\"ds:grid ds:grid-cols-2 ds:gap-[var(--spacing-md)]\">\n <FormField label={t('anamnesis.configEditor.unitField')} optional>\n <StateBackedTextInput\n value={unit}\n onChange={(event) => setUnit(event.target.value)}\n />\n </FormField>\n <FormField\n label={t('anamnesis.configEditor.precisionField')}\n optional\n >\n <Select\n options={[\n { value: '0', label: '0' },\n { value: '1', label: '1' },\n { value: '2', label: '2' },\n ]}\n value={precision}\n onValueChange={(value) =>\n setPrecision((value || '0') as '0' | '1' | '2')\n }\n aria-label={t('anamnesis.configEditor.precisionField')}\n />\n </FormField>\n </div>\n <div className=\"ds:grid ds:grid-cols-2 ds:gap-[var(--spacing-md)]\">\n <FormField\n label={t('anamnesis.configEditor.rangeMinField')}\n optional\n >\n <StateBackedTextInput\n inputMode=\"decimal\"\n value={rangeMin}\n onChange={(event) => setRangeMin(event.target.value)}\n />\n </FormField>\n <FormField\n label={t('anamnesis.configEditor.rangeMaxField')}\n optional\n >\n <StateBackedTextInput\n inputMode=\"decimal\"\n value={rangeMax}\n onChange={(event) => setRangeMax(event.target.value)}\n />\n </FormField>\n </div>\n </>\n ) : null}\n {adding.kind === 'field' ? (\n <>\n <FormField label={t('anamnesis.configEditor.typeField')} required>\n <Select\n options={typeOptions}\n value={fieldType}\n onValueChange={(value) =>\n setFieldType(value as AddFieldTypeChoice)\n }\n placeholder={t('anamnesis.configEditor.selectPlaceholder')}\n aria-label={t('anamnesis.configEditor.typeField')}\n />\n </FormField>\n {isChoiceType(fieldType) ? (\n <FormField\n label={t('anamnesis.configEditor.optionsField')}\n description={t('anamnesis.configEditor.optionsFieldHelp')}\n required\n >\n <StateBackedTextInput\n value={options}\n onChange={(event) => setOptions(event.target.value)}\n />\n </FormField>\n ) : null}\n <FormField label={t('anamnesis.configEditor.helpField')} optional>\n <TextArea\n value={helpText}\n onChange={(event) => setHelpText(event.target.value)}\n minRows={2}\n />\n </FormField>\n <Switch\n label={t('anamnesis.configEditor.requiredField')}\n checked={required}\n onCheckedChange={(checked) => setRequired(checked === true)}\n />\n </>\n ) : null}\n {adding.kind === 'pathology' ? (\n <FormField\n label={t('anamnesis.configEditor.parentField')}\n description={t('anamnesis.configEditor.parentFieldHelp')}\n optional\n >\n <Select\n options={parentOptions}\n value={parentCode}\n onValueChange={(value) => setParentCode(value)}\n placeholder={t('anamnesis.configEditor.selectPlaceholder')}\n clearable\n aria-label={t('anamnesis.configEditor.parentField')}\n />\n </FormField>\n ) : null}\n {adding.kind === 'section' ? (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('anamnesis.configEditor.sectionNeedsQuestion')}\n </p>\n ) : null}\n </Dialog.Body>\n <Dialog.Footer>\n <Button intent=\"ghost\" onClick={onClose}>\n {t('anamnesis.configEditor.cancel')}\n </Button>\n <Button intent=\"primary\" onClick={save} disabled={!valid}>\n {t('anamnesis.configEditor.add')}\n </Button>\n </Dialog.Footer>\n </Dialog.Content>\n );\n}\n\nfunction sectionLabelForKey(\n config: Required<PracticeAnamnesisConfig>,\n sectionKey: string,\n t: TFunction,\n): string {\n const section = config.intakeSections.find(\n (candidate) => candidate.key === sectionKey,\n );\n return section ? sectionLabel(section, t) : sectionKey;\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis — the record, as notes on a host's notes timeline */\n/* */\n/* A host that already has a Notes tool does not need a second one. This */\n/* maps the record's two kinds of dated writing — the notes recorded AT a */\n/* visit, and the clinical events recorded AGAINST the record — onto the */\n/* kit's `NotesPanelNote`, so both hosts feed the ONE `NotesPanel` they */\n/* already own instead of each growing a bespoke panel that can drift. */\n/* */\n/* A VISIT NOTE IS A NOTE. Someone wrote prose about a patient on a date; */\n/* it has an author (the practitioner) and it is clinician-only */\n/* (`notes.clinicalNotes` in anamnesis-disclosure.ts), so it carries */\n/* `clinical: true` and earns the card's Clinical badge. */\n/* */\n/* AN EVENT IS NOT. \"Chemotherapy started\" is a dated fact, not writing: */\n/* nobody authored it, and it is not clinician-only. It belongs on the */\n/* same timeline — the whole point is reading a note against what was */\n/* happening — but it must be TELLABLE APART, so it carries no author */\n/* (no avatar, no byline), no Clinical badge, and a one-line body naming */\n/* what kind of thing it was and, when the practice did not decide it, */\n/* who did. */\n/* */\n/* story-only mock — do not promote */\n/* -------------------------------------------------------------------- */\n\nimport type { TFunction } from 'i18next';\nimport type { NotesPanelNote } from '../../components/notes-panel';\nimport { eventDetail } from './anamnesis-events';\nimport { visitNotes, hasVisitNotes } from './anamnesis-visit-note';\nimport type { AnamnesisNoteTarget, AnamnesisRecord } from './anamnesis-types';\n\n/**\n * The note id a target addresses. The host hands this to `NotesPanel`'s\n * `currentNoteId`; the panel marks, scrolls to and focuses that note. Namespaced\n * so anamnesis notes can share a timeline with the host's own without a\n * collision.\n */\nexport function anamnesisNoteId(target: AnamnesisNoteTarget): string {\n return target.kind === 'visit'\n ? `anamnesis-visit-${target.visitId}`\n : `anamnesis-event-${target.eventId}`;\n}\n\n/**\n * The record's notes and events as one timeline, newest first — the order\n * `NotesPanel` documents for `notes` (it re-sorts only to lead with pinned).\n *\n * A host with notes of its own concatenates and re-sorts by `dateIso`: this is\n * a contribution to the patient's timeline, not a replacement for it.\n */\nexport function anamnesisNotes(\n record: AnamnesisRecord,\n t: TFunction,\n): NotesPanelNote[] {\n const fromVisits: NotesPanelNote[] = record.visits\n .filter(hasVisitNotes)\n .map((visit) => ({\n id: anamnesisNoteId({ kind: 'visit', visitId: visit.id }),\n dateIso: visit.dateIso,\n author: visit.practitioner ? { name: visit.practitioner } : undefined,\n clinical: true,\n contentFormat: 'markdown' as const,\n // The visit type leads: in a timeline of dates, \"First visit\" is the\n // thing that tells the reader where in the story they are. Each field\n // label then LEADS its own text rather than owning a line of its own —\n // the card clamps to five lines, and a label on a line by itself spends\n // one of them saying nothing the text below it does not.\n content: [\n `**${t(`anamnesis.visitType.${visit.visitType}`)}**`,\n ...visitNotes(visit).map(\n (note) =>\n `**${t(`anamnesis.field.${note.field}.label`)}** — ${note.text}`,\n ),\n ].join('\\n\\n'),\n }));\n\n const fromEvents: NotesPanelNote[] = (record.events ?? []).map((event) => ({\n id: anamnesisNoteId({ kind: 'event', eventId: event.id }),\n dateIso: event.dateIso,\n // No author and not clinical — see the header. The card renders the date\n // itself, so the body carries the label without repeating it.\n clinical: false,\n // The three channels above are all VISUAL. Without this the card falls back\n // to its own region label, \"Clinical note\", and a screen reader introduces\n // a gym membership as one.\n 'aria-label': t('anamnesis.rail.eventLabel'),\n contentFormat: 'markdown' as const,\n content: `**${t(`anamnesis.event.label.${event.labelKey}`)}** — ${eventDetail(\n event,\n t,\n )}`,\n }));\n\n return [...fromVisits, ...fromEvents].sort((a, b) =>\n b.dateIso.localeCompare(a.dateIso),\n );\n}\n","/** Anamnesis interface resources (ar). */\nexport default {\n anamnesis: {\n mainLabel: 'سجل التاريخ المرضي: {{mode}}',\n mode: {\n intake: 'أخذ التاريخ المرضي',\n compile: 'تعبئة السجل',\n questionnaire: 'الاستبيان',\n readOnly: 'للقراءة فقط',\n },\n common: {\n yes: 'نعم',\n no: 'لا',\n unknown: 'غير معروف',\n notSure: 'غير متأكد',\n choose: 'اختر…',\n details: 'التفاصيل',\n detailsPending: 'يظهر عند الإجابة بـ«نعم»',\n time: 'الوقت',\n whatEaten: 'ماذا تناولت؟',\n },\n header: {\n name: 'الاسم',\n age: 'العمر',\n dob: 'تاريخ الميلاد',\n visitDate: 'تاريخ الزيارة',\n years: 'العمر بالسنوات: {{age}}',\n },\n origin: {\n fromPatient: 'من المريض',\n },\n delta: {\n improved: 'تحسّن',\n worsened: 'تدهور',\n unchanged: 'دون تغيير',\n aria: '{{valence}}: {{change}}',\n },\n range: {\n aboveRange: 'أعلى من النطاق',\n belowRange: 'أدنى من النطاق',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: 'القياسات الجسمية',\n dietary: 'المدخول الغذائي',\n lab: 'تحاليل الدم',\n },\n visitType: {\n first: 'الزيارة الأولى',\n followUp: 'متابعة',\n },\n section: {\n evolution: 'التطوّر',\n reason: 'سبب الزيارة',\n pharmacological: 'التاريخ الدوائي',\n familyHistory: 'التاريخ العائلي',\n symptoms: 'الأعراض',\n otherHistory: 'تاريخ مرضي آخر',\n dietaryHistory: 'التاريخ الغذائي',\n recall24h: 'استذكار الغذاء خلال 24 ساعة',\n foodFrequency: 'تكرار تناول الأطعمة أسبوعيًا',\n visitMeta: 'تفاصيل الزيارة',\n patientIntake: 'التاريخ المرضي المقدم من المريض',\n intakeGaps: 'أسئلة دون إجابة',\n anthropometrics: 'القياسات الجسمية',\n dietary: 'المدخول الغذائي',\n pathologies: 'الأمراض',\n oncological: 'تاريخ الأورام',\n therapy: 'العلاج والمكمّلات الغذائية',\n labs: 'تحاليل الدم',\n fmd: 'برنامج محاكاة الصيام',\n proposal: 'الخطة الغذائية المقترحة والملاحظات',\n annual: 'البرنامج السنوي',\n },\n compile: {\n tabSummary: 'الملخّص',\n tabCompile: 'تعبئة السجل',\n tabEvolution: 'التطوّر',\n viewsLabel: 'عروض السجلّ',\n visitCount: 'عدد الزيارات: {{visits}}',\n bmiInStrip:\n 'يُحسب مؤشر كتلة الجسم من الوزن والطول، ويمكن الاطّلاع عليه في الملخّص أعلى هذا السجل.',\n gapsIntro: 'لم تُجَب هذه الأسئلة الإلزامية. سجّل إجاباتها مع المريض.',\n noIntake: 'لم يرسل المريض استبيانًا.',\n pathologiesLabel: 'الأمراض المسندة إلى المريض',\n pathologiesHelp:\n 'اختر جميع الرموز المنطبقة؛ يمكن إسناد أكثر من رمز إلى المريض.',\n pathologiesPlaceholder: 'البحث عن الرموز…',\n noTherapy: 'لم يُسجَّل علاج أو مكمّلات غذائية.',\n addTherapy: 'إضافة دواء',\n removeTherapy: 'إزالة {{name}}',\n noFmd: 'لم تُسجَّل دورات لمحاكاة الصيام.',\n cycleNumber: 'الدورة {{number}}',\n cycleCompleted: 'مكتملة',\n cycleInProgress: 'قيد التنفيذ',\n blockEmpty: 'لا توجد بيانات مسجّلة',\n blockFilled_one: 'عدد البنود المسجّلة: {{count}}',\n blockFilled_other: 'عدد البنود المسجّلة: {{count}}',\n blockFlagged_one: 'عدد القيم خارج النطاق: {{count}}',\n blockFlagged_other: 'عدد القيم خارج النطاق: {{count}}',\n blockOutstanding_one: 'الأسئلة المتبقية دون إجابة: {{count}}',\n blockOutstanding_other: 'الأسئلة المتبقية دون إجابة: {{count}}',\n blockSettled: 'أُجيب عن جميع الأسئلة',\n addFollowUpVisit: 'إضافة زيارة متابعة',\n blockFilled_zero: 'عدد البنود المسجّلة: {{count}}',\n blockFilled_two: 'عدد البنود المسجّلة: {{count}}',\n blockFilled_few: 'عدد البنود المسجّلة: {{count}}',\n blockFilled_many: 'عدد البنود المسجّلة: {{count}}',\n blockFlagged_zero: 'عدد القيم خارج النطاق: {{count}}',\n blockFlagged_two: 'عدد القيم خارج النطاق: {{count}}',\n blockFlagged_few: 'عدد القيم خارج النطاق: {{count}}',\n blockFlagged_many: 'عدد القيم خارج النطاق: {{count}}',\n blockOutstanding_zero: 'الأسئلة المتبقية دون إجابة: {{count}}',\n blockOutstanding_two: 'الأسئلة المتبقية دون إجابة: {{count}}',\n blockOutstanding_few: 'الأسئلة المتبقية دون إجابة: {{count}}',\n blockOutstanding_many: 'الأسئلة المتبقية دون إجابة: {{count}}',\n },\n compare: {\n visitsLabel: 'الزيارات المقارَنة',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: 'مقارنة {{total}} زيارة · {{from}} – {{to}}',\n minimum: 'تبقى زيارتان على الأقل قيد المقارنة',\n stop: 'إيقاف المقارنة',\n panelTitle: 'مقارنة الزيارات',\n sameVisit: 'اختر زيارتين مختلفتين أو أكثر لعرض التغيّرات.',\n summaryTitle: 'التغيّرات من {{from}} إلى {{to}}',\n tableLabel: 'ما الذي تغيّر بين الزيارات المقارَنة',\n noChanges: 'لا توجد تغيّرات بين هذه الزيارات.',\n noChangesDescription:\n 'سُجِّلت في كل الزيارات القيم والرموز والعلاجات والملاحظات نفسها.',\n present: 'موجود',\n added: 'أُضيف',\n removed: 'أُزيل',\n changed: 'تغيّر',\n notMeasured: 'لم يُقَس',\n category: {\n measurement: 'القياسات',\n pathology: 'الأمراض',\n therapy: 'العلاج',\n note: 'الملاحظات',\n },\n column: {\n item: 'البند',\n change: 'التغيير',\n },\n },\n event: {\n barLabel: 'الأحداث',\n chip: '{{label}} · {{date}}',\n separator: '، ',\n shown: 'خطوط الأحداث المعروضة: {{list}}',\n noneShown: 'لا توجد خطوط أحداث معروضة.',\n external: '{{category}} · سجّله {{source}}',\n category: {\n therapy: 'العلاج',\n diet: 'الحمية',\n fmd: 'برنامج محاكاة الصيام',\n surgery: 'جراحة',\n lifestyle: 'الحياة اليومية',\n },\n label: {\n dietStart: 'بدء الخطة الغذائية للبحر المتوسط',\n fmdCycle: 'دورة محاكاة الصيام',\n gymStart: 'بدء التمرين في النادي الرياضي',\n chemoStart: 'بدء العلاج الكيميائي',\n surgery: 'جراحة المرارة',\n },\n source: {\n oncology: 'طبيب أورام من خارج العيادة',\n },\n },\n grid: {\n parameter: 'المؤشر',\n caption: 'قيم المؤشرات عبر الزيارات، من الأقدم.',\n captionInModule: 'قيم المؤشرات عبر زيارات {{module}}، من الأقدم.',\n target: 'الهدف {{value}} {{unit}}',\n trendLabel: 'اتجاه {{parameter}}',\n trend: 'الاتجاه',\n editable: 'قابل للتعديل',\n editCell: '{{parameter}} — آخر زيارة',\n baselineMerged: 'مدمجة من {{total}} زيارات أولى',\n unlabelledSource: 'أخرى',\n blockVisits_one: 'زيارة واحدة',\n blockVisits_other: '{{count}} زيارة',\n blockVisits_zero: 'لا توجد زيارات',\n blockVisits_two: 'زيارتان',\n blockVisits_few: '{{count}} زيارات',\n blockVisits_many: '{{count}} زيارة',\n },\n pathology: {\n E66: 'السمنة',\n E66_0: 'سمنة ناتجة عن فرط تناول السعرات الحرارية',\n E66_9: 'سمنة غير محددة',\n E11: 'داء السكري من النوع الثاني',\n E11_9: 'داء السكري من النوع الثاني دون مضاعفات',\n E11_6: 'داء السكري من النوع الثاني مع مضاعفات أخرى محددة',\n E78: 'اضطرابات استقلاب البروتين الدهني',\n I10: 'ارتفاع ضغط الدم الأساسي',\n E03: 'قصور الغدة الدرقية',\n K58: 'متلازمة القولون العصبي',\n D50: 'فقر الدم بعوز الحديد',\n E55: 'نقص فيتامين د',\n groupGeneral: 'عام',\n },\n param: {\n weight: 'الوزن',\n height: 'الطول',\n bmi: 'مؤشر كتلة الجسم',\n waist: 'محيط الخصر',\n hips: 'محيط الورك',\n arm: 'محيط الذراع',\n phaseAngle: 'زاوية الطور',\n energy: 'الطاقة اليومية',\n protein: 'البروتين',\n fastingGlucose: 'سكر الدم الصائم',\n hba1c: 'الهيموغلوبين السكري (HbA1c)',\n totalCholesterol: 'الكوليسترول الكلي',\n ldl: 'كوليسترول البروتين الدهني منخفض الكثافة (LDL)',\n hdl: 'كوليسترول البروتين الدهني مرتفع الكثافة (HDL)',\n triglycerides: 'الدهون الثلاثية',\n haemoglobin: 'الهيموغلوبين',\n vitaminD: 'فيتامين د (25-OH)',\n tsh: 'الهرمون المنبّه للغدة الدرقية (TSH)',\n ferritin: 'الفيريتين',\n crp: 'البروتين المتفاعل C',\n creatinine: 'الكرياتينين',\n },\n field: {\n highlighted: 'إجابة مميّزة',\n nutritionalProposal: {\n label: 'الخطة الغذائية المقترحة',\n },\n clinicalNotes: {\n label: 'ملاحظات سريرية',\n },\n reasonForVisit: {\n label: 'سبب الزيارة والأهداف',\n },\n knownConditions: {\n label: 'الأمراض المعروفة',\n },\n dailyMedications: {\n label: 'الأدوية اليومية',\n },\n currentSupplements: {\n label: 'المكمّلات الغذائية الحالية',\n },\n familyParents: {\n label: 'الوالدان',\n },\n familySiblings: {\n label: 'الإخوة والأخوات',\n },\n familyGrandparents: {\n label: 'الأجداد والجدات',\n },\n bloating: {\n label: 'انتفاخ البطن',\n },\n refluxGastritis: {\n label: 'الارتجاع أو التهاب المعدة',\n },\n tiredness: {\n label: 'التعب',\n },\n sleepQuality: {\n label: 'جودة النوم',\n option: {\n good: 'جيدة',\n fair: 'متوسطة',\n poor: 'سيئة',\n },\n },\n sleepDifficulty: {\n label: 'صعوبة الاستغراق في النوم أو الاستيقاظ ليلًا',\n },\n bowelHabits: {\n label: 'نمط التبرّز',\n option: {\n regular: 'منتظم',\n constipated: 'إمساك',\n diarrhoeal: 'إسهال',\n alternating: 'تناوب الإمساك والإسهال',\n },\n },\n stoolCharacteristics: {\n label: 'صفات البراز',\n },\n haemorrhoids: {\n label: 'البواسير',\n },\n diverticula: {\n label: 'الرتوج',\n },\n regularUrination: {\n label: 'انتظام التبوّل',\n },\n menstrualCycle: {\n label: 'الدورة الشهرية',\n option: {\n regular: 'منتظمة',\n irregular: 'غير منتظمة',\n absent: 'منقطعة',\n },\n },\n foodAllergies: {\n label: 'حساسية غذائية',\n },\n drugAllergies: {\n label: 'حساسية دوائية',\n },\n otherAllergies: {\n label: 'أنواع أخرى من الحساسية',\n },\n foodIntolerances: {\n label: 'عدم تحمّل أطعمة',\n },\n smoking: {\n label: 'التدخين',\n option: {\n never: 'لم أدخّن مطلقًا',\n former: 'مدخّن سابق',\n current: 'مدخّن حالي',\n },\n },\n pastSurgery: {\n label: 'عمليات جراحية سابقة',\n },\n pregnancies: {\n label: 'حالات الحمل',\n },\n weightSelf: {\n label: 'الوزن (kg)',\n },\n heightSelf: {\n label: 'الطول (cm)',\n },\n physicalActivity: {\n label: 'النشاط البدني الحالي',\n },\n lifestyle: {\n label: 'نمط الحياة الحالي',\n },\n waterPerDay: {\n label: 'الماء (لتر يوميًا)',\n },\n fizzyDrinks: {\n label: 'المشروبات الغازية',\n option: {\n never: 'أبدًا',\n occasionally: 'أحيانًا',\n daily: 'يوميًا',\n },\n },\n alcohol: {\n label: 'المشروبات الكحولية',\n option: {\n never: 'أبدًا',\n occasionally: 'أحيانًا',\n daily: 'يوميًا',\n },\n },\n coffeePerDay: {\n label: 'القهوة (أكواب يوميًا)',\n },\n coffeeSugar: {\n label: 'هل تضيف السكر إلى القهوة؟',\n option: {\n yes: 'نعم',\n no: 'لا',\n },\n },\n breakfast: {\n label: 'الإفطار',\n },\n morningSnack: {\n label: 'وجبة خفيفة صباحية',\n },\n lunch: {\n label: 'الغداء',\n },\n afternoonSnack: {\n label: 'وجبة خفيفة بعد الظهر',\n },\n dinner: {\n label: 'العشاء',\n },\n afterDinner: {\n label: 'بعد العشاء',\n },\n pulses: {\n label: 'البقوليات (مرات أسبوعيًا)',\n },\n fish: {\n label: 'السمك (مرات أسبوعيًا)',\n detailLabel: 'ما أنواع السمك التي تفضّلها؟',\n },\n eggs: {\n label: 'البيض (مرات أسبوعيًا)',\n },\n meatCuredMeat: {\n label: 'اللحوم واللحوم المقدّدة (مرات أسبوعيًا)',\n detailLabel: 'لحوم حمراء أم بيضاء؟',\n },\n dairy: {\n label: 'منتجات الألبان (مرات أسبوعيًا)',\n detailLabel: 'ما منتجات الألبان التي تفضّلها؟',\n },\n visitType: {\n label: 'نوع الزيارة',\n },\n practitioner: {\n label: 'الممارس الصحي',\n },\n tumourType: {\n label: 'نوع الورم',\n },\n stage: {\n label: 'المرحلة',\n },\n metastases: {\n label: 'النقائل',\n },\n treatmentStatus: {\n label: 'حالة العلاج',\n },\n medName: {\n label: 'الاسم',\n },\n medDose: {\n label: 'الجرعة',\n },\n annualProposed: {\n label: 'مقترح',\n },\n annualAccepted: {\n label: 'مقبول',\n },\n annualDeclineReason: {\n label: 'سبب الرفض',\n },\n },\n questionnaire: {\n overviewTab: 'نظرة عامة',\n noNumeric: {\n title: 'لا توجد بيانات للمقارنة بعد',\n description:\n 'يقارن مخطط الاتجاه الإجابات العددية بين الاستبيانات. عيّن لسؤال نوع «رقم» ووحدة قياس في إعدادات النموذج، ثم أجب عنه مرتين على الأقل.',\n },\n },\n empty: {\n noVisits: {\n title: 'لا توجد زيارات بعد',\n description: 'بعد تسجيل الزيارة الأولى تظهر القيم والاتجاهات هنا.',\n },\n noRecord: {\n title: 'لا يوجد شيء مسجّل بعد',\n description:\n 'لا يحتوي هذا السجل على أي زيارات. أضف الزيارة الأولى لبدء تسجيل المعلومات.',\n create: 'ابدأ الاستبيان الأول',\n createSigned: 'ابدأ مع التوقيع',\n },\n noParameters: {\n title: 'لا توجد قياسات مُعدّة',\n description:\n 'لم تُعدّ هذه العيادة أي قياسات، لذا لا يوجد ما يُعرض بعد.',\n },\n noQuestions: {\n title: 'لا توجد أسئلة للإجابة عنها',\n description:\n 'لا توجد أسئلة نشطة في هذا الاستبيان. اطلب من العيادة تفعيل بعض الأسئلة.',\n },\n },\n visitNote: {\n title: 'ملاحظات الزيارة',\n trigger: 'ملاحظات الزيارة — {{visitType}}، {{date}}',\n openInPanel:\n 'افتح ملاحظات الزيارة — {{visitType}}، {{date}} — في عرض الملاحظات',\n },\n rail: {\n notes: 'الملاحظات والأحداث',\n empty: 'لا توجد ملاحظات ولا أحداث في هذا السجل.',\n eventLabel: 'حدث',\n },\n window: {\n label: 'الزيارات المعروضة',\n pickerTrigger: 'الزيارات · {{shown}} من {{total}}',\n selectAll: 'تحديد الكل',\n showing: 'عرض {{shown}} من {{total}} زيارة · {{from}} – {{to}}',\n showingAll: 'إجمالي الزيارات: {{total}} · {{from}} – {{to}}',\n minimum: 'تبقى زيارة واحدة معروضة على الأقل',\n optionHasNote: '{{label}} · ملاحظة',\n },\n digest: {\n group: {\n reason: 'سبب الزيارة',\n history: 'الأمراض والأدوية',\n flags: 'الأعراض المذكورة',\n habits: 'العادات اليومية',\n },\n nothing: {\n title: 'لا يوجد ما يُلخَّص بعد',\n description:\n 'الإجابات المسجَّلة حتى الآن ليست جزءاً من الملخّص. افتح الاستبيان الكامل أدناه لقراءتها.',\n },\n missing: {\n title_one: 'سؤال إلزامي واحد بلا إجابة',\n title_other: '{{count}} سؤال إلزامي بلا إجابة',\n list: 'ما زال ناقصاً: {{list}}',\n separator: '، ',\n jump: 'انتقل إلى {{field}}',\n title_zero: 'لا توجد أسئلة إلزامية دون إجابة',\n title_two: 'سؤالان إلزاميان بلا إجابة',\n title_few: '{{count}} أسئلة إلزامية بلا إجابة',\n title_many: '{{count}} سؤالًا إلزاميًا بلا إجابة',\n },\n },\n export: {\n tab: {\n evolution: 'التطوّر',\n summary: 'الملخّص',\n compile: 'تعبئة السجل',\n },\n docTab: {\n evolution: 'التطوّر',\n summary: 'ملخّص الاستبيان',\n compile: 'سجل الزيارة',\n },\n docTitle: '{{tab}} — {{patient}}',\n info: 'تفاصيل المستند',\n generated: 'تاريخ الإنشاء',\n audienceLabel: 'نسخة لـ',\n audience: {\n clinician: 'العيادة',\n patient: 'المريض',\n external: 'مختص خارجي',\n },\n visitsLabel: 'الزيارات المدرجة',\n visitsSelected: '{{shown}} من {{total}}',\n visitsAll: 'كل الـ {{total}}',\n withheld: 'بعض التفاصيل السريرية غير مدرجة في هذه النسخة.',\n none: 'لا يوجد شيء مسجَّل.',\n listSeparator: '، ',\n flagged: '{{date}} ({{flag}})',\n column: {\n unit: 'الوحدة',\n referenceRange: 'النطاق المرجعي',\n target: 'الهدف',\n change: 'التغيّر {{from}} → {{to}}',\n outOfRange: 'خارج النطاق',\n question: 'السؤال',\n answer: 'الإجابة',\n source: 'المصدر',\n field: 'الحقل',\n value: 'القيمة',\n flag: 'التنبيه',\n code: 'الرمز',\n description: 'الوصف',\n name: 'الاسم',\n dose: 'الجرعة',\n kind: 'النوع',\n cycle: 'الدورة',\n startDate: 'تاريخ البدء',\n status: 'الحالة',\n notes: 'الملاحظات',\n note: 'ملاحظة',\n text: 'النص',\n },\n control: {\n trigger: 'تصدير ومشاركة',\n triggerLabel: 'تصدير ومشاركة عرض {{tab}}',\n triggerLabelAudience: 'تصدير ومشاركة عرض {{tab}}، {{audience}}',\n audienceBadge: 'نسخة المريض',\n menuLabel: 'عرض {{tab}}',\n everyVisit: 'تضمين كل الزيارات، وليس الأعمدة المعروضة فقط',\n excludes: 'نسخة المريض تستبعد: {{list}}',\n excludesNone: 'نسخة المريض من هذا العرض لا تستبعد شيئاً.',\n holds: 'نسخة العيادة تحتوي على السجلّ الكامل، بما في ذلك: {{list}}.',\n holdsNone: 'لا شيء في هذا العرض تستبعده نسخة المريض.',\n share: 'مشاركة…',\n pdf: 'تنزيل PDF',\n print: 'طباعة',\n xlsx: 'تنزيل Excel (.xlsx)',\n csv: 'تنزيل CSV (.csv)',\n printFrame: 'مستند الطباعة (بلا محتوى مرئي)',\n printing: 'يجري فتح نافذة طباعة المستند.',\n ready: '{{file}} جاهز.',\n failed: 'تعذّر على هذا المتصفح تجهيز الملف.',\n },\n share: {\n title: 'مشاركة عرض {{tab}}',\n mockBadge: 'معاينة فقط',\n subtitle: 'اختر لمن ستكون النسخة، وشاهد ما الذي ستحتويه.',\n noticeTitle: 'لا يُرسَل أي شيء من هذه الشاشة',\n notice:\n 'توضّح هذه المعاينة شكل المشاركة فقط، ولا ترسل أي شيء. تتطلّب المشاركة الفعلية رابطًا موقّعًا محدّد الصلاحية، وموافقة المريض، وسجلًا يبيّن من استلم ماذا وعبر أي قناة. تُدار هذه المتطلبات خارج هذا السجل.',\n audienceLabel: 'لمن ستكون هذه النسخة؟',\n includes: 'ستحتوي هذه النسخة على',\n includesNone: 'هذا العرض لا يُنتج أي مستند لهذا المستلم.',\n excludes: 'ستستبعد هذه النسخة',\n excludesNone: 'هذه النسخة لا تستبعد شيئاً.',\n cancel: 'إلغاء',\n confirm: 'تأكيد المستلم',\n confirmed: 'تم ضبط المستلم على {{audience}}. لم يُرسَل أي شيء.',\n },\n concept: {\n lab_values: 'قيم تحاليل الدم',\n pathology_codes: 'الرموز التشخيصية',\n oncological_history: 'تاريخ الأورام',\n notes_clinicalNotes: 'الملاحظات السريرية',\n export_tabDocument: 'المستند نفسه',\n patient_identity: 'هوية المريض',\n intake_answers: 'إجابات الاستبيان',\n visit_date: 'تواريخ الزيارات',\n visit_type: 'نوع الزيارة',\n visit_practitioner: 'الممارس الصحي',\n visit_reasonCode: 'الرمز الدال على سبب الزيارة',\n anthropometrics_values: 'القياسات الجسمية',\n dietary_intake: 'المدخول الغذائي',\n derived_bmi: 'مؤشر كتلة الجسم',\n therapy_entries: 'العلاج والمكمّلات الغذائية',\n fmd_cycles: 'دورات محاكاة الصيام',\n annual_programme: 'البرنامج السنوي',\n notes_nutritionalProposal: 'الخطة الغذائية المقترحة',\n symptom_observations: 'ملاحظات الممارس الصحي',\n compare_diff: 'مقارنة الزيارات',\n visit_note: 'ملاحظات الزيارة',\n event_timeline: 'التسلسل الزمني للأحداث السريرية',\n export_workbook: 'مصنف السجل الكامل',\n },\n source: {\n patient: 'المريض',\n clinician: 'الممارس الصحي',\n },\n },\n medKind: {\n medication: 'دواء',\n supplement: 'مكمّل غذائي',\n },\n intake: {\n title: 'استبيان ما قبل الزيارة',\n subtitle: 'يرجى تعبئة هذا الاستبيان قبل زيارتك الأولى.',\n sectionsLabel: 'أقسام الاستبيان',\n answered: 'الأسئلة التي تمت الإجابة عنها: {{answered}} من {{total}}',\n sectionProgress: 'أُجيب عن {{answered}} من {{total}}',\n submit: 'حفظ',\n unsentNotice: 'تُسجَّل إجاباتك عند إرسال هذا الاستبيان.',\n submittedNotice: 'تم حفظ الإجابات.',\n },\n configEditor: {\n title: 'إعدادات التاريخ المرضي',\n intro:\n 'مصطلحات العيادة: أعد التسمية أو الترتيب، أو أرشف البنود أو أضفها. الأرشفة لا تحذف البيانات؛ تبقى الإجابات المسجّلة في السجل.',\n tabsLabel: 'قوائم مصطلحات الإعدادات',\n tabQuestionnaire: 'الاستبيان',\n tabParameters: 'المؤشرات',\n tabPathologies: 'الأمراض',\n tabTargets: 'الأهداف',\n targetsIntro:\n 'اختر المؤشرات التي تتابعها العيادة كأهداف. تظهر في بطاقات الأهداف أعلى السجل، حيث تُحدَّد القيمة المستهدفة لكل مريض وتُقارَن بالقيمة الحالية.',\n panelTracked_one: 'عدد المؤشرات المتابَعة كأهداف: {{count}}',\n panelTracked_other: 'عدد المؤشرات المتابَعة كأهداف: {{count}}',\n panelLive_one: 'عدد البنود النشطة: {{count}}',\n panelLive_other: 'عدد البنود النشطة: {{count}}',\n panelArchived_one: 'عدد البنود المؤرشفة: {{count}}',\n panelArchived_other: 'عدد البنود المؤرشفة: {{count}}',\n panelNotCaptured_one: 'البنود غير المعروضة عند إدخال البيانات: {{count}}',\n panelNotCaptured_other:\n 'البنود غير المعروضة عند إدخال البيانات: {{count}}',\n locked: 'مقفل',\n lockedHint:\n 'يُستخدم لحساب مؤشر كتلة الجسم؛ يمكن إعادة تسميته أو ترتيبه، ولا يمكن إزالته',\n archived: 'مؤرشف',\n rowActions: 'إجراءات {{name}}',\n reorderHandle:\n 'إعادة ترتيب {{name}}. اضغط Alt مع سهم لأعلى أو Alt مع سهم لأسفل للنقل.',\n reorderAnnounce: 'نُقل {{name}} إلى الموضع {{to}} من {{total}}',\n edit: 'تعديل {{name}}',\n archive: 'أرشفة {{name}}',\n restore: 'استعادة {{name}}',\n addQuestion: 'إضافة سؤال',\n addSection: 'إضافة قسم',\n addParameter: 'إضافة مؤشر',\n addCode: 'إضافة رمز',\n sectionEmptyCapture:\n 'لا توجد أسئلة نشطة؛ لن يُعرض هذا القسم عند إدخال البيانات.',\n familyHeading: 'مجموعة ذات رموز فرعية: عنوان لا يمكن إسناده بحد ذاته',\n subCodeOf: 'رمز فرعي من {{code}}',\n direction: {\n down: 'القيمة الأقل أفضل',\n up: 'القيمة الأعلى أفضل',\n toRange: 'القيمة ضمن النطاق أفضل',\n },\n type: {\n text: 'إجابة قصيرة',\n textarea: 'إجابة مطوّلة',\n numberInteger: 'عدد صحيح',\n numberDecimal: 'عدد عشري',\n yesNoDetail: 'نعم / لا',\n choice: 'اختيار واحد',\n choiceWithText: 'اختيار واحد مع نص',\n multiChoice: 'اختيارات متعددة',\n frequency: 'التكرار الأسبوعي',\n meal: 'وجبة',\n },\n typeLine: 'نوع الإجابة: {{type}}.',\n requiredBadge: 'إلزامي',\n requiredField: 'الإجابة إلزامية',\n optionsCurrent: 'الخيارات: {{list}}.',\n editTitle: 'تعديل {{name}}',\n keyLine: 'المعرّف: {{key}}، يُحدَّد عند الإنشاء ولا يتغيّر.',\n codeLine: 'الرمز: {{code}}، يُحدَّد عند الإنشاء ولا يتغيّر.',\n labelField: 'التسمية',\n labelFieldHelp: 'اتركه فارغًا لاستخدام الصياغة الافتراضية.',\n helpField: 'نص المساعدة',\n addNote:\n 'البند المضاف بنص حر يخص هذه العيادة فقط، ولا يُضاف إلى قائمة مصطلحات مشتركة.',\n addParameterTitle: 'إضافة مؤشر',\n addQuestionTitle: 'إضافة سؤال إلى {{section}}',\n addSectionTitle: 'إضافة قسم',\n addCodeTitle: 'إضافة رمز مرض',\n codeField: 'الرمز',\n groupField: 'المجموعة',\n directionField: 'اتجاه التحسّن',\n unitField: 'الوحدة',\n precisionField: 'المنازل العشرية',\n rangeMinField: 'الحد الأدنى المرجعي',\n rangeMaxField: 'الحد الأعلى المرجعي',\n typeField: 'نوع الإجابة',\n optionsField: 'الخيارات',\n optionsFieldHelp:\n 'أدخل خيارًا واحدًا على الأقل، وافصل بين الخيارات بفواصل.',\n parentField: 'المجموعة الرئيسية',\n parentFieldHelp:\n 'إضافة رمز فرعي تجعل مجموعته عنوانًا لا يمكن إسناده بحد ذاته.',\n sectionNeedsQuestion:\n 'يظهر القسم الجديد في الاستبيان عندما يحتوي على سؤال نشط واحد على الأقل.',\n selectPlaceholder: 'اختر…',\n save: 'حفظ',\n cancel: 'إلغاء',\n add: 'إضافة',\n panelTracked_zero: 'عدد المؤشرات المتابَعة كأهداف: {{count}}',\n panelTracked_two: 'عدد المؤشرات المتابَعة كأهداف: {{count}}',\n panelTracked_few: 'عدد المؤشرات المتابَعة كأهداف: {{count}}',\n panelTracked_many: 'عدد المؤشرات المتابَعة كأهداف: {{count}}',\n panelLive_zero: 'عدد البنود النشطة: {{count}}',\n panelLive_two: 'عدد البنود النشطة: {{count}}',\n panelLive_few: 'عدد البنود النشطة: {{count}}',\n panelLive_many: 'عدد البنود النشطة: {{count}}',\n panelArchived_zero: 'عدد البنود المؤرشفة: {{count}}',\n panelArchived_two: 'عدد البنود المؤرشفة: {{count}}',\n panelArchived_few: 'عدد البنود المؤرشفة: {{count}}',\n panelArchived_many: 'عدد البنود المؤرشفة: {{count}}',\n panelNotCaptured_zero:\n 'البنود غير المعروضة عند إدخال البيانات: {{count}}',\n panelNotCaptured_two: 'البنود غير المعروضة عند إدخال البيانات: {{count}}',\n panelNotCaptured_few: 'البنود غير المعروضة عند إدخال البيانات: {{count}}',\n panelNotCaptured_many:\n 'البنود غير المعروضة عند إدخال البيانات: {{count}}',\n },\n targets: {\n title: 'الأهداف التغذوية',\n tileLabel: 'الهدف الخاص بـ{{name}}',\n now: 'حاليًا {{value}}',\n nowBanded: 'حاليًا {{value}} · {{band}}',\n nowUnset: 'لم يُقَس بعد',\n unset: 'لا يوجد هدف',\n status: {\n onTarget: 'ضمن الهدف',\n approaching: 'يقترب من الهدف',\n offTarget: 'بعيد عن الهدف',\n },\n edit: 'تعديل الهدف: {{parameter}}',\n editTitle: 'الهدف: {{parameter}}',\n editField: 'هدف جديد',\n bounds: 'ضمن {{range}}',\n outOfBounds: 'أدخل هدفًا ضمن {{range}}.',\n unsaved: 'لم يُحفظ بعد',\n save: 'حفظ الهدف',\n clear: 'مسح الهدف',\n },\n summary: {\n fullQuestionnaire: 'الاستبيان الكامل',\n noAnswers: 'لم تُسجَّل أي إجابات بعد.',\n jump: 'أجب عن {{field}} في تبويب «تعبئة السجل»',\n },\n readOnly: {\n subtitle: 'سجل خطة العلاج، للقراءة فقط.',\n summary: 'ملخّص المريض',\n none: 'لا توجد بيانات مسجّلة.',\n perWeek: 'عدد المرات أسبوعيًا: {{times}}',\n },\n },\n} as const;\n","/** Anamnesis interface resources (de). */\nexport default {\n anamnesis: {\n mainLabel: 'Anamneseakte: {{mode}}',\n mode: {\n intake: 'Erstanamnese',\n compile: 'Ausfüllen',\n questionnaire: 'Fragebogen',\n readOnly: 'Schreibgeschützt',\n },\n common: {\n yes: 'Ja',\n no: 'Nein',\n unknown: 'Unbekannt',\n notSure: 'Nicht sicher',\n choose: 'Auswählen …',\n details: 'Details',\n detailsPending: 'Erscheint bei der Antwort „Ja“',\n time: 'Uhrzeit',\n whatEaten: 'Was haben Sie gegessen?',\n },\n header: {\n name: 'Name',\n age: 'Alter',\n dob: 'Geburtsdatum',\n visitDate: 'Untersuchungsdatum',\n years: '{{age}} J.',\n },\n origin: {\n fromPatient: 'Angabe des Patienten',\n },\n delta: {\n improved: 'Verbessert',\n worsened: 'Verschlechtert',\n unchanged: 'Unverändert',\n aria: '{{valence}}: {{change}}',\n },\n range: {\n aboveRange: 'Über dem Referenzbereich',\n belowRange: 'Unter dem Referenzbereich',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: 'Körpermaße',\n dietary: 'Nahrungsaufnahme',\n lab: 'Blutuntersuchungen',\n },\n visitType: {\n first: 'Erstuntersuchung',\n followUp: 'Kontrolluntersuchung',\n },\n medKind: {\n medication: 'Medikament',\n supplement: 'Nahrungsergänzungsmittel',\n },\n section: {\n reason: 'Grund des Besuchs',\n pharmacological: 'Medikamentenanamnese',\n familyHistory: 'Familienanamnese',\n symptoms: 'Symptome',\n otherHistory: 'Weitere Anamnese',\n dietaryHistory: 'Ernährungsanamnese',\n recall24h: '24-Stunden-Ernährungsanamnese',\n foodFrequency: 'Wöchentliche Verzehrhäufigkeit',\n visitMeta: 'Untersuchungsdetails',\n patientIntake: 'Patientenfragebogen',\n intakeGaps: 'Unbeantwortete Fragen',\n anthropometrics: 'Körpermaße',\n dietary: 'Nahrungsaufnahme',\n pathologies: 'Erkrankungen',\n oncological: 'Onkologische Anamnese',\n therapy: 'Therapie und Nahrungsergänzungsmittel',\n labs: 'Blutuntersuchungen',\n fmd: 'Scheinfastenprogramm',\n proposal: 'Ernährungsvorschlag und Notizen',\n annual: 'Jahresprogramm',\n evolution: 'Verlauf',\n },\n intake: {\n title: 'Fragebogen vor dem Besuch',\n subtitle:\n 'Bitte füllen Sie diesen Fragebogen vor Ihrem ersten Besuch aus.',\n sectionsLabel: 'Fragebogenabschnitte',\n answered: 'Beantwortete Fragen: {{answered}} von {{total}}',\n sectionProgress: '{{answered}} von {{total}} beantwortet',\n submit: 'Speichern',\n unsentNotice:\n 'Ihre Antworten werden beim Absenden dieses Fragebogens gespeichert.',\n submittedNotice: 'Antworten gespeichert.',\n },\n compile: {\n tabSummary: 'Zusammenfassung',\n tabCompile: 'Ausfüllen',\n tabEvolution: 'Verlauf',\n viewsLabel: 'Aktenansichten',\n visitCount: 'Besuche: {{visits}}',\n bmiInStrip:\n 'Der BMI wird aus Gewicht und Größe berechnet. Er wird in der Zusammenfassung oben in dieser Akte angezeigt.',\n gapsIntro:\n 'Diese Pflichtfragen wurden nicht beantwortet. Erfassen Sie die Antworten gemeinsam mit dem Patienten.',\n noIntake: 'Der Patient hat keinen Fragebogen eingereicht.',\n pathologiesLabel: 'Zugeordnete Erkrankungen',\n pathologiesHelp:\n 'Wählen Sie alle zutreffenden Codes aus. Einem Patienten können mehrere Codes gleichzeitig zugeordnet sein.',\n pathologiesPlaceholder: 'Codes suchen …',\n noTherapy: 'Keine Therapie oder Nahrungsergänzungsmittel erfasst.',\n addTherapy: 'Medikament hinzufügen',\n removeTherapy: '{{name}} entfernen',\n noFmd: 'Keine Scheinfastenzyklen erfasst.',\n cycleNumber: 'Zyklus {{number}}',\n cycleCompleted: 'Abgeschlossen',\n cycleInProgress: 'Laufend',\n blockEmpty: 'Nichts erfasst',\n blockFilled_one: '{{count}} Eintrag erfasst',\n blockFilled_other: '{{count}} Einträge erfasst',\n blockFlagged_one: '{{count}} außerhalb des Referenzbereichs',\n blockFlagged_other: '{{count}} außerhalb des Referenzbereichs',\n blockOutstanding_one: '{{count}} noch zu beantworten',\n blockOutstanding_other: '{{count}} noch zu beantworten',\n blockSettled: 'Alle beantwortet',\n addFollowUpVisit: 'Kontrolluntersuchung hinzufügen',\n },\n configEditor: {\n title: 'Anamnesekonfiguration',\n intro:\n 'Begriffe Ihrer Praxis: umbenennen, neu anordnen, archivieren oder hinzufügen. Beim Archivieren wird nichts gelöscht. Bereits erfasste Antworten bleiben im Verlauf erhalten.',\n tabsLabel: 'Konfigurierbare Begriffe',\n tabQuestionnaire: 'Fragebogen',\n tabParameters: 'Parameter',\n tabPathologies: 'Erkrankungen',\n tabTargets: 'Ziele',\n targetsIntro:\n 'Wählen Sie die Parameter, die Ihre Praxis als Ziele verfolgt. Sie erscheinen in den Zielkacheln über der Akte. Dort legen Sie die Zielwerte jedes Patienten fest und vergleichen sie mit den aktuellen Werten.',\n panelTracked_one: '{{count}} als Ziel verfolgt',\n panelTracked_other: '{{count}} als Ziele verfolgt',\n panelLive_one: '{{count}} aktiv',\n panelLive_other: '{{count}} aktiv',\n panelArchived_one: '{{count}} archiviert',\n panelArchived_other: '{{count}} archiviert',\n panelNotCaptured_one: '{{count}} bei der Erfassung nicht angeboten',\n panelNotCaptured_other: '{{count}} bei der Erfassung nicht angeboten',\n locked: 'Gesperrt',\n lockedHint:\n 'Wird für die BMI-Berechnung benötigt. Umbenennen und Neuordnen sind möglich, Entfernen nicht.',\n archived: 'Archiviert',\n rowActions: 'Aktionen für {{name}}',\n reorderHandle:\n '{{name}} neu anordnen. Drücken Sie Alt + Pfeil nach oben oder Alt + Pfeil nach unten zum Verschieben.',\n reorderAnnounce: '{{name}} an Position {{to}} von {{total}} verschoben',\n edit: '{{name}} bearbeiten',\n archive: '{{name}} archivieren',\n restore: '{{name}} wiederherstellen',\n addQuestion: 'Frage hinzufügen',\n addSection: 'Abschnitt hinzufügen',\n addParameter: 'Parameter hinzufügen',\n addCode: 'Code hinzufügen',\n sectionEmptyCapture:\n 'Keine aktiven Fragen. Dieser Abschnitt wird bei der Erfassung nicht angeboten.',\n familyHeading:\n 'Gruppe mit Untercodes: Überschrift, die nicht selbst zugeordnet werden kann',\n subCodeOf: 'Untercode von {{code}}',\n direction: {\n down: 'Niedriger ist besser',\n up: 'Höher ist besser',\n toRange: 'Im Referenzbereich ist besser',\n },\n type: {\n text: 'Kurze Antwort',\n textarea: 'Lange Antwort',\n numberInteger: 'Zahl (Ganzzahl)',\n numberDecimal: 'Zahl (Dezimalzahl)',\n yesNoDetail: 'Ja / Nein',\n choice: 'Einfachauswahl',\n choiceWithText: 'Einfachauswahl mit Text',\n multiChoice: 'Mehrfachauswahl',\n frequency: 'Wöchentliche Häufigkeit',\n meal: 'Mahlzeit',\n },\n typeLine: 'Antworttyp: {{type}}.',\n requiredBadge: 'Pflichtfeld',\n requiredField: 'Antwort erforderlich',\n optionsCurrent: 'Auswahlmöglichkeiten: {{list}}.',\n editTitle: '{{name}} bearbeiten',\n keyLine:\n 'Kennung: {{key}}. Wird beim Erstellen festgelegt und ändert sich nicht.',\n codeLine:\n 'Code: {{code}}. Wird beim Erstellen festgelegt und ändert sich nicht.',\n labelField: 'Bezeichnung',\n labelFieldHelp: 'Leer lassen, um den Standardtext zu verwenden.',\n helpField: 'Hilfetext',\n addNote:\n 'Ein frei erstellter Eintrag gilt nur für diese Praxis. Er wird keinem gemeinsamen Begriffsverzeichnis hinzugefügt.',\n addParameterTitle: 'Parameter hinzufügen',\n addQuestionTitle: 'Frage zu {{section}} hinzufügen',\n addSectionTitle: 'Abschnitt hinzufügen',\n addCodeTitle: 'Erkrankungscode hinzufügen',\n codeField: 'Code',\n groupField: 'Gruppe',\n directionField: 'Was als Verbesserung gilt',\n unitField: 'Einheit',\n precisionField: 'Dezimalstellen',\n rangeMinField: 'Unterer Referenzwert',\n rangeMaxField: 'Oberer Referenzwert',\n typeField: 'Antworttyp',\n optionsField: 'Auswahlmöglichkeiten',\n optionsFieldHelp:\n 'Durch Kommas getrennt. Mindestens eine Auswahlmöglichkeit erforderlich.',\n parentField: 'Übergeordnete Gruppe',\n parentFieldHelp:\n 'Durch das Hinzufügen eines Untercodes wird die Gruppe zu einer Überschrift, die nicht mehr direkt zugeordnet werden kann.',\n sectionNeedsQuestion:\n 'Ein neuer Abschnitt erscheint im Fragebogen, sobald er mindestens eine aktive Frage enthält.',\n selectPlaceholder: 'Auswählen …',\n save: 'Speichern',\n cancel: 'Abbrechen',\n add: 'Hinzufügen',\n },\n targets: {\n title: 'Ernährungsziele',\n tileLabel: 'Zielwert für {{name}}',\n now: 'Aktuell {{value}}',\n nowBanded: 'Aktuell {{value}} · {{band}}',\n nowUnset: 'Noch nicht gemessen',\n unset: 'Kein Zielwert',\n status: {\n onTarget: 'Ziel erreicht',\n approaching: 'Nähert sich dem Ziel',\n offTarget: 'Außerhalb des Ziels',\n },\n edit: 'Zielwert bearbeiten: {{parameter}}',\n editTitle: 'Zielwert: {{parameter}}',\n editField: 'Neuer Zielwert',\n bounds: 'Im Bereich {{range}}',\n outOfBounds: 'Geben Sie einen Zielwert im Bereich {{range}} ein.',\n unsaved: 'Noch nicht gespeichert',\n save: 'Zielwert speichern',\n clear: 'Zielwert entfernen',\n },\n summary: {\n fullQuestionnaire: 'Vollständiger Fragebogen',\n noAnswers: 'Es wurden noch keine Antworten erfasst.',\n jump: '{{field}} im Tab „Ausfüllen“ beantworten',\n },\n compare: {\n visitsLabel: 'Verglichene Besuche',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: '{{total}} Besuche im Vergleich · {{from}} – {{to}}',\n minimum:\n 'Mindestens zwei Besuche müssen zum Vergleich ausgewählt bleiben',\n stop: 'Vergleich beenden',\n panelTitle: 'Besuche vergleichen',\n sameVisit:\n 'Wählen Sie mindestens zwei verschiedene Besuche aus, um Änderungen zu sehen.',\n summaryTitle: 'Änderungen von {{from}} bis {{to}}',\n tableLabel: 'Änderungen zwischen den verglichenen Besuchen',\n noChanges: 'Keine Änderungen zwischen diesen Besuchen.',\n noChangesDescription:\n 'Bei allen Besuchen wurden dieselben Messwerte, Codes, Therapien und Notizen erfasst.',\n present: 'Vorhanden',\n added: 'Hinzugefügt',\n removed: 'Entfernt',\n changed: 'Geändert',\n notMeasured: 'Nicht gemessen',\n category: {\n measurement: 'Messwerte',\n pathology: 'Erkrankungen',\n therapy: 'Therapie',\n note: 'Notizen',\n },\n column: {\n item: 'Eintrag',\n change: 'Änderung',\n },\n },\n event: {\n barLabel: 'Ereignisse',\n chip: '{{label}} · {{date}}',\n separator: ', ',\n shown: 'Angezeigte Ereignislinien: {{list}}',\n noneShown: 'Keine Ereignislinien angezeigt.',\n external: '{{category}} · erfasst von {{source}}',\n category: {\n therapy: 'Therapie',\n diet: 'Ernährung',\n fmd: 'Scheinfastenprogramm',\n surgery: 'Operation',\n lifestyle: 'Alltag',\n },\n label: {\n dietStart: 'Mediterraner Ernährungsplan begonnen',\n fmdCycle: 'Scheinfastenzyklus',\n gymStart: 'Training im Fitnessstudio begonnen',\n chemoStart: 'Chemotherapie begonnen',\n surgery: 'Gallenblasenoperation',\n },\n source: {\n oncology: 'einem Onkologen außerhalb dieser Praxis',\n },\n },\n grid: {\n parameter: 'Parameter',\n caption: 'Parameterwerte über mehrere Besuche, ältester Besuch zuerst.',\n captionInModule:\n 'Parameterwerte über mehrere Besuche im Modul {{module}}, ältester Besuch zuerst.',\n target: 'Zielwert {{value}} {{unit}}',\n trendLabel: 'Verlauf von {{parameter}}',\n trend: 'Verlauf',\n editable: 'Bearbeitbar',\n editCell: '{{parameter}}: letzter Besuch',\n baselineMerged: 'Aus {{total}} Erstbesuchen zusammengeführt',\n unlabelledSource: 'Sonstiges',\n blockVisits_one: '{{count}} Besuch',\n blockVisits_other: '{{count}} Besuche',\n },\n readOnly: {\n subtitle: 'Behandlungsplanakte, schreibgeschützt.',\n summary: 'Patientenzusammenfassung',\n none: 'Nichts erfasst.',\n perWeek: 'Häufigkeit pro Woche: {{times}}',\n },\n pathology: {\n E66: 'Adipositas',\n E66_0: 'Adipositas durch übermäßige Kalorienzufuhr',\n E66_9: 'Adipositas, nicht näher bezeichnet',\n E11: 'Diabetes mellitus Typ 2',\n E11_9: 'Diabetes mellitus Typ 2 ohne Komplikationen',\n E11_6:\n 'Diabetes mellitus Typ 2 mit sonstigen näher bezeichneten Komplikationen',\n E78: 'Störungen des Lipoproteinstoffwechsels',\n I10: 'Essenzielle Hypertonie',\n E03: 'Hypothyreose',\n K58: 'Reizdarmsyndrom',\n D50: 'Eisenmangelanämie',\n E55: 'Vitamin-D-Mangel',\n groupGeneral: 'Allgemein',\n },\n param: {\n weight: 'Gewicht',\n height: 'Größe',\n bmi: 'BMI',\n waist: 'Taillenumfang',\n hips: 'Hüftumfang',\n arm: 'Armumfang',\n phaseAngle: 'Phasenwinkel',\n energy: 'Tägliche Energiezufuhr',\n protein: 'Eiweiß',\n fastingGlucose: 'Nüchternblutzucker',\n hba1c: 'HbA1c',\n totalCholesterol: 'Gesamtcholesterin',\n ldl: 'LDL-Cholesterin',\n hdl: 'HDL-Cholesterin',\n triglycerides: 'Triglyzeride',\n haemoglobin: 'Hämoglobin',\n vitaminD: 'Vitamin D (25-OH)',\n tsh: 'TSH',\n ferritin: 'Ferritin',\n crp: 'C-reaktives Protein',\n creatinine: 'Kreatinin',\n },\n field: {\n highlighted: 'Hervorgehoben',\n reasonForVisit: {\n label: 'Grund des Besuchs und Ziele',\n },\n knownConditions: {\n label: 'Bekannte Erkrankungen',\n },\n dailyMedications: {\n label: 'Täglich eingenommene Medikamente',\n },\n currentSupplements: {\n label: 'Aktuell eingenommene Nahrungsergänzungsmittel',\n },\n familyParents: {\n label: 'Eltern',\n },\n familySiblings: {\n label: 'Geschwister',\n },\n familyGrandparents: {\n label: 'Großeltern',\n },\n bloating: {\n label: 'Blähungen',\n },\n refluxGastritis: {\n label: 'Reflux oder Gastritis',\n },\n tiredness: {\n label: 'Müdigkeit',\n },\n sleepQuality: {\n label: 'Schlafqualität',\n option: {\n good: 'Gut',\n fair: 'Mittelmäßig',\n poor: 'Schlecht',\n },\n },\n sleepDifficulty: {\n label: 'Einschlafprobleme oder nächtliches Erwachen',\n },\n bowelHabits: {\n label: 'Stuhlgang',\n option: {\n regular: 'Regelmäßig',\n constipated: 'Verstopfung',\n diarrhoeal: 'Durchfall',\n alternating: 'Wechselnd',\n },\n },\n stoolCharacteristics: {\n label: 'Stuhlbeschaffenheit',\n },\n haemorrhoids: {\n label: 'Hämorrhoiden',\n },\n diverticula: {\n label: 'Divertikel',\n },\n regularUrination: {\n label: 'Regelmäßiges Wasserlassen',\n },\n menstrualCycle: {\n label: 'Menstruationszyklus',\n option: {\n regular: 'Regelmäßig',\n irregular: 'Unregelmäßig',\n absent: 'Ausbleibend',\n },\n },\n foodAllergies: {\n label: 'Lebensmittelallergien',\n },\n drugAllergies: {\n label: 'Medikamentenallergien',\n },\n otherAllergies: {\n label: 'Weitere Allergien',\n },\n foodIntolerances: {\n label: 'Lebensmittelunverträglichkeiten',\n },\n smoking: {\n label: 'Rauchen',\n option: {\n never: 'Nie geraucht',\n former: 'Früher geraucht',\n current: 'Raucht derzeit',\n },\n },\n pastSurgery: {\n label: 'Frühere Operationen',\n },\n pregnancies: {\n label: 'Schwangerschaften',\n },\n weightSelf: {\n label: 'Gewicht (kg)',\n },\n heightSelf: {\n label: 'Größe (cm)',\n },\n physicalActivity: {\n label: 'Aktuelle körperliche Aktivität',\n },\n lifestyle: {\n label: 'Aktueller Lebensstil',\n },\n waterPerDay: {\n label: 'Wasser (Liter pro Tag)',\n },\n fizzyDrinks: {\n label: 'Kohlensäurehaltige Getränke',\n option: {\n never: 'Nie',\n occasionally: 'Gelegentlich',\n daily: 'Täglich',\n },\n },\n alcohol: {\n label: 'Alkohol',\n option: {\n never: 'Nie',\n occasionally: 'Gelegentlich',\n daily: 'Täglich',\n },\n },\n coffeePerDay: {\n label: 'Kaffee (Tassen pro Tag)',\n },\n coffeeSugar: {\n label: 'Kaffee mit Zucker?',\n option: {\n yes: 'Ja',\n no: 'Nein',\n },\n },\n breakfast: {\n label: 'Frühstück',\n },\n morningSnack: {\n label: 'Zwischenmahlzeit am Vormittag',\n },\n lunch: {\n label: 'Mittagessen',\n },\n afternoonSnack: {\n label: 'Zwischenmahlzeit am Nachmittag',\n },\n dinner: {\n label: 'Abendessen',\n },\n afterDinner: {\n label: 'Nach dem Abendessen',\n },\n pulses: {\n label: 'Hülsenfrüchte (Häufigkeit pro Woche)',\n },\n fish: {\n label: 'Fisch (Häufigkeit pro Woche)',\n detailLabel: 'Welche Fischsorten bevorzugen Sie?',\n },\n eggs: {\n label: 'Eier (Häufigkeit pro Woche)',\n },\n meatCuredMeat: {\n label: 'Fleisch und Wurstwaren (Häufigkeit pro Woche)',\n detailLabel: 'Rotes oder weißes Fleisch?',\n },\n dairy: {\n label: 'Milchprodukte (Häufigkeit pro Woche)',\n detailLabel: 'Welche Milchprodukte bevorzugen Sie?',\n },\n visitType: {\n label: 'Art des Besuchs',\n },\n practitioner: {\n label: 'Behandelnde Fachperson',\n },\n tumourType: {\n label: 'Tumorart',\n },\n stage: {\n label: 'Stadium',\n },\n metastases: {\n label: 'Metastasen',\n },\n treatmentStatus: {\n label: 'Behandlungsstatus',\n },\n medName: {\n label: 'Name',\n },\n medDose: {\n label: 'Dosis',\n },\n nutritionalProposal: {\n label: 'Ernährungsvorschlag',\n },\n clinicalNotes: {\n label: 'Klinische Notizen',\n },\n annualProposed: {\n label: 'Vorgeschlagen',\n },\n annualAccepted: {\n label: 'Angenommen',\n },\n annualDeclineReason: {\n label: 'Grund der Ablehnung',\n },\n },\n questionnaire: {\n noNumeric: {\n title: 'Noch nichts zum Vergleichen',\n description:\n 'Der Verlauf vergleicht numerische Antworten aus verschiedenen Fragebögen. Wählen Sie in den Formulareinstellungen für eine Frage den Typ Zahl und eine Einheit und beantworten Sie sie anschließend mindestens zweimal.',\n },\n overviewTab: 'Übersicht',\n },\n empty: {\n noVisits: {\n title: 'Noch keine Besuche',\n description:\n 'Nach dem Erfassen des ersten Besuchs erscheinen hier die Werte und Verläufe.',\n },\n noRecord: {\n title: 'Noch nichts erfasst',\n description:\n 'Diese Akte enthält keine Besuche. Fügen Sie den ersten Besuch hinzu, um Informationen zu erfassen.',\n create: 'Ersten Fragebogen beginnen',\n createSigned: 'Mit Unterschrift beginnen',\n },\n noQuestions: {\n title: 'Keine Fragen zu beantworten',\n description:\n 'Dieser Fragebogen enthält keine aktiven Fragen. Bitten Sie die Praxis, Fragen zu aktivieren.',\n },\n noParameters: {\n title: 'Keine Messparameter eingerichtet',\n description:\n 'Für diese Praxis sind keine Messparameter eingerichtet. Daher können noch keine Verläufe dargestellt werden.',\n },\n },\n visitNote: {\n title: 'Notizen zum Besuch',\n trigger: 'Notizen zum Besuch: {{visitType}}, {{date}}',\n openInPanel:\n 'Notizen zum Besuch {{visitType}}, {{date}} in der Notizansicht öffnen',\n },\n rail: {\n notes: 'Notizen und Ereignisse',\n empty: 'Diese Akte enthält keine Notizen oder Ereignisse.',\n eventLabel: 'Ereignis',\n },\n window: {\n label: 'Angezeigte Besuche',\n pickerTrigger: 'Besuche · {{shown}} von {{total}}',\n selectAll: 'Alle auswählen',\n showing:\n 'Angezeigte Besuche: {{shown}} von {{total}} · {{from}} – {{to}}',\n showingAll: 'Alle Besuche: {{total}} · {{from}} – {{to}}',\n minimum: 'Mindestens ein Besuch muss angezeigt bleiben',\n optionHasNote: '{{label}} · Notiz',\n },\n digest: {\n group: {\n reason: 'Grund des Besuchs',\n history: 'Erkrankungen und Medikamente',\n flags: 'Angegebene Symptome',\n habits: 'Alltagsgewohnheiten',\n },\n nothing: {\n title: 'Noch nichts zum Zusammenfassen',\n description:\n 'Die bisher erfassten Antworten sind nicht Teil der Zusammenfassung. Öffnen Sie unten den vollständigen Fragebogen, um sie zu lesen.',\n },\n missing: {\n title_one: '{{count}} Pflichtfrage noch unbeantwortet',\n title_other: '{{count}} Pflichtfragen noch unbeantwortet',\n list: 'Noch fehlend: {{list}}',\n separator: ', ',\n jump: 'Zu {{field}} wechseln',\n },\n },\n export: {\n tab: {\n summary: 'Zusammenfassung',\n compile: 'Ausfüllen',\n evolution: 'Verlauf',\n },\n docTab: {\n summary: 'Fragebogenzusammenfassung',\n compile: 'Besuchsdokumentation',\n evolution: 'Verlauf',\n },\n docTitle: '{{tab}}: {{patient}}',\n info: 'Dokumentdetails',\n generated: 'Erstellt',\n audienceLabel: 'Kopie für',\n audience: {\n clinician: 'Die Praxis',\n patient: 'Den Patienten',\n external: 'Eine externe Fachperson',\n },\n visitsLabel: 'Enthaltene Besuche',\n visitsSelected: '{{shown}} von {{total}}',\n visitsAll: 'Alle: {{total}}',\n withheld:\n 'Einige klinische Details sind in dieser Kopie nicht enthalten.',\n none: 'Nichts erfasst.',\n listSeparator: ', ',\n flagged: '{{date}} ({{flag}})',\n source: {\n patient: 'Patient',\n clinician: 'Behandelnde Fachperson',\n },\n column: {\n question: 'Frage',\n answer: 'Antwort',\n source: 'Quelle',\n field: 'Feld',\n value: 'Wert',\n unit: 'Einheit',\n referenceRange: 'Referenzbereich',\n flag: 'Markierung',\n target: 'Zielwert',\n change: 'Änderung {{from}} → {{to}}',\n outOfRange: 'Außerhalb des Referenzbereichs',\n code: 'Code',\n description: 'Beschreibung',\n name: 'Name',\n dose: 'Dosis',\n kind: 'Typ',\n cycle: 'Zyklus',\n startDate: 'Startdatum',\n status: 'Status',\n notes: 'Notizen',\n note: 'Notiz',\n text: 'Text',\n },\n control: {\n trigger: 'Exportieren und teilen',\n triggerLabel: 'Ansicht {{tab}} exportieren und teilen',\n triggerLabelAudience:\n 'Ansicht {{tab}} exportieren und teilen, {{audience}}',\n audienceBadge: 'Patientenkopie',\n menuLabel: 'Ansicht {{tab}}',\n everyVisit:\n 'Alle Besuche einschließen, nicht nur die angezeigten Spalten',\n excludes: 'In der Patientenkopie nicht enthalten: {{list}}',\n excludesNone: 'Die Patientenkopie dieser Ansicht enthält alle Angaben.',\n holds:\n 'Die Praxiskopie enthält die vollständige Akte einschließlich {{list}}.',\n holdsNone:\n 'Diese Ansicht enthält keine Angaben, die in einer Patientenkopie ausgelassen würden.',\n share: 'Teilen …',\n pdf: 'PDF herunterladen',\n print: 'Drucken',\n xlsx: 'Excel herunterladen (.xlsx)',\n csv: 'CSV herunterladen (.csv)',\n printFrame: 'Druckdokument (kein sichtbarer Inhalt)',\n printing: 'Das Druckfenster für das Dokument wird geöffnet.',\n ready: '{{file}} ist bereit.',\n failed: 'Dieser Browser konnte die Datei nicht vorbereiten.',\n },\n share: {\n title: 'Ansicht {{tab}} teilen',\n mockBadge: 'Nur Vorschau',\n subtitle:\n 'Wählen Sie den vorgesehenen Empfänger der Kopie und sehen Sie, welche Angaben sie enthalten würde.',\n noticeTitle: 'Über diese Ansicht wird nichts versendet',\n notice:\n 'Diese Vorschau zeigt, welche Inhalte geteilt würden. Für den tatsächlichen Versand sind ein signierter Link mit Ablaufdatum, die Einwilligung des Patienten und ein Versandprotokoll erforderlich. Das Protokoll hält Empfänger, Inhalte und Versandkanal fest. Diese Funktionen liegen außerhalb dieser Akte.',\n audienceLabel: 'Für wen wäre diese Kopie bestimmt?',\n includes: 'Diese Kopie würde enthalten',\n includesNone:\n 'Diese Ansicht erstellt kein Dokument für diesen Empfänger.',\n excludes: 'Diese Kopie würde auslassen',\n excludesNone: 'Diese Kopie enthält alle Angaben.',\n cancel: 'Abbrechen',\n confirm: 'Empfänger bestätigen',\n confirmed:\n 'Empfänger auf {{audience}} festgelegt. Es wurde nichts versendet.',\n },\n concept: {\n patient_identity: 'Patientenstammdaten',\n intake_answers: 'Fragebogenantworten',\n visit_date: 'Besuchsdaten',\n visit_type: 'Art des Besuchs',\n visit_practitioner: 'Behandelnde Fachperson',\n visit_reasonCode: 'Kodierter Besuchsgrund',\n anthropometrics_values: 'Körpermaße',\n dietary_intake: 'Nahrungsaufnahme',\n derived_bmi: 'BMI',\n lab_values: 'Blutwerte',\n pathology_codes: 'Diagnosecodes',\n oncological_history: 'Onkologische Anamnese',\n therapy_entries: 'Therapie und Nahrungsergänzungsmittel',\n fmd_cycles: 'Scheinfastenzyklen',\n annual_programme: 'Jahresprogramm',\n notes_clinicalNotes: 'Klinische Notizen',\n notes_nutritionalProposal: 'Ernährungsvorschlag',\n symptom_observations: 'Beobachtungen der behandelnden Fachperson',\n compare_diff: 'Besuchsvergleich',\n visit_note: 'Notizen zum Besuch',\n event_timeline: 'Zeitlicher Verlauf klinischer Ereignisse',\n export_tabDocument: 'Das Dokument selbst',\n export_workbook: 'Die Arbeitsmappe mit der vollständigen Akte',\n },\n },\n },\n} as const;\n","/** Anamnesis interface resources (el). */\nexport default {\n anamnesis: {\n mainLabel: 'Φάκελος ιστορικού: {{mode}}',\n mode: {\n intake: 'Λήψη ιστορικού',\n compile: 'Συμπλήρωση',\n questionnaire: 'Ερωτηματολόγιο',\n readOnly: 'Μόνο ανάγνωση',\n },\n common: {\n yes: 'Ναι',\n no: 'Όχι',\n unknown: 'Άγνωστο',\n notSure: 'Δεν ξέρω',\n choose: 'Επιλέξτε…',\n details: 'Λεπτομέρειες',\n detailsPending: 'Εμφανίζεται όταν η απάντηση είναι «Ναι»',\n time: 'Ώρα',\n whatEaten: 'Τι φάγατε;',\n },\n header: {\n name: 'Όνομα',\n age: 'Ηλικία',\n dob: 'Ημερομηνία γέννησης',\n visitDate: 'Ημερομηνία επίσκεψης',\n years: 'Ηλικία σε έτη: {{age}}',\n },\n origin: {\n fromPatient: 'Από τον ασθενή',\n },\n delta: {\n improved: 'Βελτίωση',\n worsened: 'Επιδείνωση',\n unchanged: 'Χωρίς μεταβολή',\n aria: '{{valence}}: {{change}}',\n },\n range: {\n aboveRange: 'Πάνω από το εύρος αναφοράς',\n belowRange: 'Κάτω από το εύρος αναφοράς',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: 'Ανθρωπομετρία',\n dietary: 'Διατροφική πρόσληψη',\n lab: 'Εξετάσεις αίματος',\n },\n visitType: {\n first: 'Πρώτη επίσκεψη',\n followUp: 'Επανεξέταση',\n },\n medKind: {\n medication: 'Φάρμακο',\n supplement: 'Συμπλήρωμα διατροφής',\n },\n section: {\n reason: 'Αιτία επίσκεψης',\n pharmacological: 'Φαρμακευτικό ιστορικό',\n familyHistory: 'Οικογενειακό ιστορικό',\n symptoms: 'Συμπτώματα',\n otherHistory: 'Λοιπό ιστορικό',\n dietaryHistory: 'Διατροφικό ιστορικό',\n recall24h: 'Ανάκληση 24ώρου',\n foodFrequency: 'Εβδομαδιαία συχνότητα κατανάλωσης τροφίμων',\n visitMeta: 'Στοιχεία επίσκεψης',\n patientIntake: 'Ερωτηματολόγιο ασθενούς',\n intakeGaps: 'Ερωτήσεις χωρίς απάντηση',\n anthropometrics: 'Ανθρωπομετρία',\n dietary: 'Διατροφική πρόσληψη',\n pathologies: 'Παθήσεις',\n oncological: 'Ογκολογικό ιστορικό',\n therapy: 'Θεραπεία και συμπληρώματα',\n labs: 'Εξετάσεις αίματος',\n fmd: 'Πρόγραμμα δίαιτας μίμησης νηστείας',\n proposal: 'Διατροφική πρόταση και σημειώσεις',\n annual: 'Ετήσιο πρόγραμμα',\n evolution: 'Εξέλιξη',\n },\n intake: {\n title: 'Ερωτηματολόγιο πριν από την επίσκεψη',\n subtitle: 'Συμπληρώστε το πριν από την πρώτη σας επίσκεψη.',\n sectionsLabel: 'Ενότητες ερωτηματολογίου',\n answered: 'Ερωτήσεις που απαντήθηκαν: {{answered}} από {{total}}',\n sectionProgress: 'Απαντήσεις: {{answered}} από {{total}}',\n submit: 'Αποθήκευση',\n unsentNotice:\n 'Οι απαντήσεις σας καταγράφονται όταν υποβάλετε αυτό το ερωτηματολόγιο.',\n submittedNotice: 'Οι απαντήσεις αποθηκεύτηκαν.',\n },\n compile: {\n tabSummary: 'Σύνοψη',\n tabCompile: 'Συμπλήρωση',\n tabEvolution: 'Εξέλιξη',\n viewsLabel: 'Προβολές φακέλου',\n visitCount: 'Επισκέψεις: {{visits}}',\n bmiInStrip:\n 'Ο ΔΜΣ υπολογίζεται από το βάρος και το ύψος και εμφανίζεται στη σύνοψη στο πάνω μέρος αυτού του φακέλου.',\n gapsIntro:\n 'Αυτές οι υποχρεωτικές ερωτήσεις έμειναν χωρίς απάντηση. Καταγράψτε τις απαντήσεις μαζί με τον ασθενή.',\n noIntake: 'Ο ασθενής δεν έχει υποβάλει ερωτηματολόγιο.',\n pathologiesLabel: 'Αντιστοιχισμένες παθήσεις',\n pathologiesHelp:\n 'Επιλέξτε όλους τους κωδικούς που ισχύουν. Ένας ασθενής μπορεί να έχει πολλούς κωδικούς ταυτόχρονα.',\n pathologiesPlaceholder: 'Αναζήτηση κωδικών…',\n noTherapy: 'Δεν έχει καταγραφεί θεραπεία ή συμπλήρωμα.',\n addTherapy: 'Προσθήκη φαρμάκου',\n removeTherapy: 'Αφαίρεση {{name}}',\n noFmd: 'Δεν έχουν καταγραφεί κύκλοι δίαιτας μίμησης νηστείας.',\n cycleNumber: 'Κύκλος {{number}}',\n cycleCompleted: 'Ολοκληρώθηκε',\n cycleInProgress: 'Σε εξέλιξη',\n blockEmpty: 'Καμία καταχώριση',\n blockFilled_one: '{{count}} καταχώριση',\n blockFilled_other: '{{count}} καταχωρίσεις',\n blockFlagged_one: '{{count}} τιμή εκτός εύρους',\n blockFlagged_other: '{{count}} τιμές εκτός εύρους',\n blockOutstanding_one: '{{count}} απομένει για απάντηση',\n blockOutstanding_other: '{{count}} απομένουν για απάντηση',\n blockSettled: 'Απαντήθηκαν όλες',\n addFollowUpVisit: 'Προσθήκη επανεξέτασης',\n },\n configEditor: {\n title: 'Διαμόρφωση ιστορικού',\n intro:\n 'Η ορολογία του ιατρείου σας: μετονομασία, αναδιάταξη, αρχειοθέτηση ή προσθήκη. Η αρχειοθέτηση δεν διαγράφει ποτέ τίποτα: οι απαντήσεις που έχουν ήδη καταγραφεί παραμένουν στο ιστορικό.',\n tabsLabel: 'Ρυθμιζόμενες ορολογίες',\n tabQuestionnaire: 'Ερωτηματολόγιο',\n tabParameters: 'Παράμετροι',\n tabPathologies: 'Παθήσεις',\n tabTargets: 'Στόχοι',\n targetsIntro:\n 'Επιλέξτε τις παραμέτρους που παρακολουθεί το ιατρείο ως στόχους. Εμφανίζονται στα πλακίδια στόχων πάνω από τον φάκελο, όπου ορίζεται η τιμή-στόχος κάθε ασθενούς και φαίνεται η τρέχουσα τιμή σε σχέση με τον στόχο.',\n panelTracked_one: '{{count}} παρακολουθείται ως στόχος',\n panelTracked_other: '{{count}} παρακολουθούνται ως στόχοι',\n panelLive_one: '{{count}} ενεργό',\n panelLive_other: '{{count}} ενεργά',\n panelArchived_one: '{{count}} αρχειοθετημένο',\n panelArchived_other: '{{count}} αρχειοθετημένα',\n panelNotCaptured_one: '{{count}} δεν προσφέρεται κατά τη συμπλήρωση',\n panelNotCaptured_other: '{{count}} δεν προσφέρονται κατά τη συμπλήρωση',\n locked: 'Κλειδωμένη',\n lockedHint:\n 'Χρησιμοποιείται για τον υπολογισμό του ΔΜΣ. Επιτρέπεται η μετονομασία ή η αναδιάταξη, όχι η αφαίρεση',\n archived: 'Αρχειοθετήθηκε',\n rowActions: 'Ενέργειες για {{name}}',\n reorderHandle:\n 'Αναδιάταξη {{name}}. Πατήστε Alt + Πάνω βέλος ή Alt + Κάτω βέλος για μετακίνηση.',\n reorderAnnounce: '{{name}}: μετακινήθηκε στη θέση {{to}} από {{total}}',\n edit: 'Επεξεργασία {{name}}',\n archive: 'Αρχειοθέτηση {{name}}',\n restore: 'Επαναφορά {{name}}',\n addQuestion: 'Προσθήκη ερώτησης',\n addSection: 'Προσθήκη ενότητας',\n addParameter: 'Προσθήκη παραμέτρου',\n addCode: 'Προσθήκη κωδικού',\n sectionEmptyCapture:\n 'Δεν υπάρχουν ενεργές ερωτήσεις: αυτή η ενότητα δεν προσφέρεται κατά τη συμπλήρωση.',\n familyHeading:\n 'Οικογένεια με υποκωδικούς: επικεφαλίδα που δεν αντιστοιχίζεται η ίδια',\n subCodeOf: 'Υποκωδικός του {{code}}',\n direction: {\n down: 'Προτιμάται χαμηλότερη τιμή',\n up: 'Προτιμάται υψηλότερη τιμή',\n toRange: 'Προτιμάται τιμή εντός εύρους αναφοράς',\n },\n type: {\n text: 'Σύντομη απάντηση',\n textarea: 'Εκτενής απάντηση',\n numberInteger: 'Αριθμός (ακέραιος)',\n numberDecimal: 'Αριθμός (δεκαδικός)',\n yesNoDetail: 'Ναι / Όχι',\n choice: 'Μονή επιλογή',\n choiceWithText: 'Μονή επιλογή με κείμενο',\n multiChoice: 'Πολλαπλή επιλογή',\n frequency: 'Εβδομαδιαία συχνότητα',\n meal: 'Γεύμα',\n },\n typeLine: 'Τύπος απάντησης: {{type}}.',\n requiredBadge: 'Υποχρεωτική',\n requiredField: 'Απαιτείται απάντηση',\n optionsCurrent: 'Επιλογές: {{list}}.',\n editTitle: 'Επεξεργασία {{name}}',\n keyLine:\n 'Αναγνωριστικό: {{key}}. Ορίζεται κατά τη δημιουργία και δεν αλλάζει ποτέ.',\n codeLine:\n 'Κωδικός: {{code}}. Ορίζεται κατά τη δημιουργία και δεν αλλάζει ποτέ.',\n labelField: 'Ετικέτα',\n labelFieldHelp:\n 'Αφήστε το κενό για να χρησιμοποιηθεί η τυπική διατύπωση.',\n helpField: 'Κείμενο βοήθειας',\n addNote:\n 'Μια ελεύθερη καταχώριση ισχύει μόνο για αυτό το ιατρείο: δεν προστίθεται σε κοινή ορολογία.',\n addParameterTitle: 'Προσθήκη παραμέτρου',\n addQuestionTitle: 'Προσθήκη ερώτησης στην ενότητα {{section}}',\n addSectionTitle: 'Προσθήκη ενότητας',\n addCodeTitle: 'Προσθήκη κωδικού πάθησης',\n codeField: 'Κωδικός',\n groupField: 'Ομάδα',\n directionField: 'Τι θεωρείται βελτίωση',\n unitField: 'Μονάδα',\n precisionField: 'Δεκαδικά ψηφία',\n rangeMinField: 'Ελάχιστη τιμή αναφοράς',\n rangeMaxField: 'Μέγιστη τιμή αναφοράς',\n typeField: 'Τύπος απάντησης',\n optionsField: 'Επιλογές',\n optionsFieldHelp: 'Διαχωρίστε με κόμματα. Τουλάχιστον μία επιλογή.',\n parentField: 'Γονική οικογένεια',\n parentFieldHelp:\n 'Η προσθήκη υποκωδικού μετατρέπει την οικογένειά του σε επικεφαλίδα που δεν μπορεί πλέον να αντιστοιχιστεί η ίδια.',\n sectionNeedsQuestion:\n 'Μια νέα ενότητα εμφανίζεται στο ερωτηματολόγιο μόλις περιέχει τουλάχιστον μία ενεργή ερώτηση.',\n selectPlaceholder: 'Επιλέξτε…',\n save: 'Αποθήκευση',\n cancel: 'Ακύρωση',\n add: 'Προσθήκη',\n },\n targets: {\n title: 'Διατροφικοί στόχοι',\n tileLabel: 'Στόχος: {{name}}',\n now: 'Τώρα {{value}}',\n nowBanded: 'Τώρα {{value}} · {{band}}',\n nowUnset: 'Δεν έχει μετρηθεί ακόμη',\n unset: 'Χωρίς στόχο',\n status: {\n onTarget: 'Εντός στόχου',\n approaching: 'Πλησιάζει τον στόχο',\n offTarget: 'Εκτός στόχου',\n },\n edit: 'Επεξεργασία στόχου: {{parameter}}',\n editTitle: 'Στόχος: {{parameter}}',\n editField: 'Νέος στόχος',\n bounds: 'Μεταξύ {{range}}',\n outOfBounds: 'Εισαγάγετε στόχο μεταξύ {{range}}.',\n unsaved: 'Δεν έχει αποθηκευτεί ακόμη',\n save: 'Αποθήκευση στόχου',\n clear: 'Κατάργηση στόχου',\n },\n summary: {\n fullQuestionnaire: 'Ολόκληρο το ερωτηματολόγιο',\n noAnswers: 'Δεν έχουν καταγραφεί ακόμη απαντήσεις.',\n jump: 'Απαντήστε στο πεδίο {{field}} στην καρτέλα «Συμπλήρωση»',\n },\n compare: {\n visitsLabel: 'Συγκρινόμενες επισκέψεις',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: 'Συγκρινόμενες επισκέψεις: {{total}} · {{from}} – {{to}}',\n minimum: 'Στη σύγκριση πρέπει να παραμένουν τουλάχιστον δύο επισκέψεις',\n stop: 'Διακοπή σύγκρισης',\n panelTitle: 'Σύγκριση επισκέψεων',\n sameVisit:\n 'Επιλέξτε δύο ή περισσότερες διαφορετικές επισκέψεις για να δείτε τι άλλαξε.',\n summaryTitle: 'Αλλαγές από {{from}} έως {{to}}',\n tableLabel: 'Τι άλλαξε μεταξύ των συγκρινόμενων επισκέψεων',\n noChanges: 'Δεν υπάρχουν αλλαγές μεταξύ αυτών των επισκέψεων.',\n noChangesDescription:\n 'Σε όλες καταγράφηκαν οι ίδιες μετρήσεις, οι ίδιοι κωδικοί, η ίδια θεραπεία και οι ίδιες σημειώσεις.',\n present: 'Υπάρχει',\n added: 'Προστέθηκε',\n removed: 'Αφαιρέθηκε',\n changed: 'Άλλαξε',\n notMeasured: 'Δεν μετρήθηκε',\n category: {\n measurement: 'Μετρήσεις',\n pathology: 'Παθήσεις',\n therapy: 'Θεραπεία',\n note: 'Σημειώσεις',\n },\n column: {\n item: 'Στοιχείο',\n change: 'Μεταβολή',\n },\n },\n event: {\n barLabel: 'Συμβάντα',\n chip: '{{label}} · {{date}}',\n separator: ', ',\n shown: 'Εμφανιζόμενες γραμμές συμβάντων: {{list}}',\n noneShown: 'Δεν εμφανίζονται γραμμές συμβάντων.',\n external: '{{category}} · καταγράφηκε από {{source}}',\n category: {\n therapy: 'Θεραπεία',\n diet: 'Διατροφή',\n fmd: 'Πρόγραμμα δίαιτας μίμησης νηστείας',\n surgery: 'Χειρουργική επέμβαση',\n lifestyle: 'Καθημερινή ζωή',\n },\n label: {\n dietStart: 'Έναρξη μεσογειακού διατροφικού προγράμματος',\n fmdCycle: 'Κύκλος δίαιτας μίμησης νηστείας',\n gymStart: 'Έναρξη γυμναστηρίου',\n chemoStart: 'Έναρξη χημειοθεραπείας',\n surgery: 'Χειρουργική επέμβαση χοληδόχου κύστης',\n },\n source: {\n oncology: 'ογκολόγο εκτός αυτού του ιατρείου',\n },\n },\n grid: {\n parameter: 'Παράμετρος',\n caption: 'Τιμές παραμέτρων ανά επίσκεψη, από την παλαιότερη.',\n captionInModule:\n 'Τιμές παραμέτρων ανά επίσκεψη ({{module}}), από την παλαιότερη.',\n target: 'Στόχος {{value}} {{unit}}',\n trendLabel: 'Τάση: {{parameter}}',\n trend: 'Τάση',\n editable: 'Επεξεργάσιμη',\n editCell: '{{parameter}}: τελευταία επίσκεψη',\n baselineMerged: 'Πρώτες επισκέψεις που συγχωνεύτηκαν: {{total}}',\n unlabelledSource: 'Άλλο',\n blockVisits_one: '{{count}} επίσκεψη',\n blockVisits_other: '{{count}} επισκέψεις',\n },\n readOnly: {\n subtitle: 'Φάκελος σχεδίου θεραπείας: μόνο για ανάγνωση.',\n summary: 'Σύνοψη ασθενούς',\n none: 'Δεν έχει καταγραφεί τίποτα.',\n perWeek: 'Συχνότητα ανά εβδομάδα: {{times}}',\n },\n pathology: {\n E66: 'Παχυσαρκία',\n E66_0: 'Παχυσαρκία οφειλόμενη σε υπερβολική πρόσληψη θερμίδων',\n E66_9: 'Παχυσαρκία, μη καθορισμένη',\n E11: 'Σακχαρώδης διαβήτης τύπου 2',\n E11_9: 'Σακχαρώδης διαβήτης τύπου 2 χωρίς επιπλοκές',\n E11_6: 'Σακχαρώδης διαβήτης τύπου 2 με άλλες καθορισμένες επιπλοκές',\n E78: 'Διαταραχές του μεταβολισμού των λιποπρωτεϊνών',\n I10: 'Ιδιοπαθής (πρωτοπαθής) υπέρταση',\n E03: 'Υποθυρεοειδισμός',\n K58: 'Σύνδρομο ευερέθιστου εντέρου',\n D50: 'Σιδηροπενική αναιμία',\n E55: 'Ανεπάρκεια βιταμίνης D',\n groupGeneral: 'Γενικά',\n },\n param: {\n weight: 'Βάρος',\n height: 'Ύψος',\n bmi: 'ΔΜΣ',\n waist: 'Περίμετρος μέσης',\n hips: 'Περίμετρος ισχίων',\n arm: 'Περίμετρος βραχίονα',\n phaseAngle: 'Γωνία φάσης',\n energy: 'Ημερήσια ενέργεια',\n protein: 'Πρωτεΐνη',\n fastingGlucose: 'Γλυκόζη νηστείας',\n hba1c: 'Γλυκοζυλιωμένη αιμοσφαιρίνη (HbA1c)',\n totalCholesterol: 'Ολική χοληστερόλη',\n ldl: 'Χοληστερόλη LDL',\n hdl: 'Χοληστερόλη HDL',\n triglycerides: 'Τριγλυκερίδια',\n haemoglobin: 'Αιμοσφαιρίνη',\n vitaminD: 'Βιταμίνη D (25-OH)',\n tsh: 'Θυρεοειδοτρόπος ορμόνη (TSH)',\n ferritin: 'Φερριτίνη',\n crp: 'C-αντιδρώσα πρωτεΐνη',\n creatinine: 'Κρεατινίνη',\n },\n field: {\n highlighted: 'Επισημασμένη',\n reasonForVisit: {\n label: 'Αιτία επίσκεψης και στόχοι',\n },\n knownConditions: {\n label: 'Γνωστές παθήσεις',\n },\n dailyMedications: {\n label: 'Φάρμακα καθημερινής λήψης',\n },\n currentSupplements: {\n label: 'Τρέχοντα συμπληρώματα διατροφής',\n },\n familyParents: {\n label: 'Γονείς',\n },\n familySiblings: {\n label: 'Αδέλφια',\n },\n familyGrandparents: {\n label: 'Παππούδες και γιαγιάδες',\n },\n bloating: {\n label: 'Φούσκωμα κοιλιάς',\n },\n refluxGastritis: {\n label: 'Παλινδρόμηση ή γαστρίτιδα',\n },\n tiredness: {\n label: 'Κούραση',\n },\n sleepQuality: {\n label: 'Ποιότητα ύπνου',\n option: {\n good: 'Καλή',\n fair: 'Μέτρια',\n poor: 'Κακή',\n },\n },\n sleepDifficulty: {\n label: 'Δυσκολία να αποκοιμηθείτε ή ξύπνημα τη νύχτα',\n },\n bowelHabits: {\n label: 'Εντερικές συνήθειες',\n option: {\n regular: 'Κανονική λειτουργία',\n constipated: 'Δυσκοιλιότητα',\n diarrhoeal: 'Διάρροια',\n alternating: 'Εναλλαγή δυσκοιλιότητας και διάρροιας',\n },\n },\n stoolCharacteristics: {\n label: 'Χαρακτηριστικά κοπράνων',\n },\n haemorrhoids: {\n label: 'Αιμορροΐδες',\n },\n diverticula: {\n label: 'Εκκολπώματα',\n },\n regularUrination: {\n label: 'Κανονική ούρηση',\n },\n menstrualCycle: {\n label: 'Εμμηνορρυσιακός κύκλος',\n option: {\n regular: 'Κανονικός',\n irregular: 'Ακανόνιστος',\n absent: 'Απουσιάζει',\n },\n },\n foodAllergies: {\n label: 'Τροφικές αλλεργίες',\n },\n drugAllergies: {\n label: 'Αλλεργίες σε φάρμακα',\n },\n otherAllergies: {\n label: 'Άλλες αλλεργίες',\n },\n foodIntolerances: {\n label: 'Τροφικές δυσανεξίες',\n },\n smoking: {\n label: 'Κάπνισμα',\n option: {\n never: 'Ποτέ',\n former: 'Στο παρελθόν',\n current: 'Τώρα',\n },\n },\n pastSurgery: {\n label: 'Προηγούμενες χειρουργικές επεμβάσεις',\n },\n pregnancies: {\n label: 'Εγκυμοσύνες',\n },\n weightSelf: {\n label: 'Βάρος (kg)',\n },\n heightSelf: {\n label: 'Ύψος (cm)',\n },\n physicalActivity: {\n label: 'Τρέχουσα σωματική δραστηριότητα',\n },\n lifestyle: {\n label: 'Τρέχων τρόπος ζωής',\n },\n waterPerDay: {\n label: 'Νερό (λίτρα την ημέρα)',\n },\n fizzyDrinks: {\n label: 'Ανθρακούχα ποτά',\n option: {\n never: 'Ποτέ',\n occasionally: 'Περιστασιακά',\n daily: 'Καθημερινά',\n },\n },\n alcohol: {\n label: 'Αλκοόλ',\n option: {\n never: 'Ποτέ',\n occasionally: 'Περιστασιακά',\n daily: 'Καθημερινά',\n },\n },\n coffeePerDay: {\n label: 'Καφές (φλιτζάνια την ημέρα)',\n },\n coffeeSugar: {\n label: 'Καφές με ζάχαρη;',\n option: {\n yes: 'Ναι',\n no: 'Όχι',\n },\n },\n breakfast: {\n label: 'Πρωινό',\n },\n morningSnack: {\n label: 'Δεκατιανό',\n },\n lunch: {\n label: 'Μεσημεριανό',\n },\n afternoonSnack: {\n label: 'Απογευματινό σνακ',\n },\n dinner: {\n label: 'Βραδινό',\n },\n afterDinner: {\n label: 'Μετά το βραδινό',\n },\n pulses: {\n label: 'Όσπρια (φορές την εβδομάδα)',\n },\n fish: {\n label: 'Ψάρι (φορές την εβδομάδα)',\n detailLabel: 'Ποια ψάρια προτιμάτε;',\n },\n eggs: {\n label: 'Αυγά (φορές την εβδομάδα)',\n },\n meatCuredMeat: {\n label: 'Κρέας και αλλαντικά (φορές την εβδομάδα)',\n detailLabel: 'Κόκκινο ή λευκό;',\n },\n dairy: {\n label: 'Γαλακτοκομικά (φορές την εβδομάδα)',\n detailLabel: 'Ποια γαλακτοκομικά προτιμάτε;',\n },\n visitType: {\n label: 'Τύπος επίσκεψης',\n },\n practitioner: {\n label: 'Επαγγελματίας υγείας',\n },\n tumourType: {\n label: 'Τύπος όγκου',\n },\n stage: {\n label: 'Στάδιο',\n },\n metastases: {\n label: 'Μεταστάσεις',\n },\n treatmentStatus: {\n label: 'Κατάσταση θεραπείας',\n },\n medName: {\n label: 'Ονομασία',\n },\n medDose: {\n label: 'Δόση',\n },\n nutritionalProposal: {\n label: 'Διατροφική πρόταση',\n },\n clinicalNotes: {\n label: 'Κλινικές σημειώσεις',\n },\n annualProposed: {\n label: 'Προτάθηκε',\n },\n annualAccepted: {\n label: 'Έγινε αποδεκτό',\n },\n annualDeclineReason: {\n label: 'Αιτία άρνησης',\n },\n },\n questionnaire: {\n noNumeric: {\n title: 'Δεν υπάρχει ακόμη τίποτα για σύγκριση',\n description:\n 'Η τάση συγκρίνει αριθμητικές απαντήσεις από διαφορετικά ερωτηματολόγια. Στις ρυθμίσεις της φόρμας, ορίστε μια ερώτηση ως αριθμητική και επιλέξτε μονάδα μέτρησης. Έπειτα απαντήστε την τουλάχιστον δύο φορές.',\n },\n overviewTab: 'Επισκόπηση',\n },\n empty: {\n noVisits: {\n title: 'Δεν υπάρχουν ακόμη επισκέψεις',\n description:\n 'Μόλις καταγραφεί η πρώτη επίσκεψη, οι τιμές και οι τάσεις θα εμφανίζονται εδώ.',\n },\n noRecord: {\n title: 'Δεν έχει καταγραφεί τίποτα ακόμη',\n description:\n 'Αυτός ο φάκελος δεν περιέχει επισκέψεις. Προσθέστε την πρώτη επίσκεψη για να αρχίσετε να καταγράφετε πληροφορίες.',\n create: 'Έναρξη του πρώτου ερωτηματολογίου',\n createSigned: 'Έναρξη με υπογραφή',\n },\n noQuestions: {\n title: 'Δεν υπάρχουν ερωτήσεις προς απάντηση',\n description:\n 'Αυτό το ερωτηματολόγιο δεν έχει ενεργές ερωτήσεις. Ζητήστε από το ιατρείο να ενεργοποιήσει ορισμένες.',\n },\n noParameters: {\n title: 'Δεν έχουν ρυθμιστεί μετρήσεις',\n description:\n 'Αυτό το ιατρείο δεν έχει ρυθμίσει μετρήσεις, οπότε δεν υπάρχει ακόμη τίποτα για απεικόνιση.',\n },\n },\n visitNote: {\n title: 'Σημειώσεις επίσκεψης',\n trigger: 'Σημειώσεις επίσκεψης: {{visitType}}, {{date}}',\n openInPanel:\n 'Άνοιγμα των σημειώσεων επίσκεψης ({{visitType}}, {{date}}) στην προβολή σημειώσεων',\n },\n rail: {\n notes: 'Σημειώσεις και συμβάντα',\n empty: 'Αυτός ο φάκελος δεν έχει σημειώσεις ούτε συμβάντα.',\n eventLabel: 'Συμβάν',\n },\n window: {\n label: 'Εμφανιζόμενες επισκέψεις',\n pickerTrigger: 'Επισκέψεις · {{shown}} από {{total}}',\n selectAll: 'Επιλογή όλων',\n showing:\n 'Εμφανιζόμενες επισκέψεις: {{shown}} από {{total}} · {{from}} – {{to}}',\n showingAll: 'Όλες οι επισκέψεις: {{total}} · {{from}} – {{to}}',\n minimum: 'Πρέπει να εμφανίζεται τουλάχιστον μία επίσκεψη',\n optionHasNote: '{{label}} · σημείωση',\n },\n digest: {\n group: {\n reason: 'Λόγος επίσκεψης',\n history: 'Παθήσεις και φάρμακα',\n flags: 'Αναφερόμενα συμπτώματα',\n habits: 'Καθημερινές συνήθειες',\n },\n nothing: {\n title: 'Δεν υπάρχει ακόμη τίποτα για σύνοψη',\n description:\n 'Οι απαντήσεις που έχουν καταγραφεί μέχρι τώρα δεν περιλαμβάνονται στη σύνοψη. Ανοίξτε το πλήρες ερωτηματολόγιο παρακάτω για να τις διαβάσετε.',\n },\n missing: {\n title_one: '{{count}} υποχρεωτική ερώτηση παραμένει χωρίς απάντηση',\n title_other:\n '{{count}} υποχρεωτικές ερωτήσεις παραμένουν χωρίς απάντηση',\n list: 'Ακόμη χωρίς απάντηση: {{list}}',\n separator: ', ',\n jump: 'Μετάβαση στο πεδίο {{field}}',\n },\n },\n export: {\n tab: {\n summary: 'Σύνοψη',\n compile: 'Συμπλήρωση',\n evolution: 'Εξέλιξη',\n },\n docTab: {\n summary: 'Σύνοψη ερωτηματολογίου',\n compile: 'Καρτέλα επίσκεψης',\n evolution: 'Εξέλιξη',\n },\n docTitle: '{{tab}}: {{patient}}',\n info: 'Στοιχεία εγγράφου',\n generated: 'Δημιουργήθηκε',\n audienceLabel: 'Αντίγραφο για',\n audience: {\n clinician: 'Ιατρείο',\n patient: 'Ασθενής',\n external: 'Επαγγελματίας εκτός ιατρείου',\n },\n visitsLabel: 'Επισκέψεις που περιλαμβάνονται',\n visitsSelected: '{{shown}} από {{total}}',\n visitsAll: 'Όλες ({{total}})',\n withheld:\n 'Ορισμένες κλινικές λεπτομέρειες δεν περιλαμβάνονται σε αυτό το αντίγραφο.',\n none: 'Δεν έχει καταγραφεί τίποτα.',\n listSeparator: ', ',\n flagged: '{{date}} ({{flag}})',\n source: {\n patient: 'Ασθενής',\n clinician: 'Επαγγελματίας υγείας',\n },\n column: {\n question: 'Ερώτηση',\n answer: 'Απάντηση',\n source: 'Πηγή',\n field: 'Πεδίο',\n value: 'Τιμή',\n unit: 'Μονάδα',\n referenceRange: 'Εύρος αναφοράς',\n flag: 'Επισήμανση',\n target: 'Στόχος',\n change: 'Μεταβολή {{from}} → {{to}}',\n outOfRange: 'Εκτός εύρους',\n code: 'Κωδικός',\n description: 'Περιγραφή',\n name: 'Ονομασία',\n dose: 'Δόση',\n kind: 'Τύπος',\n cycle: 'Κύκλος',\n startDate: 'Ημερομηνία έναρξης',\n status: 'Κατάσταση',\n notes: 'Σημειώσεις',\n note: 'Σημείωση',\n text: 'Κείμενο',\n },\n control: {\n trigger: 'Εξαγωγή και κοινοποίηση',\n triggerLabel: 'Εξαγωγή και κοινοποίηση της προβολής {{tab}}',\n triggerLabelAudience:\n 'Εξαγωγή και κοινοποίηση της προβολής {{tab}}, {{audience}}',\n audienceBadge: 'Αντίγραφο ασθενούς',\n menuLabel: 'Προβολή {{tab}}',\n everyVisit:\n 'Συμπερίληψη όλων των επισκέψεων, όχι μόνο των στηλών που εμφανίζονται',\n excludes: 'Ένα αντίγραφο για τον ασθενή παραλείπει: {{list}}',\n excludesNone:\n 'Ένα αντίγραφο αυτής της προβολής για τον ασθενή δεν παραλείπει τίποτα.',\n holds:\n 'Το αντίγραφο του ιατρείου περιέχει ολόκληρο τον φάκελο, μαζί με: {{list}}.',\n holdsNone:\n 'Αυτή η προβολή δεν περιέχει τίποτα που θα παρέλειπε ένα αντίγραφο για τον ασθενή.',\n share: 'Κοινοποίηση…',\n pdf: 'Λήψη PDF',\n print: 'Εκτύπωση',\n xlsx: 'Λήψη Excel (.xlsx)',\n csv: 'Λήψη CSV (.csv)',\n printFrame: 'Έγγραφο εκτύπωσης (χωρίς ορατό περιεχόμενο)',\n printing: 'Ανοίγει το παράθυρο εκτύπωσης για το έγγραφο.',\n ready: 'Το αρχείο {{file}} είναι έτοιμο.',\n failed:\n 'Αυτό το πρόγραμμα περιήγησης δεν μπόρεσε να προετοιμάσει το αρχείο.',\n },\n share: {\n title: 'Κοινοποίηση της προβολής {{tab}}',\n mockBadge: 'Μόνο προεπισκόπηση',\n subtitle:\n 'Επιλέξτε για ποιον θα προοριζόταν ένα αντίγραφο και δείτε τι θα περιείχε.',\n noticeTitle: 'Από αυτή την οθόνη δεν αποστέλλεται τίποτα',\n notice:\n 'Αυτή η προεπισκόπηση δείχνει τη μορφή μιας κοινοποίησης, όχι μια πραγματική κοινοποίηση. Μια πραγματική κοινοποίηση απαιτεί υπογεγραμμένο σύνδεσμο με ημερομηνία λήξης, τη συναίνεση του ασθενούς και καταγραφή του ποιος έλαβε τι και μέσω ποιου καναλιού. Όλα αυτά βρίσκονται εκτός αυτού του φακέλου.',\n audienceLabel: 'Για ποιον θα προοριζόταν αυτό το αντίγραφο;',\n includes: 'Αυτό το αντίγραφο θα περιείχε',\n includesNone:\n 'Αυτή η προβολή δεν παράγει έγγραφο για αυτόν τον παραλήπτη.',\n excludes: 'Αυτό το αντίγραφο θα παρέλειπε',\n excludesNone: 'Τίποτα δεν παραλείπεται από αυτό το αντίγραφο.',\n cancel: 'Ακύρωση',\n confirm: 'Επιβεβαίωση παραλήπτη',\n confirmed:\n 'Ορίστηκε παραλήπτης: {{audience}}. Δεν έχει αποσταλεί τίποτα.',\n },\n concept: {\n patient_identity: 'Στοιχεία ταυτότητας ασθενούς',\n intake_answers: 'Απαντήσεις ερωτηματολογίου',\n visit_date: 'Ημερομηνίες επισκέψεων',\n visit_type: 'Τύπος επίσκεψης',\n visit_practitioner: 'Επαγγελματίας υγείας',\n visit_reasonCode: 'Κωδικοποιημένη αιτία επίσκεψης',\n anthropometrics_values: 'Ανθρωπομετρικές μετρήσεις',\n dietary_intake: 'Διατροφική πρόσληψη',\n derived_bmi: 'ΔΜΣ',\n lab_values: 'Τιμές εξετάσεων αίματος',\n pathology_codes: 'Διαγνωστικοί κωδικοί',\n oncological_history: 'Ογκολογικό ιστορικό',\n therapy_entries: 'Θεραπεία και συμπληρώματα',\n fmd_cycles: 'Κύκλοι δίαιτας μίμησης νηστείας',\n annual_programme: 'Ετήσιο πρόγραμμα',\n notes_clinicalNotes: 'Κλινικές σημειώσεις',\n notes_nutritionalProposal: 'Διατροφική πρόταση',\n symptom_observations: 'Παρατηρήσεις επαγγελματία υγείας',\n compare_diff: 'Σύγκριση επισκέψεων',\n visit_note: 'Σημειώσεις επίσκεψης',\n event_timeline: 'Χρονολόγιο κλινικών συμβάντων',\n export_tabDocument: 'Το ίδιο το έγγραφο',\n export_workbook: 'Το βιβλίο εργασίας με ολόκληρο τον φάκελο',\n },\n },\n },\n} as const;\n","/** Anamnesis interface resources (en). */\nexport default {\n anamnesis: {\n mainLabel: 'Anamnesis record — {{mode}}',\n mode: {\n intake: 'Intake',\n compile: 'Complete',\n questionnaire: 'Questionnaire',\n readOnly: 'Read-only',\n },\n common: {\n yes: 'Yes',\n no: 'No',\n unknown: 'Unknown',\n notSure: 'Not sure',\n choose: 'Choose…',\n details: 'Details',\n detailsPending: 'Appears when answered “Yes”',\n time: 'Time',\n whatEaten: 'What did you eat?',\n },\n header: {\n name: 'Name',\n age: 'Age',\n dob: 'Date of birth',\n visitDate: 'Visit date',\n years: '{{age}} yr',\n },\n origin: {\n fromPatient: 'From patient',\n },\n delta: {\n improved: 'Improved',\n worsened: 'Worsened',\n unchanged: 'Unchanged',\n aria: '{{valence}}: {{change}}',\n },\n range: {\n aboveRange: 'Above range',\n belowRange: 'Below range',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: 'Anthropometrics',\n dietary: 'Dietary intake',\n lab: 'Blood tests',\n },\n visitType: {\n first: 'First visit',\n followUp: 'Follow-up',\n },\n medKind: {\n medication: 'Medication',\n supplement: 'Supplement',\n },\n section: {\n reason: 'Reason for visit',\n pharmacological: 'Pharmacological history',\n familyHistory: 'Family history',\n symptoms: 'Symptoms',\n otherHistory: 'Other history',\n dietaryHistory: 'Dietary history',\n recall24h: '24-hour recall',\n foodFrequency: 'Weekly food frequency',\n visitMeta: 'Visit details',\n patientIntake: 'Patient intake',\n intakeGaps: 'Unanswered questions',\n anthropometrics: 'Anthropometrics',\n dietary: 'Dietary intake',\n pathologies: 'Pathologies',\n oncological: 'Oncological history',\n therapy: 'Therapy & supplements',\n labs: 'Blood tests',\n fmd: 'Fasting-mimicking programme',\n proposal: 'Nutritional proposal & notes',\n annual: 'Annual programme',\n evolution: 'Evolution',\n },\n intake: {\n title: 'Pre-visit questionnaire',\n subtitle: 'Please complete this before your first visit.',\n sectionsLabel: 'Questionnaire sections',\n answered: 'Questions answered: {{answered}} of {{total}}',\n sectionProgress: '{{answered}} of {{total}} answered',\n submit: 'Save',\n unsentNotice:\n 'Your answers are recorded when you submit this questionnaire.',\n submittedNotice: 'Answers saved.',\n },\n compile: {\n tabSummary: 'Summary',\n tabCompile: 'Complete',\n tabEvolution: 'Evolution',\n viewsLabel: 'Record views',\n visitCount: 'Visits: {{visits}}',\n bmiInStrip:\n 'BMI is computed from weight and height — it is read in the summary at the top of this record.',\n gapsIntro:\n 'These required questions came back unanswered. Record them with the patient.',\n noIntake: 'The patient has not submitted a questionnaire.',\n pathologiesLabel: 'Assigned pathologies',\n pathologiesHelp:\n 'Select every applicable code — a patient may hold several at once.',\n pathologiesPlaceholder: 'Search codes…',\n noTherapy: 'No therapy or supplements recorded.',\n addTherapy: 'Add medication',\n removeTherapy: 'Remove {{name}}',\n noFmd: 'No fasting-mimicking cycles recorded.',\n cycleNumber: 'Cycle {{number}}',\n cycleCompleted: 'Completed',\n cycleInProgress: 'In progress',\n blockEmpty: 'Nothing recorded',\n blockFilled_one: '{{count}} recorded',\n blockFilled_other: '{{count}} recorded',\n blockFlagged_one: '{{count}} out of range',\n blockFlagged_other: '{{count}} out of range',\n blockOutstanding_one: '{{count}} still to answer',\n blockOutstanding_other: '{{count}} still to answer',\n blockSettled: 'All answered',\n addFollowUpVisit: 'Add follow-up visit',\n },\n configEditor: {\n title: 'Anamnesis configuration',\n intro:\n 'The practice’s own vocabulary: rename, reorder, archive or add. Archiving never deletes — answers already recorded stay in the history.',\n tabsLabel: 'Configuration vocabularies',\n tabQuestionnaire: 'Questionnaire',\n tabParameters: 'Parameters',\n tabPathologies: 'Pathologies',\n tabTargets: 'Targets',\n targetsIntro:\n 'Choose the parameters the practice tracks as goals. They ride the goal tiles above the record, where each patient’s target value is set and current-vs-target status is read.',\n panelTracked_one: '{{count}} tracked as a goal',\n panelTracked_other: '{{count}} tracked as goals',\n panelLive_one: '{{count}} active',\n panelLive_other: '{{count}} active',\n panelArchived_one: '{{count}} archived',\n panelArchived_other: '{{count}} archived',\n panelNotCaptured_one: '{{count}} not offered at capture',\n panelNotCaptured_other: '{{count}} not offered at capture',\n locked: 'Locked',\n lockedHint:\n 'Feeds the BMI derivation — rename or reorder it, never remove it',\n archived: 'Archived',\n rowActions: 'Actions for {{name}}',\n reorderHandle: 'Reorder {{name}}. Press Alt + Up or Alt + Down to move.',\n reorderAnnounce: '{{name}} moved to position {{to}} of {{total}}',\n edit: 'Edit {{name}}',\n archive: 'Archive {{name}}',\n restore: 'Restore {{name}}',\n addQuestion: 'Add question',\n addSection: 'Add section',\n addParameter: 'Add parameter',\n addCode: 'Add code',\n sectionEmptyCapture:\n 'No live questions — this section is not offered at capture.',\n familyHeading: 'Family with sub-codes — a heading, not assignable itself',\n subCodeOf: 'Sub-code of {{code}}',\n direction: {\n down: 'Lower is better',\n up: 'Higher is better',\n toRange: 'In range is better',\n },\n type: {\n text: 'Short answer',\n textarea: 'Long answer',\n numberInteger: 'Number (integer)',\n numberDecimal: 'Number (decimal)',\n yesNoDetail: 'Yes / no',\n choice: 'Single choice',\n choiceWithText: 'Single choice with text',\n multiChoice: 'Multiple choice',\n frequency: 'Weekly frequency',\n meal: 'Meal',\n },\n typeLine: 'Answer type: {{type}}.',\n requiredBadge: 'Required',\n requiredField: 'Answer required',\n optionsCurrent: 'Choices: {{list}}.',\n editTitle: 'Edit {{name}}',\n keyLine: 'Identifier: {{key}} — set at creation, never changes.',\n codeLine: 'Code: {{code}} — set at creation, never changes.',\n labelField: 'Label',\n labelFieldHelp: 'Leave empty to use the standard wording.',\n helpField: 'Help text',\n addNote:\n 'A free-form entry is local to this practice — it joins no shared vocabulary.',\n addParameterTitle: 'Add a parameter',\n addQuestionTitle: 'Add a question to {{section}}',\n addSectionTitle: 'Add a section',\n addCodeTitle: 'Add a pathology code',\n codeField: 'Code',\n groupField: 'Group',\n directionField: 'What counts as better',\n unitField: 'Unit',\n precisionField: 'Decimals',\n rangeMinField: 'Reference minimum',\n rangeMaxField: 'Reference maximum',\n typeField: 'Answer type',\n optionsField: 'Choices',\n optionsFieldHelp: 'Comma-separated — at least one.',\n parentField: 'Parent family',\n parentFieldHelp:\n 'Adding a sub-code turns its family into a heading that can no longer be assigned itself.',\n sectionNeedsQuestion:\n 'A new section appears in the questionnaire once it holds at least one live question.',\n selectPlaceholder: 'Choose…',\n save: 'Save',\n cancel: 'Cancel',\n add: 'Add',\n },\n targets: {\n title: 'Nutrition targets',\n tileLabel: '{{name}} target',\n now: 'Now {{value}}',\n nowBanded: 'Now {{value}} · {{band}}',\n nowUnset: 'Not measured yet',\n unset: 'No target',\n status: {\n onTarget: 'On target',\n approaching: 'Approaching',\n offTarget: 'Off target',\n },\n edit: 'Edit target — {{parameter}}',\n editTitle: 'Target — {{parameter}}',\n editField: 'New target',\n bounds: 'Between {{range}}',\n outOfBounds: 'Enter a target between {{range}}.',\n unsaved: 'Not saved yet',\n save: 'Save target',\n clear: 'Clear target',\n },\n summary: {\n fullQuestionnaire: 'The full questionnaire',\n noAnswers: 'No answers have been recorded yet.',\n jump: 'Answer {{field}} on the Complete tab',\n },\n compare: {\n visitsLabel: 'Visits compared',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: '{{total}} visits compared · {{from}} – {{to}}',\n minimum: 'At least two visits stay compared',\n stop: 'Stop comparing',\n panelTitle: 'Compare visits',\n sameVisit: 'Pick two or more different visits to see what changed.',\n summaryTitle: 'Changes from {{from}} to {{to}}',\n tableLabel: 'What changed across the compared visits',\n noChanges: 'No changes between these visits.',\n noChangesDescription:\n 'The same measurements, codes, therapy and notes were recorded at every one of them.',\n present: 'Present',\n added: 'Added',\n removed: 'Removed',\n changed: 'Changed',\n notMeasured: 'Not measured',\n category: {\n measurement: 'Measurements',\n pathology: 'Pathologies',\n therapy: 'Therapy',\n note: 'Notes',\n },\n column: {\n item: 'What',\n change: 'Change',\n },\n },\n event: {\n barLabel: 'Events',\n chip: '{{label}} · {{date}}',\n separator: ', ',\n shown: 'Event lines shown: {{list}}',\n noneShown: 'No event lines shown.',\n external: '{{category}} · recorded by {{source}}',\n category: {\n therapy: 'Therapy',\n diet: 'Diet',\n fmd: 'Fasting-mimicking programme',\n surgery: 'Surgery',\n lifestyle: 'Daily life',\n },\n label: {\n dietStart: 'Mediterranean plan started',\n fmdCycle: 'Fasting-mimicking cycle',\n gymStart: 'Started the gym',\n chemoStart: 'Chemotherapy started',\n surgery: 'Gallbladder surgery',\n },\n source: {\n oncology: 'an oncologist outside this practice',\n },\n },\n grid: {\n parameter: 'Parameter',\n caption: 'Parameter values across visits, oldest first.',\n captionInModule:\n 'Parameter values across visits of {{module}}, oldest first.',\n target: 'Target {{value}} {{unit}}',\n trendLabel: '{{parameter}} trend',\n trend: 'Trend',\n editable: 'Editable',\n editCell: '{{parameter}} — latest visit',\n baselineMerged: 'Merged from {{total}} first visits',\n unlabelledSource: 'Other',\n blockVisits_one: '{{count}} visit',\n blockVisits_other: '{{count}} visits',\n },\n readOnly: {\n subtitle: 'Care plan record — read only.',\n summary: 'Patient summary',\n none: 'None recorded.',\n perWeek: 'Weekly frequency: {{times}}',\n },\n pathology: {\n E66: 'Obesity',\n E66_0: 'Obesity due to excess calories',\n E66_9: 'Obesity, unspecified',\n E11: 'Type 2 diabetes mellitus',\n E11_9: 'Type 2 diabetes without complications',\n E11_6: 'Type 2 diabetes with other specified complications',\n E78: 'Disorders of lipoprotein metabolism',\n I10: 'Essential hypertension',\n E03: 'Hypothyroidism',\n K58: 'Irritable bowel syndrome',\n D50: 'Iron-deficiency anaemia',\n E55: 'Vitamin D deficiency',\n groupGeneral: 'General',\n },\n param: {\n weight: 'Weight',\n height: 'Height',\n bmi: 'BMI',\n waist: 'Waist',\n hips: 'Hips',\n arm: 'Arm',\n phaseAngle: 'Phase angle',\n energy: 'Daily energy',\n protein: 'Protein',\n fastingGlucose: 'Fasting glucose',\n hba1c: 'HbA1c',\n totalCholesterol: 'Total cholesterol',\n ldl: 'LDL cholesterol',\n hdl: 'HDL cholesterol',\n triglycerides: 'Triglycerides',\n haemoglobin: 'Haemoglobin',\n vitaminD: 'Vitamin D (25-OH)',\n tsh: 'TSH',\n ferritin: 'Ferritin',\n crp: 'C-reactive protein',\n creatinine: 'Creatinine',\n },\n field: {\n highlighted: 'Highlighted',\n reasonForVisit: {\n label: 'Reason for visit and goals',\n },\n knownConditions: {\n label: 'Known conditions',\n },\n dailyMedications: {\n label: 'Daily medications',\n },\n currentSupplements: {\n label: 'Current supplements',\n },\n familyParents: {\n label: 'Parents',\n },\n familySiblings: {\n label: 'Siblings',\n },\n familyGrandparents: {\n label: 'Grandparents',\n },\n bloating: {\n label: 'Abdominal bloating',\n },\n refluxGastritis: {\n label: 'Reflux or gastritis',\n },\n tiredness: {\n label: 'Tiredness',\n },\n sleepQuality: {\n label: 'Sleep quality',\n option: {\n good: 'Good',\n fair: 'Fair',\n poor: 'Poor',\n },\n },\n sleepDifficulty: {\n label: 'Difficulty falling asleep or night waking',\n },\n bowelHabits: {\n label: 'Bowel habits',\n option: {\n regular: 'Regular',\n constipated: 'Constipated',\n diarrhoeal: 'Diarrhoeal',\n alternating: 'Alternating',\n },\n },\n stoolCharacteristics: {\n label: 'Stool characteristics',\n },\n haemorrhoids: {\n label: 'Haemorrhoids',\n },\n diverticula: {\n label: 'Diverticula',\n },\n regularUrination: {\n label: 'Regular urination',\n },\n menstrualCycle: {\n label: 'Menstrual cycle',\n option: {\n regular: 'Regular',\n irregular: 'Irregular',\n absent: 'Absent',\n },\n },\n foodAllergies: {\n label: 'Food allergies',\n },\n drugAllergies: {\n label: 'Drug allergies',\n },\n otherAllergies: {\n label: 'Other allergies',\n },\n foodIntolerances: {\n label: 'Food intolerances',\n },\n smoking: {\n label: 'Smoking',\n option: {\n never: 'Never',\n former: 'Former',\n current: 'Current',\n },\n },\n pastSurgery: {\n label: 'Past surgery',\n },\n pregnancies: {\n label: 'Pregnancies',\n },\n weightSelf: {\n label: 'Weight (kg)',\n },\n heightSelf: {\n label: 'Height (cm)',\n },\n physicalActivity: {\n label: 'Current physical activity',\n },\n lifestyle: {\n label: 'Current lifestyle',\n },\n waterPerDay: {\n label: 'Water (litres per day)',\n },\n fizzyDrinks: {\n label: 'Fizzy drinks',\n option: {\n never: 'Never',\n occasionally: 'Occasionally',\n daily: 'Daily',\n },\n },\n alcohol: {\n label: 'Alcohol',\n option: {\n never: 'Never',\n occasionally: 'Occasionally',\n daily: 'Daily',\n },\n },\n coffeePerDay: {\n label: 'Coffee (cups per day)',\n },\n coffeeSugar: {\n label: 'Coffee with sugar?',\n option: {\n yes: 'Yes',\n no: 'No',\n },\n },\n breakfast: {\n label: 'Breakfast',\n },\n morningSnack: {\n label: 'Morning snack',\n },\n lunch: {\n label: 'Lunch',\n },\n afternoonSnack: {\n label: 'Afternoon snack',\n },\n dinner: {\n label: 'Dinner',\n },\n afterDinner: {\n label: 'After dinner',\n },\n pulses: {\n label: 'Pulses (times per week)',\n },\n fish: {\n label: 'Fish (times per week)',\n detailLabel: 'Which fish do you prefer?',\n },\n eggs: {\n label: 'Eggs (times per week)',\n },\n meatCuredMeat: {\n label: 'Meat and cured meat (times per week)',\n detailLabel: 'Red or white?',\n },\n dairy: {\n label: 'Dairy (times per week)',\n detailLabel: 'Which dairy do you prefer?',\n },\n visitType: {\n label: 'Visit type',\n },\n practitioner: {\n label: 'Practitioner',\n },\n tumourType: {\n label: 'Tumour type',\n },\n stage: {\n label: 'Stage',\n },\n metastases: {\n label: 'Metastases',\n },\n treatmentStatus: {\n label: 'Treatment status',\n },\n medName: {\n label: 'Name',\n },\n medDose: {\n label: 'Dose',\n },\n nutritionalProposal: {\n label: 'Nutritional proposal',\n },\n clinicalNotes: {\n label: 'Clinical notes',\n },\n annualProposed: {\n label: 'Proposed',\n },\n annualAccepted: {\n label: 'Accepted',\n },\n annualDeclineReason: {\n label: 'Reason for declining',\n },\n },\n questionnaire: {\n noNumeric: {\n title: 'Nothing to compare yet',\n description:\n 'The trend compares numeric answers across questionnaires. Give a question the number type and a unit in the form settings, then complete it at least twice.',\n },\n overviewTab: 'Overview',\n },\n empty: {\n noVisits: {\n title: 'No visits yet',\n description:\n 'Once the first visit is recorded, the values and trends appear here.',\n },\n noRecord: {\n title: 'Nothing recorded yet',\n description:\n 'This record has no visits. Add the first visit to begin recording information.',\n create: 'Start the first questionnaire',\n createSigned: 'Start with signature',\n },\n noQuestions: {\n title: 'No questions to answer',\n description:\n 'This questionnaire has no active questions. Ask the practice to enable some.',\n },\n noParameters: {\n title: 'No measurements set up',\n description:\n 'This practice has no measurements configured, so there is nothing to plot yet.',\n },\n },\n visitNote: {\n title: 'Visit notes',\n trigger: 'Visit notes — {{visitType}}, {{date}}',\n openInPanel:\n 'Open the visit notes — {{visitType}}, {{date}} — in the notes view',\n },\n rail: {\n notes: 'Notes & events',\n empty: 'This record has no notes and no events.',\n eventLabel: 'Event',\n },\n window: {\n label: 'Visits shown',\n pickerTrigger: 'Visits · {{shown}} of {{total}}',\n selectAll: 'Select all',\n showing: 'Showing {{shown}} of {{total}} visits · {{from}} – {{to}}',\n showingAll: 'All visits: {{total}} · {{from}} – {{to}}',\n minimum: 'At least one visit stays shown',\n optionHasNote: '{{label}} · note',\n },\n digest: {\n group: {\n reason: 'Why they came',\n history: 'Conditions and medication',\n flags: 'Reported symptoms',\n habits: 'Daily habits',\n },\n nothing: {\n title: 'Nothing to summarise yet',\n description:\n 'The answers recorded so far are not part of the summary. Open the full questionnaire below to read them.',\n },\n missing: {\n title_one: '{{count}} required question still unanswered',\n title_other: '{{count}} required questions still unanswered',\n list: 'Still missing: {{list}}',\n separator: ', ',\n jump: 'Go to {{field}}',\n },\n },\n export: {\n tab: {\n summary: 'Summary',\n compile: 'Complete',\n evolution: 'Evolution',\n },\n docTab: {\n summary: 'Questionnaire summary',\n compile: 'Visit record',\n evolution: 'Evolution',\n },\n docTitle: '{{tab}} — {{patient}}',\n info: 'Document details',\n generated: 'Generated',\n audienceLabel: 'Copy for',\n audience: {\n clinician: 'The practice',\n patient: 'The patient',\n external: 'An external professional',\n },\n visitsLabel: 'Visits included',\n visitsSelected: '{{shown}} of {{total}}',\n visitsAll: 'All {{total}}',\n withheld: 'Some clinical detail is not included in this copy.',\n none: 'Nothing recorded.',\n listSeparator: ', ',\n flagged: '{{date}} ({{flag}})',\n source: {\n patient: 'Patient',\n clinician: 'Clinician',\n },\n column: {\n question: 'Question',\n answer: 'Answer',\n source: 'Source',\n field: 'Field',\n value: 'Value',\n unit: 'Unit',\n referenceRange: 'Reference range',\n flag: 'Flag',\n target: 'Target',\n change: 'Change {{from}} → {{to}}',\n outOfRange: 'Out of range',\n code: 'Code',\n description: 'Description',\n name: 'Name',\n dose: 'Dose',\n kind: 'Type',\n cycle: 'Cycle',\n startDate: 'Start date',\n status: 'Status',\n notes: 'Notes',\n note: 'Note',\n text: 'Text',\n },\n control: {\n trigger: 'Export & share',\n triggerLabel: 'Export & share the {{tab}} view',\n triggerLabelAudience: 'Export & share the {{tab}} view, {{audience}}',\n audienceBadge: 'Patient copy',\n menuLabel: '{{tab}} view',\n everyVisit: 'Include every visit, not only the columns shown',\n excludes: 'A patient copy leaves out: {{list}}',\n excludesNone: 'A patient copy of this view leaves nothing out.',\n holds: 'The practice copy holds the full record, including {{list}}.',\n holdsNone: 'This view holds nothing a patient copy would leave out.',\n share: 'Share…',\n pdf: 'Download PDF',\n print: 'Print',\n xlsx: 'Download Excel (.xlsx)',\n csv: 'Download CSV (.csv)',\n printFrame: 'Print document (no visible content)',\n printing: 'The print dialog is opening for the document.',\n ready: '{{file}} is ready.',\n failed: 'This browser could not prepare the file.',\n },\n share: {\n title: 'Share the {{tab}} view',\n mockBadge: 'Preview only',\n subtitle: 'Choose who a copy would be for, and see what it would hold.',\n noticeTitle: 'Nothing is sent from this screen',\n notice:\n 'This preview shows the shape of a share, not a share. A real one needs a signed expiring link, the patient’s consent, and a record of who received what over which channel — all of which live outside this record.',\n audienceLabel: 'Who would this copy be for?',\n includes: 'This copy would hold',\n includesNone: 'This view produces no document for this recipient.',\n excludes: 'This copy would leave out',\n excludesNone: 'Nothing is left out of this copy.',\n cancel: 'Cancel',\n confirm: 'Confirm recipient',\n confirmed: 'Recipient set to {{audience}}. Nothing has been sent.',\n },\n concept: {\n patient_identity: 'Patient identity',\n intake_answers: 'Questionnaire answers',\n visit_date: 'Visit dates',\n visit_type: 'Visit type',\n visit_practitioner: 'Practitioner',\n visit_reasonCode: 'Coded reason for the visit',\n anthropometrics_values: 'Anthropometric measurements',\n dietary_intake: 'Dietary intake',\n derived_bmi: 'BMI',\n lab_values: 'Blood-test values',\n pathology_codes: 'Diagnostic codes',\n oncological_history: 'Oncological history',\n therapy_entries: 'Therapy and supplements',\n fmd_cycles: 'Fasting-mimicking cycles',\n annual_programme: 'Annual programme',\n notes_clinicalNotes: 'Clinical notes',\n notes_nutritionalProposal: 'Nutritional proposal',\n symptom_observations: 'Clinician observations',\n compare_diff: 'Visit comparison',\n visit_note: 'Visit notes',\n event_timeline: 'Clinical event timeline',\n export_tabDocument: 'The document itself',\n export_workbook: 'The whole-record workbook',\n },\n },\n },\n} as const;\n","/** Anamnesis interface resources (es). */\nexport default {\n anamnesis: {\n mainLabel: 'Historial de anamnesis: {{mode}}',\n mode: {\n intake: 'Anamnesis inicial',\n compile: 'Completar',\n questionnaire: 'Cuestionario',\n readOnly: 'Solo lectura',\n },\n common: {\n yes: 'Sí',\n no: 'No',\n unknown: 'Desconocido',\n notSure: 'No estoy seguro',\n choose: 'Elija…',\n details: 'Detalles',\n detailsPending: 'Aparece al responder «Sí»',\n time: 'Hora',\n whatEaten: '¿Qué comió?',\n },\n header: {\n name: 'Nombre',\n age: 'Edad',\n dob: 'Fecha de nacimiento',\n visitDate: 'Fecha de la visita',\n years: 'Edad en años: {{age}}',\n },\n origin: {\n fromPatient: 'Del paciente',\n },\n delta: {\n improved: 'Mejoró',\n worsened: 'Empeoró',\n unchanged: 'Sin cambios',\n aria: '{{valence}}: {{change}}',\n },\n range: {\n aboveRange: 'Por encima del intervalo',\n belowRange: 'Por debajo del intervalo',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: 'Antropometría',\n dietary: 'Ingesta alimentaria',\n lab: 'Análisis de sangre',\n },\n visitType: {\n first: 'Primera visita',\n followUp: 'Seguimiento',\n },\n medKind: {\n medication: 'Medicación',\n supplement: 'Suplemento',\n },\n section: {\n reason: 'Motivo de la visita',\n pharmacological: 'Antecedentes farmacológicos',\n familyHistory: 'Antecedentes familiares',\n symptoms: 'Síntomas',\n otherHistory: 'Otros antecedentes',\n dietaryHistory: 'Historia alimentaria',\n recall24h: 'Recordatorio de 24 horas',\n foodFrequency: 'Frecuencia semanal de consumo de alimentos',\n visitMeta: 'Detalles de la visita',\n patientIntake: 'Anamnesis inicial del paciente',\n intakeGaps: 'Preguntas sin responder',\n anthropometrics: 'Antropometría',\n dietary: 'Ingesta alimentaria',\n pathologies: 'Patologías',\n oncological: 'Antecedentes oncológicos',\n therapy: 'Tratamiento y suplementos',\n labs: 'Análisis de sangre',\n fmd: 'Programa de dieta que imita el ayuno',\n proposal: 'Propuesta nutricional y notas',\n annual: 'Programa anual',\n evolution: 'Evolución',\n },\n intake: {\n title: 'Cuestionario previo a la visita',\n subtitle: 'Complete este cuestionario antes de su primera visita.',\n sectionsLabel: 'Secciones del cuestionario',\n answered: 'Preguntas respondidas: {{answered}} de {{total}}',\n sectionProgress: 'Respuestas: {{answered}} de {{total}}',\n submit: 'Guardar',\n unsentNotice:\n 'Sus respuestas se registran cuando envía este cuestionario.',\n submittedNotice: 'Respuestas guardadas.',\n },\n compile: {\n tabSummary: 'Resumen',\n tabCompile: 'Completar',\n tabEvolution: 'Evolución',\n viewsLabel: 'Vistas del historial',\n visitCount: 'Visitas: {{visits}}',\n bmiInStrip:\n 'El IMC se calcula a partir del peso y la altura. Puede consultarlo en el resumen de la parte superior de este historial.',\n gapsIntro:\n 'Estas preguntas obligatorias no se han respondido. Registre las respuestas con el paciente.',\n noIntake: 'El paciente no ha enviado ningún cuestionario.',\n pathologiesLabel: 'Patologías asignadas',\n pathologiesHelp:\n 'Seleccione todos los códigos aplicables. Un paciente puede tener varios a la vez.',\n pathologiesPlaceholder: 'Buscar códigos…',\n noTherapy: 'No hay tratamientos ni suplementos registrados.',\n addTherapy: 'Añadir medicamento',\n removeTherapy: 'Eliminar {{name}}',\n noFmd: 'No hay ciclos de dieta que imita el ayuno registrados.',\n cycleNumber: 'Ciclo {{number}}',\n cycleCompleted: 'Completado',\n cycleInProgress: 'En curso',\n blockEmpty: 'Nada registrado',\n blockFilled_one: '{{count}} registrado',\n blockFilled_other: '{{count}} registrados',\n blockFlagged_one: '{{count}} fuera del intervalo',\n blockFlagged_other: '{{count}} fuera del intervalo',\n blockOutstanding_one: '{{count}} pendiente de respuesta',\n blockOutstanding_other: '{{count}} pendientes de respuesta',\n blockSettled: 'Todo respondido',\n addFollowUpVisit: 'Añadir visita de seguimiento',\n blockFilled_many: '{{count}} registrados',\n blockFlagged_many: '{{count}} fuera del intervalo',\n blockOutstanding_many: '{{count}} pendientes de respuesta',\n },\n configEditor: {\n title: 'Configuración de anamnesis',\n intro:\n 'Terminología propia de la clínica: cambie nombres y orden, archive o añada elementos. Archivar nunca elimina datos: las respuestas ya registradas permanecen en el historial.',\n tabsLabel: 'Vocabularios de configuración',\n tabQuestionnaire: 'Cuestionario',\n tabParameters: 'Parámetros',\n tabPathologies: 'Patologías',\n tabTargets: 'Objetivos',\n targetsIntro:\n 'Elija los parámetros que la clínica sigue como objetivos. Aparecen en las tarjetas de objetivos encima del historial, donde se establece el valor objetivo de cada paciente y se compara con el valor actual.',\n panelTracked_one: '{{count}} seguido como objetivo',\n panelTracked_other: '{{count}} seguidos como objetivos',\n panelLive_one: '{{count}} activo',\n panelLive_other: '{{count}} activos',\n panelArchived_one: '{{count}} archivado',\n panelArchived_other: '{{count}} archivados',\n panelNotCaptured_one: '{{count}} no disponible al introducir datos',\n panelNotCaptured_other: '{{count}} no disponibles al introducir datos',\n locked: 'Bloqueado',\n lockedHint:\n 'Se utiliza para calcular el IMC. Puede cambiarle el nombre o el orden, pero no eliminarlo.',\n archived: 'Archivado',\n rowActions: 'Acciones de {{name}}',\n reorderHandle:\n 'Cambiar el orden de {{name}}. Pulse Alt + Arriba o Alt + Abajo para mover.',\n reorderAnnounce:\n '{{name}} se ha movido a la posición {{to}} de {{total}}',\n edit: 'Editar {{name}}',\n archive: 'Archivar {{name}}',\n restore: 'Restaurar {{name}}',\n addQuestion: 'Añadir pregunta',\n addSection: 'Añadir sección',\n addParameter: 'Añadir parámetro',\n addCode: 'Añadir código',\n sectionEmptyCapture:\n 'Sin preguntas activas. Esta sección no está disponible al introducir datos.',\n familyHeading:\n 'Familia con subcódigos: es un encabezado y no se puede asignar por sí misma',\n subCodeOf: 'Subcódigo de {{code}}',\n direction: {\n down: 'Un valor menor es mejor',\n up: 'Un valor mayor es mejor',\n toRange: 'Un valor dentro del intervalo es mejor',\n },\n type: {\n text: 'Respuesta breve',\n textarea: 'Respuesta larga',\n numberInteger: 'Número entero',\n numberDecimal: 'Número decimal',\n yesNoDetail: 'Sí / no',\n choice: 'Selección única',\n choiceWithText: 'Selección única con texto',\n multiChoice: 'Selección múltiple',\n frequency: 'Frecuencia semanal',\n meal: 'Comida',\n },\n typeLine: 'Tipo de respuesta: {{type}}.',\n requiredBadge: 'Obligatorio',\n requiredField: 'Respuesta obligatoria',\n optionsCurrent: 'Opciones: {{list}}.',\n editTitle: 'Editar {{name}}',\n keyLine: 'Identificador: {{key}}. Se establece al crear y nunca cambia.',\n codeLine: 'Código: {{code}}. Se establece al crear y nunca cambia.',\n labelField: 'Etiqueta',\n labelFieldHelp: 'Deje el campo vacío para usar el texto estándar.',\n helpField: 'Texto de ayuda',\n addNote:\n 'Una entrada de texto libre es exclusiva de esta clínica y no se incorpora a ningún vocabulario compartido.',\n addParameterTitle: 'Añadir un parámetro',\n addQuestionTitle: 'Añadir una pregunta a {{section}}',\n addSectionTitle: 'Añadir una sección',\n addCodeTitle: 'Añadir un código de patología',\n codeField: 'Código',\n groupField: 'Grupo',\n directionField: 'Qué se considera una mejora',\n unitField: 'Unidad',\n precisionField: 'Decimales',\n rangeMinField: 'Mínimo de referencia',\n rangeMaxField: 'Máximo de referencia',\n typeField: 'Tipo de respuesta',\n optionsField: 'Opciones',\n optionsFieldHelp: 'Separadas por comas. Debe haber al menos una.',\n parentField: 'Familia superior',\n parentFieldHelp:\n 'Añadir un subcódigo convierte su familia en un encabezado que ya no puede asignarse por sí mismo.',\n sectionNeedsQuestion:\n 'Una sección nueva aparece en el cuestionario cuando contiene al menos una pregunta activa.',\n selectPlaceholder: 'Elija…',\n save: 'Guardar',\n cancel: 'Cancelar',\n add: 'Añadir',\n panelTracked_many: '{{count}} seguidos como objetivos',\n panelLive_many: '{{count}} activos',\n panelArchived_many: '{{count}} archivados',\n panelNotCaptured_many: '{{count}} no disponibles al introducir datos',\n },\n targets: {\n title: 'Objetivos nutricionales',\n tileLabel: 'Objetivo de {{name}}',\n now: 'Actual: {{value}}',\n nowBanded: 'Actual: {{value}} · {{band}}',\n nowUnset: 'Aún no medido',\n unset: 'Sin objetivo',\n status: {\n onTarget: 'Objetivo alcanzado',\n approaching: 'Acercándose al objetivo',\n offTarget: 'Fuera del objetivo',\n },\n edit: 'Editar objetivo: {{parameter}}',\n editTitle: 'Objetivo: {{parameter}}',\n editField: 'Nuevo objetivo',\n bounds: 'Entre {{range}}',\n outOfBounds: 'Introduzca un objetivo entre {{range}}.',\n unsaved: 'Aún no guardado',\n save: 'Guardar objetivo',\n clear: 'Borrar objetivo',\n },\n summary: {\n fullQuestionnaire: 'Cuestionario completo',\n noAnswers: 'Aún no se han registrado respuestas.',\n jump: 'Responda a {{field}} en la pestaña Completar',\n },\n compare: {\n visitsLabel: 'Visitas comparadas',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: 'Visitas comparadas: {{total}} · {{from}} – {{to}}',\n minimum: 'Deben mantenerse al menos dos visitas en la comparación',\n stop: 'Dejar de comparar',\n panelTitle: 'Comparar visitas',\n sameVisit:\n 'Seleccione dos o más visitas distintas para ver qué ha cambiado.',\n summaryTitle: 'Cambios de {{from}} a {{to}}',\n tableLabel: 'Cambios entre las visitas comparadas',\n noChanges: 'No hay cambios entre estas visitas.',\n noChangesDescription:\n 'En todas ellas se registraron las mismas mediciones, códigos, tratamientos y notas.',\n present: 'Presente',\n added: 'Añadido',\n removed: 'Eliminado',\n changed: 'Modificado',\n notMeasured: 'No medido',\n category: {\n measurement: 'Mediciones',\n pathology: 'Patologías',\n therapy: 'Tratamiento',\n note: 'Notas',\n },\n column: {\n item: 'Elemento',\n change: 'Cambio',\n },\n },\n event: {\n barLabel: 'Eventos',\n chip: '{{label}} · {{date}}',\n separator: ', ',\n shown: 'Líneas de eventos mostradas: {{list}}',\n noneShown: 'No se muestran líneas de eventos.',\n external: '{{category}} · registrado por {{source}}',\n category: {\n therapy: 'Tratamiento',\n diet: 'Dieta',\n fmd: 'Programa de dieta que imita el ayuno',\n surgery: 'Cirugía',\n lifestyle: 'Vida cotidiana',\n },\n label: {\n dietStart: 'Inicio del plan mediterráneo',\n fmdCycle: 'Ciclo de dieta que imita el ayuno',\n gymStart: 'Inicio de actividad en el gimnasio',\n chemoStart: 'Inicio de la quimioterapia',\n surgery: 'Cirugía de vesícula biliar',\n },\n source: {\n oncology: 'un oncólogo ajeno a esta clínica',\n },\n },\n grid: {\n parameter: 'Parámetro',\n caption:\n 'Valores de los parámetros a lo largo de las visitas, de la más antigua a la más reciente.',\n captionInModule:\n 'Valores de los parámetros a lo largo de las visitas de {{module}}, de la más antigua a la más reciente.',\n target: 'Objetivo: {{value}} {{unit}}',\n trendLabel: 'Evolución de {{parameter}}',\n trend: 'Evolución',\n editable: 'Editable',\n editCell: '{{parameter}}: última visita',\n baselineMerged: 'Combinado a partir de las primeras visitas: {{total}}',\n unlabelledSource: 'Otro',\n blockVisits_one: '{{count}} visita',\n blockVisits_other: '{{count}} visitas',\n blockVisits_many: '{{count}} visitas',\n },\n readOnly: {\n subtitle: 'Historial del plan de tratamiento: solo lectura.',\n summary: 'Resumen del paciente',\n none: 'No hay datos registrados.',\n perWeek: 'Frecuencia semanal: {{times}}',\n },\n pathology: {\n E66: 'Obesidad',\n E66_0: 'Obesidad por exceso de calorías',\n E66_9: 'Obesidad no especificada',\n E11: 'Diabetes mellitus tipo 2',\n E11_9: 'Diabetes tipo 2 sin complicaciones',\n E11_6: 'Diabetes tipo 2 con otras complicaciones especificadas',\n E78: 'Trastornos del metabolismo de las lipoproteínas',\n I10: 'Hipertensión esencial',\n E03: 'Hipotiroidismo',\n K58: 'Síndrome del intestino irritable',\n D50: 'Anemia ferropénica',\n E55: 'Déficit de vitamina D',\n groupGeneral: 'General',\n },\n param: {\n weight: 'Peso',\n height: 'Altura',\n bmi: 'IMC',\n waist: 'Perímetro de cintura',\n hips: 'Perímetro de cadera',\n arm: 'Perímetro del brazo',\n phaseAngle: 'Ángulo de fase',\n energy: 'Energía diaria',\n protein: 'Proteínas',\n fastingGlucose: 'Glucosa en ayunas',\n hba1c: 'HbA1c',\n totalCholesterol: 'Colesterol total',\n ldl: 'Colesterol LDL',\n hdl: 'Colesterol HDL',\n triglycerides: 'Triglicéridos',\n haemoglobin: 'Hemoglobina',\n vitaminD: 'Vitamina D (25-OH)',\n tsh: 'TSH',\n ferritin: 'Ferritina',\n crp: 'Proteína C reactiva',\n creatinine: 'Creatinina',\n },\n field: {\n highlighted: 'Destacado',\n reasonForVisit: {\n label: 'Motivo de la visita y objetivos',\n },\n knownConditions: {\n label: 'Enfermedades conocidas',\n },\n dailyMedications: {\n label: 'Medicación diaria',\n },\n currentSupplements: {\n label: 'Suplementos actuales',\n },\n familyParents: {\n label: 'Padres',\n },\n familySiblings: {\n label: 'Hermanos',\n },\n familyGrandparents: {\n label: 'Abuelos',\n },\n bloating: {\n label: 'Distensión abdominal',\n },\n refluxGastritis: {\n label: 'Reflujo o gastritis',\n },\n tiredness: {\n label: 'Cansancio',\n },\n sleepQuality: {\n label: 'Calidad del sueño',\n option: {\n good: 'Buena',\n fair: 'Regular',\n poor: 'Mala',\n },\n },\n sleepDifficulty: {\n label: 'Dificultad para conciliar el sueño o despertares nocturnos',\n },\n bowelHabits: {\n label: 'Hábitos intestinales',\n option: {\n regular: 'Regulares',\n constipated: 'Estreñimiento',\n diarrhoeal: 'Diarrea',\n alternating: 'Alternantes',\n },\n },\n stoolCharacteristics: {\n label: 'Características de las heces',\n },\n haemorrhoids: {\n label: 'Hemorroides',\n },\n diverticula: {\n label: 'Divertículos',\n },\n regularUrination: {\n label: 'Micción regular',\n },\n menstrualCycle: {\n label: 'Ciclo menstrual',\n option: {\n regular: 'Regular',\n irregular: 'Irregular',\n absent: 'Ausente',\n },\n },\n foodAllergies: {\n label: 'Alergias alimentarias',\n },\n drugAllergies: {\n label: 'Alergias a medicamentos',\n },\n otherAllergies: {\n label: 'Otras alergias',\n },\n foodIntolerances: {\n label: 'Intolerancias alimentarias',\n },\n smoking: {\n label: 'Tabaquismo',\n option: {\n never: 'Nunca ha fumado',\n former: 'Exfumador',\n current: 'Fumador actual',\n },\n },\n pastSurgery: {\n label: 'Cirugías previas',\n },\n pregnancies: {\n label: 'Embarazos',\n },\n weightSelf: {\n label: 'Peso (kg)',\n },\n heightSelf: {\n label: 'Altura (cm)',\n },\n physicalActivity: {\n label: 'Actividad física actual',\n },\n lifestyle: {\n label: 'Estilo de vida actual',\n },\n waterPerDay: {\n label: 'Agua (litros al día)',\n },\n fizzyDrinks: {\n label: 'Bebidas con gas',\n option: {\n never: 'Nunca',\n occasionally: 'Ocasionalmente',\n daily: 'A diario',\n },\n },\n alcohol: {\n label: 'Alcohol',\n option: {\n never: 'Nunca',\n occasionally: 'Ocasionalmente',\n daily: 'A diario',\n },\n },\n coffeePerDay: {\n label: 'Café (tazas al día)',\n },\n coffeeSugar: {\n label: '¿Café con azúcar?',\n option: {\n yes: 'Sí',\n no: 'No',\n },\n },\n breakfast: {\n label: 'Desayuno',\n },\n morningSnack: {\n label: 'Tentempié de media mañana',\n },\n lunch: {\n label: 'Comida',\n },\n afternoonSnack: {\n label: 'Merienda',\n },\n dinner: {\n label: 'Cena',\n },\n afterDinner: {\n label: 'Después de cenar',\n },\n pulses: {\n label: 'Legumbres (veces por semana)',\n },\n fish: {\n label: 'Pescado (veces por semana)',\n detailLabel: '¿Qué pescado prefiere?',\n },\n eggs: {\n label: 'Huevos (veces por semana)',\n },\n meatCuredMeat: {\n label: 'Carne y embutidos (veces por semana)',\n detailLabel: '¿Roja o blanca?',\n },\n dairy: {\n label: 'Lácteos (veces por semana)',\n detailLabel: '¿Qué lácteos prefiere?',\n },\n visitType: {\n label: 'Tipo de visita',\n },\n practitioner: {\n label: 'Profesional sanitario',\n },\n tumourType: {\n label: 'Tipo de tumor',\n },\n stage: {\n label: 'Estadio',\n },\n metastases: {\n label: 'Metástasis',\n },\n treatmentStatus: {\n label: 'Estado del tratamiento',\n },\n medName: {\n label: 'Nombre',\n },\n medDose: {\n label: 'Dosis',\n },\n nutritionalProposal: {\n label: 'Propuesta nutricional',\n },\n clinicalNotes: {\n label: 'Notas clínicas',\n },\n annualProposed: {\n label: 'Propuesto',\n },\n annualAccepted: {\n label: 'Aceptado',\n },\n annualDeclineReason: {\n label: 'Motivo del rechazo',\n },\n },\n questionnaire: {\n noNumeric: {\n title: 'Aún no hay nada que comparar',\n description:\n 'La evolución compara las respuestas numéricas de los cuestionarios. En los ajustes del formulario, asigne el tipo numérico y una unidad a una pregunta y complete el cuestionario al menos dos veces.',\n },\n overviewTab: 'Vista general',\n },\n empty: {\n noVisits: {\n title: 'Aún no hay visitas',\n description:\n 'Los valores y la evolución aparecerán aquí cuando se registre la primera visita.',\n },\n noRecord: {\n title: 'Aún no hay datos registrados',\n description:\n 'Este historial no contiene visitas. Añada la primera visita para empezar a registrar información.',\n create: 'Iniciar el primer cuestionario',\n createSigned: 'Iniciar con firma',\n },\n noQuestions: {\n title: 'No hay preguntas que responder',\n description:\n 'Este cuestionario no tiene preguntas activas. Pida a la clínica que active algunas.',\n },\n noParameters: {\n title: 'No hay mediciones configuradas',\n description:\n 'Esta clínica no tiene mediciones configuradas, por lo que aún no hay datos que representar.',\n },\n },\n visitNote: {\n title: 'Notas de la visita',\n trigger: 'Notas de la visita: {{visitType}}, {{date}}',\n openInPanel:\n 'Abrir las notas de la visita ({{visitType}}, {{date}}) en la vista de notas',\n },\n rail: {\n notes: 'Notas y eventos',\n empty: 'Este historial no tiene notas ni eventos.',\n eventLabel: 'Evento',\n },\n window: {\n label: 'Visitas mostradas',\n pickerTrigger: 'Visitas: {{shown}} de {{total}}',\n selectAll: 'Seleccionar todas',\n showing: 'Visitas mostradas: {{shown}} de {{total}} · {{from}} – {{to}}',\n showingAll: 'Todas las visitas: {{total}} · {{from}} – {{to}}',\n minimum: 'Debe mantenerse al menos una visita visible',\n optionHasNote: '{{label}} · nota',\n },\n digest: {\n group: {\n reason: 'Motivo de la visita',\n history: 'Enfermedades y medicación',\n flags: 'Síntomas referidos',\n habits: 'Hábitos diarios',\n },\n nothing: {\n title: 'Aún no hay nada que resumir',\n description:\n 'Las respuestas registradas hasta ahora no forman parte del resumen. Abra el cuestionario completo a continuación para leerlas.',\n },\n missing: {\n title_one: '{{count}} pregunta obligatoria aún sin responder',\n title_other: '{{count}} preguntas obligatorias aún sin responder',\n list: 'Falta: {{list}}',\n separator: ', ',\n jump: 'Ir a {{field}}',\n title_many: '{{count}} preguntas obligatorias aún sin responder',\n },\n },\n export: {\n tab: {\n summary: 'Resumen',\n compile: 'Completar',\n evolution: 'Evolución',\n },\n docTab: {\n summary: 'Resumen del cuestionario',\n compile: 'Registro de la visita',\n evolution: 'Evolución',\n },\n docTitle: '{{tab}} — {{patient}}',\n info: 'Detalles del documento',\n generated: 'Generado',\n audienceLabel: 'Copia para',\n audience: {\n clinician: 'La clínica',\n patient: 'El paciente',\n external: 'Un profesional externo',\n },\n visitsLabel: 'Visitas incluidas',\n visitsSelected: '{{shown}} de {{total}}',\n visitsAll: 'Todas: {{total}}',\n withheld: 'Esta copia no incluye algunos detalles clínicos.',\n none: 'Nada registrado.',\n listSeparator: ', ',\n flagged: '{{date}} ({{flag}})',\n source: {\n patient: 'Paciente',\n clinician: 'Profesional sanitario',\n },\n column: {\n question: 'Pregunta',\n answer: 'Respuesta',\n source: 'Origen',\n field: 'Campo',\n value: 'Valor',\n unit: 'Unidad',\n referenceRange: 'Intervalo de referencia',\n flag: 'Marca',\n target: 'Objetivo',\n change: 'Cambio {{from}} → {{to}}',\n outOfRange: 'Fuera del intervalo',\n code: 'Código',\n description: 'Descripción',\n name: 'Nombre',\n dose: 'Dosis',\n kind: 'Tipo',\n cycle: 'Ciclo',\n startDate: 'Fecha de inicio',\n status: 'Estado',\n notes: 'Notas',\n note: 'Nota',\n text: 'Texto',\n },\n control: {\n trigger: 'Exportar y compartir',\n triggerLabel: 'Exportar y compartir la vista {{tab}}',\n triggerLabelAudience:\n 'Exportar y compartir la vista {{tab}}, {{audience}}',\n audienceBadge: 'Copia para el paciente',\n menuLabel: 'Vista {{tab}}',\n everyVisit: 'Incluir todas las visitas, no solo las columnas mostradas',\n excludes: 'La copia para el paciente excluye: {{list}}',\n excludesNone:\n 'La copia para el paciente de esta vista no excluye ningún dato.',\n holds:\n 'La copia para la clínica contiene el historial completo, que incluye {{list}}.',\n holdsNone:\n 'Esta vista no contiene datos que se excluyan de la copia para el paciente.',\n share: 'Compartir…',\n pdf: 'Descargar PDF',\n print: 'Imprimir',\n xlsx: 'Descargar Excel (.xlsx)',\n csv: 'Descargar CSV (.csv)',\n printFrame: 'Imprimir documento (sin contenido visible)',\n printing: 'Se está abriendo el diálogo de impresión del documento.',\n ready: '{{file}} está listo.',\n failed: 'Este navegador no ha podido preparar el archivo.',\n },\n share: {\n title: 'Compartir la vista {{tab}}',\n mockBadge: 'Solo vista previa',\n subtitle: 'Elija a quién iría dirigida la copia y vea qué contendría.',\n noticeTitle: 'No se envía nada desde esta pantalla',\n notice:\n 'Esta vista previa muestra cómo sería el envío, sin realizarlo. Un envío real requiere un enlace firmado con caducidad, el consentimiento del paciente y un registro de quién recibió qué información y por qué canal. Todo ello se gestiona fuera de este historial.',\n audienceLabel: '¿A quién iría dirigida esta copia?',\n includes: 'Esta copia incluiría',\n includesNone:\n 'Esta vista no genera ningún documento para este destinatario.',\n excludes: 'Esta copia excluiría',\n excludesNone: 'Esta copia no excluye ningún dato.',\n cancel: 'Cancelar',\n confirm: 'Confirmar destinatario',\n confirmed:\n 'Destinatario establecido: {{audience}}. No se ha enviado nada.',\n },\n concept: {\n patient_identity: 'Identidad del paciente',\n intake_answers: 'Respuestas del cuestionario',\n visit_date: 'Fechas de las visitas',\n visit_type: 'Tipo de visita',\n visit_practitioner: 'Profesional sanitario',\n visit_reasonCode: 'Motivo codificado de la visita',\n anthropometrics_values: 'Mediciones antropométricas',\n dietary_intake: 'Ingesta alimentaria',\n derived_bmi: 'IMC',\n lab_values: 'Valores de los análisis de sangre',\n pathology_codes: 'Códigos diagnósticos',\n oncological_history: 'Antecedentes oncológicos',\n therapy_entries: 'Tratamiento y suplementos',\n fmd_cycles: 'Ciclos de dieta que imita el ayuno',\n annual_programme: 'Programa anual',\n notes_clinicalNotes: 'Notas clínicas',\n notes_nutritionalProposal: 'Propuesta nutricional',\n symptom_observations: 'Observaciones del profesional sanitario',\n compare_diff: 'Comparación de visitas',\n visit_note: 'Notas de la visita',\n event_timeline: 'Cronología de eventos clínicos',\n export_tabDocument: 'El propio documento',\n export_workbook: 'El libro de cálculo del historial completo',\n },\n },\n },\n} as const;\n","/** Anamnesis interface resources (fr). */\nexport default {\n anamnesis: {\n mainLabel: 'Dossier d’anamnèse : {{mode}}',\n mode: {\n intake: 'Recueil initial',\n compile: 'Compléter',\n questionnaire: 'Questionnaire',\n readOnly: 'Lecture seule',\n },\n common: {\n yes: 'Oui',\n no: 'Non',\n unknown: 'Inconnu',\n notSure: 'Je ne sais pas',\n choose: 'Choisir…',\n details: 'Détails',\n detailsPending: 'S’affiche si la réponse est « Oui »',\n time: 'Heure',\n whatEaten: 'Qu’avez-vous mangé ?',\n },\n header: {\n name: 'Nom',\n age: 'Âge',\n dob: 'Date de naissance',\n visitDate: 'Date de consultation',\n years: 'Âge en années : {{age}}',\n },\n origin: {\n fromPatient: 'Déclaré par le patient',\n },\n delta: {\n improved: 'Amélioration',\n worsened: 'Aggravation',\n unchanged: 'Inchangé',\n aria: '{{valence}} : {{change}}',\n },\n range: {\n aboveRange: 'Au-dessus de l’intervalle',\n belowRange: 'En dessous de l’intervalle',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: 'Mesures anthropométriques',\n dietary: 'Apports alimentaires',\n lab: 'Analyses sanguines',\n },\n visitType: {\n first: 'Première consultation',\n followUp: 'Consultation de suivi',\n },\n medKind: {\n medication: 'Médicament',\n supplement: 'Complément alimentaire',\n },\n section: {\n reason: 'Motif de la consultation',\n pharmacological: 'Antécédents médicamenteux',\n familyHistory: 'Antécédents familiaux',\n symptoms: 'Symptômes',\n otherHistory: 'Autres antécédents',\n dietaryHistory: 'Historique alimentaire',\n recall24h: 'Rappel alimentaire des dernières 24 heures',\n foodFrequency: 'Fréquence alimentaire hebdomadaire',\n visitMeta: 'Détails de la consultation',\n patientIntake: 'Questionnaire initial du patient',\n intakeGaps: 'Questions sans réponse',\n anthropometrics: 'Mesures anthropométriques',\n dietary: 'Apports alimentaires',\n pathologies: 'Pathologies',\n oncological: 'Antécédents oncologiques',\n therapy: 'Traitements et compléments alimentaires',\n labs: 'Analyses sanguines',\n fmd: 'Programme de régime mimant le jeûne',\n proposal: 'Proposition nutritionnelle et notes',\n annual: 'Programme annuel',\n evolution: 'Évolution',\n },\n intake: {\n title: 'Questionnaire avant la consultation',\n subtitle: 'Veuillez le remplir avant votre première consultation.',\n sectionsLabel: 'Sections du questionnaire',\n answered: 'Questions avec réponse : {{answered}} sur {{total}}',\n sectionProgress: 'Réponses renseignées : {{answered}} sur {{total}}',\n submit: 'Enregistrer',\n unsentNotice:\n 'Vos réponses sont enregistrées lorsque vous envoyez ce questionnaire.',\n submittedNotice: 'Réponses enregistrées.',\n },\n compile: {\n tabSummary: 'Résumé',\n tabCompile: 'Compléter',\n tabEvolution: 'Évolution',\n viewsLabel: 'Vues du dossier',\n visitCount: 'Consultations : {{visits}}',\n bmiInStrip:\n 'L’IMC est calculé à partir du poids et de la taille. Il figure dans le résumé en haut de ce dossier.',\n gapsIntro:\n 'Ces questions obligatoires sont restées sans réponse. Complétez-les avec le patient.',\n noIntake: 'Le patient n’a pas envoyé de questionnaire.',\n pathologiesLabel: 'Pathologies attribuées',\n pathologiesHelp:\n 'Sélectionnez tous les codes applicables. Plusieurs codes peuvent être attribués à un patient.',\n pathologiesPlaceholder: 'Rechercher des codes…',\n noTherapy: 'Aucun traitement ni complément alimentaire enregistré.',\n addTherapy: 'Ajouter un médicament',\n removeTherapy: 'Retirer {{name}}',\n noFmd: 'Aucun cycle de régime mimant le jeûne enregistré.',\n cycleNumber: 'Cycle {{number}}',\n cycleCompleted: 'Terminé',\n cycleInProgress: 'En cours',\n blockEmpty: 'Aucune donnée enregistrée',\n blockFilled_one: '{{count}} renseigné',\n blockFilled_other: '{{count}} renseignés',\n blockFlagged_one: '{{count}} hors de l’intervalle',\n blockFlagged_other: '{{count}} hors de l’intervalle',\n blockOutstanding_one: '{{count}} réponse encore attendue',\n blockOutstanding_other: '{{count}} réponses encore attendues',\n blockSettled: 'Toutes les questions ont une réponse',\n addFollowUpVisit: 'Ajouter une consultation de suivi',\n blockFilled_many: '{{count}} renseignés',\n blockFlagged_many: '{{count}} hors de l’intervalle',\n blockOutstanding_many: '{{count}} réponses encore attendues',\n },\n configEditor: {\n title: 'Configuration de l’anamnèse',\n intro:\n 'Le vocabulaire propre au cabinet : renommez, réordonnez, archivez ou ajoutez des éléments. L’archivage ne supprime rien ; les réponses déjà enregistrées restent dans l’historique.',\n tabsLabel: 'Vocabulaires de configuration',\n tabQuestionnaire: 'Questionnaire',\n tabParameters: 'Paramètres',\n tabPathologies: 'Pathologies',\n tabTargets: 'Objectifs',\n targetsIntro:\n 'Choisissez les paramètres que le cabinet suit comme objectifs. Ils apparaissent dans les cartes d’objectifs au-dessus du dossier, où vous définissez la valeur cible de chaque patient et comparez sa valeur actuelle à cet objectif.',\n panelTracked_one: '{{count}} suivi comme objectif',\n panelTracked_other: '{{count}} suivis comme objectifs',\n panelLive_one: '{{count}} actif',\n panelLive_other: '{{count}} actifs',\n panelArchived_one: '{{count}} archivé',\n panelArchived_other: '{{count}} archivés',\n panelNotCaptured_one: '{{count}} non proposé lors de la saisie',\n panelNotCaptured_other: '{{count}} non proposés lors de la saisie',\n locked: 'Verrouillé',\n lockedHint:\n 'Utilisé pour calculer l’IMC : vous pouvez le renommer ou le réordonner, mais pas le supprimer',\n archived: 'Archivé',\n rowActions: 'Actions pour {{name}}',\n reorderHandle:\n 'Réordonner {{name}}. Appuyez sur Alt + Haut ou Alt + Bas pour le déplacer.',\n reorderAnnounce: '{{name}} déplacé en position {{to}} sur {{total}}',\n edit: 'Modifier {{name}}',\n archive: 'Archiver {{name}}',\n restore: 'Restaurer {{name}}',\n addQuestion: 'Ajouter une question',\n addSection: 'Ajouter une section',\n addParameter: 'Ajouter un paramètre',\n addCode: 'Ajouter un code',\n sectionEmptyCapture:\n 'Aucune question active : cette section n’est pas proposée lors de la saisie.',\n familyHeading:\n 'Famille avec sous-codes : sert de titre et ne peut pas être attribuée directement',\n subCodeOf: 'Sous-code de {{code}}',\n direction: {\n down: 'Une valeur plus basse est préférable',\n up: 'Une valeur plus élevée est préférable',\n toRange: 'Une valeur dans l’intervalle est préférable',\n },\n type: {\n text: 'Réponse courte',\n textarea: 'Réponse longue',\n numberInteger: 'Nombre entier',\n numberDecimal: 'Nombre décimal',\n yesNoDetail: 'Oui / non',\n choice: 'Choix unique',\n choiceWithText: 'Choix unique avec texte',\n multiChoice: 'Choix multiple',\n frequency: 'Fréquence hebdomadaire',\n meal: 'Repas',\n },\n typeLine: 'Type de réponse : {{type}}.',\n requiredBadge: 'Obligatoire',\n requiredField: 'Réponse obligatoire',\n optionsCurrent: 'Choix : {{list}}.',\n editTitle: 'Modifier {{name}}',\n keyLine:\n 'Identifiant : {{key}}. Défini à la création, il ne change jamais.',\n codeLine: 'Code : {{code}}. Défini à la création, il ne change jamais.',\n labelField: 'Libellé',\n labelFieldHelp:\n 'Laissez ce champ vide pour utiliser le libellé standard.',\n helpField: 'Texte d’aide',\n addNote:\n 'Une entrée libre est propre à ce cabinet et ne rejoint aucun vocabulaire partagé.',\n addParameterTitle: 'Ajouter un paramètre',\n addQuestionTitle: 'Ajouter une question à {{section}}',\n addSectionTitle: 'Ajouter une section',\n addCodeTitle: 'Ajouter un code de pathologie',\n codeField: 'Code',\n groupField: 'Groupe',\n directionField: 'Sens de l’amélioration',\n unitField: 'Unité',\n precisionField: 'Décimales',\n rangeMinField: 'Minimum de référence',\n rangeMaxField: 'Maximum de référence',\n typeField: 'Type de réponse',\n optionsField: 'Choix',\n optionsFieldHelp:\n 'Séparés par des virgules ; au moins un choix est requis.',\n parentField: 'Famille parente',\n parentFieldHelp:\n 'L’ajout d’un sous-code transforme sa famille en titre, qui ne peut plus être attribué directement.',\n sectionNeedsQuestion:\n 'Une nouvelle section apparaît dans le questionnaire dès qu’elle contient au moins une question active.',\n selectPlaceholder: 'Choisir…',\n save: 'Enregistrer',\n cancel: 'Annuler',\n add: 'Ajouter',\n panelTracked_many: '{{count}} suivis comme objectifs',\n panelLive_many: '{{count}} actifs',\n panelArchived_many: '{{count}} archivés',\n panelNotCaptured_many: '{{count}} non proposés lors de la saisie',\n },\n targets: {\n title: 'Objectifs nutritionnels',\n tileLabel: 'Objectif pour {{name}}',\n now: 'Valeur actuelle : {{value}}',\n nowBanded: 'Valeur actuelle : {{value}} · {{band}}',\n nowUnset: 'Pas encore mesuré',\n unset: 'Aucun objectif',\n status: {\n onTarget: 'Objectif atteint',\n approaching: 'Proche de l’objectif',\n offTarget: 'Éloigné de l’objectif',\n },\n edit: 'Modifier l’objectif : {{parameter}}',\n editTitle: 'Objectif : {{parameter}}',\n editField: 'Nouvel objectif',\n bounds: 'Entre {{range}}',\n outOfBounds: 'Saisissez un objectif compris entre {{range}}.',\n unsaved: 'Pas encore enregistré',\n save: 'Enregistrer l’objectif',\n clear: 'Effacer l’objectif',\n },\n summary: {\n fullQuestionnaire: 'Questionnaire complet',\n noAnswers: 'Aucune réponse n’a été enregistrée pour le moment.',\n jump: 'Répondez à {{field}} dans l’onglet Compléter',\n },\n compare: {\n visitsLabel: 'Consultations comparées',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: '{{total}} consultations comparées · {{from}} – {{to}}',\n minimum:\n 'Au moins deux consultations doivent rester sélectionnées pour la comparaison',\n stop: 'Arrêter la comparaison',\n panelTitle: 'Comparer les consultations',\n sameVisit:\n 'Sélectionnez au moins deux consultations différentes pour voir les changements.',\n summaryTitle: 'Évolution du {{from}} au {{to}}',\n tableLabel: 'Changements entre les consultations comparées',\n noChanges: 'Aucun changement entre ces consultations.',\n noChangesDescription:\n 'Les mêmes mesures, codes, traitements et notes ont été enregistrés lors de chacune d’elles.',\n present: 'Présent',\n added: 'Ajouté',\n removed: 'Retiré',\n changed: 'Modifié',\n notMeasured: 'Non mesuré',\n category: {\n measurement: 'Mesures',\n pathology: 'Pathologies',\n therapy: 'Traitements',\n note: 'Notes',\n },\n column: {\n item: 'Élément',\n change: 'Changement',\n },\n },\n event: {\n barLabel: 'Événements',\n chip: '{{label}} · {{date}}',\n separator: ', ',\n shown: 'Lignes d’événement affichées : {{list}}',\n noneShown: 'Aucune ligne d’événement affichée.',\n external: '{{category}} · enregistré par {{source}}',\n category: {\n therapy: 'Traitement',\n diet: 'Alimentation',\n fmd: 'Programme de régime mimant le jeûne',\n surgery: 'Chirurgie',\n lifestyle: 'Vie quotidienne',\n },\n label: {\n dietStart: 'Début du régime méditerranéen',\n fmdCycle: 'Cycle de régime mimant le jeûne',\n gymStart: 'Début de l’activité en salle de sport',\n chemoStart: 'Début de la chimiothérapie',\n surgery: 'Chirurgie de la vésicule biliaire',\n },\n source: {\n oncology: 'un oncologue extérieur à ce cabinet',\n },\n },\n grid: {\n parameter: 'Paramètre',\n caption:\n 'Valeurs des paramètres au fil des consultations, de la plus ancienne à la plus récente.',\n captionInModule:\n 'Valeurs des paramètres au fil des consultations de {{module}}, de la plus ancienne à la plus récente.',\n target: 'Objectif : {{value}} {{unit}}',\n trendLabel: 'Évolution de {{parameter}}',\n trend: 'Tendance',\n editable: 'Modifiable',\n editCell: '{{parameter}} : dernière consultation',\n baselineMerged: 'Fusion de {{total}} premières consultations',\n unlabelledSource: 'Autre',\n blockVisits_one: '{{count}} consultation',\n blockVisits_other: '{{count}} consultations',\n blockVisits_many: '{{count}} consultations',\n },\n readOnly: {\n subtitle: 'Dossier du plan de soins en lecture seule.',\n summary: 'Résumé du patient',\n none: 'Aucune donnée enregistrée.',\n perWeek: 'Fréquence hebdomadaire : {{times}}',\n },\n pathology: {\n E66: 'Obésité',\n E66_0: 'Obésité due à un excès de calories',\n E66_9: 'Obésité, sans précision',\n E11: 'Diabète de type 2',\n E11_9: 'Diabète de type 2 sans complication',\n E11_6: 'Diabète de type 2 avec autres complications précisées',\n E78: 'Troubles du métabolisme des lipoprotéines',\n I10: 'Hypertension artérielle essentielle',\n E03: 'Hypothyroïdie',\n K58: 'Syndrome de l’intestin irritable',\n D50: 'Anémie par carence en fer',\n E55: 'Carence en vitamine D',\n groupGeneral: 'Général',\n },\n param: {\n weight: 'Poids',\n height: 'Taille',\n bmi: 'IMC',\n waist: 'Tour de taille',\n hips: 'Tour de hanches',\n arm: 'Tour de bras',\n phaseAngle: 'Angle de phase',\n energy: 'Apport énergétique quotidien',\n protein: 'Protéines',\n fastingGlucose: 'Glycémie à jeun',\n hba1c: 'HbA1c',\n totalCholesterol: 'Cholestérol total',\n ldl: 'Cholestérol LDL',\n hdl: 'Cholestérol HDL',\n triglycerides: 'Triglycérides',\n haemoglobin: 'Hémoglobine',\n vitaminD: 'Vitamine D (25-OH)',\n tsh: 'TSH',\n ferritin: 'Ferritine',\n crp: 'Protéine C-réactive',\n creatinine: 'Créatinine',\n },\n field: {\n highlighted: 'Signalé',\n reasonForVisit: {\n label: 'Motif de la consultation et objectifs',\n },\n knownConditions: {\n label: 'Pathologies connues',\n },\n dailyMedications: {\n label: 'Médicaments pris quotidiennement',\n },\n currentSupplements: {\n label: 'Compléments alimentaires actuels',\n },\n familyParents: {\n label: 'Parents',\n },\n familySiblings: {\n label: 'Frères et sœurs',\n },\n familyGrandparents: {\n label: 'Grands-parents',\n },\n bloating: {\n label: 'Ballonnements abdominaux',\n },\n refluxGastritis: {\n label: 'Reflux ou gastrite',\n },\n tiredness: {\n label: 'Fatigue',\n },\n sleepQuality: {\n label: 'Qualité du sommeil',\n option: {\n good: 'Bonne',\n fair: 'Moyenne',\n poor: 'Mauvaise',\n },\n },\n sleepDifficulty: {\n label: 'Difficultés d’endormissement ou réveils nocturnes',\n },\n bowelHabits: {\n label: 'Transit intestinal',\n option: {\n regular: 'Régulier',\n constipated: 'Constipation',\n diarrhoeal: 'Diarrhée',\n alternating: 'Alternance constipation et diarrhée',\n },\n },\n stoolCharacteristics: {\n label: 'Caractéristiques des selles',\n },\n haemorrhoids: {\n label: 'Hémorroïdes',\n },\n diverticula: {\n label: 'Diverticules',\n },\n regularUrination: {\n label: 'Mictions régulières',\n },\n menstrualCycle: {\n label: 'Cycle menstruel',\n option: {\n regular: 'Régulier',\n irregular: 'Irrégulier',\n absent: 'Absent',\n },\n },\n foodAllergies: {\n label: 'Allergies alimentaires',\n },\n drugAllergies: {\n label: 'Allergies médicamenteuses',\n },\n otherAllergies: {\n label: 'Autres allergies',\n },\n foodIntolerances: {\n label: 'Intolérances alimentaires',\n },\n smoking: {\n label: 'Tabagisme',\n option: {\n never: 'Jamais fumé',\n former: 'Ancien fumeur',\n current: 'Fumeur actuel',\n },\n },\n pastSurgery: {\n label: 'Antécédents chirurgicaux',\n },\n pregnancies: {\n label: 'Grossesses',\n },\n weightSelf: {\n label: 'Poids (kg)',\n },\n heightSelf: {\n label: 'Taille (cm)',\n },\n physicalActivity: {\n label: 'Activité physique actuelle',\n },\n lifestyle: {\n label: 'Mode de vie actuel',\n },\n waterPerDay: {\n label: 'Eau (litres par jour)',\n },\n fizzyDrinks: {\n label: 'Boissons gazeuses',\n option: {\n never: 'Jamais',\n occasionally: 'Occasionnellement',\n daily: 'Tous les jours',\n },\n },\n alcohol: {\n label: 'Alcool',\n option: {\n never: 'Jamais',\n occasionally: 'Occasionnellement',\n daily: 'Tous les jours',\n },\n },\n coffeePerDay: {\n label: 'Café (tasses par jour)',\n },\n coffeeSugar: {\n label: 'Café avec du sucre ?',\n option: {\n yes: 'Oui',\n no: 'Non',\n },\n },\n breakfast: {\n label: 'Petit-déjeuner',\n },\n morningSnack: {\n label: 'Collation du matin',\n },\n lunch: {\n label: 'Déjeuner',\n },\n afternoonSnack: {\n label: 'Collation de l’après-midi',\n },\n dinner: {\n label: 'Dîner',\n },\n afterDinner: {\n label: 'Après le dîner',\n },\n pulses: {\n label: 'Légumineuses (fois par semaine)',\n },\n fish: {\n label: 'Poisson (fois par semaine)',\n detailLabel: 'Quels poissons préférez-vous ?',\n },\n eggs: {\n label: 'Œufs (fois par semaine)',\n },\n meatCuredMeat: {\n label: 'Viande et charcuterie (fois par semaine)',\n detailLabel: 'Viande rouge ou blanche ?',\n },\n dairy: {\n label: 'Produits laitiers (fois par semaine)',\n detailLabel: 'Quels produits laitiers préférez-vous ?',\n },\n visitType: {\n label: 'Type de consultation',\n },\n practitioner: {\n label: 'Praticien',\n },\n tumourType: {\n label: 'Type de tumeur',\n },\n stage: {\n label: 'Stade',\n },\n metastases: {\n label: 'Métastases',\n },\n treatmentStatus: {\n label: 'Statut du traitement',\n },\n medName: {\n label: 'Nom',\n },\n medDose: {\n label: 'Dose',\n },\n nutritionalProposal: {\n label: 'Proposition nutritionnelle',\n },\n clinicalNotes: {\n label: 'Notes cliniques',\n },\n annualProposed: {\n label: 'Proposé',\n },\n annualAccepted: {\n label: 'Accepté',\n },\n annualDeclineReason: {\n label: 'Motif du refus',\n },\n },\n questionnaire: {\n noNumeric: {\n title: 'Aucune donnée à comparer pour le moment',\n description:\n 'L’évolution compare les réponses numériques entre les questionnaires. Dans les paramètres du formulaire, attribuez le type numérique et une unité à une question, puis remplissez le questionnaire au moins deux fois.',\n },\n overviewTab: 'Vue d’ensemble',\n },\n empty: {\n noVisits: {\n title: 'Aucune consultation pour le moment',\n description:\n 'Les valeurs et les tendances apparaîtront ici une fois la première consultation enregistrée.',\n },\n noRecord: {\n title: 'Aucune donnée enregistrée pour le moment',\n description:\n 'Ce dossier ne contient aucune consultation. Ajoutez la première consultation pour commencer à consigner des informations.',\n create: 'Commencer le premier questionnaire',\n createSigned: 'Commencer avec signature',\n },\n noQuestions: {\n title: 'Aucune question à renseigner',\n description:\n 'Ce questionnaire ne contient aucune question active. Demandez au cabinet d’en activer.',\n },\n noParameters: {\n title: 'Aucune mesure configurée',\n description:\n 'Aucune mesure n’est configurée pour ce cabinet. Il n’y a donc aucune donnée à représenter pour le moment.',\n },\n },\n visitNote: {\n title: 'Notes de consultation',\n trigger: 'Notes de consultation : {{visitType}}, {{date}}',\n openInPanel:\n 'Ouvrir les notes de la consultation {{visitType}} du {{date}} dans la vue des notes',\n },\n rail: {\n notes: 'Notes et événements',\n empty: 'Ce dossier ne contient ni note ni événement.',\n eventLabel: 'Événement',\n },\n window: {\n label: 'Consultations affichées',\n pickerTrigger: 'Consultations · {{shown}} sur {{total}}',\n selectAll: 'Tout sélectionner',\n showing:\n 'Consultations affichées : {{shown}} sur {{total}} · {{from}} – {{to}}',\n showingAll: 'Toutes les consultations : {{total}} · {{from}} – {{to}}',\n minimum: 'Au moins une consultation doit rester affichée',\n optionHasNote: '{{label}} · note',\n },\n digest: {\n group: {\n reason: 'Motif de la consultation',\n history: 'Pathologies et médicaments',\n flags: 'Symptômes signalés',\n habits: 'Habitudes quotidiennes',\n },\n nothing: {\n title: 'Aucune donnée à résumer pour le moment',\n description:\n 'Les réponses enregistrées jusqu’à présent ne figurent pas dans le résumé. Ouvrez le questionnaire complet ci-dessous pour les lire.',\n },\n missing: {\n title_one: '{{count}} question obligatoire encore sans réponse',\n title_other: '{{count}} questions obligatoires encore sans réponse',\n list: 'Réponses encore manquantes : {{list}}',\n separator: ', ',\n jump: 'Aller à {{field}}',\n title_many: '{{count}} questions obligatoires encore sans réponse',\n },\n },\n export: {\n tab: {\n summary: 'Résumé',\n compile: 'Compléter',\n evolution: 'Évolution',\n },\n docTab: {\n summary: 'Résumé du questionnaire',\n compile: 'Dossier de consultation',\n evolution: 'Évolution',\n },\n docTitle: '{{tab}} : {{patient}}',\n info: 'Détails du document',\n generated: 'Généré le',\n audienceLabel: 'Copie destinée à',\n audience: {\n clinician: 'Le cabinet',\n patient: 'Le patient',\n external: 'Un professionnel extérieur',\n },\n visitsLabel: 'Consultations incluses',\n visitsSelected: '{{shown}} sur {{total}}',\n visitsAll: 'Toutes ({{total}})',\n withheld: 'Certains détails cliniques ne figurent pas dans cette copie.',\n none: 'Aucune donnée enregistrée.',\n listSeparator: ', ',\n flagged: '{{date}} ({{flag}})',\n source: {\n patient: 'Patient',\n clinician: 'Praticien',\n },\n column: {\n question: 'Question',\n answer: 'Réponse',\n source: 'Source',\n field: 'Champ',\n value: 'Valeur',\n unit: 'Unité',\n referenceRange: 'Intervalle de référence',\n flag: 'Signalement',\n target: 'Objectif',\n change: 'Évolution {{from}} → {{to}}',\n outOfRange: 'Hors de l’intervalle',\n code: 'Code',\n description: 'Description',\n name: 'Nom',\n dose: 'Dose',\n kind: 'Type',\n cycle: 'Cycle',\n startDate: 'Date de début',\n status: 'Statut',\n notes: 'Notes',\n note: 'Note',\n text: 'Texte',\n },\n control: {\n trigger: 'Exporter et partager',\n triggerLabel: 'Exporter et partager la vue {{tab}}',\n triggerLabelAudience:\n 'Exporter et partager la vue {{tab}}, {{audience}}',\n audienceBadge: 'Copie patient',\n menuLabel: 'Vue {{tab}}',\n everyVisit:\n 'Inclure toutes les consultations, pas uniquement les colonnes affichées',\n excludes: 'La copie patient exclut : {{list}}',\n excludesNone: 'La copie patient de cette vue n’exclut rien.',\n holds:\n 'La copie du cabinet contient le dossier complet, y compris {{list}}.',\n holdsNone:\n 'Cette vue ne contient aucun élément qui serait exclu de la copie patient.',\n share: 'Partager…',\n pdf: 'Télécharger le PDF',\n print: 'Imprimer',\n xlsx: 'Télécharger le fichier Excel (.xlsx)',\n csv: 'Télécharger le fichier CSV (.csv)',\n printFrame: 'Imprimer le document (aucun contenu visible)',\n printing: 'La boîte de dialogue d’impression du document s’ouvre.',\n ready: 'Le fichier {{file}} est prêt.',\n failed: 'Ce navigateur n’a pas pu préparer le fichier.',\n },\n share: {\n title: 'Partager la vue {{tab}}',\n mockBadge: 'Aperçu uniquement',\n subtitle:\n 'Choisissez le destinataire envisagé et consultez le contenu de sa copie.',\n noticeTitle: 'Rien n’est envoyé depuis cet écran',\n notice:\n 'Cet aperçu montre ce que contiendrait un partage, sans rien partager. Un partage réel nécessite un lien signé avec une date d’expiration, le consentement du patient et une trace du destinataire, du contenu et du canal utilisés. Ces éléments sont gérés en dehors de ce dossier.',\n audienceLabel: 'À qui cette copie serait-elle destinée ?',\n includes: 'Cette copie contiendrait',\n includesNone:\n 'Cette vue ne produit aucun document pour ce destinataire.',\n excludes: 'Cette copie exclurait',\n excludesNone: 'Rien n’est exclu de cette copie.',\n cancel: 'Annuler',\n confirm: 'Confirmer le destinataire',\n confirmed: 'Destinataire défini : {{audience}}. Rien n’a été envoyé.',\n },\n concept: {\n patient_identity: 'Identité du patient',\n intake_answers: 'Réponses au questionnaire',\n visit_date: 'Dates des consultations',\n visit_type: 'Type de consultation',\n visit_practitioner: 'Praticien',\n visit_reasonCode: 'Motif codé de la consultation',\n anthropometrics_values: 'Mesures anthropométriques',\n dietary_intake: 'Apports alimentaires',\n derived_bmi: 'IMC',\n lab_values: 'Résultats des analyses sanguines',\n pathology_codes: 'Codes diagnostiques',\n oncological_history: 'Antécédents oncologiques',\n therapy_entries: 'Traitements et compléments alimentaires',\n fmd_cycles: 'Cycles de régime mimant le jeûne',\n annual_programme: 'Programme annuel',\n notes_clinicalNotes: 'Notes cliniques',\n notes_nutritionalProposal: 'Proposition nutritionnelle',\n symptom_observations: 'Observations du praticien',\n compare_diff: 'Comparaison des consultations',\n visit_note: 'Notes de consultation',\n event_timeline: 'Chronologie des événements cliniques',\n export_tabDocument: 'Le document lui-même',\n export_workbook: 'Le classeur du dossier complet',\n },\n },\n },\n} as const;\n","/** Anamnesis interface resources (hi). */\nexport default {\n anamnesis: {\n mainLabel: 'चिकित्सा इतिहास रिकॉर्ड: {{mode}}',\n mode: {\n intake: 'प्रारंभिक जानकारी',\n compile: 'पूरा करें',\n questionnaire: 'प्रश्नावली',\n readOnly: 'केवल पढ़ने के लिए',\n },\n common: {\n yes: 'हाँ',\n no: 'नहीं',\n unknown: 'अज्ञात',\n notSure: 'निश्चित नहीं',\n choose: 'चुनें…',\n details: 'विवरण',\n detailsPending: '‘हाँ’ उत्तर देने पर दिखाई देता है',\n time: 'समय',\n whatEaten: 'आपने क्या खाया?',\n },\n header: {\n name: 'नाम',\n age: 'आयु',\n dob: 'जन्म तिथि',\n visitDate: 'परामर्श की तिथि',\n years: '{{age}} वर्ष',\n },\n origin: {\n fromPatient: 'रोगी से प्राप्त',\n },\n delta: {\n improved: 'सुधार हुआ',\n worsened: 'बिगड़ा',\n unchanged: 'कोई बदलाव नहीं',\n aria: '{{valence}}: {{change}}',\n },\n range: {\n aboveRange: 'सीमा से ऊपर',\n belowRange: 'सीमा से नीचे',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: 'शारीरिक माप',\n dietary: 'आहार सेवन',\n lab: 'रक्त जाँच',\n },\n visitType: {\n first: 'पहला परामर्श',\n followUp: 'फ़ॉलो-अप',\n },\n medKind: {\n medication: 'दवा',\n supplement: 'पूरक',\n },\n section: {\n reason: 'परामर्श का कारण',\n pharmacological: 'दवाओं का इतिहास',\n familyHistory: 'पारिवारिक इतिहास',\n symptoms: 'लक्षण',\n otherHistory: 'अन्य इतिहास',\n dietaryHistory: 'आहार का इतिहास',\n recall24h: 'पिछले 24 घंटों का आहार विवरण',\n foodFrequency: 'साप्ताहिक खाद्य सेवन की आवृत्ति',\n visitMeta: 'परामर्श का विवरण',\n patientIntake: 'रोगी की प्रारंभिक जानकारी',\n intakeGaps: 'अनुत्तरित प्रश्न',\n anthropometrics: 'शारीरिक माप',\n dietary: 'आहार सेवन',\n pathologies: 'रोग',\n oncological: 'कैंसर का इतिहास',\n therapy: 'उपचार और पूरक',\n labs: 'रक्त जाँच',\n fmd: 'उपवास के प्रभावों का अनुकरण करने वाला कार्यक्रम',\n proposal: 'पोषण संबंधी प्रस्ताव और नोट',\n annual: 'वार्षिक कार्यक्रम',\n evolution: 'समय के साथ बदलाव',\n },\n intake: {\n title: 'परामर्श से पहले की प्रश्नावली',\n subtitle: 'कृपया इसे अपने पहले परामर्श से पहले पूरा करें।',\n sectionsLabel: 'प्रश्नावली के खंड',\n answered: 'उत्तर दिए गए प्रश्न: {{total}} में से {{answered}}',\n sectionProgress: 'उत्तर दिए गए: {{total}} में से {{answered}}',\n submit: 'सहेजें',\n unsentNotice: 'इस प्रश्नावली को जमा करने पर आपके उत्तर दर्ज होते हैं।',\n submittedNotice: 'उत्तर सहेज दिए गए।',\n },\n compile: {\n tabSummary: 'सारांश',\n tabCompile: 'पूरा करें',\n tabEvolution: 'समय के साथ बदलाव',\n viewsLabel: 'रिकॉर्ड के दृश्य',\n visitCount: 'परामर्श: {{visits}}',\n bmiInStrip:\n 'BMI की गणना वज़न और ऊँचाई से की जाती है। इसे इस रिकॉर्ड के शीर्ष पर दिए गए सारांश में देखें।',\n gapsIntro:\n 'इन आवश्यक प्रश्नों के उत्तर नहीं मिले हैं। रोगी से पूछकर इन्हें दर्ज करें।',\n noIntake: 'रोगी ने कोई प्रश्नावली जमा नहीं की है।',\n pathologiesLabel: 'दर्ज किए गए रोग',\n pathologiesHelp:\n 'सभी लागू कोड चुनें। किसी रोगी के लिए एक साथ कई कोड लागू हो सकते हैं।',\n pathologiesPlaceholder: 'कोड खोजें…',\n noTherapy: 'कोई उपचार या पूरक दर्ज नहीं है।',\n addTherapy: 'दवा जोड़ें',\n removeTherapy: '{{name}} हटाएँ',\n noFmd: 'उपवास के प्रभावों का अनुकरण करने वाला कोई चक्र दर्ज नहीं है।',\n cycleNumber: 'चक्र {{number}}',\n cycleCompleted: 'पूरा हुआ',\n cycleInProgress: 'जारी है',\n blockEmpty: 'कुछ भी दर्ज नहीं है',\n blockFilled_one: 'दर्ज: {{count}}',\n blockFilled_other: 'दर्ज: {{count}}',\n blockFlagged_one: 'सीमा से बाहर: {{count}}',\n blockFlagged_other: 'सीमा से बाहर: {{count}}',\n blockOutstanding_one: 'उत्तर देना बाकी: {{count}}',\n blockOutstanding_other: 'उत्तर देना बाकी: {{count}}',\n blockSettled: 'सभी उत्तर दिए गए',\n addFollowUpVisit: 'फ़ॉलो-अप परामर्श जोड़ें',\n },\n configEditor: {\n title: 'चिकित्सा इतिहास की सेटिंग',\n intro:\n 'क्लिनिक की अपनी शब्दावली: नाम बदलें, क्रम बदलें, संग्रहित करें या जोड़ें। संग्रहित करने से कोई जानकारी हटती नहीं है। पहले से दर्ज उत्तर इतिहास में बने रहते हैं।',\n tabsLabel: 'सेटिंग की शब्दावलियाँ',\n tabQuestionnaire: 'प्रश्नावली',\n tabParameters: 'मापदंड',\n tabPathologies: 'रोग',\n tabTargets: 'लक्ष्य',\n targetsIntro:\n 'वे मापदंड चुनें जिन्हें क्लिनिक लक्ष्यों के रूप में ट्रैक करता है। ये रिकॉर्ड के ऊपर लक्ष्य कार्ड में दिखते हैं, जहाँ प्रत्येक रोगी का लक्ष्य मान तय किया जाता है और वर्तमान मान की लक्ष्य से तुलना देखी जाती है।',\n panelTracked_one: 'लक्ष्य के रूप में ट्रैक किए जा रहे मापदंड: {{count}}',\n panelTracked_other:\n 'लक्ष्य के रूप में ट्रैक किए जा रहे मापदंड: {{count}}',\n panelLive_one: 'सक्रिय: {{count}}',\n panelLive_other: 'सक्रिय: {{count}}',\n panelArchived_one: 'संग्रहित: {{count}}',\n panelArchived_other: 'संग्रहित: {{count}}',\n panelNotCaptured_one: 'जानकारी दर्ज करते समय उपलब्ध नहीं: {{count}}',\n panelNotCaptured_other: 'जानकारी दर्ज करते समय उपलब्ध नहीं: {{count}}',\n locked: 'लॉक है',\n lockedHint:\n 'BMI की गणना में उपयोग होता है। इसका नाम या क्रम बदलें, इसे हटाएँ नहीं',\n archived: 'संग्रहित',\n rowActions: '{{name}} की कार्रवाइयाँ',\n reorderHandle:\n '{{name}} का क्रम बदलें। स्थान बदलने के लिए Alt + ऊपर या Alt + नीचे दबाएँ।',\n reorderAnnounce:\n '{{name}} को {{total}} में से स्थान {{to}} पर ले जाया गया',\n edit: '{{name}} संपादित करें',\n archive: '{{name}} संग्रहित करें',\n restore: '{{name}} पुनर्स्थापित करें',\n addQuestion: 'प्रश्न जोड़ें',\n addSection: 'खंड जोड़ें',\n addParameter: 'मापदंड जोड़ें',\n addCode: 'कोड जोड़ें',\n sectionEmptyCapture:\n 'कोई सक्रिय प्रश्न नहीं है। जानकारी दर्ज करते समय यह खंड उपलब्ध नहीं होता।',\n familyHeading:\n 'उप-कोड वाला समूह। यह केवल शीर्षक है, इसे स्वयं दर्ज नहीं किया जा सकता',\n subCodeOf: '{{code}} का उप-कोड',\n direction: {\n down: 'कम होना बेहतर है',\n up: 'अधिक होना बेहतर है',\n toRange: 'सीमा में होना बेहतर है',\n },\n type: {\n text: 'संक्षिप्त उत्तर',\n textarea: 'विस्तृत उत्तर',\n numberInteger: 'संख्या (पूर्णांक)',\n numberDecimal: 'संख्या (दशमलव)',\n yesNoDetail: 'हाँ / नहीं',\n choice: 'एक विकल्प',\n choiceWithText: 'टेक्स्ट के साथ एक विकल्प',\n multiChoice: 'एक से अधिक विकल्प',\n frequency: 'साप्ताहिक आवृत्ति',\n meal: 'भोजन',\n },\n typeLine: 'उत्तर का प्रकार: {{type}}।',\n requiredBadge: 'आवश्यक',\n requiredField: 'उत्तर आवश्यक है',\n optionsCurrent: 'विकल्प: {{list}}।',\n editTitle: '{{name}} संपादित करें',\n keyLine: 'पहचानकर्ता: {{key}}। बनाते समय तय होता है और कभी नहीं बदलता।',\n codeLine: 'कोड: {{code}}। बनाते समय तय होता है और कभी नहीं बदलता।',\n labelField: 'लेबल',\n labelFieldHelp: 'मानक शब्दावली इस्तेमाल करने के लिए खाली छोड़ें।',\n helpField: 'सहायता टेक्स्ट',\n addNote:\n 'स्वतंत्र रूप से लिखी गई प्रविष्टि केवल इस क्लिनिक के लिए होती है। यह किसी साझा शब्दावली में शामिल नहीं होती।',\n addParameterTitle: 'मापदंड जोड़ें',\n addQuestionTitle: '{{section}} में प्रश्न जोड़ें',\n addSectionTitle: 'खंड जोड़ें',\n addCodeTitle: 'रोग का कोड जोड़ें',\n codeField: 'कोड',\n groupField: 'समूह',\n directionField: 'किस दिशा में बदलाव बेहतर है',\n unitField: 'इकाई',\n precisionField: 'दशमलव स्थान',\n rangeMinField: 'संदर्भ न्यूनतम',\n rangeMaxField: 'संदर्भ अधिकतम',\n typeField: 'उत्तर का प्रकार',\n optionsField: 'विकल्प',\n optionsFieldHelp: 'कॉमा से अलग करें। कम से कम एक विकल्प दें।',\n parentField: 'मूल समूह',\n parentFieldHelp:\n 'उप-कोड जोड़ने से उसका मूल समूह शीर्षक बन जाता है। इसके बाद उस समूह को स्वयं दर्ज नहीं किया जा सकता।',\n sectionNeedsQuestion:\n 'नया खंड प्रश्नावली में तभी दिखाई देता है जब उसमें कम से कम एक सक्रिय प्रश्न हो।',\n selectPlaceholder: 'चुनें…',\n save: 'सहेजें',\n cancel: 'रद्द करें',\n add: 'जोड़ें',\n },\n targets: {\n title: 'पोषण के लक्ष्य',\n tileLabel: '{{name}} का लक्ष्य',\n now: 'अभी {{value}}',\n nowBanded: 'अभी {{value}} · {{band}}',\n nowUnset: 'अभी मापा नहीं गया',\n unset: 'कोई लक्ष्य नहीं',\n status: {\n onTarget: 'लक्ष्य के अनुरूप',\n approaching: 'लक्ष्य के करीब',\n offTarget: 'लक्ष्य से दूर',\n },\n edit: 'लक्ष्य संपादित करें: {{parameter}}',\n editTitle: 'लक्ष्य: {{parameter}}',\n editField: 'नया लक्ष्य',\n bounds: '{{range}} के बीच',\n outOfBounds: '{{range}} के बीच कोई लक्ष्य दर्ज करें।',\n unsaved: 'अभी सहेजा नहीं गया',\n save: 'लक्ष्य सहेजें',\n clear: 'लक्ष्य हटाएँ',\n },\n summary: {\n fullQuestionnaire: 'पूरी प्रश्नावली',\n noAnswers: 'अभी कोई उत्तर दर्ज नहीं है।',\n jump: '‘पूरा करें’ टैब में {{field}} का उत्तर दें',\n },\n compare: {\n visitsLabel: 'तुलना किए जा रहे परामर्श',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: 'तुलना किए जा रहे परामर्श: {{total}} · {{from}} – {{to}}',\n minimum: 'तुलना में कम से कम दो परामर्श बने रहने चाहिए',\n stop: 'तुलना बंद करें',\n panelTitle: 'परामर्शों की तुलना करें',\n sameVisit: 'बदलाव देखने के लिए दो या अधिक अलग परामर्श चुनें।',\n summaryTitle: '{{from}} से {{to}} तक के बदलाव',\n tableLabel: 'तुलना किए गए परामर्शों के बीच क्या बदला',\n noChanges: 'इन परामर्शों के बीच कोई बदलाव नहीं है।',\n noChangesDescription:\n 'हर परामर्श में एक जैसे माप, कोड, उपचार और नोट दर्ज किए गए थे।',\n present: 'मौजूद',\n added: 'जोड़ा गया',\n removed: 'हटाया गया',\n changed: 'बदला गया',\n notMeasured: 'मापा नहीं गया',\n category: {\n measurement: 'माप',\n pathology: 'रोग',\n therapy: 'उपचार',\n note: 'नोट',\n },\n column: {\n item: 'मद',\n change: 'बदलाव',\n },\n },\n event: {\n barLabel: 'घटनाएँ',\n chip: '{{label}} · {{date}}',\n separator: ', ',\n shown: 'दिखाई गई घटना रेखाएँ: {{list}}',\n noneShown: 'कोई घटना रेखा नहीं दिखाई गई है।',\n external: '{{category}} · दर्ज करने वाला: {{source}}',\n category: {\n therapy: 'उपचार',\n diet: 'आहार',\n fmd: 'उपवास के प्रभावों का अनुकरण करने वाला कार्यक्रम',\n surgery: 'सर्जरी',\n lifestyle: 'दैनिक जीवन',\n },\n label: {\n dietStart: 'भूमध्यसागरीय आहार योजना शुरू की',\n fmdCycle: 'उपवास के प्रभावों का अनुकरण करने वाला चक्र',\n gymStart: 'जिम जाना शुरू किया',\n chemoStart: 'कीमोथेरेपी शुरू हुई',\n surgery: 'पित्ताशय की सर्जरी',\n },\n source: {\n oncology: 'इस क्लिनिक से बाहर के कैंसर विशेषज्ञ',\n },\n },\n grid: {\n parameter: 'मापदंड',\n caption: 'परामर्शों में मापदंडों के मान, सबसे पुराने परामर्श से शुरू।',\n captionInModule:\n '{{module}} के परामर्शों में मापदंडों के मान, सबसे पुराने परामर्श से शुरू।',\n target: 'लक्ष्य {{value}} {{unit}}',\n trendLabel: '{{parameter}} की प्रवृत्ति',\n trend: 'प्रवृत्ति',\n editable: 'संपादन योग्य',\n editCell: '{{parameter}}: नवीनतम परामर्श',\n baselineMerged: '{{total}} प्रारंभिक परामर्शों को मिलाकर बनाया गया',\n unlabelledSource: 'अन्य',\n blockVisits_one: '{{count}} परामर्श',\n blockVisits_other: '{{count}} परामर्श',\n },\n readOnly: {\n subtitle: 'उपचार योजना का रिकॉर्ड। केवल पढ़ने के लिए।',\n summary: 'रोगी का सारांश',\n none: 'कुछ भी दर्ज नहीं है।',\n perWeek: 'साप्ताहिक आवृत्ति: {{times}}',\n },\n pathology: {\n E66: 'मोटापा',\n E66_0: 'अधिक कैलोरी के कारण मोटापा',\n E66_9: 'मोटापा, अनिर्दिष्ट',\n E11: 'टाइप 2 डायबिटीज़ मेलिटस',\n E11_9: 'जटिलताओं के बिना टाइप 2 मधुमेह',\n E11_6: 'अन्य निर्दिष्ट जटिलताओं के साथ टाइप 2 मधुमेह',\n E78: 'लिपोप्रोटीन चयापचय के विकार',\n I10: 'प्राथमिक उच्च रक्तचाप',\n E03: 'हाइपोथायरॉइडिज़्म',\n K58: 'इरिटेबल बाउल सिंड्रोम',\n D50: 'आयरन की कमी से एनीमिया',\n E55: 'विटामिन D की कमी',\n groupGeneral: 'सामान्य',\n },\n param: {\n weight: 'वज़न',\n height: 'ऊँचाई',\n bmi: 'BMI',\n waist: 'कमर',\n hips: 'कूल्हे',\n arm: 'बाँह',\n phaseAngle: 'फ़ेज़ कोण',\n energy: 'दैनिक ऊर्जा',\n protein: 'प्रोटीन',\n fastingGlucose: 'खाली पेट रक्त शर्करा',\n hba1c: 'HbA1c',\n totalCholesterol: 'कुल कोलेस्ट्रॉल',\n ldl: 'LDL कोलेस्ट्रॉल',\n hdl: 'HDL कोलेस्ट्रॉल',\n triglycerides: 'ट्राइग्लिसराइड्स',\n haemoglobin: 'हीमोग्लोबिन',\n vitaminD: 'विटामिन D (25-OH)',\n tsh: 'TSH',\n ferritin: 'फ़ेरिटिन',\n crp: 'C-रिएक्टिव प्रोटीन',\n creatinine: 'क्रिएटिनिन',\n },\n field: {\n highlighted: 'चिह्नित',\n reasonForVisit: {\n label: 'परामर्श का कारण और लक्ष्य',\n },\n knownConditions: {\n label: 'ज्ञात रोग',\n },\n dailyMedications: {\n label: 'रोज़ ली जाने वाली दवाएँ',\n },\n currentSupplements: {\n label: 'वर्तमान पूरक',\n },\n familyParents: {\n label: 'माता-पिता',\n },\n familySiblings: {\n label: 'भाई-बहन',\n },\n familyGrandparents: {\n label: 'दादा-दादी और नाना-नानी',\n },\n bloating: {\n label: 'पेट फूलना',\n },\n refluxGastritis: {\n label: 'रिफ़्लक्स या गैस्ट्राइटिस',\n },\n tiredness: {\n label: 'थकान',\n },\n sleepQuality: {\n label: 'नींद की गुणवत्ता',\n option: {\n good: 'अच्छी',\n fair: 'ठीक-ठाक',\n poor: 'खराब',\n },\n },\n sleepDifficulty: {\n label: 'नींद आने में कठिनाई या रात में जागना',\n },\n bowelHabits: {\n label: 'मल त्याग की आदतें',\n option: {\n regular: 'नियमित',\n constipated: 'कब्ज़',\n diarrhoeal: 'दस्त',\n alternating: 'कभी कब्ज़, कभी दस्त',\n },\n },\n stoolCharacteristics: {\n label: 'मल की विशेषताएँ',\n },\n haemorrhoids: {\n label: 'बवासीर',\n },\n diverticula: {\n label: 'डाइवर्टिकुला',\n },\n regularUrination: {\n label: 'नियमित मूत्र त्याग',\n },\n menstrualCycle: {\n label: 'मासिक चक्र',\n option: {\n regular: 'नियमित',\n irregular: 'अनियमित',\n absent: 'नहीं होता',\n },\n },\n foodAllergies: {\n label: 'खाद्य एलर्जी',\n },\n drugAllergies: {\n label: 'दवाओं से एलर्जी',\n },\n otherAllergies: {\n label: 'अन्य एलर्जी',\n },\n foodIntolerances: {\n label: 'खाद्य असहिष्णुता',\n },\n smoking: {\n label: 'धूम्रपान',\n option: {\n never: 'कभी नहीं किया',\n former: 'पहले करते थे',\n current: 'अभी करते हैं',\n },\n },\n pastSurgery: {\n label: 'पूर्व में हुई सर्जरी',\n },\n pregnancies: {\n label: 'गर्भधारण',\n },\n weightSelf: {\n label: 'वज़न (kg)',\n },\n heightSelf: {\n label: 'ऊँचाई (cm)',\n },\n physicalActivity: {\n label: 'वर्तमान शारीरिक गतिविधि',\n },\n lifestyle: {\n label: 'वर्तमान जीवनशैली',\n },\n waterPerDay: {\n label: 'पानी (लीटर प्रतिदिन)',\n },\n fizzyDrinks: {\n label: 'कार्बोनेटेड पेय',\n option: {\n never: 'कभी नहीं',\n occasionally: 'कभी-कभी',\n daily: 'रोज़ाना',\n },\n },\n alcohol: {\n label: 'शराब',\n option: {\n never: 'कभी नहीं',\n occasionally: 'कभी-कभी',\n daily: 'रोज़ाना',\n },\n },\n coffeePerDay: {\n label: 'कॉफ़ी (कप प्रतिदिन)',\n },\n coffeeSugar: {\n label: 'कॉफ़ी में चीनी?',\n option: {\n yes: 'हाँ',\n no: 'नहीं',\n },\n },\n breakfast: {\n label: 'सुबह का नाश्ता',\n },\n morningSnack: {\n label: 'सुबह का हल्का भोजन',\n },\n lunch: {\n label: 'दोपहर का भोजन',\n },\n afternoonSnack: {\n label: 'दोपहर का हल्का भोजन',\n },\n dinner: {\n label: 'रात का भोजन',\n },\n afterDinner: {\n label: 'रात के भोजन के बाद',\n },\n pulses: {\n label: 'दालें (प्रति सप्ताह बार)',\n },\n fish: {\n label: 'मछली (प्रति सप्ताह बार)',\n detailLabel: 'आप कौन-सी मछली पसंद करते हैं?',\n },\n eggs: {\n label: 'अंडे (प्रति सप्ताह बार)',\n },\n meatCuredMeat: {\n label: 'मांस और संरक्षित मांस (प्रति सप्ताह बार)',\n detailLabel: 'लाल या सफ़ेद मांस?',\n },\n dairy: {\n label: 'दुग्ध उत्पाद (प्रति सप्ताह बार)',\n detailLabel: 'आप कौन-से दुग्ध उत्पाद पसंद करते हैं?',\n },\n visitType: {\n label: 'परामर्श का प्रकार',\n },\n practitioner: {\n label: 'स्वास्थ्य पेशेवर',\n },\n tumourType: {\n label: 'ट्यूमर का प्रकार',\n },\n stage: {\n label: 'अवस्था',\n },\n metastases: {\n label: 'मेटास्टेसिस',\n },\n treatmentStatus: {\n label: 'उपचार की स्थिति',\n },\n medName: {\n label: 'नाम',\n },\n medDose: {\n label: 'खुराक',\n },\n nutritionalProposal: {\n label: 'पोषण संबंधी प्रस्ताव',\n },\n clinicalNotes: {\n label: 'चिकित्सीय नोट',\n },\n annualProposed: {\n label: 'प्रस्तावित',\n },\n annualAccepted: {\n label: 'स्वीकार किया गया',\n },\n annualDeclineReason: {\n label: 'अस्वीकार करने का कारण',\n },\n },\n questionnaire: {\n noNumeric: {\n title: 'तुलना के लिए अभी कुछ नहीं है',\n description:\n 'प्रवृत्ति दृश्य अलग-अलग प्रश्नावलियों के संख्यात्मक उत्तरों की तुलना करता है। फ़ॉर्म सेटिंग में किसी प्रश्न का प्रकार ‘संख्या’ रखें और उसकी इकाई तय करें, फिर उसका उत्तर कम से कम दो बार दर्ज करें।',\n },\n overviewTab: 'अवलोकन',\n },\n empty: {\n noVisits: {\n title: 'अभी कोई परामर्श नहीं है',\n description:\n 'पहला परामर्श दर्ज होने पर मान और प्रवृत्तियाँ यहाँ दिखाई देंगी।',\n },\n noRecord: {\n title: 'अभी कुछ भी दर्ज नहीं है',\n description:\n 'इस रिकॉर्ड में कोई परामर्श नहीं है। जानकारी दर्ज करना शुरू करने के लिए पहला परामर्श जोड़ें।',\n create: 'पहली प्रश्नावली शुरू करें',\n createSigned: 'हस्ताक्षर के साथ शुरू करें',\n },\n noQuestions: {\n title: 'उत्तर देने के लिए कोई प्रश्न नहीं है',\n description:\n 'इस प्रश्नावली में कोई सक्रिय प्रश्न नहीं है। क्लिनिक से कुछ प्रश्न सक्षम करने को कहें।',\n },\n noParameters: {\n title: 'कोई माप सेट नहीं किया गया है',\n description:\n 'इस क्लिनिक ने कोई माप सेट नहीं किया है, इसलिए अभी ग्राफ़ में दिखाने के लिए कुछ नहीं है।',\n },\n },\n visitNote: {\n title: 'परामर्श के नोट',\n trigger: 'परामर्श के नोट: {{visitType}}, {{date}}',\n openInPanel:\n 'परामर्श के नोट, {{visitType}}, {{date}}, को नोट दृश्य में खोलें',\n },\n rail: {\n notes: 'नोट और घटनाएँ',\n empty: 'इस रिकॉर्ड में कोई नोट या घटना नहीं है।',\n eventLabel: 'घटना',\n },\n window: {\n label: 'दिखाए गए परामर्श',\n pickerTrigger: 'परामर्श · {{total}} में से {{shown}}',\n selectAll: 'सभी चुनें',\n showing:\n 'दिखाए गए परामर्श: {{total}} में से {{shown}} · {{from}} – {{to}}',\n showingAll: 'सभी परामर्श: {{total}} · {{from}} – {{to}}',\n minimum: 'कम से कम एक परामर्श दिखता रहना चाहिए',\n optionHasNote: '{{label}} · नोट',\n },\n digest: {\n group: {\n reason: 'परामर्श का कारण',\n history: 'रोग और दवाएँ',\n flags: 'बताए गए लक्षण',\n habits: 'दैनिक आदतें',\n },\n nothing: {\n title: 'सारांश के लिए अभी कुछ नहीं है',\n description:\n 'अब तक दर्ज उत्तर सारांश का हिस्सा नहीं हैं। उन्हें पढ़ने के लिए नीचे पूरी प्रश्नावली खोलें।',\n },\n missing: {\n title_one: 'अनुत्तरित आवश्यक प्रश्न: {{count}}',\n title_other: 'अनुत्तरित आवश्यक प्रश्न: {{count}}',\n list: 'अभी बाकी: {{list}}',\n separator: ', ',\n jump: '{{field}} पर जाएँ',\n },\n },\n export: {\n tab: {\n summary: 'सारांश',\n compile: 'पूरा करें',\n evolution: 'समय के साथ बदलाव',\n },\n docTab: {\n summary: 'प्रश्नावली का सारांश',\n compile: 'परामर्श का रिकॉर्ड',\n evolution: 'समय के साथ बदलाव',\n },\n docTitle: '{{tab}}: {{patient}}',\n info: 'दस्तावेज़ का विवरण',\n generated: 'बनाया गया',\n audienceLabel: 'प्रति किसके लिए',\n audience: {\n clinician: 'क्लिनिक',\n patient: 'रोगी',\n external: 'बाहरी स्वास्थ्य पेशेवर',\n },\n visitsLabel: 'शामिल परामर्श',\n visitsSelected: '{{total}} में से {{shown}}',\n visitsAll: 'सभी {{total}}',\n withheld: 'कुछ चिकित्सीय विवरण इस प्रति में शामिल नहीं हैं।',\n none: 'कुछ भी दर्ज नहीं है।',\n listSeparator: ', ',\n flagged: '{{date}} ({{flag}})',\n source: {\n patient: 'रोगी',\n clinician: 'चिकित्सक',\n },\n column: {\n question: 'प्रश्न',\n answer: 'उत्तर',\n source: 'स्रोत',\n field: 'फ़ील्ड',\n value: 'मान',\n unit: 'इकाई',\n referenceRange: 'संदर्भ सीमा',\n flag: 'चिह्न',\n target: 'लक्ष्य',\n change: 'बदलाव {{from}} → {{to}}',\n outOfRange: 'सीमा से बाहर',\n code: 'कोड',\n description: 'विवरण',\n name: 'नाम',\n dose: 'खुराक',\n kind: 'प्रकार',\n cycle: 'चक्र',\n startDate: 'प्रारंभ तिथि',\n status: 'स्थिति',\n notes: 'नोट',\n note: 'नोट',\n text: 'टेक्स्ट',\n },\n control: {\n trigger: 'निर्यात करें और साझा करें',\n triggerLabel: '{{tab}} दृश्य निर्यात करें और साझा करें',\n triggerLabelAudience:\n '{{tab}} दृश्य निर्यात करें और साझा करें, {{audience}}',\n audienceBadge: 'रोगी की प्रति',\n menuLabel: '{{tab}} दृश्य',\n everyVisit: 'हर परामर्श शामिल करें, केवल दिखाए गए कॉलम नहीं',\n excludes: 'रोगी की प्रति में शामिल नहीं होगा: {{list}}',\n excludesNone:\n 'इस दृश्य की रोगी की प्रति से कोई जानकारी नहीं हटाई जाती।',\n holds:\n 'क्लिनिक की प्रति में पूरा रिकॉर्ड रहता है, जिसमें {{list}} शामिल है।',\n holdsNone:\n 'इस दृश्य में ऐसी कोई जानकारी नहीं है जो रोगी की प्रति से हटाई जाए।',\n share: 'साझा करें…',\n pdf: 'PDF डाउनलोड करें',\n print: 'प्रिंट करें',\n xlsx: 'Excel (.xlsx) डाउनलोड करें',\n csv: 'CSV (.csv) डाउनलोड करें',\n printFrame: 'दस्तावेज़ प्रिंट करें (कोई दृश्यमान सामग्री नहीं)',\n printing: 'दस्तावेज़ के लिए प्रिंट संवाद खुल रहा है।',\n ready: '{{file}} तैयार है।',\n failed: 'यह ब्राउज़र फ़ाइल तैयार नहीं कर सका।',\n },\n share: {\n title: '{{tab}} दृश्य साझा करें',\n mockBadge: 'केवल पूर्वावलोकन',\n subtitle:\n 'चुनें कि प्रति किसके लिए होगी और देखें कि उसमें क्या शामिल होगा।',\n noticeTitle: 'इस स्क्रीन से कुछ भी नहीं भेजा जाता',\n notice:\n 'यह पूर्वावलोकन दिखाता है कि जानकारी साझा करना कैसा होगा। इससे जानकारी साझा नहीं होती। वास्तव में साझा करने के लिए समय-सीमा वाला हस्ताक्षरित लिंक, रोगी की सहमति और किसे कौन-सी जानकारी किस माध्यम से मिली, इसका रिकॉर्ड आवश्यक है। इन सबका प्रबंधन इस रिकॉर्ड के बाहर होता है।',\n audienceLabel: 'यह प्रति किसके लिए होगी?',\n includes: 'इस प्रति में शामिल होगा',\n includesNone:\n 'यह दृश्य इस प्राप्तकर्ता के लिए कोई दस्तावेज़ नहीं बनाता।',\n excludes: 'इस प्रति में शामिल नहीं होगा',\n excludesNone: 'इस प्रति से कोई जानकारी नहीं हटाई जाती।',\n cancel: 'रद्द करें',\n confirm: 'प्राप्तकर्ता की पुष्टि करें',\n confirmed:\n 'प्राप्तकर्ता तय किया गया: {{audience}}। कुछ भी नहीं भेजा गया है।',\n },\n concept: {\n patient_identity: 'रोगी की पहचान',\n intake_answers: 'प्रश्नावली के उत्तर',\n visit_date: 'परामर्श की तिथियाँ',\n visit_type: 'परामर्श का प्रकार',\n visit_practitioner: 'स्वास्थ्य पेशेवर',\n visit_reasonCode: 'परामर्श के कारण का कोड',\n anthropometrics_values: 'शारीरिक माप',\n dietary_intake: 'आहार सेवन',\n derived_bmi: 'BMI',\n lab_values: 'रक्त जाँच के मान',\n pathology_codes: 'निदान के कोड',\n oncological_history: 'कैंसर का इतिहास',\n therapy_entries: 'उपचार और पूरक',\n fmd_cycles: 'उपवास के प्रभावों का अनुकरण करने वाले चक्र',\n annual_programme: 'वार्षिक कार्यक्रम',\n notes_clinicalNotes: 'चिकित्सीय नोट',\n notes_nutritionalProposal: 'पोषण संबंधी प्रस्ताव',\n symptom_observations: 'चिकित्सक के अवलोकन',\n compare_diff: 'परामर्शों की तुलना',\n visit_note: 'परामर्श के नोट',\n event_timeline: 'चिकित्सीय घटनाओं का समयक्रम',\n export_tabDocument: 'स्वयं दस्तावेज़',\n export_workbook: 'पूरे रिकॉर्ड की वर्कबुक',\n },\n },\n },\n} as const;\n","/** Anamnesis interface resources (it). */\nexport default {\n anamnesis: {\n mainLabel: 'Cartella anamnestica: {{mode}}',\n mode: {\n intake: 'Anamnesi',\n compile: 'Compilazione',\n questionnaire: 'Questionario',\n readOnly: 'Sola lettura',\n },\n common: {\n yes: 'Sì',\n no: 'No',\n unknown: 'Non noto',\n notSure: 'Non so',\n choose: 'Seleziona…',\n details: 'Dettagli',\n detailsPending: 'Appare rispondendo “Sì”',\n time: 'Ora',\n whatEaten: 'Che cosa hai mangiato?',\n },\n header: {\n name: 'Nome',\n age: 'Età',\n dob: 'Data di nascita',\n visitDate: 'Data della visita',\n years: 'Età in anni: {{age}}',\n },\n origin: {\n fromPatient: 'Dal paziente',\n },\n delta: {\n improved: 'Migliorato',\n worsened: 'Peggiorato',\n unchanged: 'Invariato',\n aria: '{{valence}}: {{change}}',\n },\n range: {\n aboveRange: 'Sopra l’intervallo di riferimento',\n belowRange: 'Sotto l’intervallo di riferimento',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: 'Antropometria',\n dietary: 'Apporto alimentare',\n lab: 'Esami del sangue',\n },\n visitType: {\n first: 'Prima visita',\n followUp: 'Controllo',\n },\n medKind: {\n medication: 'Farmaco',\n supplement: 'Integratore',\n },\n section: {\n reason: 'Motivo della visita',\n pharmacological: 'Anamnesi farmacologica',\n familyHistory: 'Anamnesi familiare',\n symptoms: 'Sintomi',\n otherHistory: 'Altra anamnesi',\n dietaryHistory: 'Anamnesi alimentare',\n recall24h: 'Ricostruzione dell’alimentazione nelle ultime 24 ore',\n foodFrequency: 'Frequenza alimentare settimanale',\n visitMeta: 'Dettagli della visita',\n patientIntake: 'Questionario del paziente',\n intakeGaps: 'Domande senza risposta',\n anthropometrics: 'Antropometria',\n dietary: 'Apporto alimentare',\n pathologies: 'Patologie',\n oncological: 'Anamnesi oncologica',\n therapy: 'Terapia e integratori',\n labs: 'Esami del sangue',\n fmd: 'Programma di dieta mima-digiuno',\n proposal: 'Proposta nutrizionale e note',\n annual: 'Programma annuale',\n evolution: 'Andamento',\n },\n intake: {\n title: 'Questionario pre-visita',\n subtitle: 'Compila questo questionario prima della prima visita.',\n sectionsLabel: 'Sezioni del questionario',\n answered: 'Domande con risposta: {{answered}} su {{total}}',\n sectionProgress: '{{answered}} di {{total}} completate',\n submit: 'Salva',\n unsentNotice:\n 'Le risposte vengono registrate quando invii il questionario.',\n submittedNotice: 'Risposte salvate.',\n },\n compile: {\n tabSummary: 'Riepilogo',\n tabCompile: 'Compila',\n tabEvolution: 'Andamento',\n viewsLabel: 'Viste della cartella',\n visitCount: 'Visite: {{visits}}',\n bmiInStrip:\n 'Il BMI è calcolato in base a peso e altezza ed è riportato nel riepilogo in cima alla cartella.',\n gapsIntro:\n 'Queste domande obbligatorie non hanno ricevuto risposta. Registra le risposte insieme al paziente.',\n noIntake: 'Il paziente non ha inviato alcun questionario.',\n pathologiesLabel: 'Patologie assegnate',\n pathologiesHelp:\n 'Seleziona tutti i codici pertinenti. Un paziente può avere più codici associati.',\n pathologiesPlaceholder: 'Cerca codici…',\n noTherapy: 'Nessuna terapia o integratore registrato.',\n addTherapy: 'Aggiungi farmaco',\n removeTherapy: 'Rimuovi {{name}}',\n noFmd: 'Nessun ciclo di dieta mima-digiuno registrato.',\n cycleNumber: 'Ciclo {{number}}',\n cycleCompleted: 'Completato',\n cycleInProgress: 'In corso',\n blockEmpty: 'Nulla registrato',\n blockFilled_one: '{{count}} voce',\n blockFilled_other: '{{count}} voci',\n blockFlagged_one: '{{count}} valore fuori dall’intervallo',\n blockFlagged_other: '{{count}} valori fuori dall’intervallo',\n blockOutstanding_one: '{{count}} da completare',\n blockOutstanding_other: '{{count}} da completare',\n blockSettled: 'Tutte completate',\n addFollowUpVisit: 'Aggiungi controllo',\n blockFilled_many: '{{count}} voci',\n blockFlagged_many: '{{count}} valori fuori dall’intervallo',\n blockOutstanding_many: '{{count}} da completare',\n },\n configEditor: {\n title: 'Configurazione dell’anamnesi',\n intro:\n 'Puoi rinominare, riordinare, archiviare o aggiungere le voci usate nello studio. L’archiviazione non elimina le risposte già registrate, che restano nella cronologia.',\n tabsLabel: 'Vocabolari configurabili',\n tabQuestionnaire: 'Questionario',\n tabParameters: 'Parametri',\n tabPathologies: 'Patologie',\n tabTargets: 'Obiettivi',\n targetsIntro:\n 'Scegli i parametri che lo studio monitora come obiettivi. Nei riquadri sopra la cartella puoi impostare il valore obiettivo di ogni paziente e confrontarlo con il valore attuale.',\n panelTracked_one: '{{count}} tracciato come obiettivo',\n panelTracked_other: '{{count}} tracciati come obiettivi',\n panelLive_one: '{{count}} attivo',\n panelLive_other: '{{count}} attivi',\n panelArchived_one: '{{count}} archiviato',\n panelArchived_other: '{{count}} archiviati',\n panelNotCaptured_one: '{{count}} non proposta in compilazione',\n panelNotCaptured_other: '{{count}} non proposte in compilazione',\n locked: 'Bloccato',\n lockedHint:\n 'Usato per calcolare il BMI. Può essere rinominato o riordinato, ma non rimosso.',\n archived: 'Archiviato',\n rowActions: 'Azioni per {{name}}',\n reorderHandle:\n 'Riordina {{name}}. Premi Alt + Freccia su o Alt + Freccia giù per spostare l’elemento.',\n reorderAnnounce: '{{name}} spostato in posizione {{to}} di {{total}}',\n edit: 'Modifica {{name}}',\n archive: 'Archivia {{name}}',\n restore: 'Ripristina {{name}}',\n addQuestion: 'Aggiungi domanda',\n addSection: 'Aggiungi sezione',\n addParameter: 'Aggiungi parametro',\n addCode: 'Aggiungi codice',\n sectionEmptyCapture:\n 'Nessuna domanda attiva: questa sezione non è proposta in compilazione.',\n familyHeading:\n 'Famiglia con sotto-codici: è un’intestazione, non assegnabile',\n subCodeOf: 'Sotto-codice di {{code}}',\n direction: {\n down: 'Meglio più basso',\n up: 'Meglio più alto',\n toRange: 'Meglio nell’intervallo di riferimento',\n },\n type: {\n text: 'Risposta breve',\n textarea: 'Risposta lunga',\n numberInteger: 'Numero (intero)',\n numberDecimal: 'Numero (decimale)',\n yesNoDetail: 'Sì / No',\n choice: 'Scelta singola',\n choiceWithText: 'Scelta singola con testo',\n multiChoice: 'Scelta multipla (più risposte)',\n frequency: 'Frequenza settimanale',\n meal: 'Pasto',\n },\n typeLine: 'Tipo di risposta: {{type}}.',\n requiredBadge: 'Obbligatoria',\n requiredField: 'Risposta obbligatoria',\n optionsCurrent: 'Opzioni: {{list}}.',\n editTitle: 'Modifica {{name}}',\n keyLine:\n 'Identificatore: {{key}}: assegnato alla creazione, non cambia mai.',\n codeLine: 'Codice: {{code}}: assegnato alla creazione, non cambia mai.',\n labelField: 'Etichetta',\n labelFieldHelp: 'Lascia vuoto per usare la dicitura standard.',\n helpField: 'Testo di aiuto',\n addNote:\n 'Una voce libera resta locale a questo studio: non entra in alcun vocabolario condiviso.',\n addParameterTitle: 'Aggiungi un parametro',\n addQuestionTitle: 'Aggiungi una domanda a {{section}}',\n addSectionTitle: 'Aggiungi una sezione',\n addCodeTitle: 'Aggiungi un codice patologia',\n codeField: 'Codice',\n groupField: 'Gruppo',\n directionField: 'Cosa conta come miglioramento',\n unitField: 'Unità',\n precisionField: 'Decimali',\n rangeMinField: 'Minimo di riferimento',\n rangeMaxField: 'Massimo di riferimento',\n typeField: 'Tipo di risposta',\n optionsField: 'Opzioni',\n optionsFieldHelp:\n 'Inserisci almeno un’opzione. Separa le opzioni con una virgola.',\n parentField: 'Famiglia di appartenenza',\n parentFieldHelp:\n 'Aggiungendo un sotto-codice, la famiglia diventa un’intestazione non più assegnabile direttamente.',\n sectionNeedsQuestion:\n 'Una nuova sezione compare nel questionario quando contiene almeno una domanda attiva.',\n selectPlaceholder: 'Scegli…',\n save: 'Salva',\n cancel: 'Annulla',\n add: 'Aggiungi',\n panelTracked_many: '{{count}} tracciati come obiettivi',\n panelLive_many: '{{count}} attivi',\n panelArchived_many: '{{count}} archiviati',\n panelNotCaptured_many: '{{count}} non proposte in compilazione',\n },\n targets: {\n title: 'Obiettivi nutrizionali',\n tileLabel: 'Obiettivo {{name}}',\n now: 'Ora {{value}}',\n nowBanded: 'Ora {{value}} · {{band}}',\n nowUnset: 'Non ancora misurato',\n unset: 'Nessun obiettivo',\n status: {\n onTarget: 'In linea',\n approaching: 'In avvicinamento',\n offTarget: 'Fuori obiettivo',\n },\n edit: 'Modifica obiettivo: {{parameter}}',\n editTitle: 'Obiettivo: {{parameter}}',\n editField: 'Nuovo obiettivo',\n bounds: 'Tra {{range}}',\n outOfBounds: 'Inserisci un obiettivo compreso tra {{range}}.',\n unsaved: 'Non ancora salvato',\n save: 'Salva obiettivo',\n clear: 'Rimuovi obiettivo',\n },\n summary: {\n fullQuestionnaire: 'Il questionario completo',\n noAnswers: 'Nessuna risposta registrata finora.',\n jump: 'Rispondi a {{field}} nella scheda Compila',\n },\n compare: {\n visitsLabel: 'Visite confrontate',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: '{{total}} visite confrontate · {{from}} – {{to}}',\n minimum: 'Il confronto deve includere almeno due visite',\n stop: 'Interrompi confronto',\n panelTitle: 'Confronta le visite',\n sameVisit:\n 'Seleziona almeno due visite diverse per vedere le differenze.',\n summaryTitle: 'Modifiche dal {{from}} al {{to}}',\n tableLabel: 'Che cosa è cambiato tra le visite confrontate',\n noChanges: 'Nessuna modifica tra queste visite.',\n noChangesDescription:\n 'In tutte sono stati registrati gli stessi valori, codici, terapie e note.',\n present: 'Presente',\n added: 'Aggiunto',\n removed: 'Rimosso',\n changed: 'Modificato',\n notMeasured: 'Non misurato',\n category: {\n measurement: 'Misurazioni',\n pathology: 'Patologie',\n therapy: 'Terapia',\n note: 'Note',\n },\n column: {\n item: 'Voce',\n change: 'Variazione',\n },\n },\n event: {\n barLabel: 'Eventi',\n chip: '{{label}} · {{date}}',\n separator: ', ',\n shown: 'Linee evento mostrate: {{list}}',\n noneShown: 'Nessuna linea evento mostrata.',\n external: '{{category}} · fonte: {{source}}',\n category: {\n therapy: 'Terapia',\n diet: 'Dieta',\n fmd: 'Programma di dieta mima-digiuno',\n surgery: 'Intervento',\n lifestyle: 'Vita quotidiana',\n },\n label: {\n dietStart: 'Avvio del piano mediterraneo',\n fmdCycle: 'Ciclo di dieta mima-digiuno',\n gymStart: 'Inizio dell’attività in palestra',\n chemoStart: 'Avvio della chemioterapia',\n surgery: 'Intervento alla colecisti',\n },\n source: {\n oncology: 'un oncologo esterno allo studio',\n },\n },\n grid: {\n parameter: 'Parametro',\n caption: 'Valori dei parametri nelle visite, dalla meno recente.',\n captionInModule:\n 'Valori dei parametri nelle visite di {{module}}, dalla meno recente.',\n target: 'Obiettivo {{value}} {{unit}}',\n trendLabel: 'Andamento {{parameter}}',\n trend: 'Andamento',\n editable: 'Modificabile',\n editCell: '{{parameter}}: ultima visita',\n baselineMerged: 'Unione di {{total}} prime visite',\n unlabelledSource: 'Altro',\n blockVisits_one: '{{count}} visita',\n blockVisits_other: '{{count}} visite',\n blockVisits_many: '{{count}} visite',\n },\n readOnly: {\n subtitle: 'Cartella del piano di cura: sola lettura.',\n summary: 'Riepilogo paziente',\n none: 'Nessuno registrato.',\n perWeek: 'Frequenza settimanale: {{times}}',\n },\n pathology: {\n E66: 'Obesità',\n E66_0: 'Obesità da eccesso calorico',\n E66_9: 'Obesità non specificata',\n E11: 'Diabete mellito di tipo 2',\n E11_9: 'Diabete di tipo 2 senza complicanze',\n E11_6: 'Diabete di tipo 2 con altre complicanze specificate',\n E78: 'Disturbi del metabolismo delle lipoproteine',\n I10: 'Ipertensione essenziale',\n E03: 'Ipotiroidismo',\n K58: 'Sindrome dell’intestino irritabile',\n D50: 'Anemia sideropenica',\n E55: 'Carenza di vitamina D',\n groupGeneral: 'Generale',\n },\n param: {\n weight: 'Peso',\n height: 'Altezza',\n bmi: 'IMC (BMI)',\n waist: 'Girovita',\n hips: 'Fianchi',\n arm: 'Braccio',\n phaseAngle: 'Angolo di fase',\n energy: 'Energia giornaliera',\n protein: 'Proteine',\n fastingGlucose: 'Glicemia a digiuno',\n hba1c: 'Emoglobina glicata (HbA1c)',\n totalCholesterol: 'Colesterolo totale',\n ldl: 'Colesterolo LDL',\n hdl: 'Colesterolo HDL',\n triglycerides: 'Trigliceridi',\n haemoglobin: 'Emoglobina',\n vitaminD: 'Vitamina D (25-OH)',\n tsh: 'TSH',\n ferritin: 'Ferritina',\n crp: 'Proteina C reattiva',\n creatinine: 'Creatinina',\n },\n field: {\n highlighted: 'In risalto',\n reasonForVisit: {\n label: 'Motivo della visita e obiettivi',\n },\n knownConditions: {\n label: 'Patologie note',\n },\n dailyMedications: {\n label: 'Farmaci quotidiani',\n },\n currentSupplements: {\n label: 'Integratori attuali',\n },\n familyParents: {\n label: 'Genitori',\n },\n familySiblings: {\n label: 'Fratelli e sorelle',\n },\n familyGrandparents: {\n label: 'Nonni',\n },\n bloating: {\n label: 'Gonfiore addominale',\n },\n refluxGastritis: {\n label: 'Reflusso o gastrite',\n },\n tiredness: {\n label: 'Stanchezza',\n },\n sleepQuality: {\n label: 'Qualità del sonno',\n option: {\n good: 'Buona',\n fair: 'Discreta',\n poor: 'Scarsa',\n },\n },\n sleepDifficulty: {\n label: 'Difficoltà ad addormentarsi o risvegli notturni',\n },\n bowelHabits: {\n label: 'Abitudini intestinali',\n option: {\n regular: 'Regolari',\n constipated: 'Stitichezza',\n diarrhoeal: 'Diarrea',\n alternating: 'Alternanza di stitichezza e diarrea',\n },\n },\n stoolCharacteristics: {\n label: 'Caratteristiche delle feci',\n },\n haemorrhoids: {\n label: 'Emorroidi',\n },\n diverticula: {\n label: 'Diverticoli',\n },\n regularUrination: {\n label: 'Minzione regolare',\n },\n menstrualCycle: {\n label: 'Ciclo mestruale',\n option: {\n regular: 'Regolare',\n irregular: 'Irregolare',\n absent: 'Assente',\n },\n },\n foodAllergies: {\n label: 'Allergie alimentari',\n },\n drugAllergies: {\n label: 'Allergie ai farmaci',\n },\n otherAllergies: {\n label: 'Altre allergie',\n },\n foodIntolerances: {\n label: 'Intolleranze alimentari',\n },\n smoking: {\n label: 'Fumo',\n option: {\n never: 'Mai fumato',\n former: 'Ex fumatore',\n current: 'Fumatore attuale',\n },\n },\n pastSurgery: {\n label: 'Interventi chirurgici pregressi',\n },\n pregnancies: {\n label: 'Gravidanze',\n },\n weightSelf: {\n label: 'Peso (kg)',\n },\n heightSelf: {\n label: 'Altezza (cm)',\n },\n physicalActivity: {\n label: 'Attività fisica attuale',\n },\n lifestyle: {\n label: 'Stile di vita attuale',\n },\n waterPerDay: {\n label: 'Acqua (litri al giorno)',\n },\n fizzyDrinks: {\n label: 'Bevande gassate',\n option: {\n never: 'Mai',\n occasionally: 'Occasionalmente',\n daily: 'Ogni giorno',\n },\n },\n alcohol: {\n label: 'Alcol',\n option: {\n never: 'Mai',\n occasionally: 'Occasionalmente',\n daily: 'Ogni giorno',\n },\n },\n coffeePerDay: {\n label: 'Caffè (tazzine al giorno)',\n },\n coffeeSugar: {\n label: 'Caffè con zucchero?',\n option: {\n yes: 'Sì',\n no: 'No',\n },\n },\n breakfast: {\n label: 'Colazione',\n },\n morningSnack: {\n label: 'Spuntino del mattino',\n },\n lunch: {\n label: 'Pranzo',\n },\n afternoonSnack: {\n label: 'Spuntino del pomeriggio',\n },\n dinner: {\n label: 'Cena',\n },\n afterDinner: {\n label: 'Dopo cena',\n },\n pulses: {\n label: 'Legumi (volte a settimana)',\n },\n fish: {\n label: 'Pesce (volte a settimana)',\n detailLabel: 'Quale pesce preferisci?',\n },\n eggs: {\n label: 'Uova (volte a settimana)',\n },\n meatCuredMeat: {\n label: 'Carne e salumi (volte a settimana)',\n detailLabel: 'Rossa o bianca?',\n },\n dairy: {\n label: 'Latticini (volte a settimana)',\n detailLabel: 'Quali latticini preferisci?',\n },\n visitType: {\n label: 'Tipo di visita',\n },\n practitioner: {\n label: 'Professionista',\n },\n tumourType: {\n label: 'Tipo di tumore',\n },\n stage: {\n label: 'Stadio',\n },\n metastases: {\n label: 'Metastasi',\n },\n treatmentStatus: {\n label: 'Stato del trattamento',\n },\n medName: {\n label: 'Nome',\n },\n medDose: {\n label: 'Dose',\n },\n nutritionalProposal: {\n label: 'Proposta nutrizionale',\n },\n clinicalNotes: {\n label: 'Note cliniche',\n },\n annualProposed: {\n label: 'Proposto',\n },\n annualAccepted: {\n label: 'Accettato',\n },\n annualDeclineReason: {\n label: 'Motivo del rifiuto',\n },\n },\n questionnaire: {\n noNumeric: {\n title: 'Ancora nulla da confrontare',\n description:\n 'L’andamento confronta le risposte numeriche tra i questionari. Nelle impostazioni del modulo, imposta una domanda di tipo numerico con un’unità di misura, poi compila il questionario almeno due volte.',\n },\n overviewTab: 'Panoramica',\n },\n empty: {\n noVisits: {\n title: 'Nessuna visita',\n description:\n 'Dopo la prima visita registrata, qui compaiono i valori e l’andamento.',\n },\n noRecord: {\n title: 'Nessun dato registrato',\n description:\n 'Questa cartella non contiene visite. Aggiungi la prima visita per iniziare a registrare informazioni.',\n create: 'Compila il primo questionario',\n createSigned: 'Compila con firma',\n },\n noQuestions: {\n title: 'Nessuna domanda a cui rispondere',\n description:\n 'Questo questionario non contiene domande attive. Chiedi allo studio di attivarle.',\n },\n noParameters: {\n title: 'Nessun parametro configurato',\n description:\n 'Questo studio non ha parametri configurati, quindi non c’è ancora nulla da mostrare.',\n },\n },\n visitNote: {\n title: 'Note della visita',\n trigger: 'Note della visita: {{visitType}}, {{date}}',\n openInPanel:\n 'Apri le note della visita ({{visitType}}, {{date}}) nella vista delle note',\n },\n rail: {\n notes: 'Note ed eventi',\n empty: 'Questa cartella non ha né note né eventi.',\n eventLabel: 'Evento',\n },\n window: {\n label: 'Visite mostrate',\n pickerTrigger: 'Visite · {{shown}} di {{total}}',\n selectAll: 'Seleziona tutto',\n showing: 'Visite mostrate: {{shown}} su {{total}} · {{from}} – {{to}}',\n showingAll: 'Tutte le visite: {{total}} · {{from}} – {{to}}',\n minimum: 'Deve restare visibile almeno una visita',\n optionHasNote: '{{label}} · nota',\n },\n digest: {\n group: {\n reason: 'Motivo della visita',\n history: 'Patologie e farmaci',\n flags: 'Sintomi riferiti',\n habits: 'Abitudini quotidiane',\n },\n nothing: {\n title: 'Non c’è ancora nulla da riassumere',\n description:\n 'Le risposte registrate finora non rientrano nel riepilogo. Apri il questionario completo qui sotto per leggerle.',\n },\n missing: {\n title_one: '{{count}} domanda obbligatoria senza risposta',\n title_other: '{{count}} domande obbligatorie senza risposta',\n list: 'Mancano ancora: {{list}}',\n separator: ', ',\n jump: 'Vai a {{field}}',\n title_many: '{{count}} domande obbligatorie senza risposta',\n },\n },\n export: {\n tab: {\n summary: 'Riepilogo',\n compile: 'Compila',\n evolution: 'Andamento',\n },\n docTab: {\n summary: 'Riepilogo del questionario',\n compile: 'Scheda visita',\n evolution: 'Andamento',\n },\n docTitle: '{{tab}}: {{patient}}',\n info: 'Dettagli del documento',\n generated: 'Generato',\n audienceLabel: 'Copia per',\n audience: {\n clinician: 'Lo studio',\n patient: 'Il paziente',\n external: 'Un professionista esterno',\n },\n visitsLabel: 'Visite incluse',\n visitsSelected: '{{shown}} su {{total}}',\n visitsAll: 'Tutte le {{total}}',\n withheld: 'Alcuni dettagli clinici non sono inclusi in questa copia.',\n none: 'Nessun dato registrato.',\n listSeparator: ', ',\n flagged: '{{date}} ({{flag}})',\n source: {\n patient: 'Paziente',\n clinician: 'Clinico',\n },\n column: {\n question: 'Domanda',\n answer: 'Risposta',\n source: 'Origine',\n field: 'Campo',\n value: 'Valore',\n unit: 'Unità',\n referenceRange: 'Intervallo di riferimento',\n flag: 'Segnalazione',\n target: 'Obiettivo',\n change: 'Variazione {{from}} → {{to}}',\n outOfRange: 'Fuori dall’intervallo',\n code: 'Codice',\n description: 'Descrizione',\n name: 'Nome',\n dose: 'Dose',\n kind: 'Tipo',\n cycle: 'Ciclo',\n startDate: 'Data di inizio',\n status: 'Stato',\n notes: 'Note',\n note: 'Nota',\n text: 'Testo',\n },\n control: {\n trigger: 'Esporta e condividi',\n triggerLabel: 'Esporta e condividi la vista {{tab}}',\n triggerLabelAudience:\n 'Esporta e condividi la vista {{tab}}, {{audience}}',\n audienceBadge: 'Copia per il paziente',\n menuLabel: 'Vista {{tab}}',\n everyVisit: 'Includi tutte le visite, non solo le colonne mostrate',\n excludes: 'Una copia per il paziente esclude: {{list}}',\n excludesNone:\n 'Una copia per il paziente non esclude nulla di questa vista.',\n holds:\n 'La copia per lo studio contiene la cartella completa, inclusi: {{list}}.',\n holdsNone:\n 'In questa vista non c’è nulla che una copia per il paziente escluderebbe.',\n share: 'Condividi…',\n pdf: 'Scarica PDF',\n print: 'Stampa',\n xlsx: 'Scarica Excel (.xlsx)',\n csv: 'Scarica CSV (.csv)',\n printFrame: 'Documento di stampa (nessun contenuto visibile)',\n printing: 'Si sta aprendo la finestra di stampa del documento.',\n ready: '{{file}} è pronto.',\n failed: 'Questo browser non è riuscito a preparare il file.',\n },\n share: {\n title: 'Condividi la vista {{tab}}',\n mockBadge: 'Solo anteprima',\n subtitle:\n 'Scegli il destinatario della copia e verifica che cosa conterrebbe.',\n noticeTitle: 'Da questa schermata non viene inviato nulla',\n notice:\n 'Questa anteprima mostra che cosa verrebbe condiviso. La condivisione effettiva richiede un link firmato con scadenza, il consenso del paziente e una registrazione dei destinatari, dei contenuti e dei canali usati. Queste funzioni sono gestite al di fuori della cartella.',\n audienceLabel: 'A chi sarebbe destinata questa copia?',\n includes: 'Questa copia conterrebbe',\n includesNone:\n 'Per questo destinatario questa vista non produce alcun documento.',\n excludes: 'Questa copia escluderebbe',\n excludesNone: 'Questa copia non esclude nulla.',\n cancel: 'Annulla',\n confirm: 'Conferma destinatario',\n confirmed:\n 'Destinatario impostato su {{audience}}. Non è stato inviato nulla.',\n },\n concept: {\n patient_identity: 'Dati anagrafici del paziente',\n intake_answers: 'Risposte al questionario',\n visit_date: 'Date delle visite',\n visit_type: 'Tipo di visita',\n visit_practitioner: 'Professionista',\n visit_reasonCode: 'Motivo della visita codificato',\n anthropometrics_values: 'Misure antropometriche',\n dietary_intake: 'Apporto alimentare',\n derived_bmi: 'BMI',\n lab_values: 'Valori degli esami del sangue',\n pathology_codes: 'Codici diagnostici',\n oncological_history: 'Anamnesi oncologica',\n therapy_entries: 'Terapia e integratori',\n fmd_cycles: 'Cicli di dieta mima-digiuno',\n annual_programme: 'Programma annuale',\n notes_clinicalNotes: 'Note cliniche',\n notes_nutritionalProposal: 'Proposta nutrizionale',\n symptom_observations: 'Osservazioni del clinico',\n compare_diff: 'Confronto tra visite',\n visit_note: 'Note della visita',\n event_timeline: 'Cronologia degli eventi clinici',\n export_tabDocument: 'Il documento stesso',\n export_workbook: 'La cartella di lavoro completa',\n },\n },\n },\n} as const;\n","/** Anamnesis interface resources (ja). */\nexport default {\n anamnesis: {\n mainLabel: '問診記録 — {{mode}}',\n mode: {\n intake: '問診',\n compile: '記入',\n questionnaire: '問診票',\n readOnly: '閲覧のみ',\n },\n common: {\n yes: 'はい',\n no: 'いいえ',\n unknown: '不明',\n notSure: 'わかりません',\n choose: '選択…',\n details: '詳細',\n detailsPending: '「はい」と回答すると表示されます',\n time: '時刻',\n whatEaten: '何を食べましたか?',\n },\n header: {\n name: '氏名',\n age: '年齢',\n dob: '生年月日',\n visitDate: '受診日',\n years: '{{age}}歳',\n },\n origin: {\n fromPatient: '患者から',\n },\n delta: {\n improved: '改善',\n worsened: '悪化',\n unchanged: '変化なし',\n aria: '{{valence}}: {{change}}',\n },\n range: {\n aboveRange: '基準値超',\n belowRange: '基準値未満',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: '身体計測',\n dietary: '食事摂取',\n lab: '血液検査',\n },\n visitType: {\n first: '初診',\n followUp: '再診',\n },\n medKind: {\n medication: '医薬品',\n supplement: 'サプリメント',\n },\n section: {\n reason: '受診理由',\n pharmacological: '服薬歴',\n familyHistory: '家族歴',\n symptoms: '症状',\n otherHistory: 'その他の既往歴',\n dietaryHistory: '食習慣',\n recall24h: '24時間食事思い出し記録',\n foodFrequency: '1週間の食品摂取頻度',\n visitMeta: '受診の詳細',\n patientIntake: '患者問診',\n intakeGaps: '未回答の質問',\n anthropometrics: '身体計測',\n dietary: '食事摂取',\n pathologies: '疾患',\n oncological: 'がんの既往歴',\n therapy: '治療・サプリメント',\n labs: '血液検査',\n fmd: '疑似断食プログラム',\n proposal: '栄養指導案・メモ',\n annual: '年間プログラム',\n evolution: '推移',\n },\n intake: {\n title: '受診前問診票',\n subtitle: '初診前にご記入ください。',\n sectionsLabel: '問診票のセクション',\n answered: '回答済みの質問:{{answered}}/{{total}}',\n sectionProgress: '{{total}}問中{{answered}}問に回答済み',\n submit: '保存',\n unsentNotice: '回答は、この問診票を送信した時点で記録されます。',\n submittedNotice: '回答を保存しました。',\n },\n compile: {\n tabSummary: '要約',\n tabCompile: '記入',\n tabEvolution: '推移',\n viewsLabel: 'カルテの表示',\n visitCount: '受診回数:{{visits}}',\n bmiInStrip:\n 'BMIは体重と身長から算出され、この記録の上部にある要約で確認できます。',\n gapsIntro: '以下の必須項目が未回答です。患者に確認して記録してください。',\n noIntake: '患者は問診票をまだ提出していません。',\n pathologiesLabel: '登録済みの疾患',\n pathologiesHelp:\n '該当するコードをすべて選択してください。1人の患者に複数のコードを登録できます。',\n pathologiesPlaceholder: 'コードを検索…',\n noTherapy: '治療やサプリメントは記録されていません。',\n addTherapy: '医薬品を追加',\n removeTherapy: '{{name}}を削除',\n noFmd: '疑似断食サイクルは記録されていません。',\n cycleNumber: 'サイクル {{number}}',\n cycleCompleted: '完了',\n cycleInProgress: '実施中',\n blockEmpty: '記録なし',\n blockFilled_one: '{{count}}件記録済み',\n blockFilled_other: '{{count}}件記録済み',\n blockFlagged_one: '{{count}}件が基準範囲外',\n blockFlagged_other: '{{count}}件が基準範囲外',\n blockOutstanding_one: '未回答 {{count}}件',\n blockOutstanding_other: '未回答 {{count}}件',\n blockSettled: 'すべて回答済み',\n addFollowUpVisit: '再診を追加',\n },\n configEditor: {\n title: '問診の設定',\n intro:\n '医院独自の項目について、名称変更、並べ替え、アーカイブ、追加ができます。アーカイブしても削除されることはなく、記録済みの回答は履歴に残ります。',\n tabsLabel: '設定する項目の種類',\n tabQuestionnaire: '問診票',\n tabParameters: '測定項目',\n tabPathologies: '疾患',\n tabTargets: '目標',\n targetsIntro:\n '医院で目標として追跡する測定項目を選択してください。記録の上部にある目標カードに表示され、患者ごとの目標値を設定し、現在値と目標値の比較を確認できます。',\n panelTracked_one: '{{count}}件を目標として追跡中',\n panelTracked_other: '{{count}}件を目標として追跡中',\n panelLive_one: '{{count}}件が有効',\n panelLive_other: '{{count}}件が有効',\n panelArchived_one: '{{count}}件をアーカイブ済み',\n panelArchived_other: '{{count}}件をアーカイブ済み',\n panelNotCaptured_one: '{{count}}件は入力時に表示されません',\n panelNotCaptured_other: '{{count}}件は入力時に表示されません',\n locked: 'ロック済み',\n lockedHint:\n 'BMIの算出に使用します。名称変更と並べ替えはできますが、削除はできません。',\n archived: 'アーカイブ済み',\n rowActions: '{{name}}の操作',\n reorderHandle:\n '{{name}}を並べ替え。Altキーと上矢印または下矢印キーで移動できます。',\n reorderAnnounce: '{{name}}を{{total}}件中{{to}}番目に移動しました',\n edit: '{{name}}を編集',\n archive: '{{name}}をアーカイブ',\n restore: '{{name}}を復元',\n addQuestion: '質問を追加',\n addSection: 'セクションを追加',\n addParameter: '測定項目を追加',\n addCode: 'コードを追加',\n sectionEmptyCapture:\n '有効な質問がないため、このセクションは入力時に表示されません。',\n familyHeading:\n '下位コードを持つ分類です。見出しとして使用され、この分類自体は登録できません。',\n subCodeOf: '{{code}}の下位コード',\n direction: {\n down: '低いほど良い',\n up: '高いほど良い',\n toRange: '範囲内が良い',\n },\n type: {\n text: '短文回答',\n textarea: '長文回答',\n numberInteger: '数値(整数)',\n numberDecimal: '数値(小数)',\n yesNoDetail: 'はい/いいえ',\n choice: '単一選択',\n choiceWithText: '単一選択+自由記述',\n multiChoice: '複数選択',\n frequency: '1週間の頻度',\n meal: '食事',\n },\n typeLine: '回答形式:{{type}}。',\n requiredBadge: '必須',\n requiredField: '回答必須',\n optionsCurrent: '選択肢:{{list}}。',\n editTitle: '{{name}}を編集',\n keyLine: '識別子:{{key}}。作成時に設定され、その後は変更されません。',\n codeLine: 'コード:{{code}}。作成時に設定され、その後は変更されません。',\n labelField: '表示名',\n labelFieldHelp: '空欄にすると標準の表記を使用します。',\n helpField: '説明文',\n addNote:\n '自由入力の項目は、この医院内でのみ使用されます。共有の用語集には追加されません。',\n addParameterTitle: '測定項目を追加',\n addQuestionTitle: '{{section}}に質問を追加',\n addSectionTitle: 'セクションを追加',\n addCodeTitle: '疾患コードを追加',\n codeField: 'コード',\n groupField: 'グループ',\n directionField: '改善とみなす方向',\n unitField: '単位',\n precisionField: '小数点以下の桁数',\n rangeMinField: '基準範囲の下限',\n rangeMaxField: '基準範囲の上限',\n typeField: '回答形式',\n optionsField: '選択肢',\n optionsFieldHelp: '半角カンマで区切って、1件以上入力してください。',\n parentField: '上位分類',\n parentFieldHelp:\n '下位コードを追加すると、その上位分類は見出しとなり、分類自体を登録できなくなります。',\n sectionNeedsQuestion:\n '新しいセクションは、有効な質問が1件以上あると問診票に表示されます。',\n selectPlaceholder: '選択…',\n save: '保存',\n cancel: 'キャンセル',\n add: '追加',\n },\n targets: {\n title: '栄養管理の目標',\n tileLabel: '{{name}}の目標',\n now: '現在 {{value}}',\n nowBanded: '現在 {{value}}・{{band}}',\n nowUnset: '未測定',\n unset: '目標なし',\n status: {\n onTarget: '目標達成',\n approaching: '目標に近づいています',\n offTarget: '目標未達',\n },\n edit: '目標を編集:{{parameter}}',\n editTitle: '目標:{{parameter}}',\n editField: '新しい目標',\n bounds: '範囲:{{range}}',\n outOfBounds: '{{range}}の範囲内で目標を入力してください。',\n unsaved: '未保存',\n save: '目標を保存',\n clear: '目標を解除',\n },\n summary: {\n fullQuestionnaire: '問診票の全項目',\n noAnswers: '回答はまだ記録されていません。',\n jump: '「記入」タブで{{field}}に回答',\n },\n compare: {\n visitsLabel: '比較する受診',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: '{{total}}回の受診を比較 · {{from}} – {{to}}',\n minimum: '比較対象には少なくとも2回の受診を残してください',\n stop: '比較を終了',\n panelTitle: '受診を比較',\n sameVisit: '変化を確認するには、異なる受診を2回以上選択してください。',\n summaryTitle: '{{from}}から{{to}}への変化',\n tableLabel: '比較した受診の間に変わったこと',\n noChanges: 'これらの受診の間に変化はありません。',\n noChangesDescription:\n 'いずれの受診でも同じ測定値・コード・治療・メモが記録されています。',\n present: 'あり',\n added: '追加',\n removed: '削除',\n changed: '変更',\n notMeasured: '未測定',\n category: {\n measurement: '測定値',\n pathology: '疾患',\n therapy: '治療',\n note: 'メモ',\n },\n column: {\n item: '項目',\n change: '変化',\n },\n },\n event: {\n barLabel: 'イベント',\n chip: '{{label}} · {{date}}',\n separator: '、',\n shown: '表示中のイベント線: {{list}}',\n noneShown: '表示中のイベント線はありません。',\n external: '{{category}} · 記録者: {{source}}',\n category: {\n therapy: '治療',\n diet: '食事',\n fmd: '疑似断食プログラム',\n surgery: '手術',\n lifestyle: '日常生活',\n },\n label: {\n dietStart: '地中海食プランの開始',\n fmdCycle: '疑似断食サイクル',\n gymStart: 'ジム通いの開始',\n chemoStart: '化学療法の開始',\n surgery: '胆のう手術',\n },\n source: {\n oncology: '院外の腫瘍専門医',\n },\n },\n grid: {\n parameter: '項目',\n caption: '受診ごとの項目値(古い順)。',\n captionInModule: '{{module}} の受診ごとの項目値(古い順)。',\n target: '目標 {{value}} {{unit}}',\n trendLabel: '{{parameter}}の推移',\n trend: '推移',\n editable: '編集可能',\n editCell: '{{parameter}} — 最新の受診',\n baselineMerged: '{{total}}件の初診を統合',\n unlabelledSource: 'その他',\n blockVisits_one: '{{count}}回の受診',\n blockVisits_other: '{{count}}回の受診',\n },\n readOnly: {\n subtitle: '治療計画の記録:閲覧のみ。',\n summary: '患者の要約',\n none: '記録なし。',\n perWeek: '週あたりの回数:{{times}}',\n },\n pathology: {\n E66: '肥満',\n E66_0: '過剰カロリーによる肥満',\n E66_9: '肥満、詳細不明',\n E11: '2型糖尿病',\n E11_9: '合併症のない2型糖尿病',\n E11_6: 'その他の明示された合併症を伴う2型糖尿病',\n E78: 'リポタンパク代謝障害',\n I10: '本態性高血圧',\n E03: '甲状腺機能低下症',\n K58: '過敏性腸症候群',\n D50: '鉄欠乏性貧血',\n E55: 'ビタミンD欠乏症',\n groupGeneral: '一般',\n },\n param: {\n weight: '体重',\n height: '身長',\n bmi: 'BMI',\n waist: '腹囲',\n hips: '臀囲',\n arm: '上腕周囲径',\n phaseAngle: '位相角',\n energy: '1日のエネルギー',\n protein: 'タンパク質',\n fastingGlucose: '空腹時血糖',\n hba1c: 'ヘモグロビンA1c(HbA1c)',\n totalCholesterol: '総コレステロール',\n ldl: 'LDLコレステロール',\n hdl: 'HDLコレステロール',\n triglycerides: '中性脂肪',\n haemoglobin: 'ヘモグロビン',\n vitaminD: 'ビタミンD(25-OH)',\n tsh: '甲状腺刺激ホルモン(TSH)',\n ferritin: 'フェリチン',\n crp: 'C反応性タンパク',\n creatinine: 'クレアチニン',\n },\n field: {\n highlighted: '注目すべき回答',\n reasonForVisit: {\n label: '受診理由と目標',\n },\n knownConditions: {\n label: '診断されている疾患',\n },\n dailyMedications: {\n label: '毎日服用している薬',\n },\n currentSupplements: {\n label: '現在使用しているサプリメント',\n },\n familyParents: {\n label: '両親',\n },\n familySiblings: {\n label: 'きょうだい',\n },\n familyGrandparents: {\n label: '祖父母',\n },\n bloating: {\n label: '腹部膨満感',\n },\n refluxGastritis: {\n label: '胃食道逆流または胃炎',\n },\n tiredness: {\n label: '疲労感',\n },\n sleepQuality: {\n label: '睡眠の質',\n option: {\n good: '良い',\n fair: '普通',\n poor: '悪い',\n },\n },\n sleepDifficulty: {\n label: '寝つきが悪い・夜中に目が覚める',\n },\n bowelHabits: {\n label: '排便の状態',\n option: {\n regular: '規則的',\n constipated: '便秘',\n diarrhoeal: '下痢',\n alternating: '便秘と下痢を繰り返す',\n },\n },\n stoolCharacteristics: {\n label: '便の性状',\n },\n haemorrhoids: {\n label: '痔核',\n },\n diverticula: {\n label: '憩室',\n },\n regularUrination: {\n label: '排尿は規則的ですか',\n },\n menstrualCycle: {\n label: '月経周期',\n option: {\n regular: '規則的',\n irregular: '不規則',\n absent: '月経なし',\n },\n },\n foodAllergies: {\n label: '食物アレルギー',\n },\n drugAllergies: {\n label: '薬物アレルギー',\n },\n otherAllergies: {\n label: 'その他のアレルギー',\n },\n foodIntolerances: {\n label: '食物不耐症',\n },\n smoking: {\n label: '喫煙',\n option: {\n never: '喫煙歴なし',\n former: '過去に喫煙',\n current: '現在喫煙中',\n },\n },\n pastSurgery: {\n label: '手術歴',\n },\n pregnancies: {\n label: '妊娠歴',\n },\n weightSelf: {\n label: '体重(kg)',\n },\n heightSelf: {\n label: '身長(cm)',\n },\n physicalActivity: {\n label: '現在の身体活動',\n },\n lifestyle: {\n label: '現在の生活習慣',\n },\n waterPerDay: {\n label: '水分摂取量(1日あたりのリットル数)',\n },\n fizzyDrinks: {\n label: '炭酸飲料',\n option: {\n never: '飲まない',\n occasionally: '時々',\n daily: '毎日',\n },\n },\n alcohol: {\n label: '飲酒',\n option: {\n never: '飲まない',\n occasionally: '時々',\n daily: '毎日',\n },\n },\n coffeePerDay: {\n label: 'コーヒー(1日あたりの杯数)',\n },\n coffeeSugar: {\n label: 'コーヒーに砂糖を入れますか?',\n option: {\n yes: 'はい',\n no: 'いいえ',\n },\n },\n breakfast: {\n label: '朝食',\n },\n morningSnack: {\n label: '午前の間食',\n },\n lunch: {\n label: '昼食',\n },\n afternoonSnack: {\n label: '午後の間食',\n },\n dinner: {\n label: '夕食',\n },\n afterDinner: {\n label: '夕食後',\n },\n pulses: {\n label: '豆類(週あたりの回数)',\n },\n fish: {\n label: '魚(週あたりの回数)',\n detailLabel: 'どのような魚がお好きですか?',\n },\n eggs: {\n label: '卵(週あたりの回数)',\n },\n meatCuredMeat: {\n label: '肉・加工肉(週あたりの回数)',\n detailLabel: '赤肉と白肉のどちらですか?',\n },\n dairy: {\n label: '乳製品(週あたりの回数)',\n detailLabel: 'どのような乳製品がお好きですか?',\n },\n visitType: {\n label: '受診の種類',\n },\n practitioner: {\n label: '診療担当者',\n },\n tumourType: {\n label: '腫瘍の種類',\n },\n stage: {\n label: '病期',\n },\n metastases: {\n label: '転移',\n },\n treatmentStatus: {\n label: '治療状況',\n },\n medName: {\n label: '名称',\n },\n medDose: {\n label: '用量',\n },\n nutritionalProposal: {\n label: '栄養指導の提案',\n },\n clinicalNotes: {\n label: '臨床メモ',\n },\n annualProposed: {\n label: '提案済み',\n },\n annualAccepted: {\n label: '承諾済み',\n },\n annualDeclineReason: {\n label: '辞退の理由',\n },\n },\n questionnaire: {\n noNumeric: {\n title: '比較できるデータがまだありません',\n description:\n '推移では、複数の問診票の数値回答を比較します。フォーム設定で質問の種類を数値にし、単位を設定してから、少なくとも2回回答してください。',\n },\n overviewTab: '概要',\n },\n empty: {\n noVisits: {\n title: '受診記録がありません',\n description: '初回の受診を記録すると、値と推移がここに表示されます。',\n },\n noRecord: {\n title: 'まだ記録がありません',\n description:\n 'この記録には受診履歴がありません。最初の受診を追加して情報の記録を始めてください。',\n create: '最初の問診票を始める',\n createSigned: '署名付きで始める',\n },\n noQuestions: {\n title: '回答する質問がありません',\n description:\n 'この問診票には有効な質問がありません。医院に質問の有効化を依頼してください。',\n },\n noParameters: {\n title: '測定項目が未設定です',\n description:\n 'この診療所には測定項目が設定されていないため、表示できる内容がありません。',\n },\n },\n visitNote: {\n title: '受診時のメモ',\n trigger: '受診時のメモ — {{visitType}}、{{date}}',\n openInPanel:\n '受診時のメモ — {{visitType}}、{{date}} — をメモビューで開く',\n },\n rail: {\n notes: 'メモとイベント',\n empty: 'この記録にはメモもイベントもありません。',\n eventLabel: 'イベント',\n },\n window: {\n label: '表示する受診',\n pickerTrigger: '受診 · {{total}}回中{{shown}}回',\n selectAll: 'すべて選択',\n showing: '{{total}}回中{{shown}}回を表示 · {{from}} – {{to}}',\n showingAll: '全受診:{{total}}件 · {{from}} – {{to}}',\n minimum: '少なくとも1回の受診を表示したままにしてください',\n optionHasNote: '{{label}} · メモ',\n },\n digest: {\n group: {\n reason: '受診の理由',\n history: '既往症と服薬',\n flags: '訴えのある症状',\n habits: '日常の習慣',\n },\n nothing: {\n title: 'まだ要約するものがありません',\n description:\n 'これまでに記録された回答は要約の対象外です。下の質問票全体を開いて確認してください。',\n },\n missing: {\n title_one: '未回答の必須項目が{{count}}件あります',\n title_other: '未回答の必須項目が{{count}}件あります',\n list: '未回答: {{list}}',\n separator: '、',\n jump: '{{field}} へ移動',\n },\n },\n export: {\n tab: {\n summary: '要約',\n compile: '記入',\n evolution: '推移',\n },\n docTab: {\n summary: '問診票の要約',\n compile: '受診記録',\n evolution: '推移',\n },\n docTitle: '{{tab}} — {{patient}}',\n info: '文書の詳細',\n generated: '作成日時',\n audienceLabel: '交付先',\n audience: {\n clinician: '診療所',\n patient: '患者',\n external: '院外の専門職',\n },\n visitsLabel: '対象の受診',\n visitsSelected: '{{total}}回中{{shown}}回',\n visitsAll: 'すべての受診{{total}}回',\n withheld: '一部の臨床情報はこの控えには含まれていません。',\n none: '記録はありません。',\n listSeparator: '、',\n flagged: '{{date}}({{flag}})',\n source: {\n patient: '患者',\n clinician: '医療者',\n },\n column: {\n question: '質問',\n answer: '回答',\n source: '情報源',\n field: '項目',\n value: '値',\n unit: '単位',\n referenceRange: '基準範囲',\n flag: 'フラグ',\n target: '目標',\n change: '変化 {{from}} → {{to}}',\n outOfRange: '基準範囲外',\n code: 'コード',\n description: '説明',\n name: '名称',\n dose: '用量',\n kind: '種類',\n cycle: 'サイクル',\n startDate: '開始日',\n status: '状態',\n notes: 'メモ',\n note: 'メモ',\n text: '本文',\n },\n control: {\n trigger: '書き出し・共有',\n triggerLabel: '書き出し・共有 — {{tab}}ビュー',\n triggerLabelAudience: '書き出し・共有 — {{tab}}ビュー、{{audience}}',\n audienceBadge: '患者向けの控え',\n menuLabel: '{{tab}}ビュー',\n everyVisit: '表示中の列だけでなく、すべての受診を含める',\n excludes: '患者向けの控えでは次を除きます: {{list}}',\n excludesNone: 'このビューの患者向けの控えで除かれるものはありません。',\n holds: '診療所向けの控えには次を含む記録全体が入ります: {{list}}。',\n holdsNone: 'このビューには、患者向けの控えで除かれるものはありません。',\n share: '共有…',\n pdf: 'PDFをダウンロード',\n print: '印刷',\n xlsx: 'Excel (.xlsx) をダウンロード',\n csv: 'CSV (.csv) をダウンロード',\n printFrame: '印刷用文書(表示内容なし)',\n printing: '文書の印刷ダイアログを開いています。',\n ready: '{{file}} の準備ができました。',\n failed: 'このブラウザーではファイルを準備できませんでした。',\n },\n share: {\n title: '{{tab}}ビューを共有',\n mockBadge: 'プレビューのみ',\n subtitle: '控えの交付先を選び、その控えに何が入るかを確認します。',\n noticeTitle: 'この画面からは何も送信されません',\n notice:\n 'これは共有の「かたち」を示すプレビューであり、共有そのものではありません。実際の共有には、期限付きの署名付きリンク、患者の同意、そして誰が何をどの経路で受け取ったかの記録が必要で、いずれもこの記録の外にあります。',\n audienceLabel: 'この控えの交付先は?',\n includes: 'この控えに入るもの',\n includesNone: 'この交付先に対して、このビューは文書を生成しません。',\n excludes: 'この控えから除かれるもの',\n excludesNone: 'この控えから除かれるものはありません。',\n cancel: 'キャンセル',\n confirm: '交付先を確定',\n confirmed:\n '交付先を{{audience}}に設定しました。何も送信されていません。',\n },\n concept: {\n patient_identity: '患者の本人情報',\n intake_answers: '問診票の回答',\n visit_date: '受診日',\n visit_type: '受診の種類',\n visit_practitioner: '診療担当者',\n visit_reasonCode: '受診理由のコード',\n anthropometrics_values: '身体計測値',\n dietary_intake: '食事摂取',\n derived_bmi: 'BMI',\n lab_values: '血液検査の数値',\n pathology_codes: '診断コード',\n oncological_history: '腫瘍の既往',\n therapy_entries: '治療とサプリメント',\n fmd_cycles: '疑似断食サイクル',\n annual_programme: '年間プログラム',\n notes_clinicalNotes: '臨床メモ',\n notes_nutritionalProposal: '栄養指導案',\n symptom_observations: '医療者の観察所見',\n compare_diff: '受診間の比較',\n visit_note: '受診時のメモ',\n event_timeline: '臨床イベントの時系列',\n export_tabDocument: '文書そのもの',\n export_workbook: '全記録を含むワークブック',\n },\n },\n },\n} as const;\n","/** Anamnesis interface resources (nl). */\nexport default {\n anamnesis: {\n mainLabel: 'Anamnesedossier: {{mode}}',\n mode: {\n intake: 'Intake',\n compile: 'Invullen',\n questionnaire: 'Vragenlijst',\n readOnly: 'Alleen-lezen',\n },\n common: {\n yes: 'Ja',\n no: 'Nee',\n unknown: 'Onbekend',\n notSure: 'Weet ik niet',\n choose: 'Kiezen…',\n details: 'Details',\n detailsPending: 'Verschijnt bij het antwoord ‘Ja’',\n time: 'Tijd',\n whatEaten: 'Wat hebt u gegeten?',\n },\n header: {\n name: 'Naam',\n age: 'Leeftijd',\n dob: 'Geboortedatum',\n visitDate: 'Consultdatum',\n years: '{{age}} jr',\n },\n origin: {\n fromPatient: 'Van de patiënt',\n },\n delta: {\n improved: 'Verbeterd',\n worsened: 'Verslechterd',\n unchanged: 'Ongewijzigd',\n aria: '{{valence}}: {{change}}',\n },\n range: {\n aboveRange: 'Boven het bereik',\n belowRange: 'Onder het bereik',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: 'Antropometrie',\n dietary: 'Voedingsinname',\n lab: 'Bloedonderzoek',\n },\n visitType: {\n first: 'Eerste consult',\n followUp: 'Vervolgconsult',\n },\n medKind: {\n medication: 'Medicatie',\n supplement: 'Supplement',\n },\n section: {\n reason: 'Reden van het consult',\n pharmacological: 'Medicatiegeschiedenis',\n familyHistory: 'Familieanamnese',\n symptoms: 'Symptomen',\n otherHistory: 'Overige voorgeschiedenis',\n dietaryHistory: 'Voedingsanamnese',\n recall24h: '24-uursvoedingsnavraag',\n foodFrequency: 'Wekelijkse voedingsfrequentie',\n visitMeta: 'Consultgegevens',\n patientIntake: 'Patiëntintake',\n intakeGaps: 'Onbeantwoorde vragen',\n anthropometrics: 'Antropometrie',\n dietary: 'Voedingsinname',\n pathologies: 'Aandoeningen',\n oncological: 'Oncologische voorgeschiedenis',\n therapy: 'Behandeling en supplementen',\n labs: 'Bloedonderzoek',\n fmd: 'Programma dat vasten nabootst',\n proposal: 'Voedingsvoorstel en notities',\n annual: 'Jaarprogramma',\n evolution: 'Verloop',\n },\n intake: {\n title: 'Vragenlijst vóór het consult',\n subtitle: 'Vul deze vragenlijst vóór uw eerste consult in.',\n sectionsLabel: 'Onderdelen van de vragenlijst',\n answered: 'Beantwoorde vragen: {{answered}} van {{total}}',\n sectionProgress: '{{answered}} van {{total}} beantwoord',\n submit: 'Opslaan',\n unsentNotice:\n 'Uw antwoorden worden vastgelegd wanneer u deze vragenlijst indient.',\n submittedNotice: 'Antwoorden opgeslagen.',\n },\n compile: {\n tabSummary: 'Samenvatting',\n tabCompile: 'Invullen',\n tabEvolution: 'Verloop',\n viewsLabel: 'Dossierweergaven',\n visitCount: 'Consulten: {{visits}}',\n bmiInStrip:\n 'De BMI wordt berekend op basis van gewicht en lengte en staat in de samenvatting bovenaan dit dossier.',\n gapsIntro:\n 'Deze verplichte vragen zijn niet beantwoord. Vul de antwoorden samen met de patiënt in.',\n noIntake: 'De patiënt heeft geen vragenlijst ingediend.',\n pathologiesLabel: 'Toegewezen aandoeningen',\n pathologiesHelp:\n 'Selecteer alle toepasselijke codes. Een patiënt kan meerdere codes tegelijk hebben.',\n pathologiesPlaceholder: 'Codes zoeken…',\n noTherapy: 'Er zijn geen behandelingen of supplementen vastgelegd.',\n addTherapy: 'Medicatie toevoegen',\n removeTherapy: '{{name}} verwijderen',\n noFmd:\n 'Er zijn geen cycli vastgelegd van het programma dat vasten nabootst.',\n cycleNumber: 'Cyclus {{number}}',\n cycleCompleted: 'Voltooid',\n cycleInProgress: 'Bezig',\n blockEmpty: 'Niets vastgelegd',\n blockFilled_one: '{{count}} vastgelegd',\n blockFilled_other: '{{count}} vastgelegd',\n blockFlagged_one: '{{count}} buiten het bereik',\n blockFlagged_other: '{{count}} buiten het bereik',\n blockOutstanding_one: 'Nog {{count}} te beantwoorden',\n blockOutstanding_other: 'Nog {{count}} te beantwoorden',\n blockSettled: 'Alles beantwoord',\n addFollowUpVisit: 'Vervolgconsult toevoegen',\n },\n configEditor: {\n title: 'Anamnese-instellingen',\n intro:\n 'De eigen termen van de praktijk: hernoemen, ordenen, archiveren of toevoegen. Archiveren verwijdert niets. Eerder vastgelegde antwoorden blijven in de geschiedenis bewaard.',\n tabsLabel: 'Instelbare termenlijsten',\n tabQuestionnaire: 'Vragenlijst',\n tabParameters: 'Parameters',\n tabPathologies: 'Aandoeningen',\n tabTargets: 'Streefwaarden',\n targetsIntro:\n 'Kies de parameters die de praktijk als doelen volgt. Ze verschijnen in de doelkaarten boven het dossier. Daar stelt u de streefwaarde voor elke patiënt in en bekijkt u hoe de huidige waarde zich daartoe verhoudt.',\n panelTracked_one: '{{count}} als doel gevolgd',\n panelTracked_other: '{{count}} als doel gevolgd',\n panelLive_one: '{{count}} actief',\n panelLive_other: '{{count}} actief',\n panelArchived_one: '{{count}} gearchiveerd',\n panelArchived_other: '{{count}} gearchiveerd',\n panelNotCaptured_one: '{{count}} niet aangeboden bij het invullen',\n panelNotCaptured_other: '{{count}} niet aangeboden bij het invullen',\n locked: 'Vergrendeld',\n lockedHint:\n 'Nodig voor de BMI-berekening: hernoemen of verplaatsen mag, verwijderen niet',\n archived: 'Gearchiveerd',\n rowActions: 'Acties voor {{name}}',\n reorderHandle:\n 'Volgorde van {{name}} wijzigen. Druk op Alt + Omhoog of Alt + Omlaag om te verplaatsen.',\n reorderAnnounce: '{{name}} verplaatst naar positie {{to}} van {{total}}',\n edit: '{{name}} bewerken',\n archive: '{{name}} archiveren',\n restore: '{{name}} herstellen',\n addQuestion: 'Vraag toevoegen',\n addSection: 'Onderdeel toevoegen',\n addParameter: 'Parameter toevoegen',\n addCode: 'Code toevoegen',\n sectionEmptyCapture:\n 'Geen actieve vragen: dit onderdeel wordt bij het invullen niet aangeboden.',\n familyHeading:\n 'Groep met subcodes: een kop die zelf niet kan worden toegewezen',\n subCodeOf: 'Subcode van {{code}}',\n direction: {\n down: 'Lager is beter',\n up: 'Hoger is beter',\n toRange: 'Binnen het bereik is beter',\n },\n type: {\n text: 'Kort antwoord',\n textarea: 'Lang antwoord',\n numberInteger: 'Getal (geheel)',\n numberDecimal: 'Getal (decimaal)',\n yesNoDetail: 'Ja / nee',\n choice: 'Eén keuze',\n choiceWithText: 'Eén keuze met tekst',\n multiChoice: 'Meerdere keuzes',\n frequency: 'Wekelijkse frequentie',\n meal: 'Maaltijd',\n },\n typeLine: 'Antwoordtype: {{type}}.',\n requiredBadge: 'Verplicht',\n requiredField: 'Antwoord verplicht',\n optionsCurrent: 'Keuzes: {{list}}.',\n editTitle: '{{name}} bewerken',\n keyLine:\n 'Identificatiecode: {{key}}. Wordt bij het aanmaken ingesteld en verandert nooit.',\n codeLine:\n 'Code: {{code}}. Wordt bij het aanmaken ingesteld en verandert nooit.',\n labelField: 'Label',\n labelFieldHelp: 'Laat leeg om de standaardtekst te gebruiken.',\n helpField: 'Helptekst',\n addNote:\n 'Een vrij ingevoerd item blijft beperkt tot deze praktijk en wordt niet toegevoegd aan een gedeelde termenlijst.',\n addParameterTitle: 'Parameter toevoegen',\n addQuestionTitle: 'Vraag toevoegen aan {{section}}',\n addSectionTitle: 'Onderdeel toevoegen',\n addCodeTitle: 'Aandoeningscode toevoegen',\n codeField: 'Code',\n groupField: 'Groep',\n directionField: 'Wat als verbetering geldt',\n unitField: 'Eenheid',\n precisionField: 'Decimalen',\n rangeMinField: 'Onderste referentiewaarde',\n rangeMaxField: 'Bovenste referentiewaarde',\n typeField: 'Antwoordtype',\n optionsField: 'Keuzes',\n optionsFieldHelp: 'Gescheiden door komma’s, minimaal één keuze.',\n parentField: 'Bovenliggende groep',\n parentFieldHelp:\n 'Door een subcode toe te voegen wordt de groep een kop die zelf niet meer kan worden toegewezen.',\n sectionNeedsQuestion:\n 'Een nieuw onderdeel verschijnt in de vragenlijst zodra het minstens één actieve vraag bevat.',\n selectPlaceholder: 'Kiezen…',\n save: 'Opslaan',\n cancel: 'Annuleren',\n add: 'Toevoegen',\n },\n targets: {\n title: 'Voedingsdoelen',\n tileLabel: 'Streefwaarde voor {{name}}',\n now: 'Nu {{value}}',\n nowBanded: 'Nu {{value}} · {{band}}',\n nowUnset: 'Nog niet gemeten',\n unset: 'Geen streefwaarde',\n status: {\n onTarget: 'Op streefwaarde',\n approaching: 'Nadert de streefwaarde',\n offTarget: 'Afwijkend van de streefwaarde',\n },\n edit: 'Streefwaarde bewerken: {{parameter}}',\n editTitle: 'Streefwaarde: {{parameter}}',\n editField: 'Nieuwe streefwaarde',\n bounds: 'Tussen {{range}}',\n outOfBounds: 'Voer een streefwaarde in tussen {{range}}.',\n unsaved: 'Nog niet opgeslagen',\n save: 'Streefwaarde opslaan',\n clear: 'Streefwaarde wissen',\n },\n summary: {\n fullQuestionnaire: 'De volledige vragenlijst',\n noAnswers: 'Er zijn nog geen antwoorden vastgelegd.',\n jump: 'Beantwoord {{field}} op het tabblad Invullen',\n },\n compare: {\n visitsLabel: 'Vergeleken consulten',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: '{{total}} consulten vergeleken · {{from}} – {{to}}',\n minimum: 'Er moeten minstens twee consulten in de vergelijking blijven',\n stop: 'Vergelijken stoppen',\n panelTitle: 'Consulten vergelijken',\n sameVisit:\n 'Kies twee of meer verschillende consulten om te zien wat er is veranderd.',\n summaryTitle: 'Veranderingen van {{from}} tot {{to}}',\n tableLabel: 'Wat er tussen de vergeleken consulten is veranderd',\n noChanges: 'Geen veranderingen tussen deze consulten.',\n noChangesDescription:\n 'Bij elk consult zijn dezelfde metingen, codes, behandelingen en notities vastgelegd.',\n present: 'Aanwezig',\n added: 'Toegevoegd',\n removed: 'Verwijderd',\n changed: 'Gewijzigd',\n notMeasured: 'Niet gemeten',\n category: {\n measurement: 'Metingen',\n pathology: 'Aandoeningen',\n therapy: 'Behandeling',\n note: 'Notities',\n },\n column: {\n item: 'Wat',\n change: 'Verandering',\n },\n },\n event: {\n barLabel: 'Gebeurtenissen',\n chip: '{{label}} · {{date}}',\n separator: ', ',\n shown: 'Getoonde gebeurtenislijnen: {{list}}',\n noneShown: 'Geen gebeurtenislijnen getoond.',\n external: '{{category}} · vastgelegd door {{source}}',\n category: {\n therapy: 'Behandeling',\n diet: 'Dieet',\n fmd: 'Programma dat vasten nabootst',\n surgery: 'Operatie',\n lifestyle: 'Dagelijks leven',\n },\n label: {\n dietStart: 'Mediterraan voedingsplan gestart',\n fmdCycle: 'Cyclus die vasten nabootst',\n gymStart: 'Gestart met sporten in de sportschool',\n chemoStart: 'Chemotherapie gestart',\n surgery: 'Galblaasoperatie',\n },\n source: {\n oncology: 'een oncoloog buiten deze praktijk',\n },\n },\n grid: {\n parameter: 'Parameter',\n caption: 'Parameterwaarden per consult, het oudste eerst.',\n captionInModule:\n 'Parameterwaarden per consult van {{module}}, het oudste eerst.',\n target: 'Streefwaarde {{value}} {{unit}}',\n trendLabel: 'Verloop van {{parameter}}',\n trend: 'Verloop',\n editable: 'Bewerkbaar',\n editCell: '{{parameter}}: meest recente consult',\n baselineMerged: 'Samengevoegd uit {{total}} eerste consulten',\n unlabelledSource: 'Overig',\n blockVisits_one: '{{count}} consult',\n blockVisits_other: '{{count}} consulten',\n },\n readOnly: {\n subtitle: 'Behandelplandossier, alleen-lezen.',\n summary: 'Patiëntsamenvatting',\n none: 'Niets vastgelegd.',\n perWeek: 'Frequentie per week: {{times}}',\n },\n pathology: {\n E66: 'Obesitas',\n E66_0: 'Obesitas door overmatige calorie-inname',\n E66_9: 'Obesitas, niet gespecificeerd',\n E11: 'Diabetes mellitus type 2',\n E11_9: 'Diabetes type 2 zonder complicaties',\n E11_6: 'Diabetes type 2 met andere gespecificeerde complicaties',\n E78: 'Stoornissen in de lipoproteïnestofwisseling',\n I10: 'Essentiële hypertensie',\n E03: 'Hypothyreoïdie',\n K58: 'Prikkelbaredarmsyndroom',\n D50: 'IJzergebreksanemie',\n E55: 'Vitamine D-tekort',\n groupGeneral: 'Algemeen',\n },\n param: {\n weight: 'Gewicht',\n height: 'Lengte',\n bmi: 'BMI',\n waist: 'Tailleomtrek',\n hips: 'Heupomtrek',\n arm: 'Armomtrek',\n phaseAngle: 'Fasehoek',\n energy: 'Dagelijkse energie-inname',\n protein: 'Eiwit',\n fastingGlucose: 'Nuchtere bloedglucose',\n hba1c: 'HbA1c',\n totalCholesterol: 'Totaal cholesterol',\n ldl: 'LDL-cholesterol',\n hdl: 'HDL-cholesterol',\n triglycerides: 'Triglyceriden',\n haemoglobin: 'Hemoglobine',\n vitaminD: 'Vitamine D (25-OH)',\n tsh: 'TSH',\n ferritin: 'Ferritine',\n crp: 'C-reactief proteïne',\n creatinine: 'Creatinine',\n },\n field: {\n highlighted: 'Gemarkeerd',\n reasonForVisit: {\n label: 'Reden van het consult en doelen',\n },\n knownConditions: {\n label: 'Bekende aandoeningen',\n },\n dailyMedications: {\n label: 'Dagelijkse medicatie',\n },\n currentSupplements: {\n label: 'Huidige supplementen',\n },\n familyParents: {\n label: 'Ouders',\n },\n familySiblings: {\n label: 'Broers en zussen',\n },\n familyGrandparents: {\n label: 'Grootouders',\n },\n bloating: {\n label: 'Opgeblazen gevoel in de buik',\n },\n refluxGastritis: {\n label: 'Reflux of gastritis',\n },\n tiredness: {\n label: 'Vermoeidheid',\n },\n sleepQuality: {\n label: 'Slaapkwaliteit',\n option: {\n good: 'Goed',\n fair: 'Redelijk',\n poor: 'Slecht',\n },\n },\n sleepDifficulty: {\n label: 'Moeite met inslapen of ’s nachts wakker worden',\n },\n bowelHabits: {\n label: 'Ontlastingspatroon',\n option: {\n regular: 'Regelmatig',\n constipated: 'Obstipatie',\n diarrhoeal: 'Diarree',\n alternating: 'Afwisselend',\n },\n },\n stoolCharacteristics: {\n label: 'Kenmerken van de ontlasting',\n },\n haemorrhoids: {\n label: 'Aambeien',\n },\n diverticula: {\n label: 'Divertikels',\n },\n regularUrination: {\n label: 'Regelmatig plassen',\n },\n menstrualCycle: {\n label: 'Menstruatiecyclus',\n option: {\n regular: 'Regelmatig',\n irregular: 'Onregelmatig',\n absent: 'Afwezig',\n },\n },\n foodAllergies: {\n label: 'Voedselallergieën',\n },\n drugAllergies: {\n label: 'Geneesmiddelenallergieën',\n },\n otherAllergies: {\n label: 'Overige allergieën',\n },\n foodIntolerances: {\n label: 'Voedselintoleranties',\n },\n smoking: {\n label: 'Roken',\n option: {\n never: 'Nooit',\n former: 'Vroeger',\n current: 'Momenteel',\n },\n },\n pastSurgery: {\n label: 'Eerdere operaties',\n },\n pregnancies: {\n label: 'Zwangerschappen',\n },\n weightSelf: {\n label: 'Gewicht (kg)',\n },\n heightSelf: {\n label: 'Lengte (cm)',\n },\n physicalActivity: {\n label: 'Huidige lichaamsbeweging',\n },\n lifestyle: {\n label: 'Huidige leefstijl',\n },\n waterPerDay: {\n label: 'Water (liter per dag)',\n },\n fizzyDrinks: {\n label: 'Koolzuurhoudende dranken',\n option: {\n never: 'Nooit',\n occasionally: 'Af en toe',\n daily: 'Dagelijks',\n },\n },\n alcohol: {\n label: 'Alcohol',\n option: {\n never: 'Nooit',\n occasionally: 'Af en toe',\n daily: 'Dagelijks',\n },\n },\n coffeePerDay: {\n label: 'Koffie (kopjes per dag)',\n },\n coffeeSugar: {\n label: 'Koffie met suiker?',\n option: {\n yes: 'Ja',\n no: 'Nee',\n },\n },\n breakfast: {\n label: 'Ontbijt',\n },\n morningSnack: {\n label: 'Tussendoortje in de ochtend',\n },\n lunch: {\n label: 'Lunch',\n },\n afternoonSnack: {\n label: 'Tussendoortje in de middag',\n },\n dinner: {\n label: 'Avondeten',\n },\n afterDinner: {\n label: 'Na het avondeten',\n },\n pulses: {\n label: 'Peulvruchten (keer per week)',\n },\n fish: {\n label: 'Vis (keer per week)',\n detailLabel: 'Welke vis eet u het liefst?',\n },\n eggs: {\n label: 'Eieren (keer per week)',\n },\n meatCuredMeat: {\n label: 'Vlees en vleeswaren (keer per week)',\n detailLabel: 'Rood of wit vlees?',\n },\n dairy: {\n label: 'Zuivel (keer per week)',\n detailLabel: 'Welke zuivelproducten eet of drinkt u het liefst?',\n },\n visitType: {\n label: 'Soort consult',\n },\n practitioner: {\n label: 'Zorgverlener',\n },\n tumourType: {\n label: 'Tumortype',\n },\n stage: {\n label: 'Stadium',\n },\n metastases: {\n label: 'Metastasen',\n },\n treatmentStatus: {\n label: 'Behandelstatus',\n },\n medName: {\n label: 'Naam',\n },\n medDose: {\n label: 'Dosis',\n },\n nutritionalProposal: {\n label: 'Voedingsvoorstel',\n },\n clinicalNotes: {\n label: 'Klinische notities',\n },\n annualProposed: {\n label: 'Voorgesteld',\n },\n annualAccepted: {\n label: 'Geaccepteerd',\n },\n annualDeclineReason: {\n label: 'Reden voor afwijzing',\n },\n },\n questionnaire: {\n noNumeric: {\n title: 'Nog niets te vergelijken',\n description:\n 'De trend vergelijkt numerieke antwoorden uit verschillende vragenlijsten. Geef een vraag in de formulierinstellingen het type getal en een eenheid en beantwoord deze vervolgens minstens tweemaal.',\n },\n overviewTab: 'Overzicht',\n },\n empty: {\n noVisits: {\n title: 'Nog geen consulten',\n description:\n 'Zodra het eerste consult is vastgelegd, verschijnen hier de waarden en het verloop.',\n },\n noRecord: {\n title: 'Nog niets vastgelegd',\n description:\n 'Dit dossier bevat geen consulten. Voeg het eerste consult toe om informatie vast te leggen.',\n create: 'Eerste vragenlijst starten',\n createSigned: 'Starten met handtekening',\n },\n noQuestions: {\n title: 'Geen vragen te beantwoorden',\n description:\n 'Deze vragenlijst bevat geen actieve vragen. Vraag de praktijk om vragen te activeren.',\n },\n noParameters: {\n title: 'Geen metingen ingesteld',\n description:\n 'Deze praktijk heeft geen metingen ingesteld, waardoor er nog niets in een grafiek kan worden getoond.',\n },\n },\n visitNote: {\n title: 'Consultnotities',\n trigger: 'Consultnotities: {{visitType}}, {{date}}',\n openInPanel:\n 'Open de consultnotities van {{visitType}}, {{date}} in de notitieweergave',\n },\n rail: {\n notes: 'Notities en gebeurtenissen',\n empty: 'Dit dossier bevat geen notities of gebeurtenissen.',\n eventLabel: 'Gebeurtenis',\n },\n window: {\n label: 'Getoonde consulten',\n pickerTrigger: 'Consulten: {{shown}} van {{total}}',\n selectAll: 'Alles selecteren',\n showing:\n 'Getoonde consulten: {{shown}} van {{total}} · {{from}} – {{to}}',\n showingAll: 'Alle consulten: {{total}} · {{from}} – {{to}}',\n minimum: 'Er moet minstens één consult zichtbaar blijven',\n optionHasNote: '{{label}} · notitie',\n },\n digest: {\n group: {\n reason: 'Reden van het consult',\n history: 'Aandoeningen en medicatie',\n flags: 'Gemelde symptomen',\n habits: 'Dagelijkse gewoonten',\n },\n nothing: {\n title: 'Nog niets samen te vatten',\n description:\n 'De tot nu toe vastgelegde antwoorden maken geen deel uit van de samenvatting. Open de volledige vragenlijst hieronder om ze te lezen.',\n },\n missing: {\n title_one: '{{count}} verplichte vraag nog onbeantwoord',\n title_other: '{{count}} verplichte vragen nog onbeantwoord',\n list: 'Ontbreekt nog: {{list}}',\n separator: ', ',\n jump: 'Ga naar {{field}}',\n },\n },\n export: {\n tab: {\n summary: 'Samenvatting',\n compile: 'Invullen',\n evolution: 'Verloop',\n },\n docTab: {\n summary: 'Samenvatting van de vragenlijst',\n compile: 'Consultverslag',\n evolution: 'Verloop',\n },\n docTitle: '{{tab}} — {{patient}}',\n info: 'Documentgegevens',\n generated: 'Gegenereerd',\n audienceLabel: 'Kopie voor',\n audience: {\n clinician: 'De praktijk',\n patient: 'De patiënt',\n external: 'Een externe zorgverlener',\n },\n visitsLabel: 'Opgenomen consulten',\n visitsSelected: '{{shown}} van {{total}}',\n visitsAll: 'Alle {{total}}',\n withheld: 'Sommige klinische gegevens zijn niet opgenomen in deze kopie.',\n none: 'Niets vastgelegd.',\n listSeparator: ', ',\n flagged: '{{date}} ({{flag}})',\n source: {\n patient: 'Patiënt',\n clinician: 'Behandelaar',\n },\n column: {\n question: 'Vraag',\n answer: 'Antwoord',\n source: 'Bron',\n field: 'Veld',\n value: 'Waarde',\n unit: 'Eenheid',\n referenceRange: 'Referentiebereik',\n flag: 'Markering',\n target: 'Streefwaarde',\n change: 'Verandering {{from}} → {{to}}',\n outOfRange: 'Buiten het bereik',\n code: 'Code',\n description: 'Omschrijving',\n name: 'Naam',\n dose: 'Dosis',\n kind: 'Type',\n cycle: 'Cyclus',\n startDate: 'Begindatum',\n status: 'Status',\n notes: 'Notities',\n note: 'Notitie',\n text: 'Tekst',\n },\n control: {\n trigger: 'Exporteren en delen',\n triggerLabel: 'Weergave {{tab}} exporteren en delen',\n triggerLabelAudience:\n 'Weergave {{tab}} exporteren en delen, {{audience}}',\n audienceBadge: 'Patiëntkopie',\n menuLabel: 'Weergave {{tab}}',\n everyVisit: 'Alle consulten opnemen, niet alleen de getoonde kolommen',\n excludes: 'Een patiëntkopie laat het volgende weg: {{list}}',\n excludesNone: 'Een patiëntkopie van deze weergave laat niets weg.',\n holds:\n 'De praktijkkopie bevat het volledige dossier, inclusief {{list}}.',\n holdsNone:\n 'Deze weergave bevat niets wat uit een patiëntkopie zou worden weggelaten.',\n share: 'Delen…',\n pdf: 'PDF downloaden',\n print: 'Afdrukken',\n xlsx: 'Excel downloaden (.xlsx)',\n csv: 'CSV downloaden (.csv)',\n printFrame: 'Afdrukdocument (geen zichtbare inhoud)',\n printing: 'Het afdrukvenster voor het document wordt geopend.',\n ready: '{{file}} is klaar.',\n failed: 'Deze browser kon het bestand niet voorbereiden.',\n },\n share: {\n title: 'Weergave {{tab}} delen',\n mockBadge: 'Alleen voorbeeld',\n subtitle:\n 'Kies voor wie een kopie bedoeld zou zijn en bekijk wat die zou bevatten.',\n noticeTitle: 'Vanuit dit scherm wordt niets verzonden',\n notice:\n 'Dit voorbeeld laat zien hoe delen eruit zou zien; er wordt niets gedeeld. Om werkelijk te delen zijn een ondertekende link met vervaldatum, toestemming van de patiënt en een registratie van wie wat via welk kanaal heeft ontvangen nodig. Dit wordt allemaal buiten dit dossier geregeld.',\n audienceLabel: 'Voor wie zou deze kopie bedoeld zijn?',\n includes: 'Deze kopie zou bevatten',\n includesNone:\n 'Deze weergave levert geen document op voor deze ontvanger.',\n excludes: 'Deze kopie zou weglaten',\n excludesNone: 'Uit deze kopie wordt niets weggelaten.',\n cancel: 'Annuleren',\n confirm: 'Ontvanger bevestigen',\n confirmed:\n 'Ontvanger ingesteld op {{audience}}. Er is niets verzonden.',\n },\n concept: {\n patient_identity: 'Identiteitsgegevens van de patiënt',\n intake_answers: 'Antwoorden op de vragenlijst',\n visit_date: 'Consultdatums',\n visit_type: 'Soort consult',\n visit_practitioner: 'Zorgverlener',\n visit_reasonCode: 'Gecodeerde reden van het consult',\n anthropometrics_values: 'Antropometrische metingen',\n dietary_intake: 'Voedingsinname',\n derived_bmi: 'BMI',\n lab_values: 'Bloedwaarden',\n pathology_codes: 'Diagnosecodes',\n oncological_history: 'Oncologische voorgeschiedenis',\n therapy_entries: 'Behandeling en supplementen',\n fmd_cycles: 'Cycli die vasten nabootsen',\n annual_programme: 'Jaarprogramma',\n notes_clinicalNotes: 'Klinische notities',\n notes_nutritionalProposal: 'Voedingsvoorstel',\n symptom_observations: 'Observaties van de behandelaar',\n compare_diff: 'Vergelijking van consulten',\n visit_note: 'Consultnotities',\n event_timeline: 'Tijdlijn van klinische gebeurtenissen',\n export_tabDocument: 'Het document zelf',\n export_workbook: 'De werkmap met het volledige dossier',\n },\n },\n },\n} as const;\n","/** Anamnesis interface resources (pl). */\nexport default {\n anamnesis: {\n mainLabel: 'Karta wywiadu medycznego: {{mode}}',\n mode: {\n intake: 'Wywiad',\n compile: 'Wypełnij',\n questionnaire: 'Kwestionariusz',\n readOnly: 'Tylko do odczytu',\n },\n common: {\n yes: 'Tak',\n no: 'Nie',\n unknown: 'Nie wiadomo',\n notSure: 'Trudno powiedzieć',\n choose: 'Wybierz…',\n details: 'Szczegóły',\n detailsPending: 'Pojawia się po odpowiedzi „Tak”',\n time: 'Godzina',\n whatEaten: 'Co jedzono?',\n },\n header: {\n name: 'Imię i nazwisko',\n age: 'Wiek',\n dob: 'Data urodzenia',\n visitDate: 'Data wizyty',\n years: 'Wiek w latach: {{age}}',\n },\n origin: {\n fromPatient: 'Od pacjenta',\n },\n delta: {\n improved: 'Poprawa',\n worsened: 'Pogorszenie',\n unchanged: 'Bez zmian',\n aria: '{{valence}}: {{change}}',\n },\n range: {\n aboveRange: 'Powyżej zakresu',\n belowRange: 'Poniżej zakresu',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: 'Pomiary antropometryczne',\n dietary: 'Spożycie składników odżywczych',\n lab: 'Badania krwi',\n },\n visitType: {\n first: 'Pierwsza wizyta',\n followUp: 'Wizyta kontrolna',\n },\n medKind: {\n medication: 'Lek',\n supplement: 'Suplement',\n },\n section: {\n reason: 'Powód wizyty',\n pharmacological: 'Wywiad farmakologiczny',\n familyHistory: 'Wywiad rodzinny',\n symptoms: 'Objawy',\n otherHistory: 'Pozostałe informacje z wywiadu',\n dietaryHistory: 'Wywiad żywieniowy',\n recall24h: 'Wywiad żywieniowy z ostatnich 24 godzin',\n foodFrequency: 'Tygodniowa częstotliwość spożycia produktów',\n visitMeta: 'Szczegóły wizyty',\n patientIntake: 'Kwestionariusz pacjenta',\n intakeGaps: 'Pytania bez odpowiedzi',\n anthropometrics: 'Pomiary antropometryczne',\n dietary: 'Spożycie składników odżywczych',\n pathologies: 'Choroby',\n oncological: 'Wywiad onkologiczny',\n therapy: 'Leczenie i suplementy',\n labs: 'Badania krwi',\n fmd: 'Program diety naśladującej post',\n proposal: 'Propozycja żywieniowa i notatki',\n annual: 'Program roczny',\n evolution: 'Zmiany w czasie',\n },\n intake: {\n title: 'Kwestionariusz przed wizytą',\n subtitle: 'Wypełnij go przed pierwszą wizytą.',\n sectionsLabel: 'Sekcje kwestionariusza',\n answered: 'Pytania z odpowiedzią: {{answered}} z {{total}}',\n sectionProgress: 'Odpowiedziano: {{answered}} z {{total}}',\n submit: 'Zapisz',\n unsentNotice: 'Odpowiedzi zostaną zapisane po wysłaniu kwestionariusza.',\n submittedNotice: 'Odpowiedzi zapisano.',\n },\n compile: {\n tabSummary: 'Podsumowanie',\n tabCompile: 'Wypełnij',\n tabEvolution: 'Zmiany w czasie',\n viewsLabel: 'Widoki karty',\n visitCount: 'Wizyty: {{visits}}',\n bmiInStrip:\n 'BMI oblicza się na podstawie masy ciała i wzrostu. Wynik jest widoczny w podsumowaniu na górze karty.',\n gapsIntro:\n 'Te wymagane pytania pozostały bez odpowiedzi. Uzupełnij odpowiedzi z pacjentem.',\n noIntake: 'Pacjent nie przesłał kwestionariusza.',\n pathologiesLabel: 'Przypisane choroby',\n pathologiesHelp:\n 'Wybierz wszystkie właściwe kody. Pacjent może mieć kilka kodów jednocześnie.',\n pathologiesPlaceholder: 'Szukaj kodów…',\n noTherapy: 'Nie zapisano leczenia ani suplementów.',\n addTherapy: 'Dodaj lek',\n removeTherapy: 'Usuń {{name}}',\n noFmd: 'Nie zapisano cykli diety naśladującej post.',\n cycleNumber: 'Cykl {{number}}',\n cycleCompleted: 'Ukończono',\n cycleInProgress: 'W trakcie',\n blockEmpty: 'Brak zapisanych informacji',\n blockFilled_one: 'Zapisano: {{count}}',\n blockFilled_other: 'Zapisano: {{count}}',\n blockFlagged_one: 'Poza zakresem: {{count}}',\n blockFlagged_other: 'Poza zakresem: {{count}}',\n blockOutstanding_one: 'Pozostało do uzupełnienia: {{count}}',\n blockOutstanding_other: 'Pozostało do uzupełnienia: {{count}}',\n blockSettled: 'Odpowiedziano na wszystko',\n addFollowUpVisit: 'Dodaj wizytę kontrolną',\n blockFilled_few: 'Zapisano: {{count}}',\n blockFilled_many: 'Zapisano: {{count}}',\n blockFlagged_few: 'Poza zakresem: {{count}}',\n blockFlagged_many: 'Poza zakresem: {{count}}',\n blockOutstanding_few: 'Pozostało do uzupełnienia: {{count}}',\n blockOutstanding_many: 'Pozostało do uzupełnienia: {{count}}',\n },\n configEditor: {\n title: 'Konfiguracja wywiadu',\n intro:\n 'Słowniki gabinetu: zmieniaj nazwy i kolejność, archiwizuj lub dodawaj pozycje. Archiwizacja nie usuwa danych. Zapisane odpowiedzi pozostają w historii.',\n tabsLabel: 'Słowniki do konfiguracji',\n tabQuestionnaire: 'Kwestionariusz',\n tabParameters: 'Parametry',\n tabPathologies: 'Choroby',\n tabTargets: 'Cele',\n targetsIntro:\n 'Wybierz parametry, które gabinet śledzi jako cele. Pojawią się w kafelkach nad kartą, gdzie można ustawić wartość docelową dla każdego pacjenta i porównać z nią bieżący wynik.',\n panelTracked_one: 'Śledzone jako cele: {{count}}',\n panelTracked_other: 'Śledzone jako cele: {{count}}',\n panelLive_one: 'Aktywne: {{count}}',\n panelLive_other: 'Aktywne: {{count}}',\n panelArchived_one: 'Zarchiwizowane: {{count}}',\n panelArchived_other: 'Zarchiwizowane: {{count}}',\n panelNotCaptured_one: 'Niewidoczne przy wprowadzaniu danych: {{count}}',\n panelNotCaptured_other: 'Niewidoczne przy wprowadzaniu danych: {{count}}',\n locked: 'Zablokowane',\n lockedHint:\n 'Parametr służy do obliczania BMI. Można zmienić jego nazwę lub kolejność, ale nie można go usunąć.',\n archived: 'Zarchiwizowane',\n rowActions: 'Działania dla {{name}}',\n reorderHandle:\n 'Zmień pozycję {{name}}. Naciśnij Alt + strzałkę w górę lub Alt + strzałkę w dół, aby przesunąć.',\n reorderAnnounce: 'Przeniesiono {{name}} na pozycję {{to}} z {{total}}',\n edit: 'Edytuj {{name}}',\n archive: 'Archiwizuj {{name}}',\n restore: 'Przywróć {{name}}',\n addQuestion: 'Dodaj pytanie',\n addSection: 'Dodaj sekcję',\n addParameter: 'Dodaj parametr',\n addCode: 'Dodaj kod',\n sectionEmptyCapture:\n 'Brak aktywnych pytań. Ta sekcja nie jest wyświetlana przy wprowadzaniu danych.',\n familyHeading:\n 'Grupa z kodami podrzędnymi: nagłówek, którego nie można przypisać samodzielnie',\n subCodeOf: 'Kod podrzędny kodu {{code}}',\n direction: {\n down: 'Im niżej, tym lepiej',\n up: 'Im wyżej, tym lepiej',\n toRange: 'Najlepiej w zakresie',\n },\n type: {\n text: 'Krótka odpowiedź',\n textarea: 'Długa odpowiedź',\n numberInteger: 'Liczba całkowita',\n numberDecimal: 'Liczba dziesiętna',\n yesNoDetail: 'Tak / nie',\n choice: 'Jednokrotny wybór',\n choiceWithText: 'Jednokrotny wybór z tekstem',\n multiChoice: 'Wielokrotny wybór',\n frequency: 'Częstotliwość tygodniowa',\n meal: 'Posiłek',\n },\n typeLine: 'Typ odpowiedzi: {{type}}.',\n requiredBadge: 'Wymagane',\n requiredField: 'Odpowiedź wymagana',\n optionsCurrent: 'Opcje: {{list}}.',\n editTitle: 'Edytuj: {{name}}',\n keyLine: 'Identyfikator: {{key}}. Nadawany przy tworzeniu i niezmienny.',\n codeLine: 'Kod: {{code}}. Nadawany przy tworzeniu i niezmienny.',\n labelField: 'Etykieta',\n labelFieldHelp: 'Pozostaw puste, aby użyć standardowego brzmienia.',\n helpField: 'Tekst pomocniczy',\n addNote:\n 'Własny wpis jest dostępny tylko w tej placówce. Nie trafia do wspólnego słownika.',\n addParameterTitle: 'Dodaj parametr',\n addQuestionTitle: 'Dodaj pytanie do sekcji {{section}}',\n addSectionTitle: 'Dodaj sekcję',\n addCodeTitle: 'Dodaj kod choroby',\n codeField: 'Kod',\n groupField: 'Grupa',\n directionField: 'Co oznacza poprawę',\n unitField: 'Jednostka',\n precisionField: 'Miejsca po przecinku',\n rangeMinField: 'Dolna granica zakresu referencyjnego',\n rangeMaxField: 'Górna granica zakresu referencyjnego',\n typeField: 'Typ odpowiedzi',\n optionsField: 'Opcje',\n optionsFieldHelp:\n 'Oddziel opcje przecinkami. Wymagana jest co najmniej jedna.',\n parentField: 'Grupa nadrzędna',\n parentFieldHelp:\n 'Po dodaniu kodu podrzędnego jego grupa staje się nagłówkiem i nie można jej już przypisać bezpośrednio.',\n sectionNeedsQuestion:\n 'Nowa sekcja pojawi się w kwestionariuszu, gdy będzie zawierać co najmniej jedno aktywne pytanie.',\n selectPlaceholder: 'Wybierz…',\n save: 'Zapisz',\n cancel: 'Anuluj',\n add: 'Dodaj',\n panelTracked_few: 'Śledzone jako cele: {{count}}',\n panelTracked_many: 'Śledzone jako cele: {{count}}',\n panelLive_few: 'Aktywne: {{count}}',\n panelLive_many: 'Aktywne: {{count}}',\n panelArchived_few: 'Zarchiwizowane: {{count}}',\n panelArchived_many: 'Zarchiwizowane: {{count}}',\n panelNotCaptured_few: 'Niewidoczne przy wprowadzaniu danych: {{count}}',\n panelNotCaptured_many: 'Niewidoczne przy wprowadzaniu danych: {{count}}',\n },\n targets: {\n title: 'Cele żywieniowe',\n tileLabel: 'Cel: {{name}}',\n now: 'Obecnie: {{value}}',\n nowBanded: 'Obecnie: {{value}} · {{band}}',\n nowUnset: 'Jeszcze nie zmierzono',\n unset: 'Brak celu',\n status: {\n onTarget: 'Cel osiągnięty',\n approaching: 'Zbliża się do celu',\n offTarget: 'Poza celem',\n },\n edit: 'Edytuj cel: {{parameter}}',\n editTitle: 'Cel: {{parameter}}',\n editField: 'Nowy cel',\n bounds: 'W zakresie {{range}}',\n outOfBounds: 'Wprowadź cel w zakresie {{range}}.',\n unsaved: 'Jeszcze nie zapisano',\n save: 'Zapisz cel',\n clear: 'Usuń cel',\n },\n summary: {\n fullQuestionnaire: 'Pełny kwestionariusz',\n noAnswers: 'Nie zapisano jeszcze żadnych odpowiedzi.',\n jump: 'Wypełnij pole „{{field}}” na karcie „Wypełnij”',\n },\n compare: {\n visitsLabel: 'Porównywane wizyty',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: 'Porównywane wizyty: {{total}} · {{from}} – {{to}}',\n minimum: 'W porównaniu muszą pozostać co najmniej dwie wizyty',\n stop: 'Zakończ porównywanie',\n panelTitle: 'Porównaj wizyty',\n sameVisit: 'Wybierz co najmniej dwie różne wizyty, aby zobaczyć zmiany.',\n summaryTitle: 'Zmiany od {{from}} do {{to}}',\n tableLabel: 'Zmiany między porównywanymi wizytami',\n noChanges: 'Brak zmian między tymi wizytami.',\n noChangesDescription:\n 'Podczas każdej z tych wizyt zapisano te same pomiary, kody, leczenie i notatki.',\n present: 'Obecne',\n added: 'Dodano',\n removed: 'Usunięto',\n changed: 'Zmieniono',\n notMeasured: 'Nie zmierzono',\n category: {\n measurement: 'Pomiary',\n pathology: 'Choroby',\n therapy: 'Leczenie',\n note: 'Notatki',\n },\n column: {\n item: 'Pozycja',\n change: 'Zmiana',\n },\n },\n event: {\n barLabel: 'Zdarzenia',\n chip: '{{label}} · {{date}}',\n separator: ', ',\n shown: 'Wyświetlane linie zdarzeń: {{list}}',\n noneShown: 'Nie wyświetlono żadnych linii zdarzeń.',\n external: '{{category}} · zapisane przez: {{source}}',\n category: {\n therapy: 'Leczenie',\n diet: 'Dieta',\n fmd: 'Program diety naśladującej post',\n surgery: 'Operacja',\n lifestyle: 'Życie codzienne',\n },\n label: {\n dietStart: 'Rozpoczęcie diety śródziemnomorskiej',\n fmdCycle: 'Cykl diety naśladującej post',\n gymStart: 'Rozpoczęcie ćwiczeń na siłowni',\n chemoStart: 'Rozpoczęcie chemioterapii',\n surgery: 'Operacja pęcherzyka żółciowego',\n },\n source: {\n oncology: 'onkologa spoza tej placówki',\n },\n },\n grid: {\n parameter: 'Parametr',\n caption: 'Wartości parametrów podczas kolejnych wizyt, od najstarszej.',\n captionInModule:\n 'Wartości parametrów podczas kolejnych wizyt w module {{module}}, od najstarszej.',\n target: 'Cel: {{value}} {{unit}}',\n trendLabel: 'Trend: {{parameter}}',\n trend: 'Trend',\n editable: 'Można edytować',\n editCell: '{{parameter}}: ostatnia wizyta',\n baselineMerged: 'Połączono dane z pierwszych wizyt (liczba: {{total}})',\n unlabelledSource: 'Inne',\n blockVisits_one: '{{count}} wizyta',\n blockVisits_other: '{{count}} wizyty',\n blockVisits_few: '{{count}} wizyty',\n blockVisits_many: '{{count}} wizyt',\n },\n readOnly: {\n subtitle: 'Dokumentacja planu leczenia. Tylko do odczytu.',\n summary: 'Podsumowanie pacjenta',\n none: 'Brak zapisanych danych.',\n perWeek: 'Częstotliwość w tygodniu: {{times}}',\n },\n pathology: {\n E66: 'Otyłość',\n E66_0: 'Otyłość spowodowana nadmierną podażą kalorii',\n E66_9: 'Otyłość nieokreślona',\n E11: 'Cukrzyca typu 2',\n E11_9: 'Cukrzyca typu 2 bez powikłań',\n E11_6: 'Cukrzyca typu 2 z innymi określonymi powikłaniami',\n E78: 'Zaburzenia metabolizmu lipoprotein',\n I10: 'Nadciśnienie tętnicze pierwotne',\n E03: 'Niedoczynność tarczycy',\n K58: 'Zespół jelita drażliwego',\n D50: 'Niedokrwistość z niedoboru żelaza',\n E55: 'Niedobór witaminy D',\n groupGeneral: 'Ogólne',\n },\n param: {\n weight: 'Masa ciała',\n height: 'Wzrost',\n bmi: 'BMI',\n waist: 'Obwód talii',\n hips: 'Obwód bioder',\n arm: 'Obwód ramienia',\n phaseAngle: 'Kąt fazowy',\n energy: 'Dzienne spożycie energii',\n protein: 'Białko',\n fastingGlucose: 'Glukoza na czczo',\n hba1c: 'HbA1c',\n totalCholesterol: 'Cholesterol całkowity',\n ldl: 'Cholesterol LDL',\n hdl: 'Cholesterol HDL',\n triglycerides: 'Trójglicerydy',\n haemoglobin: 'Hemoglobina',\n vitaminD: 'Witamina D (25-OH)',\n tsh: 'TSH',\n ferritin: 'Ferrytyna',\n crp: 'Białko C-reaktywne',\n creatinine: 'Kreatynina',\n },\n field: {\n highlighted: 'Wyróżnione',\n reasonForVisit: {\n label: 'Powód wizyty i cele',\n },\n knownConditions: {\n label: 'Rozpoznane choroby',\n },\n dailyMedications: {\n label: 'Leki przyjmowane codziennie',\n },\n currentSupplements: {\n label: 'Obecnie przyjmowane suplementy',\n },\n familyParents: {\n label: 'Rodzice',\n },\n familySiblings: {\n label: 'Rodzeństwo',\n },\n familyGrandparents: {\n label: 'Dziadkowie',\n },\n bloating: {\n label: 'Wzdęcia brzucha',\n },\n refluxGastritis: {\n label: 'Refluks lub zapalenie błony śluzowej żołądka',\n },\n tiredness: {\n label: 'Zmęczenie',\n },\n sleepQuality: {\n label: 'Jakość snu',\n option: {\n good: 'Dobra',\n fair: 'Przeciętna',\n poor: 'Zła',\n },\n },\n sleepDifficulty: {\n label: 'Trudności z zasypianiem lub wybudzanie się w nocy',\n },\n bowelHabits: {\n label: 'Rytm wypróżnień',\n option: {\n regular: 'Regularny',\n constipated: 'Zaparcia',\n diarrhoeal: 'Biegunki',\n alternating: 'Naprzemienne zaparcia i biegunki',\n },\n },\n stoolCharacteristics: {\n label: 'Charakterystyka stolca',\n },\n haemorrhoids: {\n label: 'Hemoroidy',\n },\n diverticula: {\n label: 'Uchyłki',\n },\n regularUrination: {\n label: 'Regularne oddawanie moczu',\n },\n menstrualCycle: {\n label: 'Cykl miesiączkowy',\n option: {\n regular: 'Regularny',\n irregular: 'Nieregularny',\n absent: 'Brak miesiączki',\n },\n },\n foodAllergies: {\n label: 'Alergie pokarmowe',\n },\n drugAllergies: {\n label: 'Alergie na leki',\n },\n otherAllergies: {\n label: 'Inne alergie',\n },\n foodIntolerances: {\n label: 'Nietolerancje pokarmowe',\n },\n smoking: {\n label: 'Palenie tytoniu',\n option: {\n never: 'Nigdy',\n former: 'W przeszłości',\n current: 'Obecnie',\n },\n },\n pastSurgery: {\n label: 'Przebyte operacje',\n },\n pregnancies: {\n label: 'Ciąże',\n },\n weightSelf: {\n label: 'Masa ciała (kg)',\n },\n heightSelf: {\n label: 'Wzrost (cm)',\n },\n physicalActivity: {\n label: 'Obecna aktywność fizyczna',\n },\n lifestyle: {\n label: 'Obecny styl życia',\n },\n waterPerDay: {\n label: 'Woda (litry dziennie)',\n },\n fizzyDrinks: {\n label: 'Napoje gazowane',\n option: {\n never: 'Nigdy',\n occasionally: 'Sporadycznie',\n daily: 'Codziennie',\n },\n },\n alcohol: {\n label: 'Alkohol',\n option: {\n never: 'Nigdy',\n occasionally: 'Sporadycznie',\n daily: 'Codziennie',\n },\n },\n coffeePerDay: {\n label: 'Kawa (filiżanki dziennie)',\n },\n coffeeSugar: {\n label: 'Kawa z cukrem?',\n option: {\n yes: 'Tak',\n no: 'Nie',\n },\n },\n breakfast: {\n label: 'Śniadanie',\n },\n morningSnack: {\n label: 'Przekąska przed południem',\n },\n lunch: {\n label: 'Obiad',\n },\n afternoonSnack: {\n label: 'Przekąska po południu',\n },\n dinner: {\n label: 'Kolacja',\n },\n afterDinner: {\n label: 'Po kolacji',\n },\n pulses: {\n label: 'Rośliny strączkowe (razy w tygodniu)',\n },\n fish: {\n label: 'Ryby (razy w tygodniu)',\n detailLabel: 'Jakie ryby są preferowane?',\n },\n eggs: {\n label: 'Jaja (razy w tygodniu)',\n },\n meatCuredMeat: {\n label: 'Mięso i wędliny (razy w tygodniu)',\n detailLabel: 'Czerwone czy białe?',\n },\n dairy: {\n label: 'Nabiał (razy w tygodniu)',\n detailLabel: 'Jaki nabiał jest preferowany?',\n },\n visitType: {\n label: 'Rodzaj wizyty',\n },\n practitioner: {\n label: 'Specjalista',\n },\n tumourType: {\n label: 'Rodzaj nowotworu',\n },\n stage: {\n label: 'Stadium',\n },\n metastases: {\n label: 'Przerzuty',\n },\n treatmentStatus: {\n label: 'Status leczenia',\n },\n medName: {\n label: 'Nazwa',\n },\n medDose: {\n label: 'Dawka',\n },\n nutritionalProposal: {\n label: 'Propozycja żywieniowa',\n },\n clinicalNotes: {\n label: 'Notatki kliniczne',\n },\n annualProposed: {\n label: 'Zaproponowano',\n },\n annualAccepted: {\n label: 'Zaakceptowano',\n },\n annualDeclineReason: {\n label: 'Powód odmowy',\n },\n },\n questionnaire: {\n noNumeric: {\n title: 'Brak danych do porównania',\n description:\n 'Trend porównuje odpowiedzi liczbowe z różnych kwestionariuszy. W ustawieniach formularza nadaj pytaniu typ liczbowy i jednostkę, a następnie odpowiedz na nie co najmniej dwukrotnie.',\n },\n overviewTab: 'Przegląd',\n },\n empty: {\n noVisits: {\n title: 'Brak wizyt',\n description:\n 'Po zapisaniu pierwszej wizyty pojawią się tutaj wartości i trendy.',\n },\n noRecord: {\n title: 'Nie zapisano jeszcze danych',\n description:\n 'Ta karta nie zawiera wizyt. Dodaj pierwszą wizytę, aby rozpocząć zapisywanie informacji.',\n create: 'Rozpocznij pierwszy kwestionariusz',\n createSigned: 'Rozpocznij z podpisem',\n },\n noQuestions: {\n title: 'Brak pytań do uzupełnienia',\n description:\n 'Ten kwestionariusz nie zawiera aktywnych pytań. Poproś placówkę o ich włączenie.',\n },\n noParameters: {\n title: 'Nie skonfigurowano pomiarów',\n description:\n 'W tej placówce nie skonfigurowano pomiarów, więc nie ma jeszcze danych do wyświetlenia na wykresie.',\n },\n },\n visitNote: {\n title: 'Notatki z wizyty',\n trigger: 'Notatki z wizyty: {{visitType}}, {{date}}',\n openInPanel:\n 'Otwórz notatki z wizyty ({{visitType}}, {{date}}) w widoku notatek',\n },\n rail: {\n notes: 'Notatki i zdarzenia',\n empty: 'Ta dokumentacja nie zawiera notatek ani zdarzeń.',\n eventLabel: 'Zdarzenie',\n },\n window: {\n label: 'Wyświetlane wizyty',\n pickerTrigger: 'Wizyty · {{shown}} z {{total}}',\n selectAll: 'Zaznacz wszystkie',\n showing: 'Wyświetlane wizyty: {{shown}} z {{total}} · {{from}} – {{to}}',\n showingAll: 'Wszystkie wizyty: {{total}} · {{from}} – {{to}}',\n minimum: 'Musi pozostać co najmniej jedna wyświetlana wizyta',\n optionHasNote: '{{label}} · notatka',\n },\n digest: {\n group: {\n reason: 'Powód wizyty',\n history: 'Choroby i leki',\n flags: 'Zgłaszane objawy',\n habits: 'Codzienne nawyki',\n },\n nothing: {\n title: 'Brak danych do podsumowania',\n description:\n 'Dotychczas zapisane odpowiedzi nie są uwzględniane w podsumowaniu. Otwórz pełny kwestionariusz poniżej, aby je przeczytać.',\n },\n missing: {\n title_one: 'Wymagane pytania bez odpowiedzi: {{count}}',\n title_other: 'Wymagane pytania bez odpowiedzi: {{count}}',\n list: 'Nadal brakuje: {{list}}',\n separator: ', ',\n jump: 'Przejdź do: {{field}}',\n title_few: 'Wymagane pytania bez odpowiedzi: {{count}}',\n title_many: 'Wymagane pytania bez odpowiedzi: {{count}}',\n },\n },\n export: {\n tab: {\n summary: 'Podsumowanie',\n compile: 'Wypełnij',\n evolution: 'Zmiany w czasie',\n },\n docTab: {\n summary: 'Podsumowanie kwestionariusza',\n compile: 'Karta wizyty',\n evolution: 'Zmiany w czasie',\n },\n docTitle: '{{tab}}: {{patient}}',\n info: 'Szczegóły dokumentu',\n generated: 'Wygenerowano',\n audienceLabel: 'Kopia dla',\n audience: {\n clinician: 'Placówki',\n patient: 'Pacjenta',\n external: 'Specjalisty spoza placówki',\n },\n visitsLabel: 'Uwzględnione wizyty',\n visitsSelected: '{{shown}} z {{total}}',\n visitsAll: 'Wszystkie: {{total}}',\n withheld: 'Ta kopia nie zawiera niektórych szczegółów klinicznych.',\n none: 'Brak zapisanych danych.',\n listSeparator: ', ',\n flagged: '{{date}} ({{flag}})',\n source: {\n patient: 'Pacjent',\n clinician: 'Osoba prowadząca leczenie',\n },\n column: {\n question: 'Pytanie',\n answer: 'Odpowiedź',\n source: 'Źródło',\n field: 'Pole',\n value: 'Wartość',\n unit: 'Jednostka',\n referenceRange: 'Zakres referencyjny',\n flag: 'Oznaczenie',\n target: 'Cel',\n change: 'Zmiana {{from}} → {{to}}',\n outOfRange: 'Poza zakresem',\n code: 'Kod',\n description: 'Opis',\n name: 'Nazwa',\n dose: 'Dawka',\n kind: 'Typ',\n cycle: 'Cykl',\n startDate: 'Data rozpoczęcia',\n status: 'Status',\n notes: 'Notatki',\n note: 'Notatka',\n text: 'Tekst',\n },\n control: {\n trigger: 'Eksportuj i udostępnij',\n triggerLabel: 'Eksportuj i udostępnij widok {{tab}}',\n triggerLabelAudience:\n 'Eksportuj i udostępnij widok {{tab}}, {{audience}}',\n audienceBadge: 'Kopia dla pacjenta',\n menuLabel: 'Widok {{tab}}',\n everyVisit:\n 'Uwzględnij wszystkie wizyty, nie tylko wyświetlane kolumny',\n excludes: 'Kopia dla pacjenta nie zawiera: {{list}}',\n excludesNone: 'Kopia tego widoku dla pacjenta niczego nie pomija.',\n holds:\n 'Kopia dla placówki zawiera pełną dokumentację, w tym: {{list}}.',\n holdsNone:\n 'Ten widok nie zawiera niczego, co zostałoby pominięte w kopii dla pacjenta.',\n share: 'Udostępnij…',\n pdf: 'Pobierz PDF',\n print: 'Drukuj',\n xlsx: 'Pobierz plik Excel (.xlsx)',\n csv: 'Pobierz plik CSV (.csv)',\n printFrame: 'Dokument do druku (bez widocznej zawartości)',\n printing: 'Otwiera się okno drukowania dokumentu.',\n ready: 'Plik {{file}} jest gotowy.',\n failed: 'Nie udało się przygotować pliku w tej przeglądarce.',\n },\n share: {\n title: 'Udostępnij widok {{tab}}',\n mockBadge: 'Tylko podgląd',\n subtitle:\n 'Wybierz, dla kogo byłaby przeznaczona kopia, i sprawdź, co by zawierała.',\n noticeTitle: 'Ten ekran niczego nie wysyła',\n notice:\n 'Ten podgląd pokazuje, jak wyglądałoby udostępnienie, ale niczego nie udostępnia. Rzeczywiste udostępnienie wymaga podpisanego linku z terminem ważności, zgody pacjenta oraz zapisu, kto otrzymał jakie dane i jakim kanałem. Wszystkie te elementy są obsługiwane poza tą dokumentacją.',\n audienceLabel: 'Dla kogo byłaby przeznaczona ta kopia?',\n includes: 'Ta kopia zawierałaby',\n includesNone: 'Dla tego odbiorcy ten widok nie tworzy dokumentu.',\n excludes: 'Ta kopia pomijałaby',\n excludesNone: 'Ta kopia niczego nie pomija.',\n cancel: 'Anuluj',\n confirm: 'Potwierdź odbiorcę',\n confirmed: 'Ustawiono odbiorcę: {{audience}}. Niczego nie wysłano.',\n },\n concept: {\n patient_identity: 'Dane identyfikacyjne pacjenta',\n intake_answers: 'Odpowiedzi na pytania kwestionariusza',\n visit_date: 'Daty wizyt',\n visit_type: 'Rodzaj wizyty',\n visit_practitioner: 'Specjalista',\n visit_reasonCode: 'Zakodowany powód wizyty',\n anthropometrics_values: 'Pomiary antropometryczne',\n dietary_intake: 'Spożycie składników odżywczych',\n derived_bmi: 'BMI',\n lab_values: 'Wyniki badań krwi',\n pathology_codes: 'Kody diagnostyczne',\n oncological_history: 'Wywiad onkologiczny',\n therapy_entries: 'Leczenie i suplementy',\n fmd_cycles: 'Cykle diety naśladującej post',\n annual_programme: 'Program roczny',\n notes_clinicalNotes: 'Notatki kliniczne',\n notes_nutritionalProposal: 'Propozycja żywieniowa',\n symptom_observations: 'Obserwacje osoby prowadzącej leczenie',\n compare_diff: 'Porównanie wizyt',\n visit_note: 'Notatki z wizyty',\n event_timeline: 'Oś czasu zdarzeń klinicznych',\n export_tabDocument: 'Sam dokument',\n export_workbook: 'Skoroszyt z całą dokumentacją',\n },\n },\n },\n} as const;\n","/** Anamnesis interface resources (pt). */\nexport default {\n anamnesis: {\n mainLabel: 'Registo de anamnese: {{mode}}',\n mode: {\n intake: 'Recolha de informação',\n compile: 'Preencher',\n questionnaire: 'Questionário',\n readOnly: 'Só de leitura',\n },\n common: {\n yes: 'Sim',\n no: 'Não',\n unknown: 'Desconhecido',\n notSure: 'Não sei ao certo',\n choose: 'Escolher…',\n details: 'Detalhes',\n detailsPending: 'Aparece quando a resposta é «Sim»',\n time: 'Hora',\n whatEaten: 'O que comeu?',\n },\n header: {\n name: 'Nome',\n age: 'Idade',\n dob: 'Data de nascimento',\n visitDate: 'Data da consulta',\n years: 'Idade em anos: {{age}}',\n },\n origin: {\n fromPatient: 'Do paciente',\n },\n delta: {\n improved: 'Melhorou',\n worsened: 'Piorou',\n unchanged: 'Sem alteração',\n aria: '{{valence}}: {{change}}',\n },\n range: {\n aboveRange: 'Acima do intervalo',\n belowRange: 'Abaixo do intervalo',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: 'Medidas antropométricas',\n dietary: 'Ingestão alimentar',\n lab: 'Análises ao sangue',\n },\n visitType: {\n first: 'Primeira consulta',\n followUp: 'Consulta de seguimento',\n },\n medKind: {\n medication: 'Medicamento',\n supplement: 'Suplemento',\n },\n section: {\n reason: 'Motivo da consulta',\n pharmacological: 'História farmacológica',\n familyHistory: 'Antecedentes familiares',\n symptoms: 'Sintomas',\n otherHistory: 'Outros antecedentes',\n dietaryHistory: 'História alimentar',\n recall24h: 'Recordatório alimentar das últimas 24 horas',\n foodFrequency: 'Frequência alimentar semanal',\n visitMeta: 'Detalhes da consulta',\n patientIntake: 'Questionário do paciente',\n intakeGaps: 'Perguntas sem resposta',\n anthropometrics: 'Medidas antropométricas',\n dietary: 'Ingestão alimentar',\n pathologies: 'Patologias',\n oncological: 'História oncológica',\n therapy: 'Tratamento e suplementos',\n labs: 'Análises ao sangue',\n fmd: 'Programa de dieta que imita o jejum',\n proposal: 'Proposta nutricional e notas',\n annual: 'Programa anual',\n evolution: 'Evolução',\n },\n intake: {\n title: 'Questionário antes da consulta',\n subtitle: 'Preencha este questionário antes da primeira consulta.',\n sectionsLabel: 'Secções do questionário',\n answered: 'Perguntas respondidas: {{answered}} de {{total}}',\n sectionProgress: 'Respostas: {{answered}} de {{total}}',\n submit: 'Guardar',\n unsentNotice:\n 'As suas respostas são guardadas quando envia este questionário.',\n submittedNotice: 'Respostas guardadas.',\n },\n compile: {\n tabSummary: 'Resumo',\n tabCompile: 'Preencher',\n tabEvolution: 'Evolução',\n viewsLabel: 'Vistas do registo',\n visitCount: 'Consultas: {{visits}}',\n bmiInStrip:\n 'O IMC é calculado a partir do peso e da altura. O resultado pode ser consultado no resumo no topo deste registo.',\n gapsIntro:\n 'Estas perguntas obrigatórias ficaram sem resposta. Preencha-as com o paciente.',\n noIntake: 'O paciente não enviou um questionário.',\n pathologiesLabel: 'Patologias atribuídas',\n pathologiesHelp:\n 'Selecione todos os códigos aplicáveis. Um paciente pode ter vários códigos em simultâneo.',\n pathologiesPlaceholder: 'Pesquisar códigos…',\n noTherapy: 'Sem tratamentos ou suplementos registados.',\n addTherapy: 'Adicionar medicamento',\n removeTherapy: 'Remover {{name}}',\n noFmd: 'Sem ciclos de dieta que imita o jejum registados.',\n cycleNumber: 'Ciclo {{number}}',\n cycleCompleted: 'Concluído',\n cycleInProgress: 'Em curso',\n blockEmpty: 'Nada registado',\n blockFilled_one: 'Registados: {{count}}',\n blockFilled_other: 'Registados: {{count}}',\n blockFlagged_one: 'Fora do intervalo: {{count}}',\n blockFlagged_other: 'Fora do intervalo: {{count}}',\n blockOutstanding_one: 'Por responder: {{count}}',\n blockOutstanding_other: 'Por responder: {{count}}',\n blockSettled: 'Todas respondidas',\n addFollowUpVisit: 'Adicionar consulta de seguimento',\n blockFilled_many: 'Registados: {{count}}',\n blockFilled_zero: 'Registados: {{count}}',\n blockFlagged_many: 'Fora do intervalo: {{count}}',\n blockFlagged_zero: 'Fora do intervalo: {{count}}',\n blockOutstanding_many: 'Por responder: {{count}}',\n blockOutstanding_zero: 'Por responder: {{count}}',\n },\n configEditor: {\n title: 'Configuração da anamnese',\n intro:\n 'O vocabulário da clínica: altere nomes e a ordem, arquive ou adicione itens. Arquivar nunca elimina dados. As respostas já registadas permanecem no histórico.',\n tabsLabel: 'Vocabulários de configuração',\n tabQuestionnaire: 'Questionário',\n tabParameters: 'Parâmetros',\n tabPathologies: 'Patologias',\n tabTargets: 'Objetivos',\n targetsIntro:\n 'Escolha os parâmetros que a clínica acompanha como objetivos. Aparecem nos cartões acima do registo, onde se define o valor pretendido para cada paciente e se compara o valor atual com o objetivo.',\n panelTracked_one: 'Acompanhados como objetivos: {{count}}',\n panelTracked_other: 'Acompanhados como objetivos: {{count}}',\n panelLive_one: 'Ativos: {{count}}',\n panelLive_other: 'Ativos: {{count}}',\n panelArchived_one: 'Arquivados: {{count}}',\n panelArchived_other: 'Arquivados: {{count}}',\n panelNotCaptured_one: 'Não apresentados na recolha de dados: {{count}}',\n panelNotCaptured_other: 'Não apresentados na recolha de dados: {{count}}',\n locked: 'Bloqueado',\n lockedHint:\n 'Usado no cálculo do IMC. Pode alterar o nome ou a ordem, mas não pode remover este parâmetro',\n archived: 'Arquivado',\n rowActions: 'Ações para {{name}}',\n reorderHandle:\n 'Reordenar {{name}}. Prima Alt + Seta para cima ou Alt + Seta para baixo para mover.',\n reorderAnnounce: '{{name}}: posição alterada para {{to}} de {{total}}',\n edit: 'Editar {{name}}',\n archive: 'Arquivar {{name}}',\n restore: 'Restaurar {{name}}',\n addQuestion: 'Adicionar pergunta',\n addSection: 'Adicionar secção',\n addParameter: 'Adicionar parâmetro',\n addCode: 'Adicionar código',\n sectionEmptyCapture:\n 'Sem perguntas ativas. Esta secção não é apresentada durante a recolha de dados.',\n familyHeading:\n 'Grupo com subcódigos: título que não pode ser atribuído diretamente',\n subCodeOf: 'Subcódigo de {{code}}',\n direction: {\n down: 'Quanto mais baixo, melhor',\n up: 'Quanto mais alto, melhor',\n toRange: 'Dentro do intervalo é melhor',\n },\n type: {\n text: 'Resposta curta',\n textarea: 'Resposta longa',\n numberInteger: 'Número inteiro',\n numberDecimal: 'Número decimal',\n yesNoDetail: 'Sim / não',\n choice: 'Escolha única',\n choiceWithText: 'Escolha única com texto',\n multiChoice: 'Escolha múltipla',\n frequency: 'Frequência semanal',\n meal: 'Refeição',\n },\n typeLine: 'Tipo de resposta: {{type}}.',\n requiredBadge: 'Obrigatório',\n requiredField: 'Resposta obrigatória',\n optionsCurrent: 'Opções: {{list}}.',\n editTitle: 'Editar {{name}}',\n keyLine: 'Identificador: {{key}}. Definido na criação e nunca alterado.',\n codeLine: 'Código: {{code}}. Definido na criação e nunca alterado.',\n labelField: 'Etiqueta',\n labelFieldHelp: 'Deixe em branco para usar o texto padrão.',\n helpField: 'Texto de ajuda',\n addNote:\n 'Uma entrada personalizada pertence apenas a esta clínica. Não é adicionada a nenhum vocabulário partilhado.',\n addParameterTitle: 'Adicionar um parâmetro',\n addQuestionTitle: 'Adicionar uma pergunta a {{section}}',\n addSectionTitle: 'Adicionar uma secção',\n addCodeTitle: 'Adicionar um código de patologia',\n codeField: 'Código',\n groupField: 'Grupo',\n directionField: 'O que representa uma melhoria',\n unitField: 'Unidade',\n precisionField: 'Casas decimais',\n rangeMinField: 'Mínimo de referência',\n rangeMaxField: 'Máximo de referência',\n typeField: 'Tipo de resposta',\n optionsField: 'Opções',\n optionsFieldHelp: 'Separadas por vírgulas. É necessária pelo menos uma.',\n parentField: 'Grupo principal',\n parentFieldHelp:\n 'Adicionar um subcódigo transforma o grupo num título que deixa de poder ser atribuído diretamente.',\n sectionNeedsQuestion:\n 'Uma nova secção aparece no questionário quando contém pelo menos uma pergunta ativa.',\n selectPlaceholder: 'Escolher…',\n save: 'Guardar',\n cancel: 'Cancelar',\n add: 'Adicionar',\n panelTracked_many: 'Acompanhados como objetivos: {{count}}',\n panelTracked_zero: 'Acompanhados como objetivos: {{count}}',\n panelLive_many: 'Ativos: {{count}}',\n panelLive_zero: 'Ativos: {{count}}',\n panelArchived_many: 'Arquivados: {{count}}',\n panelArchived_zero: 'Arquivados: {{count}}',\n panelNotCaptured_many: 'Não apresentados na recolha de dados: {{count}}',\n panelNotCaptured_zero: 'Não apresentados na recolha de dados: {{count}}',\n },\n targets: {\n title: 'Objetivos nutricionais',\n tileLabel: 'Objetivo: {{name}}',\n now: 'Atual: {{value}}',\n nowBanded: 'Atual: {{value}} · {{band}}',\n nowUnset: 'Ainda não medido',\n unset: 'Sem objetivo',\n status: {\n onTarget: 'Objetivo atingido',\n approaching: 'A aproximar-se do objetivo',\n offTarget: 'Fora do objetivo',\n },\n edit: 'Editar objetivo: {{parameter}}',\n editTitle: 'Objetivo: {{parameter}}',\n editField: 'Novo objetivo',\n bounds: 'Entre {{range}}',\n outOfBounds: 'Introduza um objetivo entre {{range}}.',\n unsaved: 'Ainda não guardado',\n save: 'Guardar objetivo',\n clear: 'Remover objetivo',\n },\n summary: {\n fullQuestionnaire: 'O questionário completo',\n noAnswers: 'Ainda não foram registadas respostas.',\n jump: 'Responda a {{field}} no separador Preencher',\n },\n compare: {\n visitsLabel: 'Consultas comparadas',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: 'Consultas comparadas: {{total}} · {{from}} – {{to}}',\n minimum: 'A comparação deve incluir pelo menos duas consultas',\n stop: 'Terminar comparação',\n panelTitle: 'Comparar consultas',\n sameVisit:\n 'Escolha duas ou mais consultas diferentes para ver o que mudou.',\n summaryTitle: 'Alterações de {{from}} a {{to}}',\n tableLabel: 'O que mudou entre as consultas comparadas',\n noChanges: 'Sem alterações entre estas consultas.',\n noChangesDescription:\n 'Foram registadas as mesmas medidas, códigos, tratamentos e notas em todas as consultas.',\n present: 'Presente',\n added: 'Adicionado',\n removed: 'Removido',\n changed: 'Alterado',\n notMeasured: 'Não medido',\n category: {\n measurement: 'Medidas',\n pathology: 'Patologias',\n therapy: 'Tratamento',\n note: 'Notas',\n },\n column: {\n item: 'Item',\n change: 'Alteração',\n },\n },\n event: {\n barLabel: 'Eventos',\n chip: '{{label}} · {{date}}',\n separator: ', ',\n shown: 'Linhas de eventos visíveis: {{list}}',\n noneShown: 'Nenhuma linha de evento visível.',\n external: '{{category}} · registado por {{source}}',\n category: {\n therapy: 'Tratamento',\n diet: 'Dieta',\n fmd: 'Programa de dieta que imita o jejum',\n surgery: 'Cirurgia',\n lifestyle: 'Vida diária',\n },\n label: {\n dietStart: 'Início do plano mediterrânico',\n fmdCycle: 'Ciclo de dieta que imita o jejum',\n gymStart: 'Início da atividade no ginásio',\n chemoStart: 'Início da quimioterapia',\n surgery: 'Cirurgia da vesícula biliar',\n },\n source: {\n oncology: 'um oncologista externo à clínica',\n },\n },\n grid: {\n parameter: 'Parâmetro',\n caption:\n 'Valores dos parâmetros nas consultas, da mais antiga para a mais recente.',\n captionInModule:\n 'Valores dos parâmetros nas consultas de {{module}}, da mais antiga para a mais recente.',\n target: 'Objetivo: {{value}} {{unit}}',\n trendLabel: 'Evolução de {{parameter}}',\n trend: 'Evolução',\n editable: 'Editável',\n editCell: '{{parameter}}: consulta mais recente',\n baselineMerged:\n 'Dados combinados das primeiras consultas. Total: {{total}}',\n unlabelledSource: 'Outro',\n blockVisits_one: '{{count}} consulta',\n blockVisits_other: '{{count}} consultas',\n blockVisits_many: '{{count}} consultas',\n blockVisits_zero: '{{count}} consultas',\n },\n readOnly: {\n subtitle: 'Registo do plano de tratamento, só de leitura.',\n summary: 'Resumo do paciente',\n none: 'Nada registado.',\n perWeek: 'Frequência semanal: {{times}}',\n },\n pathology: {\n E66: 'Obesidade',\n E66_0: 'Obesidade devida a excesso de calorias',\n E66_9: 'Obesidade não especificada',\n E11: 'Diabetes mellitus tipo 2',\n E11_9: 'Diabetes tipo 2 sem complicações',\n E11_6: 'Diabetes tipo 2 com outras complicações especificadas',\n E78: 'Perturbações do metabolismo das lipoproteínas',\n I10: 'Hipertensão essencial',\n E03: 'Hipotiroidismo',\n K58: 'Síndrome do intestino irritável',\n D50: 'Anemia por deficiência de ferro',\n E55: 'Deficiência de vitamina D',\n groupGeneral: 'Geral',\n },\n param: {\n weight: 'Peso',\n height: 'Altura',\n bmi: 'IMC',\n waist: 'Perímetro da cintura',\n hips: 'Perímetro da anca',\n arm: 'Perímetro do braço',\n phaseAngle: 'Ângulo de fase',\n energy: 'Energia diária',\n protein: 'Proteína',\n fastingGlucose: 'Glicemia em jejum',\n hba1c: 'HbA1c',\n totalCholesterol: 'Colesterol total',\n ldl: 'Colesterol LDL',\n hdl: 'Colesterol HDL',\n triglycerides: 'Triglicéridos',\n haemoglobin: 'Hemoglobina',\n vitaminD: 'Vitamina D (25-OH)',\n tsh: 'TSH',\n ferritin: 'Ferritina',\n crp: 'Proteína C reativa',\n creatinine: 'Creatinina',\n },\n field: {\n highlighted: 'Em destaque',\n reasonForVisit: {\n label: 'Motivo da consulta e objetivos',\n },\n knownConditions: {\n label: 'Doenças conhecidas',\n },\n dailyMedications: {\n label: 'Medicação diária',\n },\n currentSupplements: {\n label: 'Suplementos atuais',\n },\n familyParents: {\n label: 'Pais',\n },\n familySiblings: {\n label: 'Irmãos',\n },\n familyGrandparents: {\n label: 'Avós',\n },\n bloating: {\n label: 'Distensão abdominal',\n },\n refluxGastritis: {\n label: 'Refluxo ou gastrite',\n },\n tiredness: {\n label: 'Cansaço',\n },\n sleepQuality: {\n label: 'Qualidade do sono',\n option: {\n good: 'Boa',\n fair: 'Razoável',\n poor: 'Má',\n },\n },\n sleepDifficulty: {\n label: 'Dificuldade em adormecer ou despertares noturnos',\n },\n bowelHabits: {\n label: 'Hábitos intestinais',\n option: {\n regular: 'Regulares',\n constipated: 'Obstipação',\n diarrhoeal: 'Diarreia',\n alternating: 'Alternância entre obstipação e diarreia',\n },\n },\n stoolCharacteristics: {\n label: 'Características das fezes',\n },\n haemorrhoids: {\n label: 'Hemorroidas',\n },\n diverticula: {\n label: 'Divertículos',\n },\n regularUrination: {\n label: 'Micção regular',\n },\n menstrualCycle: {\n label: 'Ciclo menstrual',\n option: {\n regular: 'Regular',\n irregular: 'Irregular',\n absent: 'Ausente',\n },\n },\n foodAllergies: {\n label: 'Alergias alimentares',\n },\n drugAllergies: {\n label: 'Alergias a medicamentos',\n },\n otherAllergies: {\n label: 'Outras alergias',\n },\n foodIntolerances: {\n label: 'Intolerâncias alimentares',\n },\n smoking: {\n label: 'Tabagismo',\n option: {\n never: 'Nunca fumou',\n former: 'Fumou no passado',\n current: 'Fuma atualmente',\n },\n },\n pastSurgery: {\n label: 'Cirurgias anteriores',\n },\n pregnancies: {\n label: 'Gravidezes',\n },\n weightSelf: {\n label: 'Peso (kg)',\n },\n heightSelf: {\n label: 'Altura (cm)',\n },\n physicalActivity: {\n label: 'Atividade física atual',\n },\n lifestyle: {\n label: 'Estilo de vida atual',\n },\n waterPerDay: {\n label: 'Água (litros por dia)',\n },\n fizzyDrinks: {\n label: 'Bebidas gaseificadas',\n option: {\n never: 'Nunca',\n occasionally: 'Ocasionalmente',\n daily: 'Diariamente',\n },\n },\n alcohol: {\n label: 'Álcool',\n option: {\n never: 'Nunca',\n occasionally: 'Ocasionalmente',\n daily: 'Diariamente',\n },\n },\n coffeePerDay: {\n label: 'Café (chávenas por dia)',\n },\n coffeeSugar: {\n label: 'Café com açúcar?',\n option: {\n yes: 'Sim',\n no: 'Não',\n },\n },\n breakfast: {\n label: 'Pequeno-almoço',\n },\n morningSnack: {\n label: 'Lanche da manhã',\n },\n lunch: {\n label: 'Almoço',\n },\n afternoonSnack: {\n label: 'Lanche da tarde',\n },\n dinner: {\n label: 'Jantar',\n },\n afterDinner: {\n label: 'Após o jantar',\n },\n pulses: {\n label: 'Leguminosas (vezes por semana)',\n },\n fish: {\n label: 'Peixe (vezes por semana)',\n detailLabel: 'Que peixes prefere?',\n },\n eggs: {\n label: 'Ovos (vezes por semana)',\n },\n meatCuredMeat: {\n label: 'Carne e produtos de charcutaria (vezes por semana)',\n detailLabel: 'Vermelha ou branca?',\n },\n dairy: {\n label: 'Laticínios (vezes por semana)',\n detailLabel: 'Que laticínios prefere?',\n },\n visitType: {\n label: 'Tipo de consulta',\n },\n practitioner: {\n label: 'Profissional de saúde',\n },\n tumourType: {\n label: 'Tipo de tumor',\n },\n stage: {\n label: 'Estádio',\n },\n metastases: {\n label: 'Metástases',\n },\n treatmentStatus: {\n label: 'Estado do tratamento',\n },\n medName: {\n label: 'Nome',\n },\n medDose: {\n label: 'Dose',\n },\n nutritionalProposal: {\n label: 'Proposta nutricional',\n },\n clinicalNotes: {\n label: 'Notas clínicas',\n },\n annualProposed: {\n label: 'Proposto',\n },\n annualAccepted: {\n label: 'Aceite',\n },\n annualDeclineReason: {\n label: 'Motivo da recusa',\n },\n },\n questionnaire: {\n noNumeric: {\n title: 'Ainda não há dados para comparar',\n description:\n 'A evolução compara respostas numéricas entre questionários. Nas definições do formulário, atribua a uma pergunta o tipo numérico e uma unidade. Depois responda a essa pergunta pelo menos duas vezes.',\n },\n overviewTab: 'Visão geral',\n },\n empty: {\n noVisits: {\n title: 'Ainda não há consultas',\n description:\n 'Após o registo da primeira consulta, os valores e a sua evolução aparecem aqui.',\n },\n noRecord: {\n title: 'Ainda não há registos',\n description:\n 'Este registo não tem consultas. Adicione a primeira consulta para começar a registar informação.',\n create: 'Iniciar o primeiro questionário',\n createSigned: 'Iniciar com assinatura',\n },\n noQuestions: {\n title: 'Sem perguntas para responder',\n description:\n 'Este questionário não tem perguntas ativas. Peça à clínica para as ativar.',\n },\n noParameters: {\n title: 'Sem medidas configuradas',\n description:\n 'Esta clínica não tem medidas configuradas, pelo que ainda não há dados para apresentar no gráfico.',\n },\n },\n visitNote: {\n title: 'Notas da consulta',\n trigger: 'Notas da consulta: {{visitType}}, {{date}}',\n openInPanel:\n 'Abrir as notas da consulta ({{visitType}}, {{date}}) na vista de notas',\n },\n rail: {\n notes: 'Notas e eventos',\n empty: 'Este registo não tem notas nem eventos.',\n eventLabel: 'Evento',\n },\n window: {\n label: 'Consultas apresentadas',\n pickerTrigger: 'Consultas: {{shown}} de {{total}}',\n selectAll: 'Selecionar todas',\n showing:\n 'Consultas apresentadas: {{shown}} de {{total}} · {{from}} – {{to}}',\n showingAll: 'Todas as consultas: {{total}} · {{from}} – {{to}}',\n minimum: 'Deve permanecer visível pelo menos uma consulta',\n optionHasNote: '{{label}} · nota',\n },\n digest: {\n group: {\n reason: 'Motivo da consulta',\n history: 'Doenças e medicação',\n flags: 'Sintomas referidos',\n habits: 'Hábitos diários',\n },\n nothing: {\n title: 'Ainda não há informação para resumir',\n description:\n 'As respostas registadas até agora não fazem parte do resumo. Abra o questionário completo abaixo para as ler.',\n },\n missing: {\n title_one: 'Perguntas obrigatórias ainda sem resposta: {{count}}',\n title_other: 'Perguntas obrigatórias ainda sem resposta: {{count}}',\n list: 'Ainda em falta: {{list}}',\n separator: ', ',\n jump: 'Ir para {{field}}',\n title_many: 'Perguntas obrigatórias ainda sem resposta: {{count}}',\n title_zero: 'Perguntas obrigatórias ainda sem resposta: {{count}}',\n },\n },\n export: {\n tab: {\n summary: 'Resumo',\n compile: 'Preencher',\n evolution: 'Evolução',\n },\n docTab: {\n summary: 'Resumo do questionário',\n compile: 'Registo da consulta',\n evolution: 'Evolução',\n },\n docTitle: '{{tab}}: {{patient}}',\n info: 'Detalhes do documento',\n generated: 'Gerado',\n audienceLabel: 'Cópia para',\n audience: {\n clinician: 'A clínica',\n patient: 'O paciente',\n external: 'Um profissional externo',\n },\n visitsLabel: 'Consultas incluídas',\n visitsSelected: '{{shown}} de {{total}}',\n visitsAll: 'Todas: {{total}}',\n withheld: 'Esta cópia não inclui alguns detalhes clínicos.',\n none: 'Nada registado.',\n listSeparator: ', ',\n flagged: '{{date}} ({{flag}})',\n source: {\n patient: 'Paciente',\n clinician: 'Profissional de saúde',\n },\n column: {\n question: 'Pergunta',\n answer: 'Resposta',\n source: 'Origem',\n field: 'Campo',\n value: 'Valor',\n unit: 'Unidade',\n referenceRange: 'Intervalo de referência',\n flag: 'Sinalização',\n target: 'Objetivo',\n change: 'Alteração de {{from}} a {{to}}',\n outOfRange: 'Fora do intervalo',\n code: 'Código',\n description: 'Descrição',\n name: 'Nome',\n dose: 'Dose',\n kind: 'Tipo',\n cycle: 'Ciclo',\n startDate: 'Data de início',\n status: 'Estado',\n notes: 'Notas',\n note: 'Nota',\n text: 'Texto',\n },\n control: {\n trigger: 'Exportar e partilhar',\n triggerLabel: 'Exportar e partilhar a vista {{tab}}',\n triggerLabelAudience:\n 'Exportar e partilhar a vista {{tab}}, {{audience}}',\n audienceBadge: 'Cópia para o paciente',\n menuLabel: 'Vista {{tab}}',\n everyVisit:\n 'Incluir todas as consultas, não apenas as colunas apresentadas',\n excludes: 'A cópia para o paciente não inclui: {{list}}',\n excludesNone: 'A cópia desta vista para o paciente não omite nada.',\n holds:\n 'A cópia para a clínica contém o registo completo, incluindo {{list}}.',\n holdsNone:\n 'Esta vista não contém informação que seria omitida numa cópia para o paciente.',\n share: 'Partilhar…',\n pdf: 'Descarregar PDF',\n print: 'Imprimir',\n xlsx: 'Descarregar Excel (.xlsx)',\n csv: 'Descarregar CSV (.csv)',\n printFrame: 'Documento para impressão (sem conteúdo visível)',\n printing: 'A abrir a janela de impressão do documento.',\n ready: 'O ficheiro {{file}} está pronto.',\n failed: 'Este navegador não conseguiu preparar o ficheiro.',\n },\n share: {\n title: 'Partilhar a vista {{tab}}',\n mockBadge: 'Apenas pré-visualização',\n subtitle: 'Escolha o destinatário da cópia e veja o que ela incluiria.',\n noticeTitle: 'Nada é enviado a partir deste ecrã',\n notice:\n 'Esta pré-visualização mostra como seria a partilha, sem partilhar nada. Uma partilha real exige uma ligação assinada com prazo de validade, o consentimento do paciente e um registo de quem recebeu que informação e por que canal. Todos estes elementos são geridos fora deste registo.',\n audienceLabel: 'A quem se destinaria esta cópia?',\n includes: 'Esta cópia incluiria',\n includesNone:\n 'Esta vista não produz um documento para este destinatário.',\n excludes: 'Esta cópia omitiria',\n excludesNone: 'Esta cópia não omite nada.',\n cancel: 'Cancelar',\n confirm: 'Confirmar destinatário',\n confirmed: 'Destinatário definido: {{audience}}. Nada foi enviado.',\n },\n concept: {\n patient_identity: 'Identidade do paciente',\n intake_answers: 'Respostas ao questionário',\n visit_date: 'Datas das consultas',\n visit_type: 'Tipo de consulta',\n visit_practitioner: 'Profissional de saúde',\n visit_reasonCode: 'Motivo codificado da consulta',\n anthropometrics_values: 'Medidas antropométricas',\n dietary_intake: 'Ingestão alimentar',\n derived_bmi: 'IMC',\n lab_values: 'Resultados das análises ao sangue',\n pathology_codes: 'Códigos de diagnóstico',\n oncological_history: 'História oncológica',\n therapy_entries: 'Tratamento e suplementos',\n fmd_cycles: 'Ciclos de dieta que imita o jejum',\n annual_programme: 'Programa anual',\n notes_clinicalNotes: 'Notas clínicas',\n notes_nutritionalProposal: 'Proposta nutricional',\n symptom_observations: 'Observações do profissional de saúde',\n compare_diff: 'Comparação de consultas',\n visit_note: 'Notas da consulta',\n event_timeline: 'Cronologia de eventos clínicos',\n export_tabDocument: 'O próprio documento',\n export_workbook: 'O livro de cálculo com o registo completo',\n },\n },\n },\n} as const;\n","/** Anamnesis interface resources (ro). */\nexport default {\n anamnesis: {\n mainLabel: 'Fișă de anamneză: {{mode}}',\n mode: {\n intake: 'Chestionar preliminar',\n compile: 'Completare',\n questionnaire: 'Chestionar',\n readOnly: 'Doar citire',\n },\n common: {\n yes: 'Da',\n no: 'Nu',\n unknown: 'Necunoscut',\n notSure: 'Nu sunt sigur(ă)',\n choose: 'Alegeți…',\n details: 'Detalii',\n detailsPending: 'Apare când răspunsul este „Da”',\n time: 'Ora',\n whatEaten: 'Ce ați mâncat?',\n },\n header: {\n name: 'Nume',\n age: 'Vârstă',\n dob: 'Data nașterii',\n visitDate: 'Data consultației',\n years: 'Vârsta în ani: {{age}}',\n },\n origin: {\n fromPatient: 'De la pacient',\n },\n delta: {\n improved: 'Îmbunătățire',\n worsened: 'Înrăutățire',\n unchanged: 'Fără modificări',\n aria: '{{valence}}: {{change}}',\n },\n range: {\n aboveRange: 'Peste interval',\n belowRange: 'Sub interval',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: 'Antropometrie',\n dietary: 'Aport alimentar',\n lab: 'Analize de sânge',\n },\n visitType: {\n first: 'Prima consultație',\n followUp: 'Consultație de control',\n },\n medKind: {\n medication: 'Medicament',\n supplement: 'Supliment',\n },\n section: {\n reason: 'Motivul consultației',\n pharmacological: 'Istoric medicamentos',\n familyHistory: 'Antecedente familiale',\n symptoms: 'Simptome',\n otherHistory: 'Alte antecedente',\n dietaryHistory: 'Istoric alimentar',\n recall24h: 'Alimentația din ultimele 24 de ore',\n foodFrequency: 'Frecvența săptămânală a consumului de alimente',\n visitMeta: 'Detaliile consultației',\n patientIntake: 'Chestionarul preliminar al pacientului',\n intakeGaps: 'Întrebări fără răspuns',\n anthropometrics: 'Antropometrie',\n dietary: 'Aport alimentar',\n pathologies: 'Patologii',\n oncological: 'Antecedente oncologice',\n therapy: 'Tratament și suplimente',\n labs: 'Analize de sânge',\n fmd: 'Program de dietă care imită postul',\n proposal: 'Recomandări nutriționale și note',\n annual: 'Program anual',\n evolution: 'Evoluție',\n },\n intake: {\n title: 'Chestionar înaintea consultației',\n subtitle: 'Vă rugăm să îl completați înainte de prima consultație.',\n sectionsLabel: 'Secțiunile chestionarului',\n answered: 'Întrebări cu răspuns: {{answered}} din {{total}}',\n sectionProgress: 'Răspunsuri completate: {{answered}} din {{total}}',\n submit: 'Salvează',\n unsentNotice:\n 'Răspunsurile sunt înregistrate când trimiteți acest chestionar.',\n submittedNotice: 'Răspunsuri salvate.',\n },\n compile: {\n tabSummary: 'Rezumat',\n tabCompile: 'Completare',\n tabEvolution: 'Evoluție',\n viewsLabel: 'Vizualizările fișei',\n visitCount: 'Consultații: {{visits}}',\n bmiInStrip:\n 'IMC este calculat din greutate și înălțime și poate fi consultat în rezumatul din partea de sus a acestei fișe.',\n gapsIntro:\n 'Aceste întrebări obligatorii au rămas fără răspuns. Completați-le împreună cu pacientul.',\n noIntake: 'Pacientul nu a trimis niciun chestionar.',\n pathologiesLabel: 'Patologii atribuite',\n pathologiesHelp:\n 'Selectați toate codurile aplicabile. Un pacient poate avea mai multe simultan.',\n pathologiesPlaceholder: 'Caută coduri…',\n noTherapy: 'Nu au fost înregistrate tratamente sau suplimente.',\n addTherapy: 'Adaugă medicament',\n removeTherapy: 'Elimină {{name}}',\n noFmd: 'Nu au fost înregistrate cicluri de dietă care imită postul.',\n cycleNumber: 'Ciclul {{number}}',\n cycleCompleted: 'Finalizat',\n cycleInProgress: 'În desfășurare',\n blockEmpty: 'Nimic înregistrat',\n blockFilled_one: 'Înregistrări: {{count}}',\n blockFilled_other: 'Înregistrări: {{count}}',\n blockFlagged_one: 'Valori în afara intervalului: {{count}}',\n blockFlagged_other: 'Valori în afara intervalului: {{count}}',\n blockOutstanding_one: 'Întrebări rămase: {{count}}',\n blockOutstanding_other: 'Întrebări rămase: {{count}}',\n blockSettled: 'Toate răspunsurile sunt completate',\n addFollowUpVisit: 'Adaugă consultație de control',\n blockFilled_few: 'Înregistrări: {{count}}',\n blockFlagged_few: 'Valori în afara intervalului: {{count}}',\n blockOutstanding_few: 'Întrebări rămase: {{count}}',\n },\n configEditor: {\n title: 'Configurarea anamnezei',\n intro:\n 'Terminologia proprie a cabinetului: redenumiți, reordonați, arhivați sau adăugați. Arhivarea nu șterge nimic; răspunsurile deja înregistrate rămân în istoric.',\n tabsLabel: 'Liste de termeni configurabile',\n tabQuestionnaire: 'Chestionar',\n tabParameters: 'Parametri',\n tabPathologies: 'Patologii',\n tabTargets: 'Obiective',\n targetsIntro:\n 'Alegeți parametrii pe care cabinetul îi urmărește ca obiective. Aceștia apar în cardurile de obiective de deasupra fișei, unde se setează valoarea țintă pentru fiecare pacient și se compară valoarea curentă cu ținta.',\n panelTracked_one: 'Parametri urmăriți ca obiective: {{count}}',\n panelTracked_other: 'Parametri urmăriți ca obiective: {{count}}',\n panelLive_one: 'Elemente active: {{count}}',\n panelLive_other: 'Elemente active: {{count}}',\n panelArchived_one: 'Elemente arhivate: {{count}}',\n panelArchived_other: 'Elemente arhivate: {{count}}',\n panelNotCaptured_one: 'Elemente neafișate la completare: {{count}}',\n panelNotCaptured_other: 'Elemente neafișate la completare: {{count}}',\n locked: 'Blocat',\n lockedHint:\n 'Folosit la calculul IMC. Îl puteți redenumi sau reordona, dar nu îl puteți elimina',\n archived: 'Arhivat',\n rowActions: 'Acțiuni pentru {{name}}',\n reorderHandle:\n 'Reordonează {{name}}. Apăsați Alt + Săgeată sus sau Alt + Săgeată jos pentru a muta.',\n reorderAnnounce: 'S-a mutat {{name}} la poziția {{to}} din {{total}}',\n edit: 'Editează {{name}}',\n archive: 'Arhivează {{name}}',\n restore: 'Restabilește {{name}}',\n addQuestion: 'Adaugă întrebare',\n addSection: 'Adaugă secțiune',\n addParameter: 'Adaugă parametru',\n addCode: 'Adaugă cod',\n sectionEmptyCapture:\n 'Nicio întrebare activă. Această secțiune nu este afișată la completare.',\n familyHeading:\n 'Familie cu subcoduri: titlu care nu poate fi atribuit direct',\n subCodeOf: 'Subcod al {{code}}',\n direction: {\n down: 'O valoare mai mică este mai bună',\n up: 'O valoare mai mare este mai bună',\n toRange: 'O valoare în interval este mai bună',\n },\n type: {\n text: 'Răspuns scurt',\n textarea: 'Răspuns lung',\n numberInteger: 'Număr întreg',\n numberDecimal: 'Număr zecimal',\n yesNoDetail: 'Da / nu',\n choice: 'Alegere unică',\n choiceWithText: 'Alegere unică cu text',\n multiChoice: 'Alegere multiplă',\n frequency: 'Frecvență săptămânală',\n meal: 'Masă',\n },\n typeLine: 'Tip de răspuns: {{type}}.',\n requiredBadge: 'Obligatoriu',\n requiredField: 'Răspuns obligatoriu',\n optionsCurrent: 'Opțiuni: {{list}}.',\n editTitle: 'Editează {{name}}',\n keyLine:\n 'Identificator: {{key}}. Stabilit la creare, nu se modifică niciodată.',\n codeLine: 'Cod: {{code}}. Stabilit la creare, nu se modifică niciodată.',\n labelField: 'Etichetă',\n labelFieldHelp: 'Lăsați gol pentru a folosi formularea standard.',\n helpField: 'Text de ajutor',\n addNote:\n 'Un element introdus liber aparține doar acestui cabinet; nu este adăugat unei liste comune de termeni.',\n addParameterTitle: 'Adaugă un parametru',\n addQuestionTitle: 'Adaugă o întrebare la {{section}}',\n addSectionTitle: 'Adaugă o secțiune',\n addCodeTitle: 'Adaugă un cod de patologie',\n codeField: 'Cod',\n groupField: 'Grup',\n directionField: 'Criteriu de îmbunătățire',\n unitField: 'Unitate',\n precisionField: 'Zecimale',\n rangeMinField: 'Valoare minimă de referință',\n rangeMaxField: 'Valoare maximă de referință',\n typeField: 'Tip de răspuns',\n optionsField: 'Opțiuni',\n optionsFieldHelp: 'Separate prin virgulă; cel puțin una.',\n parentField: 'Familie părinte',\n parentFieldHelp:\n 'Adăugarea unui subcod transformă familia într-un titlu care nu mai poate fi atribuit direct.',\n sectionNeedsQuestion:\n 'O secțiune nouă apare în chestionar când conține cel puțin o întrebare activă.',\n selectPlaceholder: 'Alegeți…',\n save: 'Salvează',\n cancel: 'Anulează',\n add: 'Adaugă',\n panelTracked_few: 'Parametri urmăriți ca obiective: {{count}}',\n panelLive_few: 'Elemente active: {{count}}',\n panelArchived_few: 'Elemente arhivate: {{count}}',\n panelNotCaptured_few: 'Elemente neafișate la completare: {{count}}',\n },\n targets: {\n title: 'Obiective nutriționale',\n tileLabel: 'Obiectiv pentru {{name}}',\n now: 'Acum {{value}}',\n nowBanded: 'Acum {{value}} · {{band}}',\n nowUnset: 'Încă nu s-a măsurat',\n unset: 'Niciun obiectiv',\n status: {\n onTarget: 'Obiectiv atins',\n approaching: 'Aproape de obiectiv',\n offTarget: 'În afara obiectivului',\n },\n edit: 'Editează obiectivul: {{parameter}}',\n editTitle: 'Obiectiv: {{parameter}}',\n editField: 'Obiectiv nou',\n bounds: 'În intervalul {{range}}',\n outOfBounds: 'Introduceți un obiectiv în intervalul {{range}}.',\n unsaved: 'Încă nesalvat',\n save: 'Salvează obiectivul',\n clear: 'Șterge obiectivul',\n },\n summary: {\n fullQuestionnaire: 'Chestionarul complet',\n noAnswers: 'Încă nu au fost înregistrate răspunsuri.',\n jump: 'Răspundeți la {{field}} în fila Completare',\n },\n compare: {\n visitsLabel: 'Consultații comparate',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: 'Consultații comparate: {{total}} · {{from}} – {{to}}',\n minimum: 'Trebuie să rămână cel puțin două consultații în comparație',\n stop: 'Oprește comparația',\n panelTitle: 'Compară consultațiile',\n sameVisit:\n 'Alegeți două sau mai multe consultații diferite pentru a vedea ce s-a schimbat.',\n summaryTitle: 'Modificări de la {{from}} la {{to}}',\n tableLabel: 'Ce s-a schimbat între consultațiile comparate',\n noChanges: 'Nu există modificări între aceste consultații.',\n noChangesDescription:\n 'La fiecare au fost înregistrate aceleași măsurători, coduri, tratamente și note.',\n present: 'Prezent',\n added: 'Adăugat',\n removed: 'Eliminat',\n changed: 'Modificat',\n notMeasured: 'Nemăsurat',\n category: {\n measurement: 'Măsurători',\n pathology: 'Patologii',\n therapy: 'Tratament',\n note: 'Note',\n },\n column: {\n item: 'Element',\n change: 'Modificare',\n },\n },\n event: {\n barLabel: 'Evenimente',\n chip: '{{label}} · {{date}}',\n separator: ', ',\n shown: 'Linii de eveniment afișate: {{list}}',\n noneShown: 'Nu sunt afișate linii de eveniment.',\n external: '{{category}} · înregistrat de {{source}}',\n category: {\n therapy: 'Tratament',\n diet: 'Dietă',\n fmd: 'Program de dietă care imită postul',\n surgery: 'Intervenție chirurgicală',\n lifestyle: 'Viață cotidiană',\n },\n label: {\n dietStart: 'Începutul planului mediteraneean',\n fmdCycle: 'Ciclu de dietă care imită postul',\n gymStart: 'Începerea antrenamentelor la sală',\n chemoStart: 'Începerea chimioterapiei',\n surgery: 'Intervenție chirurgicală la vezica biliară',\n },\n source: {\n oncology: 'un oncolog din afara acestui cabinet',\n },\n },\n grid: {\n parameter: 'Parametru',\n caption:\n 'Valorile parametrilor la fiecare consultație, începând cu cea mai veche.',\n captionInModule:\n 'Valorile parametrilor la consultațiile din {{module}}, începând cu cea mai veche.',\n target: 'Obiectiv {{value}} {{unit}}',\n trendLabel: 'Evoluția parametrului {{parameter}}',\n trend: 'Evoluție',\n editable: 'Editabil',\n editCell: '{{parameter}}: ultima consultație',\n baselineMerged: 'Reunite din consultațiile inițiale: {{total}}',\n unlabelledSource: 'Altele',\n blockVisits_one: '{{count}} consultație',\n blockVisits_other: '{{count}} de consultații',\n blockVisits_few: '{{count}} consultații',\n },\n readOnly: {\n subtitle: 'Fișa planului de tratament: doar citire.',\n summary: 'Rezumatul pacientului',\n none: 'Nimic înregistrat.',\n perWeek: 'Frecvență săptămânală: {{times}}',\n },\n pathology: {\n E66: 'Obezitate',\n E66_0: 'Obezitate datorată excesului caloric',\n E66_9: 'Obezitate nespecificată',\n E11: 'Diabet zaharat de tip 2',\n E11_9: 'Diabet de tip 2 fără complicații',\n E11_6: 'Diabet de tip 2 cu alte complicații specificate',\n E78: 'Tulburări ale metabolismului lipoproteinelor',\n I10: 'Hipertensiune arterială esențială',\n E03: 'Hipotiroidism',\n K58: 'Sindrom de intestin iritabil',\n D50: 'Anemie feriprivă',\n E55: 'Deficit de vitamina D',\n groupGeneral: 'General',\n },\n param: {\n weight: 'Greutate',\n height: 'Înălțime',\n bmi: 'IMC',\n waist: 'Talie',\n hips: 'Șolduri',\n arm: 'Braț',\n phaseAngle: 'Unghi de fază',\n energy: 'Aport energetic zilnic',\n protein: 'Proteine',\n fastingGlucose: 'Glicemie à jeun',\n hba1c: 'HbA1c',\n totalCholesterol: 'Colesterol total',\n ldl: 'Colesterol LDL',\n hdl: 'Colesterol HDL',\n triglycerides: 'Trigliceride',\n haemoglobin: 'Hemoglobină',\n vitaminD: 'Vitamina D (25-OH)',\n tsh: 'TSH',\n ferritin: 'Feritină',\n crp: 'Proteină C reactivă',\n creatinine: 'Creatinină',\n },\n field: {\n highlighted: 'Evidențiat',\n reasonForVisit: {\n label: 'Motivul consultației și obiective',\n },\n knownConditions: {\n label: 'Afecțiuni cunoscute',\n },\n dailyMedications: {\n label: 'Medicamente administrate zilnic',\n },\n currentSupplements: {\n label: 'Suplimente utilizate în prezent',\n },\n familyParents: {\n label: 'Părinți',\n },\n familySiblings: {\n label: 'Frați și surori',\n },\n familyGrandparents: {\n label: 'Bunici',\n },\n bloating: {\n label: 'Balonare abdominală',\n },\n refluxGastritis: {\n label: 'Reflux sau gastrită',\n },\n tiredness: {\n label: 'Oboseală',\n },\n sleepQuality: {\n label: 'Calitatea somnului',\n option: {\n good: 'Bună',\n fair: 'Acceptabilă',\n poor: 'Slabă',\n },\n },\n sleepDifficulty: {\n label: 'Dificultate de adormire sau treziri nocturne',\n },\n bowelHabits: {\n label: 'Tranzit intestinal',\n option: {\n regular: 'Regulat',\n constipated: 'Constipație',\n diarrhoeal: 'Diaree',\n alternating: 'Alternant',\n },\n },\n stoolCharacteristics: {\n label: 'Caracteristicile scaunului',\n },\n haemorrhoids: {\n label: 'Hemoroizi',\n },\n diverticula: {\n label: 'Diverticuli',\n },\n regularUrination: {\n label: 'Urinare regulată',\n },\n menstrualCycle: {\n label: 'Ciclu menstrual',\n option: {\n regular: 'Regulat',\n irregular: 'Neregulat',\n absent: 'Absent',\n },\n },\n foodAllergies: {\n label: 'Alergii alimentare',\n },\n drugAllergies: {\n label: 'Alergii la medicamente',\n },\n otherAllergies: {\n label: 'Alte alergii',\n },\n foodIntolerances: {\n label: 'Intoleranțe alimentare',\n },\n smoking: {\n label: 'Fumat',\n option: {\n never: 'Niciodată',\n former: 'În trecut',\n current: 'În prezent',\n },\n },\n pastSurgery: {\n label: 'Intervenții chirurgicale anterioare',\n },\n pregnancies: {\n label: 'Sarcini',\n },\n weightSelf: {\n label: 'Greutate (kg)',\n },\n heightSelf: {\n label: 'Înălțime (cm)',\n },\n physicalActivity: {\n label: 'Activitate fizică actuală',\n },\n lifestyle: {\n label: 'Stil de viață actual',\n },\n waterPerDay: {\n label: 'Apă (litri pe zi)',\n },\n fizzyDrinks: {\n label: 'Băuturi carbogazoase',\n option: {\n never: 'Niciodată',\n occasionally: 'Ocazional',\n daily: 'Zilnic',\n },\n },\n alcohol: {\n label: 'Alcool',\n option: {\n never: 'Niciodată',\n occasionally: 'Ocazional',\n daily: 'Zilnic',\n },\n },\n coffeePerDay: {\n label: 'Cafea (cești pe zi)',\n },\n coffeeSugar: {\n label: 'Cafea cu zahăr?',\n option: {\n yes: 'Da',\n no: 'Nu',\n },\n },\n breakfast: {\n label: 'Mic dejun',\n },\n morningSnack: {\n label: 'Gustare de dimineață',\n },\n lunch: {\n label: 'Prânz',\n },\n afternoonSnack: {\n label: 'Gustare de după-amiază',\n },\n dinner: {\n label: 'Cină',\n },\n afterDinner: {\n label: 'După cină',\n },\n pulses: {\n label: 'Leguminoase (de câte ori pe săptămână)',\n },\n fish: {\n label: 'Pește (de câte ori pe săptămână)',\n detailLabel: 'Ce pește preferați?',\n },\n eggs: {\n label: 'Ouă (de câte ori pe săptămână)',\n },\n meatCuredMeat: {\n label: 'Carne și mezeluri (de câte ori pe săptămână)',\n detailLabel: 'Roșie sau albă?',\n },\n dairy: {\n label: 'Lactate (de câte ori pe săptămână)',\n detailLabel: 'Ce lactate preferați?',\n },\n visitType: {\n label: 'Tip de consultație',\n },\n practitioner: {\n label: 'Cadru medical',\n },\n tumourType: {\n label: 'Tip de tumoră',\n },\n stage: {\n label: 'Stadiu',\n },\n metastases: {\n label: 'Metastaze',\n },\n treatmentStatus: {\n label: 'Starea tratamentului',\n },\n medName: {\n label: 'Nume',\n },\n medDose: {\n label: 'Doză',\n },\n nutritionalProposal: {\n label: 'Recomandări nutriționale',\n },\n clinicalNotes: {\n label: 'Note clinice',\n },\n annualProposed: {\n label: 'Propus',\n },\n annualAccepted: {\n label: 'Acceptat',\n },\n annualDeclineReason: {\n label: 'Motivul refuzului',\n },\n },\n questionnaire: {\n noNumeric: {\n title: 'Încă nu există nimic de comparat',\n description:\n 'Evoluția compară răspunsurile numerice din chestionare. În setările formularului, atribuiți unei întrebări tipul numeric și o unitate, apoi completați-o de cel puțin două ori.',\n },\n overviewTab: 'Prezentare generală',\n },\n empty: {\n noVisits: {\n title: 'Încă nu există consultații',\n description:\n 'După înregistrarea primei consultații, valorile și evoluția vor apărea aici.',\n },\n noRecord: {\n title: 'Încă nu s-a înregistrat nimic',\n description:\n 'Această fișă nu conține consultații. Adăugați prima consultație pentru a începe înregistrarea informațiilor.',\n create: 'Începe primul chestionar',\n createSigned: 'Începe cu semnătură',\n },\n noQuestions: {\n title: 'Nu există întrebări la care să răspundeți',\n description:\n 'Acest chestionar nu conține întrebări active. Solicitați cabinetului să activeze întrebări.',\n },\n noParameters: {\n title: 'Nu sunt configurate măsurători',\n description:\n 'Acest cabinet nu are măsurători configurate, așa că încă nu există nimic de reprezentat grafic.',\n },\n },\n visitNote: {\n title: 'Notele consultației',\n trigger: 'Notele consultației: {{visitType}}, {{date}}',\n openInPanel:\n 'Deschide notele consultației ({{visitType}}, {{date}}) în vizualizarea notelor',\n },\n rail: {\n notes: 'Note și evenimente',\n empty: 'Această fișă nu conține note sau evenimente.',\n eventLabel: 'Eveniment',\n },\n window: {\n label: 'Consultații afișate',\n pickerTrigger: 'Consultații · {{shown}} din {{total}}',\n selectAll: 'Selectează tot',\n showing:\n 'Consultații afișate: {{shown}} din {{total}} · {{from}} – {{to}}',\n showingAll: 'Toate consultațiile: {{total}} · {{from}} – {{to}}',\n minimum: 'Trebuie să rămână afișată cel puțin o consultație',\n optionHasNote: '{{label}} · notă',\n },\n digest: {\n group: {\n reason: 'Motivul prezentării',\n history: 'Afecțiuni și medicamente',\n flags: 'Simptome raportate',\n habits: 'Obiceiuri zilnice',\n },\n nothing: {\n title: 'Încă nu există nimic de rezumat',\n description:\n 'Răspunsurile înregistrate până acum nu fac parte din rezumat. Deschideți chestionarul complet de mai jos pentru a le citi.',\n },\n missing: {\n title_one: '{{count}} întrebare obligatorie încă fără răspuns',\n title_other: '{{count}} de întrebări obligatorii încă fără răspuns',\n list: 'Încă lipsesc: {{list}}',\n separator: ', ',\n jump: 'Mergi la {{field}}',\n title_few: '{{count}} întrebări obligatorii încă fără răspuns',\n },\n },\n export: {\n tab: {\n summary: 'Rezumat',\n compile: 'Completare',\n evolution: 'Evoluție',\n },\n docTab: {\n summary: 'Rezumatul chestionarului',\n compile: 'Fișa consultației',\n evolution: 'Evoluție',\n },\n docTitle: '{{tab}}: {{patient}}',\n info: 'Detaliile documentului',\n generated: 'Generat',\n audienceLabel: 'Copie pentru',\n audience: {\n clinician: 'Cabinet',\n patient: 'Pacient',\n external: 'Un profesionist extern',\n },\n visitsLabel: 'Consultații incluse',\n visitsSelected: '{{shown}} din {{total}}',\n visitsAll: 'Toate: {{total}}',\n withheld: 'Unele detalii clinice nu sunt incluse în această copie.',\n none: 'Nimic înregistrat.',\n listSeparator: ', ',\n flagged: '{{date}} ({{flag}})',\n source: {\n patient: 'Pacient',\n clinician: 'Clinician',\n },\n column: {\n question: 'Întrebare',\n answer: 'Răspuns',\n source: 'Sursă',\n field: 'Câmp',\n value: 'Valoare',\n unit: 'Unitate',\n referenceRange: 'Interval de referință',\n flag: 'Marcaj',\n target: 'Obiectiv',\n change: 'Modificare {{from}} → {{to}}',\n outOfRange: 'În afara intervalului',\n code: 'Cod',\n description: 'Descriere',\n name: 'Nume',\n dose: 'Doză',\n kind: 'Tip',\n cycle: 'Ciclu',\n startDate: 'Data începerii',\n status: 'Stare',\n notes: 'Note',\n note: 'Notă',\n text: 'Text',\n },\n control: {\n trigger: 'Exportă și partajează',\n triggerLabel: 'Exportă și partajează vizualizarea {{tab}}',\n triggerLabelAudience:\n 'Exportă și partajează vizualizarea {{tab}}, {{audience}}',\n audienceBadge: 'Copie pentru pacient',\n menuLabel: 'Vizualizarea {{tab}}',\n everyVisit: 'Include toate consultațiile, nu doar coloanele afișate',\n excludes: 'O copie pentru pacient exclude: {{list}}',\n excludesNone:\n 'O copie pentru pacient a acestei vizualizări nu exclude nimic.',\n holds: 'Copia cabinetului conține fișa completă, inclusiv {{list}}.',\n holdsNone:\n 'Această vizualizare nu conține nimic care ar fi exclus din copia pentru pacient.',\n share: 'Partajează…',\n pdf: 'Descarcă PDF',\n print: 'Tipărește',\n xlsx: 'Descarcă Excel (.xlsx)',\n csv: 'Descarcă CSV (.csv)',\n printFrame: 'Tipărește documentul (fără conținut vizibil)',\n printing: 'Se deschide fereastra de tipărire a documentului.',\n ready: 'Fișier pregătit: {{file}}.',\n failed: 'Acest browser nu a putut pregăti fișierul.',\n },\n share: {\n title: 'Partajează vizualizarea {{tab}}',\n mockBadge: 'Doar previzualizare',\n subtitle:\n 'Alegeți cui i-ar fi destinată copia și vedeți ce ar conține.',\n noticeTitle: 'Nu se trimite nimic de pe acest ecran',\n notice:\n 'Această previzualizare arată cum ar arăta o partajare, fără a trimite efectiv date. O partajare reală necesită un link semnat cu termen de expirare, consimțământul pacientului și o evidență a destinatarilor, a informațiilor primite și a canalelor utilizate. Toate acestea sunt gestionate în afara acestei fișe.',\n audienceLabel: 'Cui i-ar fi destinată această copie?',\n includes: 'Această copie ar conține',\n includesNone:\n 'Această vizualizare nu produce niciun document pentru acest destinatar.',\n excludes: 'Această copie ar exclude',\n excludesNone: 'Nu este exclus nimic din această copie.',\n cancel: 'Anulează',\n confirm: 'Confirmă destinatarul',\n confirmed: 'Destinatar setat la {{audience}}. Nu s-a trimis nimic.',\n },\n concept: {\n patient_identity: 'Identitatea pacientului',\n intake_answers: 'Răspunsurile la chestionar',\n visit_date: 'Datele consultațiilor',\n visit_type: 'Tip de consultație',\n visit_practitioner: 'Cadru medical',\n visit_reasonCode: 'Motivul codificat al consultației',\n anthropometrics_values: 'Măsurători antropometrice',\n dietary_intake: 'Aport alimentar',\n derived_bmi: 'IMC',\n lab_values: 'Valorile analizelor de sânge',\n pathology_codes: 'Coduri de diagnostic',\n oncological_history: 'Antecedente oncologice',\n therapy_entries: 'Tratament și suplimente',\n fmd_cycles: 'Cicluri de dietă care imită postul',\n annual_programme: 'Program anual',\n notes_clinicalNotes: 'Note clinice',\n notes_nutritionalProposal: 'Recomandări nutriționale',\n symptom_observations: 'Observațiile clinicianului',\n compare_diff: 'Comparația consultațiilor',\n visit_note: 'Notele consultației',\n event_timeline: 'Cronologia evenimentelor clinice',\n export_tabDocument: 'Documentul în sine',\n export_workbook: 'Registrul de calcul al întregii fișe',\n },\n },\n },\n} as const;\n","/** Anamnesis interface resources (ru). */\nexport default {\n anamnesis: {\n mainLabel: 'Карта анамнеза: {{mode}}',\n mode: {\n intake: 'Первичный сбор данных',\n compile: 'Заполнение',\n questionnaire: 'Анкета',\n readOnly: 'Только чтение',\n },\n common: {\n yes: 'Да',\n no: 'Нет',\n unknown: 'Неизвестно',\n notSure: 'Затрудняюсь ответить',\n choose: 'Выберите…',\n details: 'Подробности',\n detailsPending: 'Появляется при ответе «Да»',\n time: 'Время',\n whatEaten: 'Что вы ели?',\n },\n header: {\n name: 'Имя',\n age: 'Возраст',\n dob: 'Дата рождения',\n visitDate: 'Дата визита',\n years: 'Возраст (лет): {{age}}',\n },\n origin: {\n fromPatient: 'Со слов пациента',\n },\n delta: {\n improved: 'Улучшение',\n worsened: 'Ухудшение',\n unchanged: 'Без изменений',\n aria: '{{valence}}: {{change}}',\n },\n range: {\n aboveRange: 'Выше диапазона',\n belowRange: 'Ниже диапазона',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: 'Антропометрия',\n dietary: 'Потребление пищи',\n lab: 'Анализы крови',\n },\n visitType: {\n first: 'Первый визит',\n followUp: 'Контрольный визит',\n },\n medKind: {\n medication: 'Лекарственный препарат',\n supplement: 'Пищевая добавка',\n },\n section: {\n reason: 'Причина визита',\n pharmacological: 'Лекарственный анамнез',\n familyHistory: 'Семейный анамнез',\n symptoms: 'Симптомы',\n otherHistory: 'Прочие сведения анамнеза',\n dietaryHistory: 'Пищевой анамнез',\n recall24h: 'Питание за последние 24 часа',\n foodFrequency: 'Частота употребления продуктов за неделю',\n visitMeta: 'Сведения о визите',\n patientIntake: 'Первичная анкета пациента',\n intakeGaps: 'Вопросы без ответа',\n anthropometrics: 'Антропометрия',\n dietary: 'Потребление пищи',\n pathologies: 'Заболевания',\n oncological: 'Онкологический анамнез',\n therapy: 'Лечение и пищевые добавки',\n labs: 'Анализы крови',\n fmd: 'Программа имитации голодания',\n proposal: 'Предложения по питанию и примечания',\n annual: 'Годовая программа',\n evolution: 'Динамика',\n },\n intake: {\n title: 'Анкета перед визитом',\n subtitle: 'Заполните эту анкету перед первым визитом.',\n sectionsLabel: 'Разделы анкеты',\n answered: 'Ответов на вопросы: {{answered}} из {{total}}',\n sectionProgress: 'Ответов: {{answered}} из {{total}}',\n submit: 'Сохранить',\n unsentNotice: 'Ваши ответы сохранятся после отправки анкеты.',\n submittedNotice: 'Ответы сохранены.',\n },\n compile: {\n tabSummary: 'Сводка',\n tabCompile: 'Заполнить',\n tabEvolution: 'Динамика',\n viewsLabel: 'Представления карты',\n visitCount: 'Визитов: {{visits}}',\n bmiInStrip:\n 'ИМТ рассчитывается по весу и росту. Его значение показано в сводке вверху карты.',\n gapsIntro:\n 'Эти обязательные вопросы остались без ответа. Запишите ответы вместе с пациентом.',\n noIntake: 'Пациент не отправил анкету.',\n pathologiesLabel: 'Указанные заболевания',\n pathologiesHelp:\n 'Выберите все подходящие коды. У пациента может быть несколько кодов одновременно.',\n pathologiesPlaceholder: 'Поиск кодов…',\n noTherapy: 'Лечение и пищевые добавки не указаны.',\n addTherapy: 'Добавить препарат',\n removeTherapy: 'Удалить {{name}}',\n noFmd: 'Циклы имитации голодания не записаны.',\n cycleNumber: 'Цикл {{number}}',\n cycleCompleted: 'Завершён',\n cycleInProgress: 'В процессе',\n blockEmpty: 'Ничего не записано',\n blockFilled_one: 'Записано: {{count}}',\n blockFilled_other: 'Записано: {{count}}',\n blockFlagged_one: 'Вне диапазона: {{count}}',\n blockFlagged_other: 'Вне диапазона: {{count}}',\n blockOutstanding_one: 'Осталось ответить: {{count}}',\n blockOutstanding_other: 'Осталось ответить: {{count}}',\n blockSettled: 'На все вопросы даны ответы',\n addFollowUpVisit: 'Добавить контрольный визит',\n blockFilled_few: 'Записано: {{count}}',\n blockFilled_many: 'Записано: {{count}}',\n blockFlagged_few: 'Вне диапазона: {{count}}',\n blockFlagged_many: 'Вне диапазона: {{count}}',\n blockOutstanding_few: 'Осталось ответить: {{count}}',\n blockOutstanding_many: 'Осталось ответить: {{count}}',\n },\n configEditor: {\n title: 'Настройка анамнеза',\n intro:\n 'Справочники клиники: переименовывайте, меняйте порядок, архивируйте или добавляйте записи. Архивирование ничего не удаляет: ранее записанные ответы остаются в истории.',\n tabsLabel: 'Настраиваемые справочники',\n tabQuestionnaire: 'Анкета',\n tabParameters: 'Параметры',\n tabPathologies: 'Заболевания',\n tabTargets: 'Цели',\n targetsIntro:\n 'Выберите параметры, которые клиника отслеживает как цели. Они появятся в карточках целей над картой пациента, где можно задать целевое значение для каждого пациента и сравнить его с текущим.',\n panelTracked_one: 'Отслеживается как цель: {{count}}',\n panelTracked_other: 'Отслеживается как цель: {{count}}',\n panelLive_one: 'Активных: {{count}}',\n panelLive_other: 'Активных: {{count}}',\n panelArchived_one: 'В архиве: {{count}}',\n panelArchived_other: 'В архиве: {{count}}',\n panelNotCaptured_one: 'Не отображается при заполнении: {{count}}',\n panelNotCaptured_other: 'Не отображается при заполнении: {{count}}',\n locked: 'Заблокировано',\n lockedHint:\n 'Используется для расчёта ИМТ. Можно переименовать или изменить порядок, но нельзя удалить.',\n archived: 'В архиве',\n rowActions: 'Действия для {{name}}',\n reorderHandle:\n 'Изменить положение {{name}}. Нажмите Alt + Вверх или Alt + Вниз для перемещения.',\n reorderAnnounce: 'Положение {{name}} изменено: {{to}} из {{total}}',\n edit: 'Изменить {{name}}',\n archive: 'Архивировать {{name}}',\n restore: 'Восстановить {{name}}',\n addQuestion: 'Добавить вопрос',\n addSection: 'Добавить раздел',\n addParameter: 'Добавить параметр',\n addCode: 'Добавить код',\n sectionEmptyCapture:\n 'Нет активных вопросов. Этот раздел не отображается при заполнении.',\n familyHeading:\n 'Группа с подкодами: заголовок, который нельзя назначить пациенту',\n subCodeOf: 'Подкод для {{code}}',\n direction: {\n down: 'Чем ниже, тем лучше',\n up: 'Чем выше, тем лучше',\n toRange: 'Лучше в пределах диапазона',\n },\n type: {\n text: 'Краткий ответ',\n textarea: 'Развёрнутый ответ',\n numberInteger: 'Число (целое)',\n numberDecimal: 'Число (дробное)',\n yesNoDetail: 'Да / нет',\n choice: 'Один вариант',\n choiceWithText: 'Один вариант с текстом',\n multiChoice: 'Несколько вариантов',\n frequency: 'Частота за неделю',\n meal: 'Приём пищи',\n },\n typeLine: 'Тип ответа: {{type}}.',\n requiredBadge: 'Обязательно',\n requiredField: 'Ответ обязателен',\n optionsCurrent: 'Варианты: {{list}}.',\n editTitle: 'Изменить {{name}}',\n keyLine: 'Идентификатор: {{key}}. Задаётся при создании и не меняется.',\n codeLine: 'Код: {{code}}. Задаётся при создании и не меняется.',\n labelField: 'Название',\n labelFieldHelp:\n 'Оставьте пустым, чтобы использовать стандартную формулировку.',\n helpField: 'Текст подсказки',\n addNote:\n 'Произвольная запись доступна только этой клинике и не добавляется в общие справочники.',\n addParameterTitle: 'Добавить параметр',\n addQuestionTitle: 'Добавить вопрос в раздел {{section}}',\n addSectionTitle: 'Добавить раздел',\n addCodeTitle: 'Добавить код заболевания',\n codeField: 'Код',\n groupField: 'Группа',\n directionField: 'Что считается улучшением',\n unitField: 'Единица измерения',\n precisionField: 'Знаков после запятой',\n rangeMinField: 'Нижняя граница референсного диапазона',\n rangeMaxField: 'Верхняя граница референсного диапазона',\n typeField: 'Тип ответа',\n optionsField: 'Варианты ответа',\n optionsFieldHelp:\n 'Введите хотя бы один вариант. Разделяйте варианты запятыми.',\n parentField: 'Родительская группа',\n parentFieldHelp:\n 'При добавлении подкода его группа становится заголовком, который больше нельзя назначить пациенту напрямую.',\n sectionNeedsQuestion:\n 'Новый раздел появится в анкете, когда в нём будет хотя бы один активный вопрос.',\n selectPlaceholder: 'Выберите…',\n save: 'Сохранить',\n cancel: 'Отмена',\n add: 'Добавить',\n panelTracked_few: 'Отслеживается как цель: {{count}}',\n panelTracked_many: 'Отслеживается как цель: {{count}}',\n panelLive_few: 'Активных: {{count}}',\n panelLive_many: 'Активных: {{count}}',\n panelArchived_few: 'В архиве: {{count}}',\n panelArchived_many: 'В архиве: {{count}}',\n panelNotCaptured_few: 'Не отображается при заполнении: {{count}}',\n panelNotCaptured_many: 'Не отображается при заполнении: {{count}}',\n },\n targets: {\n title: 'Цели питания',\n tileLabel: 'Цель: {{name}}',\n now: 'Сейчас: {{value}}',\n nowBanded: 'Сейчас: {{value}} · {{band}}',\n nowUnset: 'Ещё не измерено',\n unset: 'Цель не задана',\n status: {\n onTarget: 'Цель достигнута',\n approaching: 'Приближение к цели',\n offTarget: 'Цель не достигнута',\n },\n edit: 'Изменить цель: {{parameter}}',\n editTitle: 'Цель: {{parameter}}',\n editField: 'Новое целевое значение',\n bounds: 'В пределах {{range}}',\n outOfBounds: 'Введите целевое значение в пределах {{range}}.',\n unsaved: 'Ещё не сохранено',\n save: 'Сохранить цель',\n clear: 'Удалить цель',\n },\n summary: {\n fullQuestionnaire: 'Полная анкета',\n noAnswers: 'Ответы ещё не записаны.',\n jump: 'Ответить на вопрос «{{field}}» на вкладке «Заполнить»',\n },\n compare: {\n visitsLabel: 'Сравниваемые визиты',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: 'Сравниваемых визитов: {{total}} · {{from}} – {{to}}',\n minimum: 'Для сравнения должны остаться как минимум два визита',\n stop: 'Завершить сравнение',\n panelTitle: 'Сравнить визиты',\n sameVisit:\n 'Выберите два или более разных визита, чтобы увидеть изменения.',\n summaryTitle: 'Изменения с {{from}} по {{to}}',\n tableLabel: 'Изменения между сравниваемыми визитами',\n noChanges: 'Между этими визитами изменений нет.',\n noChangesDescription:\n 'На каждом из них записаны одинаковые измерения, коды, лечение и примечания.',\n present: 'Присутствует',\n added: 'Добавлено',\n removed: 'Удалено',\n changed: 'Изменено',\n notMeasured: 'Не измерено',\n category: {\n measurement: 'Измерения',\n pathology: 'Заболевания',\n therapy: 'Лечение',\n note: 'Примечания',\n },\n column: {\n item: 'Показатель',\n change: 'Изменение',\n },\n },\n event: {\n barLabel: 'События',\n chip: '{{label}} · {{date}}',\n separator: ', ',\n shown: 'Показаны линии событий: {{list}}',\n noneShown: 'Линии событий не показаны.',\n external: '{{category}} · источник записи: {{source}}',\n category: {\n therapy: 'Лечение',\n diet: 'Питание',\n fmd: 'Программа имитации голодания',\n surgery: 'Операция',\n lifestyle: 'Повседневная жизнь',\n },\n label: {\n dietStart: 'Начало средиземноморского плана питания',\n fmdCycle: 'Цикл имитации голодания',\n gymStart: 'Начало занятий в спортзале',\n chemoStart: 'Начало химиотерапии',\n surgery: 'Операция на желчном пузыре',\n },\n source: {\n oncology: 'онколог из другой клиники',\n },\n },\n grid: {\n parameter: 'Параметр',\n caption: 'Значения параметров по визитам, начиная с самого раннего.',\n captionInModule:\n 'Значения параметров по визитам в модуле {{module}}, начиная с самого раннего.',\n target: 'Цель: {{value}} {{unit}}',\n trendLabel: 'Динамика параметра {{parameter}}',\n trend: 'Динамика',\n editable: 'Можно редактировать',\n editCell: '{{parameter}}: последний визит',\n baselineMerged: 'Объединено из первых визитов: {{total}}',\n unlabelledSource: 'Другое',\n blockVisits_one: '{{count}} визит',\n blockVisits_other: '{{count}} визита',\n blockVisits_few: '{{count}} визита',\n blockVisits_many: '{{count}} визитов',\n },\n readOnly: {\n subtitle: 'Карта плана лечения, только чтение.',\n summary: 'Сводка по пациенту',\n none: 'Ничего не записано.',\n perWeek: 'Частота за неделю: {{times}}',\n },\n pathology: {\n E66: 'Ожирение',\n E66_0: 'Ожирение вследствие избыточного поступления калорий',\n E66_9: 'Ожирение неуточнённое',\n E11: 'Сахарный диабет 2-го типа',\n E11_9: 'Сахарный диабет 2-го типа без осложнений',\n E11_6: 'Сахарный диабет 2-го типа с другими уточнёнными осложнениями',\n E78: 'Нарушения обмена липопротеинов',\n I10: 'Эссенциальная гипертензия',\n E03: 'Гипотиреоз',\n K58: 'Синдром раздражённого кишечника',\n D50: 'Железодефицитная анемия',\n E55: 'Недостаточность витамина D',\n groupGeneral: 'Общее',\n },\n param: {\n weight: 'Вес',\n height: 'Рост',\n bmi: 'ИМТ',\n waist: 'Обхват талии',\n hips: 'Обхват бёдер',\n arm: 'Обхват плеча',\n phaseAngle: 'Фазовый угол',\n energy: 'Суточная калорийность',\n protein: 'Белок',\n fastingGlucose: 'Глюкоза натощак',\n hba1c: 'HbA1c',\n totalCholesterol: 'Общий холестерин',\n ldl: 'Холестерин ЛПНП',\n hdl: 'Холестерин ЛПВП',\n triglycerides: 'Триглицериды',\n haemoglobin: 'Гемоглобин',\n vitaminD: 'Витамин D (25-OH)',\n tsh: 'ТТГ',\n ferritin: 'Ферритин',\n crp: 'С-реактивный белок',\n creatinine: 'Креатинин',\n },\n field: {\n highlighted: 'Отмечено',\n reasonForVisit: {\n label: 'Причина визита и цели',\n },\n knownConditions: {\n label: 'Известные заболевания',\n },\n dailyMedications: {\n label: 'Ежедневно принимаемые препараты',\n },\n currentSupplements: {\n label: 'Принимаемые пищевые добавки',\n },\n familyParents: {\n label: 'Родители',\n },\n familySiblings: {\n label: 'Братья и сёстры',\n },\n familyGrandparents: {\n label: 'Бабушки и дедушки',\n },\n bloating: {\n label: 'Вздутие живота',\n },\n refluxGastritis: {\n label: 'Рефлюкс или гастрит',\n },\n tiredness: {\n label: 'Утомляемость',\n },\n sleepQuality: {\n label: 'Качество сна',\n option: {\n good: 'Хорошее',\n fair: 'Удовлетворительное',\n poor: 'Плохое',\n },\n },\n sleepDifficulty: {\n label: 'Трудности с засыпанием или ночные пробуждения',\n },\n bowelHabits: {\n label: 'Характер стула',\n option: {\n regular: 'Регулярный',\n constipated: 'Запор',\n diarrhoeal: 'Диарея',\n alternating: 'Чередование запора и диареи',\n },\n },\n stoolCharacteristics: {\n label: 'Характеристики кала',\n },\n haemorrhoids: {\n label: 'Геморрой',\n },\n diverticula: {\n label: 'Дивертикулы',\n },\n regularUrination: {\n label: 'Регулярное мочеиспускание',\n },\n menstrualCycle: {\n label: 'Менструальный цикл',\n option: {\n regular: 'Регулярный',\n irregular: 'Нерегулярный',\n absent: 'Отсутствует',\n },\n },\n foodAllergies: {\n label: 'Пищевая аллергия',\n },\n drugAllergies: {\n label: 'Аллергия на лекарства',\n },\n otherAllergies: {\n label: 'Другие виды аллергии',\n },\n foodIntolerances: {\n label: 'Пищевая непереносимость',\n },\n smoking: {\n label: 'Курение',\n option: {\n never: 'Никогда',\n former: 'В прошлом',\n current: 'В настоящее время',\n },\n },\n pastSurgery: {\n label: 'Перенесённые операции',\n },\n pregnancies: {\n label: 'Беременности',\n },\n weightSelf: {\n label: 'Вес (кг)',\n },\n heightSelf: {\n label: 'Рост (см)',\n },\n physicalActivity: {\n label: 'Текущая физическая активность',\n },\n lifestyle: {\n label: 'Текущий образ жизни',\n },\n waterPerDay: {\n label: 'Вода (литров в день)',\n },\n fizzyDrinks: {\n label: 'Газированные напитки',\n option: {\n never: 'Никогда',\n occasionally: 'Иногда',\n daily: 'Ежедневно',\n },\n },\n alcohol: {\n label: 'Алкоголь',\n option: {\n never: 'Никогда',\n occasionally: 'Иногда',\n daily: 'Ежедневно',\n },\n },\n coffeePerDay: {\n label: 'Кофе (чашек в день)',\n },\n coffeeSugar: {\n label: 'Кофе с сахаром?',\n option: {\n yes: 'Да',\n no: 'Нет',\n },\n },\n breakfast: {\n label: 'Завтрак',\n },\n morningSnack: {\n label: 'Утренний перекус',\n },\n lunch: {\n label: 'Обед',\n },\n afternoonSnack: {\n label: 'Дневной перекус',\n },\n dinner: {\n label: 'Ужин',\n },\n afterDinner: {\n label: 'После ужина',\n },\n pulses: {\n label: 'Бобовые (раз в неделю)',\n },\n fish: {\n label: 'Рыба (раз в неделю)',\n detailLabel: 'Какую рыбу вы предпочитаете?',\n },\n eggs: {\n label: 'Яйца (раз в неделю)',\n },\n meatCuredMeat: {\n label: 'Мясо и мясные деликатесы (раз в неделю)',\n detailLabel: 'Красное или белое мясо?',\n },\n dairy: {\n label: 'Молочные продукты (раз в неделю)',\n detailLabel: 'Какие молочные продукты вы предпочитаете?',\n },\n visitType: {\n label: 'Тип визита',\n },\n practitioner: {\n label: 'Специалист',\n },\n tumourType: {\n label: 'Тип опухоли',\n },\n stage: {\n label: 'Стадия',\n },\n metastases: {\n label: 'Метастазы',\n },\n treatmentStatus: {\n label: 'Статус лечения',\n },\n medName: {\n label: 'Название',\n },\n medDose: {\n label: 'Доза',\n },\n nutritionalProposal: {\n label: 'Предложения по питанию',\n },\n clinicalNotes: {\n label: 'Клинические записи',\n },\n annualProposed: {\n label: 'Предложено',\n },\n annualAccepted: {\n label: 'Принято',\n },\n annualDeclineReason: {\n label: 'Причина отказа',\n },\n },\n questionnaire: {\n noNumeric: {\n title: 'Пока нечего сравнивать',\n description:\n 'Динамика показывает сравнение числовых ответов в разных анкетах. В настройках формы задайте вопросу числовой тип и единицу измерения, затем ответьте на него хотя бы дважды.',\n },\n overviewTab: 'Обзор',\n },\n empty: {\n noVisits: {\n title: 'Визитов пока нет',\n description:\n 'После записи первого визита здесь появятся значения и их динамика.',\n },\n noRecord: {\n title: 'Данные ещё не записаны',\n description:\n 'В этой карте нет визитов. Добавьте первый визит, чтобы начать запись данных.',\n create: 'Начать первую анкету',\n createSigned: 'Начать с подписанием',\n },\n noQuestions: {\n title: 'Нет вопросов для заполнения',\n description:\n 'В этой анкете нет активных вопросов. Попросите клинику включить их.',\n },\n noParameters: {\n title: 'Измерения не настроены',\n description:\n 'В этой клинике не настроены измерения, поэтому на графике пока нечего показывать.',\n },\n },\n visitNote: {\n title: 'Заметки о визите',\n trigger: 'Заметки о визите: {{visitType}}, {{date}}',\n openInPanel:\n 'Открыть заметки о визите {{visitType}}, {{date}} в разделе заметок',\n },\n rail: {\n notes: 'Заметки и события',\n empty: 'В этой карте нет заметок и событий.',\n eventLabel: 'Событие',\n },\n window: {\n label: 'Отображаемые визиты',\n pickerTrigger: 'Визиты: {{shown}} из {{total}}',\n selectAll: 'Выбрать все',\n showing: 'Показано визитов: {{shown}} из {{total}} · {{from}} – {{to}}',\n showingAll: 'Все визиты: {{total}} · {{from}} – {{to}}',\n minimum: 'Должен остаться хотя бы один отображаемый визит',\n optionHasNote: '{{label}} · заметка',\n },\n digest: {\n group: {\n reason: 'Причина обращения',\n history: 'Заболевания и лекарства',\n flags: 'Указанные симптомы',\n habits: 'Повседневные привычки',\n },\n nothing: {\n title: 'Пока нет данных для сводки',\n description:\n 'Уже записанные ответы не входят в сводку. Откройте полную анкету ниже, чтобы прочитать их.',\n },\n missing: {\n title_one: 'Без ответа остаётся {{count}} обязательный вопрос',\n title_other: 'Без ответа остаётся {{count}} обязательного вопроса',\n list: 'Ещё не заполнено: {{list}}',\n separator: ', ',\n jump: 'Перейти к полю «{{field}}»',\n title_few: 'Без ответа остаются {{count}} обязательных вопроса',\n title_many: 'Без ответа остаётся {{count}} обязательных вопросов',\n },\n },\n export: {\n tab: {\n summary: 'Сводка',\n compile: 'Заполнить',\n evolution: 'Динамика',\n },\n docTab: {\n summary: 'Сводка анкеты',\n compile: 'Запись визита',\n evolution: 'Динамика',\n },\n docTitle: '{{tab}} — {{patient}}',\n info: 'Сведения о документе',\n generated: 'Создано',\n audienceLabel: 'Получатель копии',\n audience: {\n clinician: 'Клиника',\n patient: 'Пациент',\n external: 'Внешний специалист',\n },\n visitsLabel: 'Включённые визиты',\n visitsSelected: '{{shown}} из {{total}}',\n visitsAll: 'Все: {{total}}',\n withheld: 'Некоторые клинические сведения не включены в эту копию.',\n none: 'Ничего не записано.',\n listSeparator: ', ',\n flagged: '{{date}} ({{flag}})',\n source: {\n patient: 'Пациент',\n clinician: 'Медицинский специалист',\n },\n column: {\n question: 'Вопрос',\n answer: 'Ответ',\n source: 'Источник',\n field: 'Поле',\n value: 'Значение',\n unit: 'Единица измерения',\n referenceRange: 'Референсный диапазон',\n flag: 'Отметка',\n target: 'Цель',\n change: 'Изменение {{from}} → {{to}}',\n outOfRange: 'Вне диапазона',\n code: 'Код',\n description: 'Описание',\n name: 'Название',\n dose: 'Доза',\n kind: 'Тип',\n cycle: 'Цикл',\n startDate: 'Дата начала',\n status: 'Статус',\n notes: 'Примечания',\n note: 'Примечание',\n text: 'Текст',\n },\n control: {\n trigger: 'Экспорт и отправка',\n triggerLabel: 'Экспорт и отправка представления «{{tab}}»',\n triggerLabelAudience:\n 'Экспорт и отправка представления «{{tab}}», {{audience}}',\n audienceBadge: 'Копия для пациента',\n menuLabel: 'Представление «{{tab}}»',\n everyVisit: 'Включить все визиты, а не только показанные столбцы',\n excludes: 'В копию для пациента не входит: {{list}}',\n excludesNone:\n 'Копия этого представления для пациента включает все сведения.',\n holds: 'Копия для клиники содержит полную карту, включая {{list}}.',\n holdsNone:\n 'В этом представлении нет сведений, которые исключались бы из копии для пациента.',\n share: 'Поделиться…',\n pdf: 'Скачать PDF',\n print: 'Печать',\n xlsx: 'Скачать Excel (.xlsx)',\n csv: 'Скачать CSV (.csv)',\n printFrame: 'Документ для печати (нет видимого содержимого)',\n printing: 'Открывается диалог печати документа.',\n ready: 'Файл {{file}} готов.',\n failed: 'Браузеру не удалось подготовить файл.',\n },\n share: {\n title: 'Поделиться представлением «{{tab}}»',\n mockBadge: 'Только предпросмотр',\n subtitle:\n 'Выберите, кому предназначалась бы копия, и посмотрите, что в неё вошло бы.',\n noticeTitle: 'С этого экрана ничего не отправляется',\n notice:\n 'Этот предпросмотр показывает, как выглядела бы отправка, но ничего не отправляет. Для настоящей отправки нужны подписанная ссылка с ограниченным сроком действия, согласие пациента и запись о том, кто, что и по какому каналу получил. Всё это обеспечивается за пределами этой карты.',\n audienceLabel: 'Кому предназначалась бы эта копия?',\n includes: 'В эту копию вошло бы',\n includesNone:\n 'Это представление не создаёт документ для выбранного получателя.',\n excludes: 'Из этой копии было бы исключено',\n excludesNone: 'В эту копию включены все сведения.',\n cancel: 'Отмена',\n confirm: 'Подтвердить получателя',\n confirmed: 'Выбран получатель: {{audience}}. Ничего не отправлено.',\n },\n concept: {\n patient_identity: 'Идентификационные данные пациента',\n intake_answers: 'Ответы на анкету',\n visit_date: 'Даты визитов',\n visit_type: 'Тип визита',\n visit_practitioner: 'Специалист',\n visit_reasonCode: 'Кодированная причина визита',\n anthropometrics_values: 'Антропометрические измерения',\n dietary_intake: 'Потребление пищи',\n derived_bmi: 'ИМТ',\n lab_values: 'Показатели анализов крови',\n pathology_codes: 'Диагностические коды',\n oncological_history: 'Онкологический анамнез',\n therapy_entries: 'Лечение и пищевые добавки',\n fmd_cycles: 'Циклы имитации голодания',\n annual_programme: 'Годовая программа',\n notes_clinicalNotes: 'Клинические записи',\n notes_nutritionalProposal: 'Предложения по питанию',\n symptom_observations: 'Наблюдения медицинского специалиста',\n compare_diff: 'Сравнение визитов',\n visit_note: 'Заметки о визите',\n event_timeline: 'Хронология клинических событий',\n export_tabDocument: 'Сам документ',\n export_workbook: 'Рабочая книга со всей картой',\n },\n },\n },\n} as const;\n","/** Anamnesis interface resources (sq). */\nexport default {\n anamnesis: {\n mainLabel: 'Kartela e anamnezës: {{mode}}',\n mode: {\n intake: 'Anamneza fillestare',\n compile: 'Plotësimi',\n questionnaire: 'Pyetësor',\n readOnly: 'Vetëm për lexim',\n },\n common: {\n yes: 'Po',\n no: 'Jo',\n unknown: 'Nuk dihet',\n notSure: 'Nuk e di',\n choose: 'Zgjidhni…',\n details: 'Detaje',\n detailsPending: 'Shfaqet kur përgjigjja është “Po”',\n time: 'Ora',\n whatEaten: 'Çfarë keni ngrënë?',\n },\n header: {\n name: 'Emri',\n age: 'Mosha',\n dob: 'Datëlindja',\n visitDate: 'Data e vizitës',\n years: '{{age}} vjeç',\n },\n origin: {\n fromPatient: 'Nga pacienti',\n },\n delta: {\n improved: 'Përmirësim',\n worsened: 'Përkeqësim',\n unchanged: 'Pa ndryshim',\n aria: '{{valence}}: {{change}}',\n },\n range: {\n aboveRange: 'Mbi intervalin e referencës',\n belowRange: 'Nën intervalin e referencës',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: 'Antropometria',\n dietary: 'Konsumi ushqimor',\n lab: 'Analizat e gjakut',\n },\n visitType: {\n first: 'Vizita e parë',\n followUp: 'Vizitë kontrolli',\n },\n medKind: {\n medication: 'Medikament',\n supplement: 'Suplement',\n },\n section: {\n reason: 'Arsyeja e vizitës',\n pharmacological: 'Anamneza farmakologjike',\n familyHistory: 'Anamneza familjare',\n symptoms: 'Simptomat',\n otherHistory: 'Të dhëna të tjera anamnestike',\n dietaryHistory: 'Anamneza ushqimore',\n recall24h: 'Rikujtimi ushqimor 24-orësh',\n foodFrequency: 'Shpeshtësia javore e ushqimeve',\n visitMeta: 'Detajet e vizitës',\n patientIntake: 'Pyetësori i pacientit',\n intakeGaps: 'Pyetje pa përgjigje',\n anthropometrics: 'Antropometria',\n dietary: 'Konsumi ushqimor',\n pathologies: 'Patologjitë',\n oncological: 'Anamneza onkologjike',\n therapy: 'Terapia dhe suplementet',\n labs: 'Analizat e gjakut',\n fmd: 'Programi i dietës që imiton agjërimin',\n proposal: 'Propozimi nutricional dhe shënimet',\n annual: 'Programi vjetor',\n evolution: 'Ecuria',\n },\n intake: {\n title: 'Pyetësori para vizitës',\n subtitle: 'Ju lutemi plotësojeni para vizitës suaj të parë.',\n sectionsLabel: 'Seksionet e pyetësorit',\n answered: 'Pyetje të përgjigjura: {{answered}} nga {{total}}',\n sectionProgress: '{{answered}} nga {{total}} të përgjigjura',\n submit: 'Ruaj',\n unsentNotice: 'Përgjigjet tuaja regjistrohen kur dërgoni këtë pyetësor.',\n submittedNotice: 'Përgjigjet u ruajtën.',\n },\n compile: {\n tabSummary: 'Përmbledhja',\n tabCompile: 'Plotësimi',\n tabEvolution: 'Ecuria',\n viewsLabel: 'Pamjet e kartelës',\n visitCount: 'Vizita: {{visits}}',\n bmiInStrip:\n 'IMT-ja llogaritet nga pesha dhe gjatësia dhe shfaqet te përmbledhja në krye të kësaj kartele.',\n gapsIntro:\n 'Këto pyetje të detyrueshme mbetën pa përgjigje. Regjistrojini përgjigjet bashkë me pacientin.',\n noIntake: 'Pacienti nuk ka dërguar asnjë pyetësor.',\n pathologiesLabel: 'Patologjitë e caktuara',\n pathologiesHelp:\n 'Zgjidhni çdo kod që vlen: një pacient mund të ketë disa kode njëkohësisht.',\n pathologiesPlaceholder: 'Kërkoni kode…',\n noTherapy: 'Nuk është regjistruar asnjë terapi ose suplement.',\n addTherapy: 'Shto medikament',\n removeTherapy: 'Hiq {{name}}',\n noFmd: 'Nuk është regjistruar asnjë cikël i dietës që imiton agjërimin.',\n cycleNumber: 'Cikli {{number}}',\n cycleCompleted: 'I përfunduar',\n cycleInProgress: 'Në vazhdim',\n blockEmpty: 'Asgjë e regjistruar',\n blockFilled_one: '{{count}} regjistrim',\n blockFilled_other: '{{count}} regjistrime',\n blockFlagged_one: '{{count}} vlerë jashtë intervalit',\n blockFlagged_other: '{{count}} vlera jashtë intervalit',\n blockOutstanding_one: '{{count}} ende pa përgjigje',\n blockOutstanding_other: '{{count}} ende pa përgjigje',\n blockSettled: 'Të gjitha me përgjigje',\n addFollowUpVisit: 'Shto vizitë kontrolli',\n },\n configEditor: {\n title: 'Konfigurimi i anamnezës',\n intro:\n 'Fjalori i vetë klinikës: riemërtoni, rirenditni, arkivoni ose shtoni. Arkivimi nuk fshin kurrë asgjë: përgjigjet e regjistruara tashmë mbeten në historik.',\n tabsLabel: 'Fjalorët e konfigurimit',\n tabQuestionnaire: 'Pyetësori',\n tabParameters: 'Parametrat',\n tabPathologies: 'Patologjitë',\n tabTargets: 'Objektivat',\n targetsIntro:\n 'Zgjidhni parametrat që klinika ndjek si objektiva. Ato shfaqen në kartat e objektivave mbi kartelë, ku caktohet vlera e synuar e çdo pacienti dhe krahasohet vlera aktuale me objektivin.',\n panelTracked_one: '{{count}} ndiqet si objektiv',\n panelTracked_other: '{{count}} ndiqen si objektiva',\n panelLive_one: '{{count}} në përdorim',\n panelLive_other: '{{count}} në përdorim',\n panelArchived_one: '{{count}} në arkiv',\n panelArchived_other: '{{count}} në arkiv',\n panelNotCaptured_one: '{{count}} nuk ofrohet gjatë plotësimit',\n panelNotCaptured_other: '{{count}} nuk ofrohen gjatë plotësimit',\n locked: 'I kyçur',\n lockedHint:\n 'Përdoret për llogaritjen e IMT-së: mund ta riemërtoni ose ta rirenditni, por mos e hiqni kurrë',\n archived: 'Në arkiv',\n rowActions: 'Veprime për {{name}}',\n reorderHandle:\n 'Rirendit {{name}}. Shtypni Alt + Lart ose Alt + Poshtë për të lëvizur.',\n reorderAnnounce: '{{name}} u zhvendos në pozicionin {{to}} nga {{total}}',\n edit: 'Modifiko {{name}}',\n archive: 'Arkivo {{name}}',\n restore: 'Rikthe {{name}}',\n addQuestion: 'Shto pyetje',\n addSection: 'Shto seksion',\n addParameter: 'Shto parametër',\n addCode: 'Shto kod',\n sectionEmptyCapture:\n 'Nuk ka pyetje aktive: ky seksion nuk ofrohet gjatë plotësimit.',\n familyHeading:\n 'Familje me nënkode: është titull dhe nuk mund të caktohet vetë',\n subCodeOf: 'Nënkod i {{code}}',\n direction: {\n down: 'Vlera më e ulët është më e mirë',\n up: 'Vlera më e lartë është më e mirë',\n toRange: 'Brenda intervalit të referencës është më mirë',\n },\n type: {\n text: 'Përgjigje e shkurtër',\n textarea: 'Përgjigje e gjatë',\n numberInteger: 'Numër (i plotë)',\n numberDecimal: 'Numër (dhjetor)',\n yesNoDetail: 'Po / Jo',\n choice: 'Zgjedhje e vetme',\n choiceWithText: 'Zgjedhje e vetme me tekst',\n multiChoice: 'Zgjedhje e shumëfishtë',\n frequency: 'Shpeshtësi javore',\n meal: 'Vakt',\n },\n typeLine: 'Lloji i përgjigjes: {{type}}.',\n requiredBadge: 'E detyrueshme',\n requiredField: 'Përgjigje e detyrueshme',\n optionsCurrent: 'Opsionet: {{list}}.',\n editTitle: 'Modifiko {{name}}',\n keyLine:\n 'Identifikuesi: {{key}}. Caktohet gjatë krijimit dhe nuk ndryshon kurrë.',\n codeLine:\n 'Kodi: {{code}}. Caktohet gjatë krijimit dhe nuk ndryshon kurrë.',\n labelField: 'Etiketa',\n labelFieldHelp: 'Lëreni bosh për të përdorur formulimin standard.',\n helpField: 'Teksti ndihmës',\n addNote:\n 'Një hyrje e lirë vlen vetëm për këtë klinikë: nuk shtohet në asnjë fjalor të përbashkët.',\n addParameterTitle: 'Shto një parametër',\n addQuestionTitle: 'Shto një pyetje në seksionin {{section}}',\n addSectionTitle: 'Shto një seksion',\n addCodeTitle: 'Shto një kod patologjie',\n codeField: 'Kodi',\n groupField: 'Grupi',\n directionField: 'Çfarë konsiderohet përmirësim',\n unitField: 'Njësia',\n precisionField: 'Shifrat dhjetore',\n rangeMinField: 'Minimumi i referencës',\n rangeMaxField: 'Maksimumi i referencës',\n typeField: 'Lloji i përgjigjes',\n optionsField: 'Opsionet',\n optionsFieldHelp: 'Të ndara me presje: të paktën një.',\n parentField: 'Familja mëmë',\n parentFieldHelp:\n 'Kur shtoni një nënkod, familja e tij bëhet titull dhe nuk mund të caktohet më vetë.',\n sectionNeedsQuestion:\n 'Një seksion i ri shfaqet në pyetësor sapo të ketë të paktën një pyetje aktive.',\n selectPlaceholder: 'Zgjidhni…',\n save: 'Ruaj',\n cancel: 'Anulo',\n add: 'Shto',\n },\n targets: {\n title: 'Objektivat ushqimore',\n tileLabel: 'Objektivi: {{name}}',\n now: 'Tani {{value}}',\n nowBanded: 'Tani {{value}} · {{band}}',\n nowUnset: 'Ende pa u matur',\n unset: 'Pa objektiv',\n status: {\n onTarget: 'Objektivi u arrit',\n approaching: 'Po i afrohet objektivit',\n offTarget: 'Jashtë objektivit',\n },\n edit: 'Modifiko objektivin: {{parameter}}',\n editTitle: 'Objektivi: {{parameter}}',\n editField: 'Objektivi i ri',\n bounds: 'Në intervalin {{range}}',\n outOfBounds: 'Vendosni një objektiv në intervalin {{range}}.',\n unsaved: 'Ende i paruajtur',\n save: 'Ruaj objektivin',\n clear: 'Hiq objektivin',\n },\n summary: {\n fullQuestionnaire: 'Pyetësori i plotë',\n noAnswers: 'Ende nuk është regjistruar asnjë përgjigje.',\n jump: 'Përgjigjuni te {{field}} në skedën Plotësimi',\n },\n compare: {\n visitsLabel: 'Vizitat e krahasuara',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: 'Vizita të krahasuara: {{total}} · {{from}} – {{to}}',\n minimum: 'Në krahasim duhet të mbeten të paktën dy vizita',\n stop: 'Ndalo krahasimin',\n panelTitle: 'Krahaso vizitat',\n sameVisit:\n 'Zgjidhni dy ose më shumë vizita të ndryshme për të parë çfarë ka ndryshuar.',\n summaryTitle: 'Ndryshimet nga {{from}} deri më {{to}}',\n tableLabel: 'Çfarë ndryshoi ndërmjet vizitave të krahasuara',\n noChanges: 'Nuk ka ndryshime ndërmjet këtyre vizitave.',\n noChangesDescription:\n 'Në secilën prej tyre u regjistruan të njëjtat matje, kode, terapi dhe shënime.',\n present: 'Prezent',\n added: 'Shtim',\n removed: 'Heqje',\n changed: 'Ndryshim',\n notMeasured: 'Pa matje',\n category: {\n measurement: 'Matjet',\n pathology: 'Patologjitë',\n therapy: 'Terapia',\n note: 'Shënimet',\n },\n column: {\n item: 'Elementi',\n change: 'Ndryshimi',\n },\n },\n event: {\n barLabel: 'Ngjarjet',\n chip: '{{label}} · {{date}}',\n separator: ', ',\n shown: 'Linjat e ngjarjeve të shfaqura: {{list}}',\n noneShown: 'Nuk shfaqet asnjë linjë ngjarjeje.',\n external: '{{category}} · regjistruar nga {{source}}',\n category: {\n therapy: 'Terapia',\n diet: 'Dieta',\n fmd: 'Programi i dietës që imiton agjërimin',\n surgery: 'Kirurgji',\n lifestyle: 'Jeta e përditshme',\n },\n label: {\n dietStart: 'Filloi plani mesdhetar',\n fmdCycle: 'Cikël i dietës që imiton agjërimin',\n gymStart: 'Filloi stërvitjen në palestër',\n chemoStart: 'Filloi kimioterapia',\n surgery: 'Ndërhyrje në fshikëzën e tëmthit',\n },\n source: {\n oncology: 'një onkolog jashtë kësaj klinike',\n },\n },\n grid: {\n parameter: 'Parametri',\n caption:\n 'Vlerat e parametrave gjatë vizitave, duke filluar nga më e hershmja.',\n captionInModule:\n 'Vlerat e parametrave gjatë vizitave në modulin {{module}}, duke filluar nga më e hershmja.',\n target: 'Objektivi {{value}} {{unit}}',\n trendLabel: 'Ecuria: {{parameter}}',\n trend: 'Ecuria',\n editable: 'Mund të modifikohet',\n editCell: '{{parameter}}: vizita e fundit',\n baselineMerged: 'Bashkim i {{total}} vizitave të para',\n unlabelledSource: 'Tjetër',\n blockVisits_one: '{{count}} vizitë',\n blockVisits_other: '{{count}} vizita',\n },\n readOnly: {\n subtitle: 'Kartela e planit të trajtimit: vetëm për lexim.',\n summary: 'Përmbledhja e pacientit',\n none: 'Asgjë e regjistruar.',\n perWeek: 'Shpeshtësia javore: {{times}}',\n },\n pathology: {\n E66: 'Obeziteti',\n E66_0: 'Obezitet për shkak të kalorive të tepërta',\n E66_9: 'Obezitet, i paspecifikuar',\n E11: 'Diabet mellitus tip 2',\n E11_9: 'Diabet tip 2 pa komplikime',\n E11_6: 'Diabet tip 2 me komplikime të tjera të specifikuara',\n E78: 'Çrregullime të metabolizmit të lipoproteinave',\n I10: 'Hipertension esencial',\n E03: 'Hipotiroidizëm',\n K58: 'Sindroma e zorrës së irrituar',\n D50: 'Anemi nga mungesa e hekurit',\n E55: 'Mungesë e vitaminës D',\n groupGeneral: 'Të përgjithshme',\n },\n param: {\n weight: 'Pesha',\n height: 'Gjatësia',\n bmi: 'IMT',\n waist: 'Perimetri i belit',\n hips: 'Perimetri i vitheve',\n arm: 'Perimetri i krahut',\n phaseAngle: 'Këndi i fazës',\n energy: 'Energjia ditore',\n protein: 'Proteinat',\n fastingGlucose: 'Glukoza esëll',\n hba1c: 'HbA1c',\n totalCholesterol: 'Kolesteroli total',\n ldl: 'Kolesteroli LDL',\n hdl: 'Kolesteroli HDL',\n triglycerides: 'Trigliceridet',\n haemoglobin: 'Hemoglobina',\n vitaminD: 'Vitamina D (25-OH)',\n tsh: 'TSH',\n ferritin: 'Ferritina',\n crp: 'Proteina C-reaktive',\n creatinine: 'Kreatinina',\n },\n field: {\n highlighted: 'E theksuar',\n reasonForVisit: {\n label: 'Arsyeja e vizitës dhe objektivat',\n },\n knownConditions: {\n label: 'Sëmundjet e njohura',\n },\n dailyMedications: {\n label: 'Medikamentet e përditshme',\n },\n currentSupplements: {\n label: 'Suplementet aktuale',\n },\n familyParents: {\n label: 'Prindërit',\n },\n familySiblings: {\n label: 'Vëllezërit dhe motrat',\n },\n familyGrandparents: {\n label: 'Gjyshërit',\n },\n bloating: {\n label: 'Fryrje e barkut',\n },\n refluxGastritis: {\n label: 'Refluks ose gastrit',\n },\n tiredness: {\n label: 'Lodhje',\n },\n sleepQuality: {\n label: 'Cilësia e gjumit',\n option: {\n good: 'E mirë',\n fair: 'Mesatare',\n poor: 'E dobët',\n },\n },\n sleepDifficulty: {\n label: 'Vështirësi për të fjetur ose zgjime gjatë natës',\n },\n bowelHabits: {\n label: 'Zakonet e jashtëqitjes',\n option: {\n regular: 'Të rregullta',\n constipated: 'Kapsllëk',\n diarrhoeal: 'Diarre',\n alternating: 'Alternim kapsllëku dhe diarreje',\n },\n },\n stoolCharacteristics: {\n label: 'Karakteristikat e jashtëqitjes',\n },\n haemorrhoids: {\n label: 'Hemorroide',\n },\n diverticula: {\n label: 'Divertikuj',\n },\n regularUrination: {\n label: 'Urinim i rregullt',\n },\n menstrualCycle: {\n label: 'Cikli menstrual',\n option: {\n regular: 'I rregullt',\n irregular: 'I parregullt',\n absent: 'Mungon',\n },\n },\n foodAllergies: {\n label: 'Alergji ushqimore',\n },\n drugAllergies: {\n label: 'Alergji ndaj medikamenteve',\n },\n otherAllergies: {\n label: 'Alergji të tjera',\n },\n foodIntolerances: {\n label: 'Intoleranca ushqimore',\n },\n smoking: {\n label: 'Duhanpirja',\n option: {\n never: 'Kurrë',\n former: 'Në të kaluarën',\n current: 'Aktualisht',\n },\n },\n pastSurgery: {\n label: 'Ndërhyrje kirurgjikale të mëparshme',\n },\n pregnancies: {\n label: 'Shtatzënitë',\n },\n weightSelf: {\n label: 'Pesha (kg)',\n },\n heightSelf: {\n label: 'Gjatësia (cm)',\n },\n physicalActivity: {\n label: 'Aktiviteti fizik aktual',\n },\n lifestyle: {\n label: 'Stili aktual i jetesës',\n },\n waterPerDay: {\n label: 'Uji (litra në ditë)',\n },\n fizzyDrinks: {\n label: 'Pije të gazuara',\n option: {\n never: 'Kurrë',\n occasionally: 'Herë pas here',\n daily: 'Çdo ditë',\n },\n },\n alcohol: {\n label: 'Alkooli',\n option: {\n never: 'Kurrë',\n occasionally: 'Herë pas here',\n daily: 'Çdo ditë',\n },\n },\n coffeePerDay: {\n label: 'Kafeja (filxhanë në ditë)',\n },\n coffeeSugar: {\n label: 'Kafe me sheqer?',\n option: {\n yes: 'Po',\n no: 'Jo',\n },\n },\n breakfast: {\n label: 'Mëngjesi',\n },\n morningSnack: {\n label: 'Vakti i lehtë i paradites',\n },\n lunch: {\n label: 'Dreka',\n },\n afternoonSnack: {\n label: 'Vakti i lehtë i pasdites',\n },\n dinner: {\n label: 'Darka',\n },\n afterDinner: {\n label: 'Pas darkës',\n },\n pulses: {\n label: 'Bishtajoret (herë në javë)',\n },\n fish: {\n label: 'Peshku (herë në javë)',\n detailLabel: 'Çfarë peshku preferoni?',\n },\n eggs: {\n label: 'Vezët (herë në javë)',\n },\n meatCuredMeat: {\n label: 'Mishi dhe mishi i përpunuar (herë në javë)',\n detailLabel: 'I kuq apo i bardhë?',\n },\n dairy: {\n label: 'Bulmetrat (herë në javë)',\n detailLabel: 'Cilat bulmetra preferoni?',\n },\n visitType: {\n label: 'Lloji i vizitës',\n },\n practitioner: {\n label: 'Profesionisti',\n },\n tumourType: {\n label: 'Lloji i tumorit',\n },\n stage: {\n label: 'Stadi',\n },\n metastases: {\n label: 'Metastaza',\n },\n treatmentStatus: {\n label: 'Statusi i trajtimit',\n },\n medName: {\n label: 'Emri',\n },\n medDose: {\n label: 'Doza',\n },\n nutritionalProposal: {\n label: 'Propozimi nutricional',\n },\n clinicalNotes: {\n label: 'Shënime klinike',\n },\n annualProposed: {\n label: 'I propozuar',\n },\n annualAccepted: {\n label: 'I pranuar',\n },\n annualDeclineReason: {\n label: 'Arsyeja e refuzimit',\n },\n },\n questionnaire: {\n noNumeric: {\n title: 'Ende nuk ka asgjë për të krahasuar',\n description:\n 'Ecuria krahason përgjigjet numerike mes pyetësorëve. Në cilësimet e formularit, caktojini një pyetjeje tipin numerik dhe një njësi, pastaj plotësojeni pyetësorin të paktën dy herë.',\n },\n overviewTab: 'Pasqyra',\n },\n empty: {\n noVisits: {\n title: 'Ende nuk ka vizita',\n description:\n 'Pasi të regjistrohet vizita e parë, vlerat dhe ecuria shfaqen këtu.',\n },\n noRecord: {\n title: 'Ende nuk është regjistruar asgjë',\n description:\n 'Kjo kartelë nuk përmban vizita. Shtoni vizitën e parë për të filluar regjistrimin e informacionit.',\n create: 'Fillo pyetësorin e parë',\n createSigned: 'Fillo me nënshkrim',\n },\n noQuestions: {\n title: 'Nuk ka pyetje për t’u përgjigjur',\n description:\n 'Ky pyetësor nuk ka pyetje aktive. Kërkojini klinikës të aktivizojë disa.',\n },\n noParameters: {\n title: 'Nuk është konfiguruar asnjë matje',\n description:\n 'Kjo klinikë nuk ka matje të konfiguruara, prandaj ende nuk ka asgjë për të paraqitur në grafik.',\n },\n },\n visitNote: {\n title: 'Shënimet e vizitës',\n trigger: 'Shënimet e vizitës: {{visitType}}, {{date}}',\n openInPanel:\n 'Hap shënimet e vizitës ({{visitType}}, {{date}}) në pamjen e shënimeve',\n },\n rail: {\n notes: 'Shënime dhe ngjarje',\n empty: 'Kjo kartelë nuk ka as shënime, as ngjarje.',\n eventLabel: 'Ngjarje',\n },\n window: {\n label: 'Vizitat e shfaqura',\n pickerTrigger: 'Vizita · {{shown}} nga {{total}}',\n selectAll: 'Zgjidh të gjitha',\n showing:\n 'Vizita të shfaqura: {{shown}} nga {{total}} · {{from}} – {{to}}',\n showingAll: 'Të gjitha vizitat: {{total}} · {{from}} – {{to}}',\n minimum: 'Duhet të mbetet e shfaqur të paktën një vizitë',\n optionHasNote: '{{label}} · shënim',\n },\n digest: {\n group: {\n reason: 'Arsyeja e ardhjes',\n history: 'Sëmundjet dhe medikamentet',\n flags: 'Simptomat e raportuara',\n habits: 'Zakonet e përditshme',\n },\n nothing: {\n title: 'Ende nuk ka asgjë për të përmbledhur',\n description:\n 'Përgjigjet e regjistruara deri tani nuk janë pjesë e përmbledhjes. Hapni pyetësorin e plotë më poshtë për t’i lexuar.',\n },\n missing: {\n title_one: '{{count}} pyetje e detyrueshme ende pa përgjigje',\n title_other: '{{count}} pyetje të detyrueshme ende pa përgjigje',\n list: 'Ende pa përgjigje: {{list}}',\n separator: ', ',\n jump: 'Shko te {{field}}',\n },\n },\n export: {\n tab: {\n summary: 'Përmbledhja',\n compile: 'Plotësimi',\n evolution: 'Ecuria',\n },\n docTab: {\n summary: 'Përmbledhja e pyetësorit',\n compile: 'Kartela e vizitës',\n evolution: 'Ecuria',\n },\n docTitle: '{{tab}}: {{patient}}',\n info: 'Detajet e dokumentit',\n generated: 'Gjeneruar',\n audienceLabel: 'Kopje për',\n audience: {\n clinician: 'Klinika',\n patient: 'Pacienti',\n external: 'Një profesionist i jashtëm',\n },\n visitsLabel: 'Vizitat e përfshira',\n visitsSelected: '{{shown}} nga {{total}}',\n visitsAll: 'Të gjitha: {{total}}',\n withheld: 'Disa detaje klinike nuk përfshihen në këtë kopje.',\n none: 'Asgjë e regjistruar.',\n listSeparator: ', ',\n flagged: '{{date}} ({{flag}})',\n source: {\n patient: 'Pacienti',\n clinician: 'Profesionisti',\n },\n column: {\n question: 'Pyetja',\n answer: 'Përgjigjja',\n source: 'Burimi',\n field: 'Fusha',\n value: 'Vlera',\n unit: 'Njësia',\n referenceRange: 'Intervali i referencës',\n flag: 'Sinjalizimi',\n target: 'Objektivi',\n change: 'Ndryshimi {{from}} → {{to}}',\n outOfRange: 'Jashtë intervalit',\n code: 'Kodi',\n description: 'Përshkrimi',\n name: 'Emri',\n dose: 'Doza',\n kind: 'Lloji',\n cycle: 'Cikli',\n startDate: 'Data e fillimit',\n status: 'Statusi',\n notes: 'Shënimet',\n note: 'Shënimi',\n text: 'Teksti',\n },\n control: {\n trigger: 'Eksporto dhe ndaj',\n triggerLabel: 'Eksporto dhe ndaj pamjen {{tab}}',\n triggerLabelAudience: 'Eksporto dhe ndaj pamjen {{tab}}, {{audience}}',\n audienceBadge: 'Kopje për pacientin',\n menuLabel: 'Pamja {{tab}}',\n everyVisit: 'Përfshi çdo vizitë, jo vetëm kolonat e shfaqura',\n excludes: 'Kopja për pacientin nuk përfshin: {{list}}',\n excludesNone:\n 'Kopja për pacientin e kësaj pamjeje nuk lë asgjë jashtë.',\n holds:\n 'Kopja për klinikën përmban kartelën e plotë, përfshirë: {{list}}.',\n holdsNone:\n 'Kjo pamje nuk përmban asgjë që kopja për pacientin do ta linte jashtë.',\n share: 'Ndaj…',\n pdf: 'Shkarko PDF',\n print: 'Printo',\n xlsx: 'Shkarko Excel (.xlsx)',\n csv: 'Shkarko CSV (.csv)',\n printFrame: 'Dokument për printim (pa përmbajtje të dukshme)',\n printing: 'Po hapet dritarja e printimit për dokumentin.',\n ready: '{{file}} është gati.',\n failed: 'Ky shfletues nuk arriti ta përgatisë skedarin.',\n },\n share: {\n title: 'Ndaj pamjen {{tab}}',\n mockBadge: 'Vetëm parapamje',\n subtitle:\n 'Zgjidhni për kë do të ishte kopja dhe shihni çfarë do të përmbante.',\n noticeTitle: 'Nga ky ekran nuk dërgohet asgjë',\n notice:\n 'Kjo parapamje tregon formën e një ndarjeje, jo një ndarje të vërtetë. Një ndarje e vërtetë kërkon një lidhje të nënshkruar me afat skadimi, pëlqimin e pacientit dhe një regjistrim se kush mori çfarë dhe përmes cilit kanal. Të gjitha këto ndodhen jashtë kësaj kartele.',\n audienceLabel: 'Për kë do të ishte kjo kopje?',\n includes: 'Kjo kopje do të përmbante',\n includesNone: 'Kjo pamje nuk krijon asnjë dokument për këtë marrës.',\n excludes: 'Kjo kopje do të linte jashtë',\n excludesNone: 'Nga kjo kopje nuk lihet jashtë asgjë.',\n cancel: 'Anulo',\n confirm: 'Konfirmo marrësin',\n confirmed: 'Marrësi u caktua: {{audience}}. Nuk është dërguar asgjë.',\n },\n concept: {\n patient_identity: 'Të dhënat identifikuese të pacientit',\n intake_answers: 'Përgjigjet e pyetësorit',\n visit_date: 'Datat e vizitave',\n visit_type: 'Lloji i vizitës',\n visit_practitioner: 'Profesionisti',\n visit_reasonCode: 'Arsyeja e koduar e vizitës',\n anthropometrics_values: 'Matjet antropometrike',\n dietary_intake: 'Konsumi ushqimor',\n derived_bmi: 'IMT',\n lab_values: 'Vlerat e analizave të gjakut',\n pathology_codes: 'Kodet diagnostike',\n oncological_history: 'Anamneza onkologjike',\n therapy_entries: 'Terapia dhe suplementet',\n fmd_cycles: 'Ciklet e dietës që imiton agjërimin',\n annual_programme: 'Programi vjetor',\n notes_clinicalNotes: 'Shënimet klinike',\n notes_nutritionalProposal: 'Propozimi nutricional',\n symptom_observations: 'Vëzhgimet e profesionistit',\n compare_diff: 'Krahasimi i vizitave',\n visit_note: 'Shënimet e vizitës',\n event_timeline: 'Kronologjia e ngjarjeve klinike',\n export_tabDocument: 'Vetë dokumenti',\n export_workbook: 'Libri i punës me kartelën e plotë',\n },\n },\n },\n} as const;\n","/** Anamnesis interface resources (sv). */\nexport default {\n anamnesis: {\n mainLabel: 'Anamnesjournal: {{mode}}',\n mode: {\n intake: 'Anamnes',\n compile: 'Fyll i',\n questionnaire: 'Frågeformulär',\n readOnly: 'Skrivskyddad',\n },\n common: {\n yes: 'Ja',\n no: 'Nej',\n unknown: 'Okänt',\n notSure: 'Vet inte',\n choose: 'Välj…',\n details: 'Detaljer',\n detailsPending: 'Visas vid svaret ”Ja”',\n time: 'Tid',\n whatEaten: 'Vad åt du?',\n },\n header: {\n name: 'Namn',\n age: 'Ålder',\n dob: 'Födelsedatum',\n visitDate: 'Besöksdatum',\n years: '{{age}} år',\n },\n origin: {\n fromPatient: 'Från patienten',\n },\n delta: {\n improved: 'Förbättrat',\n worsened: 'Försämrat',\n unchanged: 'Oförändrat',\n aria: '{{valence}}: {{change}}',\n },\n range: {\n aboveRange: 'Över intervallet',\n belowRange: 'Under intervallet',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: 'Kroppsmått',\n dietary: 'Kostintag',\n lab: 'Blodprover',\n },\n visitType: {\n first: 'Första besök',\n followUp: 'Återbesök',\n },\n medKind: {\n medication: 'Läkemedel',\n supplement: 'Kosttillskott',\n },\n section: {\n reason: 'Besöksorsak',\n pharmacological: 'Läkemedelsanamnes',\n familyHistory: 'Familjeanamnes',\n symptoms: 'Symtom',\n otherHistory: 'Övrig anamnes',\n dietaryHistory: 'Kostanamnes',\n recall24h: 'Kostintag de senaste 24 timmarna',\n foodFrequency: 'Livsmedelsfrekvens per vecka',\n visitMeta: 'Besöksuppgifter',\n patientIntake: 'Patientens frågeformulär',\n intakeGaps: 'Obesvarade frågor',\n anthropometrics: 'Kroppsmått',\n dietary: 'Kostintag',\n pathologies: 'Sjukdomar',\n oncological: 'Onkologisk anamnes',\n therapy: 'Behandling och kosttillskott',\n labs: 'Blodprover',\n fmd: 'Program för fasteimiterande kost',\n proposal: 'Kostförslag och anteckningar',\n annual: 'Årsprogram',\n evolution: 'Utveckling',\n },\n intake: {\n title: 'Frågeformulär inför besöket',\n subtitle: 'Fyll i detta före ditt första besök.',\n sectionsLabel: 'Frågeformulärets avsnitt',\n answered: 'Besvarade frågor: {{answered}} av {{total}}',\n sectionProgress: 'Besvarade frågor: {{answered}} av {{total}}',\n submit: 'Spara',\n unsentNotice: 'Dina svar registreras när du skickar in frågeformuläret.',\n submittedNotice: 'Svaren har sparats.',\n },\n compile: {\n tabSummary: 'Sammanfattning',\n tabCompile: 'Fyll i',\n tabEvolution: 'Utveckling',\n viewsLabel: 'Journalvyer',\n visitCount: 'Besök: {{visits}}',\n bmiInStrip:\n 'BMI beräknas utifrån vikt och längd. Du kan se det i sammanfattningen högst upp i journalen.',\n gapsIntro:\n 'Dessa obligatoriska frågor är obesvarade. Registrera svaren tillsammans med patienten.',\n noIntake: 'Patienten har inte skickat in något frågeformulär.',\n pathologiesLabel: 'Registrerade sjukdomar',\n pathologiesHelp:\n 'Välj alla relevanta koder. En patient kan ha flera samtidigt.',\n pathologiesPlaceholder: 'Sök koder…',\n noTherapy: 'Ingen behandling eller något kosttillskott har registrerats.',\n addTherapy: 'Lägg till läkemedel',\n removeTherapy: 'Ta bort {{name}}',\n noFmd: 'Inga cykler med fasteimiterande kost har registrerats.',\n cycleNumber: 'Cykel {{number}}',\n cycleCompleted: 'Slutförd',\n cycleInProgress: 'Pågår',\n blockEmpty: 'Inget registrerat',\n blockFilled_one: 'Registrerat: {{count}}',\n blockFilled_other: 'Registrerat: {{count}}',\n blockFlagged_one: '{{count}} utanför intervallet',\n blockFlagged_other: '{{count}} utanför intervallet',\n blockOutstanding_one: '{{count}} återstår att besvara',\n blockOutstanding_other: '{{count}} återstår att besvara',\n blockSettled: 'Alla besvarade',\n addFollowUpVisit: 'Lägg till återbesök',\n },\n configEditor: {\n title: 'Anamnesinställningar',\n intro:\n 'Klinikens egen terminologi: byt namn, ändra ordning, arkivera eller lägg till. Arkivering raderar inget. Redan registrerade svar finns kvar i historiken.',\n tabsLabel: 'Konfigurerbara termlistor',\n tabQuestionnaire: 'Frågeformulär',\n tabParameters: 'Parametrar',\n tabPathologies: 'Sjukdomar',\n tabTargets: 'Mål',\n targetsIntro:\n 'Välj de parametrar kliniken följer som mål. De visas i målrutorna ovanför journalen, där du anger varje patients målvärde och ser aktuellt värde i förhållande till målet.',\n panelTracked_one: '{{count}} följs som mål',\n panelTracked_other: '{{count}} följs som mål',\n panelLive_one: '{{count}} aktiv',\n panelLive_other: '{{count}} aktiva',\n panelArchived_one: '{{count}} arkiverad',\n panelArchived_other: '{{count}} arkiverade',\n panelNotCaptured_one: '{{count}} visas inte vid registrering',\n panelNotCaptured_other: '{{count}} visas inte vid registrering',\n locked: 'Låst',\n lockedHint:\n 'Används för att beräkna BMI. Du kan byta namn eller ändra ordningen, men inte ta bort den.',\n archived: 'Arkiverad',\n rowActions: 'Åtgärder för {{name}}',\n reorderHandle:\n 'Ändra ordning för {{name}}. Tryck på Alt + uppåtpil eller Alt + nedåtpil för att flytta.',\n reorderAnnounce: '{{name}} har flyttats till plats {{to}} av {{total}}',\n edit: 'Redigera {{name}}',\n archive: 'Arkivera {{name}}',\n restore: 'Återställ {{name}}',\n addQuestion: 'Lägg till fråga',\n addSection: 'Lägg till avsnitt',\n addParameter: 'Lägg till parameter',\n addCode: 'Lägg till kod',\n sectionEmptyCapture:\n 'Inga aktiva frågor. Avsnittet visas inte vid registrering.',\n familyHeading:\n 'Grupp med underkoder. Detta är en rubrik som inte kan väljas separat.',\n subCodeOf: 'Underkod till {{code}}',\n direction: {\n down: 'Lägre är bättre',\n up: 'Högre är bättre',\n toRange: 'Inom intervallet är bättre',\n },\n type: {\n text: 'Kort svar',\n textarea: 'Långt svar',\n numberInteger: 'Tal (heltal)',\n numberDecimal: 'Tal (decimaltal)',\n yesNoDetail: 'Ja / nej',\n choice: 'Ett val',\n choiceWithText: 'Ett val med text',\n multiChoice: 'Flera val',\n frequency: 'Frekvens per vecka',\n meal: 'Måltid',\n },\n typeLine: 'Svarstyp: {{type}}.',\n requiredBadge: 'Obligatorisk',\n requiredField: 'Svar krävs',\n optionsCurrent: 'Alternativ: {{list}}.',\n editTitle: 'Redigera {{name}}',\n keyLine:\n 'Identifierare: {{key}}. Tilldelas när posten skapas och ändras aldrig.',\n codeLine: 'Kod: {{code}}. Tilldelas när posten skapas och ändras aldrig.',\n labelField: 'Etikett',\n labelFieldHelp: 'Lämna tomt för att använda standardtexten.',\n helpField: 'Hjälptext',\n addNote:\n 'En egen post gäller bara för den här kliniken. Den läggs inte till i någon gemensam termlista.',\n addParameterTitle: 'Lägg till en parameter',\n addQuestionTitle: 'Lägg till en fråga i {{section}}',\n addSectionTitle: 'Lägg till ett avsnitt',\n addCodeTitle: 'Lägg till en sjukdomskod',\n codeField: 'Kod',\n groupField: 'Grupp',\n directionField: 'Vad som räknas som förbättring',\n unitField: 'Enhet',\n precisionField: 'Decimaler',\n rangeMinField: 'Referensintervallets nedre gräns',\n rangeMaxField: 'Referensintervallets övre gräns',\n typeField: 'Svarstyp',\n optionsField: 'Alternativ',\n optionsFieldHelp: 'Avgränsa med kommatecken. Ange minst ett alternativ.',\n parentField: 'Överordnad grupp',\n parentFieldHelp:\n 'När du lägger till en underkod blir gruppen en rubrik som inte längre kan väljas separat.',\n sectionNeedsQuestion:\n 'Ett nytt avsnitt visas i frågeformuläret när det innehåller minst en aktiv fråga.',\n selectPlaceholder: 'Välj…',\n save: 'Spara',\n cancel: 'Avbryt',\n add: 'Lägg till',\n },\n targets: {\n title: 'Nutritionsmål',\n tileLabel: 'Mål för {{name}}',\n now: 'Nu {{value}}',\n nowBanded: 'Nu {{value}} · {{band}}',\n nowUnset: 'Inte uppmätt ännu',\n unset: 'Inget mål',\n status: {\n onTarget: 'Målet uppnått',\n approaching: 'Närmar sig målet',\n offTarget: 'Avviker från målet',\n },\n edit: 'Redigera mål: {{parameter}}',\n editTitle: 'Mål: {{parameter}}',\n editField: 'Nytt mål',\n bounds: 'Inom {{range}}',\n outOfBounds: 'Ange ett mål inom {{range}}.',\n unsaved: 'Inte sparat ännu',\n save: 'Spara mål',\n clear: 'Ta bort mål',\n },\n summary: {\n fullQuestionnaire: 'Hela frågeformuläret',\n noAnswers: 'Inga svar har registrerats ännu.',\n jump: 'Besvara {{field}} på fliken Fyll i',\n },\n compare: {\n visitsLabel: 'Jämförda besök',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: '{{total}} besök jämförs · {{from}} – {{to}}',\n minimum: 'Minst två besök måste ingå i jämförelsen',\n stop: 'Avsluta jämförelse',\n panelTitle: 'Jämför besök',\n sameVisit: 'Välj minst två olika besök för att se vad som har ändrats.',\n summaryTitle: 'Förändringar från {{from}} till {{to}}',\n tableLabel: 'Vad som har ändrats mellan de jämförda besöken',\n noChanges: 'Inga förändringar mellan dessa besök.',\n noChangesDescription:\n 'Samma mätvärden, koder, behandlingar och anteckningar registrerades vid samtliga besök.',\n present: 'Finns',\n added: 'Tillagt',\n removed: 'Borttaget',\n changed: 'Ändrat',\n notMeasured: 'Inte uppmätt',\n category: {\n measurement: 'Mätvärden',\n pathology: 'Sjukdomar',\n therapy: 'Behandling',\n note: 'Anteckningar',\n },\n column: {\n item: 'Post',\n change: 'Förändring',\n },\n },\n event: {\n barLabel: 'Händelser',\n chip: '{{label}} · {{date}}',\n separator: ', ',\n shown: 'Visade händelselinjer: {{list}}',\n noneShown: 'Inga händelselinjer visas.',\n external: '{{category}} · registrerat av {{source}}',\n category: {\n therapy: 'Behandling',\n diet: 'Kost',\n fmd: 'Program för fasteimiterande kost',\n surgery: 'Operation',\n lifestyle: 'Vardagsliv',\n },\n label: {\n dietStart: 'Medelhavskost påbörjad',\n fmdCycle: 'Cykel med fasteimiterande kost',\n gymStart: 'Börjat träna på gym',\n chemoStart: 'Cytostatikabehandling påbörjad',\n surgery: 'Gallblåseoperation',\n },\n source: {\n oncology: 'en onkolog utanför den här kliniken',\n },\n },\n grid: {\n parameter: 'Parameter',\n caption: 'Parametervärden för olika besök, med det äldsta först.',\n captionInModule:\n 'Parametervärden för besök inom {{module}}, med det äldsta först.',\n target: 'Mål {{value}} {{unit}}',\n trendLabel: 'Utveckling för {{parameter}}',\n trend: 'Utveckling',\n editable: 'Redigerbar',\n editCell: '{{parameter}}: senaste besöket',\n baselineMerged: 'Sammanfogat från {{total}} första besök',\n unlabelledSource: 'Övrigt',\n blockVisits_one: '{{count}} besök',\n blockVisits_other: '{{count}} besök',\n },\n readOnly: {\n subtitle: 'Vårdplansjournal, skrivskyddad.',\n summary: 'Patientsammanfattning',\n none: 'Inget registrerat.',\n perWeek: 'Frekvens per vecka: {{times}}',\n },\n pathology: {\n E66: 'Obesitas',\n E66_0: 'Obesitas på grund av kaloriöverskott',\n E66_9: 'Obesitas, ospecificerad',\n E11: 'Diabetes mellitus typ 2',\n E11_9: 'Typ 2-diabetes utan komplikationer',\n E11_6: 'Typ 2-diabetes med andra specificerade komplikationer',\n E78: 'Rubbningar i lipoproteinomsättningen',\n I10: 'Essentiell hypertoni',\n E03: 'Hypotyreos',\n K58: 'Irritabel tarm (IBS)',\n D50: 'Järnbristanemi',\n E55: 'D-vitaminbrist',\n groupGeneral: 'Allmänt',\n },\n param: {\n weight: 'Vikt',\n height: 'Längd',\n bmi: 'BMI',\n waist: 'Midja',\n hips: 'Höfter',\n arm: 'Arm',\n phaseAngle: 'Fasvinkel',\n energy: 'Dagligt energiintag',\n protein: 'Protein',\n fastingGlucose: 'Fasteglukos',\n hba1c: 'HbA1c',\n totalCholesterol: 'Totalkolesterol',\n ldl: 'LDL-kolesterol',\n hdl: 'HDL-kolesterol',\n triglycerides: 'Triglycerider',\n haemoglobin: 'Hemoglobin',\n vitaminD: 'D-vitamin (25-OH)',\n tsh: 'TSH',\n ferritin: 'Ferritin',\n crp: 'C-reaktivt protein',\n creatinine: 'Kreatinin',\n },\n field: {\n highlighted: 'Markerad',\n reasonForVisit: {\n label: 'Besöksorsak och mål',\n },\n knownConditions: {\n label: 'Kända sjukdomar',\n },\n dailyMedications: {\n label: 'Dagliga läkemedel',\n },\n currentSupplements: {\n label: 'Aktuella kosttillskott',\n },\n familyParents: {\n label: 'Föräldrar',\n },\n familySiblings: {\n label: 'Syskon',\n },\n familyGrandparents: {\n label: 'Mor- och farföräldrar',\n },\n bloating: {\n label: 'Uppblåst mage',\n },\n refluxGastritis: {\n label: 'Reflux eller gastrit',\n },\n tiredness: {\n label: 'Trötthet',\n },\n sleepQuality: {\n label: 'Sömnkvalitet',\n option: {\n good: 'God',\n fair: 'Måttlig',\n poor: 'Dålig',\n },\n },\n sleepDifficulty: {\n label: 'Svårt att somna eller nattliga uppvaknanden',\n },\n bowelHabits: {\n label: 'Avföringsvanor',\n option: {\n regular: 'Regelbundna',\n constipated: 'Förstoppning',\n diarrhoeal: 'Diarré',\n alternating: 'Växlande',\n },\n },\n stoolCharacteristics: {\n label: 'Avföringens egenskaper',\n },\n haemorrhoids: {\n label: 'Hemorrojder',\n },\n diverticula: {\n label: 'Divertiklar',\n },\n regularUrination: {\n label: 'Regelbunden urinering',\n },\n menstrualCycle: {\n label: 'Menstruationscykel',\n option: {\n regular: 'Regelbunden',\n irregular: 'Oregelbunden',\n absent: 'Utebliven',\n },\n },\n foodAllergies: {\n label: 'Livsmedelsallergier',\n },\n drugAllergies: {\n label: 'Läkemedelsallergier',\n },\n otherAllergies: {\n label: 'Övriga allergier',\n },\n foodIntolerances: {\n label: 'Livsmedelsintoleranser',\n },\n smoking: {\n label: 'Rökning',\n option: {\n never: 'Aldrig',\n former: 'Tidigare rökare',\n current: 'Röker nu',\n },\n },\n pastSurgery: {\n label: 'Tidigare operationer',\n },\n pregnancies: {\n label: 'Graviditeter',\n },\n weightSelf: {\n label: 'Vikt (kg)',\n },\n heightSelf: {\n label: 'Längd (cm)',\n },\n physicalActivity: {\n label: 'Nuvarande fysisk aktivitet',\n },\n lifestyle: {\n label: 'Nuvarande livsstil',\n },\n waterPerDay: {\n label: 'Vatten (liter per dag)',\n },\n fizzyDrinks: {\n label: 'Kolsyrade drycker',\n option: {\n never: 'Aldrig',\n occasionally: 'Ibland',\n daily: 'Dagligen',\n },\n },\n alcohol: {\n label: 'Alkohol',\n option: {\n never: 'Aldrig',\n occasionally: 'Ibland',\n daily: 'Dagligen',\n },\n },\n coffeePerDay: {\n label: 'Kaffe (koppar per dag)',\n },\n coffeeSugar: {\n label: 'Kaffe med socker?',\n option: {\n yes: 'Ja',\n no: 'Nej',\n },\n },\n breakfast: {\n label: 'Frukost',\n },\n morningSnack: {\n label: 'Mellanmål på förmiddagen',\n },\n lunch: {\n label: 'Lunch',\n },\n afternoonSnack: {\n label: 'Mellanmål på eftermiddagen',\n },\n dinner: {\n label: 'Middag',\n },\n afterDinner: {\n label: 'Efter middagen',\n },\n pulses: {\n label: 'Baljväxter (gånger per vecka)',\n },\n fish: {\n label: 'Fisk (gånger per vecka)',\n detailLabel: 'Vilken fisk föredrar du?',\n },\n eggs: {\n label: 'Ägg (gånger per vecka)',\n },\n meatCuredMeat: {\n label: 'Kött och charkprodukter (gånger per vecka)',\n detailLabel: 'Rött eller vitt kött?',\n },\n dairy: {\n label: 'Mejeriprodukter (gånger per vecka)',\n detailLabel: 'Vilka mejeriprodukter föredrar du?',\n },\n visitType: {\n label: 'Besökstyp',\n },\n practitioner: {\n label: 'Behandlare',\n },\n tumourType: {\n label: 'Tumörtyp',\n },\n stage: {\n label: 'Stadium',\n },\n metastases: {\n label: 'Metastaser',\n },\n treatmentStatus: {\n label: 'Behandlingsstatus',\n },\n medName: {\n label: 'Namn',\n },\n medDose: {\n label: 'Dos',\n },\n nutritionalProposal: {\n label: 'Kostförslag',\n },\n clinicalNotes: {\n label: 'Kliniska anteckningar',\n },\n annualProposed: {\n label: 'Föreslaget',\n },\n annualAccepted: {\n label: 'Accepterat',\n },\n annualDeclineReason: {\n label: 'Orsak till att tacka nej',\n },\n },\n questionnaire: {\n noNumeric: {\n title: 'Inget att jämföra ännu',\n description:\n 'Utvecklingsvyn jämför numeriska svar mellan frågeformulär. Ange tal som svarstyp och en måttenhet för en fråga i formulärinställningarna. Besvara den sedan minst två gånger.',\n },\n overviewTab: 'Översikt',\n },\n empty: {\n noVisits: {\n title: 'Inga besök ännu',\n description:\n 'När det första besöket har registrerats visas värden och utveckling här.',\n },\n noRecord: {\n title: 'Inget registrerat ännu',\n description:\n 'Journalen har inga besök. Lägg till det första besöket för att börja registrera uppgifter.',\n create: 'Börja fylla i det första frågeformuläret',\n createSigned: 'Börja med signering',\n },\n noQuestions: {\n title: 'Inga frågor att besvara',\n description:\n 'Det här frågeformuläret har inga aktiva frågor. Be kliniken att aktivera några.',\n },\n noParameters: {\n title: 'Inga mätparametrar har ställts in',\n description:\n 'Kliniken har inga inställda mätparametrar, så det finns inget att visa i diagrammet ännu.',\n },\n },\n visitNote: {\n title: 'Besöksanteckningar',\n trigger: 'Besöksanteckningar: {{visitType}}, {{date}}',\n openInPanel:\n 'Öppna besöksanteckningarna för {{visitType}}, {{date}}, i anteckningsvyn',\n },\n rail: {\n notes: 'Anteckningar och händelser',\n empty: 'Den här journalen har inga anteckningar eller händelser.',\n eventLabel: 'Händelse',\n },\n window: {\n label: 'Visade besök',\n pickerTrigger: 'Besök · {{shown}} av {{total}}',\n selectAll: 'Välj alla',\n showing: 'Visar {{shown}} av {{total}} besök · {{from}} – {{to}}',\n showingAll: 'Alla besök: {{total}} · {{from}} – {{to}}',\n minimum: 'Minst ett besök måste visas',\n optionHasNote: '{{label}} · anteckning',\n },\n digest: {\n group: {\n reason: 'Besöksorsak',\n history: 'Sjukdomar och läkemedel',\n flags: 'Rapporterade symtom',\n habits: 'Dagliga vanor',\n },\n nothing: {\n title: 'Inget att sammanfatta ännu',\n description:\n 'De svar som hittills har registrerats ingår inte i sammanfattningen. Öppna hela frågeformuläret nedan för att läsa dem.',\n },\n missing: {\n title_one: '{{count}} obligatorisk fråga är fortfarande obesvarad',\n title_other: '{{count}} obligatoriska frågor är fortfarande obesvarade',\n list: 'Saknas fortfarande: {{list}}',\n separator: ', ',\n jump: 'Gå till {{field}}',\n },\n },\n export: {\n tab: {\n summary: 'Sammanfattning',\n compile: 'Fyll i',\n evolution: 'Utveckling',\n },\n docTab: {\n summary: 'Sammanfattning av frågeformuläret',\n compile: 'Besöksjournal',\n evolution: 'Utveckling',\n },\n docTitle: '{{tab}}: {{patient}}',\n info: 'Dokumentuppgifter',\n generated: 'Skapat',\n audienceLabel: 'Kopia för',\n audience: {\n clinician: 'Kliniken',\n patient: 'Patienten',\n external: 'En extern behandlare',\n },\n visitsLabel: 'Besök som ingår',\n visitsSelected: '{{shown}} av {{total}}',\n visitsAll: 'Alla {{total}}',\n withheld: 'Vissa kliniska uppgifter ingår inte i den här kopian.',\n none: 'Inget registrerat.',\n listSeparator: ', ',\n flagged: '{{date}} ({{flag}})',\n source: {\n patient: 'Patient',\n clinician: 'Behandlare',\n },\n column: {\n question: 'Fråga',\n answer: 'Svar',\n source: 'Källa',\n field: 'Fält',\n value: 'Värde',\n unit: 'Enhet',\n referenceRange: 'Referensintervall',\n flag: 'Markering',\n target: 'Mål',\n change: 'Förändring {{from}} → {{to}}',\n outOfRange: 'Utanför intervallet',\n code: 'Kod',\n description: 'Beskrivning',\n name: 'Namn',\n dose: 'Dos',\n kind: 'Typ',\n cycle: 'Cykel',\n startDate: 'Startdatum',\n status: 'Status',\n notes: 'Anteckningar',\n note: 'Anteckning',\n text: 'Text',\n },\n control: {\n trigger: 'Exportera och dela',\n triggerLabel: 'Exportera och dela vyn {{tab}}',\n triggerLabelAudience: 'Exportera och dela vyn {{tab}}, {{audience}}',\n audienceBadge: 'Patientkopia',\n menuLabel: 'Vyn {{tab}}',\n everyVisit: 'Ta med alla besök, inte bara de kolumner som visas',\n excludes: 'En patientkopia utelämnar: {{list}}',\n excludesNone: 'En patientkopia av den här vyn utelämnar inget.',\n holds: 'Klinikens kopia innehåller hela journalen, inklusive {{list}}.',\n holdsNone:\n 'Den här vyn innehåller inget som skulle utelämnas i en patientkopia.',\n share: 'Dela…',\n pdf: 'Ladda ned PDF',\n print: 'Skriv ut',\n xlsx: 'Ladda ned Excel (.xlsx)',\n csv: 'Ladda ned CSV (.csv)',\n printFrame: 'Utskriftsdokument (inget synligt innehåll)',\n printing: 'Utskriftsdialogen för dokumentet öppnas.',\n ready: '{{file}} är klar.',\n failed: 'Webbläsaren kunde inte förbereda filen.',\n },\n share: {\n title: 'Dela vyn {{tab}}',\n mockBadge: 'Endast förhandsvisning',\n subtitle:\n 'Välj vem en kopia skulle vara till för och se vad den skulle innehålla.',\n noticeTitle: 'Inget skickas från den här skärmen',\n notice:\n 'Den här förhandsvisningen visar hur en delning skulle se ut. Den delar inget. Verklig delning kräver en signerad länk med giltighetstid, patientens samtycke och en logg över vem som fått vad och via vilken kanal. Allt detta hanteras utanför den här journalen.',\n audienceLabel: 'Vem skulle kopian vara till för?',\n includes: 'Kopian skulle innehålla',\n includesNone:\n 'Den här vyn skapar inget dokument för den här mottagaren.',\n excludes: 'Kopian skulle utelämna',\n excludesNone: 'Inget utelämnas i den här kopian.',\n cancel: 'Avbryt',\n confirm: 'Bekräfta mottagare',\n confirmed: 'Mottagare vald: {{audience}}. Inget har skickats.',\n },\n concept: {\n patient_identity: 'Patientens identitetsuppgifter',\n intake_answers: 'Svar på frågeformuläret',\n visit_date: 'Besöksdatum',\n visit_type: 'Besökstyp',\n visit_practitioner: 'Behandlare',\n visit_reasonCode: 'Kodad besöksorsak',\n anthropometrics_values: 'Antropometriska mått',\n dietary_intake: 'Kostintag',\n derived_bmi: 'BMI',\n lab_values: 'Blodprovsvärden',\n pathology_codes: 'Diagnoskoder',\n oncological_history: 'Onkologisk anamnes',\n therapy_entries: 'Behandling och kosttillskott',\n fmd_cycles: 'Cykler med fasteimiterande kost',\n annual_programme: 'Årsprogram',\n notes_clinicalNotes: 'Kliniska anteckningar',\n notes_nutritionalProposal: 'Kostförslag',\n symptom_observations: 'Behandlarens observationer',\n compare_diff: 'Besöksjämförelse',\n visit_note: 'Besöksanteckningar',\n event_timeline: 'Tidslinje över kliniska händelser',\n export_tabDocument: 'Själva dokumentet',\n export_workbook: 'Arbetsboken med hela journalen',\n },\n },\n },\n} as const;\n","/** Anamnesis interface resources (tr). */\nexport default {\n anamnesis: {\n mainLabel: 'Anamnez kaydı: {{mode}}',\n mode: {\n intake: 'İlk değerlendirme',\n compile: 'Doldur',\n questionnaire: 'Anket',\n readOnly: 'Salt okunur',\n },\n compile: {\n tabCompile: 'Doldur',\n tabEvolution: 'Seyir',\n tabSummary: 'Özet',\n viewsLabel: 'Kayıt görünümleri',\n visitCount: 'Muayene sayısı: {{visits}}',\n bmiInStrip:\n 'VKİ, kilo ve boydan hesaplanır. Bu kaydın üst kısmındaki özette gösterilir.',\n gapsIntro:\n 'Bu zorunlu sorular yanıtlanmadan gönderildi. Hasta ile birlikte yanıtlarını kaydedin.',\n noIntake: 'Hasta anket göndermedi.',\n pathologiesLabel: 'Atanmış hastalıklar',\n pathologiesHelp:\n 'Geçerli tüm kodları seçin. Bir hastaya aynı anda birden fazla kod atanabilir.',\n pathologiesPlaceholder: 'Kod ara…',\n noTherapy: 'Kaydedilmiş tedavi veya takviye yok.',\n addTherapy: 'İlaç ekle',\n removeTherapy: '{{name}} öğesini kaldır',\n noFmd: 'Kaydedilmiş açlığı taklit eden beslenme döngüsü yok.',\n cycleNumber: 'Döngü {{number}}',\n cycleCompleted: 'Tamamlandı',\n cycleInProgress: 'Devam ediyor',\n blockEmpty: 'Kayıt yok',\n blockFilled_one: '{{count}} kayıt',\n blockFilled_other: '{{count}} kayıt',\n blockFlagged_one: '{{count}} değer aralık dışında',\n blockFlagged_other: '{{count}} değer aralık dışında',\n blockOutstanding_one: 'Yanıtlanacak {{count}} soru kaldı',\n blockOutstanding_other: 'Yanıtlanacak {{count}} soru kaldı',\n blockSettled: 'Tümü yanıtlandı',\n addFollowUpVisit: 'Kontrol muayenesi ekle',\n },\n export: {\n tab: {\n compile: 'Doldur',\n evolution: 'Seyir',\n summary: 'Özet',\n },\n column: {\n name: 'Ad',\n code: 'Kod',\n unit: 'Birim',\n notes: 'Notlar',\n dose: 'Doz',\n question: 'Soru',\n answer: 'Yanıt',\n source: 'Kaynak',\n field: 'Alan',\n value: 'Değer',\n referenceRange: 'Referans aralığı',\n flag: 'İşaret',\n target: 'Hedef',\n change: 'Değişim {{from}} → {{to}}',\n outOfRange: 'Aralık dışında',\n description: 'Açıklama',\n kind: 'Tür',\n cycle: 'Döngü',\n startDate: 'Başlangıç tarihi',\n status: 'Durum',\n note: 'Not',\n text: 'Metin',\n },\n concept: {\n dietary_intake: 'Besin tüketimi',\n oncological_history: 'Onkolojik öykü',\n annual_programme: 'Yıllık program',\n derived_bmi: 'VKİ',\n visit_type: 'Muayene türü',\n visit_practitioner: 'Sağlık çalışanı',\n notes_nutritionalProposal: 'Beslenme önerisi',\n notes_clinicalNotes: 'Klinik notlar',\n visit_note: 'Muayene notları',\n patient_identity: 'Hasta kimliği',\n intake_answers: 'Anket yanıtları',\n visit_date: 'Muayene tarihleri',\n visit_reasonCode: 'Kodlanmış başvuru nedeni',\n anthropometrics_values: 'Antropometrik ölçümler',\n lab_values: 'Kan testi değerleri',\n pathology_codes: 'Tanı kodları',\n therapy_entries: 'Tedavi ve takviyeler',\n fmd_cycles: 'Açlığı taklit eden beslenme döngüleri',\n symptom_observations: 'Sağlık çalışanının gözlemleri',\n compare_diff: 'Muayene karşılaştırması',\n event_timeline: 'Klinik olay zaman çizelgesi',\n export_tabDocument: 'Belgenin kendisi',\n export_workbook: 'Kaydın tamamını içeren çalışma kitabı',\n },\n docTab: {\n evolution: 'Seyir',\n summary: 'Anket özeti',\n compile: 'Muayene kaydı',\n },\n share: {\n cancel: 'İptal',\n title: '{{tab}} görünümünü paylaş',\n mockBadge: 'Yalnızca önizleme',\n subtitle:\n 'Kopyanın kimin için olacağını seçin ve neler içereceğini görün.',\n noticeTitle: 'Bu ekrandan hiçbir şey gönderilmez',\n notice:\n 'Bu önizleme, paylaşımın nasıl görüneceğini gösterir; gerçek bir paylaşım yapmaz. Gerçek paylaşım için imzalı ve süreli bir bağlantı, hastanın onayı ve kimin hangi bilgiyi hangi kanaldan aldığının kaydı gerekir. Bunların tümü bu kaydın dışında yönetilir.',\n audienceLabel: 'Bu kopya kimin için olacak?',\n includes: 'Bu kopyaya dahil edilecekler',\n includesNone: 'Bu görünüm, bu alıcı için belge oluşturmaz.',\n excludes: 'Bu kopyadan çıkarılacaklar',\n excludesNone: 'Bu kopyadan hiçbir bilgi çıkarılmaz.',\n confirm: 'Alıcıyı onayla',\n confirmed:\n 'Alıcı {{audience}} olarak belirlendi. Hiçbir şey gönderilmedi.',\n },\n listSeparator: ', ',\n docTitle: '{{tab}}: {{patient}}',\n info: 'Belge ayrıntıları',\n generated: 'Oluşturulma',\n audienceLabel: 'Kopyanın alıcısı',\n audience: {\n clinician: 'Klinik',\n patient: 'Hasta',\n external: 'Klinik dışındaki bir sağlık uzmanı',\n },\n visitsLabel: 'Dahil edilen muayeneler',\n visitsSelected: '{{shown}} / {{total}}',\n visitsAll: 'Tümü: {{total}}',\n withheld: 'Bazı klinik ayrıntılar bu kopyaya dahil edilmemiştir.',\n none: 'Kayıt yok.',\n flagged: '{{date}} ({{flag}})',\n source: {\n patient: 'Hasta',\n clinician: 'Sağlık çalışanı',\n },\n control: {\n trigger: 'Dışa aktar ve paylaş',\n triggerLabel: '{{tab}} görünümünü dışa aktar ve paylaş',\n triggerLabelAudience:\n '{{tab}} görünümünü dışa aktar ve paylaş, {{audience}}',\n audienceBadge: 'Hasta kopyası',\n menuLabel: '{{tab}} görünümü',\n everyVisit:\n 'Yalnızca gösterilen sütunları değil, tüm muayeneleri dahil et',\n excludes: 'Hasta kopyasında yer almaz: {{list}}',\n excludesNone: 'Bu görünümün hasta kopyasında hiçbir bilgi çıkarılmaz.',\n holds: 'Klinik kopyası, {{list}} dahil kaydın tamamını içerir.',\n holdsNone: 'Bu görünümde, hasta kopyasından çıkarılacak bilgi yoktur.',\n share: 'Paylaş…',\n pdf: 'PDF indir',\n print: 'Yazdır',\n xlsx: 'Excel indir (.xlsx)',\n csv: 'CSV indir (.csv)',\n printFrame: 'Belgeyi yazdır (görünür içerik yok)',\n printing: 'Belgenin yazdırma penceresi açılıyor.',\n ready: '{{file}} hazır.',\n failed: 'Bu tarayıcı dosyayı hazırlayamadı.',\n },\n },\n configEditor: {\n tabQuestionnaire: 'Anket',\n selectPlaceholder: 'Seçin…',\n tabPathologies: 'Hastalıklar',\n save: 'Kaydet',\n title: 'Anamnez yapılandırması',\n intro:\n 'Kliniğin kendi terim listesi: yeniden adlandırın, sıralayın, arşivleyin veya ekleyin. Arşivleme hiçbir şeyi silmez; kaydedilmiş yanıtlar geçmişte kalır.',\n tabsLabel: 'Yapılandırma terim listeleri',\n tabParameters: 'Parametreler',\n tabTargets: 'Hedefler',\n targetsIntro:\n 'Kliniğin hedef olarak takip ettiği parametreleri seçin. Bunlar, kaydın üstündeki hedef kartlarında görünür. Her hastanın hedef değeri burada belirlenir ve mevcut değerin hedefe göre durumu burada izlenir.',\n panelTracked_one: '{{count}} parametre hedef olarak izleniyor',\n panelTracked_other: '{{count}} parametre hedef olarak izleniyor',\n panelLive_one: '{{count}} etkin',\n panelLive_other: '{{count}} etkin',\n panelArchived_one: '{{count}} arşivlenmiş',\n panelArchived_other: '{{count}} arşivlenmiş',\n panelNotCaptured_one: '{{count}} öğe veri girişi sırasında sunulmuyor',\n panelNotCaptured_other: '{{count}} öğe veri girişi sırasında sunulmuyor',\n locked: 'Kilitli',\n lockedHint:\n 'VKİ hesaplamasında kullanılır; adını veya sırasını değiştirin, ancak kaldırmayın',\n archived: 'Arşivlendi',\n rowActions: '{{name}} işlemleri',\n reorderHandle:\n '{{name}} öğesini yeniden sıralayın. Taşımak için Alt + Yukarı veya Alt + Aşağı tuşuna basın.',\n reorderAnnounce: '{{name}}, {{total}} öğeden {{to}}. konuma taşındı',\n edit: '{{name}} öğesini düzenle',\n editTitle: '{{name}} öğesini düzenle',\n archive: '{{name}} öğesini arşivle',\n restore: '{{name}} öğesini geri yükle',\n addQuestion: 'Soru ekle',\n addSection: 'Bölüm ekle',\n addParameter: 'Parametre ekle',\n addCode: 'Kod ekle',\n sectionEmptyCapture:\n 'Etkin soru yok; bu bölüm veri girişi sırasında sunulmaz.',\n familyHeading: 'Alt kodlar içeren kod grubu: başlıktır, kendisi atanamaz',\n subCodeOf: '{{code}} kodunun alt kodu',\n direction: {\n down: 'Daha düşük olması daha iyi',\n up: 'Daha yüksek olması daha iyi',\n toRange: 'Aralıkta olması daha iyi',\n },\n type: {\n text: 'Kısa yanıt',\n textarea: 'Uzun yanıt',\n numberInteger: 'Sayı (tam sayı)',\n numberDecimal: 'Sayı (ondalık)',\n yesNoDetail: 'Evet / hayır',\n choice: 'Tek seçim',\n choiceWithText: 'Metin alanıyla tek seçim',\n multiChoice: 'Çoklu seçim',\n frequency: 'Haftalık sıklık',\n meal: 'Öğün',\n },\n typeLine: 'Yanıt türü: {{type}}.',\n requiredBadge: 'Zorunlu',\n requiredField: 'Yanıt zorunlu',\n optionsCurrent: 'Seçenekler: {{list}}.',\n keyLine: 'Tanımlayıcı: {{key}}. Oluşturulurken belirlenir ve değişmez.',\n codeLine: 'Kod: {{code}}. Oluşturulurken belirlenir ve değişmez.',\n labelField: 'Etiket',\n labelFieldHelp: 'Standart ifadeyi kullanmak için boş bırakın.',\n helpField: 'Yardım metni',\n addNote:\n 'Serbest biçimli bir kayıt yalnızca bu kliniğe aittir; ortak terim listesine eklenmez.',\n addParameterTitle: 'Parametre ekle',\n addQuestionTitle: '{{section}} bölümüne soru ekle',\n addSectionTitle: 'Bölüm ekle',\n addCodeTitle: 'Hastalık kodu ekle',\n codeField: 'Kod',\n groupField: 'Grup',\n directionField: 'Hangi değişim iyileşme sayılır',\n unitField: 'Birim',\n precisionField: 'Ondalık basamak sayısı',\n rangeMinField: 'Referans alt sınırı',\n rangeMaxField: 'Referans üst sınırı',\n typeField: 'Yanıt türü',\n optionsField: 'Seçenekler',\n optionsFieldHelp: 'Virgülle ayırın; en az bir seçenek girin.',\n parentField: 'Üst kod grubu',\n parentFieldHelp:\n 'Alt kod eklemek, ait olduğu kod grubunu artık doğrudan atanamayan bir başlığa dönüştürür.',\n sectionNeedsQuestion:\n 'Yeni bir bölüm, en az bir etkin soru içerdiğinde ankette görünür.',\n cancel: 'İptal',\n add: 'Ekle',\n },\n common: {\n yes: 'Evet',\n no: 'Hayır',\n unknown: 'Bilinmiyor',\n notSure: 'Emin değilim',\n choose: 'Seçin…',\n details: 'Ayrıntılar',\n detailsPending: '“Evet” yanıtı verildiğinde görünür',\n time: 'Saat',\n whatEaten: 'Ne yediniz?',\n },\n field: {\n coffeeSugar: {\n option: {\n yes: 'Evet',\n no: 'Hayır',\n },\n label: 'Kahvenizi şekerli mi içersiniz?',\n },\n medName: {\n label: 'Ad',\n },\n highlighted: 'İşaretli',\n reasonForVisit: {\n label: 'Başvuru nedeni ve hedefler',\n },\n knownConditions: {\n label: 'Bilinen hastalıklar',\n },\n dailyMedications: {\n label: 'Günlük kullanılan ilaçlar',\n },\n currentSupplements: {\n label: 'Kullanılan takviyeler',\n },\n familyParents: {\n label: 'Anne ve baba',\n },\n familySiblings: {\n label: 'Kardeşler',\n },\n familyGrandparents: {\n label: 'Büyükanne ve büyükbabalar',\n },\n bloating: {\n label: 'Karında şişkinlik',\n },\n refluxGastritis: {\n label: 'Reflü veya gastrit',\n },\n tiredness: {\n label: 'Yorgunluk',\n },\n sleepQuality: {\n label: 'Uyku kalitesi',\n option: {\n good: 'İyi',\n fair: 'Orta',\n poor: 'Kötü',\n },\n },\n sleepDifficulty: {\n label: 'Uykuya dalma güçlüğü veya gece uyanma',\n },\n bowelHabits: {\n label: 'Bağırsak alışkanlıkları',\n option: {\n regular: 'Düzenli',\n constipated: 'Kabızlık',\n diarrhoeal: 'İshal',\n alternating: 'Dönüşümlü',\n },\n },\n menstrualCycle: {\n option: {\n regular: 'Düzenli',\n irregular: 'Düzensiz',\n absent: 'Yok',\n },\n label: 'Adet döngüsü',\n },\n stoolCharacteristics: {\n label: 'Dışkı özellikleri',\n },\n haemorrhoids: {\n label: 'Hemoroid',\n },\n diverticula: {\n label: 'Divertiküller',\n },\n regularUrination: {\n label: 'Düzenli idrara çıkma',\n },\n foodAllergies: {\n label: 'Besin alerjileri',\n },\n drugAllergies: {\n label: 'İlaç alerjileri',\n },\n otherAllergies: {\n label: 'Diğer alerjiler',\n },\n foodIntolerances: {\n label: 'Besin intoleransları',\n },\n smoking: {\n label: 'Sigara kullanımı',\n option: {\n never: 'Hiç',\n former: 'Bırakmış',\n current: 'Kullanıyor',\n },\n },\n fizzyDrinks: {\n option: {\n never: 'Hiç',\n occasionally: 'Ara sıra',\n daily: 'Her gün',\n },\n label: 'Gazlı içecekler',\n },\n alcohol: {\n option: {\n never: 'Hiç',\n occasionally: 'Ara sıra',\n daily: 'Her gün',\n },\n label: 'Alkol',\n },\n pastSurgery: {\n label: 'Geçirilmiş ameliyatlar',\n },\n pregnancies: {\n label: 'Gebelikler',\n },\n weightSelf: {\n label: 'Kilo (kg)',\n },\n heightSelf: {\n label: 'Boy (cm)',\n },\n physicalActivity: {\n label: 'Mevcut fiziksel aktivite',\n },\n lifestyle: {\n label: 'Mevcut yaşam tarzı',\n },\n waterPerDay: {\n label: 'Su (günde litre)',\n },\n coffeePerDay: {\n label: 'Kahve (günde fincan)',\n },\n breakfast: {\n label: 'Kahvaltı',\n },\n morningSnack: {\n label: 'Kuşluk ara öğünü',\n },\n lunch: {\n label: 'Öğle yemeği',\n },\n afternoonSnack: {\n label: 'İkindi ara öğünü',\n },\n dinner: {\n label: 'Akşam yemeği',\n },\n afterDinner: {\n label: 'Akşam yemeğinden sonra',\n },\n pulses: {\n label: 'Baklagiller (haftada kaç kez)',\n },\n fish: {\n label: 'Balık (haftada kaç kez)',\n detailLabel: 'Hangi balıkları tercih edersiniz?',\n },\n eggs: {\n label: 'Yumurta (haftada kaç kez)',\n },\n meatCuredMeat: {\n label: 'Et ve işlenmiş et (haftada kaç kez)',\n detailLabel: 'Kırmızı et mi, beyaz et mi?',\n },\n dairy: {\n label: 'Süt ürünleri (haftada kaç kez)',\n detailLabel: 'Hangi süt ürünlerini tercih edersiniz?',\n },\n visitType: {\n label: 'Muayene türü',\n },\n practitioner: {\n label: 'Sağlık çalışanı',\n },\n tumourType: {\n label: 'Tümör türü',\n },\n stage: {\n label: 'Evre',\n },\n metastases: {\n label: 'Metastazlar',\n },\n treatmentStatus: {\n label: 'Tedavi durumu',\n },\n medDose: {\n label: 'Doz',\n },\n nutritionalProposal: {\n label: 'Beslenme önerisi',\n },\n clinicalNotes: {\n label: 'Klinik notlar',\n },\n annualProposed: {\n label: 'Önerildi',\n },\n annualAccepted: {\n label: 'Kabul edildi',\n },\n annualDeclineReason: {\n label: 'Reddetme nedeni',\n },\n },\n header: {\n name: 'Ad',\n age: 'Yaş',\n dob: 'Doğum tarihi',\n visitDate: 'Muayene tarihi',\n years: '{{age}} yaş',\n },\n origin: {\n fromPatient: 'Hastadan',\n },\n delta: {\n improved: 'İyileşti',\n worsened: 'Kötüleşti',\n unchanged: 'Değişmedi',\n aria: '{{valence}}: {{change}}',\n },\n range: {\n aboveRange: 'Aralığın üzerinde',\n belowRange: 'Aralığın altında',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: 'Antropometrik ölçümler',\n dietary: 'Besin tüketimi',\n lab: 'Kan testleri',\n },\n section: {\n anthropometrics: 'Antropometrik ölçümler',\n dietary: 'Besin tüketimi',\n labs: 'Kan testleri',\n reason: 'Başvuru nedeni',\n pharmacological: 'İlaç kullanım öyküsü',\n familyHistory: 'Aile öyküsü',\n symptoms: 'Belirtiler',\n otherHistory: 'Diğer öykü bilgileri',\n dietaryHistory: 'Beslenme öyküsü',\n recall24h: 'Son 24 saatin besin tüketimi',\n foodFrequency: 'Haftalık besin tüketim sıklığı',\n visitMeta: 'Muayene ayrıntıları',\n patientIntake: 'Hasta ön değerlendirmesi',\n intakeGaps: 'Yanıtlanmamış sorular',\n pathologies: 'Hastalıklar',\n oncological: 'Onkolojik öykü',\n therapy: 'Tedavi ve takviyeler',\n fmd: 'Açlığı taklit eden beslenme programı',\n proposal: 'Beslenme önerisi ve notlar',\n annual: 'Yıllık program',\n evolution: 'Seyir',\n },\n visitType: {\n first: 'İlk muayene',\n followUp: 'Kontrol muayenesi',\n },\n medKind: {\n medication: 'İlaç',\n supplement: 'Takviye',\n },\n compare: {\n category: {\n pathology: 'Hastalıklar',\n measurement: 'Ölçümler',\n therapy: 'Tedavi',\n note: 'Notlar',\n },\n visitsLabel: 'Karşılaştırılan muayeneler',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: '{{total}} muayene karşılaştırılıyor · {{from}} – {{to}}',\n minimum: 'En az iki muayene karşılaştırılmaya devam etmelidir',\n stop: 'Karşılaştırmayı durdur',\n panelTitle: 'Muayeneleri karşılaştır',\n sameVisit:\n 'Değişiklikleri görmek için iki veya daha fazla farklı muayene seçin.',\n summaryTitle: '{{from}} ile {{to}} arasındaki değişiklikler',\n tableLabel: 'Karşılaştırılan muayeneler arasındaki değişiklikler',\n noChanges: 'Bu muayeneler arasında değişiklik yok.',\n noChangesDescription:\n 'Her muayenede aynı ölçümler, kodlar, tedavi ve notlar kaydedilmiş.',\n present: 'Var',\n added: 'Eklendi',\n removed: 'Kaldırıldı',\n changed: 'Değişti',\n notMeasured: 'Ölçülmedi',\n column: {\n item: 'Öğe',\n change: 'Değişim',\n },\n },\n event: {\n category: {\n fmd: 'Açlığı taklit eden beslenme programı',\n therapy: 'Tedavi',\n diet: 'Diyet',\n surgery: 'Cerrahi',\n lifestyle: 'Günlük yaşam',\n },\n barLabel: 'Olaylar',\n chip: '{{label}} · {{date}}',\n separator: ', ',\n shown: 'Gösterilen olay çizgileri: {{list}}',\n noneShown: 'Gösterilen olay çizgisi yok.',\n external: '{{category}} · kaydeden: {{source}}',\n label: {\n dietStart: 'Akdeniz tipi beslenme planına başlandı',\n fmdCycle: 'Açlığı taklit eden beslenme döngüsü',\n gymStart: 'Spor salonuna başlandı',\n chemoStart: 'Kemoterapiye başlandı',\n surgery: 'Safra kesesi ameliyatı',\n },\n source: {\n oncology: 'bu klinik dışındaki bir onkolog',\n },\n },\n intake: {\n title: 'Muayene öncesi anket',\n subtitle: 'Lütfen ilk muayenenizden önce doldurun.',\n sectionsLabel: 'Anket bölümleri',\n answered: 'Yanıtlanan soru: {{answered}} / {{total}}',\n sectionProgress: '{{total}} sorudan {{answered}} tanesi yanıtlandı',\n submit: 'Kaydet',\n unsentNotice: 'Yanıtlarınız bu anketi gönderdiğinizde kaydedilir.',\n submittedNotice: 'Yanıtlar kaydedildi.',\n },\n targets: {\n title: 'Beslenme hedefleri',\n tileLabel: '{{name}} hedefi',\n now: 'Mevcut: {{value}}',\n nowBanded: 'Mevcut: {{value}} · {{band}}',\n nowUnset: 'Henüz ölçülmedi',\n unset: 'Hedef yok',\n status: {\n onTarget: 'Hedefe ulaşıldı',\n approaching: 'Hedefe yaklaşıyor',\n offTarget: 'Hedefin dışında',\n },\n edit: 'Hedefi düzenle: {{parameter}}',\n editTitle: 'Hedef: {{parameter}}',\n editField: 'Yeni hedef',\n bounds: '{{range}} aralığında',\n outOfBounds: '{{range}} aralığında bir hedef girin.',\n unsaved: 'Henüz kaydedilmedi',\n save: 'Hedefi kaydet',\n clear: 'Hedefi temizle',\n },\n summary: {\n fullQuestionnaire: 'Anketin tamamı',\n noAnswers: 'Henüz kaydedilmiş yanıt yok.',\n jump: 'Doldur sekmesinde {{field}} alanını yanıtlayın',\n },\n digest: {\n missing: {\n separator: ', ',\n title_one: '{{count}} zorunlu soru hâlâ yanıtlanmadı',\n title_other: '{{count}} zorunlu soru hâlâ yanıtlanmadı',\n list: 'Hâlâ eksik: {{list}}',\n jump: '{{field}} alanına git',\n },\n group: {\n reason: 'Başvuru nedeni',\n history: 'Hastalıklar ve ilaçlar',\n flags: 'Bildirilen belirtiler',\n habits: 'Günlük alışkanlıklar',\n },\n nothing: {\n title: 'Henüz özetlenecek bilgi yok',\n description:\n 'Şimdiye kadar kaydedilen yanıtlar özete dahil değildir. Okumak için aşağıdaki anketin tamamını açın.',\n },\n },\n grid: {\n parameter: 'Parametre',\n caption: 'Muayenelerdeki parametre değerleri, en eskiden başlayarak.',\n captionInModule:\n '{{module}} muayenelerindeki parametre değerleri, en eskiden başlayarak.',\n target: 'Hedef: {{value}} {{unit}}',\n trendLabel: '{{parameter}} eğilimi',\n trend: 'Eğilim',\n editable: 'Düzenlenebilir',\n editCell: '{{parameter}}: son muayene',\n baselineMerged: '{{total}} ilk muayeneden birleştirildi',\n unlabelledSource: 'Diğer',\n blockVisits_one: '{{count}} muayene',\n blockVisits_other: '{{count}} muayene',\n },\n readOnly: {\n subtitle: 'Tedavi planı kaydı, salt okunur.',\n summary: 'Hasta özeti',\n none: 'Kayıt yok.',\n perWeek: 'Haftalık sıklık: {{times}}',\n },\n pathology: {\n E66: 'Obezite',\n E66_0: 'Aşırı kalori alımına bağlı obezite',\n E66_9: 'Obezite, tanımlanmamış',\n E11: 'Tip 2 diabetes mellitus',\n E11_9: 'Komplikasyonsuz tip 2 diyabet',\n E11_6: 'Belirtilmiş diğer komplikasyonlarla birlikte tip 2 diyabet',\n E78: 'Lipoprotein metabolizması bozuklukları',\n I10: 'Esansiyel hipertansiyon',\n E03: 'Hipotiroidi',\n K58: 'İrritabl bağırsak sendromu',\n D50: 'Demir eksikliği anemisi',\n E55: 'D vitamini eksikliği',\n groupGeneral: 'Genel',\n },\n param: {\n weight: 'Kilo',\n height: 'Boy',\n bmi: 'VKİ',\n waist: 'Bel çevresi',\n hips: 'Kalça çevresi',\n arm: 'Kol çevresi',\n phaseAngle: 'Faz açısı',\n energy: 'Günlük enerji',\n protein: 'Protein',\n fastingGlucose: 'Açlık glukozu',\n hba1c: 'HbA1c',\n totalCholesterol: 'Toplam kolesterol',\n ldl: 'LDL kolesterol',\n hdl: 'HDL kolesterol',\n triglycerides: 'Trigliseritler',\n haemoglobin: 'Hemoglobin',\n vitaminD: 'D vitamini (25-OH)',\n tsh: 'TSH',\n ferritin: 'Ferritin',\n crp: 'C-reaktif protein',\n creatinine: 'Kreatinin',\n },\n questionnaire: {\n noNumeric: {\n title: 'Henüz karşılaştırılacak veri yok',\n description:\n 'Eğilim, anketlerdeki sayısal yanıtları karşılaştırır. Form ayarlarında bir soruya sayı türü ve birim atayın, ardından anketi en az iki kez doldurun.',\n },\n overviewTab: 'Genel bakış',\n },\n empty: {\n noVisits: {\n title: 'Henüz muayene yok',\n description:\n 'İlk muayene kaydedildiğinde değerler ve eğilimler burada görünür.',\n },\n noRecord: {\n title: 'Henüz kayıt yok',\n description:\n 'Bu kayıtta muayene yok. Bilgi kaydetmeye başlamak için ilk muayeneyi ekleyin.',\n create: 'İlk anketi başlat',\n createSigned: 'İmza ile başlat',\n },\n noQuestions: {\n title: 'Yanıtlanacak soru yok',\n description:\n 'Bu ankette etkin soru yok. Klinikten soru etkinleştirmesini isteyin.',\n },\n noParameters: {\n title: 'Ölçüm tanımlanmamış',\n description:\n 'Bu klinikte ölçüm tanımlanmadığından henüz grafikte gösterilecek veri yok.',\n },\n },\n visitNote: {\n title: 'Muayene notları',\n trigger: 'Muayene notları: {{visitType}}, {{date}}',\n openInPanel:\n '{{visitType}}, {{date}} muayenesinin notlarını notlar görünümünde aç',\n },\n rail: {\n notes: 'Notlar ve olaylar',\n empty: 'Bu kayıtta not veya olay yok.',\n eventLabel: 'Olay',\n },\n window: {\n label: 'Gösterilen muayeneler',\n pickerTrigger: 'Muayeneler · {{shown}} / {{total}}',\n selectAll: 'Tümünü seç',\n showing:\n '{{total}} muayeneden {{shown}} tanesi gösteriliyor · {{from}} – {{to}}',\n showingAll: 'Tüm muayeneler: {{total}} · {{from}} – {{to}}',\n minimum: 'En az bir muayene gösterilmeye devam etmelidir',\n optionHasNote: '{{label}} · not',\n },\n },\n} as const;\n","/** Anamnesis interface resources (zh). */\nexport default {\n anamnesis: {\n mainLabel: '病史档案:{{mode}}',\n mode: {\n intake: '病史采集',\n compile: '填写',\n questionnaire: '问卷',\n readOnly: '只读',\n },\n common: {\n yes: '是',\n no: '否',\n unknown: '未知',\n notSure: '不确定',\n choose: '请选择…',\n details: '详情',\n detailsPending: '回答“是”后显示',\n time: '时间',\n whatEaten: '您吃了什么?',\n },\n header: {\n name: '姓名',\n age: '年龄',\n dob: '出生日期',\n visitDate: '就诊日期',\n years: '{{age}} 岁',\n },\n origin: {\n fromPatient: '来自患者',\n },\n delta: {\n improved: '改善',\n worsened: '恶化',\n unchanged: '无变化',\n aria: '{{valence}}:{{change}}',\n },\n range: {\n aboveRange: '高于范围',\n belowRange: '低于范围',\n atMost: '≤ {{value}}',\n atLeast: '≥ {{value}}',\n },\n group: {\n anthropometric: '人体测量',\n dietary: '膳食摄入',\n lab: '血液检查',\n },\n visitType: {\n first: '初诊',\n followUp: '复诊',\n },\n medKind: {\n medication: '药物',\n supplement: '补充剂',\n },\n section: {\n reason: '就诊原因',\n pharmacological: '用药史',\n familyHistory: '家族史',\n symptoms: '症状',\n otherHistory: '其他病史',\n dietaryHistory: '膳食史',\n recall24h: '24 小时膳食回顾',\n foodFrequency: '每周食物摄入频率',\n visitMeta: '就诊详情',\n patientIntake: '患者病史采集',\n intakeGaps: '未回答的问题',\n anthropometrics: '人体测量',\n dietary: '膳食摄入',\n pathologies: '疾病',\n oncological: '肿瘤病史',\n therapy: '治疗与补充剂',\n labs: '血液检查',\n fmd: '模拟禁食方案',\n proposal: '营养建议与备注',\n annual: '年度方案',\n evolution: '变化趋势',\n },\n intake: {\n title: '就诊前问卷',\n subtitle: '请在首次就诊前填写。',\n sectionsLabel: '问卷分区',\n answered: '已回答问题:{{answered}} / {{total}}',\n sectionProgress: '已回答 {{answered}} / {{total}}',\n submit: '保存',\n unsentNotice: '提交此问卷后,您的回答才会被记录。',\n submittedNotice: '回答已保存。',\n },\n compile: {\n tabSummary: '摘要',\n tabCompile: '填写',\n tabEvolution: '变化趋势',\n viewsLabel: '档案视图',\n visitCount: '就诊次数:{{visits}}',\n bmiInStrip: 'BMI 根据体重和身高计算,可在此档案顶部的摘要中查看。',\n gapsIntro: '这些必答问题尚未作答。请与患者确认后记录答案。',\n noIntake: '患者尚未提交问卷。',\n pathologiesLabel: '已关联的疾病',\n pathologiesHelp: '请选择所有适用的编码,患者可同时关联多个编码。',\n pathologiesPlaceholder: '搜索编码…',\n noTherapy: '尚未记录治疗或补充剂。',\n addTherapy: '添加药物',\n removeTherapy: '移除 {{name}}',\n noFmd: '尚未记录模拟禁食周期。',\n cycleNumber: '第 {{number}} 个周期',\n cycleCompleted: '已完成',\n cycleInProgress: '进行中',\n blockEmpty: '尚无记录',\n blockFilled_one: '已记录 {{count}} 项',\n blockFilled_other: '已记录 {{count}} 项',\n blockFlagged_one: '{{count}} 项超出范围',\n blockFlagged_other: '{{count}} 项超出范围',\n blockOutstanding_one: '{{count}} 项待回答',\n blockOutstanding_other: '{{count}} 项待回答',\n blockSettled: '已全部回答',\n addFollowUpVisit: '添加复诊',\n },\n configEditor: {\n title: '病史配置',\n intro:\n '诊所可自行维护条目:重命名、调整顺序、归档或添加。归档不会删除内容,已记录的回答仍保留在历史记录中。',\n tabsLabel: '配置条目集',\n tabQuestionnaire: '问卷',\n tabParameters: '参数',\n tabPathologies: '疾病',\n tabTargets: '目标',\n targetsIntro:\n '选择诊所要作为目标跟踪的参数。它们会显示在档案上方的目标卡片中,您可为每位患者设置目标值,并比较当前值与目标值。',\n panelTracked_one: '{{count}} 项作为目标跟踪',\n panelTracked_other: '{{count}} 项作为目标跟踪',\n panelLive_one: '{{count}} 项已启用',\n panelLive_other: '{{count}} 项已启用',\n panelArchived_one: '{{count}} 项已归档',\n panelArchived_other: '{{count}} 项已归档',\n panelNotCaptured_one: '{{count}} 项不在采集时显示',\n panelNotCaptured_other: '{{count}} 项不在采集时显示',\n locked: '已锁定',\n lockedHint: '用于计算 BMI,可重命名或调整顺序,不可移除',\n archived: '已归档',\n rowActions: '{{name}} 的操作',\n reorderHandle:\n '调整 {{name}} 的顺序。按 Alt + 上方向键或 Alt + 下方向键移动。',\n reorderAnnounce: '{{name}} 已移至第 {{to}} 个位置,共 {{total}} 个',\n edit: '编辑 {{name}}',\n archive: '归档 {{name}}',\n restore: '恢复 {{name}}',\n addQuestion: '添加问题',\n addSection: '添加分区',\n addParameter: '添加参数',\n addCode: '添加编码',\n sectionEmptyCapture: '没有已启用的问题,此分区不会在采集时显示。',\n familyHeading: '包含子编码的分类,仅作为标题,本身不可关联',\n subCodeOf: '{{code}} 的子编码',\n direction: {\n down: '越低越好',\n up: '越高越好',\n toRange: '在范围内更好',\n },\n type: {\n text: '简短回答',\n textarea: '长篇回答',\n numberInteger: '数值(整数)',\n numberDecimal: '数值(小数)',\n yesNoDetail: '是 / 否',\n choice: '单选',\n choiceWithText: '单选并附文字说明',\n multiChoice: '多选',\n frequency: '每周频率',\n meal: '餐食',\n },\n typeLine: '回答类型:{{type}}。',\n requiredBadge: '必填',\n requiredField: '必须回答',\n optionsCurrent: '选项:{{list}}。',\n editTitle: '编辑 {{name}}',\n keyLine: '标识符:{{key}},创建时设置,此后不可更改。',\n codeLine: '编码:{{code}},创建时设置,此后不可更改。',\n labelField: '标签',\n labelFieldHelp: '留空以使用标准文本。',\n helpField: '帮助文本',\n addNote: '自由添加的条目仅用于本诊所,不会加入共享条目集。',\n addParameterTitle: '添加参数',\n addQuestionTitle: '向 {{section}} 添加问题',\n addSectionTitle: '添加分区',\n addCodeTitle: '添加疾病编码',\n codeField: '编码',\n groupField: '分组',\n directionField: '改善方向',\n unitField: '单位',\n precisionField: '小数位数',\n rangeMinField: '参考下限',\n rangeMaxField: '参考上限',\n typeField: '回答类型',\n optionsField: '选项',\n optionsFieldHelp: '用逗号分隔,至少填写一个选项。',\n parentField: '上级分类',\n parentFieldHelp: '添加子编码后,其上级分类将变为标题,本身不再可关联。',\n sectionNeedsQuestion:\n '新分区至少包含一个已启用的问题后,才会显示在问卷中。',\n selectPlaceholder: '请选择…',\n save: '保存',\n cancel: '取消',\n add: '添加',\n },\n targets: {\n title: '营养目标',\n tileLabel: '{{name}}目标',\n now: '当前 {{value}}',\n nowBanded: '当前 {{value}} · {{band}}',\n nowUnset: '尚未测量',\n unset: '无目标',\n status: {\n onTarget: '已达标',\n approaching: '接近目标',\n offTarget: '未达标',\n },\n edit: '编辑目标:{{parameter}}',\n editTitle: '目标:{{parameter}}',\n editField: '新目标',\n bounds: '范围:{{range}}',\n outOfBounds: '请输入 {{range}} 范围内的目标。',\n unsaved: '尚未保存',\n save: '保存目标',\n clear: '清除目标',\n },\n summary: {\n fullQuestionnaire: '完整问卷',\n noAnswers: '尚未记录任何回答。',\n jump: '在“填写”标签页回答 {{field}}',\n },\n compare: {\n visitsLabel: '参与比较的就诊',\n visitOption: '{{index}}. {{visitType}} · {{date}}',\n visitOptionSource: '{{label}} · {{source}}',\n selected: '正在比较 {{total}} 次就诊 · {{from}} – {{to}}',\n minimum: '至少需保留两次就诊进行比较',\n stop: '停止比较',\n panelTitle: '比较就诊记录',\n sameVisit: '请选择至少两次不同的就诊,查看变化。',\n summaryTitle: '从 {{from}} 到 {{to}} 的变化',\n tableLabel: '所比较就诊记录之间的变化',\n noChanges: '这些就诊记录之间没有变化。',\n noChangesDescription: '每次记录的测量值、编码、治疗和备注均相同。',\n present: '有',\n added: '已添加',\n removed: '已移除',\n changed: '已更改',\n notMeasured: '未测量',\n category: {\n measurement: '测量值',\n pathology: '疾病',\n therapy: '治疗',\n note: '备注',\n },\n column: {\n item: '项目',\n change: '变化',\n },\n },\n event: {\n barLabel: '事件',\n chip: '{{label}} · {{date}}',\n separator: '、',\n shown: '已显示的事件线:{{list}}',\n noneShown: '未显示事件线。',\n external: '{{category}} · 由 {{source}} 记录',\n category: {\n therapy: '治疗',\n diet: '饮食',\n fmd: '模拟禁食方案',\n surgery: '手术',\n lifestyle: '日常生活',\n },\n label: {\n dietStart: '开始地中海饮食方案',\n fmdCycle: '模拟禁食周期',\n gymStart: '开始健身',\n chemoStart: '开始化疗',\n surgery: '胆囊手术',\n },\n source: {\n oncology: '本诊所以外的肿瘤科医生',\n },\n },\n grid: {\n parameter: '参数',\n caption: '各次就诊的参数值,按时间从早到晚排列。',\n captionInModule: '{{module}} 各次就诊的参数值,按时间从早到晚排列。',\n target: '目标 {{value}} {{unit}}',\n trendLabel: '{{parameter}}趋势',\n trend: '趋势',\n editable: '可编辑',\n editCell: '{{parameter}}:最近一次就诊',\n baselineMerged: '合并自 {{total}} 次初诊',\n unlabelledSource: '其他',\n blockVisits_one: '{{count}} 次就诊',\n blockVisits_other: '{{count}} 次就诊',\n },\n readOnly: {\n subtitle: '诊疗计划档案,只读。',\n summary: '患者摘要',\n none: '暂无记录。',\n perWeek: '每周次数:{{times}}',\n },\n pathology: {\n E66: '肥胖症',\n E66_0: '热量摄入过多引起的肥胖症',\n E66_9: '未特指的肥胖症',\n E11: '2 型糖尿病',\n E11_9: '2 型糖尿病,无并发症',\n E11_6: '2 型糖尿病,伴其他特指的并发症',\n E78: '脂蛋白代谢紊乱',\n I10: '原发性高血压',\n E03: '甲状腺功能减退症',\n K58: '肠易激综合征',\n D50: '缺铁性贫血',\n E55: '维生素 D 缺乏',\n groupGeneral: '常规',\n },\n param: {\n weight: '体重',\n height: '身高',\n bmi: 'BMI',\n waist: '腰围',\n hips: '臀围',\n arm: '臂围',\n phaseAngle: '相位角',\n energy: '每日能量摄入',\n protein: '蛋白质',\n fastingGlucose: '空腹血糖',\n hba1c: 'HbA1c',\n totalCholesterol: '总胆固醇',\n ldl: '低密度脂蛋白胆固醇(LDL)',\n hdl: '高密度脂蛋白胆固醇(HDL)',\n triglycerides: '甘油三酯',\n haemoglobin: '血红蛋白',\n vitaminD: '维生素 D(25-OH)',\n tsh: 'TSH',\n ferritin: '铁蛋白',\n crp: 'C 反应蛋白',\n creatinine: '肌酐',\n },\n field: {\n highlighted: '重点标记',\n reasonForVisit: {\n label: '就诊原因与目标',\n },\n knownConditions: {\n label: '已知疾病',\n },\n dailyMedications: {\n label: '每日用药',\n },\n currentSupplements: {\n label: '目前使用的补充剂',\n },\n familyParents: {\n label: '父母',\n },\n familySiblings: {\n label: '兄弟姐妹',\n },\n familyGrandparents: {\n label: '祖父母与外祖父母',\n },\n bloating: {\n label: '腹胀',\n },\n refluxGastritis: {\n label: '反流或胃炎',\n },\n tiredness: {\n label: '疲劳',\n },\n sleepQuality: {\n label: '睡眠质量',\n option: {\n good: '良好',\n fair: '一般',\n poor: '较差',\n },\n },\n sleepDifficulty: {\n label: '入睡困难或夜间醒来',\n },\n bowelHabits: {\n label: '排便习惯',\n option: {\n regular: '规律',\n constipated: '便秘',\n diarrhoeal: '腹泻',\n alternating: '交替出现',\n },\n },\n stoolCharacteristics: {\n label: '大便性状',\n },\n haemorrhoids: {\n label: '痔疮',\n },\n diverticula: {\n label: '憩室',\n },\n regularUrination: {\n label: '排尿规律',\n },\n menstrualCycle: {\n label: '月经周期',\n option: {\n regular: '规律',\n irregular: '不规律',\n absent: '无月经',\n },\n },\n foodAllergies: {\n label: '食物过敏',\n },\n drugAllergies: {\n label: '药物过敏',\n },\n otherAllergies: {\n label: '其他过敏',\n },\n foodIntolerances: {\n label: '食物不耐受',\n },\n smoking: {\n label: '吸烟',\n option: {\n never: '从不吸烟',\n former: '既往吸烟',\n current: '目前吸烟',\n },\n },\n pastSurgery: {\n label: '手术史',\n },\n pregnancies: {\n label: '妊娠史',\n },\n weightSelf: {\n label: '体重(kg)',\n },\n heightSelf: {\n label: '身高(cm)',\n },\n physicalActivity: {\n label: '目前的身体活动',\n },\n lifestyle: {\n label: '目前的生活方式',\n },\n waterPerDay: {\n label: '饮水量(升/日)',\n },\n fizzyDrinks: {\n label: '碳酸饮料',\n option: {\n never: '从不',\n occasionally: '偶尔',\n daily: '每天',\n },\n },\n alcohol: {\n label: '饮酒',\n option: {\n never: '从不',\n occasionally: '偶尔',\n daily: '每天',\n },\n },\n coffeePerDay: {\n label: '咖啡(杯/日)',\n },\n coffeeSugar: {\n label: '喝咖啡时加糖吗?',\n option: {\n yes: '是',\n no: '否',\n },\n },\n breakfast: {\n label: '早餐',\n },\n morningSnack: {\n label: '上午加餐',\n },\n lunch: {\n label: '午餐',\n },\n afternoonSnack: {\n label: '下午加餐',\n },\n dinner: {\n label: '晚餐',\n },\n afterDinner: {\n label: '晚餐后',\n },\n pulses: {\n label: '豆类(次/周)',\n },\n fish: {\n label: '鱼类(次/周)',\n detailLabel: '您偏好哪种鱼?',\n },\n eggs: {\n label: '蛋类(次/周)',\n },\n meatCuredMeat: {\n label: '肉类与腌制肉类(次/周)',\n detailLabel: '红肉还是白肉?',\n },\n dairy: {\n label: '乳制品(次/周)',\n detailLabel: '您偏好哪种乳制品?',\n },\n visitType: {\n label: '就诊类型',\n },\n practitioner: {\n label: '接诊人员',\n },\n tumourType: {\n label: '肿瘤类型',\n },\n stage: {\n label: '分期',\n },\n metastases: {\n label: '转移',\n },\n treatmentStatus: {\n label: '治疗状态',\n },\n medName: {\n label: '名称',\n },\n medDose: {\n label: '剂量',\n },\n nutritionalProposal: {\n label: '营养建议',\n },\n clinicalNotes: {\n label: '临床记录',\n },\n annualProposed: {\n label: '已提出',\n },\n annualAccepted: {\n label: '已接受',\n },\n annualDeclineReason: {\n label: '拒绝原因',\n },\n },\n questionnaire: {\n noNumeric: {\n title: '暂无可比较的数据',\n description:\n '趋势图用于比较不同问卷中的数值回答。请在表单设置中将问题类型设为数值并指定单位,然后至少填写两次。',\n },\n overviewTab: '概览',\n },\n empty: {\n noVisits: {\n title: '暂无就诊记录',\n description: '记录首次就诊后,数值和趋势将显示在此处。',\n },\n noRecord: {\n title: '尚无记录',\n description: '此档案尚无就诊记录。请添加首次就诊以开始记录信息。',\n create: '开始填写第一份问卷',\n createSigned: '开始并要求签名',\n },\n noQuestions: {\n title: '没有需要回答的问题',\n description: '此问卷没有已启用的问题。请让诊所启用问题。',\n },\n noParameters: {\n title: '尚未配置测量项',\n description: '此诊所尚未配置测量项,因此暂时无法绘制图表。',\n },\n },\n visitNote: {\n title: '就诊备注',\n trigger: '就诊备注:{{visitType}},{{date}}',\n openInPanel: '在备注视图中打开就诊备注:{{visitType}},{{date}}',\n },\n rail: {\n notes: '备注与事件',\n empty: '此档案没有备注或事件。',\n eventLabel: '事件',\n },\n window: {\n label: '显示的就诊记录',\n pickerTrigger: '就诊:{{shown}} / {{total}}',\n selectAll: '全选',\n showing: '显示 {{shown}} / {{total}} 次就诊 · {{from}} – {{to}}',\n showingAll: '全部就诊:{{total}} 次 · {{from}} – {{to}}',\n minimum: '至少需保留一次就诊显示',\n optionHasNote: '{{label}} · 备注',\n },\n digest: {\n group: {\n reason: '就诊原因',\n history: '疾病与用药',\n flags: '报告的症状',\n habits: '日常习惯',\n },\n nothing: {\n title: '暂无可摘要的内容',\n description: '目前记录的回答不属于摘要范围。请打开下方的完整问卷查看。',\n },\n missing: {\n title_one: '{{count}} 个必答问题尚未回答',\n title_other: '{{count}} 个必答问题尚未回答',\n list: '仍缺少:{{list}}',\n separator: '、',\n jump: '转到 {{field}}',\n },\n },\n export: {\n tab: {\n summary: '摘要',\n compile: '填写',\n evolution: '变化趋势',\n },\n docTab: {\n summary: '问卷摘要',\n compile: '就诊记录',\n evolution: '变化趋势',\n },\n docTitle: '{{tab}}:{{patient}}',\n info: '文档详情',\n generated: '生成时间',\n audienceLabel: '副本接收方',\n audience: {\n clinician: '诊所',\n patient: '患者',\n external: '外部专业人员',\n },\n visitsLabel: '包含的就诊记录',\n visitsSelected: '{{shown}} / {{total}}',\n visitsAll: '全部 {{total}} 次',\n withheld: '此副本不包含部分临床详情。',\n none: '尚无记录。',\n listSeparator: '、',\n flagged: '{{date}}({{flag}})',\n source: {\n patient: '患者',\n clinician: '临床医务人员',\n },\n column: {\n question: '问题',\n answer: '回答',\n source: '来源',\n field: '字段',\n value: '值',\n unit: '单位',\n referenceRange: '参考范围',\n flag: '标记',\n target: '目标',\n change: '变化 {{from}} → {{to}}',\n outOfRange: '超出范围',\n code: '编码',\n description: '描述',\n name: '名称',\n dose: '剂量',\n kind: '类型',\n cycle: '周期',\n startDate: '开始日期',\n status: '状态',\n notes: '备注',\n note: '备注',\n text: '文本',\n },\n control: {\n trigger: '导出与分享',\n triggerLabel: '导出与分享{{tab}}视图',\n triggerLabelAudience: '导出与分享{{tab}}视图,{{audience}}',\n audienceBadge: '患者副本',\n menuLabel: '{{tab}}视图',\n everyVisit: '包含每次就诊,而非仅包含当前显示的列',\n excludes: '患者副本不包含:{{list}}',\n excludesNone: '此视图的患者副本不省略任何内容。',\n holds: '诊所副本包含完整档案,包括 {{list}}。',\n holdsNone: '此视图没有需要在患者副本中省略的内容。',\n share: '分享…',\n pdf: '下载 PDF',\n print: '打印',\n xlsx: '下载 Excel(.xlsx)',\n csv: '下载 CSV(.csv)',\n printFrame: '打印文档(无可见内容)',\n printing: '正在为此文档打开打印对话框。',\n ready: '{{file}} 已就绪。',\n failed: '此浏览器无法生成文件。',\n },\n share: {\n title: '分享{{tab}}视图',\n mockBadge: '仅供预览',\n subtitle: '选择副本的接收方,预览其将包含的内容。',\n noticeTitle: '此页面不会发送任何内容',\n notice:\n '此预览仅展示分享的形式,不会实际分享。实际分享需要带签名且会到期的链接、患者同意,以及谁通过何种渠道收到哪些内容的记录。这些均由本档案之外的功能负责。',\n audienceLabel: '此副本的接收方是谁?',\n includes: '此副本将包含',\n includesNone: '此视图不会为该接收方生成文档。',\n excludes: '此副本将省略',\n excludesNone: '此副本不省略任何内容。',\n cancel: '取消',\n confirm: '确认接收方',\n confirmed: '接收方已设为{{audience}}。未发送任何内容。',\n },\n concept: {\n patient_identity: '患者身份信息',\n intake_answers: '问卷回答',\n visit_date: '就诊日期',\n visit_type: '就诊类型',\n visit_practitioner: '接诊人员',\n visit_reasonCode: '就诊原因编码',\n anthropometrics_values: '人体测量数据',\n dietary_intake: '膳食摄入',\n derived_bmi: 'BMI',\n lab_values: '血液检查数值',\n pathology_codes: '诊断编码',\n oncological_history: '肿瘤病史',\n therapy_entries: '治疗与补充剂',\n fmd_cycles: '模拟禁食周期',\n annual_programme: '年度方案',\n notes_clinicalNotes: '临床记录',\n notes_nutritionalProposal: '营养建议',\n symptom_observations: '临床观察',\n compare_diff: '就诊比较',\n visit_note: '就诊备注',\n event_timeline: '临床事件时间线',\n export_tabDocument: '文档本身',\n export_workbook: '完整档案工作簿',\n },\n },\n },\n} as const;\n","/** Anamnesis owns its translations in the patterns namespace.\n * Registration preserves host overrides and never initialises the host. */\nimport type { i18n as I18nInstance } from 'i18next';\nimport ar from './locales/ar.ts';\nimport de from './locales/de.ts';\nimport el from './locales/el.ts';\nimport en from './locales/en.ts';\nimport es from './locales/es.ts';\nimport fr from './locales/fr.ts';\nimport hi from './locales/hi.ts';\nimport it from './locales/it.ts';\nimport ja from './locales/ja.ts';\nimport nl from './locales/nl.ts';\nimport pl from './locales/pl.ts';\nimport pt from './locales/pt.ts';\nimport ro from './locales/ro.ts';\nimport ru from './locales/ru.ts';\nimport sq from './locales/sq.ts';\nimport sv from './locales/sv.ts';\nimport tr from './locales/tr.ts';\nimport zh from './locales/zh.ts';\n\nexport const PATTERN_NS = 'patterns';\nconst BUNDLES = {\n ar,\n de,\n el,\n en,\n es,\n fr,\n hi,\n it,\n ja,\n nl,\n pl,\n pt,\n ro,\n ru,\n sq,\n sv,\n tr,\n zh,\n};\n\n/** Deep-merge missing keys without replacing host translations. */\nexport function registerAnamnesisBundles(i18n: I18nInstance): void {\n for (const [locale, bundle] of Object.entries(BUNDLES)) {\n i18n.addResourceBundle(locale, PATTERN_NS, bundle, true, false);\n }\n}\n","/* -------------------------------------------------------------------- */\n/* Anamnesis pattern — AnamnesisSummaryCard rows */\n/* */\n/* Maps intake definitions + one or more responses to the label/value */\n/* rows `AnamnesisSummaryCard` renders. The card is data-agnostic (it */\n/* owns layout, icons, i18n, a11y); this is where the pattern's vocabu- */\n/* lary — highlight rules, sex relevance, answer formatting — becomes */\n/* rows. Two callers: the Overview tab (one card combining each module's */\n/* latest interview, so `sources` has one entry per module) and the */\n/* archive table (one card for a single interview, one source). */\n/* */\n/* Sits beside `anamnesis-summary.tsx` (the Summary TAB) under its own */\n/* name because a `.ts` twin of that file would shadow it on import. */\n/* -------------------------------------------------------------------- */\n\nimport type { TFunction } from 'i18next';\nimport type {\n AnamnesisSummaryAnswer,\n AnamnesisSummarySection,\n} from '../../components/anamnesis-summary-card';\nimport { hasClockTime } from './anamnesis-derive';\nimport {\n formatIntakeAnswer,\n intakeFieldLabel,\n isIntakeAnswered,\n parseCalendarDate,\n sectionLabel,\n} from './anamnesis-format';\nimport { isHighlightedAnswer } from './anamnesis-highlight';\nimport type {\n IntakeAnswer,\n IntakeFieldDef,\n IntakeResponse,\n IntakeSectionDef,\n PatientSex,\n} from './anamnesis-types';\n\nexport interface SummarySource {\n response: IntakeResponse;\n /** Module name shown as the answer's source (combined view). */\n sourceLabel?: string;\n /** Overrides `response.submittedAtIso` as the \"recorded\" stamp. */\n reportedAtIso?: string;\n}\n\nexport interface SummarySectionsResult {\n sections: AnamnesisSummarySection[];\n /** Fields nobody answered (after the relevance skip). */\n unansweredCount: number;\n}\n\n/** The instant a source's stamp denotes, for latest-wins ordering. A bare\n * `YYYY-MM-DD` is a LOCAL calendar day — `new Date(iso)` would read it as\n * UTC midnight and lose a day west of Greenwich; a `YYYY-MM-DDTHH:mm` string\n * is a local instant and a zoned ISO string carries its own offset, so both\n * go through `Date`. An unreadable stamp is no stamp. */\nfunction stampInstant(iso: string | undefined): number | undefined {\n if (!iso) return undefined;\n const time = hasClockTime(iso)\n ? new Date(iso).getTime()\n : parseCalendarDate(iso)?.getTime();\n return time == null || Number.isNaN(time) ? undefined : time;\n}\n\nfunction stampOf(source: SummarySource): string | undefined {\n return source.reportedAtIso ?? source.response.submittedAtIso;\n}\n\ninterface Chosen {\n answer: IntakeAnswer;\n source: SummarySource;\n}\n\n/** The source whose answer to `key` is the freshest: only answered sources\n * count; a stamped source beats an unstamped one; among stamped sources the\n * latest stamp wins; ties (and unstamped vs unstamped) go to the later entry\n * in `sources`. */\nfunction latestAnswered(\n key: string,\n sources: readonly SummarySource[],\n): Chosen | undefined {\n let best: Chosen | undefined;\n let bestInstant = Number.NEGATIVE_INFINITY;\n for (const source of sources) {\n const answer = source.response.answers[key]?.value;\n if (!answer || !isIntakeAnswered(answer)) continue;\n const instant = stampInstant(stampOf(source)) ?? Number.NEGATIVE_INFINITY;\n if (instant >= bestInstant) {\n best = { answer, source };\n bestInstant = instant;\n }\n }\n return best;\n}\n\nfunction relevantTo(def: IntakeFieldDef, sex: PatientSex | undefined): boolean {\n const relevance = def.relevance ?? 'any';\n return sex === undefined || relevance === 'any' || relevance === sex;\n}\n\nfunction rowFor(\n def: IntakeFieldDef,\n chosen: Chosen,\n t: TFunction,\n): AnamnesisSummaryAnswer {\n const row: AnamnesisSummaryAnswer = {\n id: def.key,\n label: intakeFieldLabel(def, t),\n value: formatIntakeAnswer(chosen.answer, def, t),\n highlighted: isHighlightedAnswer(def, chosen.answer),\n };\n if (def.unit) row.unit = def.unit;\n const stamp = stampOf(chosen.source);\n if (stamp) row.reportedAtIso = stamp;\n if (chosen.source.sourceLabel) row.sourceLabel = chosen.source.sourceLabel;\n return row;\n}\n\n/** Maps intake definitions + one or more responses to summary rows.\n *\n * For every field the answered sources compete and the one with the LATEST\n * stamp (`reportedAtIso ?? response.submittedAtIso`) supplies the row —\n * `latestAnswered` spells out the ordering. The row carries the chosen\n * source's stamp and label so the card's HeartPulse tooltip can say when,\n * and from which module, a highlighted answer was recorded.\n *\n * Fields irrelevant to `opts.sex` (a `relevance` that is set, not `any`, and\n * differs) are skipped entirely and not counted; with no sex given nothing\n * is skipped, so an answered question is never silently dropped. Fields\n * nobody answered increment `unansweredCount`. Sections with no rows are\n * dropped. */\nexport function summarySectionsFromRecord(\n sections: readonly IntakeSectionDef[],\n sources: readonly SummarySource[],\n t: TFunction,\n opts?: { sex?: PatientSex },\n): SummarySectionsResult {\n const out: AnamnesisSummarySection[] = [];\n let unansweredCount = 0;\n for (const section of sections) {\n const answers: AnamnesisSummaryAnswer[] = [];\n for (const def of section.fields) {\n if (!relevantTo(def, opts?.sex)) continue;\n const chosen = latestAnswered(def.key, sources);\n if (!chosen) {\n unansweredCount += 1;\n continue;\n }\n answers.push(rowFor(def, chosen, t));\n }\n if (answers.length === 0) continue;\n out.push({\n id: section.key,\n heading: sectionLabel(section, t),\n answers,\n });\n }\n return { sections: out, unansweredCount };\n}\n"],"names":["__iconNode","ArchiveRestore","createLucideIcon","Archive","SendHorizontal","ANTHRO_PARAMETERS","LAB_PARAMETERS","DIETARY_PARAMETERS","ALL_NUMERIC_PARAMETERS","PARAMETER_BY_KEY","p","PATHOLOGY_TAXONOMY","pathologyLabelKey","code","c","INTAKE_SECTIONS","s","f","LOCKED_PARAMETER_KEYS","isParameterLocked","key","isParameterTargetable","keyOrDef","def","_a","TARGETABLE_PARAMETER_KEYS","SEEDED_ANAMNESIS_CONFIG","resolveConfig","config","ordered","list","item","index","b","entry","isLive","descriptor","stampLock","locked","orderedParameters","groups","group","configuredParameters","live","scoped","allParametersIncludingArchived","all","orderedSection","section","configuredSections","allSectionsIncludingArchived","configuredPathologies","allPathologiesIncludingArchived","pathologyLookup","assignablePathologyCodes","child","ANTHRO_FIELD_BY_KEY","CALENDAR_DATE_FORMAT","CALENDAR_DATETIME_FORMAT","CLOCK_TIME_RE","CALENDAR_DAY_RE","hasClockTime","iso","calendarDayOf","calendarFormatFor","computeBmi","weightKg","heightCm","kitComputeBmi","isReadableDate","ageAt","dobIso","referenceIso","dob","ref","age","monthDiff","DIETARY_STORAGE_KEYS","parameterStorage","readNumber","value","parameterValueAt","visit","hit","d","l","latestParameterValue","visits","upsertMeasurement","parameterKey","setNumericOnVisit","storage","setTargetOnRecord","record","target","usable","targets","outOfRange","range","rangeDistance","deltaInfo","current","previous","abs","direction","valence","before","after","buildParameterRows","defs","targetByKey","t","cells","series","roundTo","precision","factor","latestVisit","ABSENT_VALUE","numberFormatters","numberFormatter","locale","formatter","formatValue","formatCalendarDate","formatCalendarDateTime","formatDelta","rounded","fieldVisible","sex","relevance","localeOf","lng","visitDateLabel","parseCalendarDate","y","m","clockSuffix","toCalendarIso","date","pad","n","visitOptionLabel","hasNote","base","label","ageLabel","dateOfBirthIso","patientAgeLabel","reference","practiceLabel","trimmed","parameterLabel","parameterLabelWithUnit","intakeFieldLabel","intakeFieldLabelWithUnit","intakeFieldHelp","practice","sectionLabel","pathologyLabel","pathologyCodeWithLabel","isIntakeAnswered","answer","formatIntakeAnswer","yn","selectedLabel","opt","DIGEST_GROUPS","visibleFields","sections","field","itemFor","read","flagItems","fields","out","buildIntakeDigest","byKey","items","answered","missingMandatoryAnswers","FOCUSABLE_CONTROL","focusIntakeField","root","host","control","MAX_JUMP_FRAMES","useFieldJump","containerRef","useRef","pending","setPending","useState","useEffect","frames","raf","attempt","requestJump","useCallback","AnamnesisMissingAnswers","missing","onJump","announce","jumpKey","first","separator","jsxs","Alert","jsx","Button","DigestGroupBlock","DescriptionList","AnamnesisDigest","digest","EmptyState","deltaVariants","cva","DeltaIndicator","delta","Icon","ArrowUp","ArrowDown","Minus","changeText","valenceLabel","OriginMarker","Badge","User","OutOfRangeBadge","flag","compact","TREND_COLOUR","TrendSparkline","annotations","onSelectAnnotation","measured","overall","Sparkline","TRIGGER_FOCUS_RING","AnamnesisAnswerList","intake","blocks","sourced","AnamnesisSummary","Fragment","Collapsible","CollapsibleTrigger","ChevronDown","CollapsibleContent","EVERY_VISIT_BLOCKS","OCCASIONAL_BLOCKS","filledText","oncologicalFill","onc","filled","labValues","labDefs","lab","hits","annualFill","annual","compileBlockDensity","labs","firstVisit","fills","flags","density","id","BASELINE_VISIT_ID","visitSortKey","byDay","finite","ANTHRO_KEYS","mergeMeasurements","lists","merged","at","mergeText","texts","kept","text","firstDefined","values","isBaselineVisit","resolveBaseline","keepId","folds","firsts","same","sources","a","anthropometrics","source","intakeLists","pathologyCodes","therapy","baseline","rest","EVENT_SHAPE","EVENT_TONE","eventPosition","event","spans","instant","times","i","from","to","within","eventMarks","events","position","eventLabel","eventDetail","category","eventAnnotations","marks","activeIds","mark","AnamnesisEventBar","onToggle","labelId","useId","detailId","active","pressed","AnnotationMarker","NOTE_FIELDS","visitNotes","hasVisitNotes","AnamnesisVisitNoteList","note","NOTE_SCROLL_CLASS","AnamnesisVisitNote","defaultOpen","onOpenNote","visitTypeLabel","dateLabel","triggerLabel","IconButton","NotebookPen","Popover","Timestamp","MATRIX_IDENTITY_CLASS","MATRIX_VISIT_COLUMN_CLASS","MATRIX_TREND_COLUMN_CLASS","IDENTITY_HEADER_CLASS","COLUMN_HEADER_CLASS","TRAILING_HEADER_CLASS","MATRIX_CELL_CLASS","MatrixVisitHeader","column","emphasised","editable","defaultOpenNoteVisitId","withNote","mergedFrom","headerClass","AnamnesisMatrix","captionId","caption","identityLabel","trendLabel","trendTestId","visitHeaders","trailingLabel","trailingTestId","rows","framed","testId","columnCount","row","_b","defaultSelectedVisitIds","v","windowVisits","selectedIds","options","pinned","shown","columns","pinnedShown","pinnedTotal","shownCount","totalCount","allVisitColumns","visitPickerIsUseful","UNMEASURED_CELL","deltaIsLegible","formatBound","bound","decimals","formatRange","AnamnesisEvolutionGrid","editableVisitId","onCellChange","visitColumns","capturableKeys","baselineSources","groupBanners","editableId","renderedRows","lastGroup","rangeText","valueCells","columnIndex","cell","isEditableVisit","capturable","editableCell","deltaHidden","NumberInput","next","UNLABELLED_BLOCK_KEY","WHOLE_RECORD_BLOCK_KEY","wholeRecordBlock","partitionVisitsBySource","unlabelledLabel","block","sortKey","oldest","measuredParameters","keep","unionShownVisitIds","reports","seen","union","report","AnamnesisEvolution","partitionBySource","cardBlocks","onVisitSelectionChange","exportSlot","blockProps","allDefs","useMemo","unlabelled","views","compiling","shownByBlock","reportBlock","ids","reporters","blockRecord","EvolutionBlock","useShownVisitIds","setIds","track","prev","heading","carded","defaultVisitIds","defaultEventIds","toolbarEnd","merge","pickable","view","pinnedIds","headingId","readoutId","refusalNote","setRefusalNote","pickedVisitIds","setPickedVisitIds","pickerUseful","selectedVisitIds","visitWindow","shownVisitIds","visitItems","offset","allShown","triggerText","refuseFloor","setVisitShown","visitId","selectAllVisits","windowReadout","parts","pickedEventIds","setPickedEventIds","activeEventIds","drawable","toggleEvent","eventId","selectAnnotation","DropdownMenu","checked","Card","CLINICIAN_ONLY","CLINICIAN_AND_PATIENT","DISCLOSURE_RULES","RULE_BY_ID","rule","disclosedTo","audience","DOCUMENT_CONCEPT","allow","gate","conceptId","parameterConcept","sectionRow","textCell","referenceRangeText","flagText","slugify","calendarPart","day","buildFileStem","tab","namesDisclosed","name","audienceLabel","tabLabel","docTabLabel","baseMeta","generatedAtIso","meta","patientName","documentTitle","tabText","refusedDocument","finish","document","extraFootnotes","withheld","footnotes","buildSummaryExport","tables","measurementTable","title","withRange","anyAllowed","fieldValueTable","buildCompileExport","visitRows","anthro","dietary","lookup","present","site","cycle","yesNo","noteRows","outOfRangeText","flagged","windowChange","last","buildEvolutionExport","scope","passed","parameterRows","fromDate","toDate","tableColumns","buildAnamnesisExport","conceptLabel","documentDisclosure","table","CSV_MIME","CSV_EOL","CSV_INJECTION","decimalSeparatorFor","part","csvDialectFor","formatCsvNumber","dialect","escapeCsvText","raw","guarded","csvCell","cellPrecision","toCsv","lines","push","toCsvBlob","body","sheetName","used","cleaned","suffix","numberFormatFor","MIN_COLUMN_WIDTH","MAX_COLUMN_WIDTH","columnWidth","header","longest","max","toXlsxBlob","writeExcelFile","bold","infoData","sheets","data","format","exportFileName","downloadBlob","blob","filename","url","anchor","downloadCsv","doc","downloadXlsx","PDF_FALLBACK","resolveTokenRgb","varName","fallback","probe","computed","match","pdfPalette","WINANSI_SUBSTITUTIONS","pdfSafeText","MARGIN","WIDE_TABLE_COLUMNS","TITLE_SIZE","META_SIZE","TABLE_TITLE_SIZE","BODY_SIZE","FOOTNOTE_SIZE","LINE","isWide","formatNumber","numberLocale","canonicalLocale","cellText","rowText","toPdfBlob","jsPDF","autoTable","palette","pageWidth","pageHeight","contentWidth","setFace","weight","size","colour","cursorY","line","sectionRows","capture","settings","stamp","pages","page","downloadPdf","printPdf","frame","OFFERED_AUDIENCES","AnamnesisExportMenu","defaultShareOpen","defaultAudience","setAudience","everyVisit","setEveryVisit","menuOpen","setMenuOpen","shareOpen","setShareOpen","shareAudience","setShareAudience","status","setStatus","rootRef","frameRef","printUrlRef","busyRef","describedById","build","forAudience","tabName","audienceBadge","patientExcluded","disclosureLine","sharePreview","say","run","write","ok","handlePdf","handleXlsx","handleCsv","handlePrint","openShare","confirmShare","option","Share2","FileText","Printer","FileSpreadsheet","Download","AnamnesisShareDialog","open","onOpenChange","onAudienceChange","preview","onConfirm","Dialog","RadioGroup","Radio","DisclosureList","emptyText","isHighlightedAnswer","timeToValue","time","h","valueToTime","isDetailVisible","HIGHLIGHT_WORDS_SR_ONLY","HIGHLIGHT_CHIP_COMPACT","HIGHLIGHT_CHIP_ALIGN","DECIMAL_NUMBER_FIELDS","CONTROL_MEASURE","numberInline","AnamnesisField","onChange","showOrigin","origin","readOnly","className","description","showMarker","highlighted","highlightLabel","labelStart","HeartPulse","labelEnd","FormField","StateBackedTextInput","e","TextArea","perWeek","detail","TextInput","selected","Select","toggle","Checkbox","desc","TimePicker","stripParameters","TARGET_BANDS","DEFAULT_TARGET_BAND","targetBandFor","tolerance","band","edge","targetStatus","now","gap","distance","TARGET_BOUNDS","targetBoundsFor","known","isTargetInBounds","draft","bounds","sameTarget","boundsLabel","TargetEditor","committed","nowLabel","onCommit","setOpen","setDraft","inBounds","dirty","parameter","handleOpenChange","commit","Pencil","TARGET_STATUS_VARIANT","TargetTile","variant","statusLabel","action","children","withUnit","StripTile","onTargetChange","tUi","useTranslation","banded","bmiCategory","gridColumnsClass","count","AnamnesisTargetStrip","NumericBlock","stripKeys","prevValue","labelWithUnit","settableTarget","Block","titleKey","fill","fillKind","AnamnesisCompile","initial","embedded","hideTargetStrip","statusSlot","onMissingAnswerJump","onRecordChange","practitioners","newVisitDateIso","defaultView","defaultExportMenuOpen","defaultExportAudience","setRecord","recordChangeSeenRef","nextId","patient","latest","x","anthroDefs","dietaryDefs","stripDefs","occasionalOpen","setOccasionalOpen","seed","state","setBlockOpen","historySections","liveSections","pathologies","setView","gapsOpen","setGapsOpen","trackShownVisits","readAnswer","missingAnswers","gapKeys","jumpToMissing","CompileShell","patchLatest","mut","r","onNumericChange","onGridCellChange","setTarget","setPathologies","codes","updateTherapy","patch","removeTherapy","addTherapy","addFollowUpVisit","updateIntakeAnswer","pathologyOptions","parent","latestOncological","latestAnnual","inner","Tabs","DatePicker","Plus","MultiSelect","Trash2","SHORT_FIELD_TYPES","isShortField","isLabGridSection","isLongFormText","spansRow","DETAILED_FIELD_TYPES","SECTION_FIELDS_GRID","SECTION_FIELDS_MIXED","FIELD_SPANS_ROW","seedAnswers","AnamnesisIntake","defaultOpenSection","onSubmit","jumpToField","referenceVisit","answers","setAnswers","submitted","setSubmitted","onFieldChange","visibleSections","sectionsToOpen","collapseIfComplete","setOpenSections","openSections","openSectionKey","seededFrom","setSeededFrom","seeded","holder","answeredCount","total","percentComplete","progressCaption","showMissing","Progress","Accordion","sectionAnswered","allShort","AccordionItem","AccordionTrigger","AccordionContent","ReadOnlyNumericList","AnamnesisReadOnly","ReadOnlyShell","oncological","NO_LEADING_TABS","AnamnesisEmptyCard","primaryAction","secondaryAction","AnamnesisQuestionnaire","leadingTabs","questionnaireSlot","questionnaireHeaderSlot","emptyState","tabProp","onTabChange","defaultTab","internalTab","setInternalTab","selectTab","working","setWorking","numericDefs","trendPanel","leading","Anamnesis","mode","dataComponent","onIntakeSubmit","intakeJumpToField","questionnaireTab","onQuestionnaireTabChange","defaultQuestionnaireTab","surface","reorderRowClasses","ReorderContext","createContext","AnamnesisReorderGroup","onReorder","dragSource","setDragSource","liveMessage","setLiveMessage","announceToggle","message","AnamnesisReorderRow","useContext","isDropTarget","setIsDropTarget","moveFromTo","clamped","onHandleKeyDown","isDragging","rowProps","handle","GripVertical","seededConfigDraft","keyFromLabel","taken","words","word","moveIndex","displayed","ADD_FIELD_TYPES","SEEDED_FIELD_KEYS","fieldTypeLabel","DIRECTIONS","GROUPS","AnamnesisConfigEditor","onConfigChange","editing","setEditing","adding","setAdding","patchParameters","map","patchSections","patchField","sectionKey","fieldKey","patchPathologies","reorderParameter","moved","orderByKey","reorderSection","reorderField","candidate","setEnabled","enabled","liveParameters","allParameters","liveFields","allFields","livePathologies","allPathologies","trackedGoals","sectionIndex","archived","liveInSection","sectionRowProps","sectionHandle","IconButtonGroup","List","fieldIndex","parameterRangeText","Lock","isHeading","Switch","EditDialog","AddDialog","onClose","EditDialogBody","editKeyOf","kitLabel","effectiveKitLabel","setLabel","helpText","setHelpText","required","setRequired","editableField","isChoiceField","optionsEditable","setOptions","editedOptions","optionsValid","save","nextLabel","nextHelp","isChoiceType","AddDialogBody","setGroup","setDirection","unit","setUnit","rangeMin","setRangeMin","rangeMax","setRangeMax","setPrecision","fieldType","setFieldType","setCode","parentCode","setParentCode","groupOptions","directionOptions","typeOptions","parentOptions","choiceOptions","valid","trimmedLabel","parseBound","min","resolvedType","sectionLabelForKey","anamnesisNoteId","anamnesisNotes","fromVisits","fromEvents","ar","de","el","en","es","fr","hi","it","ja","nl","pl","pt","ro","ru","sq","sv","tr","zh","PATTERN_NS","BUNDLES","registerAnamnesisBundles","i18n","bundle","stampInstant","stampOf","latestAnswered","best","bestInstant","relevantTo","rowFor","chosen","summarySectionsFromRecord","opts","unansweredCount"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|