@alfadocs/ui-kit-debug 1.95.1 → 1.96.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/{anamnesis-card-BcadMmEM.js → anamnesis-card-BzuluoD1.js} +2 -2
- package/dist/_chunks/{anamnesis-card-BcadMmEM.js.map → anamnesis-card-BzuluoD1.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-card-DQ3iE1gD.js → anamnesis-summary-card-DdTRdNrQ.js} +2 -2
- package/dist/_chunks/{anamnesis-summary-card-DQ3iE1gD.js.map → anamnesis-summary-card-DdTRdNrQ.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-rows-krsCC-F4.js → anamnesis-summary-rows-CdRUXoaA.js} +3 -3
- package/dist/_chunks/{anamnesis-summary-rows-krsCC-F4.js.map → anamnesis-summary-rows-CdRUXoaA.js.map} +1 -1
- package/dist/_chunks/{antenatal-schedule-timeline-BGewPfEX.js → antenatal-schedule-timeline-DmsY5g28.js} +2 -2
- package/dist/_chunks/{antenatal-schedule-timeline-BGewPfEX.js.map → antenatal-schedule-timeline-DmsY5g28.js.map} +1 -1
- package/dist/_chunks/{balance-badge-cell-DbgEQsou.js → balance-badge-cell-DcBmtijD.js} +2 -2
- package/dist/_chunks/{balance-badge-cell-DbgEQsou.js.map → balance-badge-cell-DcBmtijD.js.map} +1 -1
- package/dist/_chunks/{bishop-score-BBYuyk2k.js → bishop-score-BhMomGcX.js} +2 -2
- package/dist/_chunks/{bishop-score-BBYuyk2k.js.map → bishop-score-BhMomGcX.js.map} +1 -1
- package/dist/_chunks/{bmi-calculator-BIExHBZV.js → bmi-calculator-NMkXc079.js} +2 -2
- package/dist/_chunks/{bmi-calculator-BIExHBZV.js.map → bmi-calculator-NMkXc079.js.map} +1 -1
- package/dist/_chunks/{calendar-appointment-editor-dialog-D3tQ8N34.js → calendar-appointment-editor-dialog-BOZ5wk96.js} +8 -8
- package/dist/_chunks/{calendar-appointment-editor-dialog-D3tQ8N34.js.map → calendar-appointment-editor-dialog-BOZ5wk96.js.map} +1 -1
- package/dist/_chunks/{card-BA4Ig_kn.js → card-C85_Ndhb.js} +96 -68
- package/dist/_chunks/card-C85_Ndhb.js.map +1 -0
- package/dist/_chunks/{clinical-note-card-Cut2lNmu.js → clinical-note-card-CWHFnCmY.js} +2 -2
- package/dist/_chunks/{clinical-note-card-Cut2lNmu.js.map → clinical-note-card-CWHFnCmY.js.map} +1 -1
- package/dist/_chunks/{connection-status-CVyCqxiY.js → connection-status-CWSU3eiq.js} +2 -2
- package/dist/_chunks/{connection-status-CVyCqxiY.js.map → connection-status-CWSU3eiq.js.map} +1 -1
- package/dist/_chunks/{contact-card-ClvEDM9e.js → contact-card-CymtNvy3.js} +2 -2
- package/dist/_chunks/{contact-card-ClvEDM9e.js.map → contact-card-CymtNvy3.js.map} +1 -1
- package/dist/_chunks/{contact-profile-card-CX45mZA3.js → contact-profile-card-jBf9U4At.js} +2 -2
- package/dist/_chunks/{contact-profile-card-CX45mZA3.js.map → contact-profile-card-jBf9U4At.js.map} +1 -1
- package/dist/_chunks/{cycle-calculator-CQkjVSD2.js → cycle-calculator-ZMDvToIm.js} +2 -2
- package/dist/_chunks/{cycle-calculator-CQkjVSD2.js.map → cycle-calculator-ZMDvToIm.js.map} +1 -1
- package/dist/_chunks/{data-table-tabs-DlTPtqoI.js → data-table-tabs-CcgU2lr5.js} +2 -2
- package/dist/_chunks/{data-table-tabs-DlTPtqoI.js.map → data-table-tabs-CcgU2lr5.js.map} +1 -1
- package/dist/_chunks/{data-table-Bh9_IEj4.js → data-table-xUDjZS_O.js} +2 -2
- package/dist/_chunks/{data-table-Bh9_IEj4.js.map → data-table-xUDjZS_O.js.map} +1 -1
- package/dist/_chunks/{document-preview-CL1xsnLS.js → document-preview-DWIQryMW.js} +2 -2
- package/dist/_chunks/{document-preview-CL1xsnLS.js.map → document-preview-DWIQryMW.js.map} +1 -1
- package/dist/_chunks/{due-date-calculator-NjTlmoFK.js → due-date-calculator-Dr2cDa64.js} +3 -3
- package/dist/_chunks/{due-date-calculator-NjTlmoFK.js.map → due-date-calculator-Dr2cDa64.js.map} +1 -1
- package/dist/_chunks/editable-currency-cell-renderer-BEaj2NT_.js +493 -0
- package/dist/_chunks/editable-currency-cell-renderer-BEaj2NT_.js.map +1 -0
- package/dist/_chunks/{entity-summary-B_bOloqP.js → entity-summary-BJdfIsk_.js} +2 -2
- package/dist/_chunks/{entity-summary-B_bOloqP.js.map → entity-summary-BJdfIsk_.js.map} +1 -1
- package/dist/_chunks/{face-scheme-DyHc3zPt.js → face-scheme-BmygzbZr.js} +2 -2
- package/dist/_chunks/{face-scheme-DyHc3zPt.js.map → face-scheme-BmygzbZr.js.map} +1 -1
- package/dist/_chunks/{fetal-weight-Brl3n4LN.js → fetal-weight-CkIwJgiH.js} +2 -2
- package/dist/_chunks/{fetal-weight-Brl3n4LN.js.map → fetal-weight-CkIwJgiH.js.map} +1 -1
- package/dist/_chunks/{file-manager-Cgf2yc10.js → file-manager-Ba_TcfCj.js} +2 -2
- package/dist/_chunks/{file-manager-Cgf2yc10.js.map → file-manager-Ba_TcfCj.js.map} +1 -1
- package/dist/_chunks/{finished-terminal-D8ohcFVS.js → finished-terminal-DXVAfhRr.js} +2 -2
- package/dist/_chunks/{finished-terminal-D8ohcFVS.js.map → finished-terminal-DXVAfhRr.js.map} +1 -1
- package/dist/_chunks/{forgot-password-form-BQPvDS7i.js → forgot-password-form-BCk4rGIh.js} +2 -2
- package/dist/_chunks/{forgot-password-form-BQPvDS7i.js.map → forgot-password-form-BCk4rGIh.js.map} +1 -1
- package/dist/_chunks/{gestational-age-calculator-Dn8IOXHB.js → gestational-age-calculator-CXcDKQqC.js} +3 -3
- package/dist/_chunks/{gestational-age-calculator-Dn8IOXHB.js.map → gestational-age-calculator-CXcDKQqC.js.map} +1 -1
- package/dist/_chunks/{hcg-doubling-DQe1ptNB.js → hcg-doubling-BJFR3onB.js} +2 -2
- package/dist/_chunks/{hcg-doubling-DQe1ptNB.js.map → hcg-doubling-BJFR3onB.js.map} +1 -1
- package/dist/_chunks/{header-settings-DittkpqU.js → header-settings-C2D74i4g.js} +2 -2
- package/dist/_chunks/{header-settings-DittkpqU.js.map → header-settings-C2D74i4g.js.map} +1 -1
- package/dist/_chunks/{heatmap-9Ql8Ny9d.js → heatmap-C9tEvqEm.js} +3 -3
- package/dist/_chunks/{heatmap-9Ql8Ny9d.js.map → heatmap-C9tEvqEm.js.map} +1 -1
- package/dist/_chunks/{icon-picker-Bkm9m7ju.js → icon-picker-DQMG9L6M.js} +2 -2
- package/dist/_chunks/{icon-picker-Bkm9m7ju.js.map → icon-picker-DQMG9L6M.js.map} +1 -1
- package/dist/_chunks/info-tip-Do3RFt60.js +216 -0
- package/dist/_chunks/info-tip-Do3RFt60.js.map +1 -0
- package/dist/_chunks/{kit-extensions-44gudqqq.js → kit-extensions-C4o_tFN4.js} +6 -6
- package/dist/_chunks/{kit-extensions-44gudqqq.js.map → kit-extensions-C4o_tFN4.js.map} +1 -1
- package/dist/_chunks/{locale-picker-DVvinQXU.js → locale-picker-B1NAHW4U.js} +2 -2
- package/dist/_chunks/{locale-picker-DVvinQXU.js.map → locale-picker-B1NAHW4U.js.map} +1 -1
- package/dist/_chunks/{login-dev-card-BZBR58mu.js → login-dev-card-DcfcFJrm.js} +2 -2
- package/dist/_chunks/{login-dev-card-BZBR58mu.js.map → login-dev-card-DcfcFJrm.js.map} +1 -1
- package/dist/_chunks/{marketplace-app-shell-C8nHixB8.js → marketplace-app-shell-DDZI-uBl.js} +3 -3
- package/dist/_chunks/{marketplace-app-shell-C8nHixB8.js.map → marketplace-app-shell-DDZI-uBl.js.map} +1 -1
- package/dist/_chunks/{notes-panel-D6YhNGHU.js → notes-panel-DfjF83IK.js} +4 -4
- package/dist/_chunks/{notes-panel-D6YhNGHU.js.map → notes-panel-DfjF83IK.js.map} +1 -1
- package/dist/_chunks/{operator-hero-D_0KoEuJ.js → operator-hero-N_ziNGFF.js} +2 -2
- package/dist/_chunks/{operator-hero-D_0KoEuJ.js.map → operator-hero-N_ziNGFF.js.map} +1 -1
- package/dist/_chunks/{patient-details-DQQpgx4A.js → patient-details-DGHkAErB.js} +3 -3
- package/dist/_chunks/{patient-details-DQQpgx4A.js.map → patient-details-DGHkAErB.js.map} +1 -1
- package/dist/_chunks/{patient-field-row-Cb5jUd5Q.js → patient-field-row-BVK4y98C.js} +2 -2
- package/dist/_chunks/{patient-field-row-Cb5jUd5Q.js.map → patient-field-row-BVK4y98C.js.map} +1 -1
- package/dist/_chunks/{patient-search-Cp2efqHs.js → patient-search-CL6dtBIq.js} +2 -2
- package/dist/_chunks/{patient-search-Cp2efqHs.js.map → patient-search-CL6dtBIq.js.map} +1 -1
- package/dist/_chunks/{patient-summary-card-BvMI0eMu.js → patient-summary-card-DXz07c2X.js} +3 -3
- package/dist/_chunks/{patient-summary-card-BvMI0eMu.js.map → patient-summary-card-DXz07c2X.js.map} +1 -1
- package/dist/_chunks/{payment-automation-upsell-D1YdO1xY.js → payment-automation-upsell-CZk6f8aK.js} +3 -3
- package/dist/_chunks/{payment-automation-upsell-D1YdO1xY.js.map → payment-automation-upsell-CZk6f8aK.js.map} +1 -1
- package/dist/_chunks/{payment-request-card-BfGauFY0.js → payment-request-card-BbpN8GQg.js} +2 -2
- package/dist/_chunks/{payment-request-card-BfGauFY0.js.map → payment-request-card-BbpN8GQg.js.map} +1 -1
- package/dist/_chunks/{periodontal-chart-_y4Ck7_P.js → periodontal-chart-Cw-ZsIls.js} +2 -2
- package/dist/_chunks/{periodontal-chart-_y4Ck7_P.js.map → periodontal-chart-Cw-ZsIls.js.map} +1 -1
- package/dist/_chunks/{periodontal-chart-card-Bx6PeS3b.js → periodontal-chart-card-CG8mxR62.js} +2 -2
- package/dist/_chunks/{periodontal-chart-card-Bx6PeS3b.js.map → periodontal-chart-card-CG8mxR62.js.map} +1 -1
- package/dist/_chunks/{periodontal-diagnosis-DD3hrg9X.js → periodontal-diagnosis-CF1d_0yl.js} +2 -2
- package/dist/_chunks/{periodontal-diagnosis-DD3hrg9X.js.map → periodontal-diagnosis-CF1d_0yl.js.map} +1 -1
- package/dist/_chunks/{periodontal-risk-chart-B7S9OmPC.js → periodontal-risk-chart-D2zyID0H.js} +2 -2
- package/dist/_chunks/{periodontal-risk-chart-B7S9OmPC.js.map → periodontal-risk-chart-D2zyID0H.js.map} +1 -1
- package/dist/_chunks/{popover-Da1ekjV1.js → popover-CN5IsOeS.js} +156 -148
- package/dist/_chunks/popover-CN5IsOeS.js.map +1 -0
- package/dist/_chunks/{practice-profile-hero-ClzE-4CB.js → practice-profile-hero-DKmnB-M0.js} +2 -2
- package/dist/_chunks/{practice-profile-hero-ClzE-4CB.js.map → practice-profile-hero-DKmnB-M0.js.map} +1 -1
- package/dist/_chunks/{pregnancy-dating-CuVj9KGR.js → pregnancy-dating-D0Kf9s7s.js} +3 -3
- package/dist/_chunks/{pregnancy-dating-CuVj9KGR.js.map → pregnancy-dating-D0Kf9s7s.js.map} +1 -1
- package/dist/_chunks/{pregnancy-weight-gain-BeQRxwdP.js → pregnancy-weight-gain-B_Zldlzq.js} +2 -2
- package/dist/_chunks/{pregnancy-weight-gain-BeQRxwdP.js.map → pregnancy-weight-gain-B_Zldlzq.js.map} +1 -1
- package/dist/_chunks/{privacy-mask-BDVkikTm.js → privacy-mask-DbEKI-Jv.js} +2 -2
- package/dist/_chunks/{privacy-mask-BDVkikTm.js.map → privacy-mask-DbEKI-Jv.js.map} +1 -1
- package/dist/_chunks/{registration-form-BygI73vG.js → registration-form-K4j2tdLt.js} +2 -2
- package/dist/_chunks/{registration-form-BygI73vG.js.map → registration-form-K4j2tdLt.js.map} +1 -1
- package/dist/_chunks/{reserved.agent-BvwjDyne.js → reserved.agent-TRbKB39d.js} +2 -2
- package/dist/_chunks/{reserved.agent-BvwjDyne.js.map → reserved.agent-TRbKB39d.js.map} +1 -1
- package/dist/_chunks/{reset-password-form-Cf9QPEJu.js → reset-password-form-C6XLV7SI.js} +2 -2
- package/dist/_chunks/{reset-password-form-Cf9QPEJu.js.map → reset-password-form-C6XLV7SI.js.map} +1 -1
- package/dist/_chunks/{reviews-panel-B7InBORU.js → reviews-panel-jPYgYvxG.js} +2 -2
- package/dist/_chunks/{reviews-panel-B7InBORU.js.map → reviews-panel-jPYgYvxG.js.map} +1 -1
- package/dist/_chunks/{rich-text-editor-iw2tJLKA.js → rich-text-editor-CJfT08It.js} +2 -2
- package/dist/_chunks/{rich-text-editor-iw2tJLKA.js.map → rich-text-editor-CJfT08It.js.map} +1 -1
- package/dist/_chunks/{section-card-D5nWiTcK.js → section-card-D1sV4Voz.js} +2 -2
- package/dist/_chunks/{section-card-D5nWiTcK.js.map → section-card-D1sV4Voz.js.map} +1 -1
- package/dist/_chunks/{send-registration-link-form-CZYOO7NO.js → send-registration-link-form-yLSfcaPk.js} +2 -2
- package/dist/_chunks/{send-registration-link-form-CZYOO7NO.js.map → send-registration-link-form-yLSfcaPk.js.map} +1 -1
- package/dist/_chunks/{stat-D2PNJujA.js → stat-Dno2ZihS.js} +111 -96
- package/dist/_chunks/stat-Dno2ZihS.js.map +1 -0
- package/dist/_chunks/{task-card-C4HJUKVw.js → task-card-TSJjuuDe.js} +2 -2
- package/dist/_chunks/{task-card-C4HJUKVw.js.map → task-card-TSJjuuDe.js.map} +1 -1
- package/dist/_chunks/{task-editor-BlGdXR9F.js → task-editor-qXfMbHsy.js} +2 -2
- package/dist/_chunks/{task-editor-BlGdXR9F.js.map → task-editor-qXfMbHsy.js.map} +1 -1
- package/dist/_chunks/{task-tray-DZQGhDdc.js → task-tray-DrXfMCuf.js} +2 -2
- package/dist/_chunks/{task-tray-DZQGhDdc.js.map → task-tray-DrXfMCuf.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-Q0CiEAff.js → tasks-panel-iVeuu9a8.js} +2 -2
- package/dist/_chunks/{tasks-panel-Q0CiEAff.js.map → tasks-panel-iVeuu9a8.js.map} +1 -1
- package/dist/_chunks/{timeline-BcYHdP56.js → timeline-B32dylRJ.js} +2 -2
- package/dist/_chunks/{timeline-BcYHdP56.js.map → timeline-B32dylRJ.js.map} +1 -1
- package/dist/_chunks/{use-appointment-details-read-CpXRSfPI.js → use-appointment-details-read-UXXvBeGZ.js} +5 -5
- package/dist/_chunks/{use-appointment-details-read-CpXRSfPI.js.map → use-appointment-details-read-UXXvBeGZ.js.map} +1 -1
- package/dist/_chunks/{workflow-map-BWJhlZbC.js → workflow-map-flsvqQ3L.js} +2 -2
- package/dist/_chunks/{workflow-map-BWJhlZbC.js.map → workflow-map-flsvqQ3L.js.map} +1 -1
- package/dist/_chunks/{workflow-webhook-action-Uhyfr6_6.js → workflow-webhook-action-BD-6UyOs.js} +2 -2
- package/dist/_chunks/{workflow-webhook-action-Uhyfr6_6.js.map → workflow-webhook-action-BD-6UyOs.js.map} +1 -1
- package/dist/ag-grid.css +3 -1
- package/dist/agent-catalog.json +2 -2
- package/dist/agent-i18n/en.json +1 -1
- package/dist/components/anamnesis-card/index.js +1 -1
- package/dist/components/anamnesis-summary-card/index.js +1 -1
- package/dist/components/appointment-details-panel/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/card/card.d.ts +10 -1
- package/dist/components/card/card.d.ts.map +1 -1
- package/dist/components/card/index.d.ts +1 -1
- package/dist/components/card/index.d.ts.map +1 -1
- package/dist/components/card/index.js +1 -1
- package/dist/components/clinical-note-card/index.js +1 -1
- package/dist/components/connection-status/index.js +1 -1
- package/dist/components/contact-card/index.js +1 -1
- package/dist/components/contact-profile-card/index.js +1 -1
- package/dist/components/cycle-calculator/index.js +1 -1
- package/dist/components/data-table/header-info.d.ts +31 -0
- package/dist/components/data-table/header-info.d.ts.map +1 -0
- package/dist/components/data-table/index.d.ts +1 -0
- package/dist/components/data-table/index.d.ts.map +1 -1
- package/dist/components/data-table/index.js +19 -18
- package/dist/components/data-table-tabs/index.js +1 -1
- package/dist/components/document-preview/index.js +1 -1
- package/dist/components/due-date-calculator/index.js +2 -2
- package/dist/components/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/file-manager/index.js +1 -1
- package/dist/components/finished-terminal/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-settings/index.js +1 -1
- package/dist/components/heatmap/index.js +1 -1
- package/dist/components/icon-picker/index.js +1 -1
- package/dist/components/info-tip/index.js +1 -1
- package/dist/components/info-tip/info-tip.agent.d.ts.map +1 -1
- package/dist/components/info-tip/info-tip.d.ts +21 -1
- package/dist/components/info-tip/info-tip.d.ts.map +1 -1
- package/dist/components/locale-picker/index.js +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/operator-hero/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/periodontal-diagnosis/index.js +1 -1
- package/dist/components/periodontal-risk-chart/index.js +1 -1
- package/dist/components/popover/index.js +1 -1
- package/dist/components/popover/popover.d.ts.map +1 -1
- package/dist/components/practice-profile-hero/index.js +1 -1
- package/dist/components/pregnancy-dating/index.js +1 -1
- package/dist/components/pregnancy-weight-gain/index.js +1 -1
- package/dist/components/reviews-panel/index.js +1 -1
- package/dist/components/rich-text-editor/index.js +2 -2
- package/dist/components/section-card/index.js +1 -1
- package/dist/components/stat/index.js +1 -1
- package/dist/components/stat/stat.d.ts +8 -0
- package/dist/components/stat/stat.d.ts.map +1 -1
- package/dist/components/task-card/index.js +1 -1
- package/dist/components/task-editor/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/timeline/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/i18n/locales/ar.d.ts +2 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +3 -1
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +2 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +3 -1
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +2 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +3 -1
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +2 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +3 -1
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +2 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +3 -1
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +2 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +3 -1
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +2 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +3 -1
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +2 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +3 -1
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +2 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +3 -1
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +2 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +3 -1
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +2 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +3 -1
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +2 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +3 -1
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +2 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +3 -1
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +2 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +3 -1
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +2 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +3 -1
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +2 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +3 -1
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +2 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +3 -1
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +2 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +3 -1
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +914 -913
- package/dist/locales/ar.json +3 -1
- package/dist/locales/de.json +3 -1
- package/dist/locales/el.json +3 -1
- package/dist/locales/en.json +3 -1
- package/dist/locales/es.json +3 -1
- package/dist/locales/fr.json +3 -1
- package/dist/locales/hi.json +3 -1
- package/dist/locales/it.json +3 -1
- package/dist/locales/ja.json +3 -1
- package/dist/locales/nl.json +3 -1
- package/dist/locales/pl.json +3 -1
- package/dist/locales/pt.json +3 -1
- package/dist/locales/ro.json +3 -1
- package/dist/locales/ru.json +3 -1
- package/dist/locales/sq.json +3 -1
- package/dist/locales/sv.json +3 -1
- package/dist/locales/tr.json +3 -1
- package/dist/locales/zh.json +3 -1
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/patterns/forgot-password-form/index.js +1 -1
- package/dist/patterns/login-form/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/registration-form/index.js +1 -1
- package/dist/patterns/reset-password-form/index.js +1 -1
- package/dist/patterns/send-registration-link-form/index.js +1 -1
- package/dist/patterns/workflow-webhook-action/index.js +1 -1
- package/dist/tokens.css +1 -0
- package/package.json +1 -1
- package/dist/_chunks/card-BA4Ig_kn.js.map +0 -1
- package/dist/_chunks/editable-currency-cell-renderer-BQYL5GjP.js +0 -412
- package/dist/_chunks/editable-currency-cell-renderer-BQYL5GjP.js.map +0 -1
- package/dist/_chunks/info-tip-Cfd5SKbY.js +0 -166
- package/dist/_chunks/info-tip-Cfd5SKbY.js.map +0 -1
- package/dist/_chunks/popover-Da1ekjV1.js.map +0 -1
- package/dist/_chunks/stat-D2PNJujA.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popover-CN5IsOeS.js","sources":["../../src/components/popover/popover.agent.ts","../../src/components/popover/popover.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PopoverHandle } from './popover';\n\nexport const popoverAgent: AgentAdapter<PopoverHandle> = {\n id: 'popover',\n capabilities: ['open', 'close'],\n state: {\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.popover.state.isOpen',\n description: 'True when the popover is currently open.',\n read: (handle) => handle.getIsOpen(),\n },\n },\n actions: {\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.popover.actions.open',\n description: 'Open the popover.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.popover.actions.close',\n description: 'Close the popover.',\n invoke: (handle) => {\n handle.close();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'popover' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on Popover.Root.',\n },\n },\n};\n","import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type HTMLAttributes,\n type MutableRefObject,\n type ReactNode,\n type Ref,\n} from 'react';\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { useAgentRegistration } from '../../agent';\nimport { composeRefs } from '../_shared/compose-refs';\nimport {\n findPopoverTrigger,\n useNonModalTabExit,\n} from '../_shared/non-modal-tab-exit';\nimport { popoverAgent } from './popover.agent';\n\ninterface PopoverA11yContext {\n headingId: string | undefined;\n setHeadingId: (id: string | undefined) => void;\n descriptionId: string | undefined;\n setDescriptionId: (id: string | undefined) => void;\n}\n\nconst A11yContext = createContext<PopoverA11yContext>({\n headingId: undefined,\n setHeadingId: () => {},\n descriptionId: undefined,\n setDescriptionId: () => {},\n});\n\ninterface PopoverHoverContext {\n isHoverMode: boolean;\n clearHoverTimer: () => void;\n closeWithDelay: () => void;\n}\n\nconst HoverContext = createContext<PopoverHoverContext>({\n isHoverMode: false,\n clearHoverTimer: () => {},\n closeWithDelay: () => {},\n});\n\ntype VirtualAnchorRef = ComponentPropsWithoutRef<\n typeof RadixPopover.Anchor\n>['virtualRef'];\n\n// Where a non-modal popover sits in reading order: Tab leaves to just after\n// its trigger, or its anchor when there is no trigger.\ninterface PopoverPlacementContext {\n modal: boolean;\n close: () => void;\n triggerRef: MutableRefObject<HTMLElement | null>;\n contentRef: MutableRefObject<HTMLElement | null>;\n anchorRef: MutableRefObject<HTMLElement | null>;\n virtualAnchorRef: MutableRefObject<VirtualAnchorRef>;\n}\n\nconst PlacementContext = createContext<PopoverPlacementContext | null>(null);\n\nfunction resolveAnchor(\n placement: PopoverPlacementContext | null,\n): HTMLElement | null {\n if (!placement) return null;\n const virtual = placement.virtualAnchorRef.current?.current;\n if (placement.triggerRef.current) return placement.triggerRef.current;\n if (virtual instanceof HTMLElement) return virtual;\n return placement.anchorRef.current;\n}\n\nfunction resolvePhysicalSide(\n logicalSide: 'start' | 'top' | 'end' | 'bottom',\n): 'left' | 'top' | 'right' | 'bottom' {\n if (logicalSide === 'top' || logicalSide === 'bottom') return logicalSide;\n const isRtl =\n typeof document !== 'undefined' && document.documentElement.dir === 'rtl';\n if (logicalSide === 'start') return isRtl ? 'right' : 'left';\n /* logicalSide === 'end' */\n return isRtl ? 'left' : 'right';\n}\n\nconst contentVariants = cva(\n [\n // `--card-border` 32% alpha provides a subtle edge that survives dark\n // without becoming a heavy outline. The previous transparent border\n // relied on the drop-shadow alone, which reads as a faint halo against\n // dark surfaces and lets the popover float as an unbounded blob; the\n // earlier heavy `--border` (grey-800 since WCAG 1.4.11 bump in 67fef8c)\n // overcorrected the other way and made the popover read as a charcoal\n // box. The forced-colors override below upgrades the border to\n // `CanvasText` so HCM still repaints a fully visible edge.\n 'ds:relative ds:bg-[var(--popover)] ds:border ds:border-[color:var(--card-border)] ds:rounded-[var(--radius-md)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:z-[var(--z-popover)]',\n 'ds:text-[var(--popover-foreground)] ds:text-[length:var(--font-size-sm)]',\n 'ds:break-words',\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=closed]:fade-out-0 ds:data-[state=open]:fade-in-0',\n 'ds:data-[state=closed]:zoom-out-95 ds:data-[state=open]:zoom-in-95',\n 'ds:data-[side=bottom]:slide-in-from-top-2 ds:data-[side=left]:slide-in-from-right-2',\n 'ds:data-[side=right]:slide-in-from-left-2 ds:data-[side=top]:slide-in-from-bottom-2',\n 'ds:motion-reduce:transition-none ds:motion-reduce:animate-none',\n 'ds:forced-colors:border-[CanvasText]',\n 'ds:focus-visible:outline-none',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:max-w-[var(--popover-size-sm)]',\n md: 'ds:max-w-[var(--popover-size-md)]',\n lg: 'ds:max-w-[var(--popover-size-lg)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\n// Curated agent-readiness handle — see popover.agent.ts.\nexport interface PopoverHandle {\n getIsOpen: () => boolean;\n open: () => void;\n close: () => void;\n}\n\nexport interface PopoverRootProps extends ComponentPropsWithoutRef<\n typeof RadixPopover.Root\n> {\n openOn?: 'click' | 'hover' | 'hover-or-click';\n /** Opaque instance id — forwarded to Popover.Content as `data-component-id`. */\n id?: string;\n children: ReactNode;\n}\n\nconst PopoverIdContext = createContext<string | undefined>(undefined);\n\nfunction PopoverRoot({\n openOn = 'click',\n children,\n id,\n open: controlledOpen,\n onOpenChange,\n defaultOpen,\n modal,\n}: PopoverRootProps) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen ?? false);\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n if (!isControlled) setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen);\n },\n [isControlled, onOpenChange],\n );\n\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const contentRef = useRef<HTMLElement | null>(null);\n const isHoverMode = openOn === 'hover' || openOn === 'hover-or-click';\n\n const clearHoverTimer = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n }, []);\n\n const openWithDelay = useCallback(() => {\n clearHoverTimer();\n hoverTimerRef.current = setTimeout(() => {\n handleOpenChange(true);\n }, 300);\n }, [clearHoverTimer, handleOpenChange]);\n\n const closeWithDelay = useCallback(() => {\n clearHoverTimer();\n hoverTimerRef.current = setTimeout(() => {\n // WCAG 1.4.13: content stays while focus is in it. A pointer leaving\n // must not close the card under a keyboard user's focus.\n const active = document.activeElement;\n const content = contentRef.current;\n if (active && content && content.contains(active)) return;\n handleOpenChange(false);\n }, 300);\n }, [clearHoverTimer, handleOpenChange]);\n\n useEffect(() => {\n return () => clearHoverTimer();\n }, [clearHoverTimer]);\n\n // Agent handle.\n const openRef = useRef(isOpen);\n useEffect(() => {\n openRef.current = isOpen;\n }, [isOpen]);\n\n const agentHandle = useMemo<PopoverHandle>(\n () => ({\n getIsOpen: () => openRef.current,\n open: () => handleOpenChange(true),\n close: () => handleOpenChange(false),\n }),\n [handleOpenChange],\n );\n useAgentRegistration(popoverAgent, agentHandle, id);\n\n const triggerRef = useRef<HTMLElement | null>(null);\n const anchorRef = useRef<HTMLElement | null>(null);\n const virtualAnchorRef = useRef<VirtualAnchorRef>(undefined);\n const placement = useMemo<PopoverPlacementContext>(\n () => ({\n modal: modal ?? false,\n close: () => handleOpenChange(false),\n triggerRef,\n contentRef,\n anchorRef,\n virtualAnchorRef,\n }),\n [modal, handleOpenChange],\n );\n\n /* a11y context state */\n const [headingId, setHeadingId] = useState<string | undefined>(undefined);\n const [descriptionId, setDescriptionId] = useState<string | undefined>(\n undefined,\n );\n\n const hoverHandlers = isHoverMode\n ? {\n onMouseEnter: openWithDelay,\n onMouseLeave: closeWithDelay,\n onFocus: () => {\n clearHoverTimer();\n handleOpenChange(true);\n },\n onBlur: closeWithDelay,\n }\n : {};\n\n return (\n <PopoverIdContext.Provider value={id}>\n <A11yContext.Provider\n value={{ headingId, setHeadingId, descriptionId, setDescriptionId }}\n >\n <HoverContext.Provider\n value={{ isHoverMode, clearHoverTimer, closeWithDelay }}\n >\n <PlacementContext.Provider value={placement}>\n <RadixPopover.Root\n open={isOpen}\n onOpenChange={handleOpenChange}\n modal={modal}\n >\n {isHoverMode ? (\n <span className=\"ds:inline-flex\" {...hoverHandlers}>\n {children}\n </span>\n ) : (\n children\n )}\n </RadixPopover.Root>\n </PlacementContext.Provider>\n </HoverContext.Provider>\n </A11yContext.Provider>\n </PopoverIdContext.Provider>\n );\n}\nPopoverRoot.displayName = 'Popover.Root';\n\nconst PopoverTrigger = forwardRef<\n HTMLButtonElement,\n ComponentPropsWithoutRef<typeof RadixPopover.Trigger>\n>(({ children, ...props }, ref) => {\n const triggerRef = useContext(PlacementContext)?.triggerRef;\n const composedRef = useMemo(\n () => composeRefs<HTMLElement>(ref, triggerRef),\n [ref, triggerRef],\n );\n return (\n <RadixPopover.Trigger ref={composedRef} {...props}>\n {children}\n </RadixPopover.Trigger>\n );\n});\nPopoverTrigger.displayName = 'Popover.Trigger';\n\n// Positions Content against an arbitrary element when a Trigger button is\n// unsuitable (e.g. an editor on a role=tab). Wraps Radix to record the anchor\n// for Tab order; props and ref pass straight through.\nconst PopoverAnchor = forwardRef<\n ElementRef<typeof RadixPopover.Anchor>,\n ComponentPropsWithoutRef<typeof RadixPopover.Anchor>\n>(({ virtualRef, ...props }, ref) => {\n const placement = useContext(PlacementContext);\n const anchorRef = placement?.anchorRef;\n const virtualAnchorRef = placement?.virtualAnchorRef;\n const composedRef = useMemo(\n () => composeRefs<HTMLElement>(ref, anchorRef),\n [ref, anchorRef],\n );\n useEffect(() => {\n if (!virtualAnchorRef) return;\n virtualAnchorRef.current = virtualRef;\n return () => {\n if (virtualAnchorRef.current === virtualRef) {\n virtualAnchorRef.current = undefined;\n }\n };\n }, [virtualAnchorRef, virtualRef]);\n return (\n <RadixPopover.Anchor ref={composedRef} virtualRef={virtualRef} {...props} />\n );\n});\nPopoverAnchor.displayName = 'Popover.Anchor';\n\nexport interface PopoverContentProps\n extends\n Omit<\n ComponentPropsWithoutRef<typeof RadixPopover.Content>,\n 'side' | 'align'\n >,\n VariantProps<typeof contentVariants> {\n side?: 'start' | 'top' | 'end' | 'bottom';\n align?: 'start' | 'center' | 'end';\n size?: 'sm' | 'md' | 'lg';\n showArrow?: boolean;\n className?: string;\n children: ReactNode;\n}\n\nconst PopoverContent = forwardRef<HTMLDivElement, PopoverContentProps>(\n (\n {\n side = 'bottom',\n align = 'center',\n size = 'md',\n showArrow = true,\n className,\n children,\n onKeyDown,\n onFocus,\n onCloseAutoFocus,\n ...props\n },\n ref,\n ) => {\n const { headingId, descriptionId } = useContext(A11yContext);\n const instanceId = useContext(PopoverIdContext);\n const {\n isHoverMode: isHover,\n clearHoverTimer: cancelTimer,\n closeWithDelay: delayClose,\n } = useContext(HoverContext);\n const physicalSide = resolvePhysicalSide(side);\n\n const placement = useContext(PlacementContext);\n const contentRefSink = placement?.contentRef;\n const composedContentRef = useMemo(\n () =>\n composeRefs<HTMLDivElement>(\n ref,\n contentRefSink as Ref<HTMLDivElement> | undefined,\n ),\n [ref, contentRefSink],\n );\n const getAnchor = useCallback(\n (content: HTMLElement) =>\n resolveAnchor(placement) ?? findPopoverTrigger(content),\n [placement],\n );\n // A hover popover shows while its trigger has focus, so it stays open there.\n const exitOnTab = useNonModalTabExit(!placement?.modal, {\n getAnchor,\n onReturnToTrigger: isHover ? undefined : placement?.close,\n });\n // The document Tab carried focus out into. If focus still rests there when\n // the popover closes, the consumer's focus return is skipped.\n const tabbedOutRef = useRef<Document | null>(null);\n\n const contentHoverHandlers = isHover\n ? {\n onMouseEnter: cancelTimer,\n onMouseLeave: delayClose,\n onBlur: delayClose,\n }\n : {};\n const handleFocus = onFocus ?? (isHover ? cancelTimer : undefined);\n\n return (\n <RadixPopover.Portal>\n <RadixPopover.Content\n ref={composedContentRef}\n side={physicalSide}\n align={align}\n sideOffset={8}\n collisionPadding={8}\n aria-labelledby={headingId}\n aria-describedby={descriptionId}\n className={contentVariants({ size, className })}\n data-component=\"popover\"\n data-component-id={instanceId}\n {...contentHoverHandlers}\n {...props}\n onFocus={(event) => {\n tabbedOutRef.current = null;\n handleFocus?.(event);\n }}\n onKeyDown={(event) => {\n const content = event.currentTarget;\n const doc = content.ownerDocument;\n const wasInside = content.contains(doc.activeElement);\n onKeyDown?.(event);\n exitOnTab(event);\n const isOut = !content.contains(doc.activeElement);\n if (event.key === 'Tab' && wasInside && isOut) {\n tabbedOutRef.current = doc;\n }\n }}\n onCloseAutoFocus={(event) => {\n const doc = tabbedOutRef.current;\n tabbedOutRef.current = null;\n const resting = doc?.activeElement;\n if (doc && resting && resting !== doc.body) {\n event.preventDefault();\n return;\n }\n onCloseAutoFocus?.(event);\n }}\n >\n {children}\n {showArrow && (\n <RadixPopover.Arrow\n width={12}\n height={6}\n className=\"ds:fill-[var(--popover)]\"\n />\n )}\n </RadixPopover.Content>\n </RadixPopover.Portal>\n );\n },\n);\nPopoverContent.displayName = 'Popover.Content';\n\nconst PopoverClose = forwardRef<HTMLButtonElement, { className?: string }>(\n ({ className }, ref) => {\n const { t } = useTranslation('ui');\n\n return (\n <div\n className={[\n 'ds:absolute ds:top-[var(--spacing-sm)] ds:end-[var(--spacing-sm)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <RadixPopover.Close asChild>\n <IconButton\n ref={ref}\n icon={<X />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={t('common.close', 'Close')}\n />\n </RadixPopover.Close>\n </div>\n );\n },\n);\nPopoverClose.displayName = 'Popover.Close';\n\ninterface PopoverHeadingProps extends HTMLAttributes<HTMLHeadingElement> {\n as?: 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n}\n\nconst PopoverHeading = forwardRef<HTMLHeadingElement, PopoverHeadingProps>(\n ({ as: Tag = 'h3', className, ...props }, ref) => {\n const generatedId = useId();\n const { setHeadingId } = useContext(A11yContext);\n\n useEffect(() => {\n setHeadingId(generatedId);\n return () => setHeadingId(undefined);\n }, [generatedId, setHeadingId]);\n\n return (\n <Tag\n ref={ref}\n id={generatedId}\n className={[\n 'type-title-item ds:leading-snug ds:break-words',\n 'ds:pe-[var(--spacing-xl)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n );\n },\n);\nPopoverHeading.displayName = 'Popover.Heading';\n\n/**\n * The popover's description region.\n *\n * A `div`, not a `p`. A popover body routinely holds structured content —\n * the calendar's hover peek puts `KeyValuePair`s in here — and a `p` may\n * only contain phrasing content, so the browser silently closed the\n * paragraph and re-parented the rest. That breaks the DOM the\n * `aria-describedby` region points at, so the description a screen reader\n * announces was not the description on screen. React said so on every\n * open: \"validateDOMNesting: <div> cannot appear as a descendant of <p>\".\n *\n * The accessible wiring is by id, not by tag, so nothing about the\n * announcement depends on the element being a paragraph.\n */\nconst PopoverDescription = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const generatedId = useId();\n const { setDescriptionId } = useContext(A11yContext);\n\n useEffect(() => {\n setDescriptionId(generatedId);\n return () => setDescriptionId(undefined);\n }, [generatedId, setDescriptionId]);\n\n return (\n <div\n ref={ref}\n id={generatedId}\n className={[\n 'ds:text-[var(--muted-foreground)] type-body-sm ds:mt-[var(--spacing-xs)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n );\n});\nPopoverDescription.displayName = 'Popover.Description';\n\nexport const Popover = Object.assign(PopoverRoot, {\n Root: PopoverRoot,\n Trigger: PopoverTrigger,\n Anchor: PopoverAnchor,\n Content: PopoverContent,\n Close: PopoverClose,\n Heading: PopoverHeading,\n Description: PopoverDescription,\n});\n\nexport type { PopoverRootProps as PopoverProps, PopoverHeadingProps };\n"],"names":["popoverAgent","handle","A11yContext","createContext","HoverContext","PlacementContext","resolveAnchor","placement","virtual","_a","resolvePhysicalSide","logicalSide","isRtl","contentVariants","cva","PopoverIdContext","PopoverRoot","openOn","children","id","controlledOpen","onOpenChange","defaultOpen","modal","internalOpen","setInternalOpen","useState","isControlled","isOpen","handleOpenChange","useCallback","nextOpen","hoverTimerRef","useRef","contentRef","isHoverMode","clearHoverTimer","openWithDelay","closeWithDelay","active","content","useEffect","openRef","agentHandle","useMemo","useAgentRegistration","triggerRef","anchorRef","virtualAnchorRef","headingId","setHeadingId","descriptionId","setDescriptionId","hoverHandlers","jsx","RadixPopover","PopoverTrigger","forwardRef","props","ref","useContext","composedRef","composeRefs","PopoverAnchor","virtualRef","PopoverContent","side","align","size","showArrow","className","onKeyDown","onFocus","onCloseAutoFocus","instanceId","isHover","cancelTimer","delayClose","physicalSide","contentRefSink","composedContentRef","getAnchor","findPopoverTrigger","exitOnTab","useNonModalTabExit","tabbedOutRef","contentHoverHandlers","handleFocus","jsxs","event","doc","wasInside","isOut","resting","PopoverClose","t","useTranslation","IconButton","X","PopoverHeading","Tag","generatedId","useId","PopoverDescription","Popover"],"mappings":"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"}
|
package/dist/_chunks/{practice-profile-hero-ClzE-4CB.js → practice-profile-hero-DKmnB-M0.js}
RENAMED
|
@@ -3,7 +3,7 @@ import { forwardRef as S, useId as A, useState as E, useEffect as K, useMemo as
|
|
|
3
3
|
import { c as F } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { A as w } from "./avatar-a6042Ox2.js";
|
|
5
5
|
import { B as L } from "./badge-BUk4RjTS.js";
|
|
6
|
-
import { C } from "./card-
|
|
6
|
+
import { C } from "./card-C85_Ndhb.js";
|
|
7
7
|
import { R as W } from "./rating-CGYpg5dj.js";
|
|
8
8
|
import { u as $ } from "./use-isomorphic-layout-effect-BGfaCOP1.js";
|
|
9
9
|
import { u as q } from "./registry-DvAUVLHh.js";
|
|
@@ -236,4 +236,4 @@ export {
|
|
|
236
236
|
J as P,
|
|
237
237
|
D as p
|
|
238
238
|
};
|
|
239
|
-
//# sourceMappingURL=practice-profile-hero-
|
|
239
|
+
//# sourceMappingURL=practice-profile-hero-DKmnB-M0.js.map
|
package/dist/_chunks/{practice-profile-hero-ClzE-4CB.js.map → practice-profile-hero-DKmnB-M0.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"practice-profile-hero-ClzE-4CB.js","sources":["../../src/components/practice-profile-hero/practice-profile-hero.agent.ts","../../src/components/practice-profile-hero/practice-profile-hero.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PracticeProfileHeroHandle } from './practice-profile-hero';\n\nexport const practiceProfileHeroAgent: AgentAdapter<PracticeProfileHeroHandle> =\n {\n id: 'practice-profile-hero',\n // Purely observable hero region — no interactive affordances and no\n // imperative actions on the handle (getName / getHasCover are read-only\n // projections).\n capabilities: [],\n state: {\n name: {\n type: 'string',\n descriptionKey: 'ui.agent.practiceProfileHero.state.name',\n description: 'Practice display name currently rendered.',\n read: (handle) => handle.getName(),\n },\n hasCover: {\n type: 'boolean',\n descriptionKey: 'ui.agent.practiceProfileHero.state.hasCover',\n description:\n 'Whether a cover-image strip is rendered. Structural flag only — never the image URL or any PHI.',\n read: (handle) => handle.getHasCover(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'practice-profile-hero',\n description: 'Marks the PracticeProfileHero root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n };\n","import {\n forwardRef,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { Avatar } from '../avatar/avatar';\nimport { Badge } from '../badge/badge';\nimport { Card } from '../card/card';\nimport { Rating } from '../rating/rating';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { practiceProfileHeroAgent } from './practice-profile-hero.agent';\n\n/* -------------------------------------------------------------------- */\n/* PracticeProfileHero */\n/* */\n/* The practice-page counterpart to `<OperatorHero>` — the top-of-page */\n/* hero for a practice profile (booking site `/p/<seoUrl>`, marketplace */\n/* practice views). Differences from the operator hero: */\n/* */\n/* - Optional cover strip: renders ONLY when `coverImageUrl` is set. */\n/* A practice without a configured cover image gets no strip at all */\n/* — never an empty brand-gradient band eating page space. */\n/* - Larger avatar at desktop widths (3xl), stepped down to xl and */\n/* stacked above the text on small viewports so the practice name, */\n/* tagline and rating keep the full line width on phones. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* CVA */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n // Matches the kit's other `surface` props (Booking, ReviewsPanel,\n // OperatorHero). `'elevated'` wraps in `<Card>`.\n surface: {\n flat: '',\n elevated: '',\n },\n },\n defaultVariants: {\n surface: 'elevated',\n },\n});\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\nexport interface PracticeProfileHeroBadge {\n /** Display key — i18n is up to the consumer. */\n key: string;\n /** Display label. */\n label: string;\n /** Badge variant — falls back to `neutral`. */\n variant?: 'neutral' | 'info' | 'success' | 'warning' | 'error';\n}\n\nexport interface PracticeProfileHeroRating {\n /** Mean rating, 0–5. */\n value: number;\n /** Total number of reviews. */\n count: number;\n}\n\nexport interface PracticeProfileHeroHandle {\n getName: () => string;\n /** Structural flag — whether a cover strip is rendered. No PHI. */\n getHasCover: () => boolean;\n}\n\nexport interface PracticeProfileHeroProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children'\n> {\n /** Practice display name. Rendered as the H1 heading. */\n name: string;\n /** Slogan / tagline subtitle (e.g. \"15 anni di esperienza nel cuore di Brera\"). */\n tagline?: string;\n /**\n * Optional practice photo / logo URL. The kit always renders an\n * `<Avatar>` — when `imageUrl` is missing the avatar falls back to\n * initials.\n */\n imageUrl?: string;\n /**\n * Text alternative for the photo's `<img>`, for image search and crawlers.\n * Pass the practice name. Leave it out and the photo stays decorative\n * (`alt=\"\"`), as before. Added in 1.91.0.\n */\n imageAlt?: string;\n /**\n * Optional cover image painted as a full-width strip above the body.\n * The strip renders ONLY when this is set — a practice without a cover\n * image gets no strip (and no empty gradient band). While the image\n * loads, the brand gradient shows in the strip. If it fails to load\n * (404, 401, not an image), the strip goes, as if no cover had been\n * passed, and `data-has-cover` reads `\"false\"`. A different URL tries\n * again.\n */\n coverImageUrl?: string;\n /** Rating summary — when present, renders a Rating + numeric breakdown line. */\n rating?: PracticeProfileHeroRating;\n /**\n * Optional badge row beneath the rating. Use sparingly — 1–3 chips\n * suit the hero's density; longer lists belong in `<ContactProfileCard>`.\n */\n badges?: PracticeProfileHeroBadge[];\n\n /* ----- Slots ----- */\n\n /**\n * Rendered at the inline-end of the heading row (right side on LTR)\n * from `sm` up. The heading row wraps, so on a phone the action drops\n * onto its own line, starts flush with the practice name, and is free\n * to shrink into the column rather than overflow it.\n *\n * Use for a \"Book an appointment\" `<Button>` or a share action.\n */\n actionSlot?: ReactNode;\n\n /* ----- Styling ----- */\n\n /**\n * `elevated` (default) wraps in `<Card variant=\"elevated\">`. `flat`\n * drops the Card — use inside another card / sheet.\n */\n surface?: 'flat' | 'elevated';\n\n /* ----- a11y ----- */\n\n 'aria-label'?: string;\n id?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const PracticeProfileHero = forwardRef<\n HTMLDivElement,\n PracticeProfileHeroProps\n>(\n (\n {\n name,\n tagline,\n imageUrl,\n imageAlt,\n coverImageUrl,\n rating,\n badges,\n actionSlot,\n surface = 'elevated',\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const headingId = useId();\n\n // HTP-6708. A CSS background cannot report a failed load, so the URL\n // is probed with an Image (the browser serves both from one request).\n // The strip reserves its height while the image loads, with the brand\n // gradient showing: a cover that loads causes no layout shift, and one\n // that fails removes the strip in a single step. The outcome is kept\n // per URL, so a new URL starts loading again and is retried.\n const [coverOutcome, setCoverOutcome] = useState<{\n url: string;\n status: 'loaded' | 'error';\n } | null>(null);\n const coverStatus =\n coverImageUrl && coverOutcome?.url === coverImageUrl\n ? coverOutcome.status\n : 'loading';\n useEffect(() => {\n if (!coverImageUrl || typeof Image === 'undefined') return undefined;\n let current = true;\n const probe = new Image();\n probe.onload = () => {\n if (current) setCoverOutcome({ url: coverImageUrl, status: 'loaded' });\n };\n probe.onerror = () => {\n if (current) setCoverOutcome({ url: coverImageUrl, status: 'error' });\n };\n probe.src = coverImageUrl;\n return () => {\n current = false;\n probe.onload = null;\n probe.onerror = null;\n };\n }, [coverImageUrl]);\n const hasCover = Boolean(coverImageUrl) && coverStatus !== 'error';\n\n // Memoised so the registry doesn't see a fresh handle identity (and\n // fire unregister+register) on every render — mirrors Booking.\n const agentHandle = useMemo(\n () => ({ getName: () => name, getHasCover: () => hasCover }),\n [name, hasCover],\n );\n useAgentRegistration(practiceProfileHeroAgent, agentHandle, id);\n\n // Cover image URL lands as a component-scoped CSS custom property set\n // imperatively on a ref — mirrors the Avatar `--avatar-color-override`\n // idiom so no `style={{…}}` attribute lands on the JSX (constraint §4).\n const coverRef = useRef<HTMLDivElement>(null);\n useIsomorphicLayoutEffect(() => {\n const el = coverRef.current;\n if (!el) return;\n if (coverImageUrl) {\n el.style.setProperty(\n '--practice-profile-hero-cover',\n `url(\"${coverImageUrl.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\")`,\n );\n } else {\n el.style.removeProperty('--practice-profile-hero-cover');\n }\n // `hasCover`: the strip can come back (a new URL after a failure),\n // and the new element needs the property too.\n }, [coverImageUrl, hasCover]);\n\n const cover = hasCover ? (\n <div\n ref={coverRef}\n aria-hidden=\"true\"\n data-slot=\"cover\"\n data-state={coverStatus}\n className={[\n 'ds:h-32 ds:sm:h-40 ds:w-full',\n // Cover image layered over the brand gradient — the gradient is\n // the visible underlay while the image streams in. A failed image\n // removes the strip (see above). The `none` fallback keeps the\n // declaration valid before the layout effect sets the custom\n // property (SSR / first paint).\n 'ds:bg-[image:var(--practice-profile-hero-cover,none),var(--gradient-hero-brand)]',\n 'ds:bg-cover ds:bg-center',\n ].join(' ')}\n />\n ) : null;\n\n // Decorative unless the caller wrote alt text for a photo that shows.\n const photoHidden = !(imageUrl && imageAlt);\n\n const body = (\n <div\n className={[\n // Phones: stacked column, smaller avatar — the practice name,\n // tagline and rating keep the full line width instead of being\n // squeezed beside a 3xl avatar. sm+: classic row layout.\n 'ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-md)]',\n 'ds:sm:flex-row ds:sm:gap-[var(--spacing-lg)]',\n ].join(' ')}\n >\n {/* Responsive avatar — `ds:hidden` removes the inactive size from\n both the layout and the accessibility tree. Without `imageAlt`\n both renders are aria-hidden: the H1 right beside them already\n carries the practice name, so the avatar is decorative. With\n `imageAlt` (and a photo) the photo is reachable and its alt is\n what a screen reader reads (HTP-7074). */}\n {/* HTP-6712: the practice photo is a 4:3 rounded rectangle, filled\n and cropped from the centre. It keeps the old circle's height\n (64px on phones, 192px from sm), so the hero does not grow. */}\n <div className=\"ds:shrink-0 ds:sm:hidden\">\n <Avatar\n size=\"xl\"\n shape=\"rounded\"\n ratio=\"4:3\"\n name={name}\n src={imageUrl}\n alt={imageAlt}\n aria-hidden={photoHidden ? 'true' : undefined}\n />\n </div>\n <div className=\"ds:hidden ds:shrink-0 ds:sm:block\">\n <Avatar\n size=\"3xl\"\n shape=\"rounded\"\n ratio=\"4:3\"\n name={name}\n src={imageUrl}\n alt={imageAlt}\n aria-hidden={photoHidden ? 'true' : undefined}\n />\n </div>\n <div className=\"ds:flex ds:w-full ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-start ds:gap-[var(--spacing-md)]\">\n {/* The practice's own words (name, tagline) keep the direction\n they were typed in, not the page's: `dir=\"auto\"`. */}\n <h1\n id={headingId}\n dir=\"auto\"\n className=\"type-title-page ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {name}\n </h1>\n {actionSlot ? (\n // `ms-auto` + `shrink-0` are the desktop contract, and both are\n // wrong once the row wraps on a phone: they stranded the action\n // at the inline-end of a start-aligned stack and stopped a wide\n // control fitting the column. Hence `sm:` and up only.\n <div className=\"ds:flex ds:min-w-0 ds:items-center ds:gap-[var(--spacing-xs)] ds:sm:ms-auto ds:sm:shrink-0\">\n {actionSlot}\n </div>\n ) : null}\n </div>\n {tagline ? (\n <p\n dir=\"auto\"\n className=\"type-body ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {tagline}\n </p>\n ) : null}\n {rating ? (\n // Rating owns the whole line: locale-formatted value, plural-\n // aware review count, and a single role=\"img\" announcement.\n <Rating\n value={rating.value}\n max={5}\n size=\"md\"\n reviews={{ count: rating.count }}\n />\n ) : null}\n {badges && badges.length > 0 ? (\n <div\n role=\"list\"\n className=\"ds:mt-[var(--spacing-2xs)] ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-2xs)]\"\n >\n {badges.map((badge) => (\n <Badge\n key={badge.key}\n variant={badge.variant ?? 'neutral'}\n role=\"listitem\"\n >\n {badge.label}\n </Badge>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n );\n\n return (\n <div\n ref={ref}\n role=\"region\"\n // A consumer-supplied aria-label wins; otherwise the region is\n // named by the practice-name H1 via aria-labelledby.\n aria-label={ariaLabel}\n aria-labelledby={ariaLabel ? undefined : headingId}\n data-component=\"practice-profile-hero\"\n data-component-id={id}\n data-has-cover={hasCover ? 'true' : 'false'}\n id={id}\n className={rootVariants({ surface, className })}\n {...rest}\n >\n {surface === 'elevated' ? (\n <Card variant=\"elevated\">\n {cover}\n <Card.Body>{body}</Card.Body>\n </Card>\n ) : (\n <>\n {cover}\n <div className=\"ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]\">\n {body}\n </div>\n </>\n )}\n </div>\n );\n },\n);\n\nPracticeProfileHero.displayName = 'PracticeProfileHero';\n"],"names":["practiceProfileHeroAgent","handle","rootVariants","cva","PracticeProfileHero","forwardRef","name","tagline","imageUrl","imageAlt","coverImageUrl","rating","badges","actionSlot","surface","ariaLabel","id","className","rest","ref","headingId","useId","coverOutcome","setCoverOutcome","useState","coverStatus","useEffect","current","probe","hasCover","agentHandle","useMemo","useAgentRegistration","coverRef","useRef","useIsomorphicLayoutEffect","el","cover","jsx","photoHidden","body","jsxs","Avatar","Rating","badge","Badge","Card","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"practice-profile-hero-DKmnB-M0.js","sources":["../../src/components/practice-profile-hero/practice-profile-hero.agent.ts","../../src/components/practice-profile-hero/practice-profile-hero.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PracticeProfileHeroHandle } from './practice-profile-hero';\n\nexport const practiceProfileHeroAgent: AgentAdapter<PracticeProfileHeroHandle> =\n {\n id: 'practice-profile-hero',\n // Purely observable hero region — no interactive affordances and no\n // imperative actions on the handle (getName / getHasCover are read-only\n // projections).\n capabilities: [],\n state: {\n name: {\n type: 'string',\n descriptionKey: 'ui.agent.practiceProfileHero.state.name',\n description: 'Practice display name currently rendered.',\n read: (handle) => handle.getName(),\n },\n hasCover: {\n type: 'boolean',\n descriptionKey: 'ui.agent.practiceProfileHero.state.hasCover',\n description:\n 'Whether a cover-image strip is rendered. Structural flag only — never the image URL or any PHI.',\n read: (handle) => handle.getHasCover(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'practice-profile-hero',\n description: 'Marks the PracticeProfileHero root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n };\n","import {\n forwardRef,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { Avatar } from '../avatar/avatar';\nimport { Badge } from '../badge/badge';\nimport { Card } from '../card/card';\nimport { Rating } from '../rating/rating';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { practiceProfileHeroAgent } from './practice-profile-hero.agent';\n\n/* -------------------------------------------------------------------- */\n/* PracticeProfileHero */\n/* */\n/* The practice-page counterpart to `<OperatorHero>` — the top-of-page */\n/* hero for a practice profile (booking site `/p/<seoUrl>`, marketplace */\n/* practice views). Differences from the operator hero: */\n/* */\n/* - Optional cover strip: renders ONLY when `coverImageUrl` is set. */\n/* A practice without a configured cover image gets no strip at all */\n/* — never an empty brand-gradient band eating page space. */\n/* - Larger avatar at desktop widths (3xl), stepped down to xl and */\n/* stacked above the text on small viewports so the practice name, */\n/* tagline and rating keep the full line width on phones. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* CVA */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n // Matches the kit's other `surface` props (Booking, ReviewsPanel,\n // OperatorHero). `'elevated'` wraps in `<Card>`.\n surface: {\n flat: '',\n elevated: '',\n },\n },\n defaultVariants: {\n surface: 'elevated',\n },\n});\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\nexport interface PracticeProfileHeroBadge {\n /** Display key — i18n is up to the consumer. */\n key: string;\n /** Display label. */\n label: string;\n /** Badge variant — falls back to `neutral`. */\n variant?: 'neutral' | 'info' | 'success' | 'warning' | 'error';\n}\n\nexport interface PracticeProfileHeroRating {\n /** Mean rating, 0–5. */\n value: number;\n /** Total number of reviews. */\n count: number;\n}\n\nexport interface PracticeProfileHeroHandle {\n getName: () => string;\n /** Structural flag — whether a cover strip is rendered. No PHI. */\n getHasCover: () => boolean;\n}\n\nexport interface PracticeProfileHeroProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children'\n> {\n /** Practice display name. Rendered as the H1 heading. */\n name: string;\n /** Slogan / tagline subtitle (e.g. \"15 anni di esperienza nel cuore di Brera\"). */\n tagline?: string;\n /**\n * Optional practice photo / logo URL. The kit always renders an\n * `<Avatar>` — when `imageUrl` is missing the avatar falls back to\n * initials.\n */\n imageUrl?: string;\n /**\n * Text alternative for the photo's `<img>`, for image search and crawlers.\n * Pass the practice name. Leave it out and the photo stays decorative\n * (`alt=\"\"`), as before. Added in 1.91.0.\n */\n imageAlt?: string;\n /**\n * Optional cover image painted as a full-width strip above the body.\n * The strip renders ONLY when this is set — a practice without a cover\n * image gets no strip (and no empty gradient band). While the image\n * loads, the brand gradient shows in the strip. If it fails to load\n * (404, 401, not an image), the strip goes, as if no cover had been\n * passed, and `data-has-cover` reads `\"false\"`. A different URL tries\n * again.\n */\n coverImageUrl?: string;\n /** Rating summary — when present, renders a Rating + numeric breakdown line. */\n rating?: PracticeProfileHeroRating;\n /**\n * Optional badge row beneath the rating. Use sparingly — 1–3 chips\n * suit the hero's density; longer lists belong in `<ContactProfileCard>`.\n */\n badges?: PracticeProfileHeroBadge[];\n\n /* ----- Slots ----- */\n\n /**\n * Rendered at the inline-end of the heading row (right side on LTR)\n * from `sm` up. The heading row wraps, so on a phone the action drops\n * onto its own line, starts flush with the practice name, and is free\n * to shrink into the column rather than overflow it.\n *\n * Use for a \"Book an appointment\" `<Button>` or a share action.\n */\n actionSlot?: ReactNode;\n\n /* ----- Styling ----- */\n\n /**\n * `elevated` (default) wraps in `<Card variant=\"elevated\">`. `flat`\n * drops the Card — use inside another card / sheet.\n */\n surface?: 'flat' | 'elevated';\n\n /* ----- a11y ----- */\n\n 'aria-label'?: string;\n id?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const PracticeProfileHero = forwardRef<\n HTMLDivElement,\n PracticeProfileHeroProps\n>(\n (\n {\n name,\n tagline,\n imageUrl,\n imageAlt,\n coverImageUrl,\n rating,\n badges,\n actionSlot,\n surface = 'elevated',\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const headingId = useId();\n\n // HTP-6708. A CSS background cannot report a failed load, so the URL\n // is probed with an Image (the browser serves both from one request).\n // The strip reserves its height while the image loads, with the brand\n // gradient showing: a cover that loads causes no layout shift, and one\n // that fails removes the strip in a single step. The outcome is kept\n // per URL, so a new URL starts loading again and is retried.\n const [coverOutcome, setCoverOutcome] = useState<{\n url: string;\n status: 'loaded' | 'error';\n } | null>(null);\n const coverStatus =\n coverImageUrl && coverOutcome?.url === coverImageUrl\n ? coverOutcome.status\n : 'loading';\n useEffect(() => {\n if (!coverImageUrl || typeof Image === 'undefined') return undefined;\n let current = true;\n const probe = new Image();\n probe.onload = () => {\n if (current) setCoverOutcome({ url: coverImageUrl, status: 'loaded' });\n };\n probe.onerror = () => {\n if (current) setCoverOutcome({ url: coverImageUrl, status: 'error' });\n };\n probe.src = coverImageUrl;\n return () => {\n current = false;\n probe.onload = null;\n probe.onerror = null;\n };\n }, [coverImageUrl]);\n const hasCover = Boolean(coverImageUrl) && coverStatus !== 'error';\n\n // Memoised so the registry doesn't see a fresh handle identity (and\n // fire unregister+register) on every render — mirrors Booking.\n const agentHandle = useMemo(\n () => ({ getName: () => name, getHasCover: () => hasCover }),\n [name, hasCover],\n );\n useAgentRegistration(practiceProfileHeroAgent, agentHandle, id);\n\n // Cover image URL lands as a component-scoped CSS custom property set\n // imperatively on a ref — mirrors the Avatar `--avatar-color-override`\n // idiom so no `style={{…}}` attribute lands on the JSX (constraint §4).\n const coverRef = useRef<HTMLDivElement>(null);\n useIsomorphicLayoutEffect(() => {\n const el = coverRef.current;\n if (!el) return;\n if (coverImageUrl) {\n el.style.setProperty(\n '--practice-profile-hero-cover',\n `url(\"${coverImageUrl.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\")`,\n );\n } else {\n el.style.removeProperty('--practice-profile-hero-cover');\n }\n // `hasCover`: the strip can come back (a new URL after a failure),\n // and the new element needs the property too.\n }, [coverImageUrl, hasCover]);\n\n const cover = hasCover ? (\n <div\n ref={coverRef}\n aria-hidden=\"true\"\n data-slot=\"cover\"\n data-state={coverStatus}\n className={[\n 'ds:h-32 ds:sm:h-40 ds:w-full',\n // Cover image layered over the brand gradient — the gradient is\n // the visible underlay while the image streams in. A failed image\n // removes the strip (see above). The `none` fallback keeps the\n // declaration valid before the layout effect sets the custom\n // property (SSR / first paint).\n 'ds:bg-[image:var(--practice-profile-hero-cover,none),var(--gradient-hero-brand)]',\n 'ds:bg-cover ds:bg-center',\n ].join(' ')}\n />\n ) : null;\n\n // Decorative unless the caller wrote alt text for a photo that shows.\n const photoHidden = !(imageUrl && imageAlt);\n\n const body = (\n <div\n className={[\n // Phones: stacked column, smaller avatar — the practice name,\n // tagline and rating keep the full line width instead of being\n // squeezed beside a 3xl avatar. sm+: classic row layout.\n 'ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-md)]',\n 'ds:sm:flex-row ds:sm:gap-[var(--spacing-lg)]',\n ].join(' ')}\n >\n {/* Responsive avatar — `ds:hidden` removes the inactive size from\n both the layout and the accessibility tree. Without `imageAlt`\n both renders are aria-hidden: the H1 right beside them already\n carries the practice name, so the avatar is decorative. With\n `imageAlt` (and a photo) the photo is reachable and its alt is\n what a screen reader reads (HTP-7074). */}\n {/* HTP-6712: the practice photo is a 4:3 rounded rectangle, filled\n and cropped from the centre. It keeps the old circle's height\n (64px on phones, 192px from sm), so the hero does not grow. */}\n <div className=\"ds:shrink-0 ds:sm:hidden\">\n <Avatar\n size=\"xl\"\n shape=\"rounded\"\n ratio=\"4:3\"\n name={name}\n src={imageUrl}\n alt={imageAlt}\n aria-hidden={photoHidden ? 'true' : undefined}\n />\n </div>\n <div className=\"ds:hidden ds:shrink-0 ds:sm:block\">\n <Avatar\n size=\"3xl\"\n shape=\"rounded\"\n ratio=\"4:3\"\n name={name}\n src={imageUrl}\n alt={imageAlt}\n aria-hidden={photoHidden ? 'true' : undefined}\n />\n </div>\n <div className=\"ds:flex ds:w-full ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-start ds:gap-[var(--spacing-md)]\">\n {/* The practice's own words (name, tagline) keep the direction\n they were typed in, not the page's: `dir=\"auto\"`. */}\n <h1\n id={headingId}\n dir=\"auto\"\n className=\"type-title-page ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {name}\n </h1>\n {actionSlot ? (\n // `ms-auto` + `shrink-0` are the desktop contract, and both are\n // wrong once the row wraps on a phone: they stranded the action\n // at the inline-end of a start-aligned stack and stopped a wide\n // control fitting the column. Hence `sm:` and up only.\n <div className=\"ds:flex ds:min-w-0 ds:items-center ds:gap-[var(--spacing-xs)] ds:sm:ms-auto ds:sm:shrink-0\">\n {actionSlot}\n </div>\n ) : null}\n </div>\n {tagline ? (\n <p\n dir=\"auto\"\n className=\"type-body ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {tagline}\n </p>\n ) : null}\n {rating ? (\n // Rating owns the whole line: locale-formatted value, plural-\n // aware review count, and a single role=\"img\" announcement.\n <Rating\n value={rating.value}\n max={5}\n size=\"md\"\n reviews={{ count: rating.count }}\n />\n ) : null}\n {badges && badges.length > 0 ? (\n <div\n role=\"list\"\n className=\"ds:mt-[var(--spacing-2xs)] ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-2xs)]\"\n >\n {badges.map((badge) => (\n <Badge\n key={badge.key}\n variant={badge.variant ?? 'neutral'}\n role=\"listitem\"\n >\n {badge.label}\n </Badge>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n );\n\n return (\n <div\n ref={ref}\n role=\"region\"\n // A consumer-supplied aria-label wins; otherwise the region is\n // named by the practice-name H1 via aria-labelledby.\n aria-label={ariaLabel}\n aria-labelledby={ariaLabel ? undefined : headingId}\n data-component=\"practice-profile-hero\"\n data-component-id={id}\n data-has-cover={hasCover ? 'true' : 'false'}\n id={id}\n className={rootVariants({ surface, className })}\n {...rest}\n >\n {surface === 'elevated' ? (\n <Card variant=\"elevated\">\n {cover}\n <Card.Body>{body}</Card.Body>\n </Card>\n ) : (\n <>\n {cover}\n <div className=\"ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]\">\n {body}\n </div>\n </>\n )}\n </div>\n );\n },\n);\n\nPracticeProfileHero.displayName = 'PracticeProfileHero';\n"],"names":["practiceProfileHeroAgent","handle","rootVariants","cva","PracticeProfileHero","forwardRef","name","tagline","imageUrl","imageAlt","coverImageUrl","rating","badges","actionSlot","surface","ariaLabel","id","className","rest","ref","headingId","useId","coverOutcome","setCoverOutcome","useState","coverStatus","useEffect","current","probe","hasCover","agentHandle","useMemo","useAgentRegistration","coverRef","useRef","useIsomorphicLayoutEffect","el","cover","jsx","photoHidden","body","jsxs","Avatar","Rating","badge","Badge","Card","Fragment"],"mappings":"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"}
|
|
@@ -10,10 +10,10 @@ import { D as V } from "./date-picker-CdhXlgVI.js";
|
|
|
10
10
|
import { N as H } from "./number-input-CVwI1ltI.js";
|
|
11
11
|
import { S as Ce } from "./select-BBDRYxJl.js";
|
|
12
12
|
import { S as je } from "./switch-D--x7n6h.js";
|
|
13
|
-
import { C as ie } from "./card-
|
|
13
|
+
import { C as ie } from "./card-C85_Ndhb.js";
|
|
14
14
|
import { B as $ } from "./badge-BUk4RjTS.js";
|
|
15
15
|
import { I as Ee } from "./insert-result-CDMMt7q8.js";
|
|
16
|
-
import { D as E, r as Pe, c as Oe, g as _e, e as Ie, f as Fe, A as Ge, h as Ke, i as Ve, j as le, G as He } from "./antenatal-schedule-timeline-
|
|
16
|
+
import { D as E, r as Pe, c as Oe, g as _e, e as Ie, f as Fe, A as Ge, h as Ke, i as Ve, j as le, G as He } from "./antenatal-schedule-timeline-DmsY5g28.js";
|
|
17
17
|
import { s as P } from "./subDays-DKISP2nE.js";
|
|
18
18
|
import { a as q } from "./date-picker-variants-Dt6UbonG.js";
|
|
19
19
|
import { p as $e } from "./parseISO-DZZ5a-zK.js";
|
|
@@ -767,4 +767,4 @@ Ue.displayName = "PregnancyDating";
|
|
|
767
767
|
export {
|
|
768
768
|
Ue as P
|
|
769
769
|
};
|
|
770
|
-
//# sourceMappingURL=pregnancy-dating-
|
|
770
|
+
//# sourceMappingURL=pregnancy-dating-D0Kf9s7s.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pregnancy-dating-CuVj9KGR.js","sources":["../../src/components/pregnancy-dating/pregnancy-dating.agent.ts","../../src/components/pregnancy-dating/pregnancy-dating.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — PregnancyDating. */\n/* */\n/* Unified obstetric dating widget: takes any known anchor (LMP / */\n/* conception / IVF transfer / known EDD) and shows both the estimated */\n/* due date and the current gestational age, trimester and milestones, */\n/* with optional CRL re-dating and a ±days nudge. This is the adapter to */\n/* prefer — DueDateCalculator and GestationalAgeCalculator are deprecated */\n/* in favour of it. */\n/* */\n/* The agent surface is the dating inputs plus the computed EDD / GA; the */\n/* handle is the curated `PregnancyDatingHandle` (the public `ref` stays */\n/* the root <div>, exactly as `slider.tsx` and `bmi-calculator.tsx` keep */\n/* theirs). */\n/* */\n/* Dates cross the boundary as local-time `yyyy-MM-dd` strings, never */\n/* `Date` objects, so nothing shifts a day under JSON/UTC serialisation. */\n/* */\n/* Host-delegated, deliberately WITHOUT actions: the optional antenatal- */\n/* schedule inputs (plurality, chorionicity, Rh status, GDM risk) only */\n/* appear under `showSchedule` and steer the appended exam timeline, not */\n/* the dating result. An agent reaches them through the DOM — the */\n/* Select / Switch controls inside `data-component=\"pregnancy-dating\"`. */\n/* */\n/* PHI (§7): never exposes patient identity — the slots return the */\n/* operator's own structural dating inputs and the dates derived from */\n/* them. See `src/docs/26-agent-readiness.mdx`. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { PregnancyDatingHandle } from './pregnancy-dating';\n\n/** Shared JSON Schema fragment for a local calendar date. */\nconst isoDate = {\n type: 'string',\n pattern: '^\\\\d{4}-\\\\d{2}-\\\\d{2}$',\n} as const;\n\nexport const pregnancyDatingAgent: AgentAdapter<PregnancyDatingHandle> = {\n id: 'pregnancy-dating',\n // set_value → the seven `set_*` actions + the `inputs` state slot.\n capabilities: ['set_value'],\n state: {\n inputs: {\n type: '{ method: string, referenceDate: string | null, cycleLength: number | null, embryoAge: 3 | 5, crlMm: number | null, scanDate: string | null, datingAdjustment: number | null, asOfDate: string }',\n descriptionKey: 'ui.agent.pregnancyDating.state.inputs',\n description:\n 'The dating inputs as entered — anchor method, its reference date, cycle length (LMP), embryo age (IVF), the optional CRL + scan date, the manual ±days nudge, and the evaluation date. Dates are `yyyy-MM-dd`. Read this to see which method a reference date will be interpreted under.',\n read: (handle) => handle.getInputs(),\n },\n result: {\n type: '{ dueDate: string, gestationalStart: string, gestationalAge: { weeks: number, days: number, totalDays: number } | null, trimester: string } | null',\n descriptionKey: 'ui.agent.pregnancyDating.state.result',\n description:\n 'Computed estimated delivery date, the GA day-0 anchor after any re-dating or adjustment, the gestational age in completed weeks + days as of the evaluation date, and the trimester band (preconception / first / second / third / postterm). Null until a reference date is set.',\n read: (handle) => handle.getResult(),\n },\n },\n actions: {\n set_method: {\n // Drives the same local input state a user picks; nothing is persisted\n // to a record, and the choice is reversible in the same UI.\n safety: 'write',\n argsType: \"{ method: 'lmp' | 'conception' | 'ivf' | 'edd' }\",\n argsSchema: {\n type: 'object',\n properties: {\n method: {\n enum: ['lmp', 'conception', 'ivf', 'edd'],\n description:\n 'Which anchor to date from — last menstrual period, conception, IVF transfer, or a known estimated delivery date.',\n },\n },\n required: ['method'],\n additionalProperties: false,\n },\n idempotent: true,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the method was applied.',\n },\n errors: [\n 'Returns false for a method outside the four supported anchors.',\n ],\n examples: [\n { args: { method: 'edd' }, note: 'Date backwards from a known EDD.' },\n ],\n descriptionKey: 'ui.agent.pregnancyDating.actions.setMethod',\n description:\n 'Choose which anchor the pregnancy is dated from. The reference date is kept and re-interpreted under the new method, so set the method first — only a known EDD may be in the future.',\n invoke: (\n handle,\n args: { method: 'lmp' | 'conception' | 'ivf' | 'edd' },\n ) => handle.setMethod(args.method),\n },\n set_reference_date: {\n safety: 'write',\n argsType: '{ date: string | null }',\n argsSchema: {\n type: 'object',\n properties: {\n date: {\n oneOf: [\n { ...isoDate, description: 'Local calendar date, `yyyy-MM-dd`.' },\n { type: 'null' },\n ],\n description:\n 'The date the active method anchors on — LMP, conception, transfer, or known EDD — or null to clear it. Only a known EDD may be in the future.',\n },\n },\n required: ['date'],\n additionalProperties: false,\n },\n idempotent: true,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the date was applied.',\n },\n errors: [\n 'Returns false for an unparseable date, or for a future date under any method but `edd` — the on-screen DatePicker caps those at today.',\n ],\n examples: [\n {\n args: { date: '2026-01-12' },\n note: 'Under the default LMP method, a last period starting 12 January.',\n },\n ],\n descriptionKey: 'ui.agent.pregnancyDating.actions.setReferenceDate',\n description:\n 'Set the reference date for the active method. This is the only required input — the result stays null without it.',\n invoke: (handle, args: { date: string | null }) =>\n handle.setReferenceDate(args.date),\n },\n set_cycle_length: {\n safety: 'write',\n argsType: '{ days: number | null }',\n argsSchema: {\n type: 'object',\n properties: {\n days: {\n oneOf: [\n { type: 'integer', minimum: 20, maximum: 45 },\n { type: 'null' },\n ],\n description:\n 'Average cycle length in days (20–45), or null to fall back to the 28-day default.',\n },\n },\n required: ['days'],\n additionalProperties: false,\n },\n idempotent: true,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the value was applied.',\n },\n errors: [\n 'Returns false outside 20–45 days — the same bounds the on-screen NumberInput enforces.',\n 'Applies but changes nothing unless the method is `lmp`, and is ignored once a CRL re-dating is confirmed.',\n ],\n descriptionKey: 'ui.agent.pregnancyDating.actions.setCycleLength',\n description:\n 'LMP method only — set the average cycle length, which shifts Naegele dating off the 28-day assumption.',\n invoke: (handle, args: { days: number | null }) =>\n handle.setCycleLength(args.days),\n },\n set_embryo_age: {\n safety: 'write',\n argsType: '{ days: 3 | 5 }',\n argsSchema: {\n type: 'object',\n properties: {\n days: {\n enum: [3, 5],\n description:\n 'Embryo age at transfer in days — 3 (cleavage) or 5 (blastocyst).',\n },\n },\n required: ['days'],\n additionalProperties: false,\n },\n idempotent: true,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the value was applied.',\n },\n errors: [\n 'Returns false for any value other than 3 or 5.',\n 'Applies but changes nothing unless the method is `ivf`.',\n ],\n descriptionKey: 'ui.agent.pregnancyDating.actions.setEmbryoAge',\n description:\n 'IVF method only — set the embryo age at transfer, which offsets the transfer date back to a notional LMP.',\n invoke: (handle, args: { days: 3 | 5 }) => handle.setEmbryoAge(args.days),\n },\n set_crl: {\n safety: 'write',\n argsType: '{ crlMm?: number | null, scanDate?: string | null }',\n argsSchema: {\n type: 'object',\n properties: {\n crlMm: {\n oneOf: [{ type: 'number', exclusiveMinimum: 0 }, { type: 'null' }],\n description:\n 'Crown-rump length in millimetres, or null to clear it.',\n },\n scanDate: {\n oneOf: [{ ...isoDate }, { type: 'null' }],\n description:\n 'Date of the CRL scan (`yyyy-MM-dd`, not in the future), or null to clear it.',\n },\n },\n additionalProperties: false,\n },\n idempotent: true,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the measurement was applied.',\n },\n errors: [\n 'Returns false and writes nothing when the length is not positive or the scan date is unparseable or in the future — the payload applies all-or-nothing.',\n 'Re-dating only happens under the `lmp` method, and only when both the length and the scan date are set.',\n ],\n examples: [\n {\n args: { crlMm: 42, scanDate: '2026-02-20' },\n note: 'A first-trimester CRL that may re-date the pregnancy per ACOG CO 700.',\n },\n ],\n descriptionKey: 'ui.agent.pregnancyDating.actions.setCrl',\n description:\n 'LMP method only — set the first-trimester crown-rump length and its scan date. A confirmed re-dating wins over both the cycle length and the manual adjustment.',\n invoke: (\n handle,\n args: { crlMm?: number | null; scanDate?: string | null },\n ) => handle.setCrl(args),\n },\n set_dating_adjustment: {\n safety: 'write',\n argsType: '{ days: number | null }',\n argsSchema: {\n type: 'object',\n properties: {\n days: {\n oneOf: [{ type: 'integer' }, { type: 'null' }],\n description:\n 'Whole days to nudge the dating by — positive moves the pregnancy further along — or null for no adjustment.',\n },\n },\n required: ['days'],\n additionalProperties: false,\n },\n idempotent: true,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the value was applied.',\n },\n errors: [\n 'Returns false for a non-integer number of days.',\n 'Applies but changes nothing while a CRL re-dating is confirmed — the measurement wins.',\n ],\n examples: [\n {\n args: { days: 3 },\n note: 'An uncertain LMP judged three days earlier than entered.',\n },\n ],\n descriptionKey: 'ui.agent.pregnancyDating.actions.setDatingAdjustment',\n description:\n 'Nudge the dating by whole days for an uncertain anchor. Positive moves the pregnancy further along (earlier effective LMP, earlier due date).',\n invoke: (handle, args: { days: number | null }) =>\n handle.setDatingAdjustment(args.days),\n },\n set_as_of_date: {\n safety: 'write',\n argsType: '{ date: string }',\n argsSchema: {\n type: 'object',\n properties: {\n date: {\n ...isoDate,\n description:\n 'Date to evaluate gestational age and trimester against, `yyyy-MM-dd`. May be in the future to project forward.',\n },\n },\n required: ['date'],\n additionalProperties: false,\n },\n idempotent: true,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the date was applied.',\n },\n errors: ['Returns false for an unparseable date.'],\n examples: [\n {\n args: { date: '2026-09-15' },\n note: 'Project gestational age forward to an upcoming appointment.',\n },\n ],\n descriptionKey: 'ui.agent.pregnancyDating.actions.setAsOfDate',\n description:\n 'Set the date gestational age, trimester and the antenatal schedule are evaluated against. Defaults to today; the estimated delivery date itself does not depend on it.',\n invoke: (handle, args: { date: string }) => handle.setAsOfDate(args.date),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'pregnancy-dating',\n description: 'Marks the PregnancyDating wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Also the registry key — without an `id` the instance does not register and the handle-driven actions/state are unreachable.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* PregnancyDating — the unified obstetric dating widget. */\n/* */\n/* Supersedes DueDateCalculator + GestationalAgeCalculator: takes any */\n/* known anchor (LMP / conception / IVF transfer / known EDD) and shows */\n/* BOTH the estimated due date AND the current gestational age, */\n/* trimester and milestones. Two dating refinements: a precise CRL + */\n/* scan-date ACOG CO 700 re-dating (LMP), and a quick manual ±days */\n/* adjustment for an uncertain LMP/conception. `showSchedule` appends */\n/* the antenatal exam schedule with plurality / chorionicity / risk */\n/* inputs. All maths lives in `_shared/obstetrics` + `_shared/antenatal- */\n/* schedule` (pure, separately tested). */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useMemo, useRef, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { format, isAfter, parseISO, subDays } from 'date-fns';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { pregnancyDatingAgent } from './pregnancy-dating.agent';\nimport { RadioGroup, Radio } from '../radio-group';\nimport { FormField } from '../form-field';\nimport { DatePicker } from '../date-picker';\nimport { NumberInput } from '../number-input';\nimport { Select } from '../select';\nimport { Switch } from '../switch';\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 {\n type EmbryoAge,\n type GestationalAge,\n type DueDateResult,\n type Plurality,\n type Chorionicity,\n computeDueDate,\n redateByCrl,\n gestationalMilestones,\n GESTATION_DAYS,\n CONCEPTION_OFFSET_DAYS,\n DEFAULT_CYCLE_LENGTH,\n TRIMESTER_BADGE_VARIANT,\n trimesterHighlightToken,\n} from '../_shared/obstetrics';\nimport {\n computeAntenatalSchedule,\n type AntenatalScheduleOptions,\n type GdmRisk,\n} from '../_shared/antenatal-schedule';\nimport {\n AntenatalScheduleTimeline,\n buildScheduleInsertFields,\n} from '../_shared/antenatal-schedule-timeline';\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\n/** Any known anchor the pregnancy can be dated from. */\nexport type DatingMethod = 'lmp' | 'conception' | 'ivf' | 'edd';\n\n/** i18n key for each method's reference-date field. */\nconst DATE_LABEL_KEY: Record<DatingMethod, string> = {\n lmp: 'pregnancyDating.lmpDate',\n conception: 'pregnancyDating.conceptionDate',\n ivf: 'pregnancyDating.transferDate',\n edd: 'pregnancyDating.eddDate',\n};\n\nexport interface PregnancyDatingResult {\n /** Estimated date of delivery. */\n dueDate: Date;\n /** GA day-0 anchor (effective LMP) after any re-dating / adjustment. */\n gestationalStart: Date;\n /** Gestational age as of the evaluation date; `null` before conception. */\n gestationalAge: GestationalAge | null;\n trimester: DueDateResult['trimester'];\n}\n\n/* ------------------------------------------------------------------ */\n/* Agent boundary */\n/* */\n/* Dates cross the agent boundary as local-time `yyyy-MM-dd` strings, */\n/* never `Date` objects — a Date JSON-serialises to UTC and silently */\n/* shifts the day for anyone east or west of Greenwich. */\n/* ------------------------------------------------------------------ */\n\nconst toIsoDate = (d: Date): string => format(d, 'yyyy-MM-dd');\n\nconst fromIsoDate = (iso: string): Date | null => {\n const d = parseISO(iso);\n return Number.isNaN(d.getTime()) ? null : d;\n};\n\n/** UI input bounds, mirrored by the agent handle so it can't out-type a user. */\nconst CYCLE_LENGTH_RANGE = { min: 20, max: 45 } as const;\n\n/** The dating inputs as entered. */\nexport interface PregnancyDatingInputsSnapshot {\n /** Which anchor the pregnancy is dated from. */\n method: DatingMethod;\n /** The method's reference date (`yyyy-MM-dd`), or null when unset. */\n referenceDate: string | null;\n /** LMP only — average cycle length in days, or null for the 28-day default. */\n cycleLength: number | null;\n /** IVF only — embryo age at transfer, in days. */\n embryoAge: EmbryoAge;\n /** LMP only — crown-rump length in millimetres, or null. */\n crlMm: number | null;\n /** LMP only — date of the CRL scan (`yyyy-MM-dd`), or null. */\n scanDate: string | null;\n /** Manual ±days nudge applied to the dating, or null. */\n datingAdjustment: number | null;\n /** The date gestational age and trimester are evaluated against. */\n asOfDate: string;\n}\n\n/** `PregnancyDatingResult` projected onto the agent boundary — ISO dates. */\nexport interface PregnancyDatingSnapshot {\n /** Estimated date of delivery, `yyyy-MM-dd`. */\n dueDate: string;\n /** GA day-0 anchor after any re-dating / adjustment, `yyyy-MM-dd`. */\n gestationalStart: string;\n /** Gestational age as of the evaluation date; null before conception. */\n gestationalAge: { weeks: number; days: number; totalDays: number } | null;\n /** Trimester band as of the evaluation date. */\n trimester: DueDateResult['trimester'];\n}\n\n/**\n * Curated imperative handle for agent / external automation. Reads the dating\n * inputs and the computed EDD + gestational age, and drives the inputs the way\n * a user would. Never exposes patient identity — only structural dates and\n * numbers. Consumed by `pregnancy-dating.agent.ts`; the public `ref` stays the\n * root DOM element.\n */\nexport interface PregnancyDatingHandle {\n /** The dating inputs as entered. */\n getInputs: () => PregnancyDatingInputsSnapshot;\n /** Computed due date, gestational age and trimester, or null until a reference date is set. */\n getResult: () => PregnancyDatingSnapshot | null;\n /** Switch the dating anchor. Keeps the reference date, which is re-interpreted. */\n setMethod: (method: DatingMethod) => boolean;\n /** Set the method's reference date (`yyyy-MM-dd`); only a known EDD may be in the future. */\n setReferenceDate: (isoDate: string | null) => boolean;\n /** LMP only — set the average cycle length in days (20–45). */\n setCycleLength: (days: number | null) => boolean;\n /** IVF only — set the embryo age at transfer (3 or 5 days). */\n setEmbryoAge: (days: EmbryoAge) => boolean;\n /** LMP only — set the CRL measurement and/or its scan date for ACOG re-dating. */\n setCrl: (next: {\n crlMm?: number | null;\n scanDate?: string | null;\n }) => boolean;\n /** Set the manual ±days dating nudge (positive = further along). */\n setDatingAdjustment: (days: number | null) => boolean;\n /** Set the date gestational age and trimester are evaluated against. */\n setAsOfDate: (isoDate: string) => boolean;\n}\n\nexport interface PregnancyDatingProps extends VariantProps<\n typeof rootVariants\n> {\n /** Initial dating method. Defaults to `'lmp'`. */\n defaultMethod?: DatingMethod;\n /** Pre-fill the reference date (e.g. a known LMP from the patient record). */\n defaultReferenceDate?: Date;\n /** Fires whenever a result can be computed (and `null` when it can't). */\n onResultChange?: (result: PregnancyDatingResult | null) => void;\n /** When provided, shows the result-action buttons that emit / copy the result. */\n onInsert?: (payload: InsertPayload) => void;\n /** Which verb the result button performs. Defaults to `'insert'`. */\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 /** Brand wordmark printed in the inserted/copied result-card footer. */\n insertBrand?: string | false;\n /** Append the antenatal exam schedule + reveal the plurality / risk inputs. */\n showSchedule?: boolean;\n /** `showSchedule` only — initial number of babies. Defaults to `'singleton'`. */\n defaultPlurality?: Plurality;\n /** `showSchedule` only — initial chorionicity for multiples. Defaults to `'unknown'`. */\n defaultChorionicity?: Chorionicity;\n /** `showSchedule` only — initial Rh-negative state (surfaces anti-D). */\n defaultRhNegative?: boolean;\n /** `showSchedule` only — initial gestational-diabetes risk tier (surfaces OGTT). */\n defaultGdmRisk?: GdmRisk;\n /**\n * Passthrough options for the appended schedule (national `schedule`,\n * `includeOnIndication`, `birthGuideline`). `today`, `plurality`,\n * `chorionicity`, `rhNegative` and `gdmRisk` come from the component's own\n * inputs. Ignored unless `showSchedule` is set.\n */\n scheduleOptions?: Omit<\n AntenatalScheduleOptions,\n 'today' | 'plurality' | 'chorionicity' | 'rhNegative' | 'gdmRisk'\n >;\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 PregnancyDating = forwardRef<HTMLDivElement, PregnancyDatingProps>(\n (\n {\n defaultMethod = 'lmp',\n defaultReferenceDate,\n onResultChange,\n onInsert,\n insertVariant = 'insert',\n onCopy,\n onError,\n insertBrand,\n showSchedule = false,\n defaultPlurality = 'singleton',\n defaultChorionicity = 'unknown',\n defaultRhNegative = false,\n defaultGdmRisk,\n scheduleOptions,\n id,\n width,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation('ui');\n\n const [method, setMethod] = useState<DatingMethod>(defaultMethod);\n const [refDate, setRefDate] = useState<Date | undefined>(\n defaultReferenceDate,\n );\n const [cycleLength, setCycleLength] = useState<number | null>(\n DEFAULT_CYCLE_LENGTH,\n );\n const [embryoAge, setEmbryoAge] = useState<EmbryoAge>(5);\n // Precise re-dating (LMP method) and the quick ±days nudge.\n const [crlMm, setCrlMm] = useState<number | null>(null);\n const [scanDate, setScanDate] = useState<Date | undefined>(undefined);\n const [datingAdjustment, setDatingAdjustment] = useState<number | null>(\n null,\n );\n // Evaluation date (\"as of\") + multiple-pregnancy / risk inputs.\n const [asOfDate, setAsOfDate] = useState<Date>(() => new Date());\n const [plurality, setPlurality] = useState<Plurality>(defaultPlurality);\n const [chorionicity, setChorionicity] =\n useState<Chorionicity>(defaultChorionicity);\n const [rhNegative, setRhNegative] = useState<boolean>(defaultRhNegative);\n const [gdmRisk, setGdmRisk] = useState<GdmRisk | 'none'>(\n defaultGdmRisk ?? 'none',\n );\n\n // Real today caps the past-only date inputs (LMP, conception, transfer, scan).\n const today = useMemo(() => new Date(), []);\n\n // CRL re-dating (LMP method only) — the measurement-based path.\n const redating = useMemo(() => {\n if (method !== 'lmp' || !refDate || crlMm === null || !scanDate) {\n return null;\n }\n return redateByCrl({ lmp: refDate, scanDate, crlMm });\n }, [method, refDate, crlMm, scanDate]);\n\n const data = useMemo(() => {\n if (!refDate) return null;\n\n // Resolve the method's anchor to an effective LMP (GA day 0).\n let effectiveLmp: Date;\n let cycleForEdd = DEFAULT_CYCLE_LENGTH;\n if (method === 'lmp') {\n effectiveLmp = refDate;\n cycleForEdd = cycleLength ?? DEFAULT_CYCLE_LENGTH;\n } else if (method === 'conception') {\n effectiveLmp = subDays(refDate, CONCEPTION_OFFSET_DAYS);\n } else if (method === 'ivf') {\n effectiveLmp = subDays(refDate, embryoAge + CONCEPTION_OFFSET_DAYS);\n } else {\n effectiveLmp = subDays(refDate, GESTATION_DAYS);\n }\n\n // A confirmed CRL re-dating wins over everything (measurement-based); else\n // apply the quick ±days nudge (+ = pregnancy further along → earlier LMP).\n if (method === 'lmp' && redating?.redated) {\n effectiveLmp = redating.gestationalStart;\n cycleForEdd = DEFAULT_CYCLE_LENGTH;\n } else if (datingAdjustment) {\n effectiveLmp = subDays(effectiveLmp, datingAdjustment);\n }\n\n const r = computeDueDate(\n { method: 'lmp', date: effectiveLmp, cycleLength: cycleForEdd },\n asOfDate,\n );\n return {\n result: {\n dueDate: r.dueDate,\n gestationalStart: r.gestationalStart,\n gestationalAge: r.gestationalAge,\n trimester: r.trimester,\n } satisfies PregnancyDatingResult,\n milestones: gestationalMilestones(r.gestationalStart),\n };\n }, [\n method,\n refDate,\n cycleLength,\n embryoAge,\n redating,\n datingAdjustment,\n asOfDate,\n ]);\n\n const result = data?.result ?? null;\n\n const schedule = useMemo(() => {\n if (!showSchedule || !result) return null;\n return computeAntenatalSchedule(result.gestationalStart, {\n ...scheduleOptions,\n today: asOfDate,\n plurality,\n chorionicity,\n rhNegative,\n gdmRisk: gdmRisk === 'none' ? undefined : gdmRisk,\n });\n }, [\n showSchedule,\n result,\n asOfDate,\n scheduleOptions,\n plurality,\n chorionicity,\n rhNegative,\n gdmRisk,\n ]);\n\n const longDate = useMemo(\n () => new Intl.DateTimeFormat(i18n.language, { dateStyle: 'long' }),\n [i18n.language],\n );\n const medDate = useMemo(\n () => new Intl.DateTimeFormat(i18n.language, { dateStyle: 'medium' }),\n [i18n.language],\n );\n\n useEffect(() => {\n onResultChange?.(result);\n }, [result, onResultChange]);\n\n /* ── Agent handle ────────────────────────────────────────────────── */\n const liveRef = useRef({\n method,\n refDate,\n cycleLength,\n embryoAge,\n crlMm,\n scanDate,\n datingAdjustment,\n asOfDate,\n result,\n });\n liveRef.current = {\n method,\n refDate,\n cycleLength,\n embryoAge,\n crlMm,\n scanDate,\n datingAdjustment,\n asOfDate,\n result,\n };\n\n const agentHandle = useMemo<PregnancyDatingHandle>(\n () => ({\n getInputs: () => {\n const live = liveRef.current;\n return {\n method: live.method,\n referenceDate: live.refDate ? toIsoDate(live.refDate) : null,\n cycleLength: live.cycleLength,\n embryoAge: live.embryoAge,\n crlMm: live.crlMm,\n scanDate: live.scanDate ? toIsoDate(live.scanDate) : null,\n datingAdjustment: live.datingAdjustment,\n asOfDate: toIsoDate(live.asOfDate),\n };\n },\n getResult: () => {\n const r = liveRef.current.result;\n if (!r) return null;\n return {\n dueDate: toIsoDate(r.dueDate),\n gestationalStart: toIsoDate(r.gestationalStart),\n gestationalAge: r.gestationalAge ? { ...r.gestationalAge } : null,\n trimester: r.trimester,\n };\n },\n setMethod: (next) => {\n if (\n next !== 'lmp' &&\n next !== 'conception' &&\n next !== 'ivf' &&\n next !== 'edd'\n ) {\n return false;\n }\n setMethod(next);\n return true;\n },\n setReferenceDate: (isoDate) => {\n if (isoDate === null) {\n setRefDate(undefined);\n return true;\n }\n const parsed = fromIsoDate(isoDate);\n if (!parsed) return false;\n // The DatePicker caps every anchor but a known EDD at today.\n if (liveRef.current.method !== 'edd' && isAfter(parsed, new Date())) {\n return false;\n }\n setRefDate(parsed);\n return true;\n },\n setCycleLength: (days) => {\n if (\n days !== null &&\n !(\n Number.isFinite(days) &&\n days >= CYCLE_LENGTH_RANGE.min &&\n days <= CYCLE_LENGTH_RANGE.max\n )\n ) {\n return false;\n }\n setCycleLength(days);\n return true;\n },\n setEmbryoAge: (days) => {\n if (days !== 3 && days !== 5) return false;\n setEmbryoAge(days);\n return true;\n },\n setCrl: (next) => {\n const now = new Date();\n let parsedScan: Date | undefined;\n // Validate the whole payload before writing any of it, so a bad\n // value can't leave the form half-updated.\n if ('crlMm' in next) {\n const mm = next.crlMm;\n if (\n mm !== null &&\n mm !== undefined &&\n !(Number.isFinite(mm) && mm > 0)\n ) {\n return false;\n }\n }\n if ('scanDate' in next && next.scanDate != null) {\n const d = fromIsoDate(next.scanDate);\n if (!d || isAfter(d, now)) return false;\n parsedScan = d;\n }\n if ('crlMm' in next) setCrlMm(next.crlMm ?? null);\n if ('scanDate' in next) setScanDate(parsedScan);\n return true;\n },\n setDatingAdjustment: (days) => {\n if (days !== null && !Number.isInteger(days)) return false;\n setDatingAdjustment(days);\n return true;\n },\n setAsOfDate: (isoDate) => {\n const parsed = fromIsoDate(isoDate);\n if (!parsed) return false;\n setAsOfDate(parsed);\n return true;\n },\n }),\n [],\n );\n useAgentRegistration(pregnancyDatingAgent, agentHandle, id);\n\n const chorionicityOptions = useMemo(\n () =>\n (\n [\n 'unknown',\n 'dichorionic-diamniotic',\n 'monochorionic-diamniotic',\n 'monochorionic-monoamniotic',\n ] as const\n ).map((c) => ({\n value: c,\n label: t(`antenatalSchedule.chorionicity.${c}`),\n })),\n [t],\n );\n\n const gaText = (ga: GestationalAge | null): string =>\n ga\n ? t('pregnancyDating.result.gestation', {\n weeks: ga.weeks,\n days: ga.days,\n })\n : '—';\n\n return (\n <div\n ref={ref}\n data-component=\"pregnancy-dating\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <RadioGroup\n label={t('pregnancyDating.method.label')}\n variant=\"horizontal\"\n value={method}\n onValueChange={(next) => setMethod(next as DatingMethod)}\n >\n <Radio label={t('pregnancyDating.method.lmp')} value=\"lmp\" />\n <Radio\n label={t('pregnancyDating.method.conception')}\n value=\"conception\"\n />\n <Radio label={t('pregnancyDating.method.ivf')} value=\"ivf\" />\n <Radio label={t('pregnancyDating.method.edd')} value=\"edd\" />\n </RadioGroup>\n\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n <FormField label={t(DATE_LABEL_KEY[method])}>\n <DatePicker\n value={refDate}\n onChange={setRefDate}\n maxDate={method === 'edd' ? undefined : today}\n />\n </FormField>\n\n {method === 'lmp' && (\n <FormField\n label={t('pregnancyDating.cycleLength')}\n description={t('pregnancyDating.cycleLengthHint')}\n >\n <NumberInput\n mode=\"integer\"\n min={CYCLE_LENGTH_RANGE.min}\n max={CYCLE_LENGTH_RANGE.max}\n value={cycleLength}\n onChange={setCycleLength}\n />\n </FormField>\n )}\n\n {method === 'ivf' && (\n <RadioGroup\n label={t('pregnancyDating.embryoAge')}\n variant=\"horizontal\"\n value={String(embryoAge)}\n onValueChange={(next) => setEmbryoAge(Number(next) as EmbryoAge)}\n >\n <Radio label={t('pregnancyDating.day3')} value=\"3\" />\n <Radio label={t('pregnancyDating.day5')} value=\"5\" />\n </RadioGroup>\n )}\n\n <FormField\n label={t('pregnancyDating.datingAdjustment')}\n description={t('pregnancyDating.datingAdjustmentHint')}\n >\n <NumberInput\n mode=\"integer\"\n value={datingAdjustment}\n onChange={setDatingAdjustment}\n />\n </FormField>\n\n <FormField\n label={t('pregnancyDating.asOfDate')}\n description={t('pregnancyDating.asOfDateHint')}\n >\n <DatePicker\n value={asOfDate}\n onChange={(d) => d && setAsOfDate(d)}\n />\n </FormField>\n </div>\n\n {method === 'lmp' ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n <FormField\n label={t('pregnancyDating.crl')}\n description={t('pregnancyDating.crlHint')}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={0.1}\n value={crlMm}\n onChange={setCrlMm}\n />\n </FormField>\n <FormField label={t('pregnancyDating.scanDate')}>\n <DatePicker\n value={scanDate}\n onChange={setScanDate}\n maxDate={today}\n />\n </FormField>\n </div>\n {redating ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Badge variant={redating.redated ? 'warning' : 'success'}>\n {redating.redated\n ? t('pregnancyDating.redated', {\n days: redating.discrepancyDays,\n })\n : t('pregnancyDating.datesAgree')}\n </Badge>\n {!redating.crlInRange ? (\n <span className=\"type-meta ds:text-muted-foreground\">\n {t('pregnancyDating.crlOutOfRange')}\n </span>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n\n {showSchedule ? (\n <>\n <RadioGroup\n label={t('antenatalSchedule.plurality.label')}\n variant=\"horizontal\"\n value={plurality}\n onValueChange={(next) => setPlurality(next as Plurality)}\n >\n <Radio\n label={t('antenatalSchedule.plurality.singleton')}\n value=\"singleton\"\n />\n <Radio\n label={t('antenatalSchedule.plurality.twin')}\n value=\"twin\"\n />\n <Radio\n label={t('antenatalSchedule.plurality.triplet')}\n value=\"triplet\"\n />\n </RadioGroup>\n\n {plurality !== 'singleton' ? (\n <FormField label={t('antenatalSchedule.chorionicity.label')}>\n <Select\n options={chorionicityOptions}\n value={chorionicity}\n onValueChange={(next) =>\n setChorionicity(next as Chorionicity)\n }\n />\n </FormField>\n ) : null}\n\n <Switch\n label={t('antenatalSchedule.rhNegative')}\n checked={rhNegative}\n onCheckedChange={setRhNegative}\n />\n\n <RadioGroup\n label={t('antenatalSchedule.gdmRisk.label')}\n variant=\"horizontal\"\n value={gdmRisk}\n onValueChange={(next) => setGdmRisk(next as GdmRisk | 'none')}\n >\n <Radio label={t('antenatalSchedule.gdmRisk.none')} value=\"none\" />\n <Radio\n label={t('antenatalSchedule.gdmRisk.medium')}\n value=\"medium\"\n />\n <Radio label={t('antenatalSchedule.gdmRisk.high')} value=\"high\" />\n </RadioGroup>\n </>\n ) : null}\n\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {result\n ? `${t('pregnancyDating.result.dueDateLabel')}: ${longDate.format(\n result.dueDate,\n )}. ${t('pregnancyDating.result.gestationLabel')}: ${gaText(\n result.gestationalAge,\n )}.`\n : ''}\n </p>\n\n {data && result ? (\n <Card variant=\"elevated\">\n <Card.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {/* EDD is the headline — full width so a long localized date\n never wraps; gestational age + trimester flow beneath it,\n packed to the start so they don't strand a gap at narrow /\n modal widths. */}\n <dl className=\"ds:flex ds:flex-wrap ds:items-start ds:gap-x-[var(--spacing-xl)] ds:gap-y-[var(--spacing-md)]\">\n <div className=\"ds:basis-full ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)]\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyDating.result.dueDateLabel')}\n </dt>\n <dd className=\"type-metric ds:text-foreground\">\n {longDate.format(result.dueDate)}\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('pregnancyDating.result.gestationLabel')}\n </dt>\n <dd className=\"type-body ds:text-foreground\">\n {gaText(result.gestationalAge)}\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('pregnancyDating.result.trimesterLabel')}\n </dt>\n <dd>\n <Badge\n variant={TRIMESTER_BADGE_VARIANT[result.trimester]}\n size=\"lg\"\n >\n {t(`pregnancyDating.trimester.${result.trimester}`)}\n </Badge>\n </dd>\n </div>\n </dl>\n\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyDating.milestonesLabel')}\n </span>\n <ul className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {data.milestones.map((m) => {\n const reached = isAfter(asOfDate, m.date);\n return (\n <li\n key={m.key}\n className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-md)]\"\n >\n <span className=\"type-body ds:text-foreground\">\n {t(`pregnancyDating.milestone.${m.key}`)}\n </span>\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span className=\"type-body ds:text-muted-foreground\">\n {medDate.format(m.date)}\n </span>\n {reached ? (\n <Badge variant=\"success\">\n {t('pregnancyDating.reached')}\n </Badge>\n ) : null}\n </span>\n </li>\n );\n })}\n </ul>\n </div>\n </Card.Body>\n </Card>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('pregnancyDating.empty')}\n </p>\n )}\n\n {schedule ? <AntenatalScheduleTimeline events={schedule} /> : null}\n\n {result && (insertVariant === 'copy' || onInsert) ? (\n <InsertButton\n onInsert={onInsert}\n variant={insertVariant}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.pregnancyDating'),\n icon: 'calendar-heart',\n highlight: longDate.format(result.dueDate),\n highlightToken: trimesterHighlightToken(result.trimester),\n brand: insertBrand,\n fields: [\n {\n icon: 'calendar',\n label: t('pregnancyDating.result.dueDateLabel'),\n value: longDate.format(result.dueDate),\n },\n {\n icon: 'clock',\n label: t('pregnancyDating.result.gestationLabel'),\n value: gaText(result.gestationalAge),\n },\n {\n icon: 'tag',\n label: t('pregnancyDating.result.trimesterLabel'),\n value: t(`pregnancyDating.trimester.${result.trimester}`),\n },\n ...(schedule\n ? buildScheduleInsertFields(schedule, t, (d) =>\n medDate.format(d),\n )\n : []),\n ],\n }}\n />\n ) : null}\n </div>\n );\n },\n);\n\nPregnancyDating.displayName = 'PregnancyDating';\n"],"names":["isoDate","pregnancyDatingAgent","handle","args","rootVariants","cva","DATE_LABEL_KEY","toIsoDate","d","format","fromIsoDate","iso","parseISO","CYCLE_LENGTH_RANGE","PregnancyDating","forwardRef","defaultMethod","defaultReferenceDate","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","showSchedule","defaultPlurality","defaultChorionicity","defaultRhNegative","defaultGdmRisk","scheduleOptions","id","width","className","ref","i18n","useTranslation","method","setMethod","useState","refDate","setRefDate","cycleLength","setCycleLength","DEFAULT_CYCLE_LENGTH","embryoAge","setEmbryoAge","crlMm","setCrlMm","scanDate","setScanDate","datingAdjustment","setDatingAdjustment","asOfDate","setAsOfDate","plurality","setPlurality","chorionicity","setChorionicity","rhNegative","setRhNegative","gdmRisk","setGdmRisk","today","useMemo","redating","redateByCrl","data","effectiveLmp","cycleForEdd","subDays","CONCEPTION_OFFSET_DAYS","GESTATION_DAYS","r","computeDueDate","gestationalMilestones","result","schedule","computeAntenatalSchedule","longDate","medDate","useEffect","liveRef","useRef","agentHandle","live","next","parsed","isAfter","days","now","parsedScan","mm","useAgentRegistration","chorionicityOptions","c","gaText","ga","jsxs","RadioGroup","jsx","Radio","FormField","DatePicker","NumberInput","Badge","Fragment","Select","Switch","Card","TRIMESTER_BADGE_VARIANT","m","reached","AntenatalScheduleTimeline","InsertButton","trimesterHighlightToken","buildScheduleInsertFields"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pregnancy-dating-D0Kf9s7s.js","sources":["../../src/components/pregnancy-dating/pregnancy-dating.agent.ts","../../src/components/pregnancy-dating/pregnancy-dating.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — PregnancyDating. */\n/* */\n/* Unified obstetric dating widget: takes any known anchor (LMP / */\n/* conception / IVF transfer / known EDD) and shows both the estimated */\n/* due date and the current gestational age, trimester and milestones, */\n/* with optional CRL re-dating and a ±days nudge. This is the adapter to */\n/* prefer — DueDateCalculator and GestationalAgeCalculator are deprecated */\n/* in favour of it. */\n/* */\n/* The agent surface is the dating inputs plus the computed EDD / GA; the */\n/* handle is the curated `PregnancyDatingHandle` (the public `ref` stays */\n/* the root <div>, exactly as `slider.tsx` and `bmi-calculator.tsx` keep */\n/* theirs). */\n/* */\n/* Dates cross the boundary as local-time `yyyy-MM-dd` strings, never */\n/* `Date` objects, so nothing shifts a day under JSON/UTC serialisation. */\n/* */\n/* Host-delegated, deliberately WITHOUT actions: the optional antenatal- */\n/* schedule inputs (plurality, chorionicity, Rh status, GDM risk) only */\n/* appear under `showSchedule` and steer the appended exam timeline, not */\n/* the dating result. An agent reaches them through the DOM — the */\n/* Select / Switch controls inside `data-component=\"pregnancy-dating\"`. */\n/* */\n/* PHI (§7): never exposes patient identity — the slots return the */\n/* operator's own structural dating inputs and the dates derived from */\n/* them. See `src/docs/26-agent-readiness.mdx`. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { PregnancyDatingHandle } from './pregnancy-dating';\n\n/** Shared JSON Schema fragment for a local calendar date. */\nconst isoDate = {\n type: 'string',\n pattern: '^\\\\d{4}-\\\\d{2}-\\\\d{2}$',\n} as const;\n\nexport const pregnancyDatingAgent: AgentAdapter<PregnancyDatingHandle> = {\n id: 'pregnancy-dating',\n // set_value → the seven `set_*` actions + the `inputs` state slot.\n capabilities: ['set_value'],\n state: {\n inputs: {\n type: '{ method: string, referenceDate: string | null, cycleLength: number | null, embryoAge: 3 | 5, crlMm: number | null, scanDate: string | null, datingAdjustment: number | null, asOfDate: string }',\n descriptionKey: 'ui.agent.pregnancyDating.state.inputs',\n description:\n 'The dating inputs as entered — anchor method, its reference date, cycle length (LMP), embryo age (IVF), the optional CRL + scan date, the manual ±days nudge, and the evaluation date. Dates are `yyyy-MM-dd`. Read this to see which method a reference date will be interpreted under.',\n read: (handle) => handle.getInputs(),\n },\n result: {\n type: '{ dueDate: string, gestationalStart: string, gestationalAge: { weeks: number, days: number, totalDays: number } | null, trimester: string } | null',\n descriptionKey: 'ui.agent.pregnancyDating.state.result',\n description:\n 'Computed estimated delivery date, the GA day-0 anchor after any re-dating or adjustment, the gestational age in completed weeks + days as of the evaluation date, and the trimester band (preconception / first / second / third / postterm). Null until a reference date is set.',\n read: (handle) => handle.getResult(),\n },\n },\n actions: {\n set_method: {\n // Drives the same local input state a user picks; nothing is persisted\n // to a record, and the choice is reversible in the same UI.\n safety: 'write',\n argsType: \"{ method: 'lmp' | 'conception' | 'ivf' | 'edd' }\",\n argsSchema: {\n type: 'object',\n properties: {\n method: {\n enum: ['lmp', 'conception', 'ivf', 'edd'],\n description:\n 'Which anchor to date from — last menstrual period, conception, IVF transfer, or a known estimated delivery date.',\n },\n },\n required: ['method'],\n additionalProperties: false,\n },\n idempotent: true,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the method was applied.',\n },\n errors: [\n 'Returns false for a method outside the four supported anchors.',\n ],\n examples: [\n { args: { method: 'edd' }, note: 'Date backwards from a known EDD.' },\n ],\n descriptionKey: 'ui.agent.pregnancyDating.actions.setMethod',\n description:\n 'Choose which anchor the pregnancy is dated from. The reference date is kept and re-interpreted under the new method, so set the method first — only a known EDD may be in the future.',\n invoke: (\n handle,\n args: { method: 'lmp' | 'conception' | 'ivf' | 'edd' },\n ) => handle.setMethod(args.method),\n },\n set_reference_date: {\n safety: 'write',\n argsType: '{ date: string | null }',\n argsSchema: {\n type: 'object',\n properties: {\n date: {\n oneOf: [\n { ...isoDate, description: 'Local calendar date, `yyyy-MM-dd`.' },\n { type: 'null' },\n ],\n description:\n 'The date the active method anchors on — LMP, conception, transfer, or known EDD — or null to clear it. Only a known EDD may be in the future.',\n },\n },\n required: ['date'],\n additionalProperties: false,\n },\n idempotent: true,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the date was applied.',\n },\n errors: [\n 'Returns false for an unparseable date, or for a future date under any method but `edd` — the on-screen DatePicker caps those at today.',\n ],\n examples: [\n {\n args: { date: '2026-01-12' },\n note: 'Under the default LMP method, a last period starting 12 January.',\n },\n ],\n descriptionKey: 'ui.agent.pregnancyDating.actions.setReferenceDate',\n description:\n 'Set the reference date for the active method. This is the only required input — the result stays null without it.',\n invoke: (handle, args: { date: string | null }) =>\n handle.setReferenceDate(args.date),\n },\n set_cycle_length: {\n safety: 'write',\n argsType: '{ days: number | null }',\n argsSchema: {\n type: 'object',\n properties: {\n days: {\n oneOf: [\n { type: 'integer', minimum: 20, maximum: 45 },\n { type: 'null' },\n ],\n description:\n 'Average cycle length in days (20–45), or null to fall back to the 28-day default.',\n },\n },\n required: ['days'],\n additionalProperties: false,\n },\n idempotent: true,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the value was applied.',\n },\n errors: [\n 'Returns false outside 20–45 days — the same bounds the on-screen NumberInput enforces.',\n 'Applies but changes nothing unless the method is `lmp`, and is ignored once a CRL re-dating is confirmed.',\n ],\n descriptionKey: 'ui.agent.pregnancyDating.actions.setCycleLength',\n description:\n 'LMP method only — set the average cycle length, which shifts Naegele dating off the 28-day assumption.',\n invoke: (handle, args: { days: number | null }) =>\n handle.setCycleLength(args.days),\n },\n set_embryo_age: {\n safety: 'write',\n argsType: '{ days: 3 | 5 }',\n argsSchema: {\n type: 'object',\n properties: {\n days: {\n enum: [3, 5],\n description:\n 'Embryo age at transfer in days — 3 (cleavage) or 5 (blastocyst).',\n },\n },\n required: ['days'],\n additionalProperties: false,\n },\n idempotent: true,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the value was applied.',\n },\n errors: [\n 'Returns false for any value other than 3 or 5.',\n 'Applies but changes nothing unless the method is `ivf`.',\n ],\n descriptionKey: 'ui.agent.pregnancyDating.actions.setEmbryoAge',\n description:\n 'IVF method only — set the embryo age at transfer, which offsets the transfer date back to a notional LMP.',\n invoke: (handle, args: { days: 3 | 5 }) => handle.setEmbryoAge(args.days),\n },\n set_crl: {\n safety: 'write',\n argsType: '{ crlMm?: number | null, scanDate?: string | null }',\n argsSchema: {\n type: 'object',\n properties: {\n crlMm: {\n oneOf: [{ type: 'number', exclusiveMinimum: 0 }, { type: 'null' }],\n description:\n 'Crown-rump length in millimetres, or null to clear it.',\n },\n scanDate: {\n oneOf: [{ ...isoDate }, { type: 'null' }],\n description:\n 'Date of the CRL scan (`yyyy-MM-dd`, not in the future), or null to clear it.',\n },\n },\n additionalProperties: false,\n },\n idempotent: true,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the measurement was applied.',\n },\n errors: [\n 'Returns false and writes nothing when the length is not positive or the scan date is unparseable or in the future — the payload applies all-or-nothing.',\n 'Re-dating only happens under the `lmp` method, and only when both the length and the scan date are set.',\n ],\n examples: [\n {\n args: { crlMm: 42, scanDate: '2026-02-20' },\n note: 'A first-trimester CRL that may re-date the pregnancy per ACOG CO 700.',\n },\n ],\n descriptionKey: 'ui.agent.pregnancyDating.actions.setCrl',\n description:\n 'LMP method only — set the first-trimester crown-rump length and its scan date. A confirmed re-dating wins over both the cycle length and the manual adjustment.',\n invoke: (\n handle,\n args: { crlMm?: number | null; scanDate?: string | null },\n ) => handle.setCrl(args),\n },\n set_dating_adjustment: {\n safety: 'write',\n argsType: '{ days: number | null }',\n argsSchema: {\n type: 'object',\n properties: {\n days: {\n oneOf: [{ type: 'integer' }, { type: 'null' }],\n description:\n 'Whole days to nudge the dating by — positive moves the pregnancy further along — or null for no adjustment.',\n },\n },\n required: ['days'],\n additionalProperties: false,\n },\n idempotent: true,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the value was applied.',\n },\n errors: [\n 'Returns false for a non-integer number of days.',\n 'Applies but changes nothing while a CRL re-dating is confirmed — the measurement wins.',\n ],\n examples: [\n {\n args: { days: 3 },\n note: 'An uncertain LMP judged three days earlier than entered.',\n },\n ],\n descriptionKey: 'ui.agent.pregnancyDating.actions.setDatingAdjustment',\n description:\n 'Nudge the dating by whole days for an uncertain anchor. Positive moves the pregnancy further along (earlier effective LMP, earlier due date).',\n invoke: (handle, args: { days: number | null }) =>\n handle.setDatingAdjustment(args.days),\n },\n set_as_of_date: {\n safety: 'write',\n argsType: '{ date: string }',\n argsSchema: {\n type: 'object',\n properties: {\n date: {\n ...isoDate,\n description:\n 'Date to evaluate gestational age and trimester against, `yyyy-MM-dd`. May be in the future to project forward.',\n },\n },\n required: ['date'],\n additionalProperties: false,\n },\n idempotent: true,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the date was applied.',\n },\n errors: ['Returns false for an unparseable date.'],\n examples: [\n {\n args: { date: '2026-09-15' },\n note: 'Project gestational age forward to an upcoming appointment.',\n },\n ],\n descriptionKey: 'ui.agent.pregnancyDating.actions.setAsOfDate',\n description:\n 'Set the date gestational age, trimester and the antenatal schedule are evaluated against. Defaults to today; the estimated delivery date itself does not depend on it.',\n invoke: (handle, args: { date: string }) => handle.setAsOfDate(args.date),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'pregnancy-dating',\n description: 'Marks the PregnancyDating wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Also the registry key — without an `id` the instance does not register and the handle-driven actions/state are unreachable.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* PregnancyDating — the unified obstetric dating widget. */\n/* */\n/* Supersedes DueDateCalculator + GestationalAgeCalculator: takes any */\n/* known anchor (LMP / conception / IVF transfer / known EDD) and shows */\n/* BOTH the estimated due date AND the current gestational age, */\n/* trimester and milestones. Two dating refinements: a precise CRL + */\n/* scan-date ACOG CO 700 re-dating (LMP), and a quick manual ±days */\n/* adjustment for an uncertain LMP/conception. `showSchedule` appends */\n/* the antenatal exam schedule with plurality / chorionicity / risk */\n/* inputs. All maths lives in `_shared/obstetrics` + `_shared/antenatal- */\n/* schedule` (pure, separately tested). */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useMemo, useRef, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { format, isAfter, parseISO, subDays } from 'date-fns';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { pregnancyDatingAgent } from './pregnancy-dating.agent';\nimport { RadioGroup, Radio } from '../radio-group';\nimport { FormField } from '../form-field';\nimport { DatePicker } from '../date-picker';\nimport { NumberInput } from '../number-input';\nimport { Select } from '../select';\nimport { Switch } from '../switch';\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 {\n type EmbryoAge,\n type GestationalAge,\n type DueDateResult,\n type Plurality,\n type Chorionicity,\n computeDueDate,\n redateByCrl,\n gestationalMilestones,\n GESTATION_DAYS,\n CONCEPTION_OFFSET_DAYS,\n DEFAULT_CYCLE_LENGTH,\n TRIMESTER_BADGE_VARIANT,\n trimesterHighlightToken,\n} from '../_shared/obstetrics';\nimport {\n computeAntenatalSchedule,\n type AntenatalScheduleOptions,\n type GdmRisk,\n} from '../_shared/antenatal-schedule';\nimport {\n AntenatalScheduleTimeline,\n buildScheduleInsertFields,\n} from '../_shared/antenatal-schedule-timeline';\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\n/** Any known anchor the pregnancy can be dated from. */\nexport type DatingMethod = 'lmp' | 'conception' | 'ivf' | 'edd';\n\n/** i18n key for each method's reference-date field. */\nconst DATE_LABEL_KEY: Record<DatingMethod, string> = {\n lmp: 'pregnancyDating.lmpDate',\n conception: 'pregnancyDating.conceptionDate',\n ivf: 'pregnancyDating.transferDate',\n edd: 'pregnancyDating.eddDate',\n};\n\nexport interface PregnancyDatingResult {\n /** Estimated date of delivery. */\n dueDate: Date;\n /** GA day-0 anchor (effective LMP) after any re-dating / adjustment. */\n gestationalStart: Date;\n /** Gestational age as of the evaluation date; `null` before conception. */\n gestationalAge: GestationalAge | null;\n trimester: DueDateResult['trimester'];\n}\n\n/* ------------------------------------------------------------------ */\n/* Agent boundary */\n/* */\n/* Dates cross the agent boundary as local-time `yyyy-MM-dd` strings, */\n/* never `Date` objects — a Date JSON-serialises to UTC and silently */\n/* shifts the day for anyone east or west of Greenwich. */\n/* ------------------------------------------------------------------ */\n\nconst toIsoDate = (d: Date): string => format(d, 'yyyy-MM-dd');\n\nconst fromIsoDate = (iso: string): Date | null => {\n const d = parseISO(iso);\n return Number.isNaN(d.getTime()) ? null : d;\n};\n\n/** UI input bounds, mirrored by the agent handle so it can't out-type a user. */\nconst CYCLE_LENGTH_RANGE = { min: 20, max: 45 } as const;\n\n/** The dating inputs as entered. */\nexport interface PregnancyDatingInputsSnapshot {\n /** Which anchor the pregnancy is dated from. */\n method: DatingMethod;\n /** The method's reference date (`yyyy-MM-dd`), or null when unset. */\n referenceDate: string | null;\n /** LMP only — average cycle length in days, or null for the 28-day default. */\n cycleLength: number | null;\n /** IVF only — embryo age at transfer, in days. */\n embryoAge: EmbryoAge;\n /** LMP only — crown-rump length in millimetres, or null. */\n crlMm: number | null;\n /** LMP only — date of the CRL scan (`yyyy-MM-dd`), or null. */\n scanDate: string | null;\n /** Manual ±days nudge applied to the dating, or null. */\n datingAdjustment: number | null;\n /** The date gestational age and trimester are evaluated against. */\n asOfDate: string;\n}\n\n/** `PregnancyDatingResult` projected onto the agent boundary — ISO dates. */\nexport interface PregnancyDatingSnapshot {\n /** Estimated date of delivery, `yyyy-MM-dd`. */\n dueDate: string;\n /** GA day-0 anchor after any re-dating / adjustment, `yyyy-MM-dd`. */\n gestationalStart: string;\n /** Gestational age as of the evaluation date; null before conception. */\n gestationalAge: { weeks: number; days: number; totalDays: number } | null;\n /** Trimester band as of the evaluation date. */\n trimester: DueDateResult['trimester'];\n}\n\n/**\n * Curated imperative handle for agent / external automation. Reads the dating\n * inputs and the computed EDD + gestational age, and drives the inputs the way\n * a user would. Never exposes patient identity — only structural dates and\n * numbers. Consumed by `pregnancy-dating.agent.ts`; the public `ref` stays the\n * root DOM element.\n */\nexport interface PregnancyDatingHandle {\n /** The dating inputs as entered. */\n getInputs: () => PregnancyDatingInputsSnapshot;\n /** Computed due date, gestational age and trimester, or null until a reference date is set. */\n getResult: () => PregnancyDatingSnapshot | null;\n /** Switch the dating anchor. Keeps the reference date, which is re-interpreted. */\n setMethod: (method: DatingMethod) => boolean;\n /** Set the method's reference date (`yyyy-MM-dd`); only a known EDD may be in the future. */\n setReferenceDate: (isoDate: string | null) => boolean;\n /** LMP only — set the average cycle length in days (20–45). */\n setCycleLength: (days: number | null) => boolean;\n /** IVF only — set the embryo age at transfer (3 or 5 days). */\n setEmbryoAge: (days: EmbryoAge) => boolean;\n /** LMP only — set the CRL measurement and/or its scan date for ACOG re-dating. */\n setCrl: (next: {\n crlMm?: number | null;\n scanDate?: string | null;\n }) => boolean;\n /** Set the manual ±days dating nudge (positive = further along). */\n setDatingAdjustment: (days: number | null) => boolean;\n /** Set the date gestational age and trimester are evaluated against. */\n setAsOfDate: (isoDate: string) => boolean;\n}\n\nexport interface PregnancyDatingProps extends VariantProps<\n typeof rootVariants\n> {\n /** Initial dating method. Defaults to `'lmp'`. */\n defaultMethod?: DatingMethod;\n /** Pre-fill the reference date (e.g. a known LMP from the patient record). */\n defaultReferenceDate?: Date;\n /** Fires whenever a result can be computed (and `null` when it can't). */\n onResultChange?: (result: PregnancyDatingResult | null) => void;\n /** When provided, shows the result-action buttons that emit / copy the result. */\n onInsert?: (payload: InsertPayload) => void;\n /** Which verb the result button performs. Defaults to `'insert'`. */\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 /** Brand wordmark printed in the inserted/copied result-card footer. */\n insertBrand?: string | false;\n /** Append the antenatal exam schedule + reveal the plurality / risk inputs. */\n showSchedule?: boolean;\n /** `showSchedule` only — initial number of babies. Defaults to `'singleton'`. */\n defaultPlurality?: Plurality;\n /** `showSchedule` only — initial chorionicity for multiples. Defaults to `'unknown'`. */\n defaultChorionicity?: Chorionicity;\n /** `showSchedule` only — initial Rh-negative state (surfaces anti-D). */\n defaultRhNegative?: boolean;\n /** `showSchedule` only — initial gestational-diabetes risk tier (surfaces OGTT). */\n defaultGdmRisk?: GdmRisk;\n /**\n * Passthrough options for the appended schedule (national `schedule`,\n * `includeOnIndication`, `birthGuideline`). `today`, `plurality`,\n * `chorionicity`, `rhNegative` and `gdmRisk` come from the component's own\n * inputs. Ignored unless `showSchedule` is set.\n */\n scheduleOptions?: Omit<\n AntenatalScheduleOptions,\n 'today' | 'plurality' | 'chorionicity' | 'rhNegative' | 'gdmRisk'\n >;\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 PregnancyDating = forwardRef<HTMLDivElement, PregnancyDatingProps>(\n (\n {\n defaultMethod = 'lmp',\n defaultReferenceDate,\n onResultChange,\n onInsert,\n insertVariant = 'insert',\n onCopy,\n onError,\n insertBrand,\n showSchedule = false,\n defaultPlurality = 'singleton',\n defaultChorionicity = 'unknown',\n defaultRhNegative = false,\n defaultGdmRisk,\n scheduleOptions,\n id,\n width,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation('ui');\n\n const [method, setMethod] = useState<DatingMethod>(defaultMethod);\n const [refDate, setRefDate] = useState<Date | undefined>(\n defaultReferenceDate,\n );\n const [cycleLength, setCycleLength] = useState<number | null>(\n DEFAULT_CYCLE_LENGTH,\n );\n const [embryoAge, setEmbryoAge] = useState<EmbryoAge>(5);\n // Precise re-dating (LMP method) and the quick ±days nudge.\n const [crlMm, setCrlMm] = useState<number | null>(null);\n const [scanDate, setScanDate] = useState<Date | undefined>(undefined);\n const [datingAdjustment, setDatingAdjustment] = useState<number | null>(\n null,\n );\n // Evaluation date (\"as of\") + multiple-pregnancy / risk inputs.\n const [asOfDate, setAsOfDate] = useState<Date>(() => new Date());\n const [plurality, setPlurality] = useState<Plurality>(defaultPlurality);\n const [chorionicity, setChorionicity] =\n useState<Chorionicity>(defaultChorionicity);\n const [rhNegative, setRhNegative] = useState<boolean>(defaultRhNegative);\n const [gdmRisk, setGdmRisk] = useState<GdmRisk | 'none'>(\n defaultGdmRisk ?? 'none',\n );\n\n // Real today caps the past-only date inputs (LMP, conception, transfer, scan).\n const today = useMemo(() => new Date(), []);\n\n // CRL re-dating (LMP method only) — the measurement-based path.\n const redating = useMemo(() => {\n if (method !== 'lmp' || !refDate || crlMm === null || !scanDate) {\n return null;\n }\n return redateByCrl({ lmp: refDate, scanDate, crlMm });\n }, [method, refDate, crlMm, scanDate]);\n\n const data = useMemo(() => {\n if (!refDate) return null;\n\n // Resolve the method's anchor to an effective LMP (GA day 0).\n let effectiveLmp: Date;\n let cycleForEdd = DEFAULT_CYCLE_LENGTH;\n if (method === 'lmp') {\n effectiveLmp = refDate;\n cycleForEdd = cycleLength ?? DEFAULT_CYCLE_LENGTH;\n } else if (method === 'conception') {\n effectiveLmp = subDays(refDate, CONCEPTION_OFFSET_DAYS);\n } else if (method === 'ivf') {\n effectiveLmp = subDays(refDate, embryoAge + CONCEPTION_OFFSET_DAYS);\n } else {\n effectiveLmp = subDays(refDate, GESTATION_DAYS);\n }\n\n // A confirmed CRL re-dating wins over everything (measurement-based); else\n // apply the quick ±days nudge (+ = pregnancy further along → earlier LMP).\n if (method === 'lmp' && redating?.redated) {\n effectiveLmp = redating.gestationalStart;\n cycleForEdd = DEFAULT_CYCLE_LENGTH;\n } else if (datingAdjustment) {\n effectiveLmp = subDays(effectiveLmp, datingAdjustment);\n }\n\n const r = computeDueDate(\n { method: 'lmp', date: effectiveLmp, cycleLength: cycleForEdd },\n asOfDate,\n );\n return {\n result: {\n dueDate: r.dueDate,\n gestationalStart: r.gestationalStart,\n gestationalAge: r.gestationalAge,\n trimester: r.trimester,\n } satisfies PregnancyDatingResult,\n milestones: gestationalMilestones(r.gestationalStart),\n };\n }, [\n method,\n refDate,\n cycleLength,\n embryoAge,\n redating,\n datingAdjustment,\n asOfDate,\n ]);\n\n const result = data?.result ?? null;\n\n const schedule = useMemo(() => {\n if (!showSchedule || !result) return null;\n return computeAntenatalSchedule(result.gestationalStart, {\n ...scheduleOptions,\n today: asOfDate,\n plurality,\n chorionicity,\n rhNegative,\n gdmRisk: gdmRisk === 'none' ? undefined : gdmRisk,\n });\n }, [\n showSchedule,\n result,\n asOfDate,\n scheduleOptions,\n plurality,\n chorionicity,\n rhNegative,\n gdmRisk,\n ]);\n\n const longDate = useMemo(\n () => new Intl.DateTimeFormat(i18n.language, { dateStyle: 'long' }),\n [i18n.language],\n );\n const medDate = useMemo(\n () => new Intl.DateTimeFormat(i18n.language, { dateStyle: 'medium' }),\n [i18n.language],\n );\n\n useEffect(() => {\n onResultChange?.(result);\n }, [result, onResultChange]);\n\n /* ── Agent handle ────────────────────────────────────────────────── */\n const liveRef = useRef({\n method,\n refDate,\n cycleLength,\n embryoAge,\n crlMm,\n scanDate,\n datingAdjustment,\n asOfDate,\n result,\n });\n liveRef.current = {\n method,\n refDate,\n cycleLength,\n embryoAge,\n crlMm,\n scanDate,\n datingAdjustment,\n asOfDate,\n result,\n };\n\n const agentHandle = useMemo<PregnancyDatingHandle>(\n () => ({\n getInputs: () => {\n const live = liveRef.current;\n return {\n method: live.method,\n referenceDate: live.refDate ? toIsoDate(live.refDate) : null,\n cycleLength: live.cycleLength,\n embryoAge: live.embryoAge,\n crlMm: live.crlMm,\n scanDate: live.scanDate ? toIsoDate(live.scanDate) : null,\n datingAdjustment: live.datingAdjustment,\n asOfDate: toIsoDate(live.asOfDate),\n };\n },\n getResult: () => {\n const r = liveRef.current.result;\n if (!r) return null;\n return {\n dueDate: toIsoDate(r.dueDate),\n gestationalStart: toIsoDate(r.gestationalStart),\n gestationalAge: r.gestationalAge ? { ...r.gestationalAge } : null,\n trimester: r.trimester,\n };\n },\n setMethod: (next) => {\n if (\n next !== 'lmp' &&\n next !== 'conception' &&\n next !== 'ivf' &&\n next !== 'edd'\n ) {\n return false;\n }\n setMethod(next);\n return true;\n },\n setReferenceDate: (isoDate) => {\n if (isoDate === null) {\n setRefDate(undefined);\n return true;\n }\n const parsed = fromIsoDate(isoDate);\n if (!parsed) return false;\n // The DatePicker caps every anchor but a known EDD at today.\n if (liveRef.current.method !== 'edd' && isAfter(parsed, new Date())) {\n return false;\n }\n setRefDate(parsed);\n return true;\n },\n setCycleLength: (days) => {\n if (\n days !== null &&\n !(\n Number.isFinite(days) &&\n days >= CYCLE_LENGTH_RANGE.min &&\n days <= CYCLE_LENGTH_RANGE.max\n )\n ) {\n return false;\n }\n setCycleLength(days);\n return true;\n },\n setEmbryoAge: (days) => {\n if (days !== 3 && days !== 5) return false;\n setEmbryoAge(days);\n return true;\n },\n setCrl: (next) => {\n const now = new Date();\n let parsedScan: Date | undefined;\n // Validate the whole payload before writing any of it, so a bad\n // value can't leave the form half-updated.\n if ('crlMm' in next) {\n const mm = next.crlMm;\n if (\n mm !== null &&\n mm !== undefined &&\n !(Number.isFinite(mm) && mm > 0)\n ) {\n return false;\n }\n }\n if ('scanDate' in next && next.scanDate != null) {\n const d = fromIsoDate(next.scanDate);\n if (!d || isAfter(d, now)) return false;\n parsedScan = d;\n }\n if ('crlMm' in next) setCrlMm(next.crlMm ?? null);\n if ('scanDate' in next) setScanDate(parsedScan);\n return true;\n },\n setDatingAdjustment: (days) => {\n if (days !== null && !Number.isInteger(days)) return false;\n setDatingAdjustment(days);\n return true;\n },\n setAsOfDate: (isoDate) => {\n const parsed = fromIsoDate(isoDate);\n if (!parsed) return false;\n setAsOfDate(parsed);\n return true;\n },\n }),\n [],\n );\n useAgentRegistration(pregnancyDatingAgent, agentHandle, id);\n\n const chorionicityOptions = useMemo(\n () =>\n (\n [\n 'unknown',\n 'dichorionic-diamniotic',\n 'monochorionic-diamniotic',\n 'monochorionic-monoamniotic',\n ] as const\n ).map((c) => ({\n value: c,\n label: t(`antenatalSchedule.chorionicity.${c}`),\n })),\n [t],\n );\n\n const gaText = (ga: GestationalAge | null): string =>\n ga\n ? t('pregnancyDating.result.gestation', {\n weeks: ga.weeks,\n days: ga.days,\n })\n : '—';\n\n return (\n <div\n ref={ref}\n data-component=\"pregnancy-dating\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <RadioGroup\n label={t('pregnancyDating.method.label')}\n variant=\"horizontal\"\n value={method}\n onValueChange={(next) => setMethod(next as DatingMethod)}\n >\n <Radio label={t('pregnancyDating.method.lmp')} value=\"lmp\" />\n <Radio\n label={t('pregnancyDating.method.conception')}\n value=\"conception\"\n />\n <Radio label={t('pregnancyDating.method.ivf')} value=\"ivf\" />\n <Radio label={t('pregnancyDating.method.edd')} value=\"edd\" />\n </RadioGroup>\n\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n <FormField label={t(DATE_LABEL_KEY[method])}>\n <DatePicker\n value={refDate}\n onChange={setRefDate}\n maxDate={method === 'edd' ? undefined : today}\n />\n </FormField>\n\n {method === 'lmp' && (\n <FormField\n label={t('pregnancyDating.cycleLength')}\n description={t('pregnancyDating.cycleLengthHint')}\n >\n <NumberInput\n mode=\"integer\"\n min={CYCLE_LENGTH_RANGE.min}\n max={CYCLE_LENGTH_RANGE.max}\n value={cycleLength}\n onChange={setCycleLength}\n />\n </FormField>\n )}\n\n {method === 'ivf' && (\n <RadioGroup\n label={t('pregnancyDating.embryoAge')}\n variant=\"horizontal\"\n value={String(embryoAge)}\n onValueChange={(next) => setEmbryoAge(Number(next) as EmbryoAge)}\n >\n <Radio label={t('pregnancyDating.day3')} value=\"3\" />\n <Radio label={t('pregnancyDating.day5')} value=\"5\" />\n </RadioGroup>\n )}\n\n <FormField\n label={t('pregnancyDating.datingAdjustment')}\n description={t('pregnancyDating.datingAdjustmentHint')}\n >\n <NumberInput\n mode=\"integer\"\n value={datingAdjustment}\n onChange={setDatingAdjustment}\n />\n </FormField>\n\n <FormField\n label={t('pregnancyDating.asOfDate')}\n description={t('pregnancyDating.asOfDateHint')}\n >\n <DatePicker\n value={asOfDate}\n onChange={(d) => d && setAsOfDate(d)}\n />\n </FormField>\n </div>\n\n {method === 'lmp' ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n <FormField\n label={t('pregnancyDating.crl')}\n description={t('pregnancyDating.crlHint')}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={0.1}\n value={crlMm}\n onChange={setCrlMm}\n />\n </FormField>\n <FormField label={t('pregnancyDating.scanDate')}>\n <DatePicker\n value={scanDate}\n onChange={setScanDate}\n maxDate={today}\n />\n </FormField>\n </div>\n {redating ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Badge variant={redating.redated ? 'warning' : 'success'}>\n {redating.redated\n ? t('pregnancyDating.redated', {\n days: redating.discrepancyDays,\n })\n : t('pregnancyDating.datesAgree')}\n </Badge>\n {!redating.crlInRange ? (\n <span className=\"type-meta ds:text-muted-foreground\">\n {t('pregnancyDating.crlOutOfRange')}\n </span>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n\n {showSchedule ? (\n <>\n <RadioGroup\n label={t('antenatalSchedule.plurality.label')}\n variant=\"horizontal\"\n value={plurality}\n onValueChange={(next) => setPlurality(next as Plurality)}\n >\n <Radio\n label={t('antenatalSchedule.plurality.singleton')}\n value=\"singleton\"\n />\n <Radio\n label={t('antenatalSchedule.plurality.twin')}\n value=\"twin\"\n />\n <Radio\n label={t('antenatalSchedule.plurality.triplet')}\n value=\"triplet\"\n />\n </RadioGroup>\n\n {plurality !== 'singleton' ? (\n <FormField label={t('antenatalSchedule.chorionicity.label')}>\n <Select\n options={chorionicityOptions}\n value={chorionicity}\n onValueChange={(next) =>\n setChorionicity(next as Chorionicity)\n }\n />\n </FormField>\n ) : null}\n\n <Switch\n label={t('antenatalSchedule.rhNegative')}\n checked={rhNegative}\n onCheckedChange={setRhNegative}\n />\n\n <RadioGroup\n label={t('antenatalSchedule.gdmRisk.label')}\n variant=\"horizontal\"\n value={gdmRisk}\n onValueChange={(next) => setGdmRisk(next as GdmRisk | 'none')}\n >\n <Radio label={t('antenatalSchedule.gdmRisk.none')} value=\"none\" />\n <Radio\n label={t('antenatalSchedule.gdmRisk.medium')}\n value=\"medium\"\n />\n <Radio label={t('antenatalSchedule.gdmRisk.high')} value=\"high\" />\n </RadioGroup>\n </>\n ) : null}\n\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {result\n ? `${t('pregnancyDating.result.dueDateLabel')}: ${longDate.format(\n result.dueDate,\n )}. ${t('pregnancyDating.result.gestationLabel')}: ${gaText(\n result.gestationalAge,\n )}.`\n : ''}\n </p>\n\n {data && result ? (\n <Card variant=\"elevated\">\n <Card.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {/* EDD is the headline — full width so a long localized date\n never wraps; gestational age + trimester flow beneath it,\n packed to the start so they don't strand a gap at narrow /\n modal widths. */}\n <dl className=\"ds:flex ds:flex-wrap ds:items-start ds:gap-x-[var(--spacing-xl)] ds:gap-y-[var(--spacing-md)]\">\n <div className=\"ds:basis-full ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)]\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyDating.result.dueDateLabel')}\n </dt>\n <dd className=\"type-metric ds:text-foreground\">\n {longDate.format(result.dueDate)}\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('pregnancyDating.result.gestationLabel')}\n </dt>\n <dd className=\"type-body ds:text-foreground\">\n {gaText(result.gestationalAge)}\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('pregnancyDating.result.trimesterLabel')}\n </dt>\n <dd>\n <Badge\n variant={TRIMESTER_BADGE_VARIANT[result.trimester]}\n size=\"lg\"\n >\n {t(`pregnancyDating.trimester.${result.trimester}`)}\n </Badge>\n </dd>\n </div>\n </dl>\n\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyDating.milestonesLabel')}\n </span>\n <ul className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {data.milestones.map((m) => {\n const reached = isAfter(asOfDate, m.date);\n return (\n <li\n key={m.key}\n className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-md)]\"\n >\n <span className=\"type-body ds:text-foreground\">\n {t(`pregnancyDating.milestone.${m.key}`)}\n </span>\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span className=\"type-body ds:text-muted-foreground\">\n {medDate.format(m.date)}\n </span>\n {reached ? (\n <Badge variant=\"success\">\n {t('pregnancyDating.reached')}\n </Badge>\n ) : null}\n </span>\n </li>\n );\n })}\n </ul>\n </div>\n </Card.Body>\n </Card>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('pregnancyDating.empty')}\n </p>\n )}\n\n {schedule ? <AntenatalScheduleTimeline events={schedule} /> : null}\n\n {result && (insertVariant === 'copy' || onInsert) ? (\n <InsertButton\n onInsert={onInsert}\n variant={insertVariant}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.pregnancyDating'),\n icon: 'calendar-heart',\n highlight: longDate.format(result.dueDate),\n highlightToken: trimesterHighlightToken(result.trimester),\n brand: insertBrand,\n fields: [\n {\n icon: 'calendar',\n label: t('pregnancyDating.result.dueDateLabel'),\n value: longDate.format(result.dueDate),\n },\n {\n icon: 'clock',\n label: t('pregnancyDating.result.gestationLabel'),\n value: gaText(result.gestationalAge),\n },\n {\n icon: 'tag',\n label: t('pregnancyDating.result.trimesterLabel'),\n value: t(`pregnancyDating.trimester.${result.trimester}`),\n },\n ...(schedule\n ? buildScheduleInsertFields(schedule, t, (d) =>\n medDate.format(d),\n )\n : []),\n ],\n }}\n />\n ) : null}\n </div>\n );\n },\n);\n\nPregnancyDating.displayName = 'PregnancyDating';\n"],"names":["isoDate","pregnancyDatingAgent","handle","args","rootVariants","cva","DATE_LABEL_KEY","toIsoDate","d","format","fromIsoDate","iso","parseISO","CYCLE_LENGTH_RANGE","PregnancyDating","forwardRef","defaultMethod","defaultReferenceDate","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","showSchedule","defaultPlurality","defaultChorionicity","defaultRhNegative","defaultGdmRisk","scheduleOptions","id","width","className","ref","i18n","useTranslation","method","setMethod","useState","refDate","setRefDate","cycleLength","setCycleLength","DEFAULT_CYCLE_LENGTH","embryoAge","setEmbryoAge","crlMm","setCrlMm","scanDate","setScanDate","datingAdjustment","setDatingAdjustment","asOfDate","setAsOfDate","plurality","setPlurality","chorionicity","setChorionicity","rhNegative","setRhNegative","gdmRisk","setGdmRisk","today","useMemo","redating","redateByCrl","data","effectiveLmp","cycleForEdd","subDays","CONCEPTION_OFFSET_DAYS","GESTATION_DAYS","r","computeDueDate","gestationalMilestones","result","schedule","computeAntenatalSchedule","longDate","medDate","useEffect","liveRef","useRef","agentHandle","live","next","parsed","isAfter","days","now","parsedScan","mm","useAgentRegistration","chorionicityOptions","c","gaText","ga","jsxs","RadioGroup","jsx","Radio","FormField","DatePicker","NumberInput","Badge","Fragment","Select","Switch","Card","TRIMESTER_BADGE_VARIANT","m","reached","AntenatalScheduleTimeline","InsertButton","trimesterHighlightToken","buildScheduleInsertFields"],"mappings":"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"}
|
package/dist/_chunks/{pregnancy-weight-gain-BeQRxwdP.js → pregnancy-weight-gain-B_Zldlzq.js}
RENAMED
|
@@ -7,7 +7,7 @@ import { R as M } from "./radio-BZQs6_36.js";
|
|
|
7
7
|
import { R as ee } from "./radio-group-ChIKyeSJ.js";
|
|
8
8
|
import { F as P } from "./form-field-CyHfOVKF.js";
|
|
9
9
|
import { N as I } from "./number-input-CVwI1ltI.js";
|
|
10
|
-
import { C as B } from "./card-
|
|
10
|
+
import { C as B } from "./card-C85_Ndhb.js";
|
|
11
11
|
import { B as E } from "./badge-BUk4RjTS.js";
|
|
12
12
|
import { I as te } from "./insert-result-CDMMt7q8.js";
|
|
13
13
|
import { b as ne, e as ae } from "./bmi-BxD-tFzU.js";
|
|
@@ -550,4 +550,4 @@ export {
|
|
|
550
550
|
ie as p,
|
|
551
551
|
oe as r
|
|
552
552
|
};
|
|
553
|
-
//# sourceMappingURL=pregnancy-weight-gain-
|
|
553
|
+
//# sourceMappingURL=pregnancy-weight-gain-B_Zldlzq.js.map
|