@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/{pregnancy-weight-gain-hm3QJALe.js.map → pregnancy-weight-gain-CJwbs9W-.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pregnancy-weight-gain-hm3QJALe.js","sources":["../../src/components/pregnancy-weight-gain/pregnancy-weight-gain.agent.ts","../../src/components/pregnancy-weight-gain/weight-gain.ts","../../src/components/pregnancy-weight-gain/pregnancy-weight-gain.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — PregnancyWeightGain. */\n/* */\n/* IOM gestational weight-gain calculator. The four measurements (height, */\n/* pre-pregnancy weight, current weight, gestational weeks) and the */\n/* plurality choice live in local `useState`; the assessment is a derived */\n/* `useMemo`. The agent surface is the curated */\n/* `PregnancyWeightGainHandle`, registered with `useAgentRegistration` and */\n/* resolved by the host as (`pregnancy-weight-gain`, id) — the public */\n/* `ref` is unchanged and still points at the wrapper `HTMLDivElement`, */\n/* exactly as the sibling `bmi-calculator` does. */\n/* */\n/* PHI (§6.1 / §7): the calculator is never handed a patient. Its inputs */\n/* are four numbers plus a plurality enum, and the result is bands + */\n/* status enums, so no state slot can leak identity. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type {\n PregnancyWeightGainHandle,\n PregnancyWeightGainInputs,\n} from './pregnancy-weight-gain';\nimport type { Plurality } from '../_shared/obstetrics';\n\nexport const pregnancyWeightGainAgent: AgentAdapter<PregnancyWeightGainHandle> =\n {\n id: 'pregnancy-weight-gain',\n // set_value → `set_value` (the four measurements) + `set_plurality`,\n // read back through the `inputs` / `plurality` / `result` state slots.\n capabilities: ['set_value'],\n state: {\n inputs: {\n type: '{ heightCm: number | null, prePregnancyKg: number | null, currentKg: number | null, gestationalWeeks: number | null }',\n descriptionKey: 'ui.agent.pregnancyWeightGain.state.inputs',\n description:\n 'The four entered measurements — height (cm), pre-pregnancy weight (kg), current weight (kg) and completed gestational weeks. Null for anything not yet entered.',\n read: (handle) => handle.getInputs(),\n },\n plurality: {\n type: \"'singleton' | 'twin' | 'triplet'\",\n descriptionKey: 'ui.agent.pregnancyWeightGain.state.plurality',\n description:\n 'Number of babies the assessment is keyed to. Drives which IOM band applies — twins use the higher twin bands, triplets have no published band.',\n read: (handle) => handle.getPlurality(),\n },\n result: {\n type: '{ category: string, plurality: string, actualGainKg: number, status: string | null, recommendedToDate: { min: number, max: number } | null, totalRange: { min: number, max: number } | null, weeklyRate: number | null, rateStatus: string | null } | null',\n descriptionKey: 'ui.agent.pregnancyWeightGain.state.result',\n description:\n 'Computed assessment — actual gain (kg), the IOM recommended-to-date and total bands, and where the gain sits against them (below / within / above). Null until every input is valid; the bands are null when the IOM publishes none (triplets, underweight twins).',\n read: (handle) => handle.getResult(),\n },\n },\n actions: {\n set_value: {\n // Fills the same fields a clinician types into. The calculator is a\n // scratchpad — nothing is persisted to a patient record — so `write`,\n // not `phi` (matching the sibling bmi-calculator).\n safety: 'write',\n argsType:\n '{ heightCm?: number | null, prePregnancyKg?: number | null, currentKg?: number | null, gestationalWeeks?: number | null }',\n argsSchema: {\n type: 'object',\n properties: {\n heightCm: {\n type: ['number', 'null'],\n minimum: 0,\n description: 'Height in centimetres.',\n },\n prePregnancyKg: {\n type: ['number', 'null'],\n minimum: 0,\n description: 'Pre-pregnancy weight in kilograms.',\n },\n currentKg: {\n type: ['number', 'null'],\n minimum: 0,\n description: 'Current weight in kilograms.',\n },\n gestationalWeeks: {\n type: ['number', 'null'],\n minimum: 0,\n maximum: 42,\n description: 'Completed gestational weeks.',\n },\n },\n additionalProperties: false,\n },\n idempotent: true,\n descriptionKey: 'ui.agent.pregnancyWeightGain.actions.setValue',\n description:\n 'Set one or more of the four measurements. Omitted fields are left unchanged; the assessment recomputes as soon as all four are valid.',\n examples: [\n {\n args: {\n heightCm: 165,\n prePregnancyKg: 60,\n currentKg: 72,\n gestationalWeeks: 30,\n },\n note: '165 cm, 60 → 72 kg at 30 weeks → +12 kg against the normal-BMI band.',\n },\n ],\n invoke: (handle, args: Partial<PregnancyWeightGainInputs>) => {\n handle.setInputs(args);\n },\n },\n set_plurality: {\n // Re-keys which IOM band applies — a view-config write on the\n // calculator, never a record mutation.\n safety: 'write',\n argsType: \"{ plurality: 'singleton' | 'twin' | 'triplet' }\",\n argsSchema: {\n type: 'object',\n properties: {\n plurality: {\n enum: ['singleton', 'twin', 'triplet'],\n description: 'Number of babies to assess against.',\n },\n },\n required: ['plurality'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.pregnancyWeightGain.actions.setPlurality',\n description:\n 'Choose the number of babies. Twins use the higher IOM twin bands; triplets have no published IOM range, so only the actual gain is reported.',\n examples: [\n {\n args: { plurality: 'twin' },\n note: 'Assess against the twin bands.',\n },\n ],\n invoke: (handle, args: { plurality: Plurality }) => {\n handle.setPlurality(args.plurality);\n },\n },\n reset: {\n // Clears the entered measurements — recoverable only by re-entering\n // them, so it is destructive from the agent's point of view.\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.pregnancyWeightGain.actions.reset',\n description:\n 'Clear the four measurements and the computed assessment. The plurality choice is a setting and is kept.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n get_result: {\n safety: 'read',\n returns: '{ actualGainKg: number, status: string | null, … } | null',\n returnsSchema: {\n oneOf: [\n {\n type: 'object',\n properties: {\n category: {\n enum: ['underweight', 'normal', 'overweight', 'obese'],\n },\n plurality: { enum: ['singleton', 'twin', 'triplet'] },\n actualGainKg: { type: 'number' },\n status: {\n oneOf: [\n { enum: ['below', 'within', 'above'] },\n { type: 'null' },\n ],\n },\n recommendedToDate: {\n oneOf: [\n {\n type: 'object',\n properties: {\n min: { type: 'number' },\n max: { type: 'number' },\n },\n required: ['min', 'max'],\n },\n { type: 'null' },\n ],\n },\n totalRange: {\n oneOf: [\n {\n type: 'object',\n properties: {\n min: { type: 'number' },\n max: { type: 'number' },\n },\n required: ['min', 'max'],\n },\n { type: 'null' },\n ],\n },\n weeklyRate: { type: ['number', 'null'] },\n rateStatus: {\n oneOf: [\n { enum: ['below', 'within', 'above'] },\n { type: 'null' },\n ],\n },\n },\n required: ['category', 'actualGainKg'],\n },\n { type: 'null' },\n ],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.pregnancyWeightGain.actions.getResult',\n description:\n 'Read back the computed assessment — the same value the `result` state slot returns. Null until every input is valid.',\n invoke: (handle) => handle.getResult(),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'pregnancy-weight-gain',\n description:\n 'Marks the PregnancyWeightGain calculator wrapper. The themed DOM carries the computed result card; an SR-only live region announces the actual gain and status.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the `id` prop, and also the registry key — without an `id` the instance does not register and the handle-driven actions are unreachable.',\n },\n },\n };\n","/* ------------------------------------------------------------------ */\n/* Pregnancy weight-gain guidance — pure, framework-free, testable. */\n/* */\n/* Recommended ranges follow the US IOM/NAM (2009) guidelines, keyed off */\n/* pre-pregnancy BMI category. Singletons use the published total-gain */\n/* band plus a first-trimester gain (≤13 wk) and a per-week 2nd/3rd- */\n/* trimester rate. Twins use the IOM twin total bands, pro-rated linearly */\n/* for the \"to date\" estimate (the IOM does not publish a twin weekly */\n/* rate). The IOM provides NO range for triplets, and none for */\n/* underweight twins — those cases return `null` so the UI can say so */\n/* rather than invent a number. */\n/* */\n/* Guidance only — not a substitute for clinical judgement. */\n/* ------------------------------------------------------------------ */\n\nimport { type BmiCategory, bmiCategory } from '../bmi-calculator/bmi';\nimport type { Plurality } from '../_shared/obstetrics';\n\nexport interface GainBand {\n /** Lower bound, kg. */\n min: number;\n /** Upper bound, kg. */\n max: number;\n}\n\nexport type GainStatus = 'below' | 'within' | 'above';\n\n/** IOM (2009) total recommended gain for a singleton pregnancy, kg. */\nexport const TOTAL_GAIN_BANDS: Record<BmiCategory, GainBand> = {\n underweight: { min: 12.5, max: 18 },\n normal: { min: 11.5, max: 16 },\n overweight: { min: 7, max: 11.5 },\n obese: { min: 5, max: 9 },\n};\n\n/**\n * IOM (2009) total recommended gain for a TWIN pregnancy, kg. The IOM gives\n * no firm range for underweight twins (insufficient evidence), so that\n * category is intentionally absent and resolves to `null`. There is no IOM\n * range for triplets at all.\n */\nexport const TWIN_TOTAL_GAIN_BANDS: Partial<Record<BmiCategory, GainBand>> = {\n normal: { min: 16.8, max: 24.5 },\n overweight: { min: 14.1, max: 22.7 },\n obese: { min: 11.3, max: 19.1 },\n};\n\n/** Resolve the total-gain band for a category + plurality, or `null` if the IOM gives none. */\nexport function totalGainBand(\n category: BmiCategory,\n plurality: Plurality = 'singleton',\n): GainBand | null {\n if (plurality === 'triplet') return null; // no IOM guideline for triplets\n if (plurality === 'twin') return TWIN_TOTAL_GAIN_BANDS[category] ?? null;\n return TOTAL_GAIN_BANDS[category];\n}\n\n/** IOM (2009) mean rate of gain in the 2nd/3rd trimester, kg per week. */\nexport const RATE_BANDS: Record<BmiCategory, GainBand> = {\n underweight: { min: 0.44, max: 0.58 },\n normal: { min: 0.35, max: 0.5 },\n overweight: { min: 0.23, max: 0.33 },\n obese: { min: 0.17, max: 0.27 },\n};\n\n/** First-trimester total gain band, kg (category-independent in IOM). */\nexport const FIRST_TRIMESTER_GAIN: GainBand = { min: 0.5, max: 2 };\n/** Completed weeks counted as the first trimester for gain purposes. */\nexport const FIRST_TRIMESTER_WEEKS = 13;\n\nexport interface WeightGainInput {\n /** Pre-pregnancy BMI (kg/m²) — drives the category. */\n prePregnancyBmi: number;\n /** Pre-pregnancy weight, kg. */\n prePregnancyWeightKg: number;\n /** Current weight, kg. */\n currentWeightKg: number;\n /** Completed gestational weeks. */\n gestationalWeeks: number;\n /** Number of babies. Defaults to `'singleton'`. */\n plurality?: Plurality;\n}\n\nexport interface WeightGainResult {\n category: BmiCategory;\n /** Number of babies the assessment was computed for. */\n plurality: Plurality;\n /**\n * Recommended TOTAL gain across the whole pregnancy, or `null` when the IOM\n * publishes no range (triplets, and underweight twins).\n */\n totalRange: GainBand | null;\n /** Recommended gain accumulated by the current week, or `null` (see above). */\n recommendedToDate: GainBand | null;\n /** Actual gain so far (current − pre-pregnancy), kg. */\n actualGainKg: number;\n /** Where the actual gain sits against the to-date recommendation, or `null`. */\n status: GainStatus | null;\n /**\n * Estimated 2nd/3rd-trimester average weekly gain to date (kg/week), or `null`\n * before week 14 / when no singleton rate band applies. A snapshot estimate\n * (assumes the mid first-trimester gain), not a between-visit measurement.\n */\n weeklyRate: number | null;\n /** Where the weekly rate sits against the IOM rate band, or `null`. */\n rateStatus: GainStatus | null;\n}\n\n/** Mid-point of the category-independent first-trimester gain band, kg. */\nconst FIRST_TRIMESTER_MIDPOINT =\n (FIRST_TRIMESTER_GAIN.min + FIRST_TRIMESTER_GAIN.max) / 2;\n\n/* Singleton (default) keeps a non-null return; multiples may be null. */\nexport function recommendedGainToDate(\n category: BmiCategory,\n weeks: number,\n plurality?: 'singleton',\n): GainBand;\nexport function recommendedGainToDate(\n category: BmiCategory,\n weeks: number,\n plurality: Plurality,\n): GainBand | null;\n/** Recommended cumulative gain by a given gestational week. */\nexport function recommendedGainToDate(\n category: BmiCategory,\n weeks: number,\n plurality: Plurality = 'singleton',\n): GainBand | null {\n if (plurality !== 'singleton') {\n // Twins/triplets: no IOM weekly rate is published, so pro-rate the total\n // band linearly across the 40 weeks. `null` total ⇒ no guideline.\n const total = totalGainBand(category, plurality);\n if (!total) return null;\n if (weeks <= 0) return { min: 0, max: 0 };\n const frac = Math.min(weeks, 40) / 40;\n return { min: total.min * frac, max: total.max * frac };\n }\n if (weeks <= 0) return { min: 0, max: 0 };\n if (weeks <= FIRST_TRIMESTER_WEEKS) {\n const frac = weeks / FIRST_TRIMESTER_WEEKS;\n return {\n min: FIRST_TRIMESTER_GAIN.min * frac,\n max: FIRST_TRIMESTER_GAIN.max * frac,\n };\n }\n const extraWeeks = Math.min(weeks, 40) - FIRST_TRIMESTER_WEEKS;\n const rate = RATE_BANDS[category];\n return {\n min: FIRST_TRIMESTER_GAIN.min + rate.min * extraWeeks,\n max: FIRST_TRIMESTER_GAIN.max + rate.max * extraWeeks,\n };\n}\n\nexport function assessWeightGain(input: WeightGainInput): WeightGainResult {\n const category = bmiCategory(input.prePregnancyBmi);\n const plurality = input.plurality ?? 'singleton';\n const totalRange = totalGainBand(category, plurality);\n const recommendedToDate = totalRange\n ? recommendedGainToDate(category, input.gestationalWeeks, plurality)\n : null;\n const actualGainKg = input.currentWeightKg - input.prePregnancyWeightKg;\n const status: GainStatus | null = recommendedToDate\n ? actualGainKg < recommendedToDate.min\n ? 'below'\n : actualGainKg > recommendedToDate.max\n ? 'above'\n : 'within'\n : null;\n\n // 2nd/3rd-trimester average weekly rate to date — singleton only (the IOM\n // publishes weekly rate bands only for singletons), and only after week 13.\n let weeklyRate: number | null = null;\n let rateStatus: GainStatus | null = null;\n if (\n plurality === 'singleton' &&\n input.gestationalWeeks > FIRST_TRIMESTER_WEEKS\n ) {\n const weeks = input.gestationalWeeks - FIRST_TRIMESTER_WEEKS;\n weeklyRate = (actualGainKg - FIRST_TRIMESTER_MIDPOINT) / weeks;\n const band = RATE_BANDS[category];\n rateStatus =\n weeklyRate < band.min\n ? 'below'\n : weeklyRate > band.max\n ? 'above'\n : 'within';\n }\n\n return {\n category,\n plurality,\n totalRange,\n recommendedToDate,\n actualGainKg,\n status,\n weeklyRate,\n rateStatus,\n };\n}\n","/* ------------------------------------------------------------------ */\n/* PregnancyWeightGain — actual vs IOM-recommended gestational weight */\n/* gain, keyed off pre-pregnancy BMI. */\n/* */\n/* Composes the BMI maths from bmi-calculator and the IOM bands in */\n/* `./weight-gain` (both pure, separately tested). Metric only. */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useMemo, useRef, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { pregnancyWeightGainAgent } from './pregnancy-weight-gain.agent';\nimport { RadioGroup, Radio } from '../radio-group';\nimport { FormField } from '../form-field';\nimport { NumberInput } from '../number-input';\nimport { Card } from '../card';\nimport { Badge } from '../badge';\nimport {\n InsertButton,\n type InsertPayload,\n type InsertVariant,\n type InsertMode,\n} from '../_shared/insert-result';\nimport { computeBmi } from '../bmi-calculator/bmi';\nimport type { Plurality } from '../_shared/obstetrics';\nimport {\n type WeightGainResult,\n type GainStatus,\n type GainBand,\n assessWeightGain,\n} from './weight-gain';\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]', {\n variants: {\n width: { full: 'ds:w-full', auto: 'ds:inline-flex' },\n },\n defaultVariants: { width: 'full' },\n});\n\nconst STATUS_BADGE: Record<GainStatus, 'info' | 'success' | 'warning'> = {\n below: 'warning',\n within: 'success',\n above: 'warning',\n};\n\n/**\n * DS token NAME backing each gain-status chip — the solid-fill companion of the\n * on-screen `STATUS_BADGE` variant (Badge `warning` fills `--warning`,\n * `success` fills `--success`). Passed as the card's `highlightToken` so the\n * inserted PNG chip matches the on-screen status badge; `InsertButton` resolves\n * the name to a concrete colour at raster time.\n */\nconst STATUS_HIGHLIGHT_TOKEN: Record<GainStatus, string> = {\n below: '--warning-readable',\n within: '--success',\n above: '--warning-readable',\n};\n\n/**\n * Gain-status chip token. The `below` / `above` statuses resolve to\n * `--warning-readable`, which the result card's colour probe resolves in the live\n * themed DOM: orange-600 in light, non-accessible mode (where bare `--warning`\n * yellow only reaches ~3.2:1 on the white card) and `--warning` elsewhere, whose\n * deepened ramp already clears contrast. Resolving the token NAME at the card\n * means the choice tracks the live theme regardless of where the theme class\n * lives. The `within` (`--success`) status is unchanged.\n */\nfunction statusHighlightToken(status: GainStatus): string {\n return STATUS_HIGHLIGHT_TOKEN[status];\n}\n\n/**\n * Canonical metric snapshot of the four inputs. Measurements only — the\n * calculator is never handed a patient, so no identity can reach the agent.\n */\nexport interface PregnancyWeightGainInputs {\n /** Height, cm. */\n heightCm: number | null;\n /** Pre-pregnancy weight, kg. */\n prePregnancyKg: number | null;\n /** Current weight, kg. */\n currentKg: number | null;\n /** Completed gestational weeks. */\n gestationalWeeks: number | null;\n}\n\n/**\n * Curated imperative handle for agent / external automation. Reads and writes\n * the four measurements plus the plurality choice, and reads back the computed\n * IOM assessment. Never exposes patient identity — the component only ever\n * holds numbers. Consumed by the `pregnancy-weight-gain.agent.ts` adapter; the\n * public `ref` stays the DOM element.\n */\nexport interface PregnancyWeightGainHandle {\n /** Canonical metric snapshot of the four inputs. */\n getInputs: () => PregnancyWeightGainInputs;\n /** Set one or more inputs; omitted fields are left unchanged. */\n setInputs: (next: Partial<PregnancyWeightGainInputs>) => void;\n /** Number of babies the assessment is computed for. */\n getPlurality: () => Plurality;\n /** Switch the plurality (re-keys the IOM bands). */\n setPlurality: (next: Plurality) => void;\n /** Current computed assessment, or null until every input is valid. */\n getResult: () => WeightGainResult | null;\n /** Clear the four measurements (plurality is a setting and is kept). */\n reset: () => void;\n}\n\nexport interface PregnancyWeightGainProps extends VariantProps<\n typeof rootVariants\n> {\n /** Initial number of babies. Defaults to `'singleton'`. */\n defaultPlurality?: Plurality;\n /** Pre-fill the height (cm) — e.g. shared from a BMI measurement. */\n defaultHeightCm?: number;\n /** Pre-fill the pre-pregnancy weight (kg) from the patient record. */\n defaultPrePregnancyKg?: number;\n /** Fires whenever a result can be computed (and `null` when it can't). */\n onResultChange?: (result: WeightGainResult | null) => void;\n /** When provided, shows the result-action buttons that emit / copy the result. */\n onInsert?: (payload: InsertPayload) => void;\n /**\n * Verb the result-action buttons perform. Defaults to `'insert'` (editor\n * extension). Pass `'copy'` from an app shell to copy the result to the\n * clipboard instead.\n */\n insertVariant?: InsertVariant;\n /** `copy` variant only — fired after a successful clipboard write. */\n onCopy?: (mode: InsertMode) => void;\n /** `copy` variant only — fired if the clipboard write can't proceed. */\n onError?: (error: unknown) => void;\n /**\n * Brand wordmark printed in the inserted/copied result-card footer.\n * Omitted → no brand line (and no footer hairline); a string → that custom\n * brand; `false` → no brand line. Brand is opt-in.\n */\n insertBrand?: string | false;\n /** Opaque instance id, emitted as `data-component-id`. */\n id?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\nexport const PregnancyWeightGain = forwardRef<\n HTMLDivElement,\n PregnancyWeightGainProps\n>(\n (\n {\n defaultPlurality = 'singleton',\n defaultHeightCm,\n defaultPrePregnancyKg,\n onResultChange,\n onInsert,\n insertVariant = 'insert',\n onCopy,\n onError,\n insertBrand,\n id,\n width,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n\n const [heightCm, setHeightCm] = useState<number | null>(\n defaultHeightCm ?? null,\n );\n const [prePregnancyKg, setPrePregnancyKg] = useState<number | null>(\n defaultPrePregnancyKg ?? null,\n );\n const [currentKg, setCurrentKg] = useState<number | null>(null);\n const [weeks, setWeeks] = useState<number | null>(null);\n const [plurality, setPlurality] = useState<Plurality>(defaultPlurality);\n\n const prePregnancyBmi = computeBmi(prePregnancyKg, heightCm);\n\n const result = useMemo<WeightGainResult | null>(() => {\n if (\n prePregnancyBmi === null ||\n prePregnancyKg === null ||\n currentKg === null ||\n weeks === null\n ) {\n return null;\n }\n return assessWeightGain({\n prePregnancyBmi,\n prePregnancyWeightKg: prePregnancyKg,\n currentWeightKg: currentKg,\n gestationalWeeks: weeks,\n plurality,\n });\n }, [prePregnancyBmi, prePregnancyKg, currentKg, weeks, plurality]);\n\n const kg = useMemo(\n () =>\n new Intl.NumberFormat(i18n.language, {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }),\n [i18n.language],\n );\n\n useEffect(() => {\n onResultChange?.(result);\n }, [result, onResultChange]);\n\n // Live refs so the once-built agent handle reads current state without\n // re-creating on every keystroke. Public `ref` stays the DOM node — the\n // agent surface is the separate `PregnancyWeightGainHandle`.\n const liveRef = useRef({\n heightCm,\n prePregnancyKg,\n currentKg,\n weeks,\n plurality,\n result,\n });\n liveRef.current = {\n heightCm,\n prePregnancyKg,\n currentKg,\n weeks,\n plurality,\n result,\n };\n const agentHandle = useMemo<PregnancyWeightGainHandle>(\n () => ({\n getInputs: () => ({\n heightCm: liveRef.current.heightCm,\n prePregnancyKg: liveRef.current.prePregnancyKg,\n currentKg: liveRef.current.currentKg,\n gestationalWeeks: liveRef.current.weeks,\n }),\n setInputs: (next) => {\n if ('heightCm' in next) setHeightCm(next.heightCm ?? null);\n if ('prePregnancyKg' in next) {\n setPrePregnancyKg(next.prePregnancyKg ?? null);\n }\n if ('currentKg' in next) setCurrentKg(next.currentKg ?? null);\n if ('gestationalWeeks' in next) {\n setWeeks(next.gestationalWeeks ?? null);\n }\n },\n getPlurality: () => liveRef.current.plurality,\n setPlurality: (next) => setPlurality(next),\n getResult: () => liveRef.current.result,\n reset: () => {\n setHeightCm(null);\n setPrePregnancyKg(null);\n setCurrentKg(null);\n setWeeks(null);\n },\n }),\n [],\n );\n useAgentRegistration(pregnancyWeightGainAgent, agentHandle, id);\n\n const unit = t('pregnancyWeightGain.units.kg');\n const band = (b: GainBand): string =>\n `${kg.format(b.min)} – ${kg.format(b.max)} ${unit}`;\n\n return (\n <div\n ref={ref}\n data-component=\"pregnancy-weight-gain\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n <FormField\n label={`${t('pregnancyWeightGain.height')} (${t('pregnancyWeightGain.units.cm')})`}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={0.5}\n value={heightCm}\n onChange={setHeightCm}\n />\n </FormField>\n <FormField\n label={`${t('pregnancyWeightGain.prePregnancyWeight')} (${unit})`}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={0.1}\n value={prePregnancyKg}\n onChange={setPrePregnancyKg}\n />\n </FormField>\n <FormField\n label={`${t('pregnancyWeightGain.currentWeight')} (${unit})`}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={0.1}\n value={currentKg}\n onChange={setCurrentKg}\n />\n </FormField>\n <FormField label={t('pregnancyWeightGain.gestationalWeeks')}>\n <NumberInput\n mode=\"integer\"\n min={0}\n max={42}\n value={weeks}\n onChange={setWeeks}\n />\n </FormField>\n </div>\n\n <RadioGroup\n label={t('pregnancyWeightGain.plurality.label')}\n variant=\"horizontal\"\n value={plurality}\n onValueChange={(next) => setPlurality(next as Plurality)}\n >\n <Radio\n label={t('pregnancyWeightGain.plurality.singleton')}\n value=\"singleton\"\n />\n <Radio label={t('pregnancyWeightGain.plurality.twin')} value=\"twin\" />\n <Radio\n label={t('pregnancyWeightGain.plurality.triplet')}\n value=\"triplet\"\n />\n </RadioGroup>\n\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {result\n ? `${t('pregnancyWeightGain.actualGain')}: ${kg.format(\n result.actualGainKg,\n )} ${unit}.${\n result.status\n ? ` ${t(`pregnancyWeightGain.status.${result.status}`)}.`\n : ` ${t('pregnancyWeightGain.noGuideline')}`\n }`\n : ''}\n </p>\n\n {result ? (\n <Card variant=\"elevated\">\n <Card.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <dl className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyWeightGain.prePregnancyBmi')}\n </dt>\n <dd className=\"type-body ds:text-foreground\">\n {kg.format(prePregnancyBmi ?? 0)} ·{' '}\n {t(`pregnancyWeightGain.category.${result.category}`)}\n </dd>\n </div>\n <div className=\"ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)]\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyWeightGain.actualGain')}\n </dt>\n <dd className=\"ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-metric ds:text-foreground\">\n {kg.format(result.actualGainKg)} {unit}\n </span>\n {result.status ? (\n <Badge variant={STATUS_BADGE[result.status]} size=\"lg\">\n {t(`pregnancyWeightGain.status.${result.status}`)}\n </Badge>\n ) : null}\n </dd>\n </div>\n {result.recommendedToDate && result.totalRange ? (\n <>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyWeightGain.recommendedToDate')}\n </dt>\n <dd className=\"type-body ds:text-foreground\">\n {band(result.recommendedToDate)}\n </dd>\n </div>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyWeightGain.recommendedTotal')}\n </dt>\n <dd className=\"type-body ds:text-foreground\">\n {band(result.totalRange)}\n </dd>\n </div>\n </>\n ) : null}\n </dl>\n {result.totalRange ? null : (\n <p className=\"type-body ds:text-foreground\">\n {t('pregnancyWeightGain.noGuideline')}\n </p>\n )}\n {result.weeklyRate !== null && result.rateStatus ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyWeightGain.weeklyRate')}\n </span>\n <span className=\"type-body ds:text-foreground\">\n {t('pregnancyWeightGain.perWeek', {\n value: kg.format(result.weeklyRate),\n })}\n </span>\n <Badge variant={STATUS_BADGE[result.rateStatus]}>\n {t(`pregnancyWeightGain.status.${result.rateStatus}`)}\n </Badge>\n </div>\n ) : null}\n <p className=\"type-body-sm ds:text-muted-foreground\">\n {t(\n plurality === 'singleton'\n ? 'pregnancyWeightGain.disclaimer'\n : 'pregnancyWeightGain.disclaimerMultiple',\n )}\n </p>\n {result.status &&\n result.recommendedToDate &&\n result.totalRange &&\n (insertVariant === 'copy' || onInsert) ? (\n <InsertButton\n onInsert={onInsert}\n variant={insertVariant}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.weightGain'),\n icon: 'baby',\n highlight: t(`pregnancyWeightGain.status.${result.status}`),\n // Chip shares the gain-status semantic token so the\n // inserted PNG chip matches the on-screen status badge —\n // with the contrast-safe orange override for the\n // `--warning` below/above statuses.\n highlightToken: statusHighlightToken(result.status),\n brand: insertBrand,\n fields: [\n {\n // Actual gain is the headline trend → trending-up glyph.\n icon: 'trending-up',\n label: t('pregnancyWeightGain.actualGain'),\n value: `${kg.format(result.actualGainKg)} ${unit}`,\n },\n {\n // Recommended weight band → scale glyph.\n icon: 'scale',\n label: t('pregnancyWeightGain.recommendedToDate'),\n value: band(result.recommendedToDate),\n },\n {\n // Recommended total weight band → scale glyph.\n icon: 'scale',\n label: t('pregnancyWeightGain.recommendedTotal'),\n value: band(result.totalRange),\n },\n ],\n }}\n />\n ) : null}\n </Card.Body>\n </Card>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('pregnancyWeightGain.empty')}\n </p>\n )}\n </div>\n );\n },\n);\n\nPregnancyWeightGain.displayName = 'PregnancyWeightGain';\n"],"names":["pregnancyWeightGainAgent","handle","args","TOTAL_GAIN_BANDS","TWIN_TOTAL_GAIN_BANDS","totalGainBand","category","plurality","RATE_BANDS","FIRST_TRIMESTER_GAIN","FIRST_TRIMESTER_WEEKS","FIRST_TRIMESTER_MIDPOINT","recommendedGainToDate","weeks","total","frac","extraWeeks","rate","assessWeightGain","input","bmiCategory","totalRange","recommendedToDate","actualGainKg","status","weeklyRate","rateStatus","band","rootVariants","cva","STATUS_BADGE","STATUS_HIGHLIGHT_TOKEN","statusHighlightToken","PregnancyWeightGain","forwardRef","defaultPlurality","defaultHeightCm","defaultPrePregnancyKg","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","id","width","className","ref","t","i18n","useTranslation","heightCm","setHeightCm","useState","prePregnancyKg","setPrePregnancyKg","currentKg","setCurrentKg","setWeeks","setPlurality","prePregnancyBmi","computeBmi","result","useMemo","kg","useEffect","liveRef","useRef","agentHandle","next","useAgentRegistration","unit","b","jsxs","jsx","FormField","NumberInput","RadioGroup","Radio","Card","Badge","Fragment","InsertButton"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pregnancy-weight-gain-CJwbs9W-.js","sources":["../../src/components/pregnancy-weight-gain/pregnancy-weight-gain.agent.ts","../../src/components/pregnancy-weight-gain/weight-gain.ts","../../src/components/pregnancy-weight-gain/pregnancy-weight-gain.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — PregnancyWeightGain. */\n/* */\n/* IOM gestational weight-gain calculator. The four measurements (height, */\n/* pre-pregnancy weight, current weight, gestational weeks) and the */\n/* plurality choice live in local `useState`; the assessment is a derived */\n/* `useMemo`. The agent surface is the curated */\n/* `PregnancyWeightGainHandle`, registered with `useAgentRegistration` and */\n/* resolved by the host as (`pregnancy-weight-gain`, id) — the public */\n/* `ref` is unchanged and still points at the wrapper `HTMLDivElement`, */\n/* exactly as the sibling `bmi-calculator` does. */\n/* */\n/* PHI (§6.1 / §7): the calculator is never handed a patient. Its inputs */\n/* are four numbers plus a plurality enum, and the result is bands + */\n/* status enums, so no state slot can leak identity. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type {\n PregnancyWeightGainHandle,\n PregnancyWeightGainInputs,\n} from './pregnancy-weight-gain';\nimport type { Plurality } from '../_shared/obstetrics';\n\nexport const pregnancyWeightGainAgent: AgentAdapter<PregnancyWeightGainHandle> =\n {\n id: 'pregnancy-weight-gain',\n // set_value → `set_value` (the four measurements) + `set_plurality`,\n // read back through the `inputs` / `plurality` / `result` state slots.\n capabilities: ['set_value'],\n state: {\n inputs: {\n type: '{ heightCm: number | null, prePregnancyKg: number | null, currentKg: number | null, gestationalWeeks: number | null }',\n descriptionKey: 'ui.agent.pregnancyWeightGain.state.inputs',\n description:\n 'The four entered measurements — height (cm), pre-pregnancy weight (kg), current weight (kg) and completed gestational weeks. Null for anything not yet entered.',\n read: (handle) => handle.getInputs(),\n },\n plurality: {\n type: \"'singleton' | 'twin' | 'triplet'\",\n descriptionKey: 'ui.agent.pregnancyWeightGain.state.plurality',\n description:\n 'Number of babies the assessment is keyed to. Drives which IOM band applies — twins use the higher twin bands, triplets have no published band.',\n read: (handle) => handle.getPlurality(),\n },\n result: {\n type: '{ category: string, plurality: string, actualGainKg: number, status: string | null, recommendedToDate: { min: number, max: number } | null, totalRange: { min: number, max: number } | null, weeklyRate: number | null, rateStatus: string | null } | null',\n descriptionKey: 'ui.agent.pregnancyWeightGain.state.result',\n description:\n 'Computed assessment — actual gain (kg), the IOM recommended-to-date and total bands, and where the gain sits against them (below / within / above). Null until every input is valid; the bands are null when the IOM publishes none (triplets, underweight twins).',\n read: (handle) => handle.getResult(),\n },\n },\n actions: {\n set_value: {\n // Fills the same fields a clinician types into. The calculator is a\n // scratchpad — nothing is persisted to a patient record — so `write`,\n // not `phi` (matching the sibling bmi-calculator).\n safety: 'write',\n argsType:\n '{ heightCm?: number | null, prePregnancyKg?: number | null, currentKg?: number | null, gestationalWeeks?: number | null }',\n argsSchema: {\n type: 'object',\n properties: {\n heightCm: {\n type: ['number', 'null'],\n minimum: 0,\n description: 'Height in centimetres.',\n },\n prePregnancyKg: {\n type: ['number', 'null'],\n minimum: 0,\n description: 'Pre-pregnancy weight in kilograms.',\n },\n currentKg: {\n type: ['number', 'null'],\n minimum: 0,\n description: 'Current weight in kilograms.',\n },\n gestationalWeeks: {\n type: ['number', 'null'],\n minimum: 0,\n maximum: 42,\n description: 'Completed gestational weeks.',\n },\n },\n additionalProperties: false,\n },\n idempotent: true,\n descriptionKey: 'ui.agent.pregnancyWeightGain.actions.setValue',\n description:\n 'Set one or more of the four measurements. Omitted fields are left unchanged; the assessment recomputes as soon as all four are valid.',\n examples: [\n {\n args: {\n heightCm: 165,\n prePregnancyKg: 60,\n currentKg: 72,\n gestationalWeeks: 30,\n },\n note: '165 cm, 60 → 72 kg at 30 weeks → +12 kg against the normal-BMI band.',\n },\n ],\n invoke: (handle, args: Partial<PregnancyWeightGainInputs>) => {\n handle.setInputs(args);\n },\n },\n set_plurality: {\n // Re-keys which IOM band applies — a view-config write on the\n // calculator, never a record mutation.\n safety: 'write',\n argsType: \"{ plurality: 'singleton' | 'twin' | 'triplet' }\",\n argsSchema: {\n type: 'object',\n properties: {\n plurality: {\n enum: ['singleton', 'twin', 'triplet'],\n description: 'Number of babies to assess against.',\n },\n },\n required: ['plurality'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.pregnancyWeightGain.actions.setPlurality',\n description:\n 'Choose the number of babies. Twins use the higher IOM twin bands; triplets have no published IOM range, so only the actual gain is reported.',\n examples: [\n {\n args: { plurality: 'twin' },\n note: 'Assess against the twin bands.',\n },\n ],\n invoke: (handle, args: { plurality: Plurality }) => {\n handle.setPlurality(args.plurality);\n },\n },\n reset: {\n // Clears the entered measurements — recoverable only by re-entering\n // them, so it is destructive from the agent's point of view.\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.pregnancyWeightGain.actions.reset',\n description:\n 'Clear the four measurements and the computed assessment. The plurality choice is a setting and is kept.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n get_result: {\n safety: 'read',\n returns: '{ actualGainKg: number, status: string | null, … } | null',\n returnsSchema: {\n oneOf: [\n {\n type: 'object',\n properties: {\n category: {\n enum: ['underweight', 'normal', 'overweight', 'obese'],\n },\n plurality: { enum: ['singleton', 'twin', 'triplet'] },\n actualGainKg: { type: 'number' },\n status: {\n oneOf: [\n { enum: ['below', 'within', 'above'] },\n { type: 'null' },\n ],\n },\n recommendedToDate: {\n oneOf: [\n {\n type: 'object',\n properties: {\n min: { type: 'number' },\n max: { type: 'number' },\n },\n required: ['min', 'max'],\n },\n { type: 'null' },\n ],\n },\n totalRange: {\n oneOf: [\n {\n type: 'object',\n properties: {\n min: { type: 'number' },\n max: { type: 'number' },\n },\n required: ['min', 'max'],\n },\n { type: 'null' },\n ],\n },\n weeklyRate: { type: ['number', 'null'] },\n rateStatus: {\n oneOf: [\n { enum: ['below', 'within', 'above'] },\n { type: 'null' },\n ],\n },\n },\n required: ['category', 'actualGainKg'],\n },\n { type: 'null' },\n ],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.pregnancyWeightGain.actions.getResult',\n description:\n 'Read back the computed assessment — the same value the `result` state slot returns. Null until every input is valid.',\n invoke: (handle) => handle.getResult(),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'pregnancy-weight-gain',\n description:\n 'Marks the PregnancyWeightGain calculator wrapper. The themed DOM carries the computed result card; an SR-only live region announces the actual gain and status.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the `id` prop, and also the registry key — without an `id` the instance does not register and the handle-driven actions are unreachable.',\n },\n },\n };\n","/* ------------------------------------------------------------------ */\n/* Pregnancy weight-gain guidance — pure, framework-free, testable. */\n/* */\n/* Recommended ranges follow the US IOM/NAM (2009) guidelines, keyed off */\n/* pre-pregnancy BMI category. Singletons use the published total-gain */\n/* band plus a first-trimester gain (≤13 wk) and a per-week 2nd/3rd- */\n/* trimester rate. Twins use the IOM twin total bands, pro-rated linearly */\n/* for the \"to date\" estimate (the IOM does not publish a twin weekly */\n/* rate). The IOM provides NO range for triplets, and none for */\n/* underweight twins — those cases return `null` so the UI can say so */\n/* rather than invent a number. */\n/* */\n/* Guidance only — not a substitute for clinical judgement. */\n/* ------------------------------------------------------------------ */\n\nimport { type BmiCategory, bmiCategory } from '../bmi-calculator/bmi';\nimport type { Plurality } from '../_shared/obstetrics';\n\nexport interface GainBand {\n /** Lower bound, kg. */\n min: number;\n /** Upper bound, kg. */\n max: number;\n}\n\nexport type GainStatus = 'below' | 'within' | 'above';\n\n/** IOM (2009) total recommended gain for a singleton pregnancy, kg. */\nexport const TOTAL_GAIN_BANDS: Record<BmiCategory, GainBand> = {\n underweight: { min: 12.5, max: 18 },\n normal: { min: 11.5, max: 16 },\n overweight: { min: 7, max: 11.5 },\n obese: { min: 5, max: 9 },\n};\n\n/**\n * IOM (2009) total recommended gain for a TWIN pregnancy, kg. The IOM gives\n * no firm range for underweight twins (insufficient evidence), so that\n * category is intentionally absent and resolves to `null`. There is no IOM\n * range for triplets at all.\n */\nexport const TWIN_TOTAL_GAIN_BANDS: Partial<Record<BmiCategory, GainBand>> = {\n normal: { min: 16.8, max: 24.5 },\n overweight: { min: 14.1, max: 22.7 },\n obese: { min: 11.3, max: 19.1 },\n};\n\n/** Resolve the total-gain band for a category + plurality, or `null` if the IOM gives none. */\nexport function totalGainBand(\n category: BmiCategory,\n plurality: Plurality = 'singleton',\n): GainBand | null {\n if (plurality === 'triplet') return null; // no IOM guideline for triplets\n if (plurality === 'twin') return TWIN_TOTAL_GAIN_BANDS[category] ?? null;\n return TOTAL_GAIN_BANDS[category];\n}\n\n/** IOM (2009) mean rate of gain in the 2nd/3rd trimester, kg per week. */\nexport const RATE_BANDS: Record<BmiCategory, GainBand> = {\n underweight: { min: 0.44, max: 0.58 },\n normal: { min: 0.35, max: 0.5 },\n overweight: { min: 0.23, max: 0.33 },\n obese: { min: 0.17, max: 0.27 },\n};\n\n/** First-trimester total gain band, kg (category-independent in IOM). */\nexport const FIRST_TRIMESTER_GAIN: GainBand = { min: 0.5, max: 2 };\n/** Completed weeks counted as the first trimester for gain purposes. */\nexport const FIRST_TRIMESTER_WEEKS = 13;\n\nexport interface WeightGainInput {\n /** Pre-pregnancy BMI (kg/m²) — drives the category. */\n prePregnancyBmi: number;\n /** Pre-pregnancy weight, kg. */\n prePregnancyWeightKg: number;\n /** Current weight, kg. */\n currentWeightKg: number;\n /** Completed gestational weeks. */\n gestationalWeeks: number;\n /** Number of babies. Defaults to `'singleton'`. */\n plurality?: Plurality;\n}\n\nexport interface WeightGainResult {\n category: BmiCategory;\n /** Number of babies the assessment was computed for. */\n plurality: Plurality;\n /**\n * Recommended TOTAL gain across the whole pregnancy, or `null` when the IOM\n * publishes no range (triplets, and underweight twins).\n */\n totalRange: GainBand | null;\n /** Recommended gain accumulated by the current week, or `null` (see above). */\n recommendedToDate: GainBand | null;\n /** Actual gain so far (current − pre-pregnancy), kg. */\n actualGainKg: number;\n /** Where the actual gain sits against the to-date recommendation, or `null`. */\n status: GainStatus | null;\n /**\n * Estimated 2nd/3rd-trimester average weekly gain to date (kg/week), or `null`\n * before week 14 / when no singleton rate band applies. A snapshot estimate\n * (assumes the mid first-trimester gain), not a between-visit measurement.\n */\n weeklyRate: number | null;\n /** Where the weekly rate sits against the IOM rate band, or `null`. */\n rateStatus: GainStatus | null;\n}\n\n/** Mid-point of the category-independent first-trimester gain band, kg. */\nconst FIRST_TRIMESTER_MIDPOINT =\n (FIRST_TRIMESTER_GAIN.min + FIRST_TRIMESTER_GAIN.max) / 2;\n\n/* Singleton (default) keeps a non-null return; multiples may be null. */\nexport function recommendedGainToDate(\n category: BmiCategory,\n weeks: number,\n plurality?: 'singleton',\n): GainBand;\nexport function recommendedGainToDate(\n category: BmiCategory,\n weeks: number,\n plurality: Plurality,\n): GainBand | null;\n/** Recommended cumulative gain by a given gestational week. */\nexport function recommendedGainToDate(\n category: BmiCategory,\n weeks: number,\n plurality: Plurality = 'singleton',\n): GainBand | null {\n if (plurality !== 'singleton') {\n // Twins/triplets: no IOM weekly rate is published, so pro-rate the total\n // band linearly across the 40 weeks. `null` total ⇒ no guideline.\n const total = totalGainBand(category, plurality);\n if (!total) return null;\n if (weeks <= 0) return { min: 0, max: 0 };\n const frac = Math.min(weeks, 40) / 40;\n return { min: total.min * frac, max: total.max * frac };\n }\n if (weeks <= 0) return { min: 0, max: 0 };\n if (weeks <= FIRST_TRIMESTER_WEEKS) {\n const frac = weeks / FIRST_TRIMESTER_WEEKS;\n return {\n min: FIRST_TRIMESTER_GAIN.min * frac,\n max: FIRST_TRIMESTER_GAIN.max * frac,\n };\n }\n const extraWeeks = Math.min(weeks, 40) - FIRST_TRIMESTER_WEEKS;\n const rate = RATE_BANDS[category];\n return {\n min: FIRST_TRIMESTER_GAIN.min + rate.min * extraWeeks,\n max: FIRST_TRIMESTER_GAIN.max + rate.max * extraWeeks,\n };\n}\n\nexport function assessWeightGain(input: WeightGainInput): WeightGainResult {\n const category = bmiCategory(input.prePregnancyBmi);\n const plurality = input.plurality ?? 'singleton';\n const totalRange = totalGainBand(category, plurality);\n const recommendedToDate = totalRange\n ? recommendedGainToDate(category, input.gestationalWeeks, plurality)\n : null;\n const actualGainKg = input.currentWeightKg - input.prePregnancyWeightKg;\n const status: GainStatus | null = recommendedToDate\n ? actualGainKg < recommendedToDate.min\n ? 'below'\n : actualGainKg > recommendedToDate.max\n ? 'above'\n : 'within'\n : null;\n\n // 2nd/3rd-trimester average weekly rate to date — singleton only (the IOM\n // publishes weekly rate bands only for singletons), and only after week 13.\n let weeklyRate: number | null = null;\n let rateStatus: GainStatus | null = null;\n if (\n plurality === 'singleton' &&\n input.gestationalWeeks > FIRST_TRIMESTER_WEEKS\n ) {\n const weeks = input.gestationalWeeks - FIRST_TRIMESTER_WEEKS;\n weeklyRate = (actualGainKg - FIRST_TRIMESTER_MIDPOINT) / weeks;\n const band = RATE_BANDS[category];\n rateStatus =\n weeklyRate < band.min\n ? 'below'\n : weeklyRate > band.max\n ? 'above'\n : 'within';\n }\n\n return {\n category,\n plurality,\n totalRange,\n recommendedToDate,\n actualGainKg,\n status,\n weeklyRate,\n rateStatus,\n };\n}\n","/* ------------------------------------------------------------------ */\n/* PregnancyWeightGain — actual vs IOM-recommended gestational weight */\n/* gain, keyed off pre-pregnancy BMI. */\n/* */\n/* Composes the BMI maths from bmi-calculator and the IOM bands in */\n/* `./weight-gain` (both pure, separately tested). Metric only. */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useMemo, useRef, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { pregnancyWeightGainAgent } from './pregnancy-weight-gain.agent';\nimport { RadioGroup, Radio } from '../radio-group';\nimport { FormField } from '../form-field';\nimport { NumberInput } from '../number-input';\nimport { Card } from '../card';\nimport { Badge } from '../badge';\nimport {\n InsertButton,\n type InsertPayload,\n type InsertVariant,\n type InsertMode,\n} from '../_shared/insert-result';\nimport { computeBmi } from '../bmi-calculator/bmi';\nimport type { Plurality } from '../_shared/obstetrics';\nimport {\n type WeightGainResult,\n type GainStatus,\n type GainBand,\n assessWeightGain,\n} from './weight-gain';\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]', {\n variants: {\n width: { full: 'ds:w-full', auto: 'ds:inline-flex' },\n },\n defaultVariants: { width: 'full' },\n});\n\nconst STATUS_BADGE: Record<GainStatus, 'info' | 'success' | 'warning'> = {\n below: 'warning',\n within: 'success',\n above: 'warning',\n};\n\n/**\n * DS token NAME backing each gain-status chip — the solid-fill companion of the\n * on-screen `STATUS_BADGE` variant (Badge `warning` fills `--warning`,\n * `success` fills `--success`). Passed as the card's `highlightToken` so the\n * inserted PNG chip matches the on-screen status badge; `InsertButton` resolves\n * the name to a concrete colour at raster time.\n */\nconst STATUS_HIGHLIGHT_TOKEN: Record<GainStatus, string> = {\n below: '--warning-readable',\n within: '--success',\n above: '--warning-readable',\n};\n\n/**\n * Gain-status chip token. The `below` / `above` statuses resolve to\n * `--warning-readable`, which the result card's colour probe resolves in the live\n * themed DOM: orange-600 in light, non-accessible mode (where bare `--warning`\n * yellow only reaches ~3.2:1 on the white card) and `--warning` elsewhere, whose\n * deepened ramp already clears contrast. Resolving the token NAME at the card\n * means the choice tracks the live theme regardless of where the theme class\n * lives. The `within` (`--success`) status is unchanged.\n */\nfunction statusHighlightToken(status: GainStatus): string {\n return STATUS_HIGHLIGHT_TOKEN[status];\n}\n\n/**\n * Canonical metric snapshot of the four inputs. Measurements only — the\n * calculator is never handed a patient, so no identity can reach the agent.\n */\nexport interface PregnancyWeightGainInputs {\n /** Height, cm. */\n heightCm: number | null;\n /** Pre-pregnancy weight, kg. */\n prePregnancyKg: number | null;\n /** Current weight, kg. */\n currentKg: number | null;\n /** Completed gestational weeks. */\n gestationalWeeks: number | null;\n}\n\n/**\n * Curated imperative handle for agent / external automation. Reads and writes\n * the four measurements plus the plurality choice, and reads back the computed\n * IOM assessment. Never exposes patient identity — the component only ever\n * holds numbers. Consumed by the `pregnancy-weight-gain.agent.ts` adapter; the\n * public `ref` stays the DOM element.\n */\nexport interface PregnancyWeightGainHandle {\n /** Canonical metric snapshot of the four inputs. */\n getInputs: () => PregnancyWeightGainInputs;\n /** Set one or more inputs; omitted fields are left unchanged. */\n setInputs: (next: Partial<PregnancyWeightGainInputs>) => void;\n /** Number of babies the assessment is computed for. */\n getPlurality: () => Plurality;\n /** Switch the plurality (re-keys the IOM bands). */\n setPlurality: (next: Plurality) => void;\n /** Current computed assessment, or null until every input is valid. */\n getResult: () => WeightGainResult | null;\n /** Clear the four measurements (plurality is a setting and is kept). */\n reset: () => void;\n}\n\nexport interface PregnancyWeightGainProps extends VariantProps<\n typeof rootVariants\n> {\n /** Initial number of babies. Defaults to `'singleton'`. */\n defaultPlurality?: Plurality;\n /** Pre-fill the height (cm) — e.g. shared from a BMI measurement. */\n defaultHeightCm?: number;\n /** Pre-fill the pre-pregnancy weight (kg) from the patient record. */\n defaultPrePregnancyKg?: number;\n /** Fires whenever a result can be computed (and `null` when it can't). */\n onResultChange?: (result: WeightGainResult | null) => void;\n /** When provided, shows the result-action buttons that emit / copy the result. */\n onInsert?: (payload: InsertPayload) => void;\n /**\n * Verb the result-action buttons perform. Defaults to `'insert'` (editor\n * extension). Pass `'copy'` from an app shell to copy the result to the\n * clipboard instead.\n */\n insertVariant?: InsertVariant;\n /** `copy` variant only — fired after a successful clipboard write. */\n onCopy?: (mode: InsertMode) => void;\n /** `copy` variant only — fired if the clipboard write can't proceed. */\n onError?: (error: unknown) => void;\n /**\n * Brand wordmark printed in the inserted/copied result-card footer.\n * Omitted → no brand line (and no footer hairline); a string → that custom\n * brand; `false` → no brand line. Brand is opt-in.\n */\n insertBrand?: string | false;\n /** Opaque instance id, emitted as `data-component-id`. */\n id?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\nexport const PregnancyWeightGain = forwardRef<\n HTMLDivElement,\n PregnancyWeightGainProps\n>(\n (\n {\n defaultPlurality = 'singleton',\n defaultHeightCm,\n defaultPrePregnancyKg,\n onResultChange,\n onInsert,\n insertVariant = 'insert',\n onCopy,\n onError,\n insertBrand,\n id,\n width,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n\n const [heightCm, setHeightCm] = useState<number | null>(\n defaultHeightCm ?? null,\n );\n const [prePregnancyKg, setPrePregnancyKg] = useState<number | null>(\n defaultPrePregnancyKg ?? null,\n );\n const [currentKg, setCurrentKg] = useState<number | null>(null);\n const [weeks, setWeeks] = useState<number | null>(null);\n const [plurality, setPlurality] = useState<Plurality>(defaultPlurality);\n\n const prePregnancyBmi = computeBmi(prePregnancyKg, heightCm);\n\n const result = useMemo<WeightGainResult | null>(() => {\n if (\n prePregnancyBmi === null ||\n prePregnancyKg === null ||\n currentKg === null ||\n weeks === null\n ) {\n return null;\n }\n return assessWeightGain({\n prePregnancyBmi,\n prePregnancyWeightKg: prePregnancyKg,\n currentWeightKg: currentKg,\n gestationalWeeks: weeks,\n plurality,\n });\n }, [prePregnancyBmi, prePregnancyKg, currentKg, weeks, plurality]);\n\n const kg = useMemo(\n () =>\n new Intl.NumberFormat(i18n.language, {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }),\n [i18n.language],\n );\n\n useEffect(() => {\n onResultChange?.(result);\n }, [result, onResultChange]);\n\n // Live refs so the once-built agent handle reads current state without\n // re-creating on every keystroke. Public `ref` stays the DOM node — the\n // agent surface is the separate `PregnancyWeightGainHandle`.\n const liveRef = useRef({\n heightCm,\n prePregnancyKg,\n currentKg,\n weeks,\n plurality,\n result,\n });\n liveRef.current = {\n heightCm,\n prePregnancyKg,\n currentKg,\n weeks,\n plurality,\n result,\n };\n const agentHandle = useMemo<PregnancyWeightGainHandle>(\n () => ({\n getInputs: () => ({\n heightCm: liveRef.current.heightCm,\n prePregnancyKg: liveRef.current.prePregnancyKg,\n currentKg: liveRef.current.currentKg,\n gestationalWeeks: liveRef.current.weeks,\n }),\n setInputs: (next) => {\n if ('heightCm' in next) setHeightCm(next.heightCm ?? null);\n if ('prePregnancyKg' in next) {\n setPrePregnancyKg(next.prePregnancyKg ?? null);\n }\n if ('currentKg' in next) setCurrentKg(next.currentKg ?? null);\n if ('gestationalWeeks' in next) {\n setWeeks(next.gestationalWeeks ?? null);\n }\n },\n getPlurality: () => liveRef.current.plurality,\n setPlurality: (next) => setPlurality(next),\n getResult: () => liveRef.current.result,\n reset: () => {\n setHeightCm(null);\n setPrePregnancyKg(null);\n setCurrentKg(null);\n setWeeks(null);\n },\n }),\n [],\n );\n useAgentRegistration(pregnancyWeightGainAgent, agentHandle, id);\n\n const unit = t('pregnancyWeightGain.units.kg');\n const band = (b: GainBand): string =>\n `${kg.format(b.min)} – ${kg.format(b.max)} ${unit}`;\n\n return (\n <div\n ref={ref}\n data-component=\"pregnancy-weight-gain\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n <FormField\n label={`${t('pregnancyWeightGain.height')} (${t('pregnancyWeightGain.units.cm')})`}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={0.5}\n value={heightCm}\n onChange={setHeightCm}\n />\n </FormField>\n <FormField\n label={`${t('pregnancyWeightGain.prePregnancyWeight')} (${unit})`}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={0.1}\n value={prePregnancyKg}\n onChange={setPrePregnancyKg}\n />\n </FormField>\n <FormField\n label={`${t('pregnancyWeightGain.currentWeight')} (${unit})`}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={0.1}\n value={currentKg}\n onChange={setCurrentKg}\n />\n </FormField>\n <FormField label={t('pregnancyWeightGain.gestationalWeeks')}>\n <NumberInput\n mode=\"integer\"\n min={0}\n max={42}\n value={weeks}\n onChange={setWeeks}\n />\n </FormField>\n </div>\n\n <RadioGroup\n label={t('pregnancyWeightGain.plurality.label')}\n variant=\"horizontal\"\n value={plurality}\n onValueChange={(next) => setPlurality(next as Plurality)}\n >\n <Radio\n label={t('pregnancyWeightGain.plurality.singleton')}\n value=\"singleton\"\n />\n <Radio label={t('pregnancyWeightGain.plurality.twin')} value=\"twin\" />\n <Radio\n label={t('pregnancyWeightGain.plurality.triplet')}\n value=\"triplet\"\n />\n </RadioGroup>\n\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {result\n ? `${t('pregnancyWeightGain.actualGain')}: ${kg.format(\n result.actualGainKg,\n )} ${unit}.${\n result.status\n ? ` ${t(`pregnancyWeightGain.status.${result.status}`)}.`\n : ` ${t('pregnancyWeightGain.noGuideline')}`\n }`\n : ''}\n </p>\n\n {result ? (\n <Card variant=\"elevated\">\n <Card.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <dl className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyWeightGain.prePregnancyBmi')}\n </dt>\n <dd className=\"type-body ds:text-foreground\">\n {kg.format(prePregnancyBmi ?? 0)} ·{' '}\n {t(`pregnancyWeightGain.category.${result.category}`)}\n </dd>\n </div>\n <div className=\"ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)]\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyWeightGain.actualGain')}\n </dt>\n <dd className=\"ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-metric ds:text-foreground\">\n {kg.format(result.actualGainKg)} {unit}\n </span>\n {result.status ? (\n <Badge variant={STATUS_BADGE[result.status]} size=\"lg\">\n {t(`pregnancyWeightGain.status.${result.status}`)}\n </Badge>\n ) : null}\n </dd>\n </div>\n {result.recommendedToDate && result.totalRange ? (\n <>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyWeightGain.recommendedToDate')}\n </dt>\n <dd className=\"type-body ds:text-foreground\">\n {band(result.recommendedToDate)}\n </dd>\n </div>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyWeightGain.recommendedTotal')}\n </dt>\n <dd className=\"type-body ds:text-foreground\">\n {band(result.totalRange)}\n </dd>\n </div>\n </>\n ) : null}\n </dl>\n {result.totalRange ? null : (\n <p className=\"type-body ds:text-foreground\">\n {t('pregnancyWeightGain.noGuideline')}\n </p>\n )}\n {result.weeklyRate !== null && result.rateStatus ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyWeightGain.weeklyRate')}\n </span>\n <span className=\"type-body ds:text-foreground\">\n {t('pregnancyWeightGain.perWeek', {\n value: kg.format(result.weeklyRate),\n })}\n </span>\n <Badge variant={STATUS_BADGE[result.rateStatus]}>\n {t(`pregnancyWeightGain.status.${result.rateStatus}`)}\n </Badge>\n </div>\n ) : null}\n <p className=\"type-body-sm ds:text-muted-foreground\">\n {t(\n plurality === 'singleton'\n ? 'pregnancyWeightGain.disclaimer'\n : 'pregnancyWeightGain.disclaimerMultiple',\n )}\n </p>\n {result.status &&\n result.recommendedToDate &&\n result.totalRange &&\n (insertVariant === 'copy' || onInsert) ? (\n <InsertButton\n onInsert={onInsert}\n variant={insertVariant}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.weightGain'),\n icon: 'baby',\n highlight: t(`pregnancyWeightGain.status.${result.status}`),\n // Chip shares the gain-status semantic token so the\n // inserted PNG chip matches the on-screen status badge —\n // with the contrast-safe orange override for the\n // `--warning` below/above statuses.\n highlightToken: statusHighlightToken(result.status),\n brand: insertBrand,\n fields: [\n {\n // Actual gain is the headline trend → trending-up glyph.\n icon: 'trending-up',\n label: t('pregnancyWeightGain.actualGain'),\n value: `${kg.format(result.actualGainKg)} ${unit}`,\n },\n {\n // Recommended weight band → scale glyph.\n icon: 'scale',\n label: t('pregnancyWeightGain.recommendedToDate'),\n value: band(result.recommendedToDate),\n },\n {\n // Recommended total weight band → scale glyph.\n icon: 'scale',\n label: t('pregnancyWeightGain.recommendedTotal'),\n value: band(result.totalRange),\n },\n ],\n }}\n />\n ) : null}\n </Card.Body>\n </Card>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('pregnancyWeightGain.empty')}\n </p>\n )}\n </div>\n );\n },\n);\n\nPregnancyWeightGain.displayName = 'PregnancyWeightGain';\n"],"names":["pregnancyWeightGainAgent","handle","args","TOTAL_GAIN_BANDS","TWIN_TOTAL_GAIN_BANDS","totalGainBand","category","plurality","RATE_BANDS","FIRST_TRIMESTER_GAIN","FIRST_TRIMESTER_WEEKS","FIRST_TRIMESTER_MIDPOINT","recommendedGainToDate","weeks","total","frac","extraWeeks","rate","assessWeightGain","input","bmiCategory","totalRange","recommendedToDate","actualGainKg","status","weeklyRate","rateStatus","band","rootVariants","cva","STATUS_BADGE","STATUS_HIGHLIGHT_TOKEN","statusHighlightToken","PregnancyWeightGain","forwardRef","defaultPlurality","defaultHeightCm","defaultPrePregnancyKg","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","id","width","className","ref","t","i18n","useTranslation","heightCm","setHeightCm","useState","prePregnancyKg","setPrePregnancyKg","currentKg","setCurrentKg","setWeeks","setPlurality","prePregnancyBmi","computeBmi","result","useMemo","kg","useEffect","liveRef","useRef","agentHandle","next","useAgentRegistration","unit","b","jsxs","jsx","FormField","NumberInput","RadioGroup","Radio","Card","Badge","Fragment","InsertButton"],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@ import { jsxs as n, jsx as o } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as q, useState as G, useCallback as g, useRef as L, useImperativeHandle as J, useMemo as Q } from "react";
|
|
3
3
|
import { useTranslation as V } from "react-i18next";
|
|
4
4
|
import * as a from "@radix-ui/react-dialog";
|
|
5
|
-
import { B as u } from "./button-
|
|
6
|
-
import { I as W } from "./icon-button-
|
|
5
|
+
import { B as u } from "./button-nJaPh_HC.js";
|
|
6
|
+
import { I as W } from "./icon-button-DA2CAGHZ.js";
|
|
7
7
|
import { L as X } from "./logo-1FuSGx0n.js";
|
|
8
8
|
import { u as Y } from "./registry-DvAUVLHh.js";
|
|
9
9
|
import { E as h } from "./eye-off-C_4xkbRP.js";
|
|
@@ -194,4 +194,4 @@ export {
|
|
|
194
194
|
ee as P,
|
|
195
195
|
$ as p
|
|
196
196
|
};
|
|
197
|
-
//# sourceMappingURL=privacy-lock-
|
|
197
|
+
//# sourceMappingURL=privacy-lock-CkAUo6Dz.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"privacy-lock-SQYFRSuH.js","sources":["../../src/components/privacy-lock/privacy-lock.agent.ts","../../src/components/privacy-lock/privacy-lock.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — PrivacyLock. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { PrivacyLockHandle } from './privacy-lock';\n\nexport const privacyLockAgent: AgentAdapter<PrivacyLockHandle> = {\n id: 'privacy-lock',\n // lock() opens the privacy overlay → `open`; unlock() closes it → `dismiss`.\n // There is no form to submit, so the previous `submit` capability is dropped.\n capabilities: ['open', 'dismiss'],\n state: {\n isLocked: {\n type: 'boolean',\n descriptionKey: 'ui.agent.privacyLock.state.isLocked',\n description: 'True when the privacy overlay is open.',\n read: (handle) => handle.isLocked(),\n },\n },\n actions: {\n lock: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.privacyLock.actions.lock',\n description: 'Open the privacy overlay.',\n invoke: (handle) => {\n handle.lock();\n },\n },\n unlock: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.privacyLock.actions.unlock',\n description: 'Close the privacy overlay (consumer-confirmed action).',\n invoke: (handle) => {\n handle.unlock();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'privacy-lock',\n description: 'Marks the PrivacyLock trigger.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* -------------------------------------------------------------------- */\n/* PrivacyLock — a one-click \"lock my screen\" dialog for operator */\n/* workstations on shared clinic hardware. Clicking the trigger paints */\n/* a full-viewport privacy overlay (blurred backdrop + centred card); */\n/* the only ways out are the three action buttons the consumer wires. */\n/* */\n/* Composed of one `IconButton` trigger and a Radix Dialog overlay. The */\n/* dialog is intentionally *not* dismissible via Escape or outside-click */\n/* — the whole point is to make the screen unreadable until the user */\n/* takes an explicit action. */\n/* */\n/* See `src/components/privacy-lock/privacy-lock.mdx` for usage. */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { EyeOff, LogOut, User } from 'lucide-react';\nimport { Button } from '../button';\nimport { IconButton } from '../button/icon-button';\nimport { Logo } from '../logo';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { privacyLockAgent } from './privacy-lock.agent';\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\n/** Curated imperative handle for agent / external automation. */\nexport interface PrivacyLockHandle {\n isLocked: () => boolean;\n lock: () => void;\n unlock: () => void;\n}\n\nexport interface PrivacyLockProps {\n /** Controlled open state. Pair with `onOpenChange`. */\n open?: boolean;\n /** Uncontrolled initial state. Ignored when `open` is provided. */\n defaultOpen?: boolean;\n /** Fires whenever the dialog opens or closes — trigger click, action button, etc. */\n onOpenChange?: (open: boolean) => void;\n\n /** Fires when the \"Unlock screen\" button is activated. Dialog closes automatically. */\n onUnlock?: () => void;\n /** Fires when \"Account page\" is activated. Button is omitted when undefined. Dialog closes automatically. */\n onAccountPage?: () => void;\n /** Fires when \"Log out\" is activated. Button is omitted when undefined. Dialog closes automatically. */\n onSignOut?: () => void;\n\n /** Override the trigger icon. Default: `lucide-react` `<EyeOff />`. */\n triggerIcon?: ReactNode;\n /** Accessible name for the trigger. Default: t('privacyLock.triggerAriaLabel'). */\n triggerAriaLabel?: string;\n /** Tooltip for the trigger. Default: t('privacyLock.triggerTooltip'). */\n triggerTooltip?: string;\n\n /** Accessible title of the dialog (visually hidden). Default: t('privacyLock.title'). */\n title?: string;\n /** Visible supporting text under the action buttons. Default: t('privacyLock.description'). */\n description?: string;\n /** Label for the \"Unlock screen\" button. Default: t('privacyLock.unlock'). */\n unlockLabel?: string;\n /** Label for the \"Account page\" button. Default: t('privacyLock.accountPage'). */\n accountPageLabel?: string;\n /** Label for the \"Log out\" button. Default: t('privacyLock.signOut'). */\n signOutLabel?: string;\n\n /** Extra classes on the trigger `IconButton`. */\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport const PrivacyLock = forwardRef<HTMLButtonElement, PrivacyLockProps>(\n (\n {\n open,\n defaultOpen = false,\n onOpenChange,\n onUnlock,\n onAccountPage,\n onSignOut,\n triggerIcon,\n triggerAriaLabel,\n triggerTooltip,\n title,\n description,\n unlockLabel,\n accountPageLabel,\n signOutLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isControlled = open !== undefined;\n const isOpen = isControlled ? open : uncontrolledOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n const latestOpenRef = useRef(isOpen);\n latestOpenRef.current = isOpen;\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n useImperativeHandle(ref, () => triggerRef.current as HTMLButtonElement, []);\n\n const agentHandle = useMemo<PrivacyLockHandle>(\n () => ({\n isLocked: () => latestOpenRef.current,\n lock: () => setOpen(true),\n unlock: () => setOpen(false),\n }),\n [setOpen],\n );\n useAgentRegistration(\n privacyLockAgent,\n agentHandle,\n (rest as { id?: string }).id,\n );\n\n // Every action closes the dialog after firing the consumer's\n // callback. Consumers that need to keep the dialog open (e.g.\n // confirmation step) should control `open` themselves and skip the\n // close on the relevant callback.\n const handleAction = useCallback(\n (callback?: () => void) => (event: MouseEvent<HTMLButtonElement>) => {\n callback?.();\n // Only close if the consumer didn't preventDefault — lets a\n // controlled consumer stop the auto-close for guarded actions.\n if (!event.defaultPrevented) setOpen(false);\n },\n [setOpen],\n );\n\n const resolvedTriggerAriaLabel =\n triggerAriaLabel ??\n t('privacyLock.triggerAriaLabel', 'Lock screen for privacy');\n const resolvedTriggerTooltip =\n triggerTooltip ?? t('privacyLock.triggerTooltip', 'Lock screen');\n const resolvedTitle =\n title ?? t('privacyLock.title', 'Screen locked for privacy');\n const resolvedDescription =\n description ??\n t(\n 'privacyLock.description',\n 'Locking the screen helps protect the privacy of your data.',\n );\n const resolvedUnlockLabel =\n unlockLabel ?? t('privacyLock.unlock', 'Unlock screen');\n const resolvedAccountPageLabel =\n accountPageLabel ?? t('privacyLock.accountPage', 'Account page');\n const resolvedSignOutLabel =\n signOutLabel ?? t('privacyLock.signOut', 'Log out');\n\n return (\n <RadixDialog.Root open={isOpen} onOpenChange={setOpen}>\n <RadixDialog.Trigger asChild>\n <IconButton\n ref={triggerRef}\n icon={triggerIcon ?? <EyeOff aria-hidden />}\n aria-label={resolvedTriggerAriaLabel}\n tooltip={resolvedTriggerTooltip}\n className={className}\n data-component=\"privacy-lock\"\n data-component-id={(rest as { id?: string }).id}\n {...rest}\n />\n </RadixDialog.Trigger>\n <RadixDialog.Portal>\n <RadixDialog.Overlay\n className={[\n 'ds:fixed ds:inset-0 ds:z-[var(--z-modal-backdrop)]',\n 'ds:bg-[var(--background)]/40 ds:backdrop-blur-xl',\n // Fade-in / fade-out via Radix data-state. Gated on\n // motion-reduce per accessibility requirements.\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out',\n 'ds:motion-reduce:animate-none',\n ].join(' ')}\n />\n <RadixDialog.Content\n aria-label={resolvedTitle}\n // Make the overlay non-dismissible by ambient input. The only\n // way out is an explicit action button — preserving the\n // \"locked\" contract. Screen readers + assistive tech still\n // reach the buttons via Tab.\n onEscapeKeyDown={(event) => event.preventDefault()}\n onPointerDownOutside={(event) => event.preventDefault()}\n onInteractOutside={(event) => event.preventDefault()}\n // Radix's default closes the dialog and returns focus to the\n // trigger (per the WAI-ARIA Dialog pattern). Stacked with\n // Radix Tooltip — which opens on focus per the WAI-ARIA\n // Tooltip pattern — that produces a tooltip stuck on the\n // lock icon every time the user unlocks. PrivacyLock's UX\n // contract is \"unlock and get out of the user's way\" (cf.\n // macOS / Windows / 1Password unlock flows: focus returns to\n // the page, not the unlock control), so we opt out of\n // Radix's auto-focus return and let focus fall to the body.\n onCloseAutoFocus={(event) => event.preventDefault()}\n className={[\n 'ds:fixed ds:inset-0 ds:z-[var(--z-modal)]',\n 'ds:flex ds:items-center ds:justify-center',\n 'ds:focus:outline-none',\n 'ds:text-[color:var(--foreground)]',\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in',\n 'ds:motion-reduce:animate-none',\n ].join(' ')}\n >\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-lg)] ds:w-[min(22rem,calc(100vw-var(--spacing-xl)))] ds:text-center\">\n <Logo size=\"xl\" decorative />\n <RadixDialog.Title className=\"ds:sr-only\">\n {resolvedTitle}\n </RadixDialog.Title>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full\">\n <Button\n intent=\"primary\"\n startIcon={<EyeOff aria-hidden />}\n onClick={handleAction(onUnlock)}\n >\n {resolvedUnlockLabel}\n </Button>\n {onAccountPage ? (\n <Button\n intent=\"secondary\"\n startIcon={<User aria-hidden />}\n onClick={handleAction(onAccountPage)}\n >\n {resolvedAccountPageLabel}\n </Button>\n ) : null}\n {onSignOut ? (\n <Button\n intent=\"secondary\"\n startIcon={<LogOut aria-hidden />}\n onClick={handleAction(onSignOut)}\n >\n {resolvedSignOutLabel}\n </Button>\n ) : null}\n </div>\n <RadixDialog.Description className=\"type-body-sm ds:opacity-90\">\n {resolvedDescription}\n </RadixDialog.Description>\n </div>\n </RadixDialog.Content>\n </RadixDialog.Portal>\n </RadixDialog.Root>\n );\n },\n);\nPrivacyLock.displayName = 'PrivacyLock';\n"],"names":["privacyLockAgent","handle","PrivacyLock","forwardRef","open","defaultOpen","onOpenChange","onUnlock","onAccountPage","onSignOut","triggerIcon","triggerAriaLabel","triggerTooltip","title","description","unlockLabel","accountPageLabel","signOutLabel","className","rest","ref","t","useTranslation","uncontrolledOpen","setUncontrolledOpen","useState","isControlled","isOpen","setOpen","useCallback","next","latestOpenRef","useRef","triggerRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration","handleAction","callback","event","resolvedTriggerAriaLabel","resolvedTriggerTooltip","resolvedTitle","resolvedDescription","resolvedUnlockLabel","resolvedAccountPageLabel","resolvedSignOutLabel","RadixDialog","jsx","IconButton","EyeOff","jsxs","Logo","Button","User","LogOut"],"mappings":";;;;;;;;;;;AAOO,MAAMA,IAAoD;AAAA,EAC/D,IAAI;AAAA;AAAA;AAAA,EAGJ,cAAc,CAAC,QAAQ,SAAS;AAAA,EAChC,OAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,MAAM,CAACC,MAAWA,EAAO,SAAA;AAAA,IAAS;AAAA,EACpC;AAAA,EAEF,SAAS;AAAA,IACP,MAAM;AAAA,MACJ,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACA,MAAW;AAClB,QAAAA,EAAO,KAAA;AAAA,MACT;AAAA,IAAA;AAAA,IAEF,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACA,MAAW;AAClB,QAAAA,EAAO,OAAA;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAAA,EAEF,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IAAA;AAAA,IAEf,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GCiCaC,KAAcC;AAAA,EACzB,CACE;AAAA,IACE,MAAAC;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,cAAAC;AAAA,IACA,UAAAC;AAAA,IACA,eAAAC;AAAA,IACA,WAAAC;AAAA,IACA,aAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,OAAAC;AAAA,IACA,aAAAC;AAAA,IACA,aAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,WAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACR,CAACC,GAAkBC,CAAmB,IAAIC,EAASpB,CAAW,GAC9DqB,IAAetB,MAAS,QACxBuB,IAASD,IAAetB,IAAOmB,GAE/BK,IAAUC;AAAA,MACd,CAACC,MAAkB;AACjB,QAAKJ,KAAcF,EAAoBM,CAAI,GAC3CxB,KAAA,QAAAA,EAAewB;AAAA,MACjB;AAAA,MACA,CAACJ,GAAcpB,CAAY;AAAA,IAAA,GAGvByB,IAAgBC,EAAOL,CAAM;AACnC,IAAAI,EAAc,UAAUJ;AAExB,UAAMM,IAAaD,EAA0B,IAAI;AACjD,IAAAE,EAAoBd,GAAK,MAAMa,EAAW,SAA8B,CAAA,CAAE;AAE1E,UAAME,IAAcC;AAAA,MAClB,OAAO;AAAA,QACL,UAAU,MAAML,EAAc;AAAA,QAC9B,MAAM,MAAMH,EAAQ,EAAI;AAAA,QACxB,QAAQ,MAAMA,EAAQ,EAAK;AAAA,MAAA;AAAA,MAE7B,CAACA,CAAO;AAAA,IAAA;AAEV,IAAAS;AAAA,MACErC;AAAA,MACAmC;AAAA,MACChB,EAAyB;AAAA,IAAA;AAO5B,UAAMmB,IAAeT;AAAA,MACnB,CAACU,MAA0B,CAACC,MAAyC;AACnE,QAAAD,KAAA,QAAAA,KAGKC,EAAM,oBAAkBZ,EAAQ,EAAK;AAAA,MAC5C;AAAA,MACA,CAACA,CAAO;AAAA,IAAA,GAGJa,IACJ9B,KACAU,EAAE,gCAAgC,yBAAyB,GACvDqB,IACJ9B,KAAkBS,EAAE,8BAA8B,aAAa,GAC3DsB,IACJ9B,KAASQ,EAAE,qBAAqB,2BAA2B,GACvDuB,IACJ9B,KACAO;AAAA,MACE;AAAA,MACA;AAAA,IAAA,GAEEwB,IACJ9B,KAAeM,EAAE,sBAAsB,eAAe,GAClDyB,IACJ9B,KAAoBK,EAAE,2BAA2B,cAAc,GAC3D0B,IACJ9B,KAAgBI,EAAE,uBAAuB,SAAS;AAEpD,6BACG2B,EAAY,MAAZ,EAAiB,MAAMrB,GAAQ,cAAcC,GAC5C,UAAA;AAAA,MAAA,gBAAAqB,EAACD,EAAY,SAAZ,EAAoB,SAAO,IAC1B,UAAA,gBAAAC;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,KAAKjB;AAAA,UACL,MAAMvB,KAAe,gBAAAuC,EAACE,GAAA,EAAO,eAAW,IAAC;AAAA,UACzC,cAAYV;AAAA,UACZ,SAASC;AAAA,UACT,WAAAxB;AAAA,UACA,kBAAe;AAAA,UACf,qBAAoBC,EAAyB;AAAA,UAC5C,GAAGA;AAAA,QAAA;AAAA,MAAA,GAER;AAAA,MACA,gBAAAiC,EAACJ,EAAY,QAAZ,EACC,UAAA;AAAA,QAAA,gBAAAC;AAAA,UAACD,EAAY;AAAA,UAAZ;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA;AAAA;AAAA,cAGA;AAAA,cACA;AAAA,cACA;AAAA,YAAA,EACA,KAAK,GAAG;AAAA,UAAA;AAAA,QAAA;AAAA,QAEZ,gBAAAC;AAAA,UAACD,EAAY;AAAA,UAAZ;AAAA,YACC,cAAYL;AAAA,YAKZ,iBAAiB,CAACH,MAAUA,EAAM,eAAA;AAAA,YAClC,sBAAsB,CAACA,MAAUA,EAAM,eAAA;AAAA,YACvC,mBAAmB,CAACA,MAAUA,EAAM,eAAA;AAAA,YAUpC,kBAAkB,CAACA,MAAUA,EAAM,eAAA;AAAA,YACnC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA,EACA,KAAK,GAAG;AAAA,YAEV,UAAA,gBAAAY,EAAC,OAAA,EAAI,WAAU,iIACb,UAAA;AAAA,cAAA,gBAAAH,EAACI,GAAA,EAAK,MAAK,MAAK,YAAU,IAAC;AAAA,gCAC1BL,EAAY,OAAZ,EAAkB,WAAU,cAC1B,UAAAL,GACH;AAAA,cACA,gBAAAS,EAAC,OAAA,EAAI,WAAU,4DACb,UAAA;AAAA,gBAAA,gBAAAH;AAAA,kBAACK;AAAA,kBAAA;AAAA,oBACC,QAAO;AAAA,oBACP,WAAW,gBAAAL,EAACE,GAAA,EAAO,eAAW,GAAA,CAAC;AAAA,oBAC/B,SAASb,EAAa/B,CAAQ;AAAA,oBAE7B,UAAAsC;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEFrC,IACC,gBAAAyC;AAAA,kBAACK;AAAA,kBAAA;AAAA,oBACC,QAAO;AAAA,oBACP,WAAW,gBAAAL,EAACM,GAAA,EAAK,eAAW,GAAA,CAAC;AAAA,oBAC7B,SAASjB,EAAa9B,CAAa;AAAA,oBAElC,UAAAsC;AAAA,kBAAA;AAAA,gBAAA,IAED;AAAA,gBACHrC,IACC,gBAAAwC;AAAA,kBAACK;AAAA,kBAAA;AAAA,oBACC,QAAO;AAAA,oBACP,WAAW,gBAAAL,EAACO,GAAA,EAAO,eAAW,GAAA,CAAC;AAAA,oBAC/B,SAASlB,EAAa7B,CAAS;AAAA,oBAE9B,UAAAsC;AAAA,kBAAA;AAAA,gBAAA,IAED;AAAA,cAAA,GACN;AAAA,gCACCC,EAAY,aAAZ,EAAwB,WAAU,8BAChC,UAAAJ,EAAA,CACH;AAAA,YAAA,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,MACF,EAAA,CACF;AAAA,IAAA,GACF;AAAA,EAEJ;AACF;AACA1C,GAAY,cAAc;"}
|
|
1
|
+
{"version":3,"file":"privacy-lock-CkAUo6Dz.js","sources":["../../src/components/privacy-lock/privacy-lock.agent.ts","../../src/components/privacy-lock/privacy-lock.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — PrivacyLock. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { PrivacyLockHandle } from './privacy-lock';\n\nexport const privacyLockAgent: AgentAdapter<PrivacyLockHandle> = {\n id: 'privacy-lock',\n // lock() opens the privacy overlay → `open`; unlock() closes it → `dismiss`.\n // There is no form to submit, so the previous `submit` capability is dropped.\n capabilities: ['open', 'dismiss'],\n state: {\n isLocked: {\n type: 'boolean',\n descriptionKey: 'ui.agent.privacyLock.state.isLocked',\n description: 'True when the privacy overlay is open.',\n read: (handle) => handle.isLocked(),\n },\n },\n actions: {\n lock: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.privacyLock.actions.lock',\n description: 'Open the privacy overlay.',\n invoke: (handle) => {\n handle.lock();\n },\n },\n unlock: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.privacyLock.actions.unlock',\n description: 'Close the privacy overlay (consumer-confirmed action).',\n invoke: (handle) => {\n handle.unlock();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'privacy-lock',\n description: 'Marks the PrivacyLock trigger.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* -------------------------------------------------------------------- */\n/* PrivacyLock — a one-click \"lock my screen\" dialog for operator */\n/* workstations on shared clinic hardware. Clicking the trigger paints */\n/* a full-viewport privacy overlay (blurred backdrop + centred card); */\n/* the only ways out are the three action buttons the consumer wires. */\n/* */\n/* Composed of one `IconButton` trigger and a Radix Dialog overlay. The */\n/* dialog is intentionally *not* dismissible via Escape or outside-click */\n/* — the whole point is to make the screen unreadable until the user */\n/* takes an explicit action. */\n/* */\n/* See `src/components/privacy-lock/privacy-lock.mdx` for usage. */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { EyeOff, LogOut, User } from 'lucide-react';\nimport { Button } from '../button';\nimport { IconButton } from '../button/icon-button';\nimport { Logo } from '../logo';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { privacyLockAgent } from './privacy-lock.agent';\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\n/** Curated imperative handle for agent / external automation. */\nexport interface PrivacyLockHandle {\n isLocked: () => boolean;\n lock: () => void;\n unlock: () => void;\n}\n\nexport interface PrivacyLockProps {\n /** Controlled open state. Pair with `onOpenChange`. */\n open?: boolean;\n /** Uncontrolled initial state. Ignored when `open` is provided. */\n defaultOpen?: boolean;\n /** Fires whenever the dialog opens or closes — trigger click, action button, etc. */\n onOpenChange?: (open: boolean) => void;\n\n /** Fires when the \"Unlock screen\" button is activated. Dialog closes automatically. */\n onUnlock?: () => void;\n /** Fires when \"Account page\" is activated. Button is omitted when undefined. Dialog closes automatically. */\n onAccountPage?: () => void;\n /** Fires when \"Log out\" is activated. Button is omitted when undefined. Dialog closes automatically. */\n onSignOut?: () => void;\n\n /** Override the trigger icon. Default: `lucide-react` `<EyeOff />`. */\n triggerIcon?: ReactNode;\n /** Accessible name for the trigger. Default: t('privacyLock.triggerAriaLabel'). */\n triggerAriaLabel?: string;\n /** Tooltip for the trigger. Default: t('privacyLock.triggerTooltip'). */\n triggerTooltip?: string;\n\n /** Accessible title of the dialog (visually hidden). Default: t('privacyLock.title'). */\n title?: string;\n /** Visible supporting text under the action buttons. Default: t('privacyLock.description'). */\n description?: string;\n /** Label for the \"Unlock screen\" button. Default: t('privacyLock.unlock'). */\n unlockLabel?: string;\n /** Label for the \"Account page\" button. Default: t('privacyLock.accountPage'). */\n accountPageLabel?: string;\n /** Label for the \"Log out\" button. Default: t('privacyLock.signOut'). */\n signOutLabel?: string;\n\n /** Extra classes on the trigger `IconButton`. */\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport const PrivacyLock = forwardRef<HTMLButtonElement, PrivacyLockProps>(\n (\n {\n open,\n defaultOpen = false,\n onOpenChange,\n onUnlock,\n onAccountPage,\n onSignOut,\n triggerIcon,\n triggerAriaLabel,\n triggerTooltip,\n title,\n description,\n unlockLabel,\n accountPageLabel,\n signOutLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isControlled = open !== undefined;\n const isOpen = isControlled ? open : uncontrolledOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n const latestOpenRef = useRef(isOpen);\n latestOpenRef.current = isOpen;\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n useImperativeHandle(ref, () => triggerRef.current as HTMLButtonElement, []);\n\n const agentHandle = useMemo<PrivacyLockHandle>(\n () => ({\n isLocked: () => latestOpenRef.current,\n lock: () => setOpen(true),\n unlock: () => setOpen(false),\n }),\n [setOpen],\n );\n useAgentRegistration(\n privacyLockAgent,\n agentHandle,\n (rest as { id?: string }).id,\n );\n\n // Every action closes the dialog after firing the consumer's\n // callback. Consumers that need to keep the dialog open (e.g.\n // confirmation step) should control `open` themselves and skip the\n // close on the relevant callback.\n const handleAction = useCallback(\n (callback?: () => void) => (event: MouseEvent<HTMLButtonElement>) => {\n callback?.();\n // Only close if the consumer didn't preventDefault — lets a\n // controlled consumer stop the auto-close for guarded actions.\n if (!event.defaultPrevented) setOpen(false);\n },\n [setOpen],\n );\n\n const resolvedTriggerAriaLabel =\n triggerAriaLabel ??\n t('privacyLock.triggerAriaLabel', 'Lock screen for privacy');\n const resolvedTriggerTooltip =\n triggerTooltip ?? t('privacyLock.triggerTooltip', 'Lock screen');\n const resolvedTitle =\n title ?? t('privacyLock.title', 'Screen locked for privacy');\n const resolvedDescription =\n description ??\n t(\n 'privacyLock.description',\n 'Locking the screen helps protect the privacy of your data.',\n );\n const resolvedUnlockLabel =\n unlockLabel ?? t('privacyLock.unlock', 'Unlock screen');\n const resolvedAccountPageLabel =\n accountPageLabel ?? t('privacyLock.accountPage', 'Account page');\n const resolvedSignOutLabel =\n signOutLabel ?? t('privacyLock.signOut', 'Log out');\n\n return (\n <RadixDialog.Root open={isOpen} onOpenChange={setOpen}>\n <RadixDialog.Trigger asChild>\n <IconButton\n ref={triggerRef}\n icon={triggerIcon ?? <EyeOff aria-hidden />}\n aria-label={resolvedTriggerAriaLabel}\n tooltip={resolvedTriggerTooltip}\n className={className}\n data-component=\"privacy-lock\"\n data-component-id={(rest as { id?: string }).id}\n {...rest}\n />\n </RadixDialog.Trigger>\n <RadixDialog.Portal>\n <RadixDialog.Overlay\n className={[\n 'ds:fixed ds:inset-0 ds:z-[var(--z-modal-backdrop)]',\n 'ds:bg-[var(--background)]/40 ds:backdrop-blur-xl',\n // Fade-in / fade-out via Radix data-state. Gated on\n // motion-reduce per accessibility requirements.\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out',\n 'ds:motion-reduce:animate-none',\n ].join(' ')}\n />\n <RadixDialog.Content\n aria-label={resolvedTitle}\n // Make the overlay non-dismissible by ambient input. The only\n // way out is an explicit action button — preserving the\n // \"locked\" contract. Screen readers + assistive tech still\n // reach the buttons via Tab.\n onEscapeKeyDown={(event) => event.preventDefault()}\n onPointerDownOutside={(event) => event.preventDefault()}\n onInteractOutside={(event) => event.preventDefault()}\n // Radix's default closes the dialog and returns focus to the\n // trigger (per the WAI-ARIA Dialog pattern). Stacked with\n // Radix Tooltip — which opens on focus per the WAI-ARIA\n // Tooltip pattern — that produces a tooltip stuck on the\n // lock icon every time the user unlocks. PrivacyLock's UX\n // contract is \"unlock and get out of the user's way\" (cf.\n // macOS / Windows / 1Password unlock flows: focus returns to\n // the page, not the unlock control), so we opt out of\n // Radix's auto-focus return and let focus fall to the body.\n onCloseAutoFocus={(event) => event.preventDefault()}\n className={[\n 'ds:fixed ds:inset-0 ds:z-[var(--z-modal)]',\n 'ds:flex ds:items-center ds:justify-center',\n 'ds:focus:outline-none',\n 'ds:text-[color:var(--foreground)]',\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in',\n 'ds:motion-reduce:animate-none',\n ].join(' ')}\n >\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-lg)] ds:w-[min(22rem,calc(100vw-var(--spacing-xl)))] ds:text-center\">\n <Logo size=\"xl\" decorative />\n <RadixDialog.Title className=\"ds:sr-only\">\n {resolvedTitle}\n </RadixDialog.Title>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full\">\n <Button\n intent=\"primary\"\n startIcon={<EyeOff aria-hidden />}\n onClick={handleAction(onUnlock)}\n >\n {resolvedUnlockLabel}\n </Button>\n {onAccountPage ? (\n <Button\n intent=\"secondary\"\n startIcon={<User aria-hidden />}\n onClick={handleAction(onAccountPage)}\n >\n {resolvedAccountPageLabel}\n </Button>\n ) : null}\n {onSignOut ? (\n <Button\n intent=\"secondary\"\n startIcon={<LogOut aria-hidden />}\n onClick={handleAction(onSignOut)}\n >\n {resolvedSignOutLabel}\n </Button>\n ) : null}\n </div>\n <RadixDialog.Description className=\"type-body-sm ds:opacity-90\">\n {resolvedDescription}\n </RadixDialog.Description>\n </div>\n </RadixDialog.Content>\n </RadixDialog.Portal>\n </RadixDialog.Root>\n );\n },\n);\nPrivacyLock.displayName = 'PrivacyLock';\n"],"names":["privacyLockAgent","handle","PrivacyLock","forwardRef","open","defaultOpen","onOpenChange","onUnlock","onAccountPage","onSignOut","triggerIcon","triggerAriaLabel","triggerTooltip","title","description","unlockLabel","accountPageLabel","signOutLabel","className","rest","ref","t","useTranslation","uncontrolledOpen","setUncontrolledOpen","useState","isControlled","isOpen","setOpen","useCallback","next","latestOpenRef","useRef","triggerRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration","handleAction","callback","event","resolvedTriggerAriaLabel","resolvedTriggerTooltip","resolvedTitle","resolvedDescription","resolvedUnlockLabel","resolvedAccountPageLabel","resolvedSignOutLabel","RadixDialog","jsx","IconButton","EyeOff","jsxs","Logo","Button","User","LogOut"],"mappings":"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"}
|
|
@@ -2,14 +2,14 @@ import { jsx as e, jsxs as r, Fragment as V } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as F, useRef as T, useMemo as G, useImperativeHandle as X } from "react";
|
|
3
3
|
import { c as x } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as L } from "react-i18next";
|
|
5
|
-
import { E as ae } from "./empty-state-
|
|
5
|
+
import { E as ae } from "./empty-state-X0sVPfVo.js";
|
|
6
6
|
import { L as A } from "./link-CPb_pZPr.js";
|
|
7
7
|
import { S as _ } from "./separator-CYU_bGFn.js";
|
|
8
8
|
import { i as W } from "./is-safe-url-DkETxeHz.js";
|
|
9
9
|
import { u as J } from "./registry-DvAUVLHh.js";
|
|
10
10
|
import * as j from "@radix-ui/react-popover";
|
|
11
11
|
import { u as te } from "./use-controllable-state-BiY4xTzM.js";
|
|
12
|
-
import { I as Q } from "./icon-button-
|
|
12
|
+
import { I as Q } from "./icon-button-DA2CAGHZ.js";
|
|
13
13
|
import { S as re } from "./scroll-area-BZOvUhwQ.js";
|
|
14
14
|
import { S as R } from "./skeleton-CZbwyJAA.js";
|
|
15
15
|
import { T as de } from "./timestamp-BV2lC-wV.js";
|
|
@@ -675,4 +675,4 @@ export {
|
|
|
675
675
|
le as b,
|
|
676
676
|
ye as p
|
|
677
677
|
};
|
|
678
|
-
//# sourceMappingURL=product-hub-panel-
|
|
678
|
+
//# sourceMappingURL=product-hub-panel-BScCotGD.js.map
|