@alfadocs/ui-kit-debug 1.56.0 → 1.58.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/{address-fields-BfjxS05Z.js → address-fields-CJtu7LQU.js} +2 -2
- package/dist/_chunks/{address-fields-BfjxS05Z.js.map → address-fields-CJtu7LQU.js.map} +1 -1
- package/dist/_chunks/{ai-credits-notice-BoNJtOuE.js → ai-credits-notice-ktklr8fy.js} +2 -2
- package/dist/_chunks/{ai-credits-notice-BoNJtOuE.js.map → ai-credits-notice-ktklr8fy.js.map} +1 -1
- package/dist/_chunks/ai-permission-notice-DyuEGwAt.js +206 -0
- package/dist/_chunks/ai-permission-notice-DyuEGwAt.js.map +1 -0
- package/dist/_chunks/alia-sidebar-dybRpWml.js +1284 -0
- package/dist/_chunks/alia-sidebar-dybRpWml.js.map +1 -0
- package/dist/_chunks/{anamnesis-summary-rows-CQ-XGr0T.js → anamnesis-summary-rows-M-FUkw9p.js} +6 -6
- package/dist/_chunks/{anamnesis-summary-rows-CQ-XGr0T.js.map → anamnesis-summary-rows-M-FUkw9p.js.map} +1 -1
- package/dist/_chunks/{app-frame-B-0O9CrU.js → app-frame-CqmDh2v5.js} +2 -2
- package/dist/_chunks/{app-frame-B-0O9CrU.js.map → app-frame-CqmDh2v5.js.map} +1 -1
- package/dist/_chunks/{appointment-peek-BIZaDeCi.js → appointment-peek-WvNbE4JG.js} +2 -2
- package/dist/_chunks/{appointment-peek-BIZaDeCi.js.map → appointment-peek-WvNbE4JG.js.map} +1 -1
- package/dist/_chunks/{appointment-timeline-DmqYEIT9.js → appointment-timeline-Z0494xO-.js} +2 -2
- package/dist/_chunks/{appointment-timeline-DmqYEIT9.js.map → appointment-timeline-Z0494xO-.js.map} +1 -1
- package/dist/_chunks/{balance-badge-cell-DmDcXw0c.js → balance-badge-cell-CGoJZlKf.js} +3 -3
- package/dist/_chunks/{balance-badge-cell-DmDcXw0c.js.map → balance-badge-cell-CGoJZlKf.js.map} +1 -1
- package/dist/_chunks/{booking-WyNGKPE2.js → booking-CiFSAMR-.js} +4 -4
- package/dist/_chunks/{booking-WyNGKPE2.js.map → booking-CiFSAMR-.js.map} +1 -1
- package/dist/_chunks/{calculator-dialog-pCPWta7h.js → calculator-dialog-CzQv03p0.js} +2 -2
- package/dist/_chunks/{calculator-dialog-pCPWta7h.js.map → calculator-dialog-CzQv03p0.js.map} +1 -1
- package/dist/_chunks/{calendar-workspace-Du2ryaI-.js → calendar-workspace-DNHzjG7O.js} +19 -19
- package/dist/_chunks/calendar-workspace-DNHzjG7O.js.map +1 -0
- package/dist/_chunks/{care-plan-card-Ddjh5Doc.js → care-plan-card-DxrRLRdW.js} +2 -2
- package/dist/_chunks/{care-plan-card-Ddjh5Doc.js.map → care-plan-card-DxrRLRdW.js.map} +1 -1
- package/dist/_chunks/{care-plan-header-DUX_SVvF.js → care-plan-header-BMwZIgHJ.js} +2 -2
- package/dist/_chunks/{care-plan-header-DUX_SVvF.js.map → care-plan-header-BMwZIgHJ.js.map} +1 -1
- package/dist/_chunks/{chart-HsF1KHbx.js → chart-ZMkX-Gqy.js} +338 -341
- package/dist/_chunks/chart-ZMkX-Gqy.js.map +1 -0
- package/dist/_chunks/{city-input-BC_nYINn.js → city-input-3J3bz9EO.js} +2 -2
- package/dist/_chunks/{city-input-BC_nYINn.js.map → city-input-3J3bz9EO.js.map} +1 -1
- package/dist/_chunks/{clinical-note-card-14JIoUR0.js → clinical-note-card-hx939bvw.js} +2 -2
- package/dist/_chunks/{clinical-note-card-14JIoUR0.js.map → clinical-note-card-hx939bvw.js.map} +1 -1
- package/dist/_chunks/{color-picker-BRQ4Y9SO.js → color-picker-BsggJovx.js} +128 -123
- package/dist/_chunks/color-picker-BsggJovx.js.map +1 -0
- package/dist/_chunks/{contact-card-CmK05vNb.js → contact-card-fHBMwEsx.js} +2 -2
- package/dist/_chunks/{contact-card-CmK05vNb.js.map → contact-card-fHBMwEsx.js.map} +1 -1
- package/dist/_chunks/{contact-profile-card-Ci8lBQ6a.js → contact-profile-card-CMyBYgRR.js} +2 -2
- package/dist/_chunks/{contact-profile-card-Ci8lBQ6a.js.map → contact-profile-card-CMyBYgRR.js.map} +1 -1
- package/dist/_chunks/{control-room-rail-Tx2jW250.js → control-room-rail-CJ85HkS2.js} +2 -2
- package/dist/_chunks/{control-room-rail-Tx2jW250.js.map → control-room-rail-CJ85HkS2.js.map} +1 -1
- package/dist/_chunks/{cycle-calculator-Dgfqr4Q4.js → cycle-calculator-Cww9DzIa.js} +2 -2
- package/dist/_chunks/{cycle-calculator-Dgfqr4Q4.js.map → cycle-calculator-Cww9DzIa.js.map} +1 -1
- package/dist/_chunks/dashboard-grid-Cs7cJAsA.js +933 -0
- package/dist/_chunks/dashboard-grid-Cs7cJAsA.js.map +1 -0
- package/dist/_chunks/{data-table-D8fuhqO1.js → data-table-Yn5xiGzs.js} +3 -3
- package/dist/_chunks/{data-table-D8fuhqO1.js.map → data-table-Yn5xiGzs.js.map} +1 -1
- package/dist/_chunks/{data-table-tabs-Xhg5G0gU.js → data-table-tabs-CHYAAeHy.js} +2 -2
- package/dist/_chunks/{data-table-tabs-Xhg5G0gU.js.map → data-table-tabs-CHYAAeHy.js.map} +1 -1
- package/dist/_chunks/{date-picker-wRAcq2lt.js → date-picker-BSZuKo13.js} +69 -62
- package/dist/_chunks/date-picker-BSZuKo13.js.map +1 -0
- package/dist/_chunks/{date-range-picker-CtUOI38x.js → date-range-picker-CFk-5O3R.js} +176 -171
- package/dist/_chunks/date-range-picker-CFk-5O3R.js.map +1 -0
- package/dist/_chunks/{date-time-picker-CLeLKuv9.js → date-time-picker-CjxTkblD.js} +92 -85
- package/dist/_chunks/date-time-picker-CjxTkblD.js.map +1 -0
- package/dist/_chunks/{dialog-CUzbnKLw.js → dialog-Dn-iQ0Jp.js} +2 -2
- package/dist/_chunks/{dialog-CUzbnKLw.js.map → dialog-Dn-iQ0Jp.js.map} +1 -1
- package/dist/_chunks/{document-preview-uoTekVR7.js → document-preview-CHGGG0l_.js} +2 -2
- package/dist/_chunks/{document-preview-uoTekVR7.js.map → document-preview-CHGGG0l_.js.map} +1 -1
- package/dist/_chunks/{due-date-calculator-CSjklbyw.js → due-date-calculator-D_qFUiHp.js} +2 -2
- package/dist/_chunks/{due-date-calculator-CSjklbyw.js.map → due-date-calculator-D_qFUiHp.js.map} +1 -1
- package/dist/_chunks/{entity-summary-DcB0fIiv.js → entity-summary-CWcCSThK.js} +2 -2
- package/dist/_chunks/{entity-summary-DcB0fIiv.js.map → entity-summary-CWcCSThK.js.map} +1 -1
- package/dist/_chunks/{face-scheme-BicuUA2K.js → face-scheme-DSKDdIsb.js} +2 -2
- package/dist/_chunks/{face-scheme-BicuUA2K.js.map → face-scheme-DSKDdIsb.js.map} +1 -1
- package/dist/_chunks/{file-manager-Cc_uO8r2.js → file-manager-DEtkQR1F.js} +4 -4
- package/dist/_chunks/{file-manager-Cc_uO8r2.js.map → file-manager-DEtkQR1F.js.map} +1 -1
- package/dist/_chunks/{forgot-password-form-DEx-M_QR.js → forgot-password-form-CEqOmNuX.js} +2 -2
- package/dist/_chunks/{forgot-password-form-DEx-M_QR.js.map → forgot-password-form-CEqOmNuX.js.map} +1 -1
- package/dist/_chunks/{gestational-age-calculator-DqVeJke2.js → gestational-age-calculator-CZi43xKG.js} +2 -2
- package/dist/_chunks/{gestational-age-calculator-DqVeJke2.js.map → gestational-age-calculator-CZi43xKG.js.map} +1 -1
- package/dist/_chunks/{hcg-doubling-BIYyI2Yo.js → hcg-doubling-Ccvh7OaU.js} +2 -2
- package/dist/_chunks/{hcg-doubling-BIYyI2Yo.js.map → hcg-doubling-Ccvh7OaU.js.map} +1 -1
- package/dist/_chunks/{header-settings-ge_3gYEq.js → header-settings-BMcCx2LC.js} +2 -2
- package/dist/_chunks/{header-settings-ge_3gYEq.js.map → header-settings-BMcCx2LC.js.map} +1 -1
- package/dist/_chunks/{heatmap-Gf9r7Tn1.js → heatmap-DiyOSQk9.js} +2 -2
- package/dist/_chunks/{heatmap-Gf9r7Tn1.js.map → heatmap-DiyOSQk9.js.map} +1 -1
- package/dist/_chunks/{help-me-write-templates-fV-Apf72.js → help-me-write-templates-CM1p6qkm.js} +3 -3
- package/dist/_chunks/{help-me-write-templates-fV-Apf72.js.map → help-me-write-templates-CM1p6qkm.js.map} +1 -1
- package/dist/_chunks/{hover-card-BnTueNS2.js → hover-card-U_ZYoh1n.js} +201 -187
- package/dist/_chunks/hover-card-U_ZYoh1n.js.map +1 -0
- package/dist/_chunks/{icon-picker-DWrqmI1c.js → icon-picker-rOFTawXk.js} +3 -3
- package/dist/_chunks/{icon-picker-DWrqmI1c.js.map → icon-picker-rOFTawXk.js.map} +1 -1
- package/dist/_chunks/{info-tip-B0jmIt6M.js → info-tip-CJpNpzZe.js} +2 -2
- package/dist/_chunks/{info-tip-B0jmIt6M.js.map → info-tip-CJpNpzZe.js.map} +1 -1
- package/dist/_chunks/{kit-extensions-Byfxy6sy.js → kit-extensions-DYVxWcqv.js} +4 -4
- package/dist/_chunks/{kit-extensions-Byfxy6sy.js.map → kit-extensions-DYVxWcqv.js.map} +1 -1
- package/dist/_chunks/{link-cell-renderer-TeJNvymP.js → link-cell-renderer-C1wOyxDF.js} +3 -3
- package/dist/_chunks/{link-cell-renderer-TeJNvymP.js.map → link-cell-renderer-C1wOyxDF.js.map} +1 -1
- package/dist/_chunks/link-gRw3NtOt.js +137 -0
- package/dist/_chunks/link-gRw3NtOt.js.map +1 -0
- package/dist/_chunks/{list-RRN2TJ_7.js → list-CNnn7DOD.js} +75 -73
- package/dist/_chunks/list-CNnn7DOD.js.map +1 -0
- package/dist/_chunks/{locale-picker-DfNSdOpy.js → locale-picker-BGfrZyTw.js} +2 -2
- package/dist/_chunks/{locale-picker-DfNSdOpy.js.map → locale-picker-BGfrZyTw.js.map} +1 -1
- package/dist/_chunks/{login-dev-card-DmZ1B0lB.js → login-dev-card-CIim81VB.js} +2 -2
- package/dist/_chunks/{login-dev-card-DmZ1B0lB.js.map → login-dev-card-CIim81VB.js.map} +1 -1
- package/dist/_chunks/marketplace-app-shell-CSDmGLPW.js +613 -0
- package/dist/_chunks/marketplace-app-shell-CSDmGLPW.js.map +1 -0
- package/dist/_chunks/{message-tray-BB95DA82.js → message-tray-DmU0poD7.js} +76 -69
- package/dist/_chunks/message-tray-DmU0poD7.js.map +1 -0
- package/dist/_chunks/{nav-grid-BqCPH8sm.js → nav-grid-Byx8PxuB.js} +2 -2
- package/dist/_chunks/{nav-grid-BqCPH8sm.js.map → nav-grid-Byx8PxuB.js.map} +1 -1
- package/dist/_chunks/navigation-dismiss-B1mcW1CT.js +9 -0
- package/dist/_chunks/navigation-dismiss-B1mcW1CT.js.map +1 -0
- package/dist/_chunks/non-modal-tab-exit-j3CPOuE3.js +89 -0
- package/dist/_chunks/non-modal-tab-exit-j3CPOuE3.js.map +1 -0
- package/dist/_chunks/{note-attachment-I1NLoeRZ.js → note-attachment-Bt2cddsZ.js} +2 -2
- package/dist/_chunks/{note-attachment-I1NLoeRZ.js.map → note-attachment-Bt2cddsZ.js.map} +1 -1
- package/dist/_chunks/{note-timeline-CsY8YOE7.js → note-timeline-CX9nAgAR.js} +2 -2
- package/dist/_chunks/{note-timeline-CsY8YOE7.js.map → note-timeline-CX9nAgAR.js.map} +1 -1
- package/dist/_chunks/{notes-panel-DceRhthG.js → notes-panel-DHLHsxpW.js} +4 -4
- package/dist/_chunks/{notes-panel-DceRhthG.js.map → notes-panel-DHLHsxpW.js.map} +1 -1
- package/dist/_chunks/{notification-tray-__sJXnsz.js → notification-tray-DPU-Xg0i.js} +83 -76
- package/dist/_chunks/notification-tray-DPU-Xg0i.js.map +1 -0
- package/dist/_chunks/{panel-subview-BT-Apwgb.js → panel-subview-D4o6ar6_.js} +61 -47
- package/dist/_chunks/panel-subview-D4o6ar6_.js.map +1 -0
- package/dist/_chunks/{patient-details-DsTtjpuX.js → patient-details-BCaVuaXz.js} +2 -2
- package/dist/_chunks/{patient-details-DsTtjpuX.js.map → patient-details-BCaVuaXz.js.map} +1 -1
- package/dist/_chunks/{patient-field-row-BvZ9luz-.js → patient-field-row-jcRSTrp4.js} +7 -7
- package/dist/_chunks/{patient-field-row-BvZ9luz-.js.map → patient-field-row-jcRSTrp4.js.map} +1 -1
- package/dist/_chunks/{patient-summary-card-9nQWTQf6.js → patient-summary-card-kQIfPQOE.js} +4 -4
- package/dist/_chunks/{patient-summary-card-9nQWTQf6.js.map → patient-summary-card-kQIfPQOE.js.map} +1 -1
- package/dist/_chunks/{payment-automation-upsell-DiHovmUL.js → payment-automation-upsell-C4wHOxsp.js} +2 -2
- package/dist/_chunks/{payment-automation-upsell-DiHovmUL.js.map → payment-automation-upsell-C4wHOxsp.js.map} +1 -1
- package/dist/_chunks/{payment-request-card-CwDpwXUC.js → payment-request-card-DAniJNLX.js} +2 -2
- package/dist/_chunks/{payment-request-card-CwDpwXUC.js.map → payment-request-card-DAniJNLX.js.map} +1 -1
- package/dist/_chunks/{pdf-viewer-C3minW5b.js → pdf-viewer-CNQxa4tv.js} +396 -391
- package/dist/_chunks/pdf-viewer-CNQxa4tv.js.map +1 -0
- package/dist/_chunks/{phone-input-DxkHMYmu.js → phone-input-O9camxkq.js} +156 -151
- package/dist/_chunks/phone-input-O9camxkq.js.map +1 -0
- package/dist/_chunks/popover-BG75rYjN.js +367 -0
- package/dist/_chunks/popover-BG75rYjN.js.map +1 -0
- package/dist/_chunks/{practice-results-Dhbo-fc_.js → practice-results-D07wgCqV.js} +2 -2
- package/dist/_chunks/{practice-results-Dhbo-fc_.js.map → practice-results-D07wgCqV.js.map} +1 -1
- package/dist/_chunks/{pregnancy-dating-Bfu0Cq4H.js → pregnancy-dating-BFzv9g1N.js} +2 -2
- package/dist/_chunks/{pregnancy-dating-Bfu0Cq4H.js.map → pregnancy-dating-BFzv9g1N.js.map} +1 -1
- package/dist/_chunks/{product-hub-panel-BSSiGGG4.js → product-hub-panel-DCYX0rPG.js} +103 -96
- package/dist/_chunks/product-hub-panel-DCYX0rPG.js.map +1 -0
- package/dist/_chunks/{public-footer-CxpG6J1M.js → public-footer-ZWTEG1Rq.js} +2 -2
- package/dist/_chunks/{public-footer-CxpG6J1M.js.map → public-footer-ZWTEG1Rq.js.map} +1 -1
- package/dist/_chunks/{public-header.agent-pr2hyiND.js → public-header.agent-C1SlVSYt.js} +2 -2
- package/dist/_chunks/{public-header.agent-pr2hyiND.js.map → public-header.agent-C1SlVSYt.js.map} +1 -1
- package/dist/_chunks/{radiograph-panel.agent-DkUokbEa.js → radiograph-panel.agent-DyqbTECc.js} +4 -4
- package/dist/_chunks/{radiograph-panel.agent-DkUokbEa.js.map → radiograph-panel.agent-DyqbTECc.js.map} +1 -1
- package/dist/_chunks/{registration-form-D7iNqMBF.js → registration-form-DrSR9Sjk.js} +4 -4
- package/dist/_chunks/{registration-form-D7iNqMBF.js.map → registration-form-DrSR9Sjk.js.map} +1 -1
- package/dist/_chunks/{rich-text-editor-CkFfmA3v.js → rich-text-editor-UgXri8h6.js} +490 -485
- package/dist/_chunks/rich-text-editor-UgXri8h6.js.map +1 -0
- package/dist/_chunks/{scroll-area-ZtFCv9K7.js → scroll-area-CY5SLYNw.js} +104 -74
- package/dist/_chunks/scroll-area-CY5SLYNw.js.map +1 -0
- package/dist/_chunks/{search-bar-DQJS0wJN.js → search-bar-mA4bPe3t.js} +294 -255
- package/dist/_chunks/search-bar-mA4bPe3t.js.map +1 -0
- package/dist/_chunks/{sheet-C7SwIxwB.js → sheet-Dtjk0CVv.js} +3 -3
- package/dist/_chunks/{sheet-C7SwIxwB.js.map → sheet-Dtjk0CVv.js.map} +1 -1
- package/dist/_chunks/sidebar-D4Wllqfz.js +2029 -0
- package/dist/_chunks/sidebar-D4Wllqfz.js.map +1 -0
- package/dist/_chunks/{sign-document-B6HlyCGV.js → sign-document-D4iHS_Ug.js} +2 -2
- package/dist/_chunks/{sign-document-B6HlyCGV.js.map → sign-document-D4iHS_Ug.js.map} +1 -1
- package/dist/_chunks/{signature-request-DhbpB9N9.js → signature-request-dAVgE0_5.js} +3 -3
- package/dist/_chunks/{signature-request-DhbpB9N9.js.map → signature-request-dAVgE0_5.js.map} +1 -1
- package/dist/_chunks/{signed-out-frame-B2GTIeqA.js → signed-out-frame-DOJpobp8.js} +3 -3
- package/dist/_chunks/{signed-out-frame-B2GTIeqA.js.map → signed-out-frame-DOJpobp8.js.map} +1 -1
- package/dist/_chunks/{state-backed-text-input-DECQy5aA.js → state-backed-text-input-Cgh4ms3p.js} +2 -2
- package/dist/_chunks/{state-backed-text-input-DECQy5aA.js.map → state-backed-text-input-Cgh4ms3p.js.map} +1 -1
- package/dist/_chunks/{task-editor-ByyRu29Y.js → task-editor-BflEZmcF.js} +7 -6
- package/dist/_chunks/task-editor-BflEZmcF.js.map +1 -0
- package/dist/_chunks/{tool-rail-Bwyuw_Ot.js → tool-rail-CTq1KwxW.js} +115 -114
- package/dist/_chunks/{tool-rail-Bwyuw_Ot.js.map → tool-rail-CTq1KwxW.js.map} +1 -1
- package/dist/_chunks/{use-appointment-details-read-JsDM48tf.js → use-appointment-details-read-izwoXh-G.js} +8 -8
- package/dist/_chunks/{use-appointment-details-read-JsDM48tf.js.map → use-appointment-details-read-izwoXh-G.js.map} +1 -1
- package/dist/_chunks/use-state-backed-input-DhRQo6gM.js +57 -0
- package/dist/_chunks/use-state-backed-input-DhRQo6gM.js.map +1 -0
- package/dist/_chunks/{voice-control-panel-Bg1eklL0.js → voice-control-panel-an-bpQfF.js} +3 -3
- package/dist/_chunks/{voice-control-panel-Bg1eklL0.js.map → voice-control-panel-an-bpQfF.js.map} +1 -1
- package/dist/_chunks/{widget-picker-DXYBMTfe.js → widget-picker-DlJOgYrZ.js} +80 -57
- package/dist/_chunks/widget-picker-DlJOgYrZ.js.map +1 -0
- package/dist/agent-catalog.json +3 -3
- package/dist/agent-i18n/en.json +1 -1
- package/dist/components/_shared/navigation-dismiss.d.ts +8 -0
- package/dist/components/_shared/navigation-dismiss.d.ts.map +1 -0
- package/dist/components/_shared/non-modal-tab-exit.d.ts +15 -4
- package/dist/components/_shared/non-modal-tab-exit.d.ts.map +1 -1
- package/dist/components/_shared/use-state-backed-input.d.ts +3 -2
- package/dist/components/_shared/use-state-backed-input.d.ts.map +1 -1
- package/dist/components/address-fields/index.js +1 -1
- package/dist/components/ai-credits-notice/index.js +1 -1
- package/dist/components/ai-permission-notice/ai-permission-notice.d.ts +32 -0
- package/dist/components/ai-permission-notice/ai-permission-notice.d.ts.map +1 -1
- package/dist/components/ai-permission-notice/index.d.ts +1 -1
- package/dist/components/ai-permission-notice/index.d.ts.map +1 -1
- package/dist/components/ai-permission-notice/index.js +1 -1
- package/dist/components/app-frame/index.js +1 -1
- package/dist/components/appointment-details-panel/index.js +1 -1
- package/dist/components/appointment-peek/index.js +1 -1
- package/dist/components/appointment-timeline/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/calculator-dialog/index.js +1 -1
- package/dist/components/care-plan-card/index.js +1 -1
- package/dist/components/care-plan-header/index.js +1 -1
- package/dist/components/chart/chart.d.ts +5 -5
- package/dist/components/chart/chart.d.ts.map +1 -1
- package/dist/components/chart/index.js +1 -1
- package/dist/components/city-input/index.js +1 -1
- package/dist/components/clinical-note-card/index.js +1 -1
- package/dist/components/color-picker/color-picker.d.ts.map +1 -1
- package/dist/components/color-picker/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/control-room-rail/index.js +1 -1
- package/dist/components/cycle-calculator/index.js +1 -1
- package/dist/components/dashboard-grid/dashboard-grid.d.ts +33 -8
- package/dist/components/dashboard-grid/dashboard-grid.d.ts.map +1 -1
- package/dist/components/dashboard-grid/index.js +1 -1
- package/dist/components/data-table/index.js +2 -2
- package/dist/components/data-table-tabs/index.js +1 -1
- package/dist/components/date-picker/date-picker.d.ts.map +1 -1
- package/dist/components/date-picker/index.js +1 -1
- package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
- package/dist/components/date-range-picker/index.js +1 -1
- package/dist/components/date-time-picker/date-time-picker.d.ts.map +1 -1
- package/dist/components/date-time-picker/index.js +1 -1
- package/dist/components/dialog/index.js +1 -1
- package/dist/components/document-preview/index.js +1 -1
- package/dist/components/due-date-calculator/index.js +1 -1
- package/dist/components/entity-summary/index.js +1 -1
- package/dist/components/face-scheme/index.js +1 -1
- package/dist/components/file-manager/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/hover-card/hover-card.d.ts.map +1 -1
- package/dist/components/hover-card/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/link/index.js +1 -1
- package/dist/components/link/link.d.ts +5 -3
- package/dist/components/link/link.d.ts.map +1 -1
- package/dist/components/list/index.js +1 -1
- package/dist/components/list/list.d.ts.map +1 -1
- package/dist/components/locale-picker/index.js +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/message-tray/message-tray.d.ts.map +1 -1
- package/dist/components/nav-grid/index.js +1 -1
- package/dist/components/note-timeline/index.js +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/notification-tray/index.js +1 -1
- package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
- package/dist/components/panel-subview/index.js +1 -1
- package/dist/components/panel-subview/panel-subview.d.ts.map +1 -1
- package/dist/components/patient-details/index.js +1 -1
- package/dist/components/patient-summary-card/index.js +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/payment-card/index.js +1 -1
- package/dist/components/pdf-viewer/index.js +1 -1
- package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
- package/dist/components/phone-input/index.js +1 -1
- package/dist/components/phone-input/phone-input.d.ts.map +1 -1
- package/dist/components/popover/index.js +1 -1
- package/dist/components/popover/popover.d.ts +1 -1
- package/dist/components/popover/popover.d.ts.map +1 -1
- package/dist/components/practice-results/index.js +1 -1
- package/dist/components/pregnancy-dating/index.js +1 -1
- package/dist/components/product-hub-tray/index.js +1 -1
- package/dist/components/product-hub-tray/product-hub-tray.d.ts.map +1 -1
- package/dist/components/public-footer/index.js +1 -1
- package/dist/components/public-header/index.js +1 -1
- package/dist/components/radiograph-panel/index.js +1 -1
- package/dist/components/rich-text-editor/editor-toolbar.d.ts.map +1 -1
- package/dist/components/rich-text-editor/index.js +2 -2
- package/dist/components/scroll-area/index.js +1 -1
- package/dist/components/scroll-area/scroll-area.d.ts +6 -5
- package/dist/components/scroll-area/scroll-area.d.ts.map +1 -1
- package/dist/components/search-bar/index.js +1 -1
- package/dist/components/search-bar/search-bar.d.ts +1 -1
- package/dist/components/search-bar/search-bar.d.ts.map +1 -1
- package/dist/components/sheet/index.js +1 -1
- package/dist/components/sidebar/index.d.ts +1 -1
- package/dist/components/sidebar/index.d.ts.map +1 -1
- package/dist/components/sidebar/index.js +1 -1
- package/dist/components/sidebar/sidebar-move.d.ts +88 -0
- package/dist/components/sidebar/sidebar-move.d.ts.map +1 -0
- package/dist/components/sidebar/sidebar.d.ts +26 -1
- package/dist/components/sidebar/sidebar.d.ts.map +1 -1
- package/dist/components/sign-document/index.js +1 -1
- package/dist/components/task-editor/index.js +1 -1
- package/dist/components/task-editor/task-editor.d.ts.map +1 -1
- package/dist/components/tool-rail/index.js +1 -1
- package/dist/components/tool-rail/tool-rail.d.ts.map +1 -1
- package/dist/components/voice-control-panel/index.js +1 -1
- package/dist/components/widget-picker/index.js +1 -1
- package/dist/components/widget-picker/widget-picker.d.ts.map +1 -1
- package/dist/host-compat.css +2 -1
- package/dist/i18n/locales/ar.d.ts +24 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +26 -2
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +24 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +26 -2
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +24 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +26 -2
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +24 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +26 -2
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +24 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +26 -2
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +24 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +26 -2
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +24 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +26 -2
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +24 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +26 -2
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +24 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +26 -2
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +24 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +26 -2
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +24 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +26 -2
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +24 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +26 -2
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +24 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +26 -2
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +24 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +26 -2
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +24 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +26 -2
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +24 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +26 -2
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +24 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +26 -2
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +24 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +26 -2
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +204 -203
- package/dist/locales/ar.json +26 -2
- package/dist/locales/de.json +26 -2
- package/dist/locales/el.json +26 -2
- package/dist/locales/en.json +26 -2
- package/dist/locales/es.json +26 -2
- package/dist/locales/fr.json +26 -2
- package/dist/locales/hi.json +26 -2
- package/dist/locales/it.json +26 -2
- package/dist/locales/ja.json +26 -2
- package/dist/locales/nl.json +26 -2
- package/dist/locales/pl.json +26 -2
- package/dist/locales/pt.json +26 -2
- package/dist/locales/ro.json +26 -2
- package/dist/locales/ru.json +26 -2
- package/dist/locales/sq.json +26 -2
- package/dist/locales/sv.json +26 -2
- package/dist/locales/tr.json +26 -2
- package/dist/locales/zh.json +26 -2
- package/dist/patterns/alia-assistant/alia-asteroid-icon.d.ts +10 -13
- package/dist/patterns/alia-assistant/alia-asteroid-icon.d.ts.map +1 -1
- package/dist/patterns/alia-assistant/alia-chat-surface.d.ts.map +1 -1
- package/dist/patterns/alia-assistant/alia-popout.d.ts +5 -3
- package/dist/patterns/alia-assistant/alia-popout.d.ts.map +1 -1
- package/dist/patterns/alia-assistant/index.d.ts +2 -0
- package/dist/patterns/alia-assistant/index.d.ts.map +1 -1
- package/dist/patterns/alia-assistant/index.js +6 -5
- 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/help-me-write-templates/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/marketplace-app-shell/marketplace-app-shell.d.ts +40 -10
- package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts.map +1 -1
- package/dist/patterns/payment-automation-upsell/index.js +1 -1
- package/dist/patterns/registration-form/index.js +1 -1
- package/dist/patterns/signature-request/index.js +1 -1
- package/dist/patterns/signed-out-frame/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +1 -1
- package/dist/_chunks/ai-permission-notice-5vpblPCx.js +0 -171
- package/dist/_chunks/ai-permission-notice-5vpblPCx.js.map +0 -1
- package/dist/_chunks/alia-sidebar-DOei4Iyu.js +0 -1183
- package/dist/_chunks/alia-sidebar-DOei4Iyu.js.map +0 -1
- package/dist/_chunks/calendar-workspace-Du2ryaI-.js.map +0 -1
- package/dist/_chunks/chart-HsF1KHbx.js.map +0 -1
- package/dist/_chunks/color-picker-BRQ4Y9SO.js.map +0 -1
- package/dist/_chunks/dashboard-grid-DfEY2qci.js +0 -844
- package/dist/_chunks/dashboard-grid-DfEY2qci.js.map +0 -1
- package/dist/_chunks/date-picker-wRAcq2lt.js.map +0 -1
- package/dist/_chunks/date-range-picker-CtUOI38x.js.map +0 -1
- package/dist/_chunks/date-time-picker-CLeLKuv9.js.map +0 -1
- package/dist/_chunks/hover-card-BnTueNS2.js.map +0 -1
- package/dist/_chunks/link-2HokYuIi.js +0 -130
- package/dist/_chunks/link-2HokYuIi.js.map +0 -1
- package/dist/_chunks/list-RRN2TJ_7.js.map +0 -1
- package/dist/_chunks/marketplace-app-shell-Dcx-JEjg.js +0 -541
- package/dist/_chunks/marketplace-app-shell-Dcx-JEjg.js.map +0 -1
- package/dist/_chunks/message-tray-BB95DA82.js.map +0 -1
- package/dist/_chunks/non-modal-tab-exit-D2Bd93Bq.js +0 -65
- package/dist/_chunks/non-modal-tab-exit-D2Bd93Bq.js.map +0 -1
- package/dist/_chunks/notification-tray-__sJXnsz.js.map +0 -1
- package/dist/_chunks/panel-subview-BT-Apwgb.js.map +0 -1
- package/dist/_chunks/pdf-viewer-C3minW5b.js.map +0 -1
- package/dist/_chunks/phone-input-DxkHMYmu.js.map +0 -1
- package/dist/_chunks/popover-BI3oV3eY.js +0 -305
- package/dist/_chunks/popover-BI3oV3eY.js.map +0 -1
- package/dist/_chunks/product-hub-panel-BSSiGGG4.js.map +0 -1
- package/dist/_chunks/rich-text-editor-CkFfmA3v.js.map +0 -1
- package/dist/_chunks/scroll-area-ZtFCv9K7.js.map +0 -1
- package/dist/_chunks/search-bar-DQJS0wJN.js.map +0 -1
- package/dist/_chunks/sidebar-DLsG2AIk.js +0 -1349
- package/dist/_chunks/sidebar-DLsG2AIk.js.map +0 -1
- package/dist/_chunks/task-editor-ByyRu29Y.js.map +0 -1
- package/dist/_chunks/use-state-backed-input-C7ESmxKB.js +0 -59
- package/dist/_chunks/use-state-backed-input-C7ESmxKB.js.map +0 -1
- package/dist/_chunks/widget-picker-DXYBMTfe.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-grid-BqCPH8sm.js","sources":["../../src/components/nav-grid/nav-grid.agent.ts","../../src/components/nav-grid/nav-grid.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — NavGrid. */\n/* */\n/* A responsive grid of navigable tiles (the composition primitive behind */\n/* a settings hub). It exposes the live tile count and lets an agent */\n/* activate a tile by id — which either follows the tile's href or fires */\n/* its select handler. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the full contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { NavGridHandle } from './nav-grid';\n\nexport const navGridAgent: AgentAdapter<NavGridHandle> = {\n id: 'nav-grid',\n capabilities: ['navigate'],\n state: {\n itemCount: {\n type: 'number',\n descriptionKey: 'ui.agent.navGrid.state.itemCount',\n description: 'Number of navigable tiles currently rendered in the grid.',\n read: (handle) => handle.getItemCount(),\n },\n },\n actions: {\n open_item: {\n safety: 'write',\n openWorld: false,\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description:\n 'Stable opaque tile id (emitted as data-nav-item-id on each tile).',\n },\n },\n required: ['id'],\n },\n descriptionKey: 'ui.agent.navGrid.actions.openItem',\n description:\n 'Activate the tile with the given id (navigates or fires its select handler).',\n examples: [\n {\n args: { id: 'billing' },\n note: 'Open the \"billing\" settings section.',\n },\n ],\n invoke: (handle, args: { id: string }) => {\n handle.openItem(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'nav-grid',\n description: 'Marks the NavGrid nav landmark.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific grid from the agent.',\n },\n item: {\n attr: 'data-nav-item-id',\n sourceProp: 'item id',\n description:\n 'Stable opaque id of a tile, sourced from each item.id. open_item targets this attribute.',\n },\n },\n};\n","import { forwardRef, useMemo, type ReactNode } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { Link } from '../link/link';\nimport { useAgentRegistration } from '../../agent';\nimport { navGridAgent } from './nav-grid.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport interface NavGridItem {\n /** Stable, opaque id. Emitted as `data-nav-item-id`; agents target it. */\n id: string;\n /** Localised tile label — supplied by the consumer (never bundled here). */\n label: string;\n /** Optional localised supporting text shown under the label. */\n description?: string;\n /** Decorative leading glyph. Rendered `aria-hidden`. */\n icon?: ReactNode;\n /** When set, the tile is a navigating anchor (kit Link). */\n href?: string;\n /** When `href` is absent, the tile is a button firing this handler. */\n onSelect?: () => void;\n /** Render the tile non-interactive and visually muted. */\n disabled?: boolean;\n}\n\n/** Agent-readiness curated handle for NavGrid. */\nexport interface NavGridHandle {\n getItemCount: () => number;\n /** Activate the tile with the given id (navigate, or fire its onSelect). */\n openItem: (id: string) => void;\n}\n\nexport interface NavGridProps {\n /** Tiles to render. label / description / icon are consumer-supplied props. */\n items: NavGridItem[];\n /** REQUIRED — the nav landmark's accessible name (e.g. \"Settings sections\"). */\n ariaLabel: string;\n /** Column count. Omit for the responsive default (1 → 2 → 3 at sm / lg). */\n columns?: 1 | 2 | 3 | 4;\n /** `label` sorts tiles by `label.localeCompare`; `none` (default) preserves order. */\n sort?: 'label' | 'none';\n id?: string;\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst gridVariants = cva(\n 'ds:grid ds:list-none ds:m-0 ds:p-0 ds:gap-[var(--spacing-md)]',\n {\n variants: {\n columns: {\n // Responsive default: one column on mobile, two from sm, three from lg.\n responsive: 'ds:grid-cols-1 ds:sm:grid-cols-2 ds:lg:grid-cols-3',\n '1': 'ds:grid-cols-1',\n '2': 'ds:grid-cols-1 ds:sm:grid-cols-2',\n '3': 'ds:grid-cols-1 ds:sm:grid-cols-2 ds:lg:grid-cols-3',\n '4': 'ds:grid-cols-1 ds:sm:grid-cols-2 ds:lg:grid-cols-4',\n },\n },\n defaultVariants: { columns: 'responsive' },\n },\n);\n\n// Shared tile look applied to BOTH the Link (href) and the button (onSelect)\n// so the two render identically. Focus ring is included here so the native\n// button gets a visible ring too (Link also carries its own — same tokens).\nconst tileVariants = cva(\n [\n 'ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)] ds:text-start',\n 'ds:h-full ds:w-full ds:min-h-[var(--min-target-size)] ds:p-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-lg)] ds:[:where(&)]:border-[length:var(--surface-border-width,var(--border-width-sm))] ds:border-[color:var(--card-border)]',\n 'ds:bg-[var(--card)] ds:text-[var(--card-foreground)] ds:no-underline',\n 'ds:transition-shadow ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:outline-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n {\n variants: {\n disabled: {\n true: 'ds:opacity-50 ds:cursor-not-allowed ds:pointer-events-none',\n false: 'ds:cursor-pointer ds:hover:shadow-[var(--shadow-hover)]',\n },\n },\n defaultVariants: { disabled: false },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Tile content */\n/* ------------------------------------------------------------------ */\n\nfunction TileContent({ item }: { item: NavGridItem }) {\n return (\n <>\n {item.icon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:items-center ds:text-[var(--muted-foreground)] ds:[&_svg]:size-6\"\n >\n {item.icon}\n </span>\n ) : null}\n {/* `no-underline` on the span reliably suppresses the Link's underline\n across this text regardless of stylesheet order (own decoration box). */}\n <span className=\"type-body ds:font-medium ds:text-[var(--card-foreground)] ds:no-underline\">\n {item.label}\n </span>\n {item.description ? (\n <span className=\"type-body-sm ds:text-[var(--muted-foreground)] ds:no-underline\">\n {item.description}\n </span>\n ) : null}\n </>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const NavGrid = forwardRef<HTMLElement, NavGridProps>(function NavGrid(\n { items, ariaLabel, columns, sort = 'none', id, className },\n ref,\n) {\n // Locale-aware sort is the consumer's opt-in; otherwise render as given.\n const resolvedItems = useMemo(\n () =>\n sort === 'label'\n ? [...items].sort((a, b) => a.label.localeCompare(b.label))\n : items,\n [items, sort],\n );\n\n const handle = useMemo<NavGridHandle>(\n () => ({\n getItemCount: () => items.length,\n openItem: (itemId) => {\n const target = items.find((it) => it.id === itemId);\n if (!target || target.disabled) return;\n if (target.href) {\n if (typeof window !== 'undefined') window.location.href = target.href;\n } else {\n target.onSelect?.();\n }\n },\n }),\n [items],\n );\n useAgentRegistration(navGridAgent, handle, id);\n\n const columnKey =\n columns === undefined\n ? ('responsive' as const)\n : (String(columns) as '1' | '2' | '3' | '4');\n\n return (\n <nav\n ref={ref}\n id={id}\n aria-label={ariaLabel}\n data-component=\"nav-grid\"\n data-component-id={id}\n className={className}\n >\n <ul className={gridVariants({ columns: columnKey })}>\n {resolvedItems.map((item) => (\n <li key={item.id} data-nav-item-id={item.id}>\n {item.href !== undefined ? (\n <Link\n href={item.href}\n intent=\"subtle\"\n disabled={item.disabled}\n className={tileVariants({ disabled: Boolean(item.disabled) })}\n >\n <TileContent item={item} />\n </Link>\n ) : (\n <button\n type=\"button\"\n onClick={item.disabled ? undefined : item.onSelect}\n disabled={item.disabled}\n aria-disabled={item.disabled || undefined}\n className={tileVariants({ disabled: Boolean(item.disabled) })}\n >\n <TileContent item={item} />\n </button>\n )}\n </li>\n ))}\n </ul>\n </nav>\n );\n});\n\nNavGrid.displayName = 'NavGrid';\n\nexport { tileVariants as navGridTileVariants };\n"],"names":["navGridAgent","handle","args","gridVariants","cva","tileVariants","TileContent","item","jsxs","Fragment","jsx","NavGrid","forwardRef","items","ariaLabel","columns","sort","id","className","ref","resolvedItems","useMemo","a","b","itemId","target","it","_a","useAgentRegistration","columnKey","Link"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nav-grid-Byx8PxuB.js","sources":["../../src/components/nav-grid/nav-grid.agent.ts","../../src/components/nav-grid/nav-grid.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — NavGrid. */\n/* */\n/* A responsive grid of navigable tiles (the composition primitive behind */\n/* a settings hub). It exposes the live tile count and lets an agent */\n/* activate a tile by id — which either follows the tile's href or fires */\n/* its select handler. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the full contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { NavGridHandle } from './nav-grid';\n\nexport const navGridAgent: AgentAdapter<NavGridHandle> = {\n id: 'nav-grid',\n capabilities: ['navigate'],\n state: {\n itemCount: {\n type: 'number',\n descriptionKey: 'ui.agent.navGrid.state.itemCount',\n description: 'Number of navigable tiles currently rendered in the grid.',\n read: (handle) => handle.getItemCount(),\n },\n },\n actions: {\n open_item: {\n safety: 'write',\n openWorld: false,\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description:\n 'Stable opaque tile id (emitted as data-nav-item-id on each tile).',\n },\n },\n required: ['id'],\n },\n descriptionKey: 'ui.agent.navGrid.actions.openItem',\n description:\n 'Activate the tile with the given id (navigates or fires its select handler).',\n examples: [\n {\n args: { id: 'billing' },\n note: 'Open the \"billing\" settings section.',\n },\n ],\n invoke: (handle, args: { id: string }) => {\n handle.openItem(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'nav-grid',\n description: 'Marks the NavGrid nav landmark.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific grid from the agent.',\n },\n item: {\n attr: 'data-nav-item-id',\n sourceProp: 'item id',\n description:\n 'Stable opaque id of a tile, sourced from each item.id. open_item targets this attribute.',\n },\n },\n};\n","import { forwardRef, useMemo, type ReactNode } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { Link } from '../link/link';\nimport { useAgentRegistration } from '../../agent';\nimport { navGridAgent } from './nav-grid.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport interface NavGridItem {\n /** Stable, opaque id. Emitted as `data-nav-item-id`; agents target it. */\n id: string;\n /** Localised tile label — supplied by the consumer (never bundled here). */\n label: string;\n /** Optional localised supporting text shown under the label. */\n description?: string;\n /** Decorative leading glyph. Rendered `aria-hidden`. */\n icon?: ReactNode;\n /** When set, the tile is a navigating anchor (kit Link). */\n href?: string;\n /** When `href` is absent, the tile is a button firing this handler. */\n onSelect?: () => void;\n /** Render the tile non-interactive and visually muted. */\n disabled?: boolean;\n}\n\n/** Agent-readiness curated handle for NavGrid. */\nexport interface NavGridHandle {\n getItemCount: () => number;\n /** Activate the tile with the given id (navigate, or fire its onSelect). */\n openItem: (id: string) => void;\n}\n\nexport interface NavGridProps {\n /** Tiles to render. label / description / icon are consumer-supplied props. */\n items: NavGridItem[];\n /** REQUIRED — the nav landmark's accessible name (e.g. \"Settings sections\"). */\n ariaLabel: string;\n /** Column count. Omit for the responsive default (1 → 2 → 3 at sm / lg). */\n columns?: 1 | 2 | 3 | 4;\n /** `label` sorts tiles by `label.localeCompare`; `none` (default) preserves order. */\n sort?: 'label' | 'none';\n id?: string;\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst gridVariants = cva(\n 'ds:grid ds:list-none ds:m-0 ds:p-0 ds:gap-[var(--spacing-md)]',\n {\n variants: {\n columns: {\n // Responsive default: one column on mobile, two from sm, three from lg.\n responsive: 'ds:grid-cols-1 ds:sm:grid-cols-2 ds:lg:grid-cols-3',\n '1': 'ds:grid-cols-1',\n '2': 'ds:grid-cols-1 ds:sm:grid-cols-2',\n '3': 'ds:grid-cols-1 ds:sm:grid-cols-2 ds:lg:grid-cols-3',\n '4': 'ds:grid-cols-1 ds:sm:grid-cols-2 ds:lg:grid-cols-4',\n },\n },\n defaultVariants: { columns: 'responsive' },\n },\n);\n\n// Shared tile look applied to BOTH the Link (href) and the button (onSelect)\n// so the two render identically. Focus ring is included here so the native\n// button gets a visible ring too (Link also carries its own — same tokens).\nconst tileVariants = cva(\n [\n 'ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)] ds:text-start',\n 'ds:h-full ds:w-full ds:min-h-[var(--min-target-size)] ds:p-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-lg)] ds:[:where(&)]:border-[length:var(--surface-border-width,var(--border-width-sm))] ds:border-[color:var(--card-border)]',\n 'ds:bg-[var(--card)] ds:text-[var(--card-foreground)] ds:no-underline',\n 'ds:transition-shadow ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:outline-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n {\n variants: {\n disabled: {\n true: 'ds:opacity-50 ds:cursor-not-allowed ds:pointer-events-none',\n false: 'ds:cursor-pointer ds:hover:shadow-[var(--shadow-hover)]',\n },\n },\n defaultVariants: { disabled: false },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Tile content */\n/* ------------------------------------------------------------------ */\n\nfunction TileContent({ item }: { item: NavGridItem }) {\n return (\n <>\n {item.icon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:items-center ds:text-[var(--muted-foreground)] ds:[&_svg]:size-6\"\n >\n {item.icon}\n </span>\n ) : null}\n {/* `no-underline` on the span reliably suppresses the Link's underline\n across this text regardless of stylesheet order (own decoration box). */}\n <span className=\"type-body ds:font-medium ds:text-[var(--card-foreground)] ds:no-underline\">\n {item.label}\n </span>\n {item.description ? (\n <span className=\"type-body-sm ds:text-[var(--muted-foreground)] ds:no-underline\">\n {item.description}\n </span>\n ) : null}\n </>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const NavGrid = forwardRef<HTMLElement, NavGridProps>(function NavGrid(\n { items, ariaLabel, columns, sort = 'none', id, className },\n ref,\n) {\n // Locale-aware sort is the consumer's opt-in; otherwise render as given.\n const resolvedItems = useMemo(\n () =>\n sort === 'label'\n ? [...items].sort((a, b) => a.label.localeCompare(b.label))\n : items,\n [items, sort],\n );\n\n const handle = useMemo<NavGridHandle>(\n () => ({\n getItemCount: () => items.length,\n openItem: (itemId) => {\n const target = items.find((it) => it.id === itemId);\n if (!target || target.disabled) return;\n if (target.href) {\n if (typeof window !== 'undefined') window.location.href = target.href;\n } else {\n target.onSelect?.();\n }\n },\n }),\n [items],\n );\n useAgentRegistration(navGridAgent, handle, id);\n\n const columnKey =\n columns === undefined\n ? ('responsive' as const)\n : (String(columns) as '1' | '2' | '3' | '4');\n\n return (\n <nav\n ref={ref}\n id={id}\n aria-label={ariaLabel}\n data-component=\"nav-grid\"\n data-component-id={id}\n className={className}\n >\n <ul className={gridVariants({ columns: columnKey })}>\n {resolvedItems.map((item) => (\n <li key={item.id} data-nav-item-id={item.id}>\n {item.href !== undefined ? (\n <Link\n href={item.href}\n intent=\"subtle\"\n disabled={item.disabled}\n className={tileVariants({ disabled: Boolean(item.disabled) })}\n >\n <TileContent item={item} />\n </Link>\n ) : (\n <button\n type=\"button\"\n onClick={item.disabled ? undefined : item.onSelect}\n disabled={item.disabled}\n aria-disabled={item.disabled || undefined}\n className={tileVariants({ disabled: Boolean(item.disabled) })}\n >\n <TileContent item={item} />\n </button>\n )}\n </li>\n ))}\n </ul>\n </nav>\n );\n});\n\nNavGrid.displayName = 'NavGrid';\n\nexport { tileVariants as navGridTileVariants };\n"],"names":["navGridAgent","handle","args","gridVariants","cva","tileVariants","TileContent","item","jsxs","Fragment","jsx","NavGrid","forwardRef","items","ariaLabel","columns","sort","id","className","ref","resolvedItems","useMemo","a","b","itemId","target","it","_a","useAgentRegistration","columnKey","Link"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation-dismiss-B1mcW1CT.js","sources":["../../src/components/_shared/navigation-dismiss.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\n\n/**\n * Closes the surface that holds a navigation control, such as a phone nav\n * drawer, after a pick that navigates without a link (a SearchBar result).\n */\nexport const NavigationDismissContext = createContext<(() => void) | null>(\n null,\n);\n\n/** The enclosing surface's close, or `null` when nothing needs closing. */\nexport const useNavigationDismiss = () => useContext(NavigationDismissContext);\n"],"names":["NavigationDismissContext","createContext","useNavigationDismiss","useContext"],"mappings":";AAMO,MAAMA,IAA2BC;AAAA,EACtC;AACF,GAGaC,IAAuB,MAAMC,EAAWH,CAAwB;"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { useCallback as p } from "react";
|
|
2
|
+
const T = "data-radix-focus-guard";
|
|
3
|
+
function y(e) {
|
|
4
|
+
if (!e.id) return null;
|
|
5
|
+
const i = e.ownerDocument.querySelectorAll("[aria-controls]");
|
|
6
|
+
for (const t of i)
|
|
7
|
+
if (t.getAttribute("aria-controls") === e.id) return t;
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
function c(e) {
|
|
11
|
+
return e.hidden || e.disabled === !0 || e.tagName === "INPUT" && e.type === "hidden" ? !1 : e.tabIndex >= 0;
|
|
12
|
+
}
|
|
13
|
+
function N(e, i) {
|
|
14
|
+
if (getComputedStyle(e).visibility === "hidden") return !0;
|
|
15
|
+
let t = e;
|
|
16
|
+
for (; t; ) {
|
|
17
|
+
if (i !== void 0 && t === i) return !1;
|
|
18
|
+
if (getComputedStyle(t).display === "none") return !0;
|
|
19
|
+
t = t.parentElement;
|
|
20
|
+
}
|
|
21
|
+
return !1;
|
|
22
|
+
}
|
|
23
|
+
function m(e, i) {
|
|
24
|
+
const t = e.ownerDocument.createTreeWalker(
|
|
25
|
+
e,
|
|
26
|
+
NodeFilter.SHOW_ELEMENT,
|
|
27
|
+
{
|
|
28
|
+
acceptNode: (n) => c(n) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP
|
|
29
|
+
}
|
|
30
|
+
), o = [];
|
|
31
|
+
for (; t.nextNode(); ) o.push(t.currentNode);
|
|
32
|
+
return i === "last" && o.reverse(), o.find((n) => !N(n, e));
|
|
33
|
+
}
|
|
34
|
+
function f(e) {
|
|
35
|
+
return N(e) || (e.focus(), e.ownerDocument.activeElement !== e) ? !1 : (e.tagName === "INPUT" && e.select(), !0);
|
|
36
|
+
}
|
|
37
|
+
function b(e) {
|
|
38
|
+
return e.ownerDocument.body.style.pointerEvents !== "none" ? null : e.closest('[role="dialog"], [role="alertdialog"]');
|
|
39
|
+
}
|
|
40
|
+
function F(e, i, t) {
|
|
41
|
+
const o = e.ownerDocument, n = t && b(t) || o.body, s = o.createTreeWalker(n, NodeFilter.SHOW_ELEMENT, {
|
|
42
|
+
acceptNode: (r) => {
|
|
43
|
+
const d = r;
|
|
44
|
+
return d === e || d.hidden || d.hasAttribute("inert") || t && d.getAttribute("aria-hidden") === "true" ? NodeFilter.FILTER_REJECT : c(d) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
let u = t ?? e;
|
|
48
|
+
if (!i || t) for (; u.lastChild; ) u = u.lastChild;
|
|
49
|
+
if (s.currentNode = u, t && i && u.nodeType === Node.ELEMENT_NODE) {
|
|
50
|
+
const r = u;
|
|
51
|
+
if (c(r) && f(r)) return "moved";
|
|
52
|
+
}
|
|
53
|
+
let l = null;
|
|
54
|
+
const a = () => i ? s.previousNode() : s.nextNode();
|
|
55
|
+
for (let r = a(); r; r = a()) {
|
|
56
|
+
const d = r;
|
|
57
|
+
if (d.hasAttribute(T)) l = d;
|
|
58
|
+
else if (f(d)) return "moved";
|
|
59
|
+
}
|
|
60
|
+
if (n !== o.body) {
|
|
61
|
+
const r = m(n, i ? "last" : "first");
|
|
62
|
+
return r && f(r) ? "moved" : "none";
|
|
63
|
+
}
|
|
64
|
+
return l ? (l.focus(), o.activeElement === l ? "native" : "none") : "none";
|
|
65
|
+
}
|
|
66
|
+
function v(e, { getAnchor: i, onReturnToTrigger: t } = {}) {
|
|
67
|
+
return p(
|
|
68
|
+
(o) => {
|
|
69
|
+
if (!e || o.defaultPrevented || o.key !== "Tab" || o.altKey || o.ctrlKey || o.metaKey)
|
|
70
|
+
return;
|
|
71
|
+
const n = o.currentTarget, s = n.ownerDocument.activeElement;
|
|
72
|
+
if (!s || !n.contains(s)) return;
|
|
73
|
+
const u = o.shiftKey, l = m(n, u ? "first" : "last");
|
|
74
|
+
if (!(s === l || s === n && (!l || u))) return;
|
|
75
|
+
const r = i == null ? void 0 : i(n);
|
|
76
|
+
if (i && !(r != null && r.isConnected)) return;
|
|
77
|
+
const d = r && r.isConnected && !r.contains(n) && !n.contains(r) ? r : void 0;
|
|
78
|
+
if (F(n, u, d) !== "moved" || (o.preventDefault(), !u || !t)) return;
|
|
79
|
+
const E = n.ownerDocument.activeElement;
|
|
80
|
+
E && E === y(n) && t();
|
|
81
|
+
},
|
|
82
|
+
[e, i, t]
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
export {
|
|
86
|
+
y as f,
|
|
87
|
+
v as u
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=non-modal-tab-exit-j3CPOuE3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"non-modal-tab-exit-j3CPOuE3.js","sources":["../../src/components/_shared/non-modal-tab-exit.ts"],"sourcesContent":["import { useCallback, type KeyboardEvent } from 'react';\n\n// Radix Dialog and Popover content keep `FocusScope loop` when non-modal, so Tab\n// wraps inside the panel and the page is unreachable (WCAG 2.1.2). This lets Tab\n// leave at the panel's edges in reading order.\n\nconst FOCUS_GUARD = 'data-radix-focus-guard';\n\n/** Returns the element a portalled panel belongs after in reading order. */\nexport type TabExitAnchor = (\n content: HTMLElement,\n) => HTMLElement | null | undefined;\n\nexport interface TabExitOptions {\n /** A popover's trigger or anchor. Without it, Tab leaves in DOM order. */\n getAnchor?: TabExitAnchor;\n /** Radix keeps a popover open when focus lands on its own trigger, so\n * Shift+Tab back onto the trigger calls this to close it. */\n onReturnToTrigger?: () => void;\n}\n\n/** The Radix Popover trigger whose `aria-controls` names this content. */\nexport function findPopoverTrigger(content: HTMLElement): HTMLElement | null {\n if (!content.id) return null;\n const candidates =\n content.ownerDocument.querySelectorAll<HTMLElement>('[aria-controls]');\n for (const el of candidates) {\n if (el.getAttribute('aria-controls') === content.id) return el;\n }\n return null;\n}\n\n// Same rules as Radix FocusScope, so our edge is the edge it would wrap at.\nfunction isTabbable(el: HTMLElement): boolean {\n if (el.hidden) return false;\n if ((el as { disabled?: unknown }).disabled === true) return false;\n if (el.tagName === 'INPUT' && (el as HTMLInputElement).type === 'hidden')\n return false;\n return el.tabIndex >= 0;\n}\n\nfunction isHidden(el: HTMLElement, upTo?: HTMLElement): boolean {\n if (getComputedStyle(el).visibility === 'hidden') return true;\n let node: HTMLElement | null = el;\n while (node) {\n if (upTo !== undefined && node === upTo) return false;\n if (getComputedStyle(node).display === 'none') return true;\n node = node.parentElement;\n }\n return false;\n}\n\nfunction getTabbableEdge(\n container: HTMLElement,\n which: 'first' | 'last',\n): HTMLElement | undefined {\n const walker = container.ownerDocument.createTreeWalker(\n container,\n NodeFilter.SHOW_ELEMENT,\n {\n acceptNode: (node) =>\n isTabbable(node as HTMLElement)\n ? NodeFilter.FILTER_ACCEPT\n : NodeFilter.FILTER_SKIP,\n },\n );\n const candidates: HTMLElement[] = [];\n while (walker.nextNode()) candidates.push(walker.currentNode as HTMLElement);\n if (which === 'last') candidates.reverse();\n return candidates.find((el) => !isHidden(el, container));\n}\n\nfunction tryFocus(el: HTMLElement): boolean {\n if (isHidden(el)) return false;\n el.focus();\n if (el.ownerDocument.activeElement !== el) return false;\n // Native Tab into a text field selects its value.\n if (el.tagName === 'INPUT') (el as HTMLInputElement).select();\n return true;\n}\n\n// A modal Radix layer turns off pointer events on <body>. An anchor inside a\n// dialog then keeps Tab within that dialog, even past later-mounted portals.\nfunction modalScope(anchor: HTMLElement): HTMLElement | null {\n if (anchor.ownerDocument.body.style.pointerEvents !== 'none') return null;\n return anchor.closest<HTMLElement>('[role=\"dialog\"], [role=\"alertdialog\"]');\n}\n\n/**\n * Focus the nearest tabbable before or after `content` in DOM order, or after\n * the `anchor`'s subtree when given. Radix's edge guards are skipped; if only a\n * guard is left, focus rests on it and the browser's Tab carries on ('native').\n */\nfunction focusBeyond(\n content: HTMLElement,\n backwards: boolean,\n anchor?: HTMLElement,\n): 'moved' | 'native' | 'none' {\n const doc = content.ownerDocument;\n const scope = (anchor && modalScope(anchor)) || doc.body;\n const walker = doc.createTreeWalker(scope, NodeFilter.SHOW_ELEMENT, {\n acceptNode: (node) => {\n const el = node as HTMLElement;\n if (el === content || el.hidden || el.hasAttribute('inert')) {\n return NodeFilter.FILTER_REJECT;\n }\n // A modal Dialog hides everything outside it from AT, so an anchored\n // popover inside one must not walk out of it.\n if (anchor && el.getAttribute('aria-hidden') === 'true') {\n return NodeFilter.FILTER_REJECT;\n }\n return isTabbable(el) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n },\n });\n\n // nextNode() from the content would descend into it, so start from its last\n // leaf. With an anchor, the content's virtual place is after that last leaf.\n let start: Node = anchor ?? content;\n if (!backwards || anchor) while (start.lastChild) start = start.lastChild;\n walker.currentNode = start;\n\n // Walking back from that virtual place, the leaf itself comes first.\n if (anchor && backwards && start.nodeType === Node.ELEMENT_NODE) {\n const leaf = start as HTMLElement;\n if (isTabbable(leaf) && tryFocus(leaf)) return 'moved';\n }\n\n let guard: HTMLElement | null = null;\n const step = () => (backwards ? walker.previousNode() : walker.nextNode());\n for (let node = step(); node; node = step()) {\n const el = node as HTMLElement;\n if (el.hasAttribute(FOCUS_GUARD)) guard = el;\n else if (tryFocus(el)) return 'moved';\n }\n // Off the edge of a modal dialog: wrap, as the dialog's own trap does.\n if (scope !== doc.body) {\n const wrapped = getTabbableEdge(scope, backwards ? 'last' : 'first');\n return wrapped && tryFocus(wrapped) ? 'moved' : 'none';\n }\n if (!guard) return 'none';\n guard.focus();\n return doc.activeElement === guard ? 'native' : 'none';\n}\n\n/**\n * Lets Tab leave non-modal Dialog or Popover content (modal keeps its trap).\n * With `getAnchor`, Tab leaves to just after the anchor and Shift+Tab returns\n * to it. Returns a handler for the content's `onKeyDown`, after the consumer's.\n */\nexport function useNonModalTabExit(\n enabled: boolean,\n { getAnchor, onReturnToTrigger }: TabExitOptions = {},\n): (event: KeyboardEvent<HTMLElement>) => void {\n // Content's onKeyDown runs before FocusScope's (Radix Slot calls the child\n // handler first). Once focus has moved, FocusScope no longer sees an edge.\n return useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n if (!enabled || event.defaultPrevented) return;\n if (event.key !== 'Tab' || event.altKey || event.ctrlKey || event.metaKey)\n return;\n\n const content = event.currentTarget;\n const active = content.ownerDocument.activeElement;\n if (!active || !content.contains(active)) return;\n\n const backwards = event.shiftKey;\n const edge = getTabbableEdge(content, backwards ? 'first' : 'last');\n // Focus parked on the panel itself leaves backwards, or either way when\n // the panel has nothing tabbable inside.\n const atEdge =\n active === edge || (active === content && (!edge || backwards));\n if (!atEdge) return;\n\n // No element to leave to (a rectangle-only anchor, or one now gone):\n // keep the panel's own loop rather than drop focus to the browser.\n const anchor = getAnchor?.(content);\n if (getAnchor && !anchor?.isConnected) return;\n // An anchor nested with the content has no place to leave to.\n const usable =\n anchor &&\n anchor.isConnected &&\n !anchor.contains(content) &&\n !content.contains(anchor)\n ? anchor\n : undefined;\n\n // 'native' leaves the default alone: focus is on a guard, not an edge.\n if (focusBeyond(content, backwards, usable) !== 'moved') return;\n event.preventDefault();\n if (!backwards || !onReturnToTrigger) return;\n const landed = content.ownerDocument.activeElement;\n if (landed && landed === findPopoverTrigger(content)) onReturnToTrigger();\n },\n [enabled, getAnchor, onReturnToTrigger],\n );\n}\n"],"names":["FOCUS_GUARD","findPopoverTrigger","content","candidates","el","isTabbable","isHidden","upTo","node","getTabbableEdge","container","which","walker","tryFocus","modalScope","anchor","focusBeyond","backwards","doc","scope","start","leaf","guard","step","wrapped","useNonModalTabExit","enabled","getAnchor","onReturnToTrigger","useCallback","event","active","edge","usable","landed"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { c as f } from "./createLucideIcon-DhHxpK9K.js";
|
|
|
2
2
|
import { jsx as a } from "react/jsx-runtime";
|
|
3
3
|
import { useTranslation as g } from "react-i18next";
|
|
4
4
|
import { B as u } from "./badge-hnBt8o7n.js";
|
|
5
|
-
import { L as h } from "./link-
|
|
5
|
+
import { L as h } from "./link-gRw3NtOt.js";
|
|
6
6
|
import { i as b } from "./is-safe-url-DkETxeHz.js";
|
|
7
7
|
import { S as y } from "./scan-line-CNseIHQ0.js";
|
|
8
8
|
import { L as N } from "./layers-DcAENmsZ.js";
|
|
@@ -121,4 +121,4 @@ export {
|
|
|
121
121
|
M as P,
|
|
122
122
|
U as n
|
|
123
123
|
};
|
|
124
|
-
//# sourceMappingURL=note-attachment-
|
|
124
|
+
//# sourceMappingURL=note-attachment-Bt2cddsZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"note-attachment-I1NLoeRZ.js","sources":["../../node_modules/lucide-react/dist/esm/icons/flag.mjs","../../node_modules/lucide-react/dist/esm/icons/pin.mjs","../../src/components/_shared/note-markdown.ts","../../src/components/_shared/note-attachment.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528\",\n key: \"1jaruq\"\n }\n ]\n];\nconst Flag = createLucideIcon(\"flag\", __iconNode);\n\nexport { __iconNode, Flag as default };\n//# sourceMappingURL=flag.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 17v5\", key: \"bb1du9\" }],\n [\n \"path\",\n {\n d: \"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\",\n key: \"1nkz8b\"\n }\n ]\n];\nconst Pin = createLucideIcon(\"pin\", __iconNode);\n\nexport { __iconNode, Pin as default };\n//# sourceMappingURL=pin.mjs.map\n","/* -------------------------------------------------------------------- */\n/* Note markdown → safe HTML */\n/* */\n/* Shared by every surface that renders a note body — ClinicalNoteCard */\n/* and NoteTimeline today. One implementation, so the small Markdown */\n/* subset a note supports cannot drift between the card and the timeline. */\n/* */\n/* The output is always handed to `SafeHtml` (markdown profile), which */\n/* strips everything outside the allow-list, so even a hostile note can */\n/* only ever emit the sanitised tag set. Nothing here calls */\n/* dangerouslySetInnerHTML — SafeHtml is the single carrier. */\n/* -------------------------------------------------------------------- */\n\n/** HTML-escape a raw text run before re-inserting our own safe markup. */\nfunction escapeHtml(input: string): string {\n return input\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\n/** Apply inline markdown (bold, italic, code, links) to an escaped run. */\nfunction renderInlineHtml(escaped: string): string {\n let out = escaped;\n // Inline code first so its contents aren't re-processed.\n out = out.replace(/`([^`]+)`/g, '<code>$1</code>');\n out = out.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n out = out.replace(/\\*([^*]+)\\*/g, '<em>$1</em>');\n // Links — the href is left as-authored; SafeHtml's markdown profile\n // rejects any scheme outside http(s)/mailto/tel at sanitise time.\n out = out.replace(\n /\\[([^\\]]+)\\]\\(([^)\\s]+)\\)/g,\n '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>',\n );\n return out;\n}\n\n/** Convert the supported Markdown subset into an HTML string. */\nexport function noteMarkdownToHtml(input: string): string {\n const blocks = input.split(/\\n{2,}/);\n return blocks\n .map((block) => {\n const lines = block.split('\\n');\n const isUnordered = lines.every((l) => /^\\s*[-*]\\s+/.test(l));\n const isOrdered = lines.every((l) => /^\\s*\\d+\\.\\s+/.test(l));\n if (isUnordered && lines.length > 0) {\n const items = lines\n .map((l) => l.replace(/^\\s*[-*]\\s+/, ''))\n .map((l) => `<li>${renderInlineHtml(escapeHtml(l))}</li>`)\n .join('');\n return `<ul>${items}</ul>`;\n }\n if (isOrdered && lines.length > 0) {\n const items = lines\n .map((l) => l.replace(/^\\s*\\d+\\.\\s+/, ''))\n .map((l) => `<li>${renderInlineHtml(escapeHtml(l))}</li>`)\n .join('');\n return `<ol>${items}</ol>`;\n }\n const paragraph = renderInlineHtml(escapeHtml(block)).replace(\n /\\n/g,\n '<br />',\n );\n return `<p>${paragraph}</p>`;\n })\n .join('');\n}\n","/* -------------------------------------------------------------------- */\n/* Note attachment chip */\n/* */\n/* The entity a note is bound to, rendered as one chip — or as a link */\n/* when the host supplies a safe url. Shared by every surface that shows */\n/* a note (ClinicalNoteCard and NoteTimeline today) so the wording, the */\n/* glyph and the link-vs-chip rule cannot drift between them. */\n/* */\n/* The strings stay under `clinicalNoteCard.attachment.*`: they name the */\n/* ATTACHED ENTITY, not the surface showing it, so they are already the */\n/* right words wherever a note is rendered. */\n/* -------------------------------------------------------------------- */\n\nimport type { ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { FileText, Layers, ScanLine, User } from 'lucide-react';\nimport { Badge } from '../badge/badge';\nimport { Link } from '../link/link';\nimport { isSafeEntityUrl } from './is-safe-url';\n\n/**\n * What a note is attached to.\n *\n * - `patient` — the patient record itself.\n * - `carePlan` — a numbered care plan.\n * - `carePlanEntry`— one treatment in a plan, optionally with tooth elements.\n * - `phase` — a scheduled phase.\n * - `xray` — an x-ray / radiograph, optionally labelled.\n *\n * Every non-patient kind takes an optional `url`: a safe one turns the chip\n * into a link, an unsafe one keeps the chip.\n */\nexport type NoteAttachment =\n | { kind: 'patient' }\n | { kind: 'carePlan'; number: string; url?: string }\n | {\n kind: 'carePlanEntry';\n careName: string;\n elements?: string[];\n url?: string;\n }\n | { kind: 'phase'; label: string; url?: string }\n | { kind: 'xray'; label?: string; url?: string };\n\n/**\n * Renders the attachment as a chip, or a link when `url` is safe. Returns\n * `null` for an unattached note, so a caller can render it unconditionally.\n */\nexport function NoteAttachmentChip({\n attachedTo,\n}: {\n attachedTo?: NoteAttachment;\n}): ReactNode {\n const { t } = useTranslation('ui');\n\n if (!attachedTo) return null;\n\n // A safe host url turns the chip into a link; otherwise it stays a chip.\n const linkOrChip = (\n label: string,\n icon: ReactNode,\n variant: 'info' | 'neutral',\n url: string | undefined,\n ): ReactNode =>\n url && isSafeEntityUrl(url) ? (\n <Link href={url} intent=\"default\" startIcon={icon}>\n {label}\n </Link>\n ) : (\n <Badge variant={variant} size=\"sm\" leading={icon}>\n {label}\n </Badge>\n );\n\n switch (attachedTo.kind) {\n case 'patient':\n return (\n <Badge\n variant=\"neutral\"\n size=\"sm\"\n leading={<User aria-hidden=\"true\" />}\n >\n {t('clinicalNoteCard.attachment.patient')}\n </Badge>\n );\n case 'carePlan':\n return linkOrChip(\n t('clinicalNoteCard.attachment.carePlan', {\n number: attachedTo.number,\n }),\n <FileText aria-hidden=\"true\" />,\n 'info',\n attachedTo.url,\n );\n case 'carePlanEntry':\n return linkOrChip(\n attachedTo.elements && attachedTo.elements.length > 0\n ? t('clinicalNoteCard.attachment.carePlanEntryWithElements', {\n care: attachedTo.careName,\n elements: attachedTo.elements.join(', '),\n })\n : t('clinicalNoteCard.attachment.carePlanEntry', {\n care: attachedTo.careName,\n }),\n <FileText aria-hidden=\"true\" />,\n 'info',\n attachedTo.url,\n );\n case 'phase':\n return linkOrChip(\n t('clinicalNoteCard.attachment.phase', { label: attachedTo.label }),\n <Layers aria-hidden=\"true\" />,\n 'neutral',\n attachedTo.url,\n );\n case 'xray':\n return linkOrChip(\n attachedTo.label\n ? t('clinicalNoteCard.attachment.xrayWithLabel', {\n label: attachedTo.label,\n })\n : t('clinicalNoteCard.attachment.xray'),\n <ScanLine aria-hidden=\"true\" />,\n 'neutral',\n attachedTo.url,\n );\n }\n}\n"],"names":["__iconNode","Flag","createLucideIcon","Pin","escapeHtml","input","renderInlineHtml","escaped","out","noteMarkdownToHtml","block","lines","isUnordered","isOrdered","l","NoteAttachmentChip","attachedTo","t","useTranslation","linkOrChip","label","icon","variant","url","isSafeEntityUrl","jsx","Link","Badge","User","FileText","Layers","ScanLine"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
1
|
+
{"version":3,"file":"note-attachment-Bt2cddsZ.js","sources":["../../node_modules/lucide-react/dist/esm/icons/flag.mjs","../../node_modules/lucide-react/dist/esm/icons/pin.mjs","../../src/components/_shared/note-markdown.ts","../../src/components/_shared/note-attachment.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528\",\n key: \"1jaruq\"\n }\n ]\n];\nconst Flag = createLucideIcon(\"flag\", __iconNode);\n\nexport { __iconNode, Flag as default };\n//# sourceMappingURL=flag.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 17v5\", key: \"bb1du9\" }],\n [\n \"path\",\n {\n d: \"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\",\n key: \"1nkz8b\"\n }\n ]\n];\nconst Pin = createLucideIcon(\"pin\", __iconNode);\n\nexport { __iconNode, Pin as default };\n//# sourceMappingURL=pin.mjs.map\n","/* -------------------------------------------------------------------- */\n/* Note markdown → safe HTML */\n/* */\n/* Shared by every surface that renders a note body — ClinicalNoteCard */\n/* and NoteTimeline today. One implementation, so the small Markdown */\n/* subset a note supports cannot drift between the card and the timeline. */\n/* */\n/* The output is always handed to `SafeHtml` (markdown profile), which */\n/* strips everything outside the allow-list, so even a hostile note can */\n/* only ever emit the sanitised tag set. Nothing here calls */\n/* dangerouslySetInnerHTML — SafeHtml is the single carrier. */\n/* -------------------------------------------------------------------- */\n\n/** HTML-escape a raw text run before re-inserting our own safe markup. */\nfunction escapeHtml(input: string): string {\n return input\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\n/** Apply inline markdown (bold, italic, code, links) to an escaped run. */\nfunction renderInlineHtml(escaped: string): string {\n let out = escaped;\n // Inline code first so its contents aren't re-processed.\n out = out.replace(/`([^`]+)`/g, '<code>$1</code>');\n out = out.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n out = out.replace(/\\*([^*]+)\\*/g, '<em>$1</em>');\n // Links — the href is left as-authored; SafeHtml's markdown profile\n // rejects any scheme outside http(s)/mailto/tel at sanitise time.\n out = out.replace(\n /\\[([^\\]]+)\\]\\(([^)\\s]+)\\)/g,\n '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>',\n );\n return out;\n}\n\n/** Convert the supported Markdown subset into an HTML string. */\nexport function noteMarkdownToHtml(input: string): string {\n const blocks = input.split(/\\n{2,}/);\n return blocks\n .map((block) => {\n const lines = block.split('\\n');\n const isUnordered = lines.every((l) => /^\\s*[-*]\\s+/.test(l));\n const isOrdered = lines.every((l) => /^\\s*\\d+\\.\\s+/.test(l));\n if (isUnordered && lines.length > 0) {\n const items = lines\n .map((l) => l.replace(/^\\s*[-*]\\s+/, ''))\n .map((l) => `<li>${renderInlineHtml(escapeHtml(l))}</li>`)\n .join('');\n return `<ul>${items}</ul>`;\n }\n if (isOrdered && lines.length > 0) {\n const items = lines\n .map((l) => l.replace(/^\\s*\\d+\\.\\s+/, ''))\n .map((l) => `<li>${renderInlineHtml(escapeHtml(l))}</li>`)\n .join('');\n return `<ol>${items}</ol>`;\n }\n const paragraph = renderInlineHtml(escapeHtml(block)).replace(\n /\\n/g,\n '<br />',\n );\n return `<p>${paragraph}</p>`;\n })\n .join('');\n}\n","/* -------------------------------------------------------------------- */\n/* Note attachment chip */\n/* */\n/* The entity a note is bound to, rendered as one chip — or as a link */\n/* when the host supplies a safe url. Shared by every surface that shows */\n/* a note (ClinicalNoteCard and NoteTimeline today) so the wording, the */\n/* glyph and the link-vs-chip rule cannot drift between them. */\n/* */\n/* The strings stay under `clinicalNoteCard.attachment.*`: they name the */\n/* ATTACHED ENTITY, not the surface showing it, so they are already the */\n/* right words wherever a note is rendered. */\n/* -------------------------------------------------------------------- */\n\nimport type { ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { FileText, Layers, ScanLine, User } from 'lucide-react';\nimport { Badge } from '../badge/badge';\nimport { Link } from '../link/link';\nimport { isSafeEntityUrl } from './is-safe-url';\n\n/**\n * What a note is attached to.\n *\n * - `patient` — the patient record itself.\n * - `carePlan` — a numbered care plan.\n * - `carePlanEntry`— one treatment in a plan, optionally with tooth elements.\n * - `phase` — a scheduled phase.\n * - `xray` — an x-ray / radiograph, optionally labelled.\n *\n * Every non-patient kind takes an optional `url`: a safe one turns the chip\n * into a link, an unsafe one keeps the chip.\n */\nexport type NoteAttachment =\n | { kind: 'patient' }\n | { kind: 'carePlan'; number: string; url?: string }\n | {\n kind: 'carePlanEntry';\n careName: string;\n elements?: string[];\n url?: string;\n }\n | { kind: 'phase'; label: string; url?: string }\n | { kind: 'xray'; label?: string; url?: string };\n\n/**\n * Renders the attachment as a chip, or a link when `url` is safe. Returns\n * `null` for an unattached note, so a caller can render it unconditionally.\n */\nexport function NoteAttachmentChip({\n attachedTo,\n}: {\n attachedTo?: NoteAttachment;\n}): ReactNode {\n const { t } = useTranslation('ui');\n\n if (!attachedTo) return null;\n\n // A safe host url turns the chip into a link; otherwise it stays a chip.\n const linkOrChip = (\n label: string,\n icon: ReactNode,\n variant: 'info' | 'neutral',\n url: string | undefined,\n ): ReactNode =>\n url && isSafeEntityUrl(url) ? (\n <Link href={url} intent=\"default\" startIcon={icon}>\n {label}\n </Link>\n ) : (\n <Badge variant={variant} size=\"sm\" leading={icon}>\n {label}\n </Badge>\n );\n\n switch (attachedTo.kind) {\n case 'patient':\n return (\n <Badge\n variant=\"neutral\"\n size=\"sm\"\n leading={<User aria-hidden=\"true\" />}\n >\n {t('clinicalNoteCard.attachment.patient')}\n </Badge>\n );\n case 'carePlan':\n return linkOrChip(\n t('clinicalNoteCard.attachment.carePlan', {\n number: attachedTo.number,\n }),\n <FileText aria-hidden=\"true\" />,\n 'info',\n attachedTo.url,\n );\n case 'carePlanEntry':\n return linkOrChip(\n attachedTo.elements && attachedTo.elements.length > 0\n ? t('clinicalNoteCard.attachment.carePlanEntryWithElements', {\n care: attachedTo.careName,\n elements: attachedTo.elements.join(', '),\n })\n : t('clinicalNoteCard.attachment.carePlanEntry', {\n care: attachedTo.careName,\n }),\n <FileText aria-hidden=\"true\" />,\n 'info',\n attachedTo.url,\n );\n case 'phase':\n return linkOrChip(\n t('clinicalNoteCard.attachment.phase', { label: attachedTo.label }),\n <Layers aria-hidden=\"true\" />,\n 'neutral',\n attachedTo.url,\n );\n case 'xray':\n return linkOrChip(\n attachedTo.label\n ? t('clinicalNoteCard.attachment.xrayWithLabel', {\n label: attachedTo.label,\n })\n : t('clinicalNoteCard.attachment.xray'),\n <ScanLine aria-hidden=\"true\" />,\n 'neutral',\n attachedTo.url,\n );\n }\n}\n"],"names":["__iconNode","Flag","createLucideIcon","Pin","escapeHtml","input","renderInlineHtml","escaped","out","noteMarkdownToHtml","block","lines","isUnordered","isOrdered","l","NoteAttachmentChip","attachedTo","t","useTranslation","linkOrChip","label","icon","variant","url","isSafeEntityUrl","jsx","Link","Badge","User","FileText","Layers","ScanLine"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -4,7 +4,7 @@ import { c as h } from "./index-D2ZczOXr.js";
|
|
|
4
4
|
import { useTranslation as L } from "react-i18next";
|
|
5
5
|
import { SafeHtml as A } from "../safe-html/index.js";
|
|
6
6
|
import { C as P, S as b } from "./skeleton-B1KTdJ4N.js";
|
|
7
|
-
import { n as B, P as K, F as O, N as q } from "./note-attachment-
|
|
7
|
+
import { n as B, P as K, F as O, N as q } from "./note-attachment-Bt2cddsZ.js";
|
|
8
8
|
import { u as G } from "./registry-DvAUVLHh.js";
|
|
9
9
|
const J = {
|
|
10
10
|
id: "note-timeline",
|
|
@@ -330,4 +330,4 @@ export {
|
|
|
330
330
|
X as N,
|
|
331
331
|
J as n
|
|
332
332
|
};
|
|
333
|
-
//# sourceMappingURL=note-timeline-
|
|
333
|
+
//# sourceMappingURL=note-timeline-CX9nAgAR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"note-timeline-CsY8YOE7.js","sources":["../../src/components/note-timeline/note-timeline.agent.ts","../../src/components/note-timeline/note-timeline.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — NoteTimeline. */\n/* */\n/* Read-only presentation surface. Exposes the STRUCTURE of the rendered */\n/* rows — ids plus pinned / flagged / clinical flags — and how many rows */\n/* survived `maxItems`, so a future MCP UI bridge can locate and describe */\n/* what is on screen. It NEVER reads a note body, an author or a date: */\n/* all three are PHI and stay out of the agent layer, exactly as the */\n/* ClinicalNoteCard adapter does. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { NoteTimelineHandle } from './note-timeline';\n\nexport const noteTimelineAgent: AgentAdapter<NoteTimelineHandle> = {\n id: 'note-timeline',\n capabilities: [],\n state: {\n notes: {\n type: 'Array<{ id?: string; pinned: boolean; flagged: boolean; clinical: boolean }>',\n descriptionKey: 'ui.agent.noteTimeline.state.notes',\n description:\n 'Structural snapshot of the rendered rows: ids and flags only, never note content or author.',\n read: (handle) => handle.getNotes(),\n },\n visibleCount: {\n type: 'number',\n descriptionKey: 'ui.agent.noteTimeline.state.visibleCount',\n description:\n 'How many notes are rendered, after the maxItems cap is applied.',\n read: (handle) => handle.getVisibleCount(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'note-timeline',\n description:\n 'Marks the NoteTimeline root. Emits data-empty when there is nothing to show.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop — addresses a specific timeline.',\n },\n },\n};\n","import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Flag, Pin } from 'lucide-react';\nimport { SafeHtml } from '../_shared/safe-html';\nimport { CONTENT_ENTER_CLASS, Skeleton } from '../skeleton/skeleton';\nimport { noteMarkdownToHtml } from '../_shared/note-markdown';\nimport {\n NoteAttachmentChip,\n type NoteAttachment,\n} from '../_shared/note-attachment';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { noteTimelineAgent } from './note-timeline.agent';\n\n/* -------------------------------------------------------------------- */\n/* NoteTimeline */\n/* */\n/* A compact dated list of notes — the reading surface for a handful of */\n/* recent notes beside something else (an appointment, a care plan), */\n/* where a full ClinicalNoteCard per note would swamp the panel. */\n/* */\n/* It takes the SAME note objects a host already gives NotesPanel, so a */\n/* page can show a preview here and the full panel elsewhere without */\n/* reshaping its data. */\n/* */\n/* Deliberately READ-ONLY and deliberately without a \"+N more\" footer: */\n/* it shows the first `maxItems` and stops. The host owns the affordance */\n/* that opens the rest, because only the host knows where the rest live. */\n/* */\n/* Pinned and flagged are never colour-only: each carries a glyph and an */\n/* `sr-only` label, so the state survives greyscale, forced colours and */\n/* a screen reader (05-accessibility.mdx §Colour is not the only cue). */\n/* -------------------------------------------------------------------- */\n\n/** The note author — name, plus an optional avatar the timeline never shows. */\nexport interface NoteTimelineAuthor {\n /** Display name. */\n name: string;\n /** Optional avatar image URL. Unused here; kept so a `NotesPanelNote`\n * passes straight through without reshaping. */\n avatarUrl?: string;\n}\n\n/**\n * One note. Structurally a subset of `NotesPanelNote` / `ClinicalNoteCardProps`\n * so a host can pass the very objects it already gives `NotesPanel`.\n */\nexport interface NoteTimelineNote {\n /** Stable identifier. Surfaced as `data-note-id` — the ONLY note field that\n * ever reaches an attribute, because it is the only one that is not PHI. */\n id?: string;\n /** ISO-8601 timestamp the note refers to (the clinical date). Drives the\n * date gutter and the sort. */\n dateIso: string;\n /** ISO-8601 timestamp the note was written, when it differs from `dateIso`. */\n createdAtIso?: string;\n /** Who wrote it. Omit for a system-generated note — the byline is then\n * dropped entirely rather than rendered empty. */\n author?: NoteTimelineAuthor;\n /** The note body. */\n content: string;\n /** How `content` is authored. `'markdown'` (default) runs the small Markdown\n * subset through the shared converter; `'html'` treats it as rich HTML.\n * Either way `SafeHtml` is the only carrier. */\n contentFormat?: 'markdown' | 'html';\n /** Pinned notes sort to the top and take an accent dot. */\n pinned?: boolean;\n /** Flagged for follow-up — a warning dot and a Flag glyph. */\n flagged?: boolean;\n /** The entity the note is bound to; renders the shared attachment chip. */\n attachedTo?: NoteAttachment;\n /** Whether the note is clinical. Structural only — it drives no styling\n * here, but it is carried so the same objects serve both surfaces. */\n clinical?: boolean;\n}\n\n/** Imperative handle for the agent runtime — identifiers / flags only. */\nexport interface NoteTimelineHandle {\n /** Structural snapshot of the RENDERED rows: ids + flags, never a body or\n * an author (both PHI). */\n getNotes: () => Array<{\n id?: string;\n pinned: boolean;\n flagged: boolean;\n clinical: boolean;\n }>;\n /** How many rows are rendered, after `maxItems` is applied. */\n getVisibleCount: () => number;\n}\n\nconst rowVariants = cva(\n [\n // Named group so the rail's connector can ask \"is my ROW the last one?\".\n // A bare `last:` on the rail asks \"am I the last child of my row?\", which\n // is never true — it is the middle of three — so the line ran on past the\n // final dot and read as more content below.\n 'ds:group/note-row ds:relative ds:flex ds:gap-[var(--spacing-sm)]',\n 'ds:pb-3 ds:last:pb-0',\n ].join(' '),\n);\n\nconst bodyVariants = cva(\n [\n 'type-body-sm ds:[overflow-wrap:break-word]',\n // `[&_p]:m-0` — the converter wraps each block in <p>; the timeline\n // controls its own rhythm, so the paragraph margins are dropped.\n 'ds:[&_p]:m-0',\n ].join(' '),\n {\n variants: {\n // Literal classes, one per supported value: Tailwind generates what it\n // can see in the source, so an interpolated arbitrary value emits\n // nothing and the body would silently never clamp.\n lines: {\n 1: 'ds:line-clamp-1',\n 2: 'ds:line-clamp-2',\n 3: 'ds:line-clamp-3',\n 4: 'ds:line-clamp-4',\n 5: 'ds:line-clamp-5',\n },\n },\n defaultVariants: { lines: 3 },\n },\n);\n\nconst dotVariants = cva(\n [\n 'ds:absolute ds:top-1 ds:start-0 ds:size-[9px]',\n 'ds:rounded-[var(--radius-full)] ds:border-2',\n 'ds:bg-[color:var(--background)]',\n 'ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n tone: {\n default: 'ds:border-[color:var(--border)]',\n pinned: [\n 'ds:border-[color:var(--accent)]',\n 'ds:bg-[color:color-mix(in_srgb,var(--accent)_20%,var(--background))]',\n ].join(' '),\n flagged: [\n 'ds:border-[color:var(--warning-readable)]',\n 'ds:bg-[color:color-mix(in_srgb,var(--warning-readable)_20%,var(--background))]',\n ].join(' '),\n },\n },\n defaultVariants: { tone: 'default' },\n },\n);\n\nexport interface NoteTimelineProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'children'>,\n VariantProps<typeof rowVariants> {\n /** Agent-readiness consumer id, surfaced as `data-component-id`. */\n id?: string;\n /** The notes. Sorted pinned-first, then `dateIso` descending. */\n notes: readonly NoteTimelineNote[];\n /** How many rows to render after sorting. Default 3. The remainder is NOT\n * counted or footered here — the host owns that affordance. */\n maxItems?: number;\n /**\n * Makes every note (with an `id`) a single keyboard-reachable control that\n * calls back with that note's id — a real button stretched over the row,\n * so Tab/Enter reach the same place a pointer click already does. Any link\n * inside the note body loses its own tab stop while this is set, so each\n * note stays exactly one focus stop. Omit it to keep today's read-only,\n * pointer-only row.\n */\n onNoteActivate?: (id: string) => void;\n /** Lines each note body clamps to. Default 3. */\n lines?: 1 | 2 | 3 | 4 | 5;\n /** Locale for the date gutter. Defaults to the active i18n language. */\n locale?: string;\n /**\n * The notes are being read. With no notes yet it shows placeholder rows in\n * the timeline's own shape, never the empty state. With notes already on\n * screen (a refresh) it keeps them and only sets `aria-busy`.\n */\n loading?: boolean;\n /** Placeholder rows shown while `loading`. Default `2`. */\n loadingRows?: number;\n /** Rendered in place of the list when `notes` is empty. */\n emptyState?: ReactNode;\n /** Accessible name for the list region. Defaults to `ui.noteTimeline.regionLabel`. */\n 'aria-label'?: string;\n}\n\n/** Pinned first, then newest by `dateIso`. Stable for equal dates. */\nfunction sortNotes(\n notes: readonly NoteTimelineNote[],\n): readonly NoteTimelineNote[] {\n return [...notes].sort((a, b) => {\n if (!!a.pinned !== !!b.pinned) return a.pinned ? -1 : 1;\n return b.dateIso.localeCompare(a.dateIso);\n });\n}\n\nconst overlayButtonClass = [\n 'ds:absolute ds:inset-0 ds:z-1 ds:m-0 ds:cursor-pointer',\n 'ds:rounded-[var(--radius-sm)] ds:border-0 ds:bg-transparent ds:p-0',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n].join(' ');\n\nexport const NoteTimeline = forwardRef<HTMLDivElement, NoteTimelineProps>(\n (\n {\n id,\n notes,\n maxItems = 3,\n lines = 3,\n locale,\n emptyState,\n 'aria-label': ariaLabel,\n loading = false,\n loadingRows = 2,\n className,\n onNoteActivate,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation('ui');\n const resolvedLocale = locale ?? i18n.language;\n // Date + time, distinct from the gutter's day/month + year split — this\n // one names a specific note in an accessible name, the way NotesPanel's\n // \"Edit note · {{date}}\" does.\n const stamp = useMemo(\n () =>\n (isoDate: string): string => {\n try {\n return new Intl.DateTimeFormat(resolvedLocale, {\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n }).format(new Date(isoDate));\n } catch {\n return isoDate;\n }\n },\n [resolvedLocale],\n );\n /* Settle in only when this content REPLACES a skeleton. Content that was\n simply there from the start must not fade: it would read as invisible\n for one animation to any test or reader that looks at once. */\n const followedLoading = useRef(false);\n if (loading) followedLoading.current = true;\n const enterClass = followedLoading.current ? CONTENT_ENTER_CLASS : '';\n\n const visible = useMemo(\n () => sortNotes(notes).slice(0, Math.max(0, maxItems)),\n [notes, maxItems],\n );\n\n // The overlay button is the row's one focus stop once activation is\n // wired up; a live link SafeHtml rendered inside the body would\n // otherwise add a second, so it is neutralised on the live DOM (a\n // sanitiser strips a hand-authored `tabindex` from the HTML string).\n const rootRef = useRef<HTMLDivElement | null>(null);\n const setRef = (node: HTMLDivElement | null): void => {\n rootRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n };\n useEffect(() => {\n if (!onNoteActivate) return;\n rootRef.current\n ?.querySelectorAll('a[href]')\n .forEach((a) => a.setAttribute('tabindex', '-1'));\n });\n\n // Two formatters, not one: the gutter stacks \"20 JUN\" over \"2026\", so the\n // day/month and the year are formatted apart and both stay locale-aware.\n const fmt = useMemo(\n () => ({\n dayMonth: new Intl.DateTimeFormat(resolvedLocale, {\n day: 'numeric',\n month: 'short',\n }),\n year: new Intl.DateTimeFormat(resolvedLocale, { year: 'numeric' }),\n }),\n [resolvedLocale],\n );\n\n useAgentRegistration(\n noteTimelineAgent,\n {\n getNotes: () =>\n visible.map((note) => ({\n id: note.id,\n pinned: !!note.pinned,\n flagged: !!note.flagged,\n clinical: !!note.clinical,\n })),\n getVisibleCount: () => visible.length,\n },\n id,\n );\n\n // First read only: a refresh keeps the notes it has and marks them busy.\n if (loading && visible.length === 0) {\n return (\n <div\n ref={ref}\n data-component=\"note-timeline\"\n data-component-id={id}\n data-loading=\"\"\n aria-busy=\"true\"\n className={['ds:flex ds:flex-col', className ?? ''].join(' ').trim()}\n {...rest}\n >\n {Array.from({ length: Math.max(1, loadingRows) }, (_, index) => (\n <div key={index} aria-hidden=\"true\" className={rowVariants()}>\n <div className=\"ds:flex ds:w-12 ds:shrink-0 ds:flex-col ds:items-end ds:gap-[var(--spacing-2xs)] ds:pt-px\">\n <Skeleton\n variant=\"text\"\n size=\"sm\"\n stagger={index * 2}\n width=\"80%\"\n />\n <Skeleton\n variant=\"text\"\n size=\"sm\"\n stagger={index * 2}\n width=\"50%\"\n />\n </div>\n <div\n className={[\n 'ds:relative ds:w-[9px] ds:shrink-0',\n 'ds:before:absolute ds:before:start-[4px] ds:before:top-[14px]',\n 'ds:before:bottom-[-12px] ds:before:w-px',\n 'ds:before:bg-[color:var(--border)] ds:before:content-[\"\"]',\n 'ds:group-last/note-row:before:hidden',\n ].join(' ')}\n >\n <span className={dotVariants({ tone: 'default' })} />\n </div>\n <div className=\"ds:min-w-0 ds:flex-1\">\n <Skeleton\n variant=\"text\"\n size=\"sm\"\n lines={index % 2 === 0 ? 3 : 2}\n stagger={index * 2 + 1}\n />\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n if (visible.length === 0) {\n return (\n <div\n ref={ref}\n data-component=\"note-timeline\"\n data-component-id={id}\n data-empty=\"\"\n className={className}\n {...rest}\n >\n {emptyState}\n </div>\n );\n }\n\n return (\n <div\n ref={setRef}\n data-component=\"note-timeline\"\n data-component-id={id}\n role=\"list\"\n aria-busy={loading || undefined}\n aria-label={ariaLabel ?? t('noteTimeline.regionLabel')}\n className={['ds:flex ds:flex-col', enterClass, className ?? '']\n .join(' ')\n .trim()}\n {...rest}\n >\n {visible.map((note) => {\n const date = new Date(note.dateIso);\n const tone = note.pinned\n ? ('pinned' as const)\n : note.flagged\n ? ('flagged' as const)\n : ('default' as const);\n const html =\n note.contentFormat === 'html'\n ? note.content\n : noteMarkdownToHtml(note.content);\n const canActivate = Boolean(onNoteActivate && note.id);\n\n return (\n <div\n key={note.id ?? note.dateIso}\n role=\"listitem\"\n /* id ONLY. Body, author and dates are PHI and never reach an\n attribute, where a DOM scrape or a screenshot would carry\n them out of the component. */\n data-note-id={note.id}\n data-pinned={note.pinned ? '' : undefined}\n data-flagged={note.flagged ? '' : undefined}\n className={rowVariants()}\n >\n {canActivate ? (\n <button\n type=\"button\"\n className={overlayButtonClass}\n aria-label={t('noteTimeline.openNote', {\n date: stamp(note.dateIso),\n defaultValue: 'Open note · {{date}}',\n })}\n onClick={() => onNoteActivate?.(note.id as string)}\n />\n ) : null}\n {/* 1 — date gutter */}\n {/* Sized from the --type-meta-size ROLE token, not the raw\n --font-size-2xs ramp step: `.theme-accessible` scales type by\n re-pointing the role aliases (meta xs → sm), so a raw ramp\n value would stay 10px for exactly the readers who asked for\n bigger text. The token rather than the `type-meta` CLASS,\n because that class also sets transform / weight / tracking\n and would quietly flatten the gutter's own treatment. */}\n <div className=\"ds:w-12 ds:shrink-0 ds:pt-px ds:text-end ds:text-[length:var(--type-meta-size)] ds:leading-[1.3]\">\n <div className=\"ds:font-semibold ds:tracking-[0.03em] ds:uppercase\">\n {fmt.dayMonth.format(date)}\n </div>\n <div className=\"ds:text-[color:var(--muted-foreground)]\">\n {fmt.year.format(date)}\n </div>\n </div>\n\n {/* 2 — rail: dot over the connector. The connector is a\n pseudo-element so it never lands in the a11y tree, and it is\n hidden on the last row rather than dangling into nothing. */}\n <div\n aria-hidden=\"true\"\n className={[\n 'ds:relative ds:w-[9px] ds:shrink-0',\n 'ds:before:absolute ds:before:start-[4px] ds:before:top-[14px]',\n 'ds:before:bottom-[-12px] ds:before:w-px',\n 'ds:before:bg-[color:var(--border)] ds:before:content-[\"\"]',\n 'ds:group-last/note-row:before:hidden',\n ].join(' ')}\n >\n <span className={dotVariants({ tone })} />\n </div>\n\n {/* 3 — body + byline */}\n <div className=\"ds:min-w-0 ds:flex-1\">\n <SafeHtml\n html={html}\n profile={\n note.contentFormat === 'html' ? 'rich-text' : 'markdown'\n }\n className={bodyVariants({ lines })}\n />\n {note.author ||\n note.pinned ||\n note.flagged ||\n note.attachedTo ? (\n <div className=\"ds:mt-[var(--spacing-2xs)] ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-2xs)] type-meta ds:text-[color:var(--muted-foreground)]\">\n {note.author ? <span>{note.author.name}</span> : null}\n {note.pinned ? (\n <span className=\"ds:inline-flex ds:items-center\">\n <Pin\n aria-hidden=\"true\"\n className=\"ds:size-3 ds:text-[color:var(--accent)]\"\n />\n <span className=\"ds:sr-only\">\n {t('noteTimeline.pinned')}\n </span>\n </span>\n ) : null}\n {note.flagged ? (\n <span className=\"ds:inline-flex ds:items-center\">\n <Flag\n aria-hidden=\"true\"\n className=\"ds:size-3 ds:text-[color:var(--warning-readable)]\"\n />\n <span className=\"ds:sr-only\">\n {t('noteTimeline.flagged')}\n </span>\n </span>\n ) : null}\n <NoteAttachmentChip attachedTo={note.attachedTo} />\n </div>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n );\n },\n);\n\nNoteTimeline.displayName = 'NoteTimeline';\n"],"names":["noteTimelineAgent","handle","rowVariants","cva","bodyVariants","dotVariants","sortNotes","notes","a","b","overlayButtonClass","NoteTimeline","forwardRef","id","maxItems","lines","locale","emptyState","ariaLabel","loading","loadingRows","className","onNoteActivate","rest","ref","t","i18n","useTranslation","resolvedLocale","stamp","useMemo","isoDate","followedLoading","useRef","enterClass","CONTENT_ENTER_CLASS","visible","rootRef","setRef","node","useEffect","_a","fmt","useAgentRegistration","note","jsx","_","index","jsxs","Skeleton","date","tone","html","noteMarkdownToHtml","canActivate","SafeHtml","Pin","Flag","NoteAttachmentChip"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"note-timeline-CX9nAgAR.js","sources":["../../src/components/note-timeline/note-timeline.agent.ts","../../src/components/note-timeline/note-timeline.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — NoteTimeline. */\n/* */\n/* Read-only presentation surface. Exposes the STRUCTURE of the rendered */\n/* rows — ids plus pinned / flagged / clinical flags — and how many rows */\n/* survived `maxItems`, so a future MCP UI bridge can locate and describe */\n/* what is on screen. It NEVER reads a note body, an author or a date: */\n/* all three are PHI and stay out of the agent layer, exactly as the */\n/* ClinicalNoteCard adapter does. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { NoteTimelineHandle } from './note-timeline';\n\nexport const noteTimelineAgent: AgentAdapter<NoteTimelineHandle> = {\n id: 'note-timeline',\n capabilities: [],\n state: {\n notes: {\n type: 'Array<{ id?: string; pinned: boolean; flagged: boolean; clinical: boolean }>',\n descriptionKey: 'ui.agent.noteTimeline.state.notes',\n description:\n 'Structural snapshot of the rendered rows: ids and flags only, never note content or author.',\n read: (handle) => handle.getNotes(),\n },\n visibleCount: {\n type: 'number',\n descriptionKey: 'ui.agent.noteTimeline.state.visibleCount',\n description:\n 'How many notes are rendered, after the maxItems cap is applied.',\n read: (handle) => handle.getVisibleCount(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'note-timeline',\n description:\n 'Marks the NoteTimeline root. Emits data-empty when there is nothing to show.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop — addresses a specific timeline.',\n },\n },\n};\n","import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Flag, Pin } from 'lucide-react';\nimport { SafeHtml } from '../_shared/safe-html';\nimport { CONTENT_ENTER_CLASS, Skeleton } from '../skeleton/skeleton';\nimport { noteMarkdownToHtml } from '../_shared/note-markdown';\nimport {\n NoteAttachmentChip,\n type NoteAttachment,\n} from '../_shared/note-attachment';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { noteTimelineAgent } from './note-timeline.agent';\n\n/* -------------------------------------------------------------------- */\n/* NoteTimeline */\n/* */\n/* A compact dated list of notes — the reading surface for a handful of */\n/* recent notes beside something else (an appointment, a care plan), */\n/* where a full ClinicalNoteCard per note would swamp the panel. */\n/* */\n/* It takes the SAME note objects a host already gives NotesPanel, so a */\n/* page can show a preview here and the full panel elsewhere without */\n/* reshaping its data. */\n/* */\n/* Deliberately READ-ONLY and deliberately without a \"+N more\" footer: */\n/* it shows the first `maxItems` and stops. The host owns the affordance */\n/* that opens the rest, because only the host knows where the rest live. */\n/* */\n/* Pinned and flagged are never colour-only: each carries a glyph and an */\n/* `sr-only` label, so the state survives greyscale, forced colours and */\n/* a screen reader (05-accessibility.mdx §Colour is not the only cue). */\n/* -------------------------------------------------------------------- */\n\n/** The note author — name, plus an optional avatar the timeline never shows. */\nexport interface NoteTimelineAuthor {\n /** Display name. */\n name: string;\n /** Optional avatar image URL. Unused here; kept so a `NotesPanelNote`\n * passes straight through without reshaping. */\n avatarUrl?: string;\n}\n\n/**\n * One note. Structurally a subset of `NotesPanelNote` / `ClinicalNoteCardProps`\n * so a host can pass the very objects it already gives `NotesPanel`.\n */\nexport interface NoteTimelineNote {\n /** Stable identifier. Surfaced as `data-note-id` — the ONLY note field that\n * ever reaches an attribute, because it is the only one that is not PHI. */\n id?: string;\n /** ISO-8601 timestamp the note refers to (the clinical date). Drives the\n * date gutter and the sort. */\n dateIso: string;\n /** ISO-8601 timestamp the note was written, when it differs from `dateIso`. */\n createdAtIso?: string;\n /** Who wrote it. Omit for a system-generated note — the byline is then\n * dropped entirely rather than rendered empty. */\n author?: NoteTimelineAuthor;\n /** The note body. */\n content: string;\n /** How `content` is authored. `'markdown'` (default) runs the small Markdown\n * subset through the shared converter; `'html'` treats it as rich HTML.\n * Either way `SafeHtml` is the only carrier. */\n contentFormat?: 'markdown' | 'html';\n /** Pinned notes sort to the top and take an accent dot. */\n pinned?: boolean;\n /** Flagged for follow-up — a warning dot and a Flag glyph. */\n flagged?: boolean;\n /** The entity the note is bound to; renders the shared attachment chip. */\n attachedTo?: NoteAttachment;\n /** Whether the note is clinical. Structural only — it drives no styling\n * here, but it is carried so the same objects serve both surfaces. */\n clinical?: boolean;\n}\n\n/** Imperative handle for the agent runtime — identifiers / flags only. */\nexport interface NoteTimelineHandle {\n /** Structural snapshot of the RENDERED rows: ids + flags, never a body or\n * an author (both PHI). */\n getNotes: () => Array<{\n id?: string;\n pinned: boolean;\n flagged: boolean;\n clinical: boolean;\n }>;\n /** How many rows are rendered, after `maxItems` is applied. */\n getVisibleCount: () => number;\n}\n\nconst rowVariants = cva(\n [\n // Named group so the rail's connector can ask \"is my ROW the last one?\".\n // A bare `last:` on the rail asks \"am I the last child of my row?\", which\n // is never true — it is the middle of three — so the line ran on past the\n // final dot and read as more content below.\n 'ds:group/note-row ds:relative ds:flex ds:gap-[var(--spacing-sm)]',\n 'ds:pb-3 ds:last:pb-0',\n ].join(' '),\n);\n\nconst bodyVariants = cva(\n [\n 'type-body-sm ds:[overflow-wrap:break-word]',\n // `[&_p]:m-0` — the converter wraps each block in <p>; the timeline\n // controls its own rhythm, so the paragraph margins are dropped.\n 'ds:[&_p]:m-0',\n ].join(' '),\n {\n variants: {\n // Literal classes, one per supported value: Tailwind generates what it\n // can see in the source, so an interpolated arbitrary value emits\n // nothing and the body would silently never clamp.\n lines: {\n 1: 'ds:line-clamp-1',\n 2: 'ds:line-clamp-2',\n 3: 'ds:line-clamp-3',\n 4: 'ds:line-clamp-4',\n 5: 'ds:line-clamp-5',\n },\n },\n defaultVariants: { lines: 3 },\n },\n);\n\nconst dotVariants = cva(\n [\n 'ds:absolute ds:top-1 ds:start-0 ds:size-[9px]',\n 'ds:rounded-[var(--radius-full)] ds:border-2',\n 'ds:bg-[color:var(--background)]',\n 'ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n tone: {\n default: 'ds:border-[color:var(--border)]',\n pinned: [\n 'ds:border-[color:var(--accent)]',\n 'ds:bg-[color:color-mix(in_srgb,var(--accent)_20%,var(--background))]',\n ].join(' '),\n flagged: [\n 'ds:border-[color:var(--warning-readable)]',\n 'ds:bg-[color:color-mix(in_srgb,var(--warning-readable)_20%,var(--background))]',\n ].join(' '),\n },\n },\n defaultVariants: { tone: 'default' },\n },\n);\n\nexport interface NoteTimelineProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'children'>,\n VariantProps<typeof rowVariants> {\n /** Agent-readiness consumer id, surfaced as `data-component-id`. */\n id?: string;\n /** The notes. Sorted pinned-first, then `dateIso` descending. */\n notes: readonly NoteTimelineNote[];\n /** How many rows to render after sorting. Default 3. The remainder is NOT\n * counted or footered here — the host owns that affordance. */\n maxItems?: number;\n /**\n * Makes every note (with an `id`) a single keyboard-reachable control that\n * calls back with that note's id — a real button stretched over the row,\n * so Tab/Enter reach the same place a pointer click already does. Any link\n * inside the note body loses its own tab stop while this is set, so each\n * note stays exactly one focus stop. Omit it to keep today's read-only,\n * pointer-only row.\n */\n onNoteActivate?: (id: string) => void;\n /** Lines each note body clamps to. Default 3. */\n lines?: 1 | 2 | 3 | 4 | 5;\n /** Locale for the date gutter. Defaults to the active i18n language. */\n locale?: string;\n /**\n * The notes are being read. With no notes yet it shows placeholder rows in\n * the timeline's own shape, never the empty state. With notes already on\n * screen (a refresh) it keeps them and only sets `aria-busy`.\n */\n loading?: boolean;\n /** Placeholder rows shown while `loading`. Default `2`. */\n loadingRows?: number;\n /** Rendered in place of the list when `notes` is empty. */\n emptyState?: ReactNode;\n /** Accessible name for the list region. Defaults to `ui.noteTimeline.regionLabel`. */\n 'aria-label'?: string;\n}\n\n/** Pinned first, then newest by `dateIso`. Stable for equal dates. */\nfunction sortNotes(\n notes: readonly NoteTimelineNote[],\n): readonly NoteTimelineNote[] {\n return [...notes].sort((a, b) => {\n if (!!a.pinned !== !!b.pinned) return a.pinned ? -1 : 1;\n return b.dateIso.localeCompare(a.dateIso);\n });\n}\n\nconst overlayButtonClass = [\n 'ds:absolute ds:inset-0 ds:z-1 ds:m-0 ds:cursor-pointer',\n 'ds:rounded-[var(--radius-sm)] ds:border-0 ds:bg-transparent ds:p-0',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n].join(' ');\n\nexport const NoteTimeline = forwardRef<HTMLDivElement, NoteTimelineProps>(\n (\n {\n id,\n notes,\n maxItems = 3,\n lines = 3,\n locale,\n emptyState,\n 'aria-label': ariaLabel,\n loading = false,\n loadingRows = 2,\n className,\n onNoteActivate,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation('ui');\n const resolvedLocale = locale ?? i18n.language;\n // Date + time, distinct from the gutter's day/month + year split — this\n // one names a specific note in an accessible name, the way NotesPanel's\n // \"Edit note · {{date}}\" does.\n const stamp = useMemo(\n () =>\n (isoDate: string): string => {\n try {\n return new Intl.DateTimeFormat(resolvedLocale, {\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n }).format(new Date(isoDate));\n } catch {\n return isoDate;\n }\n },\n [resolvedLocale],\n );\n /* Settle in only when this content REPLACES a skeleton. Content that was\n simply there from the start must not fade: it would read as invisible\n for one animation to any test or reader that looks at once. */\n const followedLoading = useRef(false);\n if (loading) followedLoading.current = true;\n const enterClass = followedLoading.current ? CONTENT_ENTER_CLASS : '';\n\n const visible = useMemo(\n () => sortNotes(notes).slice(0, Math.max(0, maxItems)),\n [notes, maxItems],\n );\n\n // The overlay button is the row's one focus stop once activation is\n // wired up; a live link SafeHtml rendered inside the body would\n // otherwise add a second, so it is neutralised on the live DOM (a\n // sanitiser strips a hand-authored `tabindex` from the HTML string).\n const rootRef = useRef<HTMLDivElement | null>(null);\n const setRef = (node: HTMLDivElement | null): void => {\n rootRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n };\n useEffect(() => {\n if (!onNoteActivate) return;\n rootRef.current\n ?.querySelectorAll('a[href]')\n .forEach((a) => a.setAttribute('tabindex', '-1'));\n });\n\n // Two formatters, not one: the gutter stacks \"20 JUN\" over \"2026\", so the\n // day/month and the year are formatted apart and both stay locale-aware.\n const fmt = useMemo(\n () => ({\n dayMonth: new Intl.DateTimeFormat(resolvedLocale, {\n day: 'numeric',\n month: 'short',\n }),\n year: new Intl.DateTimeFormat(resolvedLocale, { year: 'numeric' }),\n }),\n [resolvedLocale],\n );\n\n useAgentRegistration(\n noteTimelineAgent,\n {\n getNotes: () =>\n visible.map((note) => ({\n id: note.id,\n pinned: !!note.pinned,\n flagged: !!note.flagged,\n clinical: !!note.clinical,\n })),\n getVisibleCount: () => visible.length,\n },\n id,\n );\n\n // First read only: a refresh keeps the notes it has and marks them busy.\n if (loading && visible.length === 0) {\n return (\n <div\n ref={ref}\n data-component=\"note-timeline\"\n data-component-id={id}\n data-loading=\"\"\n aria-busy=\"true\"\n className={['ds:flex ds:flex-col', className ?? ''].join(' ').trim()}\n {...rest}\n >\n {Array.from({ length: Math.max(1, loadingRows) }, (_, index) => (\n <div key={index} aria-hidden=\"true\" className={rowVariants()}>\n <div className=\"ds:flex ds:w-12 ds:shrink-0 ds:flex-col ds:items-end ds:gap-[var(--spacing-2xs)] ds:pt-px\">\n <Skeleton\n variant=\"text\"\n size=\"sm\"\n stagger={index * 2}\n width=\"80%\"\n />\n <Skeleton\n variant=\"text\"\n size=\"sm\"\n stagger={index * 2}\n width=\"50%\"\n />\n </div>\n <div\n className={[\n 'ds:relative ds:w-[9px] ds:shrink-0',\n 'ds:before:absolute ds:before:start-[4px] ds:before:top-[14px]',\n 'ds:before:bottom-[-12px] ds:before:w-px',\n 'ds:before:bg-[color:var(--border)] ds:before:content-[\"\"]',\n 'ds:group-last/note-row:before:hidden',\n ].join(' ')}\n >\n <span className={dotVariants({ tone: 'default' })} />\n </div>\n <div className=\"ds:min-w-0 ds:flex-1\">\n <Skeleton\n variant=\"text\"\n size=\"sm\"\n lines={index % 2 === 0 ? 3 : 2}\n stagger={index * 2 + 1}\n />\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n if (visible.length === 0) {\n return (\n <div\n ref={ref}\n data-component=\"note-timeline\"\n data-component-id={id}\n data-empty=\"\"\n className={className}\n {...rest}\n >\n {emptyState}\n </div>\n );\n }\n\n return (\n <div\n ref={setRef}\n data-component=\"note-timeline\"\n data-component-id={id}\n role=\"list\"\n aria-busy={loading || undefined}\n aria-label={ariaLabel ?? t('noteTimeline.regionLabel')}\n className={['ds:flex ds:flex-col', enterClass, className ?? '']\n .join(' ')\n .trim()}\n {...rest}\n >\n {visible.map((note) => {\n const date = new Date(note.dateIso);\n const tone = note.pinned\n ? ('pinned' as const)\n : note.flagged\n ? ('flagged' as const)\n : ('default' as const);\n const html =\n note.contentFormat === 'html'\n ? note.content\n : noteMarkdownToHtml(note.content);\n const canActivate = Boolean(onNoteActivate && note.id);\n\n return (\n <div\n key={note.id ?? note.dateIso}\n role=\"listitem\"\n /* id ONLY. Body, author and dates are PHI and never reach an\n attribute, where a DOM scrape or a screenshot would carry\n them out of the component. */\n data-note-id={note.id}\n data-pinned={note.pinned ? '' : undefined}\n data-flagged={note.flagged ? '' : undefined}\n className={rowVariants()}\n >\n {canActivate ? (\n <button\n type=\"button\"\n className={overlayButtonClass}\n aria-label={t('noteTimeline.openNote', {\n date: stamp(note.dateIso),\n defaultValue: 'Open note · {{date}}',\n })}\n onClick={() => onNoteActivate?.(note.id as string)}\n />\n ) : null}\n {/* 1 — date gutter */}\n {/* Sized from the --type-meta-size ROLE token, not the raw\n --font-size-2xs ramp step: `.theme-accessible` scales type by\n re-pointing the role aliases (meta xs → sm), so a raw ramp\n value would stay 10px for exactly the readers who asked for\n bigger text. The token rather than the `type-meta` CLASS,\n because that class also sets transform / weight / tracking\n and would quietly flatten the gutter's own treatment. */}\n <div className=\"ds:w-12 ds:shrink-0 ds:pt-px ds:text-end ds:text-[length:var(--type-meta-size)] ds:leading-[1.3]\">\n <div className=\"ds:font-semibold ds:tracking-[0.03em] ds:uppercase\">\n {fmt.dayMonth.format(date)}\n </div>\n <div className=\"ds:text-[color:var(--muted-foreground)]\">\n {fmt.year.format(date)}\n </div>\n </div>\n\n {/* 2 — rail: dot over the connector. The connector is a\n pseudo-element so it never lands in the a11y tree, and it is\n hidden on the last row rather than dangling into nothing. */}\n <div\n aria-hidden=\"true\"\n className={[\n 'ds:relative ds:w-[9px] ds:shrink-0',\n 'ds:before:absolute ds:before:start-[4px] ds:before:top-[14px]',\n 'ds:before:bottom-[-12px] ds:before:w-px',\n 'ds:before:bg-[color:var(--border)] ds:before:content-[\"\"]',\n 'ds:group-last/note-row:before:hidden',\n ].join(' ')}\n >\n <span className={dotVariants({ tone })} />\n </div>\n\n {/* 3 — body + byline */}\n <div className=\"ds:min-w-0 ds:flex-1\">\n <SafeHtml\n html={html}\n profile={\n note.contentFormat === 'html' ? 'rich-text' : 'markdown'\n }\n className={bodyVariants({ lines })}\n />\n {note.author ||\n note.pinned ||\n note.flagged ||\n note.attachedTo ? (\n <div className=\"ds:mt-[var(--spacing-2xs)] ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-2xs)] type-meta ds:text-[color:var(--muted-foreground)]\">\n {note.author ? <span>{note.author.name}</span> : null}\n {note.pinned ? (\n <span className=\"ds:inline-flex ds:items-center\">\n <Pin\n aria-hidden=\"true\"\n className=\"ds:size-3 ds:text-[color:var(--accent)]\"\n />\n <span className=\"ds:sr-only\">\n {t('noteTimeline.pinned')}\n </span>\n </span>\n ) : null}\n {note.flagged ? (\n <span className=\"ds:inline-flex ds:items-center\">\n <Flag\n aria-hidden=\"true\"\n className=\"ds:size-3 ds:text-[color:var(--warning-readable)]\"\n />\n <span className=\"ds:sr-only\">\n {t('noteTimeline.flagged')}\n </span>\n </span>\n ) : null}\n <NoteAttachmentChip attachedTo={note.attachedTo} />\n </div>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n );\n },\n);\n\nNoteTimeline.displayName = 'NoteTimeline';\n"],"names":["noteTimelineAgent","handle","rowVariants","cva","bodyVariants","dotVariants","sortNotes","notes","a","b","overlayButtonClass","NoteTimeline","forwardRef","id","maxItems","lines","locale","emptyState","ariaLabel","loading","loadingRows","className","onNoteActivate","rest","ref","t","i18n","useTranslation","resolvedLocale","stamp","useMemo","isoDate","followedLoading","useRef","enterClass","CONTENT_ENTER_CLASS","visible","rootRef","setRef","node","useEffect","_a","fmt","useAgentRegistration","note","jsx","_","index","jsxs","Skeleton","date","tone","html","noteMarkdownToHtml","canActivate","SafeHtml","Pin","Flag","NoteAttachmentChip"],"mappings":"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"}
|
|
@@ -4,8 +4,8 @@ import { c as Et } from "./index-D2ZczOXr.js";
|
|
|
4
4
|
import { useTranslation as kn } from "react-i18next";
|
|
5
5
|
import { g as mt, h as Rt } from "./handled-rejection-6gqCf5vt.js";
|
|
6
6
|
import { u as zn } from "./registry-DvAUVLHh.js";
|
|
7
|
-
import { C as Hn } from "./clinical-note-card-
|
|
8
|
-
import { R as Mn } from "./rich-text-editor-
|
|
7
|
+
import { C as Hn } from "./clinical-note-card-hx939bvw.js";
|
|
8
|
+
import { R as Mn } from "./rich-text-editor-UgXri8h6.js";
|
|
9
9
|
import { T as Wn } from "./text-area-COMVJ1yE.js";
|
|
10
10
|
import { A as j } from "./alert-BhCstf2h.js";
|
|
11
11
|
import { B as te } from "./button-Bn16lcFM.js";
|
|
@@ -14,7 +14,7 @@ import { S as $n } from "./switch-D--x7n6h.js";
|
|
|
14
14
|
import { T as Bn } from "./tooltip-Cp-PLePW.js";
|
|
15
15
|
import { C as yt } from "./card-DMO2nkt4.js";
|
|
16
16
|
import { C as Kn, S as ve } from "./skeleton-B1KTdJ4N.js";
|
|
17
|
-
import { D as L } from "./dialog-
|
|
17
|
+
import { D as L } from "./dialog-Dn-iQ0Jp.js";
|
|
18
18
|
import { P as In } from "./panel-header-D_mTdhUp.js";
|
|
19
19
|
import { a as Yn, u as Gn, R as Jn } from "./use-list-reflow-C7O4Uqnl.js";
|
|
20
20
|
import { u as Qn } from "./use-isomorphic-layout-effect-BGfaCOP1.js";
|
|
@@ -1109,4 +1109,4 @@ const jr = qn(
|
|
|
1109
1109
|
export {
|
|
1110
1110
|
jr as N
|
|
1111
1111
|
};
|
|
1112
|
-
//# sourceMappingURL=notes-panel-
|
|
1112
|
+
//# sourceMappingURL=notes-panel-DHLHsxpW.js.map
|