@alfadocs/ui-kit-debug 1.4.11 → 1.4.13
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/actions-cell-renderer-BD-jruqA.js +1784 -0
- package/dist/_chunks/actions-cell-renderer-BD-jruqA.js.map +1 -0
- package/dist/_chunks/{address-fields-pHsfkXGk.js → address-fields-D-8akw2m.js} +2 -2
- package/dist/_chunks/{address-fields-pHsfkXGk.js.map → address-fields-D-8akw2m.js.map} +1 -1
- package/dist/_chunks/{agenda-card-BCGaQazD.js → agenda-card-BQDs2ZMp.js} +2 -2
- package/dist/_chunks/{agenda-card-BCGaQazD.js.map → agenda-card-BQDs2ZMp.js.map} +1 -1
- package/dist/_chunks/{agenda-tray-CG6FuccE.js → agenda-tray-BTyWsVwT.js} +2 -2
- package/dist/_chunks/{agenda-tray-CG6FuccE.js.map → agenda-tray-BTyWsVwT.js.map} +1 -1
- package/dist/_chunks/{ai-consent-banner-CpF_rbG9.js → ai-consent-banner-gVcoiXxv.js} +2 -2
- package/dist/_chunks/{ai-consent-banner-CpF_rbG9.js.map → ai-consent-banner-gVcoiXxv.js.map} +1 -1
- package/dist/_chunks/{anamnesis-card-C4FVp9wO.js → anamnesis-card-Bt0twrML.js} +2 -2
- package/dist/_chunks/{anamnesis-card-C4FVp9wO.js.map → anamnesis-card-Bt0twrML.js.map} +1 -1
- package/dist/_chunks/anamnesis-summary-card-BKGVcwny.js +350 -0
- package/dist/_chunks/anamnesis-summary-card-BKGVcwny.js.map +1 -0
- package/dist/_chunks/{anamnesis-summary-rows-Dw3l6nOD.js → anamnesis-summary-rows-B5MAYkJ-.js} +2768 -2951
- package/dist/_chunks/anamnesis-summary-rows-B5MAYkJ-.js.map +1 -0
- package/dist/_chunks/{antenatal-schedule-timeline-u8TsS2QJ.js → antenatal-schedule-timeline-BSLrOQ3S.js} +2 -2
- package/dist/_chunks/{antenatal-schedule-timeline-u8TsS2QJ.js.map → antenatal-schedule-timeline-BSLrOQ3S.js.map} +1 -1
- package/dist/_chunks/{appointment-card-DgKI5QKD.js → appointment-card-kcUC7vWR.js} +2 -2
- package/dist/_chunks/{appointment-card-DgKI5QKD.js.map → appointment-card-kcUC7vWR.js.map} +1 -1
- package/dist/_chunks/{appointment-timeline-CUijZCxZ.js → appointment-timeline-BC3dlZu5.js} +2 -2
- package/dist/_chunks/{appointment-timeline-CUijZCxZ.js.map → appointment-timeline-BC3dlZu5.js.map} +1 -1
- package/dist/_chunks/{appointment-tray-B1aUk46V.js → appointment-tray-BPY5rATW.js} +2 -2
- package/dist/_chunks/{appointment-tray-B1aUk46V.js.map → appointment-tray-BPY5rATW.js.map} +1 -1
- package/dist/_chunks/{badge-DCOqV9mI.js → badge-CIt-UFEx.js} +28 -28
- package/dist/_chunks/{badge-DCOqV9mI.js.map → badge-CIt-UFEx.js.map} +1 -1
- package/dist/_chunks/{bishop-score-Bpe20Ctl.js → bishop-score-B6iYYO0c.js} +3 -3
- package/dist/_chunks/{bishop-score-Bpe20Ctl.js.map → bishop-score-B6iYYO0c.js.map} +1 -1
- package/dist/_chunks/{bmi-calculator-DF5bNsDD.js → bmi-calculator-DC5SaqXT.js} +5 -5
- package/dist/_chunks/{bmi-calculator-DF5bNsDD.js.map → bmi-calculator-DC5SaqXT.js.map} +1 -1
- package/dist/_chunks/{booking-DuSkvE5x.js → booking-CmHX15dh.js} +2 -2
- package/dist/_chunks/{booking-DuSkvE5x.js.map → booking-CmHX15dh.js.map} +1 -1
- package/dist/_chunks/{care-plan-card-DiyK3Eys.js → care-plan-card-9tLgsDYY.js} +3 -3
- package/dist/_chunks/{care-plan-card-DiyK3Eys.js.map → care-plan-card-9tLgsDYY.js.map} +1 -1
- package/dist/_chunks/{care-plan-entry-card-6du8PYVk.js → care-plan-entry-card-CSan4h7A.js} +2 -2
- package/dist/_chunks/{care-plan-entry-card-6du8PYVk.js.map → care-plan-entry-card-CSan4h7A.js.map} +1 -1
- package/dist/_chunks/{care-plan-header-BWvDvly-.js → care-plan-header-D_BTi77b.js} +2 -2
- package/dist/_chunks/{care-plan-header-BWvDvly-.js.map → care-plan-header-D_BTi77b.js.map} +1 -1
- package/dist/_chunks/{clinical-note-card-D63x_AkK.js → clinical-note-card-ByzQ86uz.js} +2 -2
- package/dist/_chunks/{clinical-note-card-D63x_AkK.js.map → clinical-note-card-ByzQ86uz.js.map} +1 -1
- package/dist/_chunks/{connection-status-Bi4Hwpd1.js → connection-status-D8mZ4klk.js} +2 -2
- package/dist/_chunks/{connection-status-Bi4Hwpd1.js.map → connection-status-D8mZ4klk.js.map} +1 -1
- package/dist/_chunks/{contact-profile-card-CGS_NABR.js → contact-profile-card-DuW6VpzY.js} +2 -2
- package/dist/_chunks/{contact-profile-card-CGS_NABR.js.map → contact-profile-card-DuW6VpzY.js.map} +1 -1
- package/dist/_chunks/{cycle-calculator-Bd4_fJhq.js → cycle-calculator-B_NlctlQ.js} +4 -4
- package/dist/_chunks/{cycle-calculator-Bd4_fJhq.js.map → cycle-calculator-B_NlctlQ.js.map} +1 -1
- package/dist/_chunks/{date-time-picker-DafkGDGO.js → date-time-picker-DVETwpzc.js} +2 -2
- package/dist/_chunks/{date-time-picker-DafkGDGO.js.map → date-time-picker-DVETwpzc.js.map} +1 -1
- package/dist/_chunks/{dependent-selector-DyFpdzZV.js → dependent-selector-BUvrZRi0.js} +2 -2
- package/dist/_chunks/{dependent-selector-DyFpdzZV.js.map → dependent-selector-BUvrZRi0.js.map} +1 -1
- package/dist/_chunks/{document-preview-DuMzmupZ.js → document-preview-Di15VrpQ.js} +2 -2
- package/dist/_chunks/{document-preview-DuMzmupZ.js.map → document-preview-Di15VrpQ.js.map} +1 -1
- package/dist/_chunks/{due-date-calculator-Do67C-Z-.js → due-date-calculator-le1z3KpW.js} +6 -6
- package/dist/_chunks/{due-date-calculator-Do67C-Z-.js.map → due-date-calculator-le1z3KpW.js.map} +1 -1
- package/dist/_chunks/{fetal-weight-DHxXx7Uz.js → fetal-weight-DXA6ZpMq.js} +4 -4
- package/dist/_chunks/{fetal-weight-DHxXx7Uz.js.map → fetal-weight-DXA6ZpMq.js.map} +1 -1
- package/dist/_chunks/{field-value-C5A4t4OE.js → field-value-BCFLVBmu.js} +2 -2
- package/dist/_chunks/{field-value-C5A4t4OE.js.map → field-value-BCFLVBmu.js.map} +1 -1
- package/dist/_chunks/{file-manager-BY6FdHAt.js → file-manager-BjCM2fZB.js} +3 -3
- package/dist/_chunks/{file-manager-BY6FdHAt.js.map → file-manager-BjCM2fZB.js.map} +1 -1
- package/dist/_chunks/form-field-D1oqYisL.js +127 -0
- package/dist/_chunks/form-field-D1oqYisL.js.map +1 -0
- package/dist/_chunks/{gestational-age-calculator-CMhOtFE_.js → gestational-age-calculator-Ch8vmJAl.js} +5 -5
- package/dist/_chunks/{gestational-age-calculator-CMhOtFE_.js.map → gestational-age-calculator-Ch8vmJAl.js.map} +1 -1
- package/dist/_chunks/{hcg-doubling-DNG9Q2go.js → hcg-doubling-BT6lki_i.js} +5 -5
- package/dist/_chunks/{hcg-doubling-DNG9Q2go.js.map → hcg-doubling-BT6lki_i.js.map} +1 -1
- package/dist/_chunks/{link-cell-renderer-C8npOgmM.js → link-cell-renderer-C7GvyK66.js} +3 -3
- package/dist/_chunks/{link-cell-renderer-C8npOgmM.js.map → link-cell-renderer-C7GvyK66.js.map} +1 -1
- package/dist/_chunks/{marketplace-app-shell-BxOiy25s.js → marketplace-app-shell-BhRH7Zi4.js} +2 -2
- package/dist/_chunks/{marketplace-app-shell-BxOiy25s.js.map → marketplace-app-shell-BhRH7Zi4.js.map} +1 -1
- package/dist/_chunks/{notes-panel-BoyzMHI_.js → notes-panel-Bz83SO4-.js} +2 -2
- package/dist/_chunks/{notes-panel-BoyzMHI_.js.map → notes-panel-Bz83SO4-.js.map} +1 -1
- package/dist/_chunks/number-input-CM1q9zvH.js +414 -0
- package/dist/_chunks/number-input-CM1q9zvH.js.map +1 -0
- package/dist/_chunks/{operator-hero-DVy0RGoD.js → operator-hero-CpJkDNAM.js} +2 -2
- package/dist/_chunks/{operator-hero-DVy0RGoD.js.map → operator-hero-CpJkDNAM.js.map} +1 -1
- package/dist/_chunks/{optical-prescription-Brs0CeP3.js → optical-prescription-CQR_WJiS.js} +2 -2
- package/dist/_chunks/{optical-prescription-Brs0CeP3.js.map → optical-prescription-CQR_WJiS.js.map} +1 -1
- package/dist/_chunks/{patient-details-Bf4iTAPp.js → patient-details-CnFgF3MU.js} +3 -3
- package/dist/_chunks/{patient-details-Bf4iTAPp.js.map → patient-details-CnFgF3MU.js.map} +1 -1
- package/dist/_chunks/{patient-summary-card-dkV6a53T.js → patient-summary-card-DfbOtOV6.js} +3 -3
- package/dist/_chunks/{patient-summary-card-dkV6a53T.js.map → patient-summary-card-DfbOtOV6.js.map} +1 -1
- package/dist/_chunks/{patient-table-zifAcsjV.js → patient-table-BXzcrC79.js} +4 -4
- package/dist/_chunks/{patient-table-zifAcsjV.js.map → patient-table-BXzcrC79.js.map} +1 -1
- package/dist/_chunks/{payment-automation-upsell-CZZPGfs0.js → payment-automation-upsell-Ckh3b7Xx.js} +2 -2
- package/dist/_chunks/{payment-automation-upsell-CZZPGfs0.js.map → payment-automation-upsell-Ckh3b7Xx.js.map} +1 -1
- package/dist/_chunks/{payment-request-card-Dy7_DA-2.js → payment-request-card-Dn6-tH-D.js} +2 -2
- package/dist/_chunks/{payment-request-card-Dy7_DA-2.js.map → payment-request-card-Dn6-tH-D.js.map} +1 -1
- package/dist/_chunks/{periodontal-chart-CfFgKXWa.js → periodontal-chart-B0yko9Xm.js} +2 -2
- package/dist/_chunks/{periodontal-chart-CfFgKXWa.js.map → periodontal-chart-B0yko9Xm.js.map} +1 -1
- package/dist/_chunks/{periodontal-chart-card--6yTUsrQ.js → periodontal-chart-card-HbYTmWlo.js} +2 -2
- package/dist/_chunks/{periodontal-chart-card--6yTUsrQ.js.map → periodontal-chart-card-HbYTmWlo.js.map} +1 -1
- package/dist/_chunks/{periodontal-diagnosis-cco40xTa.js → periodontal-diagnosis-Qk4F3Wc_.js} +3 -3
- package/dist/_chunks/{periodontal-diagnosis-cco40xTa.js.map → periodontal-diagnosis-Qk4F3Wc_.js.map} +1 -1
- package/dist/_chunks/{periodontal-risk-chart-bUGkMwDg.js → periodontal-risk-chart-ByKuM4cF.js} +2 -2
- package/dist/_chunks/{periodontal-risk-chart-bUGkMwDg.js.map → periodontal-risk-chart-ByKuM4cF.js.map} +1 -1
- package/dist/_chunks/{practice-results-Mys11x9p.js → practice-results-C5exrEn0.js} +2 -2
- package/dist/_chunks/{practice-results-Mys11x9p.js.map → practice-results-C5exrEn0.js.map} +1 -1
- package/dist/_chunks/{pregnancy-dating-t3oM4ZzC.js → pregnancy-dating-4tPV_Yko.js} +6 -6
- package/dist/_chunks/{pregnancy-dating-t3oM4ZzC.js.map → pregnancy-dating-4tPV_Yko.js.map} +1 -1
- package/dist/_chunks/{pregnancy-weight-gain-Bfz7SbIw.js → pregnancy-weight-gain-BBgbWBGe.js} +5 -5
- package/dist/_chunks/{pregnancy-weight-gain-Bfz7SbIw.js.map → pregnancy-weight-gain-BBgbWBGe.js.map} +1 -1
- package/dist/_chunks/radio-group-BmIqhIT2.js +171 -0
- package/dist/_chunks/radio-group-BmIqhIT2.js.map +1 -0
- package/dist/_chunks/{radiograph-panel.agent-DyA4wsZA.js → radiograph-panel.agent-Drj0hYVV.js} +3 -3
- package/dist/_chunks/{radiograph-panel.agent-DyA4wsZA.js.map → radiograph-panel.agent-Drj0hYVV.js.map} +1 -1
- package/dist/_chunks/signature-status-chip-DlLJk1VA.js +97 -0
- package/dist/_chunks/signature-status-chip-DlLJk1VA.js.map +1 -0
- package/dist/_chunks/{tab-bar-BYESZINM.js → tab-bar-Ddp_ZbnL.js} +2 -2
- package/dist/_chunks/{tab-bar-BYESZINM.js.map → tab-bar-Ddp_ZbnL.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-CoESdfZI.js → tasks-panel-T7vaKJcA.js} +2 -2
- package/dist/_chunks/{tasks-panel-CoESdfZI.js.map → tasks-panel-T7vaKJcA.js.map} +1 -1
- package/dist/_chunks/{time-picker-BPlJWm8w.js → time-picker-D0RS391l.js} +66 -63
- package/dist/_chunks/{time-picker-BPlJWm8w.js.map → time-picker-D0RS391l.js.map} +1 -1
- package/dist/_chunks/{unit-converter-lUW9Q888.js → unit-converter-Dsk__pjA.js} +3 -3
- package/dist/_chunks/{unit-converter-lUW9Q888.js.map → unit-converter-Dsk__pjA.js.map} +1 -1
- package/dist/_chunks/{widget-picker-DEmTVuFL.js → widget-picker-DqMbjQy_.js} +2 -2
- package/dist/_chunks/{widget-picker-DEmTVuFL.js.map → widget-picker-DqMbjQy_.js.map} +1 -1
- package/dist/_chunks/{workflow-map-C5PGP6cD.js → workflow-map-BNBeG2zn.js} +2 -2
- package/dist/_chunks/{workflow-map-C5PGP6cD.js.map → workflow-map-BNBeG2zn.js.map} +1 -1
- package/dist/agent-catalog.json +34 -34
- package/dist/agent-i18n/en.json +4 -4
- package/dist/components/address-fields/index.js +1 -1
- package/dist/components/agenda-card/index.js +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-consent-banner/index.js +1 -1
- package/dist/components/anamnesis-card/index.js +1 -1
- package/dist/components/anamnesis-summary-card/anamnesis-summary-card.d.ts.map +1 -1
- package/dist/components/anamnesis-summary-card/index.js +1 -1
- package/dist/components/appointment-card/index.js +2 -2
- package/dist/components/appointment-timeline/index.js +1 -1
- package/dist/components/badge/badge.d.ts +1 -0
- package/dist/components/badge/badge.d.ts.map +1 -1
- package/dist/components/badge/index.js +1 -1
- package/dist/components/bishop-score/index.js +1 -1
- package/dist/components/bmi-calculator/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/care-plan-card/index.js +1 -1
- package/dist/components/care-plan-entry-card/index.js +1 -1
- package/dist/components/care-plan-header/index.js +1 -1
- package/dist/components/clinical-note-card/index.js +1 -1
- package/dist/components/connection-status/index.js +1 -1
- package/dist/components/contact-profile-card/index.js +1 -1
- package/dist/components/cycle-calculator/index.js +1 -1
- package/dist/components/data-table/data-table.agent.d.ts.map +1 -1
- package/dist/components/data-table/data-table.d.ts +19 -0
- package/dist/components/data-table/data-table.d.ts.map +1 -1
- package/dist/components/data-table/expanded-row-renderer.d.ts +47 -0
- package/dist/components/data-table/expanded-row-renderer.d.ts.map +1 -0
- package/dist/components/data-table/index.d.ts +2 -0
- package/dist/components/data-table/index.d.ts.map +1 -1
- package/dist/components/data-table/index.js +31 -27
- package/dist/components/date-time-picker/index.js +1 -1
- package/dist/components/dependent-selector/index.js +1 -1
- package/dist/components/document-preview/index.js +1 -1
- package/dist/components/due-date-calculator/index.js +2 -2
- package/dist/components/fetal-weight/index.js +1 -1
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/form-field/form-field.d.ts +6 -0
- package/dist/components/form-field/form-field.d.ts.map +1 -1
- package/dist/components/form-field/index.js +1 -1
- package/dist/components/gestational-age-calculator/index.js +1 -1
- package/dist/components/hcg-doubling/index.js +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/number-input/index.js +1 -1
- package/dist/components/number-input/number-input.d.ts +11 -0
- package/dist/components/number-input/number-input.d.ts.map +1 -1
- package/dist/components/operator-hero/index.js +1 -1
- package/dist/components/optical-prescription/index.js +1 -1
- package/dist/components/patient-details/index.js +1 -1
- package/dist/components/patient-summary-card/index.js +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/payment-card/index.js +1 -1
- package/dist/components/periodontal-chart/index.js +1 -1
- package/dist/components/periodontal-chart-card/index.js +1 -1
- package/dist/components/periodontal-diagnosis/index.js +1 -1
- package/dist/components/periodontal-risk-chart/index.js +1 -1
- package/dist/components/practice-results/index.js +1 -1
- package/dist/components/pregnancy-dating/index.js +1 -1
- package/dist/components/pregnancy-weight-gain/index.js +1 -1
- package/dist/components/radio-group/index.js +1 -1
- package/dist/components/radio-group/radio-group.d.ts +3 -0
- package/dist/components/radio-group/radio-group.d.ts.map +1 -1
- package/dist/components/radiograph-panel/index.js +1 -1
- package/dist/components/signature-status-chip/index.d.ts +3 -0
- package/dist/components/signature-status-chip/index.d.ts.map +1 -0
- package/dist/components/signature-status-chip/index.js +6 -0
- package/dist/components/signature-status-chip/index.js.map +1 -0
- package/dist/components/signature-status-chip/signature-status-chip.d.ts +29 -0
- package/dist/components/signature-status-chip/signature-status-chip.d.ts.map +1 -0
- package/dist/components/tab-bar/index.js +1 -1
- package/dist/components/tasks-panel/index.js +1 -1
- package/dist/components/time-picker/index.js +1 -1
- package/dist/components/time-picker/time-picker.d.ts.map +1 -1
- package/dist/components/unit-converter/index.js +1 -1
- package/dist/components/widget-picker/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/host-compat.css +4 -1
- package/dist/i18n/locales/ar.d.ts +17 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +11 -0
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +17 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +11 -0
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +17 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +11 -0
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +17 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +11 -0
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +17 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +11 -0
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +17 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +11 -0
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +17 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +11 -0
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +17 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +11 -0
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +17 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +11 -0
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +17 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +11 -0
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +17 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +11 -0
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +17 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +11 -0
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +17 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +11 -0
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +17 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +11 -0
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +17 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +11 -0
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +17 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +11 -0
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +17 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +11 -0
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +17 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +11 -0
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +799 -792
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.json +17 -0
- package/dist/locales/de.json +17 -0
- package/dist/locales/el.json +17 -0
- package/dist/locales/en.json +17 -0
- package/dist/locales/es.json +17 -0
- package/dist/locales/fr.json +17 -0
- package/dist/locales/hi.json +17 -0
- package/dist/locales/it.json +17 -0
- package/dist/locales/ja.json +17 -0
- package/dist/locales/nl.json +17 -0
- package/dist/locales/pl.json +17 -0
- package/dist/locales/pt.json +17 -0
- package/dist/locales/ro.json +17 -0
- package/dist/locales/ru.json +17 -0
- package/dist/locales/sq.json +17 -0
- package/dist/locales/sv.json +17 -0
- package/dist/locales/tr.json +17 -0
- package/dist/locales/zh.json +17 -0
- package/dist/patterns/anamnesis/anamnesis-baseline.d.ts +6 -0
- package/dist/patterns/anamnesis/anamnesis-baseline.d.ts.map +1 -1
- package/dist/patterns/anamnesis/anamnesis-compile.d.ts +4 -1
- package/dist/patterns/anamnesis/anamnesis-compile.d.ts.map +1 -1
- package/dist/patterns/anamnesis/anamnesis-evolution-grid.d.ts +8 -9
- package/dist/patterns/anamnesis/anamnesis-evolution-grid.d.ts.map +1 -1
- package/dist/patterns/anamnesis/anamnesis-evolution.d.ts +24 -12
- package/dist/patterns/anamnesis/anamnesis-evolution.d.ts.map +1 -1
- package/dist/patterns/anamnesis/anamnesis-field.d.ts.map +1 -1
- package/dist/patterns/anamnesis/anamnesis-i18n.d.ts.map +1 -1
- package/dist/patterns/anamnesis/anamnesis-intake.d.ts +5 -1
- package/dist/patterns/anamnesis/anamnesis-intake.d.ts.map +1 -1
- package/dist/patterns/anamnesis/anamnesis-questionnaire.d.ts +4 -1
- package/dist/patterns/anamnesis/anamnesis-questionnaire.d.ts.map +1 -1
- package/dist/patterns/anamnesis/anamnesis-readonly.d.ts +4 -1
- package/dist/patterns/anamnesis/anamnesis-readonly.d.ts.map +1 -1
- package/dist/patterns/anamnesis/anamnesis-source-blocks.d.ts +29 -0
- package/dist/patterns/anamnesis/anamnesis-source-blocks.d.ts.map +1 -0
- package/dist/patterns/anamnesis/anamnesis-window.d.ts +3 -5
- package/dist/patterns/anamnesis/anamnesis-window.d.ts.map +1 -1
- package/dist/patterns/anamnesis/anamnesis.d.ts +4 -1
- package/dist/patterns/anamnesis/anamnesis.d.ts.map +1 -1
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/marketplace-app-shell/index.js +1 -1
- package/dist/patterns/payment-automation-upsell/index.js +1 -1
- package/dist/tokens.css +5 -2
- package/package.json +5 -1
- package/dist/_chunks/actions-cell-renderer-C67oj7mR.js +0 -1581
- package/dist/_chunks/actions-cell-renderer-C67oj7mR.js.map +0 -1
- package/dist/_chunks/anamnesis-summary-card-CpQViN5l.js +0 -392
- package/dist/_chunks/anamnesis-summary-card-CpQViN5l.js.map +0 -1
- package/dist/_chunks/anamnesis-summary-rows-Dw3l6nOD.js.map +0 -1
- package/dist/_chunks/form-field-M5UpX65Z.js +0 -123
- package/dist/_chunks/form-field-M5UpX65Z.js.map +0 -1
- package/dist/_chunks/number-input-DOe5VYei.js +0 -370
- package/dist/_chunks/number-input-DOe5VYei.js.map +0 -1
- package/dist/_chunks/radio-group-CI-6SmSw.js +0 -167
- package/dist/_chunks/radio-group-CI-6SmSw.js.map +0 -1
- package/dist/patterns/anamnesis/anamnesis-compare-panel.d.ts +0 -89
- package/dist/patterns/anamnesis/anamnesis-compare-panel.d.ts.map +0 -1
package/dist/_chunks/{periodontal-chart-card--6yTUsrQ.js → periodontal-chart-card-HbYTmWlo.js}
RENAMED
|
@@ -2,7 +2,7 @@ import { jsxs as o, jsx as e, Fragment as Z } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as ee, useId as te, useMemo as O } from "react";
|
|
3
3
|
import { c as R } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as ae } from "react-i18next";
|
|
5
|
-
import { B as re } from "./badge-
|
|
5
|
+
import { B as re } from "./badge-CIt-UFEx.js";
|
|
6
6
|
import { C as S } from "./card-DPmk26CL.js";
|
|
7
7
|
import { K as ne, a as se } from "./key-value-pair-DGkGlgCF.js";
|
|
8
8
|
import { u as oe } from "./registry-DvAUVLHh.js";
|
|
@@ -452,4 +452,4 @@ export {
|
|
|
452
452
|
he as a,
|
|
453
453
|
de as p
|
|
454
454
|
};
|
|
455
|
-
//# sourceMappingURL=periodontal-chart-card
|
|
455
|
+
//# sourceMappingURL=periodontal-chart-card-HbYTmWlo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"periodontal-chart-card--6yTUsrQ.js","sources":["../../src/components/periodontal-chart-card/periodontal-chart-card.agent.ts","../../src/components/periodontal-chart-card/periodontal-chart-card.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PeriodontalChartCardHandle } from './periodontal-chart-card';\n\n/* -------------------------------------------------------------------- */\n/* PeriodontalChartCard — agent adapter */\n/* */\n/* Read-only clinical chart. The handle returns STRUCTURAL state only — */\n/* the set of charted FDI tooth ids, how many probing sites breach the */\n/* 4mm / 6mm thresholds, and the chart date. NEVER patient identity, */\n/* names, or any free-text PHI — the chart never holds those. */\n/* -------------------------------------------------------------------- */\n\nexport const periodontalChartCardAgent: AgentAdapter<PeriodontalChartCardHandle> =\n {\n id: 'periodontal-chart-card',\n capabilities: [],\n state: {\n toothIds: {\n type: 'string[]',\n descriptionKey: 'ui.agent.periodontalChartCard.state.toothIds',\n description:\n 'FDI ids of the teeth currently charted. Tooth identifiers only — no patient identity.',\n read: (handle) => handle.getToothIds(),\n },\n siteCount: {\n type: 'number',\n descriptionKey: 'ui.agent.periodontalChartCard.state.siteCount',\n description: 'Total number of probing sites rendered.',\n read: (handle) => handle.getSiteCount(),\n },\n deepPocketCount: {\n type: 'number',\n descriptionKey: 'ui.agent.periodontalChartCard.state.deepPocketCount',\n description:\n 'Number of sites with a probing depth at or above the 6mm severe threshold.',\n read: (handle) => handle.getDeepPocketCount(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'periodontal-chart-card',\n description: 'Marks the PeriodontalChartCard root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n };\n","import {\n forwardRef,\n useId,\n useMemo,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Badge } from '../badge/badge';\nimport { Card } from '../card/card';\nimport { KeyValueList, KeyValuePair } from '../key-value-pair/key-value-pair';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { periodontalChartCardAgent } from './periodontal-chart-card.agent';\n\n/* -------------------------------------------------------------------- */\n/* PeriodontalChartCard */\n/* */\n/* A DISPLAY-ONLY periodontal (gum) chart. There is no kit equivalent — */\n/* the dental ToothScheme charts caries/restorations per tooth, whereas */\n/* a perio chart records probing measurements per SITE (6 sites/tooth): */\n/* pocket depth (PD), gingival recession (REC), bleeding on probing */\n/* (BoP), suppuration, and tooth mobility. */\n/* */\n/* It renders a compact per-quadrant TABLE (real <table>/<th> semantics */\n/* + scope + caption — NOT a colour-only grid) of teeth x sites. Pocket */\n/* depths >= 4mm are flagged with the warning token, >= 6mm with the */\n/* destructive token, and EACH flag also carries a non-colour cue */\n/* (bold weight + an asterisk / double-asterisk) so the severity is */\n/* legible without colour. Bleeding and suppuration render as small */\n/* glyphs WITH an accessible per-cell label. */\n/* */\n/* The component owns no editing affordance — it is a passive read */\n/* surface for a chart captured elsewhere. */\n/* */\n/* All visible text flows through `useTranslation('ui')` against the */\n/* `periodontalChartCard.*` namespace. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* CVA */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n // Matches the kit's other `surface` props. `elevated` wraps in\n // `<Card variant=\"elevated\">`; `flat` drops the chrome for use\n // inside an existing Card / Sheet.\n surface: {\n flat: '',\n elevated: '',\n },\n },\n defaultVariants: { surface: 'elevated' },\n});\n\n// Per-measurement-cell severity. The colour is paired with a weight bump\n// so the flag survives greyscale / forced-colors — colour is never the\n// sole cue (the asterisk in the cell content carries the same signal).\nconst measureVariants = cva(\n 'ds:[font-variant-numeric:var(--font-feature-tabular)] ds:tabular-nums',\n {\n variants: {\n severity: {\n normal: 'ds:text-[color:var(--foreground)]',\n moderate: 'ds:font-semibold ds:text-[color:var(--warning-foreground)]',\n severe: 'ds:font-bold ds:text-[color:var(--destructive)]',\n },\n },\n defaultVariants: { severity: 'normal' },\n },\n);\n\n/* -------------------------------------------------------------------- */\n/* Constants */\n/* -------------------------------------------------------------------- */\n\n/** Probing depth (mm) at/above which a site is flagged moderate. */\nconst MODERATE_POCKET_MM = 4;\n/** Probing depth (mm) at/above which a site is flagged severe. */\nconst SEVERE_POCKET_MM = 6;\n\n/** The six standard probing sites, in buccal-then-lingual display order. */\nexport const PERIODONTAL_SITE_ORDER = [\n 'db',\n 'b',\n 'mb',\n 'dl',\n 'l',\n 'ml',\n] as const;\n\nexport type PeriodontalSiteId = (typeof PERIODONTAL_SITE_ORDER)[number];\n\n/** English fallback labels for the six probing sites (belt-and-braces). */\nconst SITE_DEFAULT: Record<PeriodontalSiteId, string> = {\n db: 'Disto-buccal',\n b: 'Buccal',\n mb: 'Mesio-buccal',\n dl: 'Disto-lingual',\n l: 'Lingual',\n ml: 'Mesio-lingual',\n};\n\n/** FDI quadrant ids (first digit of the FDI tooth number). */\nconst QUADRANT_ORDER = ['1', '2', '3', '4'] as const;\ntype QuadrantId = (typeof QUADRANT_ORDER)[number];\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\n/** One probing-site reading. */\nexport interface PeriodontalSite {\n /** FDI tooth number, e.g. `'11'`, `'46'`. */\n tooth: string;\n /** Probing site: mesio-/disto- buccal/lingual, mid buccal/lingual. */\n site: PeriodontalSiteId;\n /** Pocket depth in millimetres. */\n pocketDepthMm?: number;\n /** Gingival recession in millimetres. */\n recessionMm?: number;\n /** Bleeding on probing at this site. */\n bleeding?: boolean;\n /** Suppuration (pus) at this site. */\n suppuration?: boolean;\n}\n\n/** Aggregate chart summary, consumer-supplied. */\nexport interface PeriodontalChartSummary {\n /** Whole-mouth mean probing depth in millimetres. */\n meanPocketDepthMm?: number;\n /** Bleeding-on-probing as a percentage of sites (0–100). */\n bleedingOnProbingPercent?: number;\n}\n\n/** Tooth-mobility grade (Miller 0–3). */\nexport type PeriodontalMobility = 0 | 1 | 2 | 3;\n\n/** Imperative handle — structural state only, never PHI. */\nexport interface PeriodontalChartCardHandle {\n /** FDI ids of the charted teeth, in display order. */\n getToothIds: () => string[];\n /** Total probing sites rendered. */\n getSiteCount: () => number;\n /** Count of sites at/above the 6mm severe threshold. */\n getDeepPocketCount: () => number;\n}\n\nexport interface PeriodontalChartCardProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children'\n> {\n /** Probing-site readings. Sites are grouped per tooth automatically. */\n sites: PeriodontalSite[];\n /**\n * ISO-8601 date the chart was captured. Rendered as a localised date in\n * the header and exposed as the table caption context. Optional.\n */\n dateIso?: string;\n /**\n * Dentition the chart covers. Drives only the localised header label —\n * tooth grouping is derived from the FDI numbers in `sites`.\n */\n dentition?: 'permanent' | 'primary' | 'mixed';\n /** Per-tooth Miller mobility grade, keyed by FDI tooth number. */\n mobility?: Record<string, PeriodontalMobility>;\n /** Aggregate summary stats rendered above the per-quadrant tables. */\n summary?: PeriodontalChartSummary;\n\n /* ----- i18n / formatting ----- */\n\n /** Locale for date + number formatting. Falls back to `i18n.language`. */\n locale?: string;\n\n /* ----- Styling ----- */\n\n /**\n * `'elevated'` (default) wraps in `<Card variant=\"elevated\">`. `'flat'`\n * drops the Card — use inside another card / sheet.\n */\n surface?: 'flat' | 'elevated';\n\n /* ----- a11y ----- */\n\n /** Override the default region aria-label. */\n 'aria-label'?: string;\n /** Agent-readiness consumer id, surfaced as `data-component-id`. */\n id?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------- */\n\n/** Classify a pocket depth into a severity band. */\nfunction pocketSeverity(\n depth: number | undefined,\n): 'normal' | 'moderate' | 'severe' {\n if (depth == null || !Number.isFinite(depth)) return 'normal';\n if (depth >= SEVERE_POCKET_MM) return 'severe';\n if (depth >= MODERATE_POCKET_MM) return 'moderate';\n return 'normal';\n}\n\n/** Non-colour severity cue appended to the measurement (`''`/`*`/`**`). */\nfunction severityMarker(severity: 'normal' | 'moderate' | 'severe'): string {\n if (severity === 'severe') return '∗∗';\n if (severity === 'moderate') return '∗';\n return '';\n}\n\n/** FDI quadrant (first digit) of a tooth number, or null if unparseable. */\nfunction quadrantOf(tooth: string): QuadrantId | null {\n const first = tooth.trim().charAt(0);\n return (QUADRANT_ORDER as readonly string[]).includes(first)\n ? (first as QuadrantId)\n : null;\n}\n\ninterface ToothRow {\n tooth: string;\n sites: Partial<Record<PeriodontalSiteId, PeriodontalSite>>;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const PeriodontalChartCard = forwardRef<\n HTMLDivElement,\n PeriodontalChartCardProps\n>(\n (\n {\n sites,\n dateIso,\n dentition = 'permanent',\n mobility,\n summary,\n locale,\n surface = 'elevated',\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const headingId = useId();\n const resolvedLocale = locale ?? i18n.language ?? 'en';\n\n // Group sites by tooth, then bucket teeth into FDI quadrants. The\n // grouping is derived purely from the FDI numbers — the consumer\n // passes a flat site list and the kit owns the layout.\n const { quadrants, toothIds, siteCount, deepPocketCount } = useMemo(() => {\n const byTooth = new Map<string, ToothRow>();\n let sCount = 0;\n let deep = 0;\n for (const site of sites) {\n sCount += 1;\n if ((site.pocketDepthMm ?? 0) >= SEVERE_POCKET_MM) deep += 1;\n let row = byTooth.get(site.tooth);\n if (!row) {\n row = { tooth: site.tooth, sites: {} };\n byTooth.set(site.tooth, row);\n }\n row.sites[site.site] = site;\n }\n\n // Sort teeth within a quadrant by their FDI position digit (2nd\n // char) ascending; keep insertion order as a stable fallback.\n const rows = Array.from(byTooth.values());\n const grouped: Array<{\n quadrant: QuadrantId | null;\n teeth: ToothRow[];\n }> = QUADRANT_ORDER.map((q) => ({\n quadrant: q as QuadrantId | null,\n teeth: rows\n .filter((r) => quadrantOf(r.tooth) === q)\n .sort((a, b) => a.tooth.localeCompare(b.tooth, 'en')),\n })).filter((g) => g.teeth.length > 0);\n\n // Teeth with an unparseable FDI quadrant render in their own group\n // so nothing is silently dropped.\n const unassigned = rows.filter((r) => quadrantOf(r.tooth) === null);\n if (unassigned.length > 0) {\n grouped.push({ quadrant: null, teeth: unassigned });\n }\n\n const ids = grouped.flatMap((g) => g.teeth.map((tt) => tt.tooth));\n return {\n quadrants: grouped,\n toothIds: ids,\n siteCount: sCount,\n deepPocketCount: deep,\n };\n }, [sites]);\n\n useAgentRegistration(\n periodontalChartCardAgent,\n {\n getToothIds: () => toothIds,\n getSiteCount: () => siteCount,\n getDeepPocketCount: () => deepPocketCount,\n },\n id,\n );\n\n const formattedDate = useMemo(() => {\n if (!dateIso) return undefined;\n const parsed = new Date(dateIso);\n if (Number.isNaN(parsed.getTime())) return undefined;\n try {\n return new Intl.DateTimeFormat(resolvedLocale, {\n dateStyle: 'medium',\n }).format(parsed);\n } catch {\n return parsed.toISOString().slice(0, 10);\n }\n }, [dateIso, resolvedLocale]);\n\n const resolvedHeading = t(\n 'periodontalChartCard.heading',\n 'Periodontal chart',\n );\n const resolvedAriaLabel = ariaLabel ?? resolvedHeading;\n\n const DENTITION_DEFAULT: Record<typeof dentition, string> = {\n permanent: 'Permanent dentition',\n primary: 'Primary dentition',\n mixed: 'Mixed dentition',\n };\n const dentitionLabel = t(`periodontalChartCard.dentition.${dentition}`, {\n defaultValue: DENTITION_DEFAULT[dentition],\n });\n\n const formatNumber = (n: number): string => {\n try {\n return new Intl.NumberFormat(resolvedLocale, {\n maximumFractionDigits: 1,\n }).format(n);\n } catch {\n return String(n);\n }\n };\n\n /* ------------------------------------------------------------ */\n /* Summary rows */\n /* ------------------------------------------------------------ */\n\n const summaryRows: Array<{ key: string; label: string; value: ReactNode }> =\n [];\n if (summary?.meanPocketDepthMm != null) {\n summaryRows.push({\n key: 'meanPocketDepth',\n label: t(\n 'periodontalChartCard.summary.meanPocketDepth',\n 'Mean probing depth',\n ),\n value: t('periodontalChartCard.unit.mm', {\n value: formatNumber(summary.meanPocketDepthMm),\n defaultValue: '{{value}} mm',\n }),\n });\n }\n if (summary?.bleedingOnProbingPercent != null) {\n summaryRows.push({\n key: 'bleedingOnProbing',\n label: t(\n 'periodontalChartCard.summary.bleedingOnProbing',\n 'Bleeding on probing',\n ),\n value: t('periodontalChartCard.unit.percent', {\n value: formatNumber(summary.bleedingOnProbingPercent),\n defaultValue: '{{value}}%',\n }),\n });\n }\n\n /* ------------------------------------------------------------ */\n /* Render a single measurement cell */\n /* ------------------------------------------------------------ */\n\n const renderMeasure = (\n depth: number | undefined,\n kind: 'pocket' | 'recession',\n ): ReactNode => {\n if (depth == null || !Number.isFinite(depth)) {\n return (\n <span\n aria-hidden=\"true\"\n className=\"ds:text-[color:var(--muted-foreground)]\"\n >\n {t('periodontalChartCard.cell.empty', '–')}\n </span>\n );\n }\n const severity = kind === 'pocket' ? pocketSeverity(depth) : 'normal';\n const marker = kind === 'pocket' ? severityMarker(severity) : '';\n const numeric = formatNumber(depth);\n // The flag is announced as a worded suffix for SR users; sighted\n // users get the colour + bold + asterisk. The asterisk itself is\n // aria-hidden so it isn't read as punctuation.\n const srSuffix =\n severity === 'severe'\n ? ` ${t('periodontalChartCard.flag.severe', 'severe pocket')}`\n : severity === 'moderate'\n ? ` ${t('periodontalChartCard.flag.moderate', 'moderate pocket')}`\n : '';\n return (\n <span className={measureVariants({ severity })}>\n <span>{numeric}</span>\n {marker ? <span aria-hidden=\"true\">{marker}</span> : null}\n {srSuffix ? <span className=\"ds:sr-only\">{srSuffix}</span> : null}\n </span>\n );\n };\n\n /* ------------------------------------------------------------ */\n /* Render bleeding / suppuration indicator cell */\n /* ------------------------------------------------------------ */\n\n const renderSigns = (site: PeriodontalSite | undefined): ReactNode => {\n if (!site || (!site.bleeding && !site.suppuration)) {\n return (\n <span\n aria-hidden=\"true\"\n className=\"ds:text-[color:var(--muted-foreground)]\"\n >\n {t('periodontalChartCard.cell.empty', '–')}\n </span>\n );\n }\n return (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n {site.bleeding ? (\n <span\n role=\"img\"\n aria-label={t(\n 'periodontalChartCard.sign.bleeding',\n 'Bleeding on probing',\n )}\n className=\"ds:inline-block ds:size-2 ds:rounded-[var(--radius-full)] ds:bg-[var(--destructive)]\"\n />\n ) : null}\n {site.suppuration ? (\n <span\n role=\"img\"\n aria-label={t(\n 'periodontalChartCard.sign.suppuration',\n 'Suppuration',\n )}\n className=\"ds:inline-block ds:size-2 ds:rounded-[var(--radius-full)] ds:bg-[var(--warning)]\"\n />\n ) : null}\n </span>\n );\n };\n\n /* ------------------------------------------------------------ */\n /* One quadrant table */\n /* ------------------------------------------------------------ */\n\n const renderQuadrant = (group: {\n quadrant: QuadrantId | null;\n teeth: ToothRow[];\n }): ReactNode => {\n const QUADRANT_DEFAULT: Record<QuadrantId, string> = {\n '1': 'Upper right (Q1)',\n '2': 'Upper left (Q2)',\n '3': 'Lower left (Q3)',\n '4': 'Lower right (Q4)',\n };\n const captionText =\n group.quadrant != null\n ? t(`periodontalChartCard.quadrant.${group.quadrant}`, {\n defaultValue: QUADRANT_DEFAULT[group.quadrant],\n })\n : t('periodontalChartCard.quadrant.other', 'Other teeth');\n const cellClass =\n 'ds:px-[var(--spacing-xs)] ds:py-[var(--spacing-2xs)] ds:text-center ds:border-b ds:border-[color:var(--border)]';\n const rowHeaderClass =\n 'ds:px-[var(--spacing-xs)] ds:py-[var(--spacing-2xs)] ds:text-start ds:font-medium ds:border-b ds:border-[color:var(--border)] ds:whitespace-nowrap';\n return (\n <div\n key={group.quadrant ?? 'other'}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:overflow-x-auto\"\n >\n <table className=\"type-body-sm ds:w-full ds:border-collapse\">\n <caption className=\"type-label ds:text-start ds:mb-[var(--spacing-2xs)] ds:text-[color:var(--muted-foreground)]\">\n {captionText}\n </caption>\n <thead>\n <tr>\n <th\n scope=\"col\"\n className=\"ds:px-[var(--spacing-xs)] ds:py-[var(--spacing-2xs)] ds:text-start ds:border-b ds:border-[color:var(--border)]\"\n >\n {t('periodontalChartCard.column.measure', 'Measurement')}\n </th>\n {group.teeth.map((row) => (\n <th\n key={row.tooth}\n scope=\"col\"\n data-tooth-id={row.tooth}\n className=\"ds:px-[var(--spacing-xs)] ds:py-[var(--spacing-2xs)] ds:text-center ds:border-b ds:border-[color:var(--border)] ds:[font-variant-numeric:var(--font-feature-tabular)] ds:tabular-nums\"\n >\n <span className=\"ds:sr-only\">\n {t('periodontalChartCard.toothHeader', {\n tooth: row.tooth,\n defaultValue: 'Tooth {{tooth}}',\n })}\n </span>\n <span aria-hidden=\"true\">{row.tooth}</span>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {/* Pocket depth row */}\n <tr>\n <th scope=\"row\" className={rowHeaderClass}>\n {t(\n 'periodontalChartCard.row.pocketDepth',\n 'Pocket depth (PD)',\n )}\n </th>\n {group.teeth.map((row) => (\n <td key={row.tooth} className={cellClass}>\n <span className=\"ds:flex ds:items-center ds:justify-center ds:gap-[var(--spacing-2xs)]\">\n {PERIODONTAL_SITE_ORDER.map((siteId) => (\n <span key={siteId} className=\"ds:sr-only\">\n {t(`periodontalChartCard.site.${siteId}`, {\n defaultValue: SITE_DEFAULT[siteId],\n })}\n </span>\n ))}\n <span className=\"ds:flex ds:gap-[var(--spacing-2xs)]\">\n {PERIODONTAL_SITE_ORDER.map((siteId) => (\n <span key={siteId}>\n {renderMeasure(\n row.sites[siteId]?.pocketDepthMm,\n 'pocket',\n )}\n </span>\n ))}\n </span>\n </span>\n </td>\n ))}\n </tr>\n {/* Recession row */}\n <tr>\n <th scope=\"row\" className={rowHeaderClass}>\n {t('periodontalChartCard.row.recession', 'Recession (REC)')}\n </th>\n {group.teeth.map((row) => (\n <td key={row.tooth} className={cellClass}>\n <span className=\"ds:flex ds:gap-[var(--spacing-2xs)] ds:justify-center\">\n {PERIODONTAL_SITE_ORDER.map((siteId) => (\n <span key={siteId}>\n {renderMeasure(\n row.sites[siteId]?.recessionMm,\n 'recession',\n )}\n </span>\n ))}\n </span>\n </td>\n ))}\n </tr>\n {/* Bleeding / suppuration row */}\n <tr>\n <th scope=\"row\" className={rowHeaderClass}>\n {t(\n 'periodontalChartCard.row.signs',\n 'Bleeding / suppuration',\n )}\n </th>\n {group.teeth.map((row) => (\n <td key={row.tooth} className={cellClass}>\n <span className=\"ds:flex ds:gap-[var(--spacing-2xs)] ds:justify-center\">\n {PERIODONTAL_SITE_ORDER.map((siteId) => (\n <span key={siteId}>\n {renderSigns(row.sites[siteId])}\n </span>\n ))}\n </span>\n </td>\n ))}\n </tr>\n {/* Mobility row — only when any tooth in the quadrant has a grade */}\n {mobility &&\n group.teeth.some((row) => mobility[row.tooth] != null) ? (\n <tr>\n <th scope=\"row\" className={rowHeaderClass}>\n {t('periodontalChartCard.row.mobility', 'Mobility')}\n </th>\n {group.teeth.map((row) => {\n const grade = mobility[row.tooth];\n return (\n <td key={row.tooth} className={cellClass}>\n {grade != null ? (\n <Badge\n variant={grade >= 2 ? 'warning' : 'neutral'}\n size=\"sm\"\n aria-label={t(\n 'periodontalChartCard.mobility.label',\n {\n grade,\n defaultValue: 'Mobility grade {{grade}}',\n },\n )}\n >\n {grade}\n </Badge>\n ) : (\n <span\n aria-hidden=\"true\"\n className=\"ds:text-[color:var(--muted-foreground)]\"\n >\n {t('periodontalChartCard.cell.empty', '–')}\n </span>\n )}\n </td>\n );\n })}\n </tr>\n ) : null}\n </tbody>\n </table>\n </div>\n );\n };\n\n /* ------------------------------------------------------------ */\n /* Legend — explains the non-colour cues */\n /* ------------------------------------------------------------ */\n\n const legend = (\n <div\n role=\"group\"\n className=\"type-meta ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)] ds:text-[color:var(--muted-foreground)]\"\n aria-label={t('periodontalChartCard.legend.label', 'Chart legend')}\n >\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <span\n aria-hidden=\"true\"\n className=\"ds:font-semibold ds:text-[color:var(--warning-foreground)]\"\n >\n {'∗'}\n </span>\n {t('periodontalChartCard.legend.moderate', {\n threshold: MODERATE_POCKET_MM,\n defaultValue: 'PD ≥ {{threshold}} mm',\n })}\n </span>\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <span\n aria-hidden=\"true\"\n className=\"ds:font-bold ds:text-[color:var(--destructive)]\"\n >\n {'∗∗'}\n </span>\n {t('periodontalChartCard.legend.severe', {\n threshold: SEVERE_POCKET_MM,\n defaultValue: 'PD ≥ {{threshold}} mm',\n })}\n </span>\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-block ds:size-2 ds:rounded-[var(--radius-full)] ds:bg-[var(--destructive)]\"\n />\n {t('periodontalChartCard.sign.bleeding', 'Bleeding on probing')}\n </span>\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-block ds:size-2 ds:rounded-[var(--radius-full)] ds:bg-[var(--warning)]\"\n />\n {t('periodontalChartCard.sign.suppuration', 'Suppuration')}\n </span>\n </div>\n );\n\n const isEmpty = quadrants.length === 0;\n\n const inner = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <h2\n id={headingId}\n className=\"type-title-card ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {resolvedHeading}\n </h2>\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {formattedDate\n ? t('periodontalChartCard.subtitle.dated', {\n dentition: dentitionLabel,\n date: formattedDate,\n defaultValue: '{{dentition}} · {{date}}',\n })\n : dentitionLabel}\n </p>\n </div>\n\n {summaryRows.length > 0 ? (\n <KeyValueList rowGap=\"sm\">\n {summaryRows.map((row) => (\n <KeyValuePair key={row.key} label={row.label} value={row.value} />\n ))}\n </KeyValueList>\n ) : null}\n\n {isEmpty ? (\n <p\n role=\"status\"\n className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\"\n >\n {t(\n 'periodontalChartCard.empty',\n 'No periodontal readings recorded.',\n )}\n </p>\n ) : (\n <>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {quadrants.map((group) => renderQuadrant(group))}\n </div>\n {legend}\n </>\n )}\n </div>\n );\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={resolvedAriaLabel}\n aria-labelledby={headingId}\n data-component=\"periodontal-chart-card\"\n data-component-id={id}\n id={id}\n className={rootVariants({ surface, className })}\n {...rest}\n >\n {surface === 'elevated' ? (\n <Card variant=\"elevated\">\n <Card.Body>{inner}</Card.Body>\n </Card>\n ) : (\n inner\n )}\n </div>\n );\n },\n);\n\nPeriodontalChartCard.displayName = 'PeriodontalChartCard';\n\nexport type PeriodontalChartCardSurface = NonNullable<\n VariantProps<typeof rootVariants>['surface']\n>;\n"],"names":["periodontalChartCardAgent","handle","rootVariants","cva","measureVariants","MODERATE_POCKET_MM","SEVERE_POCKET_MM","PERIODONTAL_SITE_ORDER","SITE_DEFAULT","QUADRANT_ORDER","pocketSeverity","depth","severityMarker","severity","quadrantOf","tooth","first","PeriodontalChartCard","forwardRef","sites","dateIso","dentition","mobility","summary","locale","surface","ariaLabel","id","className","rest","ref","t","i18n","useTranslation","headingId","useId","resolvedLocale","quadrants","toothIds","siteCount","deepPocketCount","useMemo","byTooth","sCount","deep","site","row","rows","grouped","q","r","a","b","g","unassigned","ids","tt","useAgentRegistration","formattedDate","parsed","resolvedHeading","resolvedAriaLabel","DENTITION_DEFAULT","dentitionLabel","formatNumber","n","summaryRows","renderMeasure","kind","jsx","marker","numeric","srSuffix","renderSigns","jsxs","renderQuadrant","group","QUADRANT_DEFAULT","captionText","cellClass","rowHeaderClass","siteId","_a","grade","Badge","legend","isEmpty","inner","KeyValueList","KeyValuePair","Fragment","Card"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"periodontal-chart-card-HbYTmWlo.js","sources":["../../src/components/periodontal-chart-card/periodontal-chart-card.agent.ts","../../src/components/periodontal-chart-card/periodontal-chart-card.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PeriodontalChartCardHandle } from './periodontal-chart-card';\n\n/* -------------------------------------------------------------------- */\n/* PeriodontalChartCard — agent adapter */\n/* */\n/* Read-only clinical chart. The handle returns STRUCTURAL state only — */\n/* the set of charted FDI tooth ids, how many probing sites breach the */\n/* 4mm / 6mm thresholds, and the chart date. NEVER patient identity, */\n/* names, or any free-text PHI — the chart never holds those. */\n/* -------------------------------------------------------------------- */\n\nexport const periodontalChartCardAgent: AgentAdapter<PeriodontalChartCardHandle> =\n {\n id: 'periodontal-chart-card',\n capabilities: [],\n state: {\n toothIds: {\n type: 'string[]',\n descriptionKey: 'ui.agent.periodontalChartCard.state.toothIds',\n description:\n 'FDI ids of the teeth currently charted. Tooth identifiers only — no patient identity.',\n read: (handle) => handle.getToothIds(),\n },\n siteCount: {\n type: 'number',\n descriptionKey: 'ui.agent.periodontalChartCard.state.siteCount',\n description: 'Total number of probing sites rendered.',\n read: (handle) => handle.getSiteCount(),\n },\n deepPocketCount: {\n type: 'number',\n descriptionKey: 'ui.agent.periodontalChartCard.state.deepPocketCount',\n description:\n 'Number of sites with a probing depth at or above the 6mm severe threshold.',\n read: (handle) => handle.getDeepPocketCount(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'periodontal-chart-card',\n description: 'Marks the PeriodontalChartCard root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n };\n","import {\n forwardRef,\n useId,\n useMemo,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Badge } from '../badge/badge';\nimport { Card } from '../card/card';\nimport { KeyValueList, KeyValuePair } from '../key-value-pair/key-value-pair';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { periodontalChartCardAgent } from './periodontal-chart-card.agent';\n\n/* -------------------------------------------------------------------- */\n/* PeriodontalChartCard */\n/* */\n/* A DISPLAY-ONLY periodontal (gum) chart. There is no kit equivalent — */\n/* the dental ToothScheme charts caries/restorations per tooth, whereas */\n/* a perio chart records probing measurements per SITE (6 sites/tooth): */\n/* pocket depth (PD), gingival recession (REC), bleeding on probing */\n/* (BoP), suppuration, and tooth mobility. */\n/* */\n/* It renders a compact per-quadrant TABLE (real <table>/<th> semantics */\n/* + scope + caption — NOT a colour-only grid) of teeth x sites. Pocket */\n/* depths >= 4mm are flagged with the warning token, >= 6mm with the */\n/* destructive token, and EACH flag also carries a non-colour cue */\n/* (bold weight + an asterisk / double-asterisk) so the severity is */\n/* legible without colour. Bleeding and suppuration render as small */\n/* glyphs WITH an accessible per-cell label. */\n/* */\n/* The component owns no editing affordance — it is a passive read */\n/* surface for a chart captured elsewhere. */\n/* */\n/* All visible text flows through `useTranslation('ui')` against the */\n/* `periodontalChartCard.*` namespace. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* CVA */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n // Matches the kit's other `surface` props. `elevated` wraps in\n // `<Card variant=\"elevated\">`; `flat` drops the chrome for use\n // inside an existing Card / Sheet.\n surface: {\n flat: '',\n elevated: '',\n },\n },\n defaultVariants: { surface: 'elevated' },\n});\n\n// Per-measurement-cell severity. The colour is paired with a weight bump\n// so the flag survives greyscale / forced-colors — colour is never the\n// sole cue (the asterisk in the cell content carries the same signal).\nconst measureVariants = cva(\n 'ds:[font-variant-numeric:var(--font-feature-tabular)] ds:tabular-nums',\n {\n variants: {\n severity: {\n normal: 'ds:text-[color:var(--foreground)]',\n moderate: 'ds:font-semibold ds:text-[color:var(--warning-foreground)]',\n severe: 'ds:font-bold ds:text-[color:var(--destructive)]',\n },\n },\n defaultVariants: { severity: 'normal' },\n },\n);\n\n/* -------------------------------------------------------------------- */\n/* Constants */\n/* -------------------------------------------------------------------- */\n\n/** Probing depth (mm) at/above which a site is flagged moderate. */\nconst MODERATE_POCKET_MM = 4;\n/** Probing depth (mm) at/above which a site is flagged severe. */\nconst SEVERE_POCKET_MM = 6;\n\n/** The six standard probing sites, in buccal-then-lingual display order. */\nexport const PERIODONTAL_SITE_ORDER = [\n 'db',\n 'b',\n 'mb',\n 'dl',\n 'l',\n 'ml',\n] as const;\n\nexport type PeriodontalSiteId = (typeof PERIODONTAL_SITE_ORDER)[number];\n\n/** English fallback labels for the six probing sites (belt-and-braces). */\nconst SITE_DEFAULT: Record<PeriodontalSiteId, string> = {\n db: 'Disto-buccal',\n b: 'Buccal',\n mb: 'Mesio-buccal',\n dl: 'Disto-lingual',\n l: 'Lingual',\n ml: 'Mesio-lingual',\n};\n\n/** FDI quadrant ids (first digit of the FDI tooth number). */\nconst QUADRANT_ORDER = ['1', '2', '3', '4'] as const;\ntype QuadrantId = (typeof QUADRANT_ORDER)[number];\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\n/** One probing-site reading. */\nexport interface PeriodontalSite {\n /** FDI tooth number, e.g. `'11'`, `'46'`. */\n tooth: string;\n /** Probing site: mesio-/disto- buccal/lingual, mid buccal/lingual. */\n site: PeriodontalSiteId;\n /** Pocket depth in millimetres. */\n pocketDepthMm?: number;\n /** Gingival recession in millimetres. */\n recessionMm?: number;\n /** Bleeding on probing at this site. */\n bleeding?: boolean;\n /** Suppuration (pus) at this site. */\n suppuration?: boolean;\n}\n\n/** Aggregate chart summary, consumer-supplied. */\nexport interface PeriodontalChartSummary {\n /** Whole-mouth mean probing depth in millimetres. */\n meanPocketDepthMm?: number;\n /** Bleeding-on-probing as a percentage of sites (0–100). */\n bleedingOnProbingPercent?: number;\n}\n\n/** Tooth-mobility grade (Miller 0–3). */\nexport type PeriodontalMobility = 0 | 1 | 2 | 3;\n\n/** Imperative handle — structural state only, never PHI. */\nexport interface PeriodontalChartCardHandle {\n /** FDI ids of the charted teeth, in display order. */\n getToothIds: () => string[];\n /** Total probing sites rendered. */\n getSiteCount: () => number;\n /** Count of sites at/above the 6mm severe threshold. */\n getDeepPocketCount: () => number;\n}\n\nexport interface PeriodontalChartCardProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children'\n> {\n /** Probing-site readings. Sites are grouped per tooth automatically. */\n sites: PeriodontalSite[];\n /**\n * ISO-8601 date the chart was captured. Rendered as a localised date in\n * the header and exposed as the table caption context. Optional.\n */\n dateIso?: string;\n /**\n * Dentition the chart covers. Drives only the localised header label —\n * tooth grouping is derived from the FDI numbers in `sites`.\n */\n dentition?: 'permanent' | 'primary' | 'mixed';\n /** Per-tooth Miller mobility grade, keyed by FDI tooth number. */\n mobility?: Record<string, PeriodontalMobility>;\n /** Aggregate summary stats rendered above the per-quadrant tables. */\n summary?: PeriodontalChartSummary;\n\n /* ----- i18n / formatting ----- */\n\n /** Locale for date + number formatting. Falls back to `i18n.language`. */\n locale?: string;\n\n /* ----- Styling ----- */\n\n /**\n * `'elevated'` (default) wraps in `<Card variant=\"elevated\">`. `'flat'`\n * drops the Card — use inside another card / sheet.\n */\n surface?: 'flat' | 'elevated';\n\n /* ----- a11y ----- */\n\n /** Override the default region aria-label. */\n 'aria-label'?: string;\n /** Agent-readiness consumer id, surfaced as `data-component-id`. */\n id?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------- */\n\n/** Classify a pocket depth into a severity band. */\nfunction pocketSeverity(\n depth: number | undefined,\n): 'normal' | 'moderate' | 'severe' {\n if (depth == null || !Number.isFinite(depth)) return 'normal';\n if (depth >= SEVERE_POCKET_MM) return 'severe';\n if (depth >= MODERATE_POCKET_MM) return 'moderate';\n return 'normal';\n}\n\n/** Non-colour severity cue appended to the measurement (`''`/`*`/`**`). */\nfunction severityMarker(severity: 'normal' | 'moderate' | 'severe'): string {\n if (severity === 'severe') return '∗∗';\n if (severity === 'moderate') return '∗';\n return '';\n}\n\n/** FDI quadrant (first digit) of a tooth number, or null if unparseable. */\nfunction quadrantOf(tooth: string): QuadrantId | null {\n const first = tooth.trim().charAt(0);\n return (QUADRANT_ORDER as readonly string[]).includes(first)\n ? (first as QuadrantId)\n : null;\n}\n\ninterface ToothRow {\n tooth: string;\n sites: Partial<Record<PeriodontalSiteId, PeriodontalSite>>;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const PeriodontalChartCard = forwardRef<\n HTMLDivElement,\n PeriodontalChartCardProps\n>(\n (\n {\n sites,\n dateIso,\n dentition = 'permanent',\n mobility,\n summary,\n locale,\n surface = 'elevated',\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const headingId = useId();\n const resolvedLocale = locale ?? i18n.language ?? 'en';\n\n // Group sites by tooth, then bucket teeth into FDI quadrants. The\n // grouping is derived purely from the FDI numbers — the consumer\n // passes a flat site list and the kit owns the layout.\n const { quadrants, toothIds, siteCount, deepPocketCount } = useMemo(() => {\n const byTooth = new Map<string, ToothRow>();\n let sCount = 0;\n let deep = 0;\n for (const site of sites) {\n sCount += 1;\n if ((site.pocketDepthMm ?? 0) >= SEVERE_POCKET_MM) deep += 1;\n let row = byTooth.get(site.tooth);\n if (!row) {\n row = { tooth: site.tooth, sites: {} };\n byTooth.set(site.tooth, row);\n }\n row.sites[site.site] = site;\n }\n\n // Sort teeth within a quadrant by their FDI position digit (2nd\n // char) ascending; keep insertion order as a stable fallback.\n const rows = Array.from(byTooth.values());\n const grouped: Array<{\n quadrant: QuadrantId | null;\n teeth: ToothRow[];\n }> = QUADRANT_ORDER.map((q) => ({\n quadrant: q as QuadrantId | null,\n teeth: rows\n .filter((r) => quadrantOf(r.tooth) === q)\n .sort((a, b) => a.tooth.localeCompare(b.tooth, 'en')),\n })).filter((g) => g.teeth.length > 0);\n\n // Teeth with an unparseable FDI quadrant render in their own group\n // so nothing is silently dropped.\n const unassigned = rows.filter((r) => quadrantOf(r.tooth) === null);\n if (unassigned.length > 0) {\n grouped.push({ quadrant: null, teeth: unassigned });\n }\n\n const ids = grouped.flatMap((g) => g.teeth.map((tt) => tt.tooth));\n return {\n quadrants: grouped,\n toothIds: ids,\n siteCount: sCount,\n deepPocketCount: deep,\n };\n }, [sites]);\n\n useAgentRegistration(\n periodontalChartCardAgent,\n {\n getToothIds: () => toothIds,\n getSiteCount: () => siteCount,\n getDeepPocketCount: () => deepPocketCount,\n },\n id,\n );\n\n const formattedDate = useMemo(() => {\n if (!dateIso) return undefined;\n const parsed = new Date(dateIso);\n if (Number.isNaN(parsed.getTime())) return undefined;\n try {\n return new Intl.DateTimeFormat(resolvedLocale, {\n dateStyle: 'medium',\n }).format(parsed);\n } catch {\n return parsed.toISOString().slice(0, 10);\n }\n }, [dateIso, resolvedLocale]);\n\n const resolvedHeading = t(\n 'periodontalChartCard.heading',\n 'Periodontal chart',\n );\n const resolvedAriaLabel = ariaLabel ?? resolvedHeading;\n\n const DENTITION_DEFAULT: Record<typeof dentition, string> = {\n permanent: 'Permanent dentition',\n primary: 'Primary dentition',\n mixed: 'Mixed dentition',\n };\n const dentitionLabel = t(`periodontalChartCard.dentition.${dentition}`, {\n defaultValue: DENTITION_DEFAULT[dentition],\n });\n\n const formatNumber = (n: number): string => {\n try {\n return new Intl.NumberFormat(resolvedLocale, {\n maximumFractionDigits: 1,\n }).format(n);\n } catch {\n return String(n);\n }\n };\n\n /* ------------------------------------------------------------ */\n /* Summary rows */\n /* ------------------------------------------------------------ */\n\n const summaryRows: Array<{ key: string; label: string; value: ReactNode }> =\n [];\n if (summary?.meanPocketDepthMm != null) {\n summaryRows.push({\n key: 'meanPocketDepth',\n label: t(\n 'periodontalChartCard.summary.meanPocketDepth',\n 'Mean probing depth',\n ),\n value: t('periodontalChartCard.unit.mm', {\n value: formatNumber(summary.meanPocketDepthMm),\n defaultValue: '{{value}} mm',\n }),\n });\n }\n if (summary?.bleedingOnProbingPercent != null) {\n summaryRows.push({\n key: 'bleedingOnProbing',\n label: t(\n 'periodontalChartCard.summary.bleedingOnProbing',\n 'Bleeding on probing',\n ),\n value: t('periodontalChartCard.unit.percent', {\n value: formatNumber(summary.bleedingOnProbingPercent),\n defaultValue: '{{value}}%',\n }),\n });\n }\n\n /* ------------------------------------------------------------ */\n /* Render a single measurement cell */\n /* ------------------------------------------------------------ */\n\n const renderMeasure = (\n depth: number | undefined,\n kind: 'pocket' | 'recession',\n ): ReactNode => {\n if (depth == null || !Number.isFinite(depth)) {\n return (\n <span\n aria-hidden=\"true\"\n className=\"ds:text-[color:var(--muted-foreground)]\"\n >\n {t('periodontalChartCard.cell.empty', '–')}\n </span>\n );\n }\n const severity = kind === 'pocket' ? pocketSeverity(depth) : 'normal';\n const marker = kind === 'pocket' ? severityMarker(severity) : '';\n const numeric = formatNumber(depth);\n // The flag is announced as a worded suffix for SR users; sighted\n // users get the colour + bold + asterisk. The asterisk itself is\n // aria-hidden so it isn't read as punctuation.\n const srSuffix =\n severity === 'severe'\n ? ` ${t('periodontalChartCard.flag.severe', 'severe pocket')}`\n : severity === 'moderate'\n ? ` ${t('periodontalChartCard.flag.moderate', 'moderate pocket')}`\n : '';\n return (\n <span className={measureVariants({ severity })}>\n <span>{numeric}</span>\n {marker ? <span aria-hidden=\"true\">{marker}</span> : null}\n {srSuffix ? <span className=\"ds:sr-only\">{srSuffix}</span> : null}\n </span>\n );\n };\n\n /* ------------------------------------------------------------ */\n /* Render bleeding / suppuration indicator cell */\n /* ------------------------------------------------------------ */\n\n const renderSigns = (site: PeriodontalSite | undefined): ReactNode => {\n if (!site || (!site.bleeding && !site.suppuration)) {\n return (\n <span\n aria-hidden=\"true\"\n className=\"ds:text-[color:var(--muted-foreground)]\"\n >\n {t('periodontalChartCard.cell.empty', '–')}\n </span>\n );\n }\n return (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n {site.bleeding ? (\n <span\n role=\"img\"\n aria-label={t(\n 'periodontalChartCard.sign.bleeding',\n 'Bleeding on probing',\n )}\n className=\"ds:inline-block ds:size-2 ds:rounded-[var(--radius-full)] ds:bg-[var(--destructive)]\"\n />\n ) : null}\n {site.suppuration ? (\n <span\n role=\"img\"\n aria-label={t(\n 'periodontalChartCard.sign.suppuration',\n 'Suppuration',\n )}\n className=\"ds:inline-block ds:size-2 ds:rounded-[var(--radius-full)] ds:bg-[var(--warning)]\"\n />\n ) : null}\n </span>\n );\n };\n\n /* ------------------------------------------------------------ */\n /* One quadrant table */\n /* ------------------------------------------------------------ */\n\n const renderQuadrant = (group: {\n quadrant: QuadrantId | null;\n teeth: ToothRow[];\n }): ReactNode => {\n const QUADRANT_DEFAULT: Record<QuadrantId, string> = {\n '1': 'Upper right (Q1)',\n '2': 'Upper left (Q2)',\n '3': 'Lower left (Q3)',\n '4': 'Lower right (Q4)',\n };\n const captionText =\n group.quadrant != null\n ? t(`periodontalChartCard.quadrant.${group.quadrant}`, {\n defaultValue: QUADRANT_DEFAULT[group.quadrant],\n })\n : t('periodontalChartCard.quadrant.other', 'Other teeth');\n const cellClass =\n 'ds:px-[var(--spacing-xs)] ds:py-[var(--spacing-2xs)] ds:text-center ds:border-b ds:border-[color:var(--border)]';\n const rowHeaderClass =\n 'ds:px-[var(--spacing-xs)] ds:py-[var(--spacing-2xs)] ds:text-start ds:font-medium ds:border-b ds:border-[color:var(--border)] ds:whitespace-nowrap';\n return (\n <div\n key={group.quadrant ?? 'other'}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:overflow-x-auto\"\n >\n <table className=\"type-body-sm ds:w-full ds:border-collapse\">\n <caption className=\"type-label ds:text-start ds:mb-[var(--spacing-2xs)] ds:text-[color:var(--muted-foreground)]\">\n {captionText}\n </caption>\n <thead>\n <tr>\n <th\n scope=\"col\"\n className=\"ds:px-[var(--spacing-xs)] ds:py-[var(--spacing-2xs)] ds:text-start ds:border-b ds:border-[color:var(--border)]\"\n >\n {t('periodontalChartCard.column.measure', 'Measurement')}\n </th>\n {group.teeth.map((row) => (\n <th\n key={row.tooth}\n scope=\"col\"\n data-tooth-id={row.tooth}\n className=\"ds:px-[var(--spacing-xs)] ds:py-[var(--spacing-2xs)] ds:text-center ds:border-b ds:border-[color:var(--border)] ds:[font-variant-numeric:var(--font-feature-tabular)] ds:tabular-nums\"\n >\n <span className=\"ds:sr-only\">\n {t('periodontalChartCard.toothHeader', {\n tooth: row.tooth,\n defaultValue: 'Tooth {{tooth}}',\n })}\n </span>\n <span aria-hidden=\"true\">{row.tooth}</span>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {/* Pocket depth row */}\n <tr>\n <th scope=\"row\" className={rowHeaderClass}>\n {t(\n 'periodontalChartCard.row.pocketDepth',\n 'Pocket depth (PD)',\n )}\n </th>\n {group.teeth.map((row) => (\n <td key={row.tooth} className={cellClass}>\n <span className=\"ds:flex ds:items-center ds:justify-center ds:gap-[var(--spacing-2xs)]\">\n {PERIODONTAL_SITE_ORDER.map((siteId) => (\n <span key={siteId} className=\"ds:sr-only\">\n {t(`periodontalChartCard.site.${siteId}`, {\n defaultValue: SITE_DEFAULT[siteId],\n })}\n </span>\n ))}\n <span className=\"ds:flex ds:gap-[var(--spacing-2xs)]\">\n {PERIODONTAL_SITE_ORDER.map((siteId) => (\n <span key={siteId}>\n {renderMeasure(\n row.sites[siteId]?.pocketDepthMm,\n 'pocket',\n )}\n </span>\n ))}\n </span>\n </span>\n </td>\n ))}\n </tr>\n {/* Recession row */}\n <tr>\n <th scope=\"row\" className={rowHeaderClass}>\n {t('periodontalChartCard.row.recession', 'Recession (REC)')}\n </th>\n {group.teeth.map((row) => (\n <td key={row.tooth} className={cellClass}>\n <span className=\"ds:flex ds:gap-[var(--spacing-2xs)] ds:justify-center\">\n {PERIODONTAL_SITE_ORDER.map((siteId) => (\n <span key={siteId}>\n {renderMeasure(\n row.sites[siteId]?.recessionMm,\n 'recession',\n )}\n </span>\n ))}\n </span>\n </td>\n ))}\n </tr>\n {/* Bleeding / suppuration row */}\n <tr>\n <th scope=\"row\" className={rowHeaderClass}>\n {t(\n 'periodontalChartCard.row.signs',\n 'Bleeding / suppuration',\n )}\n </th>\n {group.teeth.map((row) => (\n <td key={row.tooth} className={cellClass}>\n <span className=\"ds:flex ds:gap-[var(--spacing-2xs)] ds:justify-center\">\n {PERIODONTAL_SITE_ORDER.map((siteId) => (\n <span key={siteId}>\n {renderSigns(row.sites[siteId])}\n </span>\n ))}\n </span>\n </td>\n ))}\n </tr>\n {/* Mobility row — only when any tooth in the quadrant has a grade */}\n {mobility &&\n group.teeth.some((row) => mobility[row.tooth] != null) ? (\n <tr>\n <th scope=\"row\" className={rowHeaderClass}>\n {t('periodontalChartCard.row.mobility', 'Mobility')}\n </th>\n {group.teeth.map((row) => {\n const grade = mobility[row.tooth];\n return (\n <td key={row.tooth} className={cellClass}>\n {grade != null ? (\n <Badge\n variant={grade >= 2 ? 'warning' : 'neutral'}\n size=\"sm\"\n aria-label={t(\n 'periodontalChartCard.mobility.label',\n {\n grade,\n defaultValue: 'Mobility grade {{grade}}',\n },\n )}\n >\n {grade}\n </Badge>\n ) : (\n <span\n aria-hidden=\"true\"\n className=\"ds:text-[color:var(--muted-foreground)]\"\n >\n {t('periodontalChartCard.cell.empty', '–')}\n </span>\n )}\n </td>\n );\n })}\n </tr>\n ) : null}\n </tbody>\n </table>\n </div>\n );\n };\n\n /* ------------------------------------------------------------ */\n /* Legend — explains the non-colour cues */\n /* ------------------------------------------------------------ */\n\n const legend = (\n <div\n role=\"group\"\n className=\"type-meta ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)] ds:text-[color:var(--muted-foreground)]\"\n aria-label={t('periodontalChartCard.legend.label', 'Chart legend')}\n >\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <span\n aria-hidden=\"true\"\n className=\"ds:font-semibold ds:text-[color:var(--warning-foreground)]\"\n >\n {'∗'}\n </span>\n {t('periodontalChartCard.legend.moderate', {\n threshold: MODERATE_POCKET_MM,\n defaultValue: 'PD ≥ {{threshold}} mm',\n })}\n </span>\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <span\n aria-hidden=\"true\"\n className=\"ds:font-bold ds:text-[color:var(--destructive)]\"\n >\n {'∗∗'}\n </span>\n {t('periodontalChartCard.legend.severe', {\n threshold: SEVERE_POCKET_MM,\n defaultValue: 'PD ≥ {{threshold}} mm',\n })}\n </span>\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-block ds:size-2 ds:rounded-[var(--radius-full)] ds:bg-[var(--destructive)]\"\n />\n {t('periodontalChartCard.sign.bleeding', 'Bleeding on probing')}\n </span>\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-block ds:size-2 ds:rounded-[var(--radius-full)] ds:bg-[var(--warning)]\"\n />\n {t('periodontalChartCard.sign.suppuration', 'Suppuration')}\n </span>\n </div>\n );\n\n const isEmpty = quadrants.length === 0;\n\n const inner = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <h2\n id={headingId}\n className=\"type-title-card ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {resolvedHeading}\n </h2>\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {formattedDate\n ? t('periodontalChartCard.subtitle.dated', {\n dentition: dentitionLabel,\n date: formattedDate,\n defaultValue: '{{dentition}} · {{date}}',\n })\n : dentitionLabel}\n </p>\n </div>\n\n {summaryRows.length > 0 ? (\n <KeyValueList rowGap=\"sm\">\n {summaryRows.map((row) => (\n <KeyValuePair key={row.key} label={row.label} value={row.value} />\n ))}\n </KeyValueList>\n ) : null}\n\n {isEmpty ? (\n <p\n role=\"status\"\n className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\"\n >\n {t(\n 'periodontalChartCard.empty',\n 'No periodontal readings recorded.',\n )}\n </p>\n ) : (\n <>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {quadrants.map((group) => renderQuadrant(group))}\n </div>\n {legend}\n </>\n )}\n </div>\n );\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={resolvedAriaLabel}\n aria-labelledby={headingId}\n data-component=\"periodontal-chart-card\"\n data-component-id={id}\n id={id}\n className={rootVariants({ surface, className })}\n {...rest}\n >\n {surface === 'elevated' ? (\n <Card variant=\"elevated\">\n <Card.Body>{inner}</Card.Body>\n </Card>\n ) : (\n inner\n )}\n </div>\n );\n },\n);\n\nPeriodontalChartCard.displayName = 'PeriodontalChartCard';\n\nexport type PeriodontalChartCardSurface = NonNullable<\n VariantProps<typeof rootVariants>['surface']\n>;\n"],"names":["periodontalChartCardAgent","handle","rootVariants","cva","measureVariants","MODERATE_POCKET_MM","SEVERE_POCKET_MM","PERIODONTAL_SITE_ORDER","SITE_DEFAULT","QUADRANT_ORDER","pocketSeverity","depth","severityMarker","severity","quadrantOf","tooth","first","PeriodontalChartCard","forwardRef","sites","dateIso","dentition","mobility","summary","locale","surface","ariaLabel","id","className","rest","ref","t","i18n","useTranslation","headingId","useId","resolvedLocale","quadrants","toothIds","siteCount","deepPocketCount","useMemo","byTooth","sCount","deep","site","row","rows","grouped","q","r","a","b","g","unassigned","ids","tt","useAgentRegistration","formattedDate","parsed","resolvedHeading","resolvedAriaLabel","DENTITION_DEFAULT","dentitionLabel","formatNumber","n","summaryRows","renderMeasure","kind","jsx","marker","numeric","srSuffix","renderSigns","jsxs","renderQuadrant","group","QUADRANT_DEFAULT","captionText","cellClass","rowHeaderClass","siteId","_a","grade","Badge","legend","isEmpty","inner","KeyValueList","KeyValuePair","Fragment","Card"],"mappings":"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"}
|
package/dist/_chunks/{periodontal-diagnosis-cco40xTa.js → periodontal-diagnosis-Qk4F3Wc_.js}
RENAMED
|
@@ -2,11 +2,11 @@ import { jsxs as c, jsx as o } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as J, useId as Q, useState as W, useRef as Y } from "react";
|
|
3
3
|
import { c as Z } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as ee } from "react-i18next";
|
|
5
|
-
import { B as te } from "./badge-
|
|
5
|
+
import { B as te } from "./badge-CIt-UFEx.js";
|
|
6
6
|
import { C as j } from "./card-DPmk26CL.js";
|
|
7
7
|
import { C as ae } from "./checkbox-BuZ1u__2.js";
|
|
8
8
|
import { R as y } from "./radio-TWf9Q-mp.js";
|
|
9
|
-
import { R as D } from "./radio-group-
|
|
9
|
+
import { R as D } from "./radio-group-BmIqhIT2.js";
|
|
10
10
|
import { u as oe } from "./registry-DvAUVLHh.js";
|
|
11
11
|
const se = {
|
|
12
12
|
enum: [1, 2, 3, 4],
|
|
@@ -342,4 +342,4 @@ export {
|
|
|
342
342
|
k as i,
|
|
343
343
|
ne as p
|
|
344
344
|
};
|
|
345
|
-
//# sourceMappingURL=periodontal-diagnosis-
|
|
345
|
+
//# sourceMappingURL=periodontal-diagnosis-Qk4F3Wc_.js.map
|
package/dist/_chunks/{periodontal-diagnosis-cco40xTa.js.map → periodontal-diagnosis-Qk4F3Wc_.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"periodontal-diagnosis-cco40xTa.js","sources":["../../src/components/periodontal-diagnosis/periodontal-diagnosis.agent.ts","../../src/components/periodontal-diagnosis/periodontal-diagnosis-data.ts","../../src/components/periodontal-diagnosis/periodontal-diagnosis.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PeriodontalDiagnosisHandle } from './periodontal-diagnosis';\nimport type {\n PeriodontitisExtent,\n PeriodontitisGrade,\n PeriodontitisStage,\n} from './periodontal-diagnosis-data';\n\n/* -------------------------------------------------------------------- */\n/* PeriodontalDiagnosis — agent adapter */\n/* */\n/* Agents can read the recorded stage / grade / extent / factors and the */\n/* worded summary, and can set each field. The free-text clinician note */\n/* (PHI) is never exposed — getDiagnosis() strips it. */\n/* -------------------------------------------------------------------- */\n\nconst STAGE_SCHEMA = {\n enum: [1, 2, 3, 4],\n description: 'Periodontitis stage I–IV, as the integers 1–4.',\n} as const;\nconst GRADE_SCHEMA = {\n enum: ['A', 'B', 'C'],\n description: 'Periodontitis grade A–C (rate of progression).',\n} as const;\nconst EXTENT_SCHEMA = {\n enum: ['localised', 'generalised', 'molarIncisor'],\n description:\n 'Distribution: localised (<30%), generalised (≥30%), or molar-incisor.',\n} as const;\n\nexport const periodontalDiagnosisAgent: AgentAdapter<PeriodontalDiagnosisHandle> =\n {\n id: 'periodontal-diagnosis',\n // set_value — set stage / grade / extent / a factor. Each set_* action's\n // enum argsSchema already conveys that the field is a closed choice.\n capabilities: ['set_value'],\n state: {\n diagnosis: {\n type: 'object',\n descriptionKey: 'ui.agent.periodontalDiagnosis.state.diagnosis',\n description:\n 'Recorded stage (1–4), grade (A–C), extent, and ticked contributing-factor ids. The free-text note is never included.',\n read: (handle) => handle.getDiagnosis(),\n },\n summary: {\n type: 'string',\n descriptionKey: 'ui.agent.periodontalDiagnosis.state.summary',\n description:\n 'The composed, localised diagnosis sentence (e.g. \"Periodontitis — Stage III · Grade B · generalised\").',\n read: (handle) => handle.getSummary(),\n },\n complete: {\n type: 'boolean',\n descriptionKey: 'ui.agent.periodontalDiagnosis.state.complete',\n description: 'True once both a stage and a grade are recorded.',\n read: (handle) => handle.isComplete(),\n },\n },\n actions: {\n get_diagnosis: {\n safety: 'read',\n argsType: '{}',\n argsSchema: { type: 'object', properties: {} },\n returns: 'object',\n returnsSchema: { type: 'object' },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.getDiagnosis',\n description:\n 'Read the recorded stage / grade / extent / factors. The note is never returned.',\n invoke: (handle) => handle.getDiagnosis(),\n },\n set_stage: {\n safety: 'write',\n argsType: '{ stage: 1 | 2 | 3 | 4 }',\n argsSchema: {\n type: 'object',\n properties: { stage: STAGE_SCHEMA },\n required: ['stage'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.setStage',\n description: 'Record the periodontitis stage (I–IV).',\n invoke: (handle, args: { stage: PeriodontitisStage }) => {\n handle.setStage(args.stage);\n },\n },\n set_grade: {\n safety: 'write',\n argsType: \"{ grade: 'A' | 'B' | 'C' }\",\n argsSchema: {\n type: 'object',\n properties: { grade: GRADE_SCHEMA },\n required: ['grade'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.setGrade',\n description: 'Record the periodontitis grade (A–C).',\n invoke: (handle, args: { grade: PeriodontitisGrade }) => {\n handle.setGrade(args.grade);\n },\n },\n set_extent: {\n safety: 'write',\n argsType: \"{ extent: 'localised' | 'generalised' | 'molarIncisor' }\",\n argsSchema: {\n type: 'object',\n properties: { extent: EXTENT_SCHEMA },\n required: ['extent'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.setExtent',\n description: 'Record the distribution / extent.',\n invoke: (handle, args: { extent: PeriodontitisExtent }) => {\n handle.setExtent(args.extent);\n },\n },\n toggle_factor: {\n safety: 'write',\n argsType: '{ id: string; value: boolean }',\n argsSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Contributing-factor id.' },\n value: { type: 'boolean' },\n },\n required: ['id', 'value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.toggleFactor',\n description: 'Tick or clear a contributing factor.',\n invoke: (handle, args: { id: string; value: boolean }) => {\n handle.toggleFactor(args.id, args.value);\n },\n },\n clear_diagnosis: {\n safety: 'destructive',\n argsType: '{}',\n argsSchema: { type: 'object', properties: {} },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.clearDiagnosis',\n description: 'Reset the whole diagnosis to empty.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'periodontal-diagnosis',\n description: 'Marks the PeriodontalDiagnosis root group.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n };\n","/* -------------------------------------------------------------------- */\n/* PeriodontalDiagnosis — data model */\n/* */\n/* The 2017 World Workshop / EFP periodontitis classification: a stage */\n/* (I–IV, severity + complexity), a grade (A–C, rate of progression) and */\n/* an extent (localised / generalised / molar-incisor). The jurisdiction- */\n/* specific *algorithm* that derives stage & grade from clinical findings */\n/* stays in the consumer; this component is the reusable, controllable */\n/* form + summary. A curated checklist of contributing factors gives the */\n/* clinician context without baking one country's logic into the kit. */\n/* -------------------------------------------------------------------- */\n\nexport type PeriodontitisStage = 1 | 2 | 3 | 4;\nexport type PeriodontitisGrade = 'A' | 'B' | 'C';\nexport type PeriodontitisExtent = 'localised' | 'generalised' | 'molarIncisor';\n\nexport const PERIODONTITIS_STAGES: readonly PeriodontitisStage[] = [1, 2, 3, 4];\nexport const PERIODONTITIS_GRADES: readonly PeriodontitisGrade[] = [\n 'A',\n 'B',\n 'C',\n];\nexport const PERIODONTITIS_EXTENTS: readonly PeriodontitisExtent[] = [\n 'localised',\n 'generalised',\n 'molarIncisor',\n];\n\n/** Roman numeral for a stage — matches the WHO / EFP notation. */\nexport const STAGE_ROMAN: Record<PeriodontitisStage, string> = {\n 1: 'I',\n 2: 'II',\n 3: 'III',\n 4: 'IV',\n};\n\n/**\n * The default contributing-factor checklist — the staging (severity) and\n * grading (progression) drivers of the 2017 classification. Consumers can\n * pass their own list of ids to localise the questionnaire.\n */\nexport const DEFAULT_DIAGNOSIS_FACTORS = [\n 'interdentalCal',\n 'radiographicBoneLoss',\n 'toothLossPerio',\n 'probingDepth6',\n 'boneLossAgeOver1',\n 'smoker',\n 'diabetes',\n] as const;\n\nexport type PeriodontalDiagnosisFactor =\n (typeof DEFAULT_DIAGNOSIS_FACTORS)[number];\n\n/** The recorded diagnosis. `note` is free-text PHI and never leaves the UI. */\nexport interface PeriodontalDiagnosisValue {\n stage?: PeriodontitisStage;\n grade?: PeriodontitisGrade;\n extent?: PeriodontitisExtent;\n /** Ids of the ticked contributing factors. */\n factors?: string[];\n /** Free-text clinician note — PHI; excluded from the agent adapter. */\n note?: string;\n}\n\n/** A diagnosis needs at least a stage and a grade to read as complete. */\nexport function isDiagnosisComplete(value: PeriodontalDiagnosisValue): boolean {\n return value.stage != null && value.grade != null;\n}\n\n/** A fresh, empty diagnosis. */\nexport function emptyDiagnosis(): PeriodontalDiagnosisValue {\n return {};\n}\n","import {\n forwardRef,\n useId,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Badge } from '../badge/badge';\nimport { Card } from '../card/card';\nimport { Checkbox } from '../checkbox/checkbox';\nimport { Radio } from '../radio-group/radio';\nimport { RadioGroup } from '../radio-group/radio-group';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { periodontalDiagnosisAgent } from './periodontal-diagnosis.agent';\nimport {\n DEFAULT_DIAGNOSIS_FACTORS,\n emptyDiagnosis,\n isDiagnosisComplete,\n PERIODONTITIS_EXTENTS,\n PERIODONTITIS_GRADES,\n PERIODONTITIS_STAGES,\n STAGE_ROMAN,\n type PeriodontalDiagnosisValue,\n type PeriodontitisExtent,\n type PeriodontitisGrade,\n type PeriodontitisStage,\n} from './periodontal-diagnosis-data';\n\n/* -------------------------------------------------------------------- */\n/* PeriodontalDiagnosis */\n/* */\n/* The 2017 World Workshop / EFP periodontitis classification form: */\n/* stage (I–IV), grade (A–C), extent, and a curated checklist of the */\n/* staging/grading contributing factors. Controlled or uncontrolled. */\n/* The composed summary (\"Periodontitis — Stage III · Grade B · */\n/* generalised\") is the worded, non-colour source of truth. */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n surface: { flat: '', elevated: '' },\n },\n defaultVariants: { surface: 'elevated' },\n});\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\nexport interface PeriodontalDiagnosisHandle {\n /** The recorded stage / grade / extent / factors — never the free-text note. */\n getDiagnosis: () => Omit<PeriodontalDiagnosisValue, 'note'>;\n /** The composed, localised summary sentence. */\n getSummary: () => string;\n /** True once both a stage and a grade are recorded. */\n isComplete: () => boolean;\n setStage: (stage: PeriodontitisStage) => void;\n setGrade: (grade: PeriodontitisGrade) => void;\n setExtent: (extent: PeriodontitisExtent) => void;\n toggleFactor: (id: string, on?: boolean) => void;\n /** Reset to an empty diagnosis. */\n clear: () => void;\n}\n\nexport interface PeriodontalDiagnosisProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children' | 'onChange' | 'defaultValue'\n> {\n /** Controlled value. */\n value?: PeriodontalDiagnosisValue;\n /** Uncontrolled initial value. */\n defaultValue?: PeriodontalDiagnosisValue;\n /** Fires with the next diagnosis whenever the clinician changes a field. */\n onChange?: (value: PeriodontalDiagnosisValue) => void;\n /** `'interactive'` (default) renders the form; `'display'` is read-only. */\n mode?: 'interactive' | 'display';\n /** Disable every control. */\n disabled?: boolean;\n /** Contributing-factor ids for the checklist. Defaults to the WHO-2017 set. */\n factors?: readonly string[];\n /** `'elevated'` (default) wraps in a Card; `'flat'` drops the chrome. */\n surface?: 'flat' | 'elevated';\n /** Override the default region aria-label. */\n 'aria-label'?: string;\n /** Agent-readiness consumer id, surfaced as `data-component-id`. */\n id?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const PeriodontalDiagnosis = forwardRef<\n HTMLDivElement,\n PeriodontalDiagnosisProps\n>(\n (\n {\n value,\n defaultValue,\n onChange,\n mode = 'interactive',\n disabled = false,\n factors = DEFAULT_DIAGNOSIS_FACTORS,\n surface = 'elevated',\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const headingId = useId();\n\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<PeriodontalDiagnosisValue>(\n defaultValue ?? emptyDiagnosis(),\n );\n const current = isControlled ? value : internal;\n\n // Latest committed value — so an agent making several edits in one tick\n // always builds on the previous edit, not a stale render snapshot.\n const valueRef = useRef(current);\n valueRef.current = current;\n\n const commit = (next: PeriodontalDiagnosisValue) => {\n valueRef.current = next;\n if (!isControlled) setInternal(next);\n onChange?.(next);\n };\n\n const setStage = (stage: PeriodontitisStage) =>\n commit({ ...valueRef.current, stage });\n const setGrade = (grade: PeriodontitisGrade) =>\n commit({ ...valueRef.current, grade });\n const setExtent = (extent: PeriodontitisExtent) =>\n commit({ ...valueRef.current, extent });\n const toggleFactor = (factorId: string, on?: boolean) => {\n const set = new Set(valueRef.current.factors ?? []);\n const next = on ?? !set.has(factorId);\n if (next) set.add(factorId);\n else set.delete(factorId);\n commit({ ...valueRef.current, factors: [...set] });\n };\n const clear = () => commit(emptyDiagnosis());\n\n const complete = isDiagnosisComplete(current);\n const activeFactors = current.factors ?? [];\n\n const stageLabel = (s: PeriodontitisStage) =>\n t(`periodontalDiagnosis.stage.option`, {\n roman: STAGE_ROMAN[s],\n defaultValue: `Stage ${STAGE_ROMAN[s]}`,\n });\n const gradeLabel = (g: PeriodontitisGrade) =>\n t(`periodontalDiagnosis.grade.option`, {\n grade: g,\n defaultValue: `Grade ${g}`,\n });\n const extentLabel = (e: PeriodontitisExtent) =>\n t(`periodontalDiagnosis.extent.${e}`, {\n defaultValue:\n e === 'localised'\n ? 'Localised'\n : e === 'generalised'\n ? 'Generalised'\n : 'Molar-incisor',\n });\n const factorLabel = (fid: string) =>\n t(`periodontalDiagnosis.factor.${fid}`, { defaultValue: fid });\n\n // Worded summary sentence — the accessible source of truth.\n const chips: string[] = [];\n if (current.stage != null)\n chips.push(\n t('periodontalDiagnosis.summary.stage', {\n roman: STAGE_ROMAN[current.stage],\n defaultValue: `Stage ${STAGE_ROMAN[current.stage]}`,\n }),\n );\n if (current.grade != null)\n chips.push(\n t('periodontalDiagnosis.summary.grade', {\n grade: current.grade,\n defaultValue: `Grade ${current.grade}`,\n }),\n );\n if (current.extent != null) chips.push(extentLabel(current.extent));\n const summary = chips.length\n ? `${t('periodontalDiagnosis.term', 'Periodontitis')} — ${chips.join(' · ')}`\n : t('periodontalDiagnosis.summary.none', 'No diagnosis recorded yet');\n\n useAgentRegistration(\n periodontalDiagnosisAgent,\n {\n getDiagnosis: () => {\n const { note: _note, ...rest2 } = valueRef.current;\n return rest2;\n },\n getSummary: () => summary,\n isComplete: () => isDiagnosisComplete(valueRef.current),\n setStage,\n setGrade,\n setExtent,\n toggleFactor,\n clear,\n },\n id,\n );\n\n const heading = t('periodontalDiagnosis.heading', 'Periodontal diagnosis');\n const resolvedAriaLabel = ariaLabel ?? heading;\n\n const readonlyView = (\n <dl className=\"type-body-sm ds:grid ds:grid-cols-[auto_1fr] ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-2xs)] ds:m-0\">\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">\n {t('periodontalDiagnosis.stage.label', 'Staging')}\n </dt>\n <dd className=\"ds:m-0\">\n {current.stage != null\n ? stageLabel(current.stage)\n : t('periodontalDiagnosis.unset', '—')}\n </dd>\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">\n {t('periodontalDiagnosis.grade.label', 'Grading')}\n </dt>\n <dd className=\"ds:m-0\">\n {current.grade != null\n ? gradeLabel(current.grade)\n : t('periodontalDiagnosis.unset', '—')}\n </dd>\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">\n {t('periodontalDiagnosis.extent.label', 'Extent')}\n </dt>\n <dd className=\"ds:m-0\">\n {current.extent != null\n ? extentLabel(current.extent)\n : t('periodontalDiagnosis.unset', '—')}\n </dd>\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">\n {t('periodontalDiagnosis.factors.label', 'Contributing factors')}\n </dt>\n <dd className=\"ds:m-0\">\n {activeFactors.length\n ? activeFactors.map((fid) => factorLabel(fid)).join(', ')\n : t('periodontalDiagnosis.unset', '—')}\n </dd>\n </dl>\n );\n\n const formView = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]\">\n <RadioGroup\n variant=\"horizontal\"\n label={t('periodontalDiagnosis.stage.label', 'Staging')}\n description={t(\n 'periodontalDiagnosis.stage.description',\n 'Severity and complexity of management.',\n )}\n value={current.stage != null ? String(current.stage) : ''}\n onValueChange={(v) => setStage(Number(v) as PeriodontitisStage)}\n disabled={disabled}\n >\n {PERIODONTITIS_STAGES.map((s) => (\n <Radio key={s} value={String(s)} label={stageLabel(s)} />\n ))}\n </RadioGroup>\n\n <RadioGroup\n variant=\"horizontal\"\n label={t('periodontalDiagnosis.grade.label', 'Grading')}\n description={t(\n 'periodontalDiagnosis.grade.description',\n 'Rate of progression.',\n )}\n value={current.grade ?? ''}\n onValueChange={(v) => setGrade(v as PeriodontitisGrade)}\n disabled={disabled}\n >\n {PERIODONTITIS_GRADES.map((g) => (\n <Radio key={g} value={g} label={gradeLabel(g)} />\n ))}\n </RadioGroup>\n\n <RadioGroup\n variant=\"horizontal\"\n label={t('periodontalDiagnosis.extent.label', 'Extent')}\n value={current.extent ?? ''}\n onValueChange={(v) => setExtent(v as PeriodontitisExtent)}\n disabled={disabled}\n >\n {PERIODONTITIS_EXTENTS.map((e) => (\n <Radio key={e} value={e} label={extentLabel(e)} />\n ))}\n </RadioGroup>\n\n <fieldset className=\"ds:m-0 ds:border-0 ds:p-0\">\n <legend className=\"type-label ds:mb-[var(--spacing-xs)] ds:p-0 ds:text-[color:var(--foreground)]\">\n {t('periodontalDiagnosis.factors.label', 'Contributing factors')}\n </legend>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {factors.map((fid) => (\n <Checkbox\n key={fid}\n label={factorLabel(fid)}\n checked={activeFactors.includes(fid)}\n onCheckedChange={(c) => toggleFactor(fid, c === true)}\n disabled={disabled}\n />\n ))}\n </div>\n </fieldset>\n </div>\n );\n\n const inner = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <h2\n id={headingId}\n className=\"type-title-card ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {heading}\n </h2>\n <Badge variant={complete ? 'brand' : 'neutral'} size=\"md\">\n {complete\n ? t('periodontalDiagnosis.status.complete', 'Complete')\n : t('periodontalDiagnosis.status.incomplete', 'Incomplete')}\n </Badge>\n </div>\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--foreground)]\">\n {summary}\n </p>\n {mode === 'display' ? readonlyView : formView}\n </div>\n );\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={resolvedAriaLabel}\n data-component=\"periodontal-diagnosis\"\n data-component-id={id}\n id={id}\n className={rootVariants({ surface, className })}\n {...rest}\n >\n {surface === 'elevated' ? (\n <Card variant=\"elevated\">\n <Card.Body>{inner}</Card.Body>\n </Card>\n ) : (\n inner\n )}\n </div>\n );\n },\n);\n\nPeriodontalDiagnosis.displayName = 'PeriodontalDiagnosis';\n\nexport type PeriodontalDiagnosisSurface = NonNullable<\n VariantProps<typeof rootVariants>['surface']\n>;\n"],"names":["STAGE_SCHEMA","GRADE_SCHEMA","EXTENT_SCHEMA","periodontalDiagnosisAgent","handle","args","PERIODONTITIS_STAGES","PERIODONTITIS_GRADES","PERIODONTITIS_EXTENTS","STAGE_ROMAN","DEFAULT_DIAGNOSIS_FACTORS","isDiagnosisComplete","value","emptyDiagnosis","rootVariants","cva","PeriodontalDiagnosis","forwardRef","defaultValue","onChange","mode","disabled","factors","surface","ariaLabel","id","className","rest","ref","useTranslation","headingId","useId","isControlled","internal","setInternal","useState","current","valueRef","useRef","commit","next","setStage","stage","setGrade","grade","setExtent","extent","toggleFactor","factorId","on","set","clear","complete","activeFactors","stageLabel","s","gradeLabel","g","extentLabel","factorLabel","fid","chips","summary","useAgentRegistration","_note","rest2","heading","resolvedAriaLabel","readonlyView","jsxs","jsx","formView","RadioGroup","v","Radio","Checkbox","c","inner","Badge","Card"],"mappings":";;;;;;;;;;AAgBA,MAAMA,KAAe;AAAA,EACnB,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,EACjB,aAAa;AACf,GACMC,KAAe;AAAA,EACnB,MAAM,CAAC,KAAK,KAAK,GAAG;AAAA,EACpB,aAAa;AACf,GACMC,KAAgB;AAAA,EACpB,MAAM,CAAC,aAAa,eAAe,cAAc;AAAA,EACjD,aACE;AACJ,GAEaC,KACX;AAAA,EACE,IAAI;AAAA;AAAA;AAAA,EAGJ,cAAc,CAAC,WAAW;AAAA,EAC1B,OAAO;AAAA,IACL,WAAW;AAAA,MACT,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aACE;AAAA,MACF,MAAM,CAACC,MAAWA,EAAO,aAAA;AAAA,IAAa;AAAA,IAExC,SAAS;AAAA,MACP,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aACE;AAAA,MACF,MAAM,CAACA,MAAWA,EAAO,WAAA;AAAA,IAAW;AAAA,IAEtC,UAAU;AAAA,MACR,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,MAAM,CAACA,MAAWA,EAAO,WAAA;AAAA,IAAW;AAAA,EACtC;AAAA,EAEF,SAAS;AAAA,IACP,eAAe;AAAA,MACb,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY,EAAE,MAAM,UAAU,YAAY,CAAA,EAAC;AAAA,MAC3C,SAAS;AAAA,MACT,eAAe,EAAE,MAAM,SAAA;AAAA,MACvB,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aACE;AAAA,MACF,QAAQ,CAACA,MAAWA,EAAO,aAAA;AAAA,IAAa;AAAA,IAE1C,WAAW;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY,EAAE,OAAOJ,GAAA;AAAA,QACrB,UAAU,CAAC,OAAO;AAAA,MAAA;AAAA,MAEpB,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACI,GAAQC,MAAwC;AACvD,QAAAD,EAAO,SAASC,EAAK,KAAK;AAAA,MAC5B;AAAA,IAAA;AAAA,IAEF,WAAW;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY,EAAE,OAAOJ,GAAA;AAAA,QACrB,UAAU,CAAC,OAAO;AAAA,MAAA;AAAA,MAEpB,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACG,GAAQC,MAAwC;AACvD,QAAAD,EAAO,SAASC,EAAK,KAAK;AAAA,MAC5B;AAAA,IAAA;AAAA,IAEF,YAAY;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY,EAAE,QAAQH,GAAA;AAAA,QACtB,UAAU,CAAC,QAAQ;AAAA,MAAA;AAAA,MAErB,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACE,GAAQC,MAA0C;AACzD,QAAAD,EAAO,UAAUC,EAAK,MAAM;AAAA,MAC9B;AAAA,IAAA;AAAA,IAEF,eAAe;AAAA,MACb,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY;AAAA,UACV,IAAI,EAAE,MAAM,UAAU,aAAa,0BAAA;AAAA,UACnC,OAAO,EAAE,MAAM,UAAA;AAAA,QAAU;AAAA,QAE3B,UAAU,CAAC,MAAM,OAAO;AAAA,MAAA;AAAA,MAE1B,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACD,GAAQC,MAAyC;AACxD,QAAAD,EAAO,aAAaC,EAAK,IAAIA,EAAK,KAAK;AAAA,MACzC;AAAA,IAAA;AAAA,IAEF,iBAAiB;AAAA,MACf,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY,EAAE,MAAM,UAAU,YAAY,CAAA,EAAC;AAAA,MAC3C,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACD,MAAW;AAClB,QAAAA,EAAO,MAAA;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAAA,EAEF,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IAAA;AAAA,IAEf,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GC9IWE,KAAsD,CAAC,GAAG,GAAG,GAAG,CAAC,GACjEC,KAAsD;AAAA,EACjE;AAAA,EACA;AAAA,EACA;AACF,GACaC,KAAwD;AAAA,EACnE;AAAA,EACA;AAAA,EACA;AACF,GAGaC,IAAkD;AAAA,EAC7D,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL,GAOaC,KAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAiBO,SAASC,EAAoBC,GAA2C;AAC7E,SAAOA,EAAM,SAAS,QAAQA,EAAM,SAAS;AAC/C;AAGO,SAASC,IAA4C;AAC1D,SAAO,CAAA;AACT;ACjCA,MAAMC,KAAeC,EAAI,+CAA+C;AAAA,EACtE,UAAU;AAAA,IACR,SAAS,EAAE,MAAM,IAAI,UAAU,GAAA;AAAA,EAAG;AAAA,EAEpC,iBAAiB,EAAE,SAAS,WAAA;AAC9B,CAAC,GAiDYC,KAAuBC;AAAA,EAIlC,CACE;AAAA,IACE,OAAAL;AAAA,IACA,cAAAM;AAAA,IACA,UAAAC;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,UAAAC,IAAW;AAAA,IACX,SAAAC,IAAUZ;AAAA,IACV,SAAAa,IAAU;AAAA,IACV,cAAcC;AAAA,IACd,IAAAC;AAAA,IACA,WAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,EAAA,IAAMC,GAAA,GACRC,IAAYC,EAAA,GAEZC,IAAepB,MAAU,QACzB,CAACqB,GAAUC,CAAW,IAAIC;AAAA,MAC9BjB,KAAgBL,EAAA;AAAA,IAAe,GAE3BuB,IAAUJ,IAAepB,IAAQqB,GAIjCI,IAAWC,EAAOF,CAAO;AAC/B,IAAAC,EAAS,UAAUD;AAEnB,UAAMG,IAAS,CAACC,MAAoC;AAClD,MAAAH,EAAS,UAAUG,GACdR,KAAcE,EAAYM,CAAI,GACnCrB,KAAA,QAAAA,EAAWqB;AAAA,IACb,GAEMC,IAAW,CAACC,MAChBH,EAAO,EAAE,GAAGF,EAAS,SAAS,OAAAK,GAAO,GACjCC,IAAW,CAACC,MAChBL,EAAO,EAAE,GAAGF,EAAS,SAAS,OAAAO,GAAO,GACjCC,IAAY,CAACC,MACjBP,EAAO,EAAE,GAAGF,EAAS,SAAS,QAAAS,GAAQ,GAClCC,IAAe,CAACC,GAAkBC,MAAiB;AACvD,YAAMC,IAAM,IAAI,IAAIb,EAAS,QAAQ,WAAW,EAAE;AAElD,MADaY,KAAM,CAACC,EAAI,IAAIF,CAAQ,IAC1BE,EAAI,IAAIF,CAAQ,IACrBE,EAAI,OAAOF,CAAQ,GACxBT,EAAO,EAAE,GAAGF,EAAS,SAAS,SAAS,CAAC,GAAGa,CAAG,GAAG;AAAA,IACnD,GACMC,IAAQ,MAAMZ,EAAO1B,GAAgB,GAErCuC,IAAWzC,EAAoByB,CAAO,GACtCiB,IAAgBjB,EAAQ,WAAW,CAAA,GAEnCkB,IAAa,CAACC,MAClB,EAAE,qCAAqC;AAAA,MACrC,OAAO9C,EAAY8C,CAAC;AAAA,MACpB,cAAc,SAAS9C,EAAY8C,CAAC,CAAC;AAAA,IAAA,CACtC,GACGC,IAAa,CAACC,MAClB,EAAE,qCAAqC;AAAA,MACrC,OAAOA;AAAA,MACP,cAAc,SAASA,CAAC;AAAA,IAAA,CACzB,GACGC,IAAc,CAAC,MACnB,EAAE,+BAA+B,CAAC,IAAI;AAAA,MACpC,cACE,MAAM,cACF,cACA,MAAM,gBACJ,gBACA;AAAA,IAAA,CACT,GACGC,IAAc,CAACC,MACnB,EAAE,+BAA+BA,CAAG,IAAI,EAAE,cAAcA,GAAK,GAGzDC,IAAkB,CAAA;AACxB,IAAIzB,EAAQ,SAAS,QACnByB,EAAM;AAAA,MACJ,EAAE,sCAAsC;AAAA,QACtC,OAAOpD,EAAY2B,EAAQ,KAAK;AAAA,QAChC,cAAc,SAAS3B,EAAY2B,EAAQ,KAAK,CAAC;AAAA,MAAA,CAClD;AAAA,IAAA,GAEDA,EAAQ,SAAS,QACnByB,EAAM;AAAA,MACJ,EAAE,sCAAsC;AAAA,QACtC,OAAOzB,EAAQ;AAAA,QACf,cAAc,SAASA,EAAQ,KAAK;AAAA,MAAA,CACrC;AAAA,IAAA,GAEDA,EAAQ,UAAU,QAAMyB,EAAM,KAAKH,EAAYtB,EAAQ,MAAM,CAAC;AAClE,UAAM0B,IAAUD,EAAM,SAClB,GAAG,EAAE,6BAA6B,eAAe,CAAC,MAAMA,EAAM,KAAK,KAAK,CAAC,KACzE,EAAE,qCAAqC,2BAA2B;AAEtE,IAAAE;AAAA,MACE5D;AAAA,MACA;AAAA,QACE,cAAc,MAAM;AAClB,gBAAM,EAAE,MAAM6D,GAAO,GAAGC,EAAA,IAAU5B,EAAS;AAC3C,iBAAO4B;AAAA,QACT;AAAA,QACA,YAAY,MAAMH;AAAA,QAClB,YAAY,MAAMnD,EAAoB0B,EAAS,OAAO;AAAA,QACtD,UAAAI;AAAA,QACA,UAAAE;AAAA,QACA,WAAAE;AAAA,QACA,cAAAE;AAAA,QACA,OAAAI;AAAA,MAAA;AAAA,MAEF1B;AAAA,IAAA;AAGF,UAAMyC,IAAU,EAAE,gCAAgC,uBAAuB,GACnEC,IAAoB3C,KAAa0C,GAEjCE,IACJ,gBAAAC,EAAC,MAAA,EAAG,WAAU,kHACZ,UAAA;AAAA,MAAA,gBAAAC,EAAC,QAAG,WAAU,2CACX,UAAA,EAAE,oCAAoC,SAAS,GAClD;AAAA,MACA,gBAAAA,EAAC,MAAA,EAAG,WAAU,UACX,YAAQ,SAAS,OACdhB,EAAWlB,EAAQ,KAAK,IACxB,EAAE,8BAA8B,GAAG,GACzC;AAAA,wBACC,MAAA,EAAG,WAAU,2CACX,UAAA,EAAE,oCAAoC,SAAS,GAClD;AAAA,MACA,gBAAAkC,EAAC,MAAA,EAAG,WAAU,UACX,YAAQ,SAAS,OACdd,EAAWpB,EAAQ,KAAK,IACxB,EAAE,8BAA8B,GAAG,GACzC;AAAA,wBACC,MAAA,EAAG,WAAU,2CACX,UAAA,EAAE,qCAAqC,QAAQ,GAClD;AAAA,MACA,gBAAAkC,EAAC,MAAA,EAAG,WAAU,UACX,YAAQ,UAAU,OACfZ,EAAYtB,EAAQ,MAAM,IAC1B,EAAE,8BAA8B,GAAG,GACzC;AAAA,wBACC,MAAA,EAAG,WAAU,2CACX,UAAA,EAAE,sCAAsC,sBAAsB,GACjE;AAAA,MACA,gBAAAkC,EAAC,QAAG,WAAU,UACX,YAAc,SACXjB,EAAc,IAAI,CAACO,MAAQD,EAAYC,CAAG,CAAC,EAAE,KAAK,IAAI,IACtD,EAAE,8BAA8B,GAAG,EAAA,CACzC;AAAA,IAAA,GACF,GAGIW,IACJ,gBAAAF,EAAC,OAAA,EAAI,WAAU,kDACb,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,OAAO,EAAE,oCAAoC,SAAS;AAAA,UACtD,aAAa;AAAA,YACX;AAAA,YACA;AAAA,UAAA;AAAA,UAEF,OAAOpC,EAAQ,SAAS,OAAO,OAAOA,EAAQ,KAAK,IAAI;AAAA,UACvD,eAAe,CAACqC,MAAMhC,EAAS,OAAOgC,CAAC,CAAuB;AAAA,UAC9D,UAAApD;AAAA,UAEC,UAAAf,GAAqB,IAAI,CAACiD,wBACxBmB,GAAA,EAAc,OAAO,OAAOnB,CAAC,GAAG,OAAOD,EAAWC,CAAC,EAAA,GAAxCA,CAA2C,CACxD;AAAA,QAAA;AAAA,MAAA;AAAA,MAGH,gBAAAe;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,OAAO,EAAE,oCAAoC,SAAS;AAAA,UACtD,aAAa;AAAA,YACX;AAAA,YACA;AAAA,UAAA;AAAA,UAEF,OAAOpC,EAAQ,SAAS;AAAA,UACxB,eAAe,CAACqC,MAAM9B,EAAS8B,CAAuB;AAAA,UACtD,UAAApD;AAAA,UAEC,UAAAd,GAAqB,IAAI,CAACkD,MACzB,gBAAAa,EAACI,GAAA,EAAc,OAAOjB,GAAG,OAAOD,EAAWC,CAAC,EAAA,GAAhCA,CAAmC,CAChD;AAAA,QAAA;AAAA,MAAA;AAAA,MAGH,gBAAAa;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,OAAO,EAAE,qCAAqC,QAAQ;AAAA,UACtD,OAAOpC,EAAQ,UAAU;AAAA,UACzB,eAAe,CAACqC,MAAM5B,EAAU4B,CAAwB;AAAA,UACxD,UAAApD;AAAA,UAEC,UAAAb,GAAsB,IAAI,CAAC,MAC1B,gBAAA8D,EAACI,GAAA,EAAc,OAAO,GAAG,OAAOhB,EAAY,CAAC,EAAA,GAAjC,CAAoC,CACjD;AAAA,QAAA;AAAA,MAAA;AAAA,MAGH,gBAAAW,EAAC,YAAA,EAAS,WAAU,6BAClB,UAAA;AAAA,QAAA,gBAAAC,EAAC,YAAO,WAAU,iFACf,UAAA,EAAE,sCAAsC,sBAAsB,GACjE;AAAA,0BACC,OAAA,EAAI,WAAU,kDACZ,UAAAhD,EAAQ,IAAI,CAACsC,MACZ,gBAAAU;AAAA,UAACK;AAAA,UAAA;AAAA,YAEC,OAAOhB,EAAYC,CAAG;AAAA,YACtB,SAASP,EAAc,SAASO,CAAG;AAAA,YACnC,iBAAiB,CAACgB,MAAM7B,EAAaa,GAAKgB,MAAM,EAAI;AAAA,YACpD,UAAAvD;AAAA,UAAA;AAAA,UAJKuC;AAAA,QAAA,CAMR,EAAA,CACH;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF,GAGIiB,IACJ,gBAAAR,EAAC,OAAA,EAAI,WAAU,kDACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,sFACb,UAAA;AAAA,QAAA,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAIxC;AAAA,YACJ,WAAU;AAAA,YAET,UAAAoC;AAAA,UAAA;AAAA,QAAA;AAAA,0BAEFY,IAAA,EAAM,SAAS1B,IAAW,UAAU,WAAW,MAAK,MAClD,UAAAA,IACG,EAAE,wCAAwC,UAAU,IACpD,EAAE,0CAA0C,YAAY,EAAA,CAC9D;AAAA,MAAA,GACF;AAAA,MACA,gBAAAkB,EAAC,KAAA,EAAE,WAAU,yDACV,UAAAR,GACH;AAAA,MACC1C,MAAS,YAAYgD,IAAeG;AAAA,IAAA,GACvC;AAGF,WACE,gBAAAD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAA1C;AAAA,QACA,MAAK;AAAA,QACL,cAAYuC;AAAA,QACZ,kBAAe;AAAA,QACf,qBAAmB1C;AAAA,QACnB,IAAAA;AAAA,QACA,WAAWX,GAAa,EAAE,SAAAS,GAAS,WAAAG,GAAW;AAAA,QAC7C,GAAGC;AAAA,QAEH,UAAAJ,MAAY,aACX,gBAAA+C,EAACS,GAAA,EAAK,SAAQ,YACZ,UAAA,gBAAAT,EAACS,EAAK,MAAL,EAAW,UAAAF,EAAA,CAAM,EAAA,CACpB,IAEAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEA7D,GAAqB,cAAc;"}
|
|
1
|
+
{"version":3,"file":"periodontal-diagnosis-Qk4F3Wc_.js","sources":["../../src/components/periodontal-diagnosis/periodontal-diagnosis.agent.ts","../../src/components/periodontal-diagnosis/periodontal-diagnosis-data.ts","../../src/components/periodontal-diagnosis/periodontal-diagnosis.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PeriodontalDiagnosisHandle } from './periodontal-diagnosis';\nimport type {\n PeriodontitisExtent,\n PeriodontitisGrade,\n PeriodontitisStage,\n} from './periodontal-diagnosis-data';\n\n/* -------------------------------------------------------------------- */\n/* PeriodontalDiagnosis — agent adapter */\n/* */\n/* Agents can read the recorded stage / grade / extent / factors and the */\n/* worded summary, and can set each field. The free-text clinician note */\n/* (PHI) is never exposed — getDiagnosis() strips it. */\n/* -------------------------------------------------------------------- */\n\nconst STAGE_SCHEMA = {\n enum: [1, 2, 3, 4],\n description: 'Periodontitis stage I–IV, as the integers 1–4.',\n} as const;\nconst GRADE_SCHEMA = {\n enum: ['A', 'B', 'C'],\n description: 'Periodontitis grade A–C (rate of progression).',\n} as const;\nconst EXTENT_SCHEMA = {\n enum: ['localised', 'generalised', 'molarIncisor'],\n description:\n 'Distribution: localised (<30%), generalised (≥30%), or molar-incisor.',\n} as const;\n\nexport const periodontalDiagnosisAgent: AgentAdapter<PeriodontalDiagnosisHandle> =\n {\n id: 'periodontal-diagnosis',\n // set_value — set stage / grade / extent / a factor. Each set_* action's\n // enum argsSchema already conveys that the field is a closed choice.\n capabilities: ['set_value'],\n state: {\n diagnosis: {\n type: 'object',\n descriptionKey: 'ui.agent.periodontalDiagnosis.state.diagnosis',\n description:\n 'Recorded stage (1–4), grade (A–C), extent, and ticked contributing-factor ids. The free-text note is never included.',\n read: (handle) => handle.getDiagnosis(),\n },\n summary: {\n type: 'string',\n descriptionKey: 'ui.agent.periodontalDiagnosis.state.summary',\n description:\n 'The composed, localised diagnosis sentence (e.g. \"Periodontitis — Stage III · Grade B · generalised\").',\n read: (handle) => handle.getSummary(),\n },\n complete: {\n type: 'boolean',\n descriptionKey: 'ui.agent.periodontalDiagnosis.state.complete',\n description: 'True once both a stage and a grade are recorded.',\n read: (handle) => handle.isComplete(),\n },\n },\n actions: {\n get_diagnosis: {\n safety: 'read',\n argsType: '{}',\n argsSchema: { type: 'object', properties: {} },\n returns: 'object',\n returnsSchema: { type: 'object' },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.getDiagnosis',\n description:\n 'Read the recorded stage / grade / extent / factors. The note is never returned.',\n invoke: (handle) => handle.getDiagnosis(),\n },\n set_stage: {\n safety: 'write',\n argsType: '{ stage: 1 | 2 | 3 | 4 }',\n argsSchema: {\n type: 'object',\n properties: { stage: STAGE_SCHEMA },\n required: ['stage'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.setStage',\n description: 'Record the periodontitis stage (I–IV).',\n invoke: (handle, args: { stage: PeriodontitisStage }) => {\n handle.setStage(args.stage);\n },\n },\n set_grade: {\n safety: 'write',\n argsType: \"{ grade: 'A' | 'B' | 'C' }\",\n argsSchema: {\n type: 'object',\n properties: { grade: GRADE_SCHEMA },\n required: ['grade'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.setGrade',\n description: 'Record the periodontitis grade (A–C).',\n invoke: (handle, args: { grade: PeriodontitisGrade }) => {\n handle.setGrade(args.grade);\n },\n },\n set_extent: {\n safety: 'write',\n argsType: \"{ extent: 'localised' | 'generalised' | 'molarIncisor' }\",\n argsSchema: {\n type: 'object',\n properties: { extent: EXTENT_SCHEMA },\n required: ['extent'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.setExtent',\n description: 'Record the distribution / extent.',\n invoke: (handle, args: { extent: PeriodontitisExtent }) => {\n handle.setExtent(args.extent);\n },\n },\n toggle_factor: {\n safety: 'write',\n argsType: '{ id: string; value: boolean }',\n argsSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Contributing-factor id.' },\n value: { type: 'boolean' },\n },\n required: ['id', 'value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.toggleFactor',\n description: 'Tick or clear a contributing factor.',\n invoke: (handle, args: { id: string; value: boolean }) => {\n handle.toggleFactor(args.id, args.value);\n },\n },\n clear_diagnosis: {\n safety: 'destructive',\n argsType: '{}',\n argsSchema: { type: 'object', properties: {} },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.clearDiagnosis',\n description: 'Reset the whole diagnosis to empty.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'periodontal-diagnosis',\n description: 'Marks the PeriodontalDiagnosis root group.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n };\n","/* -------------------------------------------------------------------- */\n/* PeriodontalDiagnosis — data model */\n/* */\n/* The 2017 World Workshop / EFP periodontitis classification: a stage */\n/* (I–IV, severity + complexity), a grade (A–C, rate of progression) and */\n/* an extent (localised / generalised / molar-incisor). The jurisdiction- */\n/* specific *algorithm* that derives stage & grade from clinical findings */\n/* stays in the consumer; this component is the reusable, controllable */\n/* form + summary. A curated checklist of contributing factors gives the */\n/* clinician context without baking one country's logic into the kit. */\n/* -------------------------------------------------------------------- */\n\nexport type PeriodontitisStage = 1 | 2 | 3 | 4;\nexport type PeriodontitisGrade = 'A' | 'B' | 'C';\nexport type PeriodontitisExtent = 'localised' | 'generalised' | 'molarIncisor';\n\nexport const PERIODONTITIS_STAGES: readonly PeriodontitisStage[] = [1, 2, 3, 4];\nexport const PERIODONTITIS_GRADES: readonly PeriodontitisGrade[] = [\n 'A',\n 'B',\n 'C',\n];\nexport const PERIODONTITIS_EXTENTS: readonly PeriodontitisExtent[] = [\n 'localised',\n 'generalised',\n 'molarIncisor',\n];\n\n/** Roman numeral for a stage — matches the WHO / EFP notation. */\nexport const STAGE_ROMAN: Record<PeriodontitisStage, string> = {\n 1: 'I',\n 2: 'II',\n 3: 'III',\n 4: 'IV',\n};\n\n/**\n * The default contributing-factor checklist — the staging (severity) and\n * grading (progression) drivers of the 2017 classification. Consumers can\n * pass their own list of ids to localise the questionnaire.\n */\nexport const DEFAULT_DIAGNOSIS_FACTORS = [\n 'interdentalCal',\n 'radiographicBoneLoss',\n 'toothLossPerio',\n 'probingDepth6',\n 'boneLossAgeOver1',\n 'smoker',\n 'diabetes',\n] as const;\n\nexport type PeriodontalDiagnosisFactor =\n (typeof DEFAULT_DIAGNOSIS_FACTORS)[number];\n\n/** The recorded diagnosis. `note` is free-text PHI and never leaves the UI. */\nexport interface PeriodontalDiagnosisValue {\n stage?: PeriodontitisStage;\n grade?: PeriodontitisGrade;\n extent?: PeriodontitisExtent;\n /** Ids of the ticked contributing factors. */\n factors?: string[];\n /** Free-text clinician note — PHI; excluded from the agent adapter. */\n note?: string;\n}\n\n/** A diagnosis needs at least a stage and a grade to read as complete. */\nexport function isDiagnosisComplete(value: PeriodontalDiagnosisValue): boolean {\n return value.stage != null && value.grade != null;\n}\n\n/** A fresh, empty diagnosis. */\nexport function emptyDiagnosis(): PeriodontalDiagnosisValue {\n return {};\n}\n","import {\n forwardRef,\n useId,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Badge } from '../badge/badge';\nimport { Card } from '../card/card';\nimport { Checkbox } from '../checkbox/checkbox';\nimport { Radio } from '../radio-group/radio';\nimport { RadioGroup } from '../radio-group/radio-group';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { periodontalDiagnosisAgent } from './periodontal-diagnosis.agent';\nimport {\n DEFAULT_DIAGNOSIS_FACTORS,\n emptyDiagnosis,\n isDiagnosisComplete,\n PERIODONTITIS_EXTENTS,\n PERIODONTITIS_GRADES,\n PERIODONTITIS_STAGES,\n STAGE_ROMAN,\n type PeriodontalDiagnosisValue,\n type PeriodontitisExtent,\n type PeriodontitisGrade,\n type PeriodontitisStage,\n} from './periodontal-diagnosis-data';\n\n/* -------------------------------------------------------------------- */\n/* PeriodontalDiagnosis */\n/* */\n/* The 2017 World Workshop / EFP periodontitis classification form: */\n/* stage (I–IV), grade (A–C), extent, and a curated checklist of the */\n/* staging/grading contributing factors. Controlled or uncontrolled. */\n/* The composed summary (\"Periodontitis — Stage III · Grade B · */\n/* generalised\") is the worded, non-colour source of truth. */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n surface: { flat: '', elevated: '' },\n },\n defaultVariants: { surface: 'elevated' },\n});\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\nexport interface PeriodontalDiagnosisHandle {\n /** The recorded stage / grade / extent / factors — never the free-text note. */\n getDiagnosis: () => Omit<PeriodontalDiagnosisValue, 'note'>;\n /** The composed, localised summary sentence. */\n getSummary: () => string;\n /** True once both a stage and a grade are recorded. */\n isComplete: () => boolean;\n setStage: (stage: PeriodontitisStage) => void;\n setGrade: (grade: PeriodontitisGrade) => void;\n setExtent: (extent: PeriodontitisExtent) => void;\n toggleFactor: (id: string, on?: boolean) => void;\n /** Reset to an empty diagnosis. */\n clear: () => void;\n}\n\nexport interface PeriodontalDiagnosisProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children' | 'onChange' | 'defaultValue'\n> {\n /** Controlled value. */\n value?: PeriodontalDiagnosisValue;\n /** Uncontrolled initial value. */\n defaultValue?: PeriodontalDiagnosisValue;\n /** Fires with the next diagnosis whenever the clinician changes a field. */\n onChange?: (value: PeriodontalDiagnosisValue) => void;\n /** `'interactive'` (default) renders the form; `'display'` is read-only. */\n mode?: 'interactive' | 'display';\n /** Disable every control. */\n disabled?: boolean;\n /** Contributing-factor ids for the checklist. Defaults to the WHO-2017 set. */\n factors?: readonly string[];\n /** `'elevated'` (default) wraps in a Card; `'flat'` drops the chrome. */\n surface?: 'flat' | 'elevated';\n /** Override the default region aria-label. */\n 'aria-label'?: string;\n /** Agent-readiness consumer id, surfaced as `data-component-id`. */\n id?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const PeriodontalDiagnosis = forwardRef<\n HTMLDivElement,\n PeriodontalDiagnosisProps\n>(\n (\n {\n value,\n defaultValue,\n onChange,\n mode = 'interactive',\n disabled = false,\n factors = DEFAULT_DIAGNOSIS_FACTORS,\n surface = 'elevated',\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const headingId = useId();\n\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<PeriodontalDiagnosisValue>(\n defaultValue ?? emptyDiagnosis(),\n );\n const current = isControlled ? value : internal;\n\n // Latest committed value — so an agent making several edits in one tick\n // always builds on the previous edit, not a stale render snapshot.\n const valueRef = useRef(current);\n valueRef.current = current;\n\n const commit = (next: PeriodontalDiagnosisValue) => {\n valueRef.current = next;\n if (!isControlled) setInternal(next);\n onChange?.(next);\n };\n\n const setStage = (stage: PeriodontitisStage) =>\n commit({ ...valueRef.current, stage });\n const setGrade = (grade: PeriodontitisGrade) =>\n commit({ ...valueRef.current, grade });\n const setExtent = (extent: PeriodontitisExtent) =>\n commit({ ...valueRef.current, extent });\n const toggleFactor = (factorId: string, on?: boolean) => {\n const set = new Set(valueRef.current.factors ?? []);\n const next = on ?? !set.has(factorId);\n if (next) set.add(factorId);\n else set.delete(factorId);\n commit({ ...valueRef.current, factors: [...set] });\n };\n const clear = () => commit(emptyDiagnosis());\n\n const complete = isDiagnosisComplete(current);\n const activeFactors = current.factors ?? [];\n\n const stageLabel = (s: PeriodontitisStage) =>\n t(`periodontalDiagnosis.stage.option`, {\n roman: STAGE_ROMAN[s],\n defaultValue: `Stage ${STAGE_ROMAN[s]}`,\n });\n const gradeLabel = (g: PeriodontitisGrade) =>\n t(`periodontalDiagnosis.grade.option`, {\n grade: g,\n defaultValue: `Grade ${g}`,\n });\n const extentLabel = (e: PeriodontitisExtent) =>\n t(`periodontalDiagnosis.extent.${e}`, {\n defaultValue:\n e === 'localised'\n ? 'Localised'\n : e === 'generalised'\n ? 'Generalised'\n : 'Molar-incisor',\n });\n const factorLabel = (fid: string) =>\n t(`periodontalDiagnosis.factor.${fid}`, { defaultValue: fid });\n\n // Worded summary sentence — the accessible source of truth.\n const chips: string[] = [];\n if (current.stage != null)\n chips.push(\n t('periodontalDiagnosis.summary.stage', {\n roman: STAGE_ROMAN[current.stage],\n defaultValue: `Stage ${STAGE_ROMAN[current.stage]}`,\n }),\n );\n if (current.grade != null)\n chips.push(\n t('periodontalDiagnosis.summary.grade', {\n grade: current.grade,\n defaultValue: `Grade ${current.grade}`,\n }),\n );\n if (current.extent != null) chips.push(extentLabel(current.extent));\n const summary = chips.length\n ? `${t('periodontalDiagnosis.term', 'Periodontitis')} — ${chips.join(' · ')}`\n : t('periodontalDiagnosis.summary.none', 'No diagnosis recorded yet');\n\n useAgentRegistration(\n periodontalDiagnosisAgent,\n {\n getDiagnosis: () => {\n const { note: _note, ...rest2 } = valueRef.current;\n return rest2;\n },\n getSummary: () => summary,\n isComplete: () => isDiagnosisComplete(valueRef.current),\n setStage,\n setGrade,\n setExtent,\n toggleFactor,\n clear,\n },\n id,\n );\n\n const heading = t('periodontalDiagnosis.heading', 'Periodontal diagnosis');\n const resolvedAriaLabel = ariaLabel ?? heading;\n\n const readonlyView = (\n <dl className=\"type-body-sm ds:grid ds:grid-cols-[auto_1fr] ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-2xs)] ds:m-0\">\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">\n {t('periodontalDiagnosis.stage.label', 'Staging')}\n </dt>\n <dd className=\"ds:m-0\">\n {current.stage != null\n ? stageLabel(current.stage)\n : t('periodontalDiagnosis.unset', '—')}\n </dd>\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">\n {t('periodontalDiagnosis.grade.label', 'Grading')}\n </dt>\n <dd className=\"ds:m-0\">\n {current.grade != null\n ? gradeLabel(current.grade)\n : t('periodontalDiagnosis.unset', '—')}\n </dd>\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">\n {t('periodontalDiagnosis.extent.label', 'Extent')}\n </dt>\n <dd className=\"ds:m-0\">\n {current.extent != null\n ? extentLabel(current.extent)\n : t('periodontalDiagnosis.unset', '—')}\n </dd>\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">\n {t('periodontalDiagnosis.factors.label', 'Contributing factors')}\n </dt>\n <dd className=\"ds:m-0\">\n {activeFactors.length\n ? activeFactors.map((fid) => factorLabel(fid)).join(', ')\n : t('periodontalDiagnosis.unset', '—')}\n </dd>\n </dl>\n );\n\n const formView = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]\">\n <RadioGroup\n variant=\"horizontal\"\n label={t('periodontalDiagnosis.stage.label', 'Staging')}\n description={t(\n 'periodontalDiagnosis.stage.description',\n 'Severity and complexity of management.',\n )}\n value={current.stage != null ? String(current.stage) : ''}\n onValueChange={(v) => setStage(Number(v) as PeriodontitisStage)}\n disabled={disabled}\n >\n {PERIODONTITIS_STAGES.map((s) => (\n <Radio key={s} value={String(s)} label={stageLabel(s)} />\n ))}\n </RadioGroup>\n\n <RadioGroup\n variant=\"horizontal\"\n label={t('periodontalDiagnosis.grade.label', 'Grading')}\n description={t(\n 'periodontalDiagnosis.grade.description',\n 'Rate of progression.',\n )}\n value={current.grade ?? ''}\n onValueChange={(v) => setGrade(v as PeriodontitisGrade)}\n disabled={disabled}\n >\n {PERIODONTITIS_GRADES.map((g) => (\n <Radio key={g} value={g} label={gradeLabel(g)} />\n ))}\n </RadioGroup>\n\n <RadioGroup\n variant=\"horizontal\"\n label={t('periodontalDiagnosis.extent.label', 'Extent')}\n value={current.extent ?? ''}\n onValueChange={(v) => setExtent(v as PeriodontitisExtent)}\n disabled={disabled}\n >\n {PERIODONTITIS_EXTENTS.map((e) => (\n <Radio key={e} value={e} label={extentLabel(e)} />\n ))}\n </RadioGroup>\n\n <fieldset className=\"ds:m-0 ds:border-0 ds:p-0\">\n <legend className=\"type-label ds:mb-[var(--spacing-xs)] ds:p-0 ds:text-[color:var(--foreground)]\">\n {t('periodontalDiagnosis.factors.label', 'Contributing factors')}\n </legend>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {factors.map((fid) => (\n <Checkbox\n key={fid}\n label={factorLabel(fid)}\n checked={activeFactors.includes(fid)}\n onCheckedChange={(c) => toggleFactor(fid, c === true)}\n disabled={disabled}\n />\n ))}\n </div>\n </fieldset>\n </div>\n );\n\n const inner = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <h2\n id={headingId}\n className=\"type-title-card ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {heading}\n </h2>\n <Badge variant={complete ? 'brand' : 'neutral'} size=\"md\">\n {complete\n ? t('periodontalDiagnosis.status.complete', 'Complete')\n : t('periodontalDiagnosis.status.incomplete', 'Incomplete')}\n </Badge>\n </div>\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--foreground)]\">\n {summary}\n </p>\n {mode === 'display' ? readonlyView : formView}\n </div>\n );\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={resolvedAriaLabel}\n data-component=\"periodontal-diagnosis\"\n data-component-id={id}\n id={id}\n className={rootVariants({ surface, className })}\n {...rest}\n >\n {surface === 'elevated' ? (\n <Card variant=\"elevated\">\n <Card.Body>{inner}</Card.Body>\n </Card>\n ) : (\n inner\n )}\n </div>\n );\n },\n);\n\nPeriodontalDiagnosis.displayName = 'PeriodontalDiagnosis';\n\nexport type PeriodontalDiagnosisSurface = NonNullable<\n VariantProps<typeof rootVariants>['surface']\n>;\n"],"names":["STAGE_SCHEMA","GRADE_SCHEMA","EXTENT_SCHEMA","periodontalDiagnosisAgent","handle","args","PERIODONTITIS_STAGES","PERIODONTITIS_GRADES","PERIODONTITIS_EXTENTS","STAGE_ROMAN","DEFAULT_DIAGNOSIS_FACTORS","isDiagnosisComplete","value","emptyDiagnosis","rootVariants","cva","PeriodontalDiagnosis","forwardRef","defaultValue","onChange","mode","disabled","factors","surface","ariaLabel","id","className","rest","ref","useTranslation","headingId","useId","isControlled","internal","setInternal","useState","current","valueRef","useRef","commit","next","setStage","stage","setGrade","grade","setExtent","extent","toggleFactor","factorId","on","set","clear","complete","activeFactors","stageLabel","s","gradeLabel","g","extentLabel","factorLabel","fid","chips","summary","useAgentRegistration","_note","rest2","heading","resolvedAriaLabel","readonlyView","jsxs","jsx","formView","RadioGroup","v","Radio","Checkbox","c","inner","Badge","Card"],"mappings":"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"}
|
package/dist/_chunks/{periodontal-risk-chart-bUGkMwDg.js → periodontal-risk-chart-ByKuM4cF.js}
RENAMED
|
@@ -2,7 +2,7 @@ import { jsxs as m, jsx as r } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as T, useId as $, useMemo as S } from "react";
|
|
3
3
|
import { c as _ } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as j } from "react-i18next";
|
|
5
|
-
import { B as w } from "./badge-
|
|
5
|
+
import { B as w } from "./badge-CIt-UFEx.js";
|
|
6
6
|
import { C as N } from "./card-DPmk26CL.js";
|
|
7
7
|
import { u as M } from "./registry-DvAUVLHh.js";
|
|
8
8
|
const B = {
|
|
@@ -331,4 +331,4 @@ export {
|
|
|
331
331
|
B as p,
|
|
332
332
|
te as r
|
|
333
333
|
};
|
|
334
|
-
//# sourceMappingURL=periodontal-risk-chart-
|
|
334
|
+
//# sourceMappingURL=periodontal-risk-chart-ByKuM4cF.js.map
|