formanitor 0.2.2 → 0.2.4

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.
Files changed (118) hide show
  1. package/dist/BpeChartWidget-HATASHAC.mjs +7 -0
  2. package/dist/BpeChartWidget-HATASHAC.mjs.map +1 -0
  3. package/dist/BpeChartWidget-VZRH7M7L.cjs +28 -0
  4. package/dist/BpeChartWidget-VZRH7M7L.cjs.map +1 -0
  5. package/dist/{DateTimeWidget-3AUBZYYK.mjs → DateTimeWidget-KRX4O6OD.mjs} +5 -4
  6. package/dist/DateTimeWidget-KRX4O6OD.mjs.map +1 -0
  7. package/dist/{DateTimeWidget-OS7ER5F6.cjs → DateTimeWidget-RJ7SATVA.cjs} +6 -5
  8. package/dist/DateTimeWidget-RJ7SATVA.cjs.map +1 -0
  9. package/dist/{DateWidget-KCTE6N5G.mjs → DateWidget-JEKDKPNS.mjs} +4 -3
  10. package/dist/DateWidget-JEKDKPNS.mjs.map +1 -0
  11. package/dist/{DateWidget-UNLX544Z.cjs → DateWidget-T7IQUWEA.cjs} +8 -7
  12. package/dist/DateWidget-T7IQUWEA.cjs.map +1 -0
  13. package/dist/DentalChartWidget-LYLOFWZU.cjs +21 -0
  14. package/dist/DentalChartWidget-LYLOFWZU.cjs.map +1 -0
  15. package/dist/DentalChartWidget-P2YPKAMO.mjs +8 -0
  16. package/dist/DentalChartWidget-P2YPKAMO.mjs.map +1 -0
  17. package/dist/{EditableTable-VQ72UEFF.cjs → EditableTable-OW5LC6OC.cjs} +6 -5
  18. package/dist/EditableTable-OW5LC6OC.cjs.map +1 -0
  19. package/dist/{EditableTable-XFCPKSUY.mjs → EditableTable-VZ66IXYI.mjs} +5 -4
  20. package/dist/EditableTable-VZ66IXYI.mjs.map +1 -0
  21. package/dist/ExtraOralExamWidget-JVKJ4ZWC.mjs +438 -0
  22. package/dist/ExtraOralExamWidget-JVKJ4ZWC.mjs.map +1 -0
  23. package/dist/ExtraOralExamWidget-ZIOSKMIO.cjs +440 -0
  24. package/dist/ExtraOralExamWidget-ZIOSKMIO.cjs.map +1 -0
  25. package/dist/{FollowupWidget-MAYTHM2E.cjs → FollowupWidget-2STSJSDY.cjs} +8 -7
  26. package/dist/FollowupWidget-2STSJSDY.cjs.map +1 -0
  27. package/dist/{FollowupWidget-BFZ6P2JE.mjs → FollowupWidget-GCGPWZVY.mjs} +4 -3
  28. package/dist/FollowupWidget-GCGPWZVY.mjs.map +1 -0
  29. package/dist/{OBGPathwayWidget-X67XKRIH.mjs → OBGPathwayWidget-QJNWUIEM.mjs} +4 -3
  30. package/dist/OBGPathwayWidget-QJNWUIEM.mjs.map +1 -0
  31. package/dist/{OBGPathwayWidget-XGN3HEWS.cjs → OBGPathwayWidget-YRU36UL7.cjs} +13 -12
  32. package/dist/OBGPathwayWidget-YRU36UL7.cjs.map +1 -0
  33. package/dist/{ObstetricHistoryWidget-Z4VAXH3E.mjs → ObstetricHistoryWidget-EW6JLNQ7.mjs} +4 -3
  34. package/dist/ObstetricHistoryWidget-EW6JLNQ7.mjs.map +1 -0
  35. package/dist/{ObstetricHistoryWidget-RP7NY4PV.cjs → ObstetricHistoryWidget-OOWCVFRB.cjs} +10 -9
  36. package/dist/ObstetricHistoryWidget-OOWCVFRB.cjs.map +1 -0
  37. package/dist/PregnancyStatusWidget-QTTVFBOE.cjs +96 -0
  38. package/dist/PregnancyStatusWidget-QTTVFBOE.cjs.map +1 -0
  39. package/dist/PregnancyStatusWidget-U2BEJGBJ.mjs +94 -0
  40. package/dist/PregnancyStatusWidget-U2BEJGBJ.mjs.map +1 -0
  41. package/dist/{SuggestionTextareaWidget-DY6M5JPO.cjs → SuggestionTextareaWidget-FWRZ46MV.cjs} +5 -5
  42. package/dist/{SuggestionTextareaWidget-DY6M5JPO.cjs.map → SuggestionTextareaWidget-FWRZ46MV.cjs.map} +1 -1
  43. package/dist/{SuggestionTextareaWidget-GQTWCFBG.mjs → SuggestionTextareaWidget-UNL3FZRI.mjs} +3 -3
  44. package/dist/{SuggestionTextareaWidget-GQTWCFBG.mjs.map → SuggestionTextareaWidget-UNL3FZRI.mjs.map} +1 -1
  45. package/dist/TreatmentPlanWidget-665HLKYV.mjs +317 -0
  46. package/dist/TreatmentPlanWidget-665HLKYV.mjs.map +1 -0
  47. package/dist/TreatmentPlanWidget-TATWSPLY.cjs +319 -0
  48. package/dist/TreatmentPlanWidget-TATWSPLY.cjs.map +1 -0
  49. package/dist/{chunk-4PMNVBJD.mjs → chunk-2OMQV2ZB.mjs} +4 -3
  50. package/dist/chunk-2OMQV2ZB.mjs.map +1 -0
  51. package/dist/chunk-5RT3S67O.cjs +30 -0
  52. package/dist/chunk-5RT3S67O.cjs.map +1 -0
  53. package/dist/chunk-6YUVILN5.mjs +42 -0
  54. package/dist/chunk-6YUVILN5.mjs.map +1 -0
  55. package/dist/{chunk-YEFM2ERQ.cjs → chunk-7OQFO6TM.cjs} +8 -7
  56. package/dist/chunk-7OQFO6TM.cjs.map +1 -0
  57. package/dist/chunk-BBD3Y37O.cjs +220 -0
  58. package/dist/chunk-BBD3Y37O.cjs.map +1 -0
  59. package/dist/chunk-EJ7MKHER.mjs +45 -0
  60. package/dist/chunk-EJ7MKHER.mjs.map +1 -0
  61. package/dist/{chunk-XN2QLBLT.mjs → chunk-G6Y4UJPN.mjs} +5 -4
  62. package/dist/chunk-G6Y4UJPN.mjs.map +1 -0
  63. package/dist/{chunk-AZSAPO2V.cjs → chunk-HXY3IX3G.cjs} +3 -44
  64. package/dist/chunk-HXY3IX3G.cjs.map +1 -0
  65. package/dist/{chunk-BMNY7F6H.mjs → chunk-JM7WNDNT.mjs} +4 -21
  66. package/dist/chunk-JM7WNDNT.mjs.map +1 -0
  67. package/dist/chunk-MQHZ7HD2.mjs +215 -0
  68. package/dist/chunk-MQHZ7HD2.mjs.map +1 -0
  69. package/dist/{chunk-ML47UEDU.cjs → chunk-O4FSJPU3.cjs} +2 -27
  70. package/dist/chunk-O4FSJPU3.cjs.map +1 -0
  71. package/dist/chunk-Q66LXMRR.mjs +28 -0
  72. package/dist/chunk-Q66LXMRR.mjs.map +1 -0
  73. package/dist/chunk-RILRMRXB.cjs +50 -0
  74. package/dist/chunk-RILRMRXB.cjs.map +1 -0
  75. package/dist/chunk-SQ2KNAUD.cjs +64 -0
  76. package/dist/chunk-SQ2KNAUD.cjs.map +1 -0
  77. package/dist/{chunk-TVFUWRTE.cjs → chunk-TCQQUJCL.cjs} +5 -4
  78. package/dist/chunk-TCQQUJCL.cjs.map +1 -0
  79. package/dist/chunk-UKSP3B3W.mjs +600 -0
  80. package/dist/chunk-UKSP3B3W.mjs.map +1 -0
  81. package/dist/chunk-X4AJCTON.cjs +607 -0
  82. package/dist/chunk-X4AJCTON.cjs.map +1 -0
  83. package/dist/chunk-ZZX3IG2T.mjs +25 -0
  84. package/dist/chunk-ZZX3IG2T.mjs.map +1 -0
  85. package/dist/index.cjs +107 -47
  86. package/dist/index.cjs.map +1 -1
  87. package/dist/index.d.cts +69 -3
  88. package/dist/index.d.ts +69 -3
  89. package/dist/index.mjs +73 -43
  90. package/dist/index.mjs.map +1 -1
  91. package/dist/read-only-table.d.cts +1 -1
  92. package/dist/read-only-table.d.ts +1 -1
  93. package/dist/smart.d.cts +1 -1
  94. package/dist/smart.d.ts +1 -1
  95. package/dist/{types-CYtJk8H9.d.ts → types-BbOnd5IN.d.cts} +53 -3
  96. package/dist/{types-CYtJk8H9.d.cts → types-BbOnd5IN.d.ts} +53 -3
  97. package/package.json +1 -1
  98. package/dist/DateTimeWidget-3AUBZYYK.mjs.map +0 -1
  99. package/dist/DateTimeWidget-OS7ER5F6.cjs.map +0 -1
  100. package/dist/DateWidget-KCTE6N5G.mjs.map +0 -1
  101. package/dist/DateWidget-UNLX544Z.cjs.map +0 -1
  102. package/dist/EditableTable-VQ72UEFF.cjs.map +0 -1
  103. package/dist/EditableTable-XFCPKSUY.mjs.map +0 -1
  104. package/dist/FollowupWidget-BFZ6P2JE.mjs.map +0 -1
  105. package/dist/FollowupWidget-MAYTHM2E.cjs.map +0 -1
  106. package/dist/OBGPathwayWidget-X67XKRIH.mjs.map +0 -1
  107. package/dist/OBGPathwayWidget-XGN3HEWS.cjs.map +0 -1
  108. package/dist/ObstetricHistoryWidget-RP7NY4PV.cjs.map +0 -1
  109. package/dist/ObstetricHistoryWidget-Z4VAXH3E.mjs.map +0 -1
  110. package/dist/chunk-4HDMR2LX.mjs +0 -69
  111. package/dist/chunk-4HDMR2LX.mjs.map +0 -1
  112. package/dist/chunk-4PMNVBJD.mjs.map +0 -1
  113. package/dist/chunk-AZSAPO2V.cjs.map +0 -1
  114. package/dist/chunk-BMNY7F6H.mjs.map +0 -1
  115. package/dist/chunk-ML47UEDU.cjs.map +0 -1
  116. package/dist/chunk-TVFUWRTE.cjs.map +0 -1
  117. package/dist/chunk-XN2QLBLT.mjs.map +0 -1
  118. package/dist/chunk-YEFM2ERQ.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/dentalChart.ts","../src/ui/widgets/DentalChartWidget.tsx"],"names":[],"mappings":"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","file":"chunk-UKSP3B3W.mjs","sourcesContent":["import type { ToothCondition, DentalChartData } from './types';\n\nexport const CONDITION_CONFIG: Record<ToothCondition, { label: string; color: string }> = {\n cavity: { label: 'Cavity', color: '#ef4444' },\n filled: { label: 'Filled', color: '#3b82f6' },\n crown: { label: 'Crown', color: '#f59e0b' },\n missing: { label: 'Missing', color: '#9ca3af' },\n root_canal: { label: 'Root Canal (RCT)', color: '#a855f7' },\n bridge: { label: 'Bridge', color: '#f97316' },\n implant: { label: 'Implant', color: '#14b8a6' },\n fractured: { label: 'Fractured', color: '#eab308' },\n impacted: { label: 'Impacted', color: '#6366f1' },\n};\n\nexport const ALL_CONDITIONS = Object.keys(CONDITION_CONFIG) as ToothCondition[];\n\n/** FDI quadrant tooth numbers, ordered from midline outward */\nexport const QUADRANTS = {\n upperRight: [11, 12, 13, 14, 15, 16, 17, 18] as const,\n upperLeft: [21, 22, 23, 24, 25, 26, 27, 28] as const,\n lowerLeft: [31, 32, 33, 34, 35, 36, 37, 38] as const,\n lowerRight: [41, 42, 43, 44, 45, 46, 47, 48] as const,\n};\n\nconst TOOTH_NAMES: Record<number, string> = {\n 11: 'UR Central Incisor', 12: 'UR Lateral Incisor',\n 13: 'UR Canine', 14: 'UR 1st Premolar',\n 15: 'UR 2nd Premolar', 16: 'UR 1st Molar',\n 17: 'UR 2nd Molar', 18: 'UR 3rd Molar',\n 21: 'UL Central Incisor', 22: 'UL Lateral Incisor',\n 23: 'UL Canine', 24: 'UL 1st Premolar',\n 25: 'UL 2nd Premolar', 26: 'UL 1st Molar',\n 27: 'UL 2nd Molar', 28: 'UL 3rd Molar',\n 31: 'LL Central Incisor', 32: 'LL Lateral Incisor',\n 33: 'LL Canine', 34: 'LL 1st Premolar',\n 35: 'LL 2nd Premolar', 36: 'LL 1st Molar',\n 37: 'LL 2nd Molar', 38: 'LL 3rd Molar',\n 41: 'LR Central Incisor', 42: 'LR Lateral Incisor',\n 43: 'LR Canine', 44: 'LR 1st Premolar',\n 45: 'LR 2nd Premolar', 46: 'LR 1st Molar',\n 47: 'LR 2nd Molar', 48: 'LR 3rd Molar',\n};\n\nexport function toothLabel(id: number): string {\n return TOOTH_NAMES[id] ?? `Tooth ${id}`;\n}\n\n/** Conditions that support per-surface location selection. */\nexport const SURFACE_CONDITIONS: readonly ToothCondition[] = ['cavity', 'filled', 'fractured'];\n\n/** Anterior teeth that use \"Incisal\" instead of \"Occlusal\". */\nconst ANTERIOR_TEETH = new Set([13, 12, 11, 21, 22, 23, 43, 42, 41, 31, 32, 33]);\n\n/**\n * Returns the ordered surface options for a given FDI tooth number.\n * - Upper jaw → Palatal (teeth 11-28)\n * - Lower jaw → Lingual (teeth 31-48)\n * - Anteriors → Incisal instead of Occlusal\n */\nexport function getToothSurfaces(id: number): string[] {\n const isUpper = id >= 11 && id <= 28;\n const isAnterior = ANTERIOR_TEETH.has(id);\n return [\n 'Buccal',\n 'Mesial',\n 'Distal',\n isAnterior ? 'Incisal' : 'Occlusal',\n isUpper ? 'Palatal' : 'Lingual',\n ];\n}\n\n/** Coerces an unknown value into a valid `DentalChartData` shape. */\nexport function normalizeDentalChart(value: unknown): DentalChartData {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const v = value as Record<string, unknown>;\n if (v.teeth && typeof v.teeth === 'object' && !Array.isArray(v.teeth)) {\n return value as DentalChartData;\n }\n }\n return { teeth: {} };\n}\n","import React, { useCallback } from 'react';\nimport { X, Trash2 } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Button } from '../shadcn/button';\nimport { Popover, PopoverContent, PopoverTrigger } from '../shadcn/popover';\nimport { Textarea } from '../shadcn/textarea';\nimport { useField } from '../../react/useField';\nimport {\n ALL_CONDITIONS,\n CONDITION_CONFIG,\n QUADRANTS,\n SURFACE_CONDITIONS,\n getToothSurfaces,\n normalizeDentalChart,\n toothLabel,\n} from '../../core/dentalChart';\nimport type { DentalChartData, ToothCondition, ToothEntry } from '../../core/types';\n\n// ─── Tooth Editor (inside popover) ───────────────────────────────────────────\n\nfunction ToothEditor({\n id,\n entry,\n onChange,\n}: {\n id: number;\n entry: ToothEntry | undefined;\n onChange: (entry: ToothEntry) => void;\n}) {\n const conditions = entry?.conditions ?? [];\n const surfaces = entry?.surfaces ?? {};\n const notes = entry?.notes ?? '';\n const availableSurfaces = getToothSurfaces(id);\n\n const buildEntry = (\n nextConditions: ToothCondition[],\n nextSurfaces: typeof surfaces,\n nextNotes: string,\n ): ToothEntry => ({\n conditions: nextConditions,\n surfaces: Object.keys(nextSurfaces).length ? nextSurfaces : undefined,\n notes: nextNotes || undefined,\n });\n\n const toggle = (c: ToothCondition) => {\n const isActive = conditions.includes(c);\n const nextConditions = isActive\n ? conditions.filter((x) => x !== c)\n : [...conditions, c];\n // Clear surfaces for a condition being deactivated\n const nextSurfaces = { ...surfaces };\n if (isActive) delete nextSurfaces[c];\n onChange(buildEntry(nextConditions, nextSurfaces, notes));\n };\n\n const toggleSurface = (c: ToothCondition, surface: string) => {\n const current = surfaces[c] ?? [];\n const next = current.includes(surface)\n ? current.filter((s) => s !== surface)\n : [...current, surface];\n const nextSurfaces = { ...surfaces, [c]: next.length ? next : [] };\n onChange(buildEntry(conditions, nextSurfaces, notes));\n };\n\n const updateNotes = (v: string) =>\n onChange(buildEntry(conditions, surfaces, v));\n\n // Conditions active that support surface selection\n const activeSurfaceConditions = SURFACE_CONDITIONS.filter((c) =>\n conditions.includes(c),\n );\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-start justify-between gap-2\">\n <div>\n <p className=\"text-xs font-semibold text-foreground\">Tooth {id}</p>\n <p className=\"text-[10px] text-muted-foreground\">{toothLabel(id)}</p>\n </div>\n {conditions.length > 0 && (\n <button\n type=\"button\"\n onClick={() => onChange({ conditions: [] })}\n className=\"flex shrink-0 items-center gap-1 text-[10px] text-destructive hover:underline\"\n >\n <Trash2 className=\"h-3 w-3\" />\n Clear\n </button>\n )}\n </div>\n\n {/* Condition chips */}\n <div className=\"flex flex-wrap gap-1.5\">\n {ALL_CONDITIONS.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n const active = conditions.includes(c);\n return (\n <button\n key={c}\n type=\"button\"\n onClick={() => toggle(c)}\n className={cn(\n 'rounded-full border px-2.5 py-0.5 text-[10px] font-medium transition-all',\n active\n ? 'text-white'\n : 'border-border bg-background text-muted-foreground hover:border-gray-400',\n )}\n style={active ? { backgroundColor: cfg.color, borderColor: cfg.color } : undefined}\n >\n {cfg.label}\n </button>\n );\n })}\n </div>\n\n {/* Surface location pickers — one per active surface-eligible condition */}\n {activeSurfaceConditions.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n const selected = surfaces[c] ?? [];\n return (\n <div key={c} className=\"space-y-1\">\n <p\n className=\"text-[10px] font-semibold uppercase tracking-wide\"\n style={{ color: cfg.color }}\n >\n {cfg.label} — surfaces\n </p>\n <div className=\"flex flex-wrap gap-1\">\n {availableSurfaces.map((surface) => {\n const on = selected.includes(surface);\n return (\n <button\n key={surface}\n type=\"button\"\n onClick={() => toggleSurface(c, surface)}\n className={cn(\n 'rounded border px-2 py-0.5 text-[10px] font-medium transition-all',\n on\n ? 'text-white'\n : 'border-border bg-background text-muted-foreground hover:border-gray-400',\n )}\n style={on ? { backgroundColor: cfg.color, borderColor: cfg.color } : undefined}\n >\n {surface}\n </button>\n );\n })}\n </div>\n </div>\n );\n })}\n\n <Textarea\n value={notes}\n onChange={(e) => updateNotes(e.target.value)}\n placeholder=\"Notes for this tooth…\"\n className=\"h-16 resize-none text-xs\"\n />\n </div>\n );\n}\n\n// ─── Single Tooth Button ──────────────────────────────────────────────────────\n\nfunction ToothButton({\n id,\n entry,\n isUpper,\n onChange,\n}: {\n id: number;\n entry: ToothEntry | undefined;\n isUpper: boolean;\n onChange: (entry: ToothEntry) => void;\n}) {\n const conditions = entry?.conditions ?? [];\n const isMissing = conditions.includes('missing');\n const primary = isMissing ? 'missing' : (conditions[0] ?? null);\n const primaryColor = primary ? CONDITION_CONFIG[primary as ToothCondition].color : null;\n const multiCount = conditions.length > 1 ? conditions.length : null;\n\n const boxStyle: React.CSSProperties = {\n position: 'relative',\n width: 46,\n height: 58,\n flexShrink: 0,\n display: 'flex',\n flexDirection: 'column',\n borderRadius: 6,\n border: '1px solid',\n borderColor: !isMissing && primaryColor ? primaryColor : isMissing ? '#d1d5db' : '#e5e7eb',\n backgroundColor: isMissing ? '#f3f4f6' : '#ffffff',\n cursor: 'pointer',\n userSelect: 'none',\n outline: 'none',\n transition: 'box-shadow 0.15s',\n };\n\n const numberStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 11,\n fontWeight: 700,\n color: isMissing ? '#9ca3af' : '#374151',\n lineHeight: 1,\n };\n\n const stripStyle = (rounded: 'top' | 'bottom'): React.CSSProperties => ({\n height: 10,\n flexShrink: 0,\n borderRadius: rounded === 'bottom' ? '0 0 5px 5px' : '5px 5px 0 0',\n backgroundColor: !isMissing && primaryColor ? primaryColor : 'transparent',\n });\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n title={toothLabel(id)}\n style={boxStyle}\n className=\"hover:ring-2 hover:ring-primary/30 focus:ring-2 focus:ring-primary/40\"\n >\n {isUpper ? (\n <>\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n <div style={stripStyle('bottom')} />\n </>\n ) : (\n <>\n <div style={stripStyle('top')} />\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n </>\n )}\n\n {/* Multi-condition badge */}\n {multiCount && (\n <span className=\"absolute -top-1.5 -right-1.5 z-10 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-primary text-[7px] font-bold text-primary-foreground\">\n {multiCount}\n </span>\n )}\n </button>\n </PopoverTrigger>\n\n <PopoverContent className=\"w-72 p-3\" side={isUpper ? 'top' : 'bottom'} align=\"center\" sideOffset={6}>\n <ToothEditor id={id} entry={entry} onChange={onChange} />\n </PopoverContent>\n </Popover>\n );\n}\n\n// ─── Tooth surface diagram ────────────────────────────────────────────────────\n\nconst ANTERIOR_IDS = new Set([13, 12, 11, 21, 22, 23, 43, 42, 41, 31, 32, 33]);\n\n/** Build a surface→color map from an entry's per-condition surface selections. */\nfunction buildSurfaceColorMap(entry: ToothEntry | undefined): Record<string, string> {\n if (!entry?.surfaces) return {};\n const map: Record<string, string> = {};\n for (const cond of SURFACE_CONDITIONS) {\n const surfs = entry.surfaces[cond as ToothCondition];\n if (!surfs?.length) continue;\n const color = CONDITION_CONFIG[cond as ToothCondition]?.color;\n if (!color) continue;\n for (const s of surfs) map[s] = color;\n }\n return map;\n}\n\n/**\n * Small SVG cross-section of a tooth crown (occlusal view).\n * 5 segments: Buccal (top) · Mesial (left) · Distal (right) ·\n * Palatal or Lingual (bottom) · Occlusal or Incisal (centre).\n */\nfunction ToothDiagram({ id, entry }: { id: number; entry: ToothEntry | undefined }) {\n const colorMap = buildSurfaceColorMap(entry);\n const hasSurfaces = Object.keys(colorMap).length > 0;\n\n const isUpper = id >= 11 && id <= 28;\n const bottomLabel = isUpper ? 'Palatal' : 'Lingual';\n const centerLabel = ANTERIOR_IDS.has(id) ? 'Incisal' : 'Occlusal';\n\n // 46 × 46 viewBox; inner corners at 11 and 35\n const S = 46;\n const I = 11;\n const segments = [\n { key: 'Buccal', d: `M0,0 L${S},0 L${S-I},${I} L${I},${I}Z` },\n { key: 'Mesial', d: `M0,0 L0,${S} L${I},${S-I} L${I},${I}Z` },\n { key: 'Distal', d: `M${S},0 L${S},${S} L${S-I},${S-I} L${S-I},${I}Z` },\n { key: bottomLabel, d: `M0,${S} L${S},${S} L${S-I},${S-I} L${I},${S-I}Z` },\n { key: centerLabel, d: `M${I},${I} L${S-I},${I} L${S-I},${S-I} L${I},${S-I}Z` },\n ];\n\n return (\n <svg\n width={S}\n height={S}\n viewBox={`0 0 ${S} ${S}`}\n style={{ flexShrink: 0, opacity: hasSurfaces ? 1 : 0.3 }}\n >\n {segments.map(({ key, d }) => {\n const color = colorMap[key];\n return (\n <path\n key={key}\n d={d}\n fill={color ?? '#f1f5f9'}\n stroke={color ? color : '#cbd5e1'}\n strokeWidth=\"1\"\n strokeLinejoin=\"round\"\n />\n );\n })}\n </svg>\n );\n}\n\n// ─── Arch Row ─────────────────────────────────────────────────────────────────\n\nfunction ArchRow({\n teeth: toothIds,\n isUpper,\n data,\n onChange,\n reverseOrder = false,\n}: {\n teeth: readonly number[];\n isUpper: boolean;\n data: DentalChartData['teeth'];\n onChange: (id: number, entry: ToothEntry) => void;\n reverseOrder?: boolean;\n}) {\n const ordered = reverseOrder ? [...toothIds].reverse() : toothIds;\n return (\n <div className=\"flex gap-1\">\n {ordered.map((id) => (\n <div key={id} className=\"flex flex-col items-center gap-0.5\">\n {isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n <ToothButton\n id={id}\n entry={data[String(id)]}\n isUpper={isUpper}\n onChange={(entry) => onChange(id, entry)}\n />\n {!isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n </div>\n ))}\n </div>\n );\n}\n\n// ─── Legend ───────────────────────────────────────────────────────────────────\n\nfunction ChartLegend() {\n return (\n <div className=\"flex flex-wrap gap-x-4 gap-y-1.5\">\n {ALL_CONDITIONS.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n return (\n <div key={c} className=\"flex items-center gap-1.5\">\n <span className=\"h-2.5 w-2.5 shrink-0 rounded-full\" style={{ backgroundColor: cfg.color }} />\n <span className=\"text-[10px] text-muted-foreground\">{cfg.label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ─── Forminator Widget wrapper ────────────────────────────────────────────────\n\nexport const DentalChartWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value, setValue, setTouched, disabled } = useField(fieldId);\n const data = normalizeDentalChart(value);\n const teeth = data.teeth;\n\n const handleToothChange = useCallback(\n (id: number, entry: ToothEntry) => {\n const next: DentalChartData['teeth'] = { ...teeth };\n if (entry.conditions.length === 0 && !entry.notes) {\n delete next[String(id)];\n } else {\n next[String(id)] = entry;\n }\n setValue({ teeth: next });\n setTouched();\n },\n [teeth, setValue, setTouched],\n );\n\n const markedCount = Object.keys(teeth).length;\n\n if (disabled) {\n return <DentalChartDisplay data={data} />;\n }\n\n return (\n <div className=\"rounded-xl border border-border/60 bg-card shadow-sm\">\n <div className=\"flex items-center justify-between border-b border-border/60 px-4 py-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">\n Intra Oral Examination – Dental Chart\n </h3>\n <p className=\"mt-0.5 text-[11px] text-muted-foreground\">\n Click any tooth to mark conditions\n {markedCount > 0 && (\n <span className=\"ml-1 font-medium text-foreground\">\n · {markedCount} {markedCount !== 1 ? 'teeth' : 'tooth'} marked\n </span>\n )}\n </p>\n </div>\n {markedCount > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => { setValue({ teeth: {} }); setTouched(); }}\n className=\"h-7 gap-1 text-xs text-destructive hover:text-destructive\"\n >\n <X className=\"h-3 w-3\" />\n Clear all\n </Button>\n )}\n </div>\n\n <div className=\"overflow-x-auto px-4 py-4\">\n <div className=\"flex justify-center\">\n <div className=\"flex flex-col items-center gap-0\">\n {/* Upper arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UR</span>\n <ArchRow teeth={QUADRANTS.upperRight} isUpper data={teeth} onChange={handleToothChange} reverseOrder />\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UL</span>\n <ArchRow teeth={QUADRANTS.upperLeft} isUpper data={teeth} onChange={handleToothChange} />\n </div>\n </div>\n\n <div className=\"my-2 flex w-full items-center gap-2\">\n <div className=\"h-px flex-1 bg-border\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">Occlusal</span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n\n {/* Lower arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <ArchRow teeth={QUADRANTS.lowerRight} isUpper={false} data={teeth} onChange={handleToothChange} reverseOrder />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LR</span>\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <ArchRow teeth={QUADRANTS.lowerLeft} isUpper={false} data={teeth} onChange={handleToothChange} />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LL</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"border-t border-border/60 px-4 py-3\">\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">Legend</p>\n <ChartLegend />\n </div>\n </div>\n );\n};\n\n// ─── Minimal display used when field is disabled ──────────────────────────────\n\nfunction DentalChartDisplay({ data }: { data: DentalChartData }) {\n const teeth = data.teeth ?? {};\n const markedCount = Object.keys(teeth).length;\n if (markedCount === 0) {\n return (\n <div className=\"rounded-xl border border-border/60 bg-card px-4 py-8 text-center text-sm text-muted-foreground shadow-sm\">\n No dental findings recorded\n </div>\n );\n }\n return <DentalChartReadOnly data={data} />;\n}\n\n// ─── Standalone read-only view (also exported for prescription pages) ─────────\n\nexport function DentalChartReadOnly({\n data,\n className,\n}: {\n data: DentalChartData;\n className?: string;\n}) {\n const teeth = data.teeth ?? {};\n const markedCount = Object.keys(teeth).length;\n\n const usedConditions = new Set(\n Object.values(teeth).flatMap((e) => e.conditions ?? []),\n );\n\n const toothNotes = Object.entries(teeth)\n .filter(([, e]) => e.notes)\n .map(([id, e]) => ({ id: Number(id), label: toothLabel(Number(id)), notes: e.notes! }));\n\n return (\n <div className={cn('rounded-xl border border-border/60 bg-card shadow-sm', className)}>\n <div className=\"flex items-center justify-between border-b border-border/60 px-4 py-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">\n Intra Oral Examination – Dental Chart\n </h3>\n {markedCount > 0 && (\n <p className=\"mt-0.5 text-[11px] text-muted-foreground\">\n {markedCount} {markedCount !== 1 ? 'teeth' : 'tooth'} marked\n </p>\n )}\n </div>\n </div>\n\n {markedCount === 0 ? (\n <div className=\"px-4 py-8 text-center text-sm text-muted-foreground\">\n No dental findings recorded\n </div>\n ) : (\n <>\n <div className=\"overflow-x-auto px-4 py-4\">\n <div className=\"flex justify-center\">\n <div className=\"flex flex-col items-center gap-0\">\n {/* Upper arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UR</span>\n <ReadOnlyArchRow teeth={QUADRANTS.upperRight} isUpper data={teeth} reverseOrder />\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UL</span>\n <ReadOnlyArchRow teeth={QUADRANTS.upperLeft} isUpper data={teeth} />\n </div>\n </div>\n\n <div className=\"my-2 flex w-full items-center gap-2\">\n <div className=\"h-px flex-1 bg-border\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">Occlusal</span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n\n {/* Lower arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <ReadOnlyArchRow teeth={QUADRANTS.lowerRight} isUpper={false} data={teeth} reverseOrder />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LR</span>\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <ReadOnlyArchRow teeth={QUADRANTS.lowerLeft} isUpper={false} data={teeth} />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LL</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {usedConditions.size > 0 && (\n <div className=\"border-t border-border/60 px-4 py-3\">\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">Legend</p>\n <ReadOnlyLegend usedConditions={usedConditions} />\n </div>\n )}\n\n {toothNotes.length > 0 && (\n <div className=\"border-t border-border/60 px-4 py-3\">\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">Tooth Notes</p>\n <div className=\"space-y-1.5\">\n {toothNotes.map(({ id, label, notes }) => (\n <div key={id} className=\"flex gap-2 text-xs\">\n <span className=\"shrink-0 font-medium text-foreground\">{id}</span>\n <span className=\"text-muted-foreground\">{label}:</span>\n <span className=\"text-foreground\">{notes}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n\n// ─── Read-only helpers ────────────────────────────────────────────────────────\n\nfunction ReadOnlyTooth({\n id,\n entry,\n isUpper,\n}: {\n id: number;\n entry: ToothEntry | undefined;\n isUpper: boolean;\n}) {\n const conditions = entry?.conditions ?? [];\n const isMissing = conditions.includes('missing');\n const primary = isMissing ? 'missing' : (conditions[0] ?? null);\n const primaryColor = primary ? CONDITION_CONFIG[primary as ToothCondition].color : null;\n const multiCount = conditions.length > 1 ? conditions.length : null;\n\n const tooltipParts = [\n `Tooth ${id}: ${toothLabel(id)}`,\n conditions.length > 0\n ? conditions.map((c) => CONDITION_CONFIG[c as ToothCondition]?.label ?? c).join(', ')\n : 'Healthy',\n entry?.notes ? `Notes: ${entry.notes}` : null,\n ].filter(Boolean);\n\n const boxStyle: React.CSSProperties = {\n position: 'relative',\n width: 46,\n height: 58,\n flexShrink: 0,\n display: 'flex',\n flexDirection: 'column',\n borderRadius: 6,\n border: '1px solid',\n borderColor: !isMissing && primaryColor ? primaryColor : isMissing ? '#d1d5db' : '#e5e7eb',\n backgroundColor: isMissing ? '#f3f4f6' : '#ffffff',\n userSelect: 'none',\n };\n\n const numberStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 11,\n fontWeight: 700,\n color: isMissing ? '#9ca3af' : '#374151',\n lineHeight: 1,\n };\n\n const stripStyle = (rounded: 'top' | 'bottom'): React.CSSProperties => ({\n height: 10,\n flexShrink: 0,\n borderRadius: rounded === 'bottom' ? '0 0 5px 5px' : '5px 5px 0 0',\n backgroundColor: !isMissing && primaryColor ? primaryColor : 'transparent',\n });\n\n return (\n <div title={tooltipParts.join('\\n')} style={boxStyle}>\n {isUpper ? (\n <>\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n <div style={stripStyle('bottom')} />\n </>\n ) : (\n <>\n <div style={stripStyle('top')} />\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n </>\n )}\n\n {/* Multi-condition badge */}\n {multiCount && (\n <span className=\"absolute -top-1.5 -right-1.5 z-10 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-primary text-[7px] font-bold text-primary-foreground\">\n {multiCount}\n </span>\n )}\n </div>\n );\n}\n\nfunction ReadOnlyArchRow({\n teeth: toothIds,\n isUpper,\n data,\n reverseOrder = false,\n}: {\n teeth: readonly number[];\n isUpper: boolean;\n data: DentalChartData['teeth'];\n reverseOrder?: boolean;\n}) {\n const ordered = reverseOrder ? [...toothIds].reverse() : toothIds;\n return (\n <div className=\"flex gap-1\">\n {ordered.map((id) => (\n <div key={id} className=\"flex flex-col items-center gap-0.5\">\n {isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n <ReadOnlyTooth id={id} entry={data[String(id)]} isUpper={isUpper} />\n {!isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n </div>\n ))}\n </div>\n );\n}\n\nfunction ReadOnlyLegend({ usedConditions }: { usedConditions: Set<string> }) {\n const active = ALL_CONDITIONS.filter((c) => usedConditions.has(c));\n if (active.length === 0) return null;\n return (\n <div className=\"flex flex-wrap gap-x-4 gap-y-1.5\">\n {active.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n return (\n <div key={c} className=\"flex items-center gap-1.5\">\n <span className=\"h-2.5 w-2.5 shrink-0 rounded-full\" style={{ backgroundColor: cfg.color }} />\n <span className=\"text-[10px] text-muted-foreground\">{cfg.label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n"]}