@alfadocs/ui-kit-debug 0.73.0 → 0.75.0
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-DLrcSTK_.js +1546 -0
- package/dist/_chunks/actions-cell-renderer-DLrcSTK_.js.map +1 -0
- package/dist/_chunks/{ai-prompt-input-DFm58UjY.js → ai-prompt-input-DziJCGLe.js} +2 -2
- package/dist/_chunks/{ai-prompt-input-DFm58UjY.js.map → ai-prompt-input-DziJCGLe.js.map} +1 -1
- package/dist/_chunks/{audio-recorder-CjAY0GAc.js → audio-recorder-Cc3KuL9y.js} +2 -2
- package/dist/_chunks/{audio-recorder-CjAY0GAc.js.map → audio-recorder-Cc3KuL9y.js.map} +1 -1
- package/dist/_chunks/{bishop-score-Bs6t6Zv1.js → bishop-score-DDW5-gb9.js} +2 -2
- package/dist/_chunks/{bishop-score-Bs6t6Zv1.js.map → bishop-score-DDW5-gb9.js.map} +1 -1
- package/dist/_chunks/{booking-CWnZhZ5g.js → booking-B1Qkcl3c.js} +2 -2
- package/dist/_chunks/{booking-CWnZhZ5g.js.map → booking-B1Qkcl3c.js.map} +1 -1
- package/dist/_chunks/{care-plan-card-CfIP3Vc1.js → care-plan-card-BrwhyIJI.js} +2 -2
- package/dist/_chunks/{care-plan-card-CfIP3Vc1.js.map → care-plan-card-BrwhyIJI.js.map} +1 -1
- package/dist/_chunks/{care-plan-entry-card-CRbS-G00.js → care-plan-entry-card-DWEdCQM3.js} +2 -2
- package/dist/_chunks/{care-plan-entry-card-CRbS-G00.js.map → care-plan-entry-card-DWEdCQM3.js.map} +1 -1
- package/dist/_chunks/data-table-tabs-BEUXiRlu.js +710 -0
- package/dist/_chunks/data-table-tabs-BEUXiRlu.js.map +1 -0
- package/dist/_chunks/document-preview-CGSM_au9.js +181 -0
- package/dist/_chunks/document-preview-CGSM_au9.js.map +1 -0
- package/dist/_chunks/{document-scanner-BE6Jz4Ob.js → document-scanner-B6h1Ir56.js} +2 -2
- package/dist/_chunks/{document-scanner-BE6Jz4Ob.js.map → document-scanner-B6h1Ir56.js.map} +1 -1
- package/dist/_chunks/{field-value-DCXJXKab.js → field-value-DHG6gEKS.js} +2 -2
- package/dist/_chunks/{field-value-DCXJXKab.js.map → field-value-DHG6gEKS.js.map} +1 -1
- package/dist/_chunks/file-Cwe9VC1A.js +40 -0
- package/dist/_chunks/file-Cwe9VC1A.js.map +1 -0
- package/dist/_chunks/file-manager-UF8dkQF1.js +1776 -0
- package/dist/_chunks/file-manager-UF8dkQF1.js.map +1 -0
- package/dist/_chunks/{file-upload-B2SXhRiN.js → file-upload-DENvuhfs.js} +98 -129
- package/dist/_chunks/file-upload-DENvuhfs.js.map +1 -0
- package/dist/_chunks/{gestational-age-calculator-C9Dfis4I.js → gestational-age-calculator-BpYw-WF-.js} +2 -2
- package/dist/_chunks/{gestational-age-calculator-C9Dfis4I.js.map → gestational-age-calculator-BpYw-WF-.js.map} +1 -1
- package/dist/_chunks/{header-settings-CRQDCYgr.js → header-settings-4cwQzeFc.js} +2 -2
- package/dist/_chunks/{header-settings-CRQDCYgr.js.map → header-settings-4cwQzeFc.js.map} +1 -1
- package/dist/_chunks/{icon-picker-BePK27S-.js → icon-picker-CM9ubkew.js} +2 -2
- package/dist/_chunks/{icon-picker-BePK27S-.js.map → icon-picker-CM9ubkew.js.map} +1 -1
- package/dist/_chunks/link-cell-renderer-BQGUs45d.js +711 -0
- package/dist/_chunks/link-cell-renderer-BQGUs45d.js.map +1 -0
- package/dist/_chunks/{locale-picker-Cbfqc0_N.js → locale-picker-GNF3lo8K.js} +2 -2
- package/dist/_chunks/{locale-picker-Cbfqc0_N.js.map → locale-picker-GNF3lo8K.js.map} +1 -1
- package/dist/_chunks/{marketplace-app-shell-Dm6S-hun.js → marketplace-app-shell-D_1tF4La.js} +3 -3
- package/dist/_chunks/{marketplace-app-shell-Dm6S-hun.js.map → marketplace-app-shell-D_1tF4La.js.map} +1 -1
- package/dist/_chunks/{muscle-scheme-B9MIkuj0.js → muscle-scheme-CFBE2dme.js} +6 -14
- package/dist/_chunks/{muscle-scheme-B9MIkuj0.js.map → muscle-scheme-CFBE2dme.js.map} +1 -1
- package/dist/_chunks/{notes-panel-B_8-Mebz.js → notes-panel-Cvdp818a.js} +2 -2
- package/dist/_chunks/{notes-panel-B_8-Mebz.js.map → notes-panel-Cvdp818a.js.map} +1 -1
- package/dist/_chunks/{optical-prescription-BQ75_kf6.js → optical-prescription-BEjYQjiO.js} +2 -2
- package/dist/_chunks/{optical-prescription-BQ75_kf6.js.map → optical-prescription-BEjYQjiO.js.map} +1 -1
- package/dist/_chunks/{patient-details-JkOI3Ijd.js → patient-details-DP4wKyq4.js} +3 -3
- package/dist/_chunks/{patient-details-JkOI3Ijd.js.map → patient-details-DP4wKyq4.js.map} +1 -1
- package/dist/_chunks/{patient-summary-card-CQOLMH3E.js → patient-summary-card-D6kgdTNn.js} +2 -2
- package/dist/_chunks/{patient-summary-card-CQOLMH3E.js.map → patient-summary-card-D6kgdTNn.js.map} +1 -1
- package/dist/_chunks/{patient-table-B_mOe-ZT.js → patient-table-DweKjiXg.js} +122 -118
- package/dist/_chunks/patient-table-DweKjiXg.js.map +1 -0
- package/dist/_chunks/periodontal-chart-D8hOFmde.js +1173 -0
- package/dist/_chunks/periodontal-chart-D8hOFmde.js.map +1 -0
- package/dist/_chunks/periodontal-diagnosis-cco40xTa.js +345 -0
- package/dist/_chunks/periodontal-diagnosis-cco40xTa.js.map +1 -0
- package/dist/_chunks/periodontal-risk-chart-bUGkMwDg.js +334 -0
- package/dist/_chunks/periodontal-risk-chart-bUGkMwDg.js.map +1 -0
- package/dist/_chunks/{popover-DGTKfLWh.js → popover-Cc0a69sw.js} +31 -28
- package/dist/_chunks/{popover-DGTKfLWh.js.map → popover-Cc0a69sw.js.map} +1 -1
- package/dist/_chunks/{pregnancy-dating-IsDVfqJX.js → pregnancy-dating-msMl_6wz.js} +2 -2
- package/dist/_chunks/{pregnancy-dating-IsDVfqJX.js.map → pregnancy-dating-msMl_6wz.js.map} +1 -1
- package/dist/_chunks/{radiograph-panel.agent-e488ooH8.js → radiograph-panel.agent-CxF9pVxd.js} +2 -2
- package/dist/_chunks/{radiograph-panel.agent-e488ooH8.js.map → radiograph-panel.agent-CxF9pVxd.js.map} +1 -1
- package/dist/_chunks/{rich-text-editor-CgA2bYwi.js → rich-text-editor-CCWjNkbx.js} +186 -177
- package/dist/_chunks/rich-text-editor-CCWjNkbx.js.map +1 -0
- package/dist/_chunks/{select-BmCbJMJS.js → select-BW5ecXlX.js} +13 -13
- package/dist/_chunks/{select-BmCbJMJS.js.map → select-BW5ecXlX.js.map} +1 -1
- package/dist/_chunks/{sidebar-CtU35PIX.js → sidebar-C0PbwJBc.js} +357 -320
- package/dist/_chunks/sidebar-C0PbwJBc.js.map +1 -0
- package/dist/_chunks/signature-request-C-mskXwi.js +318 -0
- package/dist/_chunks/signature-request-C-mskXwi.js.map +1 -0
- package/dist/_chunks/{tabs-DVQ941Sj.js → tabs-CVTukWRD.js} +2 -2
- package/dist/_chunks/{tabs-DVQ941Sj.js.map → tabs-CVTukWRD.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-LCK5ZXvU.js → tasks-panel-CjGAhIN8.js} +2 -2
- package/dist/_chunks/{tasks-panel-LCK5ZXvU.js.map → tasks-panel-CjGAhIN8.js.map} +1 -1
- package/dist/_chunks/tooth-data-BwuoKFf4.js +660 -0
- package/dist/_chunks/tooth-data-BwuoKFf4.js.map +1 -0
- package/dist/_chunks/tooth-scheme-BzJ6rcte.js +1483 -0
- package/dist/_chunks/tooth-scheme-BzJ6rcte.js.map +1 -0
- package/dist/_chunks/{unit-converter-3uL_tMCm.js → unit-converter-CSLWFDQh.js} +2 -2
- package/dist/_chunks/{unit-converter-3uL_tMCm.js.map → unit-converter-CSLWFDQh.js.map} +1 -1
- package/dist/agent-catalog.json +1282 -213
- package/dist/agent-i18n/en.json +84 -5
- package/dist/components/_shared/entity-card/entity-card.d.ts +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/anamnesis-card/anamnesis-card.d.ts +1 -1
- package/dist/components/appointment-card/appointment-card.d.ts +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/bishop-score/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/card/card.d.ts +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/clinical-note-card/clinical-note-card.d.ts +1 -1
- package/dist/components/contact-profile-card/contact-profile-card.d.ts +1 -1
- package/dist/components/data-table/data-table.d.ts.map +1 -1
- package/dist/components/data-table/filters/number-filter.d.ts.map +1 -1
- package/dist/components/data-table/index.js +35 -34
- package/dist/components/data-table/index.js.map +1 -1
- package/dist/components/data-table/toolbar.d.ts +1 -1
- package/dist/components/data-table/toolbar.d.ts.map +1 -1
- package/dist/components/data-table-tabs/data-table-tabs.agent.d.ts +4 -0
- package/dist/components/data-table-tabs/data-table-tabs.agent.d.ts.map +1 -0
- package/dist/components/data-table-tabs/data-table-tabs.d.ts +93 -0
- package/dist/components/data-table-tabs/data-table-tabs.d.ts.map +1 -0
- package/dist/components/data-table-tabs/index.d.ts +5 -0
- package/dist/components/data-table-tabs/index.d.ts.map +1 -0
- package/dist/components/data-table-tabs/index.js +8 -0
- package/dist/components/data-table-tabs/index.js.map +1 -0
- package/dist/components/data-table-tabs/use-data-table-filter-tabs.d.ts +63 -0
- package/dist/components/data-table-tabs/use-data-table-filter-tabs.d.ts.map +1 -0
- package/dist/components/document-preview/document-preview.agent.d.ts +4 -0
- package/dist/components/document-preview/document-preview.agent.d.ts.map +1 -0
- package/dist/components/document-preview/document-preview.d.ts +41 -0
- package/dist/components/document-preview/document-preview.d.ts.map +1 -0
- package/dist/components/document-preview/index.d.ts +4 -0
- package/dist/components/document-preview/index.d.ts.map +1 -0
- package/dist/components/document-preview/index.js +6 -0
- package/dist/components/document-preview/index.js.map +1 -0
- package/dist/components/document-scanner/index.js +1 -1
- package/dist/components/file-manager/dialogs.d.ts +48 -0
- package/dist/components/file-manager/dialogs.d.ts.map +1 -0
- package/dist/components/file-manager/file-manager.agent.d.ts +4 -0
- package/dist/components/file-manager/file-manager.agent.d.ts.map +1 -0
- package/dist/components/file-manager/file-manager.d.ts +82 -0
- package/dist/components/file-manager/file-manager.d.ts.map +1 -0
- package/dist/components/file-manager/folder-tree.d.ts +12 -0
- package/dist/components/file-manager/folder-tree.d.ts.map +1 -0
- package/dist/components/file-manager/index.d.ts +5 -0
- package/dist/components/file-manager/index.d.ts.map +1 -0
- package/dist/components/file-manager/index.js +6 -0
- package/dist/components/file-manager/index.js.map +1 -0
- package/dist/components/file-manager/list-view.d.ts +49 -0
- package/dist/components/file-manager/list-view.d.ts.map +1 -0
- package/dist/components/file-manager/toolbar.d.ts +15 -0
- package/dist/components/file-manager/toolbar.d.ts.map +1 -0
- package/dist/components/file-manager/types.d.ts +167 -0
- package/dist/components/file-manager/types.d.ts.map +1 -0
- package/dist/components/file-manager/utils.d.ts +34 -0
- package/dist/components/file-manager/utils.d.ts.map +1 -0
- package/dist/components/file-upload/index.js +1 -1
- package/dist/components/gestational-age-calculator/index.js +1 -1
- package/dist/components/header-settings/index.js +1 -1
- package/dist/components/icon-picker/index.js +1 -1
- package/dist/components/index.d.ts +7 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/locale-picker/index.js +1 -1
- package/dist/components/message-card/message-card.d.ts +1 -1
- package/dist/components/muscle-scheme/index.js +1 -1
- package/dist/components/muscle-scheme/muscle-scheme.d.ts.map +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/notification-card/notification-card.d.ts +1 -1
- package/dist/components/operator-hero/operator-hero.d.ts +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-summary-card/patient-summary-card.d.ts +1 -1
- package/dist/components/patient-table/columns.d.ts.map +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/payment-card/payment-card.d.ts +1 -1
- package/dist/components/payment-card/payment-request-card.d.ts +1 -1
- package/dist/components/periodontal-chart/index.d.ts +6 -0
- package/dist/components/periodontal-chart/index.d.ts.map +1 -0
- package/dist/components/periodontal-chart/index.js +22 -0
- package/dist/components/periodontal-chart/index.js.map +1 -0
- package/dist/components/periodontal-chart/periodontal-chart-data.d.ts +119 -0
- package/dist/components/periodontal-chart/periodontal-chart-data.d.ts.map +1 -0
- package/dist/components/periodontal-chart/periodontal-chart.agent.d.ts +4 -0
- package/dist/components/periodontal-chart/periodontal-chart.agent.d.ts.map +1 -0
- package/dist/components/periodontal-chart/periodontal-chart.d.ts +69 -0
- package/dist/components/periodontal-chart/periodontal-chart.d.ts.map +1 -0
- package/dist/components/periodontal-chart-card/periodontal-chart-card.d.ts +1 -1
- package/dist/components/periodontal-diagnosis/index.d.ts +6 -0
- package/dist/components/periodontal-diagnosis/index.d.ts.map +1 -0
- package/dist/components/periodontal-diagnosis/index.js +13 -0
- package/dist/components/periodontal-diagnosis/index.js.map +1 -0
- package/dist/components/periodontal-diagnosis/periodontal-diagnosis-data.d.ts +30 -0
- package/dist/components/periodontal-diagnosis/periodontal-diagnosis-data.d.ts.map +1 -0
- package/dist/components/periodontal-diagnosis/periodontal-diagnosis.agent.d.ts +4 -0
- package/dist/components/periodontal-diagnosis/periodontal-diagnosis.agent.d.ts.map +1 -0
- package/dist/components/periodontal-diagnosis/periodontal-diagnosis.d.ts +44 -0
- package/dist/components/periodontal-diagnosis/periodontal-diagnosis.d.ts.map +1 -0
- package/dist/components/periodontal-risk-chart/index.d.ts +6 -0
- package/dist/components/periodontal-risk-chart/index.d.ts.map +1 -0
- package/dist/components/periodontal-risk-chart/index.js +9 -0
- package/dist/components/periodontal-risk-chart/index.js.map +1 -0
- package/dist/components/periodontal-risk-chart/periodontal-risk-chart.agent.d.ts +4 -0
- package/dist/components/periodontal-risk-chart/periodontal-risk-chart.agent.d.ts.map +1 -0
- package/dist/components/periodontal-risk-chart/periodontal-risk-chart.d.ts +28 -0
- package/dist/components/periodontal-risk-chart/periodontal-risk-chart.d.ts.map +1 -0
- package/dist/components/periodontal-risk-chart/periodontal-risk-data.d.ts +47 -0
- package/dist/components/periodontal-risk-chart/periodontal-risk-data.d.ts.map +1 -0
- package/dist/components/popover/index.js +1 -1
- package/dist/components/popover/popover.d.ts +1 -0
- package/dist/components/popover/popover.d.ts.map +1 -1
- package/dist/components/pregnancy-dating/index.js +1 -1
- package/dist/components/product-hub-tray/product-hub-panel.d.ts +1 -1
- package/dist/components/radiograph-panel/index.js +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/select/index.js +1 -1
- package/dist/components/select/select.d.ts.map +1 -1
- package/dist/components/sidebar/index.js +1 -1
- package/dist/components/sidebar/sidebar.d.ts +9 -0
- package/dist/components/sidebar/sidebar.d.ts.map +1 -1
- package/dist/components/skeleton-scheme/index.js +5 -13
- package/dist/components/skeleton-scheme/index.js.map +1 -1
- package/dist/components/stat/stat.d.ts +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/tasks-panel/index.js +1 -1
- package/dist/components/tooth-scheme/index.js +29 -28
- package/dist/components/tooth-scheme/index.js.map +1 -1
- package/dist/components/unit-converter/index.js +1 -1
- package/dist/i18n/locales/ar.d.ts +320 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +320 -0
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +320 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +320 -0
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +320 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +320 -0
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +320 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +320 -0
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +320 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +320 -0
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +320 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +320 -0
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +320 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +320 -0
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +320 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +320 -0
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +320 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +320 -0
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +320 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +320 -0
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +320 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +320 -0
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +320 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +320 -0
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +320 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +320 -0
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +320 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +320 -0
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +320 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +320 -0
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +320 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +320 -0
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +320 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +320 -0
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +320 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +320 -0
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +832 -782
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.json +320 -0
- package/dist/locales/de.json +320 -0
- package/dist/locales/el.json +320 -0
- package/dist/locales/en.json +320 -0
- package/dist/locales/es.json +320 -0
- package/dist/locales/fr.json +320 -0
- package/dist/locales/hi.json +320 -0
- package/dist/locales/it.json +320 -0
- package/dist/locales/ja.json +320 -0
- package/dist/locales/nl.json +320 -0
- package/dist/locales/pl.json +320 -0
- package/dist/locales/pt.json +320 -0
- package/dist/locales/ro.json +320 -0
- package/dist/locales/ru.json +320 -0
- package/dist/locales/sq.json +320 -0
- package/dist/locales/sv.json +320 -0
- package/dist/locales/tr.json +320 -0
- package/dist/locales/zh.json +320 -0
- package/dist/patterns/marketplace-app-shell/index.js +1 -1
- package/dist/patterns/signature-request/index.d.ts +3 -0
- package/dist/patterns/signature-request/index.d.ts.map +1 -0
- package/dist/patterns/signature-request/index.js +5 -0
- package/dist/patterns/signature-request/index.js.map +1 -0
- package/dist/patterns/signature-request/signature-request.d.ts +81 -0
- package/dist/patterns/signature-request/signature-request.d.ts.map +1 -0
- package/dist/tokens.css +1 -1
- package/package.json +29 -1
- package/dist/_chunks/columns-2-8lq4-b8e.js +0 -15
- package/dist/_chunks/columns-2-8lq4-b8e.js.map +0 -1
- package/dist/_chunks/file-upload-B2SXhRiN.js.map +0 -1
- package/dist/_chunks/link-cell-renderer-CLI7sBkX.js +0 -2210
- package/dist/_chunks/link-cell-renderer-CLI7sBkX.js.map +0 -1
- package/dist/_chunks/patient-table-B_mOe-ZT.js.map +0 -1
- package/dist/_chunks/rich-text-editor-CgA2bYwi.js.map +0 -1
- package/dist/_chunks/sidebar-CtU35PIX.js.map +0 -1
- package/dist/_chunks/tooth-scheme-CX49GycY.js +0 -2133
- package/dist/_chunks/tooth-scheme-CX49GycY.js.map +0 -1
|
@@ -0,0 +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":"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"}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import { jsxs as m, jsx as r } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as T, useId as $, useMemo as S } from "react";
|
|
3
|
+
import { c as _ } from "./index-D2ZczOXr.js";
|
|
4
|
+
import { useTranslation as j } from "react-i18next";
|
|
5
|
+
import { B as w } from "./badge-DCOqV9mI.js";
|
|
6
|
+
import { C as N } from "./card-DPmk26CL.js";
|
|
7
|
+
import { u as M } from "./registry-DvAUVLHh.js";
|
|
8
|
+
const B = {
|
|
9
|
+
id: "periodontal-risk-chart",
|
|
10
|
+
capabilities: [],
|
|
11
|
+
state: {
|
|
12
|
+
overall: {
|
|
13
|
+
type: "string",
|
|
14
|
+
descriptionKey: "ui.agent.periodontalRiskChart.state.overall",
|
|
15
|
+
description: 'Overall periodontal risk verdict — "low" | "moderate" | "high". Aggregate only.',
|
|
16
|
+
read: (o) => o.getOverall()
|
|
17
|
+
},
|
|
18
|
+
factorLevels: {
|
|
19
|
+
type: "object",
|
|
20
|
+
descriptionKey: "ui.agent.periodontalRiskChart.state.factorLevels",
|
|
21
|
+
description: 'Per-factor risk levels keyed by factor (bleeding, pockets, toothLoss, boneLossAge, smoking, systemic) — each "low" | "moderate" | "high". No raw values.',
|
|
22
|
+
read: (o) => o.getFactorLevels()
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
actions: {},
|
|
26
|
+
domHooks: {
|
|
27
|
+
root: {
|
|
28
|
+
attr: "data-component",
|
|
29
|
+
value: "periodontal-risk-chart",
|
|
30
|
+
description: "Marks the PeriodontalRiskChart root region."
|
|
31
|
+
},
|
|
32
|
+
instanceId: {
|
|
33
|
+
attr: "data-component-id",
|
|
34
|
+
sourceProp: "id",
|
|
35
|
+
description: "Sourced from the id prop."
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}, A = [
|
|
39
|
+
"bleeding",
|
|
40
|
+
"pockets",
|
|
41
|
+
"toothLoss",
|
|
42
|
+
"boneLossAge",
|
|
43
|
+
"smoking",
|
|
44
|
+
"systemic"
|
|
45
|
+
], D = {
|
|
46
|
+
low: 0.4,
|
|
47
|
+
moderate: 0.7,
|
|
48
|
+
high: 1
|
|
49
|
+
};
|
|
50
|
+
function te(o) {
|
|
51
|
+
return o === "high" ? 2 : o === "moderate" ? 1 : 0;
|
|
52
|
+
}
|
|
53
|
+
function x(o, l, s) {
|
|
54
|
+
return o >= s ? "high" : o >= l ? "moderate" : "low";
|
|
55
|
+
}
|
|
56
|
+
const U = {
|
|
57
|
+
none: "low",
|
|
58
|
+
former: "low",
|
|
59
|
+
light: "moderate",
|
|
60
|
+
moderate: "high",
|
|
61
|
+
heavy: "high"
|
|
62
|
+
};
|
|
63
|
+
function K(o) {
|
|
64
|
+
const l = [], s = (e, d, a) => l.push({ factor: e, level: d, radius: D[d], valueText: a });
|
|
65
|
+
{
|
|
66
|
+
const e = o.bleedingPercent;
|
|
67
|
+
s(
|
|
68
|
+
"bleeding",
|
|
69
|
+
e == null ? "low" : x(e, 10, 26),
|
|
70
|
+
e == null ? null : `${Math.round(e)}%`
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
{
|
|
74
|
+
const e = o.pocketsOver5mm;
|
|
75
|
+
s(
|
|
76
|
+
"pockets",
|
|
77
|
+
e == null ? "low" : x(e, 5, 9),
|
|
78
|
+
e == null ? null : String(e)
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
{
|
|
82
|
+
const e = o.toothLoss;
|
|
83
|
+
s(
|
|
84
|
+
"toothLoss",
|
|
85
|
+
e == null ? "low" : x(e, 5, 9),
|
|
86
|
+
e == null ? null : String(e)
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
{
|
|
90
|
+
const e = o.boneLossPercent, d = o.ageYears;
|
|
91
|
+
if (e == null || d == null || d <= 0)
|
|
92
|
+
s("boneLossAge", "low", null);
|
|
93
|
+
else {
|
|
94
|
+
const a = e / d;
|
|
95
|
+
s(
|
|
96
|
+
"boneLossAge",
|
|
97
|
+
a > 1 ? "high" : a >= 0.5 ? "moderate" : "low",
|
|
98
|
+
a.toFixed(2)
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
{
|
|
103
|
+
const e = o.smoking;
|
|
104
|
+
s("smoking", e == null ? "low" : U[e], e ?? null);
|
|
105
|
+
}
|
|
106
|
+
{
|
|
107
|
+
const e = o.systemic;
|
|
108
|
+
s("systemic", e ? "high" : "low", e == null ? null : e ? "yes" : "no");
|
|
109
|
+
}
|
|
110
|
+
const g = l.filter((e) => e.level === "high").length, p = l.filter((e) => e.level === "moderate").length, y = g > 0 || p >= 2 ? "high" : p === 1 ? "moderate" : "low";
|
|
111
|
+
return { factors: l, overall: y };
|
|
112
|
+
}
|
|
113
|
+
const f = 240, W = _("ds:w-full ds:text-[color:var(--foreground)]", {
|
|
114
|
+
variants: {
|
|
115
|
+
surface: { flat: "", elevated: "" }
|
|
116
|
+
},
|
|
117
|
+
defaultVariants: { surface: "elevated" }
|
|
118
|
+
}), k = f / 2, h = f / 2 - 16;
|
|
119
|
+
function v(o, l) {
|
|
120
|
+
const s = (-90 + o * 60) * Math.PI / 180;
|
|
121
|
+
return { x: k + l * Math.cos(s), y: k + l * Math.sin(s) };
|
|
122
|
+
}
|
|
123
|
+
function u(o) {
|
|
124
|
+
return A.map((l, s) => {
|
|
125
|
+
const g = v(s, h * o);
|
|
126
|
+
return `${g.x.toFixed(1)},${g.y.toFixed(1)}`;
|
|
127
|
+
}).join(" ");
|
|
128
|
+
}
|
|
129
|
+
const C = {
|
|
130
|
+
low: "success",
|
|
131
|
+
moderate: "warning",
|
|
132
|
+
high: "error"
|
|
133
|
+
}, z = {
|
|
134
|
+
low: "Low",
|
|
135
|
+
moderate: "Moderate",
|
|
136
|
+
high: "High"
|
|
137
|
+
}, G = {
|
|
138
|
+
bleeding: "Bleeding on probing",
|
|
139
|
+
pockets: "Residual pockets ≥5 mm",
|
|
140
|
+
toothLoss: "Tooth loss",
|
|
141
|
+
boneLossAge: "Bone loss / age",
|
|
142
|
+
smoking: "Smoking",
|
|
143
|
+
systemic: "Systemic / genetic"
|
|
144
|
+
}, H = T(
|
|
145
|
+
({
|
|
146
|
+
inputs: o,
|
|
147
|
+
surface: l = "elevated",
|
|
148
|
+
locale: s,
|
|
149
|
+
"aria-label": g,
|
|
150
|
+
id: p,
|
|
151
|
+
className: y,
|
|
152
|
+
...e
|
|
153
|
+
}, d) => {
|
|
154
|
+
const { t: a, i18n: O } = j(), E = $(), F = s ?? O.language ?? "en", c = S(() => K(o), [o]);
|
|
155
|
+
M(
|
|
156
|
+
B,
|
|
157
|
+
{
|
|
158
|
+
getOverall: () => c.overall,
|
|
159
|
+
getFactorLevels: () => Object.fromEntries(
|
|
160
|
+
c.factors.map((t) => [t.factor, t.level])
|
|
161
|
+
)
|
|
162
|
+
},
|
|
163
|
+
p
|
|
164
|
+
);
|
|
165
|
+
const P = c.factors.map((t, n) => {
|
|
166
|
+
const i = v(n, h * t.radius);
|
|
167
|
+
return `${i.x.toFixed(1)},${i.y.toFixed(1)}`;
|
|
168
|
+
}).join(" "), b = (t) => a(`periodontalRiskChart.level.${t}`, {
|
|
169
|
+
defaultValue: z[t]
|
|
170
|
+
}), V = (t, n) => {
|
|
171
|
+
if (n == null)
|
|
172
|
+
return a("periodontalRiskChart.valueUnset", "not recorded");
|
|
173
|
+
if (t === "smoking")
|
|
174
|
+
return a(`periodontalRiskChart.smoking.${n}`, { defaultValue: n });
|
|
175
|
+
if (t === "systemic")
|
|
176
|
+
return a(`periodontalRiskChart.systemic.${n}`, { defaultValue: n });
|
|
177
|
+
if (t === "bleeding") {
|
|
178
|
+
const i = Number.parseFloat(n);
|
|
179
|
+
if (Number.isFinite(i))
|
|
180
|
+
try {
|
|
181
|
+
return a("periodontalRiskChart.percent", {
|
|
182
|
+
value: new Intl.NumberFormat(F, {
|
|
183
|
+
maximumFractionDigits: 0
|
|
184
|
+
}).format(i),
|
|
185
|
+
defaultValue: "{{value}}%"
|
|
186
|
+
});
|
|
187
|
+
} catch {
|
|
188
|
+
return n;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return n;
|
|
192
|
+
}, L = a("periodontalRiskChart.heading", "Periodontal risk"), I = g ?? L, R = /* @__PURE__ */ m("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-md)]", children: [
|
|
193
|
+
/* @__PURE__ */ m("div", { className: "ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]", children: [
|
|
194
|
+
/* @__PURE__ */ r(
|
|
195
|
+
"h2",
|
|
196
|
+
{
|
|
197
|
+
id: E,
|
|
198
|
+
className: "type-title-card ds:m-0 ds:text-[color:var(--foreground)]",
|
|
199
|
+
children: L
|
|
200
|
+
}
|
|
201
|
+
),
|
|
202
|
+
/* @__PURE__ */ m("span", { className: "ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]", children: [
|
|
203
|
+
/* @__PURE__ */ r("span", { className: "type-meta ds:text-[color:var(--muted-foreground)]", children: a("periodontalRiskChart.overall.label", "Overall") }),
|
|
204
|
+
/* @__PURE__ */ r(w, { variant: C[c.overall], size: "sm", children: b(c.overall) })
|
|
205
|
+
] })
|
|
206
|
+
] }),
|
|
207
|
+
/* @__PURE__ */ m("div", { className: "ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-lg)]", children: [
|
|
208
|
+
/* @__PURE__ */ m(
|
|
209
|
+
"svg",
|
|
210
|
+
{
|
|
211
|
+
viewBox: `0 0 ${f} ${f}`,
|
|
212
|
+
className: "ds:w-full ds:max-w-[240px] ds:aspect-square",
|
|
213
|
+
"aria-hidden": "true",
|
|
214
|
+
focusable: "false",
|
|
215
|
+
children: [
|
|
216
|
+
/* @__PURE__ */ r(
|
|
217
|
+
"polygon",
|
|
218
|
+
{
|
|
219
|
+
points: u(1),
|
|
220
|
+
fill: "var(--destructive)",
|
|
221
|
+
fillOpacity: 0.1
|
|
222
|
+
}
|
|
223
|
+
),
|
|
224
|
+
/* @__PURE__ */ r(
|
|
225
|
+
"polygon",
|
|
226
|
+
{
|
|
227
|
+
points: u(0.7),
|
|
228
|
+
fill: "var(--warning)",
|
|
229
|
+
fillOpacity: 0.12
|
|
230
|
+
}
|
|
231
|
+
),
|
|
232
|
+
/* @__PURE__ */ r(
|
|
233
|
+
"polygon",
|
|
234
|
+
{
|
|
235
|
+
points: u(0.4),
|
|
236
|
+
fill: "var(--success)",
|
|
237
|
+
fillOpacity: 0.14
|
|
238
|
+
}
|
|
239
|
+
),
|
|
240
|
+
[1, 0.7, 0.4].map((t) => /* @__PURE__ */ r(
|
|
241
|
+
"polygon",
|
|
242
|
+
{
|
|
243
|
+
points: u(t),
|
|
244
|
+
fill: "none",
|
|
245
|
+
stroke: "var(--border)",
|
|
246
|
+
strokeWidth: 1
|
|
247
|
+
},
|
|
248
|
+
t
|
|
249
|
+
)),
|
|
250
|
+
A.map((t, n) => {
|
|
251
|
+
const i = v(n, h);
|
|
252
|
+
return /* @__PURE__ */ r(
|
|
253
|
+
"line",
|
|
254
|
+
{
|
|
255
|
+
x1: k,
|
|
256
|
+
y1: k,
|
|
257
|
+
x2: i.x,
|
|
258
|
+
y2: i.y,
|
|
259
|
+
stroke: "var(--border)",
|
|
260
|
+
strokeWidth: 1
|
|
261
|
+
},
|
|
262
|
+
n
|
|
263
|
+
);
|
|
264
|
+
}),
|
|
265
|
+
/* @__PURE__ */ r(
|
|
266
|
+
"polygon",
|
|
267
|
+
{
|
|
268
|
+
points: P,
|
|
269
|
+
fill: "var(--primary)",
|
|
270
|
+
fillOpacity: 0.18,
|
|
271
|
+
stroke: "var(--primary)",
|
|
272
|
+
strokeWidth: 2,
|
|
273
|
+
strokeLinejoin: "round"
|
|
274
|
+
}
|
|
275
|
+
),
|
|
276
|
+
c.factors.map((t, n) => {
|
|
277
|
+
const i = v(n, h * t.radius);
|
|
278
|
+
return /* @__PURE__ */ r(
|
|
279
|
+
"circle",
|
|
280
|
+
{
|
|
281
|
+
cx: i.x,
|
|
282
|
+
cy: i.y,
|
|
283
|
+
r: 3,
|
|
284
|
+
fill: "var(--primary)"
|
|
285
|
+
},
|
|
286
|
+
t.factor
|
|
287
|
+
);
|
|
288
|
+
})
|
|
289
|
+
]
|
|
290
|
+
}
|
|
291
|
+
),
|
|
292
|
+
/* @__PURE__ */ r(
|
|
293
|
+
"dl",
|
|
294
|
+
{
|
|
295
|
+
className: "type-body-sm ds:grid ds:min-w-[12rem] ds:flex-1 ds:grid-cols-[auto_1fr] ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-2xs)] ds:m-0",
|
|
296
|
+
"aria-label": a("periodontalRiskChart.factors.label", "Risk factors"),
|
|
297
|
+
children: c.factors.map((t) => /* @__PURE__ */ m("div", { className: "ds:contents", children: [
|
|
298
|
+
/* @__PURE__ */ r("dt", { className: "ds:text-[color:var(--muted-foreground)]", children: a(`periodontalRiskChart.factor.${t.factor}`, {
|
|
299
|
+
defaultValue: G[t.factor]
|
|
300
|
+
}) }),
|
|
301
|
+
/* @__PURE__ */ m("dd", { className: "ds:m-0 ds:flex ds:items-center ds:gap-[var(--spacing-2xs)]", children: [
|
|
302
|
+
/* @__PURE__ */ r(w, { variant: C[t.level], size: "sm", children: b(t.level) }),
|
|
303
|
+
/* @__PURE__ */ r("span", { className: "type-meta ds:text-[color:var(--muted-foreground)]", children: V(t.factor, t.valueText) })
|
|
304
|
+
] })
|
|
305
|
+
] }, t.factor))
|
|
306
|
+
}
|
|
307
|
+
)
|
|
308
|
+
] })
|
|
309
|
+
] });
|
|
310
|
+
return /* @__PURE__ */ r(
|
|
311
|
+
"div",
|
|
312
|
+
{
|
|
313
|
+
ref: d,
|
|
314
|
+
role: "group",
|
|
315
|
+
"aria-label": I,
|
|
316
|
+
"data-component": "periodontal-risk-chart",
|
|
317
|
+
"data-component-id": p,
|
|
318
|
+
id: p,
|
|
319
|
+
className: W({ surface: l, className: y }),
|
|
320
|
+
...e,
|
|
321
|
+
children: l === "elevated" ? /* @__PURE__ */ r(N, { variant: "elevated", children: /* @__PURE__ */ r(N.Body, { children: R }) }) : R
|
|
322
|
+
}
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
);
|
|
326
|
+
H.displayName = "PeriodontalRiskChart";
|
|
327
|
+
export {
|
|
328
|
+
A as P,
|
|
329
|
+
H as a,
|
|
330
|
+
K as c,
|
|
331
|
+
B as p,
|
|
332
|
+
te as r
|
|
333
|
+
};
|
|
334
|
+
//# sourceMappingURL=periodontal-risk-chart-bUGkMwDg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"periodontal-risk-chart-bUGkMwDg.js","sources":["../../src/components/periodontal-risk-chart/periodontal-risk-chart.agent.ts","../../src/components/periodontal-risk-chart/periodontal-risk-data.ts","../../src/components/periodontal-risk-chart/periodontal-risk-chart.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PeriodontalRiskChartHandle } from './periodontal-risk-chart';\n\n/* -------------------------------------------------------------------- */\n/* PeriodontalRiskChart — agent adapter */\n/* */\n/* Read-only. Exposes the derived risk verdict and per-factor levels — */\n/* ordinal risk bands only, never the raw clinical inputs or any patient */\n/* identity. */\n/* -------------------------------------------------------------------- */\n\nexport const periodontalRiskChartAgent: AgentAdapter<PeriodontalRiskChartHandle> =\n {\n id: 'periodontal-risk-chart',\n capabilities: [],\n state: {\n overall: {\n type: 'string',\n descriptionKey: 'ui.agent.periodontalRiskChart.state.overall',\n description:\n 'Overall periodontal risk verdict — \"low\" | \"moderate\" | \"high\". Aggregate only.',\n read: (handle) => handle.getOverall(),\n },\n factorLevels: {\n type: 'object',\n descriptionKey: 'ui.agent.periodontalRiskChart.state.factorLevels',\n description:\n 'Per-factor risk levels keyed by factor (bleeding, pockets, toothLoss, boneLossAge, smoking, systemic) — each \"low\" | \"moderate\" | \"high\". No raw values.',\n read: (handle) => handle.getFactorLevels(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'periodontal-risk-chart',\n description: 'Marks the PeriodontalRiskChart root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n };\n","/* -------------------------------------------------------------------- */\n/* PeriodontalRiskChart — data model */\n/* */\n/* The Lang & Tonetti (2003) periodontal risk assessment — six vectors, */\n/* each scored low / moderate / high, drawn as a hexagon \"spider web\". */\n/* This module owns the thresholds and the pure scoring function; the */\n/* component owns only the geometry + a11y presentation. */\n/* -------------------------------------------------------------------- */\n\n/** The six risk vectors of the Lang & Tonetti diagram. */\nexport const PERIODONTAL_RISK_FACTORS = [\n 'bleeding',\n 'pockets',\n 'toothLoss',\n 'boneLossAge',\n 'smoking',\n 'systemic',\n] as const;\n\nexport type PeriodontalRiskFactor = (typeof PERIODONTAL_RISK_FACTORS)[number];\n\n/** Ordinal risk level for one factor and for the whole assessment. */\nexport type PeriodontalRiskLevel = 'low' | 'moderate' | 'high';\n\n/** Environmental (smoking) exposure bands. */\nexport type SmokingExposure =\n | 'none'\n | 'former'\n | 'light'\n | 'moderate'\n | 'heavy';\n\n/** Consumer-supplied risk inputs. All optional — an absent factor scores low. */\nexport interface PeriodontalRiskInputs {\n /** Bleeding on probing, % of sites (0–100). */\n bleedingPercent?: number;\n /** Number of residual pockets ≥ 5 mm. */\n pocketsOver5mm?: number;\n /** Number of teeth lost (of 28, third molars excluded). */\n toothLoss?: number;\n /** % bone loss at the worst site — combined with `ageYears` into BL/age. */\n boneLossPercent?: number;\n /** Patient age in years (denominator of the bone-loss/age ratio). */\n ageYears?: number;\n /** Smoking exposure band. */\n smoking?: SmokingExposure;\n /** A relevant systemic / genetic factor is present (e.g. diabetes, IL-1). */\n systemic?: boolean;\n}\n\n/** Scored result for one factor. */\nexport interface PeriodontalRiskFactorScore {\n factor: PeriodontalRiskFactor;\n level: PeriodontalRiskLevel;\n /** 0 (best) → 1 (worst): the normalised radius used to plot the vertex. */\n radius: number;\n /** Raw value formatted for the accessible summary, or null when unset. */\n valueText: string | null;\n}\n\n/** The whole assessment. */\nexport interface PeriodontalRiskResult {\n factors: PeriodontalRiskFactorScore[];\n overall: PeriodontalRiskLevel;\n}\n\nconst LEVEL_RADIUS: Record<PeriodontalRiskLevel, number> = {\n low: 0.4,\n moderate: 0.7,\n high: 1,\n};\n\n/** Order a level to an ordinal (low 0 … high 2). */\nexport function riskOrdinal(level: PeriodontalRiskLevel): 0 | 1 | 2 {\n return level === 'high' ? 2 : level === 'moderate' ? 1 : 0;\n}\n\nfunction band(\n value: number,\n moderateAt: number,\n highAt: number,\n): PeriodontalRiskLevel {\n if (value >= highAt) return 'high';\n if (value >= moderateAt) return 'moderate';\n return 'low';\n}\n\nconst SMOKING_LEVEL: Record<SmokingExposure, PeriodontalRiskLevel> = {\n none: 'low',\n former: 'low',\n light: 'moderate',\n moderate: 'high',\n heavy: 'high',\n};\n\n/**\n * Score the six vectors and the overall risk. Overall follows the Lang &\n * Tonetti reading: high if any vector is high or two-or-more are moderate;\n * low only when every vector is low; moderate otherwise.\n */\nexport function computePeriodontalRisk(\n inputs: PeriodontalRiskInputs,\n): PeriodontalRiskResult {\n const scores: PeriodontalRiskFactorScore[] = [];\n\n const push = (\n factor: PeriodontalRiskFactor,\n level: PeriodontalRiskLevel,\n valueText: string | null,\n ) => scores.push({ factor, level, radius: LEVEL_RADIUS[level], valueText });\n\n // Bleeding on probing (%): <10 low, 10–25 moderate, >25 high.\n {\n const v = inputs.bleedingPercent;\n push(\n 'bleeding',\n v == null ? 'low' : band(v, 10, 26),\n v == null ? null : `${Math.round(v)}%`,\n );\n }\n // Residual pockets ≥5 mm: ≤4 low, 5–8 moderate, ≥9 high.\n {\n const v = inputs.pocketsOver5mm;\n push(\n 'pockets',\n v == null ? 'low' : band(v, 5, 9),\n v == null ? null : String(v),\n );\n }\n // Tooth loss: ≤4 low, 5–8 moderate, ≥9 high.\n {\n const v = inputs.toothLoss;\n push(\n 'toothLoss',\n v == null ? 'low' : band(v, 5, 9),\n v == null ? null : String(v),\n );\n }\n // Bone loss / age ratio: <0.5 low, 0.5–1.0 moderate, >1.0 high.\n {\n const bl = inputs.boneLossPercent;\n const age = inputs.ageYears;\n if (bl == null || age == null || age <= 0) {\n push('boneLossAge', 'low', null);\n } else {\n const ratio = bl / age;\n push(\n 'boneLossAge',\n ratio > 1 ? 'high' : ratio >= 0.5 ? 'moderate' : 'low',\n ratio.toFixed(2),\n );\n }\n }\n // Environmental (smoking).\n {\n const v = inputs.smoking;\n push('smoking', v == null ? 'low' : SMOKING_LEVEL[v], v ?? null);\n }\n // Systemic / genetic: present → high.\n {\n const v = inputs.systemic;\n push('systemic', v ? 'high' : 'low', v == null ? null : v ? 'yes' : 'no');\n }\n\n const highs = scores.filter((s) => s.level === 'high').length;\n const moderates = scores.filter((s) => s.level === 'moderate').length;\n const overall: PeriodontalRiskLevel =\n highs > 0 || moderates >= 2 ? 'high' : moderates === 1 ? 'moderate' : 'low';\n\n return { factors: scores, overall };\n}\n","import {\n forwardRef,\n useId,\n useMemo,\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 { useAgentRegistration } from '../../agent/registry';\nimport { periodontalRiskChartAgent } from './periodontal-risk-chart.agent';\nimport {\n computePeriodontalRisk,\n PERIODONTAL_RISK_FACTORS,\n type PeriodontalRiskFactor,\n type PeriodontalRiskInputs,\n type PeriodontalRiskLevel,\n} from './periodontal-risk-data';\n\n/* -------------------------------------------------------------------- */\n/* PeriodontalRiskChart */\n/* */\n/* The Lang & Tonetti (2003) periodontal risk \"spider web\": six vectors */\n/* (bleeding, residual pockets, tooth loss, bone-loss/age, smoking, */\n/* systemic) each scored low / moderate / high, drawn as a hexagon. */\n/* */\n/* The hexagon SVG is DECORATIVE (aria-hidden) — the accessible source */\n/* of truth is the worded summary: an overall-risk Badge plus a <dl> of */\n/* the six factors with their level and value. Colour is never the sole */\n/* cue (every band and the overall verdict is also worded). */\n/* -------------------------------------------------------------------- */\n\nconst VIEW = 240;\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 PeriodontalRiskChartHandle {\n /** The overall risk verdict. */\n getOverall: () => PeriodontalRiskLevel;\n /** Per-factor risk levels, keyed by factor. */\n getFactorLevels: () => Record<PeriodontalRiskFactor, PeriodontalRiskLevel>;\n}\n\nexport interface PeriodontalRiskChartProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children'\n> {\n /** The six risk inputs. Absent factors score low. */\n inputs: PeriodontalRiskInputs;\n /** `'elevated'` (default) wraps in a Card; `'flat'` drops the chrome. */\n surface?: 'flat' | 'elevated';\n /** Locale for number formatting. Falls back to `i18n.language`. */\n locale?: string;\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/* Geometry */\n/* -------------------------------------------------------------------- */\n\nconst CENTER = VIEW / 2;\nconst RADIUS = VIEW / 2 - 16;\n\n/** Vertex `i` (0 = top, clockwise) at a given radius. */\nfunction vertex(i: number, r: number): { x: number; y: number } {\n const angle = ((-90 + i * 60) * Math.PI) / 180;\n return { x: CENTER + r * Math.cos(angle), y: CENTER + r * Math.sin(angle) };\n}\n\n/** The six-point polygon string for a ring at fraction `f` of the radius. */\nfunction hexPoints(f: number): string {\n return PERIODONTAL_RISK_FACTORS.map((_, i) => {\n const v = vertex(i, RADIUS * f);\n return `${v.x.toFixed(1)},${v.y.toFixed(1)}`;\n }).join(' ');\n}\n\nconst BADGE_TONE: Record<\n PeriodontalRiskLevel,\n 'success' | 'warning' | 'error'\n> = {\n low: 'success',\n moderate: 'warning',\n high: 'error',\n};\n\nconst LEVEL_DEFAULT: Record<PeriodontalRiskLevel, string> = {\n low: 'Low',\n moderate: 'Moderate',\n high: 'High',\n};\n\nconst FACTOR_DEFAULT: Record<PeriodontalRiskFactor, string> = {\n bleeding: 'Bleeding on probing',\n pockets: 'Residual pockets ≥5 mm',\n toothLoss: 'Tooth loss',\n boneLossAge: 'Bone loss / age',\n smoking: 'Smoking',\n systemic: 'Systemic / genetic',\n};\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const PeriodontalRiskChart = forwardRef<\n HTMLDivElement,\n PeriodontalRiskChartProps\n>(\n (\n {\n inputs,\n surface = 'elevated',\n locale,\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 const result = useMemo(() => computePeriodontalRisk(inputs), [inputs]);\n\n useAgentRegistration(\n periodontalRiskChartAgent,\n {\n getOverall: () => result.overall,\n getFactorLevels: () =>\n Object.fromEntries(\n result.factors.map((f) => [f.factor, f.level]),\n ) as Record<PeriodontalRiskFactor, PeriodontalRiskLevel>,\n },\n id,\n );\n\n const patientPoints = result.factors\n .map((f, i) => {\n const v = vertex(i, RADIUS * f.radius);\n return `${v.x.toFixed(1)},${v.y.toFixed(1)}`;\n })\n .join(' ');\n\n const levelLabel = (level: PeriodontalRiskLevel): string =>\n t(`periodontalRiskChart.level.${level}`, {\n defaultValue: LEVEL_DEFAULT[level],\n });\n\n const factorValueText = (\n factor: PeriodontalRiskFactor,\n raw: string | null,\n ): string => {\n if (raw == null)\n return t('periodontalRiskChart.valueUnset', 'not recorded');\n if (factor === 'smoking')\n return t(`periodontalRiskChart.smoking.${raw}`, { defaultValue: raw });\n if (factor === 'systemic')\n return t(`periodontalRiskChart.systemic.${raw}`, { defaultValue: raw });\n if (factor === 'bleeding') {\n // raw already carries the '%' glyph from the data layer; localise digits.\n const n = Number.parseFloat(raw);\n if (Number.isFinite(n)) {\n try {\n return t('periodontalRiskChart.percent', {\n value: new Intl.NumberFormat(resolvedLocale, {\n maximumFractionDigits: 0,\n }).format(n),\n defaultValue: '{{value}}%',\n });\n } catch {\n return raw;\n }\n }\n }\n return raw;\n };\n\n const heading = t('periodontalRiskChart.heading', 'Periodontal risk');\n const resolvedAriaLabel = ariaLabel ?? heading;\n\n const inner = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\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 <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {t('periodontalRiskChart.overall.label', 'Overall')}\n </span>\n <Badge variant={BADGE_TONE[result.overall]} size=\"sm\">\n {levelLabel(result.overall)}\n </Badge>\n </span>\n </div>\n\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-lg)]\">\n {/* Decorative hexagon — the <dl> below is the accessible source. */}\n <svg\n viewBox={`0 0 ${VIEW} ${VIEW}`}\n className=\"ds:w-full ds:max-w-[240px] ds:aspect-square\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <polygon\n points={hexPoints(1)}\n fill=\"var(--destructive)\"\n fillOpacity={0.1}\n />\n <polygon\n points={hexPoints(0.7)}\n fill=\"var(--warning)\"\n fillOpacity={0.12}\n />\n <polygon\n points={hexPoints(0.4)}\n fill=\"var(--success)\"\n fillOpacity={0.14}\n />\n {[1, 0.7, 0.4].map((f) => (\n <polygon\n key={f}\n points={hexPoints(f)}\n fill=\"none\"\n stroke=\"var(--border)\"\n strokeWidth={1}\n />\n ))}\n {PERIODONTAL_RISK_FACTORS.map((_, i) => {\n const v = vertex(i, RADIUS);\n return (\n <line\n key={i}\n x1={CENTER}\n y1={CENTER}\n x2={v.x}\n y2={v.y}\n stroke=\"var(--border)\"\n strokeWidth={1}\n />\n );\n })}\n <polygon\n points={patientPoints}\n fill=\"var(--primary)\"\n fillOpacity={0.18}\n stroke=\"var(--primary)\"\n strokeWidth={2}\n strokeLinejoin=\"round\"\n />\n {result.factors.map((f, i) => {\n const v = vertex(i, RADIUS * f.radius);\n return (\n <circle\n key={f.factor}\n cx={v.x}\n cy={v.y}\n r={3}\n fill=\"var(--primary)\"\n />\n );\n })}\n </svg>\n\n <dl\n className=\"type-body-sm ds:grid ds:min-w-[12rem] ds:flex-1 ds:grid-cols-[auto_1fr] ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-2xs)] ds:m-0\"\n aria-label={t('periodontalRiskChart.factors.label', 'Risk factors')}\n >\n {result.factors.map((f) => (\n <div key={f.factor} className=\"ds:contents\">\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">\n {t(`periodontalRiskChart.factor.${f.factor}`, {\n defaultValue: FACTOR_DEFAULT[f.factor],\n })}\n </dt>\n <dd className=\"ds:m-0 ds:flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <Badge variant={BADGE_TONE[f.level]} size=\"sm\">\n {levelLabel(f.level)}\n </Badge>\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {factorValueText(f.factor, f.valueText)}\n </span>\n </dd>\n </div>\n ))}\n </dl>\n </div>\n </div>\n );\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={resolvedAriaLabel}\n data-component=\"periodontal-risk-chart\"\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\nPeriodontalRiskChart.displayName = 'PeriodontalRiskChart';\n\nexport type PeriodontalRiskChartSurface = NonNullable<\n VariantProps<typeof rootVariants>['surface']\n>;\n"],"names":["periodontalRiskChartAgent","handle","PERIODONTAL_RISK_FACTORS","LEVEL_RADIUS","riskOrdinal","level","band","value","moderateAt","highAt","SMOKING_LEVEL","computePeriodontalRisk","inputs","scores","push","factor","valueText","v","bl","age","ratio","highs","s","moderates","overall","VIEW","rootVariants","cva","CENTER","RADIUS","vertex","i","r","angle","hexPoints","f","_","BADGE_TONE","LEVEL_DEFAULT","FACTOR_DEFAULT","PeriodontalRiskChart","forwardRef","surface","locale","ariaLabel","id","className","rest","ref","t","i18n","useTranslation","headingId","useId","resolvedLocale","result","useMemo","useAgentRegistration","patientPoints","levelLabel","factorValueText","raw","n","heading","resolvedAriaLabel","inner","jsxs","jsx","Badge","Card"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as s, jsxs as X } from "react/jsx-runtime";
|
|
2
2
|
import { useState as C, useCallback as g, useRef as R, useEffect as h, useMemo as $, forwardRef as f, useId as D, useContext as u, createContext as N } from "react";
|
|
3
|
-
import * as
|
|
3
|
+
import * as p from "@radix-ui/react-popover";
|
|
4
4
|
import { c as q } from "./index-D2ZczOXr.js";
|
|
5
5
|
import { useTranslation as G } from "react-i18next";
|
|
6
6
|
import { I as J } from "./icon-button-C_kbcd7I.js";
|
|
@@ -111,12 +111,12 @@ function T({
|
|
|
111
111
|
defaultOpen: c,
|
|
112
112
|
modal: P
|
|
113
113
|
}) {
|
|
114
|
-
const [b, I] = C(c ?? !1), m = i !== void 0,
|
|
114
|
+
const [b, I] = C(c ?? !1), m = i !== void 0, l = m ? i : b, n = g(
|
|
115
115
|
(z) => {
|
|
116
116
|
m || I(z), t == null || t(z);
|
|
117
117
|
},
|
|
118
118
|
[m, t]
|
|
119
|
-
), d = R(null),
|
|
119
|
+
), d = R(null), v = e === "hover" || e === "hover-or-click", a = g(() => {
|
|
120
120
|
d.current && (clearTimeout(d.current), d.current = null);
|
|
121
121
|
}, []), H = g(() => {
|
|
122
122
|
a(), d.current = setTimeout(() => {
|
|
@@ -128,10 +128,10 @@ function T({
|
|
|
128
128
|
}, 300);
|
|
129
129
|
}, [a, n]);
|
|
130
130
|
h(() => () => a(), [a]);
|
|
131
|
-
const w = R(
|
|
131
|
+
const w = R(l);
|
|
132
132
|
h(() => {
|
|
133
|
-
w.current =
|
|
134
|
-
}, [
|
|
133
|
+
w.current = l;
|
|
134
|
+
}, [l]);
|
|
135
135
|
const W = $(
|
|
136
136
|
() => ({
|
|
137
137
|
getIsOpen: () => w.current,
|
|
@@ -143,7 +143,7 @@ function T({
|
|
|
143
143
|
Q(Y, W, r);
|
|
144
144
|
const [K, F] = C(void 0), [L, V] = C(
|
|
145
145
|
void 0
|
|
146
|
-
), S =
|
|
146
|
+
), S = v ? {
|
|
147
147
|
onMouseEnter: H,
|
|
148
148
|
onMouseLeave: x,
|
|
149
149
|
onFocus: () => {
|
|
@@ -158,14 +158,14 @@ function T({
|
|
|
158
158
|
children: /* @__PURE__ */ s(
|
|
159
159
|
k.Provider,
|
|
160
160
|
{
|
|
161
|
-
value: { isHoverMode:
|
|
161
|
+
value: { isHoverMode: v, clearHoverTimer: a, closeWithDelay: x },
|
|
162
162
|
children: /* @__PURE__ */ s(
|
|
163
|
-
|
|
163
|
+
p.Root,
|
|
164
164
|
{
|
|
165
|
-
open:
|
|
165
|
+
open: l,
|
|
166
166
|
onOpenChange: n,
|
|
167
167
|
modal: P,
|
|
168
|
-
children:
|
|
168
|
+
children: v ? /* @__PURE__ */ s("span", { className: "ds:inline-flex", ...S, children: o }) : o
|
|
169
169
|
}
|
|
170
170
|
)
|
|
171
171
|
}
|
|
@@ -174,9 +174,9 @@ function T({
|
|
|
174
174
|
) });
|
|
175
175
|
}
|
|
176
176
|
T.displayName = "Popover.Root";
|
|
177
|
-
const j = f(({ children: e, ...o }, r) => /* @__PURE__ */ s(
|
|
177
|
+
const j = f(({ children: e, ...o }, r) => /* @__PURE__ */ s(p.Trigger, { ref: r, ...o, children: e }));
|
|
178
178
|
j.displayName = "Popover.Trigger";
|
|
179
|
-
const
|
|
179
|
+
const A = f(
|
|
180
180
|
({
|
|
181
181
|
side: e = "bottom",
|
|
182
182
|
align: o = "center",
|
|
@@ -186,18 +186,18 @@ const B = f(
|
|
|
186
186
|
children: c,
|
|
187
187
|
...P
|
|
188
188
|
}, b) => {
|
|
189
|
-
const { headingId: I, descriptionId: m } = u(y),
|
|
189
|
+
const { headingId: I, descriptionId: m } = u(y), l = u(M), {
|
|
190
190
|
isHoverMode: n,
|
|
191
191
|
clearHoverTimer: d,
|
|
192
|
-
closeWithDelay:
|
|
192
|
+
closeWithDelay: v
|
|
193
193
|
} = u(k), a = Z(e), H = n ? {
|
|
194
194
|
onMouseEnter: d,
|
|
195
|
-
onMouseLeave:
|
|
195
|
+
onMouseLeave: v,
|
|
196
196
|
onFocus: d,
|
|
197
|
-
onBlur:
|
|
197
|
+
onBlur: v
|
|
198
198
|
} : {};
|
|
199
|
-
return /* @__PURE__ */ s(
|
|
200
|
-
|
|
199
|
+
return /* @__PURE__ */ s(p.Portal, { children: /* @__PURE__ */ X(
|
|
200
|
+
p.Content,
|
|
201
201
|
{
|
|
202
202
|
ref: b,
|
|
203
203
|
side: a,
|
|
@@ -208,13 +208,13 @@ const B = f(
|
|
|
208
208
|
"aria-describedby": m,
|
|
209
209
|
className: _({ size: r, className: t }),
|
|
210
210
|
"data-component": "popover",
|
|
211
|
-
"data-component-id":
|
|
211
|
+
"data-component-id": l,
|
|
212
212
|
...H,
|
|
213
213
|
...P,
|
|
214
214
|
children: [
|
|
215
215
|
c,
|
|
216
216
|
i && /* @__PURE__ */ s(
|
|
217
|
-
|
|
217
|
+
p.Arrow,
|
|
218
218
|
{
|
|
219
219
|
width: 12,
|
|
220
220
|
height: 6,
|
|
@@ -226,8 +226,8 @@ const B = f(
|
|
|
226
226
|
) });
|
|
227
227
|
}
|
|
228
228
|
);
|
|
229
|
-
|
|
230
|
-
const
|
|
229
|
+
A.displayName = "Popover.Content";
|
|
230
|
+
const B = f(
|
|
231
231
|
({ className: e }, o) => {
|
|
232
232
|
const { t: r } = G();
|
|
233
233
|
return /* @__PURE__ */ s(
|
|
@@ -237,7 +237,7 @@ const A = f(
|
|
|
237
237
|
"ds:absolute ds:top-[var(--spacing-sm)] ds:end-[var(--spacing-sm)]",
|
|
238
238
|
e
|
|
239
239
|
].filter(Boolean).join(" "),
|
|
240
|
-
children: /* @__PURE__ */ s(
|
|
240
|
+
children: /* @__PURE__ */ s(p.Close, { asChild: !0, children: /* @__PURE__ */ s(
|
|
241
241
|
J,
|
|
242
242
|
{
|
|
243
243
|
ref: o,
|
|
@@ -251,7 +251,7 @@ const A = f(
|
|
|
251
251
|
);
|
|
252
252
|
}
|
|
253
253
|
);
|
|
254
|
-
|
|
254
|
+
B.displayName = "Popover.Close";
|
|
255
255
|
const E = f(
|
|
256
256
|
({ as: e = "h3", className: o, ...r }, i) => {
|
|
257
257
|
const t = D(), { setHeadingId: c } = u(y);
|
|
@@ -290,8 +290,11 @@ O.displayName = "Popover.Description";
|
|
|
290
290
|
const ae = Object.assign(T, {
|
|
291
291
|
Root: T,
|
|
292
292
|
Trigger: j,
|
|
293
|
-
|
|
294
|
-
|
|
293
|
+
// Radix pass-through: position Content against an arbitrary element when a
|
|
294
|
+
// Trigger button is unsuitable (e.g. anchoring an editor to a role=tab).
|
|
295
|
+
Anchor: p.Anchor,
|
|
296
|
+
Content: A,
|
|
297
|
+
Close: B,
|
|
295
298
|
Heading: E,
|
|
296
299
|
Description: O
|
|
297
300
|
});
|
|
@@ -299,4 +302,4 @@ export {
|
|
|
299
302
|
ae as P,
|
|
300
303
|
Y as p
|
|
301
304
|
};
|
|
302
|
-
//# sourceMappingURL=popover-
|
|
305
|
+
//# sourceMappingURL=popover-Cc0a69sw.js.map
|