@alfadocs/ui-kit-debug 1.6.0 → 1.7.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-BD-jruqA.js → actions-cell-renderer-ALEAGO3j.js} +6 -6
- package/dist/_chunks/{actions-cell-renderer-BD-jruqA.js.map → actions-cell-renderer-ALEAGO3j.js.map} +1 -1
- package/dist/_chunks/{agenda-tray-CYR-znfE.js → agenda-tray-BweO8pDo.js} +3 -3
- package/dist/_chunks/{agenda-tray-CYR-znfE.js.map → agenda-tray-BweO8pDo.js.map} +1 -1
- package/dist/_chunks/{ai-consent-banner-DLF6FNXv.js → ai-consent-banner-OggpS5hW.js} +2 -2
- package/dist/_chunks/{ai-consent-banner-DLF6FNXv.js.map → ai-consent-banner-OggpS5hW.js.map} +1 -1
- package/dist/_chunks/{ai-prompt-input-BgAubYKd.js → ai-prompt-input-DnbfEJnr.js} +2 -2
- package/dist/_chunks/{ai-prompt-input-BgAubYKd.js.map → ai-prompt-input-DnbfEJnr.js.map} +1 -1
- package/dist/_chunks/{alia-sidebar-Bg53-ZOT.js → alia-sidebar-BWcWZivN.js} +7 -7
- package/dist/_chunks/{alia-sidebar-Bg53-ZOT.js.map → alia-sidebar-BWcWZivN.js.map} +1 -1
- package/dist/_chunks/{anamnesis-card-BylMLHYj.js → anamnesis-card-NTi4LLzI.js} +2 -2
- package/dist/_chunks/{anamnesis-card-BylMLHYj.js.map → anamnesis-card-NTi4LLzI.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-rows-BpYztFUv.js → anamnesis-summary-rows-F-cCmFAn.js} +7 -7
- package/dist/_chunks/{anamnesis-summary-rows-BpYztFUv.js.map → anamnesis-summary-rows-F-cCmFAn.js.map} +1 -1
- package/dist/_chunks/{appointment-timeline-DT1uFp8z.js → appointment-timeline-CMPvzlGZ.js} +4 -4
- package/dist/_chunks/{appointment-timeline-DT1uFp8z.js.map → appointment-timeline-CMPvzlGZ.js.map} +1 -1
- package/dist/_chunks/{appointment-tray-DvyVK7um.js → appointment-tray-3c_FLxXJ.js} +3 -3
- package/dist/_chunks/{appointment-tray-DvyVK7um.js.map → appointment-tray-3c_FLxXJ.js.map} +1 -1
- package/dist/_chunks/{audio-recorder-nVRN4PSK.js → audio-recorder-EWBCNIsd.js} +3 -3
- package/dist/_chunks/{audio-recorder-nVRN4PSK.js.map → audio-recorder-EWBCNIsd.js.map} +1 -1
- package/dist/_chunks/{bishop-score-BV1JAEMV.js → bishop-score-Cnu0xs-z.js} +2 -2
- package/dist/_chunks/{bishop-score-BV1JAEMV.js.map → bishop-score-Cnu0xs-z.js.map} +1 -1
- package/dist/_chunks/{bmi-calculator-CdR-RLFj.js → bmi-calculator-CcH6upht.js} +2 -2
- package/dist/_chunks/{bmi-calculator-CdR-RLFj.js.map → bmi-calculator-CcH6upht.js.map} +1 -1
- package/dist/_chunks/{booking-D84O6H2X.js → booking-CQMJUFG-.js} +5 -5
- package/dist/_chunks/{booking-D84O6H2X.js.map → booking-CQMJUFG-.js.map} +1 -1
- package/dist/_chunks/{button-group-Be_In68J.js → button-group-CaxRJsNG.js} +2 -2
- package/dist/_chunks/{button-group-Be_In68J.js.map → button-group-CaxRJsNG.js.map} +1 -1
- package/dist/_chunks/{button-BvNtqHAS.js → button-nJaPh_HC.js} +68 -38
- package/dist/_chunks/button-nJaPh_HC.js.map +1 -0
- package/dist/_chunks/{care-plan-card-CehAU7F_.js → care-plan-card-DQjVRDxO.js} +2 -2
- package/dist/_chunks/{care-plan-card-CehAU7F_.js.map → care-plan-card-DQjVRDxO.js.map} +1 -1
- package/dist/_chunks/{care-plan-entry-card-ChWRMfMw.js → care-plan-entry-card-CMpoeNkb.js} +2 -2
- package/dist/_chunks/{care-plan-entry-card-ChWRMfMw.js.map → care-plan-entry-card-CMpoeNkb.js.map} +1 -1
- package/dist/_chunks/{care-plan-header-_B0TTWT1.js → care-plan-header-CxYoq23f.js} +2 -2
- package/dist/_chunks/{care-plan-header-_B0TTWT1.js.map → care-plan-header-CxYoq23f.js.map} +1 -1
- package/dist/_chunks/{carousel.agent-pjORsMS8.js → carousel.agent-CLxdHEBP.js} +2 -2
- package/dist/_chunks/{carousel.agent-pjORsMS8.js.map → carousel.agent-CLxdHEBP.js.map} +1 -1
- package/dist/_chunks/{chart-Y-gso_Uz.js → chart-Bkr1Sh4o.js} +3 -3
- package/dist/_chunks/{chart-Y-gso_Uz.js.map → chart-Bkr1Sh4o.js.map} +1 -1
- package/dist/_chunks/{chat-input-BqI9GXQh.js → chat-input-BsB5Umpj.js} +2 -2
- package/dist/_chunks/{chat-input-BqI9GXQh.js.map → chat-input-BsB5Umpj.js.map} +1 -1
- package/dist/_chunks/{chat-message-DHNUbjXA.js → chat-message-DBQu10rs.js} +3 -3
- package/dist/_chunks/{chat-message-DHNUbjXA.js.map → chat-message-DBQu10rs.js.map} +1 -1
- package/dist/_chunks/{code-block-BONe9fJi.js → code-block-BIkpRLkl.js} +2 -2
- package/dist/_chunks/{code-block-BONe9fJi.js.map → code-block-BIkpRLkl.js.map} +1 -1
- package/dist/_chunks/{connection-status-NT8hUtYl.js → connection-status-DRZIcMqM.js} +3 -3
- package/dist/_chunks/{connection-status-NT8hUtYl.js.map → connection-status-DRZIcMqM.js.map} +1 -1
- package/dist/_chunks/{contact-profile-card-BxHiG8e6.js → contact-profile-card-CE9OJKcl.js} +2 -2
- package/dist/_chunks/{contact-profile-card-BxHiG8e6.js.map → contact-profile-card-CE9OJKcl.js.map} +1 -1
- package/dist/_chunks/{control-room-rail-DDyPDBji.js → control-room-rail-IH1eBjrK.js} +3 -3
- package/dist/_chunks/{control-room-rail-DDyPDBji.js.map → control-room-rail-IH1eBjrK.js.map} +1 -1
- package/dist/_chunks/{copy-field-B-DoMBH_.js → copy-field-fYKpl6aN.js} +2 -2
- package/dist/_chunks/{copy-field-B-DoMBH_.js.map → copy-field-fYKpl6aN.js.map} +1 -1
- package/dist/_chunks/{cycle-calculator-DJZYvNhw.js → cycle-calculator-DzgO1vzP.js} +2 -2
- package/dist/_chunks/{cycle-calculator-DJZYvNhw.js.map → cycle-calculator-DzgO1vzP.js.map} +1 -1
- package/dist/_chunks/{dashboard-grid-bd0QW2a8.js → dashboard-grid-BFtdHqfn.js} +2 -2
- package/dist/_chunks/{dashboard-grid-bd0QW2a8.js.map → dashboard-grid-BFtdHqfn.js.map} +1 -1
- package/dist/_chunks/{data-table-tabs-C8uDThT3.js → data-table-tabs-C1kRUzat.js} +3 -3
- package/dist/_chunks/{data-table-tabs-C8uDThT3.js.map → data-table-tabs-C1kRUzat.js.map} +1 -1
- package/dist/_chunks/{description-list-Ck7fKdt5.js → description-list-CjJqR8WK.js} +2 -2
- package/dist/_chunks/{description-list-Ck7fKdt5.js.map → description-list-CjJqR8WK.js.map} +1 -1
- package/dist/_chunks/{document-preview-Aae2yKvY.js → document-preview-oyx9RhCo.js} +2 -2
- package/dist/_chunks/{document-preview-Aae2yKvY.js.map → document-preview-oyx9RhCo.js.map} +1 -1
- package/dist/_chunks/{document-scanner-qNZLhH_r.js → document-scanner-C5Vrbu21.js} +2 -2
- package/dist/_chunks/{document-scanner-qNZLhH_r.js.map → document-scanner-C5Vrbu21.js.map} +1 -1
- package/dist/_chunks/{due-date-calculator-ajaQ4ya5.js → due-date-calculator-wK8Tajzz.js} +2 -2
- package/dist/_chunks/{due-date-calculator-ajaQ4ya5.js.map → due-date-calculator-wK8Tajzz.js.map} +1 -1
- package/dist/_chunks/{editable-currency-cell-renderer-DyMbSyDK.js → editable-currency-cell-renderer-DYdzKpjL.js} +3 -3
- package/dist/_chunks/{editable-currency-cell-renderer-DyMbSyDK.js.map → editable-currency-cell-renderer-DYdzKpjL.js.map} +1 -1
- package/dist/_chunks/{editor-overlay-DE-gxj9L.js → editor-overlay-DEc5yYwo.js} +2 -2
- package/dist/_chunks/{editor-overlay-DE-gxj9L.js.map → editor-overlay-DEc5yYwo.js.map} +1 -1
- package/dist/_chunks/{empty-state-Df0tM6Kn.js → empty-state-X0sVPfVo.js} +2 -2
- package/dist/_chunks/{empty-state-Df0tM6Kn.js.map → empty-state-X0sVPfVo.js.map} +1 -1
- package/dist/_chunks/{entity-summary-DBOI5di6.js → entity-summary-B_vO5Ur4.js} +3 -3
- package/dist/_chunks/{entity-summary-DBOI5di6.js.map → entity-summary-B_vO5Ur4.js.map} +1 -1
- package/dist/_chunks/{face-scheme-D7Pub04e.js → face-scheme-BfDi4YkW.js} +5 -5
- package/dist/_chunks/{face-scheme-D7Pub04e.js.map → face-scheme-BfDi4YkW.js.map} +1 -1
- package/dist/_chunks/{fetal-weight-jon6GIfQ.js → fetal-weight-Dqy0T1fP.js} +2 -2
- package/dist/_chunks/{fetal-weight-jon6GIfQ.js.map → fetal-weight-Dqy0T1fP.js.map} +1 -1
- package/dist/_chunks/{field-array-BQFX5OYi.js → field-array-BjkXZzSr.js} +3 -3
- package/dist/_chunks/{field-array-BQFX5OYi.js.map → field-array-BjkXZzSr.js.map} +1 -1
- package/dist/_chunks/{field-value-BbiDRyNh.js → field-value-DG8zaZvo.js} +4 -4
- package/dist/_chunks/{field-value-BbiDRyNh.js.map → field-value-DG8zaZvo.js.map} +1 -1
- package/dist/_chunks/{file-manager-CML_C6_h.js → file-manager-Cc_upjZX.js} +6 -6
- package/dist/_chunks/{file-manager-CML_C6_h.js.map → file-manager-Cc_upjZX.js.map} +1 -1
- package/dist/_chunks/{finished-terminal-BWNVh7Y8.js → finished-terminal-Br61Ip4e.js} +2 -2
- package/dist/_chunks/{finished-terminal-BWNVh7Y8.js.map → finished-terminal-Br61Ip4e.js.map} +1 -1
- package/dist/_chunks/{fiscal-code-input-Nx1N9r72.js → fiscal-code-input-B_nYMSEM.js} +2 -2
- package/dist/_chunks/{fiscal-code-input-Nx1N9r72.js.map → fiscal-code-input-B_nYMSEM.js.map} +1 -1
- package/dist/_chunks/{freemium-paywall-HG3pFvMp.js → freemium-paywall-DrXzYfv-.js} +2 -2
- package/dist/_chunks/{freemium-paywall-HG3pFvMp.js.map → freemium-paywall-DrXzYfv-.js.map} +1 -1
- package/dist/_chunks/{gestational-age-calculator-dEpQDWcb.js → gestational-age-calculator-C_uDAeP_.js} +2 -2
- package/dist/_chunks/{gestational-age-calculator-dEpQDWcb.js.map → gestational-age-calculator-C_uDAeP_.js.map} +1 -1
- package/dist/_chunks/{hcg-doubling-CC6TLtHd.js → hcg-doubling-BaXkJhT-.js} +2 -2
- package/dist/_chunks/{hcg-doubling-CC6TLtHd.js.map → hcg-doubling-BaXkJhT-.js.map} +1 -1
- package/dist/_chunks/{header-CimZS-J9.js → header-DUXRIPyM.js} +2 -2
- package/dist/_chunks/{header-CimZS-J9.js.map → header-DUXRIPyM.js.map} +1 -1
- package/dist/_chunks/{header-settings-C0zHLXJE.js → header-settings-CVC_davE.js} +4 -4
- package/dist/_chunks/{header-settings-C0zHLXJE.js.map → header-settings-CVC_davE.js.map} +1 -1
- package/dist/_chunks/{icon-button-9c9Gp41m.js → icon-button-DA2CAGHZ.js} +2 -2
- package/dist/_chunks/{icon-button-9c9Gp41m.js.map → icon-button-DA2CAGHZ.js.map} +1 -1
- package/dist/_chunks/{icon-button-group-DrvuWPGJ.js → icon-button-group-D6SVMteH.js} +2 -2
- package/dist/_chunks/{icon-button-group-DrvuWPGJ.js.map → icon-button-group-D6SVMteH.js.map} +1 -1
- package/dist/_chunks/{icon-picker-DXV3sDp1.js → icon-picker-ChzpCnZ-.js} +3 -3
- package/dist/_chunks/{icon-picker-DXV3sDp1.js.map → icon-picker-ChzpCnZ-.js.map} +1 -1
- package/dist/_chunks/{image-cropper-DWSnyLwW.js → image-cropper-C84NDTB7.js} +2 -2
- package/dist/_chunks/{image-cropper-DWSnyLwW.js.map → image-cropper-C84NDTB7.js.map} +1 -1
- package/dist/_chunks/{info-tip-C4mPSJbS.js → info-tip-C119cwQl.js} +2 -2
- package/dist/_chunks/{info-tip-C4mPSJbS.js.map → info-tip-C119cwQl.js.map} +1 -1
- package/dist/_chunks/{insert-result-98J1QEp7.js → insert-result-LCNTskNJ.js} +2 -2
- package/dist/_chunks/{insert-result-98J1QEp7.js.map → insert-result-LCNTskNJ.js.map} +1 -1
- package/dist/_chunks/{key-value-pair-DGkGlgCF.js → key-value-pair-BubG4fUa.js} +2 -2
- package/dist/_chunks/{key-value-pair-DGkGlgCF.js.map → key-value-pair-BubG4fUa.js.map} +1 -1
- package/dist/_chunks/{link-cell-renderer-D3IsW_2R.js → link-cell-renderer-DH4JYpKU.js} +2 -2
- package/dist/_chunks/{link-cell-renderer-D3IsW_2R.js.map → link-cell-renderer-DH4JYpKU.js.map} +1 -1
- package/dist/_chunks/{locale-picker-sI0HWgZy.js → locale-picker-BvbVjDQ-.js} +3 -3
- package/dist/_chunks/{locale-picker-sI0HWgZy.js.map → locale-picker-BvbVjDQ-.js.map} +1 -1
- package/dist/_chunks/{map-view-iwSDRW3t.js → map-view-CCAlC9IL.js} +2 -2
- package/dist/_chunks/{map-view-iwSDRW3t.js.map → map-view-CCAlC9IL.js.map} +1 -1
- package/dist/_chunks/{marketplace-app-shell-b5hN-Q0m.js → marketplace-app-shell-Chfdia7m.js} +4 -4
- package/dist/_chunks/{marketplace-app-shell-b5hN-Q0m.js.map → marketplace-app-shell-Chfdia7m.js.map} +1 -1
- package/dist/_chunks/{message-card-BCJ-Jgs6.js → message-card-D8GB4FdF.js} +3 -3
- package/dist/_chunks/{message-card-BCJ-Jgs6.js.map → message-card-D8GB4FdF.js.map} +1 -1
- package/dist/_chunks/{message-tray-DHtm_WaF.js → message-tray-CGIRQjx5.js} +4 -4
- package/dist/_chunks/{message-tray-DHtm_WaF.js.map → message-tray-CGIRQjx5.js.map} +1 -1
- package/dist/_chunks/{notes-panel-D6HKLLS-.js → notes-panel-DlnENphf.js} +3 -3
- package/dist/_chunks/{notes-panel-D6HKLLS-.js.map → notes-panel-DlnENphf.js.map} +1 -1
- package/dist/_chunks/{notification-card-CcMQn2RX.js → notification-card-CtrzoTUO.js} +3 -3
- package/dist/_chunks/{notification-card-CcMQn2RX.js.map → notification-card-CtrzoTUO.js.map} +1 -1
- package/dist/_chunks/{notification-tray-nr7dv-Q8.js → notification-tray-BiRzXHDf.js} +4 -4
- package/dist/_chunks/{notification-tray-nr7dv-Q8.js.map → notification-tray-BiRzXHDf.js.map} +1 -1
- package/dist/_chunks/{optical-prescription-DtzEqFQm.js → optical-prescription-Dj3Eh5Ok.js} +2 -2
- package/dist/_chunks/{optical-prescription-DtzEqFQm.js.map → optical-prescription-Dj3Eh5Ok.js.map} +1 -1
- package/dist/_chunks/{patient-details-rENrE_qY.js → patient-details-qnsqYBGQ.js} +5 -5
- package/dist/_chunks/{patient-details-rENrE_qY.js.map → patient-details-qnsqYBGQ.js.map} +1 -1
- package/dist/_chunks/{patient-search-NQemeJlL.js → patient-search-D5ufYoRc.js} +2 -2
- package/dist/_chunks/{patient-search-NQemeJlL.js.map → patient-search-D5ufYoRc.js.map} +1 -1
- package/dist/_chunks/{patient-summary-card-DQJgOOrA.js → patient-summary-card-CBfuDvJ5.js} +3 -3
- package/dist/_chunks/{patient-summary-card-DQJgOOrA.js.map → patient-summary-card-CBfuDvJ5.js.map} +1 -1
- package/dist/_chunks/{patient-table-BubxfOWL.js → patient-table-DwshfVsQ.js} +3 -3
- package/dist/_chunks/{patient-table-BubxfOWL.js.map → patient-table-DwshfVsQ.js.map} +1 -1
- package/dist/_chunks/{payment-automation-upsell-CnaBPt5e.js → payment-automation-upsell-BBIG7NFL.js} +2 -2
- package/dist/_chunks/{payment-automation-upsell-CnaBPt5e.js.map → payment-automation-upsell-BBIG7NFL.js.map} +1 -1
- package/dist/_chunks/{payment-request-card-CvhDzDNk.js → payment-request-card-BjjBMdsp.js} +3 -3
- package/dist/_chunks/{payment-request-card-CvhDzDNk.js.map → payment-request-card-BjjBMdsp.js.map} +1 -1
- package/dist/_chunks/{periodontal-chart-C0nNQKKK.js → periodontal-chart-BatZEFar.js} +2 -2
- package/dist/_chunks/{periodontal-chart-C0nNQKKK.js.map → periodontal-chart-BatZEFar.js.map} +1 -1
- package/dist/_chunks/{periodontal-chart-card-Bz-ebteE.js → periodontal-chart-card-BBpY_rBc.js} +2 -2
- package/dist/_chunks/{periodontal-chart-card-Bz-ebteE.js.map → periodontal-chart-card-BBpY_rBc.js.map} +1 -1
- package/dist/_chunks/{popover-Btj6N25H.js → popover-Cqcjx-Ny.js} +2 -2
- package/dist/_chunks/{popover-Btj6N25H.js.map → popover-Cqcjx-Ny.js.map} +1 -1
- package/dist/_chunks/{practice-results-CKoLD_x5.js → practice-results-BEsAdW-B.js} +719 -633
- package/dist/_chunks/practice-results-BEsAdW-B.js.map +1 -0
- package/dist/_chunks/{pregnancy-dating-DQVpFs_f.js → pregnancy-dating-BVS_9YU2.js} +2 -2
- package/dist/_chunks/{pregnancy-dating-DQVpFs_f.js.map → pregnancy-dating-BVS_9YU2.js.map} +1 -1
- package/dist/_chunks/{pregnancy-weight-gain-hm3QJALe.js → pregnancy-weight-gain-CJwbs9W-.js} +2 -2
- package/dist/_chunks/{pregnancy-weight-gain-hm3QJALe.js.map → pregnancy-weight-gain-CJwbs9W-.js.map} +1 -1
- package/dist/_chunks/{privacy-lock-SQYFRSuH.js → privacy-lock-CkAUo6Dz.js} +3 -3
- package/dist/_chunks/{privacy-lock-SQYFRSuH.js.map → privacy-lock-CkAUo6Dz.js.map} +1 -1
- package/dist/_chunks/{product-hub-panel-BjnD9pdl.js → product-hub-panel-BScCotGD.js} +3 -3
- package/dist/_chunks/{product-hub-panel-BjnD9pdl.js.map → product-hub-panel-BScCotGD.js.map} +1 -1
- package/dist/_chunks/{public-header.agent-DseNK2NQ.js → public-header.agent-kth2SdXn.js} +3 -3
- package/dist/_chunks/{public-header.agent-DseNK2NQ.js.map → public-header.agent-kth2SdXn.js.map} +1 -1
- package/dist/_chunks/{radiograph-panel.agent-CAXFgCyn.js → radiograph-panel.agent-CiHwgISa.js} +4 -4
- package/dist/_chunks/{radiograph-panel.agent-CAXFgCyn.js.map → radiograph-panel.agent-CiHwgISa.js.map} +1 -1
- package/dist/_chunks/{reviews-panel-Cd3SxJdW.js → reviews-panel-BKHEfqVQ.js} +4 -4
- package/dist/_chunks/{reviews-panel-Cd3SxJdW.js.map → reviews-panel-BKHEfqVQ.js.map} +1 -1
- package/dist/_chunks/{rich-text-editor-DGtn_4sb.js → rich-text-editor-DARnq_6N.js} +5 -5
- package/dist/_chunks/{rich-text-editor-DGtn_4sb.js.map → rich-text-editor-DARnq_6N.js.map} +1 -1
- package/dist/_chunks/{session-countdown-q4r5TlCo.js → session-countdown-QMsnRa1x.js} +2 -2
- package/dist/_chunks/{session-countdown-q4r5TlCo.js.map → session-countdown-QMsnRa1x.js.map} +1 -1
- package/dist/_chunks/{sheet-CD99CdXr.js → sheet-BSznOyJs.js} +2 -2
- package/dist/_chunks/{sheet-CD99CdXr.js.map → sheet-BSznOyJs.js.map} +1 -1
- package/dist/_chunks/{sign-in-with-alfadocs-button-_JxVRO5d.js → sign-in-with-alfadocs-button-BLe_quy5.js} +2 -2
- package/dist/_chunks/{sign-in-with-alfadocs-button-_JxVRO5d.js.map → sign-in-with-alfadocs-button-BLe_quy5.js.map} +1 -1
- package/dist/_chunks/{signature-request-C4UBfVRZ.js → signature-request-DXhpphlp.js} +4 -4
- package/dist/_chunks/{signature-request-C4UBfVRZ.js.map → signature-request-DXhpphlp.js.map} +1 -1
- package/dist/_chunks/{slot-grid-P_e9p5t5.js → slot-grid-BuZOKfcd.js} +4 -4
- package/dist/_chunks/{slot-grid-P_e9p5t5.js.map → slot-grid-BuZOKfcd.js.map} +1 -1
- package/dist/_chunks/{streaming-text-BuW7I0Zu.js → streaming-text-CvsjIQ7S.js} +2 -2
- package/dist/_chunks/{streaming-text-BuW7I0Zu.js.map → streaming-text-CvsjIQ7S.js.map} +1 -1
- package/dist/_chunks/{task-tray-BT288xoM.js → task-tray-CYG6rj2s.js} +3 -3
- package/dist/_chunks/{task-tray-BT288xoM.js.map → task-tray-CYG6rj2s.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-BBkZuejF.js → tasks-panel-Do5SFp-j.js} +5 -5
- package/dist/_chunks/{tasks-panel-BBkZuejF.js.map → tasks-panel-Do5SFp-j.js.map} +1 -1
- package/dist/_chunks/{theme-toggle-Bi-CmV6M.js → theme-toggle-DuMhQNFS.js} +3 -3
- package/dist/_chunks/{theme-toggle-Bi-CmV6M.js.map → theme-toggle-DuMhQNFS.js.map} +1 -1
- package/dist/_chunks/{toast.agent-C44mtGrW.js → toast.agent-D1tdg6DS.js} +2 -2
- package/dist/_chunks/{toast.agent-C44mtGrW.js.map → toast.agent-D1tdg6DS.js.map} +1 -1
- package/dist/_chunks/{token-insert-menu-D8FgXl33.js → token-insert-menu-9Um0JinI.js} +2 -2
- package/dist/_chunks/{token-insert-menu-D8FgXl33.js.map → token-insert-menu-9Um0JinI.js.map} +1 -1
- package/dist/_chunks/{tool-rail-BF3F2Ihq.js → tool-rail-CHyUmulN.js} +2 -2
- package/dist/_chunks/{tool-rail-BF3F2Ihq.js.map → tool-rail-CHyUmulN.js.map} +1 -1
- package/dist/_chunks/{tooth-scheme-BPXE1_3N.js → tooth-scheme-WdyVymQ1.js} +3 -3
- package/dist/_chunks/{tooth-scheme-BPXE1_3N.js.map → tooth-scheme-WdyVymQ1.js.map} +1 -1
- package/dist/_chunks/{unit-converter-iDxlxKmm.js → unit-converter-BPumXMA6.js} +2 -2
- package/dist/_chunks/{unit-converter-iDxlxKmm.js.map → unit-converter-BPumXMA6.js.map} +1 -1
- package/dist/_chunks/{warning-stack-nczJf52p.js → warning-stack-DQz0Jyir.js} +3 -3
- package/dist/_chunks/{warning-stack-nczJf52p.js.map → warning-stack-DQz0Jyir.js.map} +1 -1
- package/dist/_chunks/{workflow-map-BVofnDYh.js → workflow-map-DE_ribRM.js} +5 -5
- package/dist/_chunks/{workflow-map-BVofnDYh.js.map → workflow-map-DE_ribRM.js.map} +1 -1
- package/dist/agent-catalog.json +2 -2
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-consent-banner/index.js +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/anamnesis-card/index.js +1 -1
- package/dist/components/appointment-card/index.js +1 -1
- package/dist/components/appointment-timeline/index.js +1 -1
- package/dist/components/audio-recorder/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/button/button.d.ts +10 -0
- package/dist/components/button/button.d.ts.map +1 -1
- package/dist/components/button/index.js +2 -2
- package/dist/components/button-group/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/carousel/index.js +1 -1
- package/dist/components/chart/index.js +1 -1
- package/dist/components/chat-input/index.js +1 -1
- package/dist/components/chat-message/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/control-room-rail/index.js +1 -1
- package/dist/components/copy-field/index.js +1 -1
- package/dist/components/cycle-calculator/index.js +1 -1
- package/dist/components/dashboard-grid/index.js +1 -1
- package/dist/components/data-table/index.js +3 -3
- package/dist/components/data-table-tabs/index.js +1 -1
- package/dist/components/description-list/index.js +1 -1
- package/dist/components/document-preview/index.js +1 -1
- package/dist/components/document-scanner/index.js +1 -1
- package/dist/components/due-date-calculator/index.js +1 -1
- package/dist/components/editor-overlay/index.js +1 -1
- package/dist/components/empty-state/index.js +1 -1
- package/dist/components/entity-summary/index.js +1 -1
- package/dist/components/face-scheme/index.js +1 -1
- package/dist/components/fetal-weight/index.js +1 -1
- package/dist/components/field-array/index.js +1 -1
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/finished-terminal/index.js +1 -1
- package/dist/components/fiscal-code-input/index.js +1 -1
- package/dist/components/freemium-paywall/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/header/index.js +1 -1
- package/dist/components/header-settings/index.js +1 -1
- package/dist/components/icon-button/index.js +1 -1
- package/dist/components/icon-button-group/index.js +1 -1
- package/dist/components/icon-picker/index.js +1 -1
- package/dist/components/image-cropper/index.js +1 -1
- package/dist/components/info-tip/index.js +1 -1
- package/dist/components/key-value-pair/index.js +1 -1
- package/dist/components/locale-picker/index.js +1 -1
- package/dist/components/map-view/index.js +1 -1
- package/dist/components/matrix-rain/matrix-rain.d.ts +1 -1
- package/dist/components/message-card/index.js +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/notification-card/index.js +1 -1
- package/dist/components/notification-tray/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-search/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/popover/index.js +1 -1
- package/dist/components/practice-results/index.js +1 -1
- package/dist/components/practice-results/practice-results.d.ts +47 -7
- package/dist/components/practice-results/practice-results.d.ts.map +1 -1
- package/dist/components/pregnancy-dating/index.js +1 -1
- package/dist/components/pregnancy-weight-gain/index.js +1 -1
- package/dist/components/privacy-lock/index.js +1 -1
- package/dist/components/product-hub-tray/index.js +1 -1
- package/dist/components/public-header/index.js +1 -1
- package/dist/components/public-header/public-header.d.ts +1 -1
- package/dist/components/radiograph-panel/index.js +1 -1
- package/dist/components/reviews-panel/index.js +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/session-countdown/index.js +1 -1
- package/dist/components/sheet/index.js +1 -1
- package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
- package/dist/components/slot-grid/index.js +1 -1
- package/dist/components/streaming-text/index.js +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/tasks-panel/index.js +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/toast/index.js +1 -1
- package/dist/components/token-insert-menu/index.js +1 -1
- package/dist/components/tool-rail/index.js +1 -1
- package/dist/components/tooth-scheme/index.js +1 -1
- package/dist/components/unit-converter/index.js +1 -1
- package/dist/components/warning-stack/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/i18n/locales/ar.d.ts +1 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +2 -1
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +1 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +2 -1
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +1 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +2 -1
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +1 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +2 -1
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +1 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +2 -1
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +1 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +2 -1
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +1 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +2 -1
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +1 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +2 -1
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +1 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +2 -1
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +1 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +2 -1
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +1 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +2 -1
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +1 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +2 -1
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +1 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +2 -1
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +1 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +2 -1
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +1 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +2 -1
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +1 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +2 -1
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +1 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +2 -1
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +1 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +2 -1
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +96 -96
- package/dist/locales/ar.json +2 -1
- package/dist/locales/de.json +2 -1
- package/dist/locales/el.json +2 -1
- package/dist/locales/en.json +2 -1
- package/dist/locales/es.json +2 -1
- package/dist/locales/fr.json +2 -1
- package/dist/locales/hi.json +2 -1
- package/dist/locales/it.json +2 -1
- package/dist/locales/ja.json +2 -1
- package/dist/locales/nl.json +2 -1
- package/dist/locales/pl.json +2 -1
- package/dist/locales/pt.json +2 -1
- package/dist/locales/ro.json +2 -1
- package/dist/locales/ru.json +2 -1
- package/dist/locales/sq.json +2 -1
- package/dist/locales/sv.json +2 -1
- package/dist/locales/tr.json +2 -1
- package/dist/locales/zh.json +2 -1
- package/dist/patterns/alia-assistant/index.js +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/patterns/signature-request/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +1 -1
- package/dist/_chunks/button-BvNtqHAS.js.map +0 -1
- package/dist/_chunks/practice-results-CKoLD_x5.js.map +0 -1
package/dist/_chunks/{periodontal-chart-card-Bz-ebteE.js → periodontal-chart-card-BBpY_rBc.js}
RENAMED
|
@@ -4,7 +4,7 @@ import { c as R } from "./index-D2ZczOXr.js";
|
|
|
4
4
|
import { useTranslation as ae } from "react-i18next";
|
|
5
5
|
import { B as re } from "./badge-sTusUqZD.js";
|
|
6
6
|
import { C as S } from "./card-DPmk26CL.js";
|
|
7
|
-
import { K as ne, a as se } from "./key-value-pair-
|
|
7
|
+
import { K as ne, a as se } from "./key-value-pair-BubG4fUa.js";
|
|
8
8
|
import { u as oe } from "./registry-DvAUVLHh.js";
|
|
9
9
|
const de = {
|
|
10
10
|
id: "periodontal-chart-card",
|
|
@@ -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-BBpY_rBc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"periodontal-chart-card-Bz-ebteE.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-BBpY_rBc.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":";;;;;;;;AAYO,MAAMA,KACX;AAAA,EACE,IAAI;AAAA,EACJ,cAAc,CAAA;AAAA,EACd,OAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aACE;AAAA,MACF,MAAM,CAACC,MAAWA,EAAO,YAAA;AAAA,IAAY;AAAA,IAEvC,WAAW;AAAA,MACT,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,MAAM,CAACA,MAAWA,EAAO,aAAA;AAAA,IAAa;AAAA,IAExC,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aACE;AAAA,MACF,MAAM,CAACA,MAAWA,EAAO,mBAAA;AAAA,IAAmB;AAAA,EAC9C;AAAA,EAEF,SAAS,CAAA;AAAA,EACT,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,GCRIC,KAAeC,EAAI,+CAA+C;AAAA,EACtE,UAAU;AAAA;AAAA;AAAA;AAAA,IAIR,SAAS;AAAA,MACP,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,EACZ;AAAA,EAEF,iBAAiB,EAAE,SAAS,WAAA;AAC9B,CAAC,GAKKC,KAAkBD;AAAA,EACtB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,UAAU;AAAA,QACR,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,QAAQ;AAAA,MAAA;AAAA,IACV;AAAA,IAEF,iBAAiB,EAAE,UAAU,SAAA;AAAA,EAAS;AAE1C,GAOME,IAAqB,GAErBC,IAAmB,GAGZC,IAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKMC,KAAkD;AAAA,EACtD,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,IAAI;AACN,GAGMC,IAAiB,CAAC,KAAK,KAAK,KAAK,GAAG;AA2F1C,SAASC,GACPC,GACkC;AAClC,SAAIA,KAAS,QAAQ,CAAC,OAAO,SAASA,CAAK,IAAU,WACjDA,KAASL,IAAyB,WAClCK,KAASN,IAA2B,aACjC;AACT;AAGA,SAASO,GAAeC,GAAoD;AAC1E,SAAIA,MAAa,WAAiB,OAC9BA,MAAa,aAAmB,MAC7B;AACT;AAGA,SAASC,EAAWC,GAAkC;AACpD,QAAMC,IAAQD,EAAM,KAAA,EAAO,OAAO,CAAC;AACnC,SAAQN,EAAqC,SAASO,CAAK,IACtDA,IACD;AACN;AAWO,MAAMC,KAAuBC;AAAA,EAIlC,CACE;AAAA,IACE,OAAAC;AAAA,IACA,SAAAC;AAAA,IACA,WAAAC,IAAY;AAAA,IACZ,UAAAC;AAAA,IACA,SAAAC;AAAA,IACA,QAAAC;AAAA,IACA,SAAAC,IAAU;AAAA,IACV,cAAcC;AAAA,IACd,IAAAC;AAAA,IACA,WAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,GAAAC,GAAG,MAAAC,EAAA,IAASC,GAAA,GACdC,IAAYC,GAAA,GACZC,IAAiBZ,KAAUQ,EAAK,YAAY,MAK5C,EAAE,WAAAK,GAAW,UAAAC,GAAU,WAAAC,GAAW,iBAAAC,EAAA,IAAoBC,EAAQ,MAAM;AACxE,YAAMC,wBAAc,IAAA;AACpB,UAAIC,IAAS,GACTC,IAAO;AACX,iBAAWC,KAAQ1B,GAAO;AACxB,QAAAwB,KAAU,IACLE,EAAK,iBAAiB,MAAMvC,MAAkBsC,KAAQ;AAC3D,YAAIE,IAAMJ,EAAQ,IAAIG,EAAK,KAAK;AAChC,QAAKC,MACHA,IAAM,EAAE,OAAOD,EAAK,OAAO,OAAO,CAAA,EAAC,GACnCH,EAAQ,IAAIG,EAAK,OAAOC,CAAG,IAE7BA,EAAI,MAAMD,EAAK,IAAI,IAAIA;AAAA,MACzB;AAIA,YAAME,IAAO,MAAM,KAAKL,EAAQ,QAAQ,GAClCM,IAGDvC,EAAe,IAAI,CAACwC,OAAO;AAAA,QAC9B,UAAUA;AAAA,QACV,OAAOF,EACJ,OAAO,CAACG,MAAMpC,EAAWoC,EAAE,KAAK,MAAMD,CAAC,EACvC,KAAK,CAACE,GAAGC,MAAMD,EAAE,MAAM,cAAcC,EAAE,OAAO,IAAI,CAAC;AAAA,MAAA,EACtD,EAAE,OAAO,CAACC,MAAMA,EAAE,MAAM,SAAS,CAAC,GAI9BC,IAAaP,EAAK,OAAO,CAACG,MAAMpC,EAAWoC,EAAE,KAAK,MAAM,IAAI;AAClE,MAAII,EAAW,SAAS,KACtBN,EAAQ,KAAK,EAAE,UAAU,MAAM,OAAOM,GAAY;AAGpD,YAAMC,IAAMP,EAAQ,QAAQ,CAACK,MAAMA,EAAE,MAAM,IAAI,CAACG,MAAOA,EAAG,KAAK,CAAC;AAChE,aAAO;AAAA,QACL,WAAWR;AAAA,QACX,UAAUO;AAAA,QACV,WAAWZ;AAAA,QACX,iBAAiBC;AAAA,MAAA;AAAA,IAErB,GAAG,CAACzB,CAAK,CAAC;AAEV,IAAAsC;AAAA,MACEzD;AAAA,MACA;AAAA,QACE,aAAa,MAAMsC;AAAA,QACnB,cAAc,MAAMC;AAAA,QACpB,oBAAoB,MAAMC;AAAA,MAAA;AAAA,MAE5Bb;AAAA,IAAA;AAGF,UAAM+B,IAAgBjB,EAAQ,MAAM;AAClC,UAAI,CAACrB,EAAS;AACd,YAAMuC,IAAS,IAAI,KAAKvC,CAAO;AAC/B,UAAI,QAAO,MAAMuC,EAAO,QAAA,CAAS;AACjC,YAAI;AACF,iBAAO,IAAI,KAAK,eAAevB,GAAgB;AAAA,YAC7C,WAAW;AAAA,UAAA,CACZ,EAAE,OAAOuB,CAAM;AAAA,QAClB,QAAQ;AACN,iBAAOA,EAAO,YAAA,EAAc,MAAM,GAAG,EAAE;AAAA,QACzC;AAAA,IACF,GAAG,CAACvC,GAASgB,CAAc,CAAC,GAEtBwB,IAAkB7B;AAAA,MACtB;AAAA,MACA;AAAA,IAAA,GAEI8B,IAAoBnC,KAAakC,GAEjCE,IAAsD;AAAA,MAC1D,WAAW;AAAA,MACX,SAAS;AAAA,MACT,OAAO;AAAA,IAAA,GAEHC,IAAiBhC,EAAE,kCAAkCV,CAAS,IAAI;AAAA,MACtE,cAAcyC,EAAkBzC,CAAS;AAAA,IAAA,CAC1C,GAEK2C,IAAe,CAACC,MAAsB;AAC1C,UAAI;AACF,eAAO,IAAI,KAAK,aAAa7B,GAAgB;AAAA,UAC3C,uBAAuB;AAAA,QAAA,CACxB,EAAE,OAAO6B,CAAC;AAAA,MACb,QAAQ;AACN,eAAO,OAAOA,CAAC;AAAA,MACjB;AAAA,IACF,GAMMC,IACJ,CAAA;AACF,KAAI3C,KAAA,gBAAAA,EAAS,sBAAqB,QAChC2C,EAAY,KAAK;AAAA,MACf,KAAK;AAAA,MACL,OAAOnC;AAAA,QACL;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,OAAOA,EAAE,gCAAgC;AAAA,QACvC,OAAOiC,EAAazC,EAAQ,iBAAiB;AAAA,QAC7C,cAAc;AAAA,MAAA,CACf;AAAA,IAAA,CACF,IAECA,KAAA,gBAAAA,EAAS,6BAA4B,QACvC2C,EAAY,KAAK;AAAA,MACf,KAAK;AAAA,MACL,OAAOnC;AAAA,QACL;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,OAAOA,EAAE,qCAAqC;AAAA,QAC5C,OAAOiC,EAAazC,EAAQ,wBAAwB;AAAA,QACpD,cAAc;AAAA,MAAA,CACf;AAAA,IAAA,CACF;AAOH,UAAM4C,IAAgB,CACpBxD,GACAyD,MACc;AACd,UAAIzD,KAAS,QAAQ,CAAC,OAAO,SAASA,CAAK;AACzC,eACE,gBAAA0D;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAU;AAAA,YAET,UAAAtC,EAAE,mCAAmC,GAAG;AAAA,UAAA;AAAA,QAAA;AAI/C,YAAMlB,IAAWuD,MAAS,WAAW1D,GAAeC,CAAK,IAAI,UACvD2D,IAASF,MAAS,WAAWxD,GAAeC,CAAQ,IAAI,IACxD0D,IAAUP,EAAarD,CAAK,GAI5B6D,IACJ3D,MAAa,WACT,IAAIkB,EAAE,oCAAoC,eAAe,CAAC,KAC1DlB,MAAa,aACX,IAAIkB,EAAE,sCAAsC,iBAAiB,CAAC,KAC9D;AACR,+BACG,QAAA,EAAK,WAAW3B,GAAgB,EAAE,UAAAS,EAAA,CAAU,GAC3C,UAAA;AAAA,QAAA,gBAAAwD,EAAC,UAAM,UAAAE,EAAA,CAAQ;AAAA,QACdD,IAAS,gBAAAD,EAAC,QAAA,EAAK,eAAY,QAAQ,aAAO,IAAU;AAAA,QACpDG,IAAW,gBAAAH,EAAC,QAAA,EAAK,WAAU,cAAc,aAAS,IAAU;AAAA,MAAA,GAC/D;AAAA,IAEJ,GAMMI,IAAc,CAAC5B,MACf,CAACA,KAAS,CAACA,EAAK,YAAY,CAACA,EAAK,cAElC,gBAAAwB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,eAAY;AAAA,QACZ,WAAU;AAAA,QAET,UAAAtC,EAAE,mCAAmC,GAAG;AAAA,MAAA;AAAA,IAAA,IAK7C,gBAAA2C,EAAC,QAAA,EAAK,WAAU,8DACb,UAAA;AAAA,MAAA7B,EAAK,WACJ,gBAAAwB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAYtC;AAAA,YACV;AAAA,YACA;AAAA,UAAA;AAAA,UAEF,WAAU;AAAA,QAAA;AAAA,MAAA,IAEV;AAAA,MACHc,EAAK,cACJ,gBAAAwB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAYtC;AAAA,YACV;AAAA,YACA;AAAA,UAAA;AAAA,UAEF,WAAU;AAAA,QAAA;AAAA,MAAA,IAEV;AAAA,IAAA,GACN,GAQE4C,IAAiB,CAACC,MAGP;AACf,YAAMC,IAA+C;AAAA,QACnD,GAAK;AAAA,QACL,GAAK;AAAA,QACL,GAAK;AAAA,QACL,GAAK;AAAA,MAAA,GAEDC,IACJF,EAAM,YAAY,OACd7C,EAAE,iCAAiC6C,EAAM,QAAQ,IAAI;AAAA,QACnD,cAAcC,EAAiBD,EAAM,QAAQ;AAAA,MAAA,CAC9C,IACD7C,EAAE,uCAAuC,aAAa,GACtDgD,IACJ,mHACIC,IACJ;AACF,aACE,gBAAAX;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAU;AAAA,UAEV,UAAA,gBAAAK,EAAC,SAAA,EAAM,WAAU,6CACf,UAAA;AAAA,YAAA,gBAAAL,EAAC,WAAA,EAAQ,WAAU,+FAChB,UAAAS,GACH;AAAA,YACA,gBAAAT,EAAC,SAAA,EACC,UAAA,gBAAAK,EAAC,MAAA,EACC,UAAA;AAAA,cAAA,gBAAAL;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAM;AAAA,kBACN,WAAU;AAAA,kBAET,UAAAtC,EAAE,uCAAuC,aAAa;AAAA,gBAAA;AAAA,cAAA;AAAA,cAExD6C,EAAM,MAAM,IAAI,CAAC9B,MAChB,gBAAA4B;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,OAAM;AAAA,kBACN,iBAAe5B,EAAI;AAAA,kBACnB,WAAU;AAAA,kBAEV,UAAA;AAAA,oBAAA,gBAAAuB,EAAC,QAAA,EAAK,WAAU,cACb,UAAAtC,EAAE,oCAAoC;AAAA,sBACrC,OAAOe,EAAI;AAAA,sBACX,cAAc;AAAA,oBAAA,CACf,GACH;AAAA,oBACA,gBAAAuB,EAAC,QAAA,EAAK,eAAY,QAAQ,YAAI,MAAA,CAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAX/BvB,EAAI;AAAA,cAAA,CAaZ;AAAA,YAAA,EAAA,CACH,EAAA,CACF;AAAA,8BACC,SAAA,EAEC,UAAA;AAAA,cAAA,gBAAA4B,EAAC,MAAA,EACC,UAAA;AAAA,gBAAA,gBAAAL,EAAC,MAAA,EAAG,OAAM,OAAM,WAAWW,GACxB,UAAAjD;AAAA,kBACC;AAAA,kBACA;AAAA,gBAAA,GAEJ;AAAA,gBACC6C,EAAM,MAAM,IAAI,CAAC9B,MAChB,gBAAAuB,EAAC,MAAA,EAAmB,WAAWU,GAC7B,UAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,yEACb,UAAA;AAAA,kBAAAnE,EAAuB,IAAI,CAAC0E,MAC3B,gBAAAZ,EAAC,QAAA,EAAkB,WAAU,cAC1B,UAAAtC,EAAE,6BAA6BkD,CAAM,IAAI;AAAA,oBACxC,cAAczE,GAAayE,CAAM;AAAA,kBAAA,CAClC,EAAA,GAHQA,CAIX,CACD;AAAA,kBACD,gBAAAZ,EAAC,UAAK,WAAU,uCACb,YAAuB,IAAI,CAACY,MAAA;;AAC3B,2CAAAZ,EAAC,QAAA,EACE,UAAAF;AAAA,uBACCe,IAAApC,EAAI,MAAMmC,CAAM,MAAhB,gBAAAC,EAAmB;AAAA,sBACnB;AAAA,oBAAA,EACF,GAJSD,CAKX;AAAA,mBACD,EAAA,CACH;AAAA,gBAAA,GACF,EAAA,GAnBOnC,EAAI,KAoBb,CACD;AAAA,cAAA,GACH;AAAA,gCAEC,MAAA,EACC,UAAA;AAAA,gBAAA,gBAAAuB,EAAC,MAAA,EAAG,OAAM,OAAM,WAAWW,GACxB,UAAAjD,EAAE,sCAAsC,iBAAiB,EAAA,CAC5D;AAAA,gBACC6C,EAAM,MAAM,IAAI,CAAC9B,MAChB,gBAAAuB,EAAC,QAAmB,WAAWU,GAC7B,UAAA,gBAAAV,EAAC,QAAA,EAAK,WAAU,yDACb,UAAA9D,EAAuB,IAAI,CAAC0E;;2CAC1B,QAAA,EACE,UAAAd;AAAA,qBACCe,IAAApC,EAAI,MAAMmC,CAAM,MAAhB,gBAAAC,EAAmB;AAAA,oBACnB;AAAA,kBAAA,KAHOD,CAKX;AAAA,iBACD,GACH,EAAA,GAVOnC,EAAI,KAWb,CACD;AAAA,cAAA,GACH;AAAA,gCAEC,MAAA,EACC,UAAA;AAAA,gBAAA,gBAAAuB,EAAC,MAAA,EAAG,OAAM,OAAM,WAAWW,GACxB,UAAAjD;AAAA,kBACC;AAAA,kBACA;AAAA,gBAAA,GAEJ;AAAA,gBACC6C,EAAM,MAAM,IAAI,CAAC9B,MAChB,gBAAAuB,EAAC,MAAA,EAAmB,WAAWU,GAC7B,UAAA,gBAAAV,EAAC,QAAA,EAAK,WAAU,yDACb,UAAA9D,EAAuB,IAAI,CAAC0E,MAC3B,gBAAAZ,EAAC,QAAA,EACE,UAAAI,EAAY3B,EAAI,MAAMmC,CAAM,CAAC,EAAA,GADrBA,CAEX,CACD,EAAA,CACH,EAAA,GAPOnC,EAAI,KAQb,CACD;AAAA,cAAA,GACH;AAAA,cAECxB,KACDsD,EAAM,MAAM,KAAK,CAAC9B,MAAQxB,EAASwB,EAAI,KAAK,KAAK,IAAI,sBAClD,MAAA,EACC,UAAA;AAAA,gBAAA,gBAAAuB,EAAC,MAAA,EAAG,OAAM,OAAM,WAAWW,GACxB,UAAAjD,EAAE,qCAAqC,UAAU,EAAA,CACpD;AAAA,gBACC6C,EAAM,MAAM,IAAI,CAAC9B,MAAQ;AACxB,wBAAMqC,IAAQ7D,EAASwB,EAAI,KAAK;AAChC,yBACE,gBAAAuB,EAAC,MAAA,EAAmB,WAAWU,GAC5B,eAAS,OACR,gBAAAV;AAAA,oBAACe;AAAA,oBAAA;AAAA,sBACC,SAASD,KAAS,IAAI,YAAY;AAAA,sBAClC,MAAK;AAAA,sBACL,cAAYpD;AAAA,wBACV;AAAA,wBACA;AAAA,0BACE,OAAAoD;AAAA,0BACA,cAAc;AAAA,wBAAA;AAAA,sBAChB;AAAA,sBAGD,UAAAA;AAAA,oBAAA;AAAA,kBAAA,IAGH,gBAAAd;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,eAAY;AAAA,sBACZ,WAAU;AAAA,sBAET,UAAAtC,EAAE,mCAAmC,GAAG;AAAA,oBAAA;AAAA,kBAAA,EAC3C,GArBKe,EAAI,KAuBb;AAAA,gBAEJ,CAAC;AAAA,cAAA,EAAA,CACH,IACE;AAAA,YAAA,EAAA,CACN;AAAA,UAAA,EAAA,CACF;AAAA,QAAA;AAAA,QAjJK8B,EAAM,YAAY;AAAA,MAAA;AAAA,IAoJ7B,GAMMS,IACJ,gBAAAX;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,cAAY3C,EAAE,qCAAqC,cAAc;AAAA,QAEjE,UAAA;AAAA,UAAA,gBAAA2C,EAAC,QAAA,EAAK,WAAU,8DACd,UAAA;AAAA,YAAA,gBAAAL;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,WAAU;AAAA,gBAET,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAEFtC,EAAE,wCAAwC;AAAA,cACzC,WAAW1B;AAAA,cACX,cAAc;AAAA,YAAA,CACf;AAAA,UAAA,GACH;AAAA,UACA,gBAAAqE,EAAC,QAAA,EAAK,WAAU,8DACd,UAAA;AAAA,YAAA,gBAAAL;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,WAAU;AAAA,gBAET,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAEFtC,EAAE,sCAAsC;AAAA,cACvC,WAAWzB;AAAA,cACX,cAAc;AAAA,YAAA,CACf;AAAA,UAAA,GACH;AAAA,UACA,gBAAAoE,EAAC,QAAA,EAAK,WAAU,8DACd,UAAA;AAAA,YAAA,gBAAAL;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,YAEXtC,EAAE,sCAAsC,qBAAqB;AAAA,UAAA,GAChE;AAAA,UACA,gBAAA2C,EAAC,QAAA,EAAK,WAAU,8DACd,UAAA;AAAA,YAAA,gBAAAL;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,YAEXtC,EAAE,yCAAyC,aAAa;AAAA,UAAA,EAAA,CAC3D;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAIEuD,IAAUjD,EAAU,WAAW,GAE/BkD,IACJ,gBAAAb,EAAC,OAAA,EAAI,WAAU,kDACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,mDACb,UAAA;AAAA,QAAA,gBAAAL;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAInC;AAAA,YACJ,WAAU;AAAA,YAET,UAAA0B;AAAA,UAAA;AAAA,QAAA;AAAA,0BAEF,KAAA,EAAE,WAAU,+DACV,UAAAF,IACG3B,EAAE,uCAAuC;AAAA,UACvC,WAAWgC;AAAA,UACX,MAAML;AAAA,UACN,cAAc;AAAA,QAAA,CACf,IACDK,EAAA,CACN;AAAA,MAAA,GACF;AAAA,MAECG,EAAY,SAAS,IACpB,gBAAAG,EAACmB,MAAa,QAAO,MAClB,UAAAtB,EAAY,IAAI,CAACpB,wBACf2C,IAAA,EAA2B,OAAO3C,EAAI,OAAO,OAAOA,EAAI,SAAtCA,EAAI,GAAyC,CACjE,EAAA,CACH,IACE;AAAA,MAEHwC,IACC,gBAAAjB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UAET,UAAAtC;AAAA,YACC;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA,IAGF,gBAAA2C,EAAAgB,GAAA,EACE,UAAA;AAAA,QAAA,gBAAArB,EAAC,OAAA,EAAI,WAAU,kDACZ,UAAAhC,EAAU,IAAI,CAACuC,MAAUD,EAAeC,CAAK,CAAC,EAAA,CACjD;AAAA,QACCS;AAAA,MAAA,EAAA,CACH;AAAA,IAAA,GAEJ;AAGF,WACE,gBAAAhB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAvC;AAAA,QACA,MAAK;AAAA,QACL,cAAY+B;AAAA,QACZ,mBAAiB3B;AAAA,QACjB,kBAAe;AAAA,QACf,qBAAmBP;AAAA,QACnB,IAAAA;AAAA,QACA,WAAWzB,GAAa,EAAE,SAAAuB,GAAS,WAAAG,GAAW;AAAA,QAC7C,GAAGC;AAAA,QAEH,UAAAJ,MAAY,aACX,gBAAA4C,EAACsB,GAAA,EAAK,SAAQ,YACZ,UAAA,gBAAAtB,EAACsB,EAAK,MAAL,EAAW,UAAAJ,EAAA,CAAM,EAAA,CACpB,IAEAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEAtE,GAAqB,cAAc;"}
|
|
@@ -3,7 +3,7 @@ import { useState as C, useCallback as g, useRef as R, useEffect as h, useMemo a
|
|
|
3
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
|
-
import { I as J } from "./icon-button-
|
|
6
|
+
import { I as J } from "./icon-button-DA2CAGHZ.js";
|
|
7
7
|
import { u as Q } from "./registry-DvAUVLHh.js";
|
|
8
8
|
import { X as U } from "./x-B5YnXwCz.js";
|
|
9
9
|
const Y = {
|
|
@@ -302,4 +302,4 @@ export {
|
|
|
302
302
|
ae as P,
|
|
303
303
|
Y as p
|
|
304
304
|
};
|
|
305
|
-
//# sourceMappingURL=popover-
|
|
305
|
+
//# sourceMappingURL=popover-Cqcjx-Ny.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popover-Btj6N25H.js","sources":["../../src/components/popover/popover.agent.ts","../../src/components/popover/popover.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PopoverHandle } from './popover';\n\nexport const popoverAgent: AgentAdapter<PopoverHandle> = {\n id: 'popover',\n capabilities: ['open', 'close'],\n state: {\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.popover.state.isOpen',\n description: 'True when the popover is currently open.',\n read: (handle) => handle.getIsOpen(),\n },\n },\n actions: {\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.popover.actions.open',\n description: 'Open the popover.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.popover.actions.close',\n description: 'Close the popover.',\n invoke: (handle) => {\n handle.close();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'popover' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on Popover.Root.',\n },\n },\n};\n","import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { useAgentRegistration } from '../../agent';\nimport { popoverAgent } from './popover.agent';\n\ninterface PopoverA11yContext {\n headingId: string | undefined;\n setHeadingId: (id: string | undefined) => void;\n descriptionId: string | undefined;\n setDescriptionId: (id: string | undefined) => void;\n}\n\nconst A11yContext = createContext<PopoverA11yContext>({\n headingId: undefined,\n setHeadingId: () => {},\n descriptionId: undefined,\n setDescriptionId: () => {},\n});\n\ninterface PopoverHoverContext {\n isHoverMode: boolean;\n clearHoverTimer: () => void;\n closeWithDelay: () => void;\n}\n\nconst HoverContext = createContext<PopoverHoverContext>({\n isHoverMode: false,\n clearHoverTimer: () => {},\n closeWithDelay: () => {},\n});\n\nfunction resolvePhysicalSide(\n logicalSide: 'start' | 'top' | 'end' | 'bottom',\n): 'left' | 'top' | 'right' | 'bottom' {\n if (logicalSide === 'top' || logicalSide === 'bottom') return logicalSide;\n const isRtl =\n typeof document !== 'undefined' && document.documentElement.dir === 'rtl';\n if (logicalSide === 'start') return isRtl ? 'right' : 'left';\n /* logicalSide === 'end' */\n return isRtl ? 'left' : 'right';\n}\n\nconst contentVariants = cva(\n [\n // `--card-border` 32% alpha provides a subtle edge that survives dark\n // without becoming a heavy outline. The previous transparent border\n // relied on the drop-shadow alone, which reads as a faint halo against\n // dark surfaces and lets the popover float as an unbounded blob; the\n // earlier heavy `--border` (grey-800 since WCAG 1.4.11 bump in 67fef8c)\n // overcorrected the other way and made the popover read as a charcoal\n // box. The forced-colors override below upgrades the border to\n // `CanvasText` so HCM still repaints a fully visible edge.\n 'ds:relative ds:bg-[var(--popover)] ds:border ds:border-[color:var(--card-border)] ds:rounded-[var(--radius-md)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:z-[var(--z-popover)]',\n 'ds:text-[var(--popover-foreground)] ds:text-[length:var(--font-size-sm)]',\n 'ds:break-words',\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=closed]:fade-out-0 ds:data-[state=open]:fade-in-0',\n 'ds:data-[state=closed]:zoom-out-95 ds:data-[state=open]:zoom-in-95',\n 'ds:data-[side=bottom]:slide-in-from-top-2 ds:data-[side=left]:slide-in-from-right-2',\n 'ds:data-[side=right]:slide-in-from-left-2 ds:data-[side=top]:slide-in-from-bottom-2',\n 'ds:motion-reduce:transition-none ds:motion-reduce:animate-none',\n 'ds:forced-colors:border-[CanvasText]',\n 'ds:focus-visible:outline-none',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:max-w-[var(--popover-size-sm)]',\n md: 'ds:max-w-[var(--popover-size-md)]',\n lg: 'ds:max-w-[var(--popover-size-lg)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\n// Curated agent-readiness handle — see popover.agent.ts.\nexport interface PopoverHandle {\n getIsOpen: () => boolean;\n open: () => void;\n close: () => void;\n}\n\nexport interface PopoverRootProps extends ComponentPropsWithoutRef<\n typeof RadixPopover.Root\n> {\n openOn?: 'click' | 'hover' | 'hover-or-click';\n /** Opaque instance id — forwarded to Popover.Content as `data-component-id`. */\n id?: string;\n children: ReactNode;\n}\n\nconst PopoverIdContext = createContext<string | undefined>(undefined);\n\nfunction PopoverRoot({\n openOn = 'click',\n children,\n id,\n open: controlledOpen,\n onOpenChange,\n defaultOpen,\n modal,\n}: PopoverRootProps) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen ?? false);\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n if (!isControlled) setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen);\n },\n [isControlled, onOpenChange],\n );\n\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const isHoverMode = openOn === 'hover' || openOn === 'hover-or-click';\n\n const clearHoverTimer = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n }, []);\n\n const openWithDelay = useCallback(() => {\n clearHoverTimer();\n hoverTimerRef.current = setTimeout(() => {\n handleOpenChange(true);\n }, 300);\n }, [clearHoverTimer, handleOpenChange]);\n\n const closeWithDelay = useCallback(() => {\n clearHoverTimer();\n hoverTimerRef.current = setTimeout(() => {\n handleOpenChange(false);\n }, 300);\n }, [clearHoverTimer, handleOpenChange]);\n\n useEffect(() => {\n return () => clearHoverTimer();\n }, [clearHoverTimer]);\n\n // Agent handle.\n const openRef = useRef(isOpen);\n useEffect(() => {\n openRef.current = isOpen;\n }, [isOpen]);\n\n const agentHandle = useMemo<PopoverHandle>(\n () => ({\n getIsOpen: () => openRef.current,\n open: () => handleOpenChange(true),\n close: () => handleOpenChange(false),\n }),\n [handleOpenChange],\n );\n useAgentRegistration(popoverAgent, agentHandle, id);\n\n /* a11y context state */\n const [headingId, setHeadingId] = useState<string | undefined>(undefined);\n const [descriptionId, setDescriptionId] = useState<string | undefined>(\n undefined,\n );\n\n const hoverHandlers = isHoverMode\n ? {\n onMouseEnter: openWithDelay,\n onMouseLeave: closeWithDelay,\n onFocus: () => {\n clearHoverTimer();\n handleOpenChange(true);\n },\n onBlur: closeWithDelay,\n }\n : {};\n\n return (\n <PopoverIdContext.Provider value={id}>\n <A11yContext.Provider\n value={{ headingId, setHeadingId, descriptionId, setDescriptionId }}\n >\n <HoverContext.Provider\n value={{ isHoverMode, clearHoverTimer, closeWithDelay }}\n >\n <RadixPopover.Root\n open={isOpen}\n onOpenChange={handleOpenChange}\n modal={modal}\n >\n {isHoverMode ? (\n <span className=\"ds:inline-flex\" {...hoverHandlers}>\n {children}\n </span>\n ) : (\n children\n )}\n </RadixPopover.Root>\n </HoverContext.Provider>\n </A11yContext.Provider>\n </PopoverIdContext.Provider>\n );\n}\nPopoverRoot.displayName = 'Popover.Root';\n\nconst PopoverTrigger = forwardRef<\n HTMLButtonElement,\n ComponentPropsWithoutRef<typeof RadixPopover.Trigger>\n>(({ children, ...props }, ref) => (\n <RadixPopover.Trigger ref={ref} {...props}>\n {children}\n </RadixPopover.Trigger>\n));\nPopoverTrigger.displayName = 'Popover.Trigger';\n\nexport interface PopoverContentProps\n extends\n Omit<\n ComponentPropsWithoutRef<typeof RadixPopover.Content>,\n 'side' | 'align'\n >,\n VariantProps<typeof contentVariants> {\n side?: 'start' | 'top' | 'end' | 'bottom';\n align?: 'start' | 'center' | 'end';\n size?: 'sm' | 'md' | 'lg';\n showArrow?: boolean;\n className?: string;\n children: ReactNode;\n}\n\nconst PopoverContent = forwardRef<HTMLDivElement, PopoverContentProps>(\n (\n {\n side = 'bottom',\n align = 'center',\n size = 'md',\n showArrow = true,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const { headingId, descriptionId } = useContext(A11yContext);\n const instanceId = useContext(PopoverIdContext);\n const {\n isHoverMode: isHover,\n clearHoverTimer: cancelTimer,\n closeWithDelay: delayClose,\n } = useContext(HoverContext);\n const physicalSide = resolvePhysicalSide(side);\n\n const contentHoverHandlers = isHover\n ? {\n onMouseEnter: cancelTimer,\n onMouseLeave: delayClose,\n onFocus: cancelTimer,\n onBlur: delayClose,\n }\n : {};\n\n return (\n <RadixPopover.Portal>\n <RadixPopover.Content\n ref={ref}\n side={physicalSide}\n align={align}\n sideOffset={8}\n collisionPadding={8}\n aria-labelledby={headingId}\n aria-describedby={descriptionId}\n className={contentVariants({ size, className })}\n data-component=\"popover\"\n data-component-id={instanceId}\n {...contentHoverHandlers}\n {...props}\n >\n {children}\n {showArrow && (\n <RadixPopover.Arrow\n width={12}\n height={6}\n className=\"ds:fill-[var(--popover)]\"\n />\n )}\n </RadixPopover.Content>\n </RadixPopover.Portal>\n );\n },\n);\nPopoverContent.displayName = 'Popover.Content';\n\nconst PopoverClose = forwardRef<HTMLButtonElement, { className?: string }>(\n ({ className }, ref) => {\n const { t } = useTranslation();\n\n return (\n <div\n className={[\n 'ds:absolute ds:top-[var(--spacing-sm)] ds:end-[var(--spacing-sm)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <RadixPopover.Close asChild>\n <IconButton\n ref={ref}\n icon={<X />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={t('common.close', 'Close')}\n />\n </RadixPopover.Close>\n </div>\n );\n },\n);\nPopoverClose.displayName = 'Popover.Close';\n\ninterface PopoverHeadingProps extends HTMLAttributes<HTMLHeadingElement> {\n as?: 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n}\n\nconst PopoverHeading = forwardRef<HTMLHeadingElement, PopoverHeadingProps>(\n ({ as: Tag = 'h3', className, ...props }, ref) => {\n const generatedId = useId();\n const { setHeadingId } = useContext(A11yContext);\n\n useEffect(() => {\n setHeadingId(generatedId);\n return () => setHeadingId(undefined);\n }, [generatedId, setHeadingId]);\n\n return (\n <Tag\n ref={ref}\n id={generatedId}\n className={[\n 'type-title-item ds:leading-snug ds:break-words',\n 'ds:pe-[var(--spacing-xl)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n );\n },\n);\nPopoverHeading.displayName = 'Popover.Heading';\n\nconst PopoverDescription = forwardRef<\n HTMLParagraphElement,\n HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => {\n const generatedId = useId();\n const { setDescriptionId } = useContext(A11yContext);\n\n useEffect(() => {\n setDescriptionId(generatedId);\n return () => setDescriptionId(undefined);\n }, [generatedId, setDescriptionId]);\n\n return (\n <p\n ref={ref}\n id={generatedId}\n className={[\n 'ds:text-[var(--muted-foreground)] type-body-sm ds:mt-[var(--spacing-xs)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n );\n});\nPopoverDescription.displayName = 'Popover.Description';\n\nexport const Popover = Object.assign(PopoverRoot, {\n Root: PopoverRoot,\n Trigger: PopoverTrigger,\n // Radix pass-through: position Content against an arbitrary element when a\n // Trigger button is unsuitable (e.g. anchoring an editor to a role=tab).\n Anchor: RadixPopover.Anchor,\n Content: PopoverContent,\n Close: PopoverClose,\n Heading: PopoverHeading,\n Description: PopoverDescription,\n});\n\nexport type { PopoverRootProps as PopoverProps, PopoverHeadingProps };\n"],"names":["popoverAgent","handle","A11yContext","createContext","HoverContext","resolvePhysicalSide","logicalSide","isRtl","contentVariants","cva","PopoverIdContext","PopoverRoot","openOn","children","id","controlledOpen","onOpenChange","defaultOpen","modal","internalOpen","setInternalOpen","useState","isControlled","isOpen","handleOpenChange","useCallback","nextOpen","hoverTimerRef","useRef","isHoverMode","clearHoverTimer","openWithDelay","closeWithDelay","useEffect","openRef","agentHandle","useMemo","useAgentRegistration","headingId","setHeadingId","descriptionId","setDescriptionId","hoverHandlers","jsx","RadixPopover","PopoverTrigger","forwardRef","props","ref","PopoverContent","side","align","size","showArrow","className","useContext","instanceId","isHover","cancelTimer","delayClose","physicalSide","contentHoverHandlers","jsxs","PopoverClose","t","useTranslation","IconButton","X","PopoverHeading","Tag","generatedId","useId","PopoverDescription","Popover"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"popover-Cqcjx-Ny.js","sources":["../../src/components/popover/popover.agent.ts","../../src/components/popover/popover.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PopoverHandle } from './popover';\n\nexport const popoverAgent: AgentAdapter<PopoverHandle> = {\n id: 'popover',\n capabilities: ['open', 'close'],\n state: {\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.popover.state.isOpen',\n description: 'True when the popover is currently open.',\n read: (handle) => handle.getIsOpen(),\n },\n },\n actions: {\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.popover.actions.open',\n description: 'Open the popover.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.popover.actions.close',\n description: 'Close the popover.',\n invoke: (handle) => {\n handle.close();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'popover' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on Popover.Root.',\n },\n },\n};\n","import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { useAgentRegistration } from '../../agent';\nimport { popoverAgent } from './popover.agent';\n\ninterface PopoverA11yContext {\n headingId: string | undefined;\n setHeadingId: (id: string | undefined) => void;\n descriptionId: string | undefined;\n setDescriptionId: (id: string | undefined) => void;\n}\n\nconst A11yContext = createContext<PopoverA11yContext>({\n headingId: undefined,\n setHeadingId: () => {},\n descriptionId: undefined,\n setDescriptionId: () => {},\n});\n\ninterface PopoverHoverContext {\n isHoverMode: boolean;\n clearHoverTimer: () => void;\n closeWithDelay: () => void;\n}\n\nconst HoverContext = createContext<PopoverHoverContext>({\n isHoverMode: false,\n clearHoverTimer: () => {},\n closeWithDelay: () => {},\n});\n\nfunction resolvePhysicalSide(\n logicalSide: 'start' | 'top' | 'end' | 'bottom',\n): 'left' | 'top' | 'right' | 'bottom' {\n if (logicalSide === 'top' || logicalSide === 'bottom') return logicalSide;\n const isRtl =\n typeof document !== 'undefined' && document.documentElement.dir === 'rtl';\n if (logicalSide === 'start') return isRtl ? 'right' : 'left';\n /* logicalSide === 'end' */\n return isRtl ? 'left' : 'right';\n}\n\nconst contentVariants = cva(\n [\n // `--card-border` 32% alpha provides a subtle edge that survives dark\n // without becoming a heavy outline. The previous transparent border\n // relied on the drop-shadow alone, which reads as a faint halo against\n // dark surfaces and lets the popover float as an unbounded blob; the\n // earlier heavy `--border` (grey-800 since WCAG 1.4.11 bump in 67fef8c)\n // overcorrected the other way and made the popover read as a charcoal\n // box. The forced-colors override below upgrades the border to\n // `CanvasText` so HCM still repaints a fully visible edge.\n 'ds:relative ds:bg-[var(--popover)] ds:border ds:border-[color:var(--card-border)] ds:rounded-[var(--radius-md)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:z-[var(--z-popover)]',\n 'ds:text-[var(--popover-foreground)] ds:text-[length:var(--font-size-sm)]',\n 'ds:break-words',\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=closed]:fade-out-0 ds:data-[state=open]:fade-in-0',\n 'ds:data-[state=closed]:zoom-out-95 ds:data-[state=open]:zoom-in-95',\n 'ds:data-[side=bottom]:slide-in-from-top-2 ds:data-[side=left]:slide-in-from-right-2',\n 'ds:data-[side=right]:slide-in-from-left-2 ds:data-[side=top]:slide-in-from-bottom-2',\n 'ds:motion-reduce:transition-none ds:motion-reduce:animate-none',\n 'ds:forced-colors:border-[CanvasText]',\n 'ds:focus-visible:outline-none',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:max-w-[var(--popover-size-sm)]',\n md: 'ds:max-w-[var(--popover-size-md)]',\n lg: 'ds:max-w-[var(--popover-size-lg)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\n// Curated agent-readiness handle — see popover.agent.ts.\nexport interface PopoverHandle {\n getIsOpen: () => boolean;\n open: () => void;\n close: () => void;\n}\n\nexport interface PopoverRootProps extends ComponentPropsWithoutRef<\n typeof RadixPopover.Root\n> {\n openOn?: 'click' | 'hover' | 'hover-or-click';\n /** Opaque instance id — forwarded to Popover.Content as `data-component-id`. */\n id?: string;\n children: ReactNode;\n}\n\nconst PopoverIdContext = createContext<string | undefined>(undefined);\n\nfunction PopoverRoot({\n openOn = 'click',\n children,\n id,\n open: controlledOpen,\n onOpenChange,\n defaultOpen,\n modal,\n}: PopoverRootProps) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen ?? false);\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n if (!isControlled) setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen);\n },\n [isControlled, onOpenChange],\n );\n\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const isHoverMode = openOn === 'hover' || openOn === 'hover-or-click';\n\n const clearHoverTimer = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n }, []);\n\n const openWithDelay = useCallback(() => {\n clearHoverTimer();\n hoverTimerRef.current = setTimeout(() => {\n handleOpenChange(true);\n }, 300);\n }, [clearHoverTimer, handleOpenChange]);\n\n const closeWithDelay = useCallback(() => {\n clearHoverTimer();\n hoverTimerRef.current = setTimeout(() => {\n handleOpenChange(false);\n }, 300);\n }, [clearHoverTimer, handleOpenChange]);\n\n useEffect(() => {\n return () => clearHoverTimer();\n }, [clearHoverTimer]);\n\n // Agent handle.\n const openRef = useRef(isOpen);\n useEffect(() => {\n openRef.current = isOpen;\n }, [isOpen]);\n\n const agentHandle = useMemo<PopoverHandle>(\n () => ({\n getIsOpen: () => openRef.current,\n open: () => handleOpenChange(true),\n close: () => handleOpenChange(false),\n }),\n [handleOpenChange],\n );\n useAgentRegistration(popoverAgent, agentHandle, id);\n\n /* a11y context state */\n const [headingId, setHeadingId] = useState<string | undefined>(undefined);\n const [descriptionId, setDescriptionId] = useState<string | undefined>(\n undefined,\n );\n\n const hoverHandlers = isHoverMode\n ? {\n onMouseEnter: openWithDelay,\n onMouseLeave: closeWithDelay,\n onFocus: () => {\n clearHoverTimer();\n handleOpenChange(true);\n },\n onBlur: closeWithDelay,\n }\n : {};\n\n return (\n <PopoverIdContext.Provider value={id}>\n <A11yContext.Provider\n value={{ headingId, setHeadingId, descriptionId, setDescriptionId }}\n >\n <HoverContext.Provider\n value={{ isHoverMode, clearHoverTimer, closeWithDelay }}\n >\n <RadixPopover.Root\n open={isOpen}\n onOpenChange={handleOpenChange}\n modal={modal}\n >\n {isHoverMode ? (\n <span className=\"ds:inline-flex\" {...hoverHandlers}>\n {children}\n </span>\n ) : (\n children\n )}\n </RadixPopover.Root>\n </HoverContext.Provider>\n </A11yContext.Provider>\n </PopoverIdContext.Provider>\n );\n}\nPopoverRoot.displayName = 'Popover.Root';\n\nconst PopoverTrigger = forwardRef<\n HTMLButtonElement,\n ComponentPropsWithoutRef<typeof RadixPopover.Trigger>\n>(({ children, ...props }, ref) => (\n <RadixPopover.Trigger ref={ref} {...props}>\n {children}\n </RadixPopover.Trigger>\n));\nPopoverTrigger.displayName = 'Popover.Trigger';\n\nexport interface PopoverContentProps\n extends\n Omit<\n ComponentPropsWithoutRef<typeof RadixPopover.Content>,\n 'side' | 'align'\n >,\n VariantProps<typeof contentVariants> {\n side?: 'start' | 'top' | 'end' | 'bottom';\n align?: 'start' | 'center' | 'end';\n size?: 'sm' | 'md' | 'lg';\n showArrow?: boolean;\n className?: string;\n children: ReactNode;\n}\n\nconst PopoverContent = forwardRef<HTMLDivElement, PopoverContentProps>(\n (\n {\n side = 'bottom',\n align = 'center',\n size = 'md',\n showArrow = true,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const { headingId, descriptionId } = useContext(A11yContext);\n const instanceId = useContext(PopoverIdContext);\n const {\n isHoverMode: isHover,\n clearHoverTimer: cancelTimer,\n closeWithDelay: delayClose,\n } = useContext(HoverContext);\n const physicalSide = resolvePhysicalSide(side);\n\n const contentHoverHandlers = isHover\n ? {\n onMouseEnter: cancelTimer,\n onMouseLeave: delayClose,\n onFocus: cancelTimer,\n onBlur: delayClose,\n }\n : {};\n\n return (\n <RadixPopover.Portal>\n <RadixPopover.Content\n ref={ref}\n side={physicalSide}\n align={align}\n sideOffset={8}\n collisionPadding={8}\n aria-labelledby={headingId}\n aria-describedby={descriptionId}\n className={contentVariants({ size, className })}\n data-component=\"popover\"\n data-component-id={instanceId}\n {...contentHoverHandlers}\n {...props}\n >\n {children}\n {showArrow && (\n <RadixPopover.Arrow\n width={12}\n height={6}\n className=\"ds:fill-[var(--popover)]\"\n />\n )}\n </RadixPopover.Content>\n </RadixPopover.Portal>\n );\n },\n);\nPopoverContent.displayName = 'Popover.Content';\n\nconst PopoverClose = forwardRef<HTMLButtonElement, { className?: string }>(\n ({ className }, ref) => {\n const { t } = useTranslation();\n\n return (\n <div\n className={[\n 'ds:absolute ds:top-[var(--spacing-sm)] ds:end-[var(--spacing-sm)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <RadixPopover.Close asChild>\n <IconButton\n ref={ref}\n icon={<X />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={t('common.close', 'Close')}\n />\n </RadixPopover.Close>\n </div>\n );\n },\n);\nPopoverClose.displayName = 'Popover.Close';\n\ninterface PopoverHeadingProps extends HTMLAttributes<HTMLHeadingElement> {\n as?: 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n}\n\nconst PopoverHeading = forwardRef<HTMLHeadingElement, PopoverHeadingProps>(\n ({ as: Tag = 'h3', className, ...props }, ref) => {\n const generatedId = useId();\n const { setHeadingId } = useContext(A11yContext);\n\n useEffect(() => {\n setHeadingId(generatedId);\n return () => setHeadingId(undefined);\n }, [generatedId, setHeadingId]);\n\n return (\n <Tag\n ref={ref}\n id={generatedId}\n className={[\n 'type-title-item ds:leading-snug ds:break-words',\n 'ds:pe-[var(--spacing-xl)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n );\n },\n);\nPopoverHeading.displayName = 'Popover.Heading';\n\nconst PopoverDescription = forwardRef<\n HTMLParagraphElement,\n HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => {\n const generatedId = useId();\n const { setDescriptionId } = useContext(A11yContext);\n\n useEffect(() => {\n setDescriptionId(generatedId);\n return () => setDescriptionId(undefined);\n }, [generatedId, setDescriptionId]);\n\n return (\n <p\n ref={ref}\n id={generatedId}\n className={[\n 'ds:text-[var(--muted-foreground)] type-body-sm ds:mt-[var(--spacing-xs)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n );\n});\nPopoverDescription.displayName = 'Popover.Description';\n\nexport const Popover = Object.assign(PopoverRoot, {\n Root: PopoverRoot,\n Trigger: PopoverTrigger,\n // Radix pass-through: position Content against an arbitrary element when a\n // Trigger button is unsuitable (e.g. anchoring an editor to a role=tab).\n Anchor: RadixPopover.Anchor,\n Content: PopoverContent,\n Close: PopoverClose,\n Heading: PopoverHeading,\n Description: PopoverDescription,\n});\n\nexport type { PopoverRootProps as PopoverProps, PopoverHeadingProps };\n"],"names":["popoverAgent","handle","A11yContext","createContext","HoverContext","resolvePhysicalSide","logicalSide","isRtl","contentVariants","cva","PopoverIdContext","PopoverRoot","openOn","children","id","controlledOpen","onOpenChange","defaultOpen","modal","internalOpen","setInternalOpen","useState","isControlled","isOpen","handleOpenChange","useCallback","nextOpen","hoverTimerRef","useRef","isHoverMode","clearHoverTimer","openWithDelay","closeWithDelay","useEffect","openRef","agentHandle","useMemo","useAgentRegistration","headingId","setHeadingId","descriptionId","setDescriptionId","hoverHandlers","jsx","RadixPopover","PopoverTrigger","forwardRef","props","ref","PopoverContent","side","align","size","showArrow","className","useContext","instanceId","isHover","cancelTimer","delayClose","physicalSide","contentHoverHandlers","jsxs","PopoverClose","t","useTranslation","IconButton","X","PopoverHeading","Tag","generatedId","useId","PopoverDescription","Popover"],"mappings":"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"}
|