@alfadocs/ui-kit-debug 1.67.0 → 1.68.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-CJtu7LQU.js → address-fields-BUPRs3n-.js} +3 -3
- package/dist/_chunks/{address-fields-CJtu7LQU.js.map → address-fields-BUPRs3n-.js.map} +1 -1
- package/dist/_chunks/{agenda-card-DR9gDdKp.js → agenda-card-BDuvreCe.js} +2 -2
- package/dist/_chunks/{agenda-card-DR9gDdKp.js.map → agenda-card-BDuvreCe.js.map} +1 -1
- package/dist/_chunks/{agenda-tray-DGB1Zup-.js → agenda-tray-CfwylhWf.js} +3 -3
- package/dist/_chunks/{agenda-tray-DGB1Zup-.js.map → agenda-tray-CfwylhWf.js.map} +1 -1
- package/dist/_chunks/{ai-credits-exhausted-notice-DfAgfZDF.js → ai-credits-exhausted-notice-Bg8NpW2K.js} +2 -2
- package/dist/_chunks/{ai-credits-exhausted-notice-DfAgfZDF.js.map → ai-credits-exhausted-notice-Bg8NpW2K.js.map} +1 -1
- package/dist/_chunks/{ai-permission-notice-qsdm4Sx4.js → ai-permission-notice-C00i6VhY.js} +2 -2
- package/dist/_chunks/{ai-permission-notice-qsdm4Sx4.js.map → ai-permission-notice-C00i6VhY.js.map} +1 -1
- package/dist/_chunks/{ai-prompt-input-DSGSe4LH.js → ai-prompt-input-DzgyoKyk.js} +141 -139
- package/dist/_chunks/ai-prompt-input-DzgyoKyk.js.map +1 -0
- package/dist/_chunks/{alert-DjsJMGRE.js → alert-9kEwDza3.js} +122 -112
- package/dist/_chunks/alert-9kEwDza3.js.map +1 -0
- package/dist/_chunks/{alia-sidebar-qe0quZkB.js → alia-sidebar-B06ZSOaF.js} +3 -3
- package/dist/_chunks/{alia-sidebar-qe0quZkB.js.map → alia-sidebar-B06ZSOaF.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-card-CMzBLTiN.js → anamnesis-summary-card-DQ3iE1gD.js} +2 -2
- package/dist/_chunks/{anamnesis-summary-card-CMzBLTiN.js.map → anamnesis-summary-card-DQ3iE1gD.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-rows-BQ_EokKz.js → anamnesis-summary-rows-CNK0fIJk.js} +392 -388
- package/dist/_chunks/anamnesis-summary-rows-CNK0fIJk.js.map +1 -0
- package/dist/_chunks/{appointment-card-CL32sux-.js → appointment-card-5JMWi9_f.js} +2 -2
- package/dist/_chunks/{appointment-card-CL32sux-.js.map → appointment-card-5JMWi9_f.js.map} +1 -1
- package/dist/_chunks/{appointment-peek-B5mcDcXt.js → appointment-peek-D5XCfYKu.js} +2 -2
- package/dist/_chunks/{appointment-peek-B5mcDcXt.js.map → appointment-peek-D5XCfYKu.js.map} +1 -1
- package/dist/_chunks/{appointment-timeline-CCqjORFb.js → appointment-timeline-VFP6HoXT.js} +4 -4
- package/dist/_chunks/{appointment-timeline-CCqjORFb.js.map → appointment-timeline-VFP6HoXT.js.map} +1 -1
- package/dist/_chunks/{appointment-tray-qtpJt8e0.js → appointment-tray-B3PDER3I.js} +3 -3
- package/dist/_chunks/{appointment-tray-qtpJt8e0.js.map → appointment-tray-B3PDER3I.js.map} +1 -1
- package/dist/_chunks/{audio-recorder-B11RR-rC.js → audio-recorder-4Ll0pwYK.js} +3 -3
- package/dist/_chunks/{audio-recorder-B11RR-rC.js.map → audio-recorder-4Ll0pwYK.js.map} +1 -1
- package/dist/_chunks/{auth-form-parts-DwUTH6YN.js → auth-form-parts-B40zvD-a.js} +2 -2
- package/dist/_chunks/{auth-form-parts-DwUTH6YN.js.map → auth-form-parts-B40zvD-a.js.map} +1 -1
- package/dist/_chunks/avatar-BPiPL7ND.js +199 -0
- package/dist/_chunks/avatar-BPiPL7ND.js.map +1 -0
- package/dist/_chunks/{balance-badge-cell-DZNthHO1.js → balance-badge-cell-BG3DMly4.js} +4 -4
- package/dist/_chunks/{balance-badge-cell-DZNthHO1.js.map → balance-badge-cell-BG3DMly4.js.map} +1 -1
- package/dist/_chunks/{bishop-score-CaNTrikJ.js → bishop-score-Df8nF1qg.js} +2 -2
- package/dist/_chunks/{bishop-score-CaNTrikJ.js.map → bishop-score-Df8nF1qg.js.map} +1 -1
- package/dist/_chunks/{booking-tTVxKPQY.js → booking-B1pDbERi.js} +377 -335
- package/dist/_chunks/booking-B1pDbERi.js.map +1 -0
- package/dist/_chunks/{calendar-BhN-jisv.js → calendar-BvOM8rG3.js} +2 -2
- package/dist/_chunks/{calendar-BhN-jisv.js.map → calendar-BvOM8rG3.js.map} +1 -1
- package/dist/_chunks/{calendar-workspace-MRrzcxAy.js → calendar-workspace-CYK1M83j.js} +18 -18
- package/dist/_chunks/{calendar-workspace-MRrzcxAy.js.map → calendar-workspace-CYK1M83j.js.map} +1 -1
- package/dist/_chunks/{chat-message-fRLZ95O5.js → chat-message-Be-9vIIQ.js} +2 -2
- package/dist/_chunks/{chat-message-fRLZ95O5.js.map → chat-message-Be-9vIIQ.js.map} +1 -1
- package/dist/_chunks/{clinical-note-card-BnFTIs6x.js → clinical-note-card-Caidqcwa.js} +2 -2
- package/dist/_chunks/{clinical-note-card-BnFTIs6x.js.map → clinical-note-card-Caidqcwa.js.map} +1 -1
- package/dist/_chunks/{color-picker-BsggJovx.js → color-picker-AcaWuKah.js} +99 -95
- package/dist/_chunks/color-picker-AcaWuKah.js.map +1 -0
- package/dist/_chunks/{combobox-U5yfO6o0.js → combobox-vF9O-QoG.js} +92 -83
- package/dist/_chunks/combobox-vF9O-QoG.js.map +1 -0
- package/dist/_chunks/{contact-profile-card-C4-OCshj.js → contact-profile-card-CAwwOqHl.js} +40 -40
- package/dist/_chunks/contact-profile-card-CAwwOqHl.js.map +1 -0
- package/dist/_chunks/{control-room-rail-DUerqHeo.js → control-room-rail-BB6rCDWI.js} +3 -3
- package/dist/_chunks/{control-room-rail-DUerqHeo.js.map → control-room-rail-BB6rCDWI.js.map} +1 -1
- package/dist/_chunks/{country-select-DF5Bd_mn.js → country-select-CSE2Zm_s.js} +2 -2
- package/dist/_chunks/{country-select-DF5Bd_mn.js.map → country-select-CSE2Zm_s.js.map} +1 -1
- package/dist/_chunks/dashboard-grid-7JzaiKnk.js +1487 -0
- package/dist/_chunks/dashboard-grid-7JzaiKnk.js.map +1 -0
- package/dist/_chunks/{data-table-COoCQ4n_.js → data-table-Cty4-Jht.js} +3 -3
- package/dist/_chunks/{data-table-COoCQ4n_.js.map → data-table-Cty4-Jht.js.map} +1 -1
- package/dist/_chunks/{dependent-selector-DBr1AhLg.js → dependent-selector-C4kOgO8b.js} +2 -2
- package/dist/_chunks/{dependent-selector-DBr1AhLg.js.map → dependent-selector-C4kOgO8b.js.map} +1 -1
- package/dist/_chunks/{document-preview-VyQOjFVL.js → document-preview-513f3iPn.js} +4 -4
- package/dist/_chunks/{document-preview-VyQOjFVL.js.map → document-preview-513f3iPn.js.map} +1 -1
- package/dist/_chunks/{document-scanner-CXH_GYh4.js → document-scanner-Bd3wbzpI.js} +2 -2
- package/dist/_chunks/{document-scanner-CXH_GYh4.js.map → document-scanner-Bd3wbzpI.js.map} +1 -1
- package/dist/_chunks/{editable-description-ChGNdYY8.js → editable-description-DnAFi360.js} +2 -2
- package/dist/_chunks/{editable-description-ChGNdYY8.js.map → editable-description-DnAFi360.js.map} +1 -1
- package/dist/_chunks/{entity-summary-Bj-Wxq7Y.js → entity-summary-C2B8yNmc.js} +4 -4
- package/dist/_chunks/{entity-summary-Bj-Wxq7Y.js.map → entity-summary-C2B8yNmc.js.map} +1 -1
- package/dist/_chunks/{error-summary-PUE5Zxp9.js → error-summary-mGxIyDAY.js} +2 -2
- package/dist/_chunks/{error-summary-PUE5Zxp9.js.map → error-summary-mGxIyDAY.js.map} +1 -1
- package/dist/_chunks/{face-scheme-DAD-mXzM.js → face-scheme-CSJdRNad.js} +248 -244
- package/dist/_chunks/{face-scheme-DAD-mXzM.js.map → face-scheme-CSJdRNad.js.map} +1 -1
- package/dist/_chunks/{file-manager-RiV7-OEE.js → file-manager-D4cPnRhL.js} +3 -3
- package/dist/_chunks/{file-manager-RiV7-OEE.js.map → file-manager-D4cPnRhL.js.map} +1 -1
- package/dist/_chunks/{forgot-password-form-CPOfRE0C.js → forgot-password-form-Dqi7R-NL.js} +4 -4
- package/dist/_chunks/{forgot-password-form-CPOfRE0C.js.map → forgot-password-form-Dqi7R-NL.js.map} +1 -1
- package/dist/_chunks/format-number-DdzqwMs1.js +13 -0
- package/dist/_chunks/format-number-DdzqwMs1.js.map +1 -0
- package/dist/_chunks/{freemium-paywall-6DO7noHX.js → freemium-paywall-C73C8Rgd.js} +2 -2
- package/dist/_chunks/{freemium-paywall-6DO7noHX.js.map → freemium-paywall-C73C8Rgd.js.map} +1 -1
- package/dist/_chunks/{gestational-age-calculator-CZYa2D6m.js → gestational-age-calculator-Du53p8MH.js} +2 -2
- package/dist/_chunks/{gestational-age-calculator-CZYa2D6m.js.map → gestational-age-calculator-Du53p8MH.js.map} +1 -1
- package/dist/_chunks/{header-settings-BSH9Gk0J.js → header-settings-DlUbvAUx.js} +37 -36
- package/dist/_chunks/header-settings-DlUbvAUx.js.map +1 -0
- package/dist/_chunks/{heatmap-C1TeC7wT.js → heatmap-DbZIQg14.js} +4 -4
- package/dist/_chunks/{heatmap-C1TeC7wT.js.map → heatmap-DbZIQg14.js.map} +1 -1
- package/dist/_chunks/{help-me-write-templates-Bw3Q58x-.js → help-me-write-templates-5WkUfvc_.js} +3 -3
- package/dist/_chunks/{help-me-write-templates-Bw3Q58x-.js.map → help-me-write-templates-5WkUfvc_.js.map} +1 -1
- package/dist/_chunks/{kit-extensions-DWs1UEXb.js → kit-extensions-CYvLL4ee.js} +3 -3
- package/dist/_chunks/{kit-extensions-DWs1UEXb.js.map → kit-extensions-CYvLL4ee.js.map} +1 -1
- package/dist/_chunks/length-token-DwMnGEYT.js +24 -0
- package/dist/_chunks/length-token-DwMnGEYT.js.map +1 -0
- package/dist/_chunks/{link-cell-renderer-CtTsvfPY.js → link-cell-renderer-DtIsQWDO.js} +4 -4
- package/dist/_chunks/{link-cell-renderer-CtTsvfPY.js.map → link-cell-renderer-DtIsQWDO.js.map} +1 -1
- package/dist/_chunks/{login-dev-card-A-CL3mjt.js → login-dev-card-vEL-o5wq.js} +3 -3
- package/dist/_chunks/{login-dev-card-A-CL3mjt.js.map → login-dev-card-vEL-o5wq.js.map} +1 -1
- package/dist/_chunks/{map-view-BuVfJMEa.js → map-view-CtohteZD.js} +300 -191
- package/dist/_chunks/map-view-CtohteZD.js.map +1 -0
- package/dist/_chunks/{marketplace-app-shell-DtSX8sYb.js → marketplace-app-shell-CcLQ0Dn-.js} +4 -4
- package/dist/_chunks/{marketplace-app-shell-DtSX8sYb.js.map → marketplace-app-shell-CcLQ0Dn-.js.map} +1 -1
- package/dist/_chunks/{message-card-A3mJNqfy.js → message-card-C_ksqIYM.js} +2 -2
- package/dist/_chunks/{message-card-A3mJNqfy.js.map → message-card-C_ksqIYM.js.map} +1 -1
- package/dist/_chunks/{message-tray-Ft6vSr71.js → message-tray-DCoQ4GQb.js} +3 -3
- package/dist/_chunks/{message-tray-Ft6vSr71.js.map → message-tray-DCoQ4GQb.js.map} +1 -1
- package/dist/_chunks/{multi-select-CMaAQQgb.js → multi-select-BOad3za9.js} +110 -98
- package/dist/_chunks/multi-select-BOad3za9.js.map +1 -0
- package/dist/_chunks/{muscle-scheme-YoN3rYXV.js → muscle-scheme-C66WlCxG.js} +2 -2
- package/dist/_chunks/{muscle-scheme-YoN3rYXV.js.map → muscle-scheme-C66WlCxG.js.map} +1 -1
- package/dist/_chunks/{note-timeline-DDqNU46n.js → note-timeline-KzL52MmB.js} +2 -2
- package/dist/_chunks/{note-timeline-DDqNU46n.js.map → note-timeline-KzL52MmB.js.map} +1 -1
- package/dist/_chunks/{notes-panel-IdsmqRFC.js → notes-panel-BXN46XkF.js} +6 -6
- package/dist/_chunks/{notes-panel-IdsmqRFC.js.map → notes-panel-BXN46XkF.js.map} +1 -1
- package/dist/_chunks/notice-group-DkYzKyAZ.js +291 -0
- package/dist/_chunks/notice-group-DkYzKyAZ.js.map +1 -0
- package/dist/_chunks/{notification-tray-BR3seWA7.js → notification-tray-Cp18MW5b.js} +2 -2
- package/dist/_chunks/{notification-tray-BR3seWA7.js.map → notification-tray-Cp18MW5b.js.map} +1 -1
- package/dist/_chunks/{operator-hero-3_RG4Dkj.js → operator-hero-6aAIQaFZ.js} +83 -66
- package/dist/_chunks/operator-hero-6aAIQaFZ.js.map +1 -0
- package/dist/_chunks/{optical-prescription-CxfMsbxi.js → optical-prescription-ulXnDbBe.js} +525 -509
- package/dist/_chunks/optical-prescription-ulXnDbBe.js.map +1 -0
- package/dist/_chunks/panel-header-CbtlTe85.js +190 -0
- package/dist/_chunks/panel-header-CbtlTe85.js.map +1 -0
- package/dist/_chunks/{panel-subview-yP4qIbKS.js → panel-subview-BPU7220K.js} +2 -2
- package/dist/_chunks/{panel-subview-yP4qIbKS.js.map → panel-subview-BPU7220K.js.map} +1 -1
- package/dist/_chunks/{patient-details-C-EWQTms.js → patient-details-C4Dyo7Ck.js} +4 -4
- package/dist/_chunks/{patient-details-C-EWQTms.js.map → patient-details-C4Dyo7Ck.js.map} +1 -1
- package/dist/_chunks/{patient-field-row-lY-Tb5Mo.js → patient-field-row-DROvUkFu.js} +4 -4
- package/dist/_chunks/{patient-field-row-lY-Tb5Mo.js.map → patient-field-row-DROvUkFu.js.map} +1 -1
- package/dist/_chunks/{patient-search-DpAKidZ5.js → patient-search-BADdx3M1.js} +2 -2
- package/dist/_chunks/{patient-search-DpAKidZ5.js.map → patient-search-BADdx3M1.js.map} +1 -1
- package/dist/_chunks/{patient-summary-card-Bpto_VCD.js → patient-summary-card-CAimxbuI.js} +4 -4
- package/dist/_chunks/{patient-summary-card-Bpto_VCD.js.map → patient-summary-card-CAimxbuI.js.map} +1 -1
- package/dist/_chunks/{payment-automation-upsell-BQ307qEX.js → payment-automation-upsell-CiwF5UrC.js} +2 -2
- package/dist/_chunks/{payment-automation-upsell-BQ307qEX.js.map → payment-automation-upsell-CiwF5UrC.js.map} +1 -1
- package/dist/_chunks/{payment-form-XKtinW8r.js → payment-form-PBuh8PIa.js} +2 -2
- package/dist/_chunks/{payment-form-XKtinW8r.js.map → payment-form-PBuh8PIa.js.map} +1 -1
- package/dist/_chunks/{pdf-viewer-BvoVMjH4.js → pdf-viewer-gAsNUsA8.js} +2 -2
- package/dist/_chunks/{pdf-viewer-BvoVMjH4.js.map → pdf-viewer-gAsNUsA8.js.map} +1 -1
- package/dist/_chunks/{periodontal-risk-chart-CPy7CNFe.js → periodontal-risk-chart-B7S9OmPC.js} +97 -89
- package/dist/_chunks/periodontal-risk-chart-B7S9OmPC.js.map +1 -0
- package/dist/_chunks/practice-profile-hero-qfrsFQI_.js +236 -0
- package/dist/_chunks/practice-profile-hero-qfrsFQI_.js.map +1 -0
- package/dist/_chunks/{practice-results-BrUDDMXC.js → practice-results-BzThnpnm.js} +328 -298
- package/dist/_chunks/practice-results-BzThnpnm.js.map +1 -0
- package/dist/_chunks/{pregnancy-dating-B8wo4l_r.js → pregnancy-dating-EFcFUJkQ.js} +2 -2
- package/dist/_chunks/{pregnancy-dating-B8wo4l_r.js.map → pregnancy-dating-EFcFUJkQ.js.map} +1 -1
- package/dist/_chunks/{privacy-mask-Ch7743uk.js → privacy-mask-CCz9zuIh.js} +2 -2
- package/dist/_chunks/{privacy-mask-Ch7743uk.js.map → privacy-mask-CCz9zuIh.js.map} +1 -1
- package/dist/_chunks/{product-hub-panel-C_ZosrBt.js → product-hub-panel-YuFbNPlT.js} +2 -2
- package/dist/_chunks/{product-hub-panel-C_ZosrBt.js.map → product-hub-panel-YuFbNPlT.js.map} +1 -1
- package/dist/_chunks/progress-notice-DiHWZ8Ms.js +279 -0
- package/dist/_chunks/progress-notice-DiHWZ8Ms.js.map +1 -0
- package/dist/_chunks/{province-select-Bd20Z9Br.js → province-select-CDjs5obD.js} +2 -2
- package/dist/_chunks/{province-select-Bd20Z9Br.js.map → province-select-CDjs5obD.js.map} +1 -1
- package/dist/_chunks/{radiograph-panel.agent-8Ewv8-d7.js → radiograph-panel.agent-4UllIoTQ.js} +2 -2
- package/dist/_chunks/{radiograph-panel.agent-8Ewv8-d7.js.map → radiograph-panel.agent-4UllIoTQ.js.map} +1 -1
- package/dist/_chunks/{rating-C1Vrmpsi.js → rating-CGYpg5dj.js} +43 -44
- package/dist/_chunks/rating-CGYpg5dj.js.map +1 -0
- package/dist/_chunks/{registration-form-BxwqUZzk.js → registration-form-1B0PTDal.js} +4 -4
- package/dist/_chunks/{registration-form-BxwqUZzk.js.map → registration-form-1B0PTDal.js.map} +1 -1
- package/dist/_chunks/{reviews-panel-AvsVgtJu.js → reviews-panel-CosDZyow.js} +29 -7
- package/dist/_chunks/reviews-panel-CosDZyow.js.map +1 -0
- package/dist/_chunks/{rich-text-editor-aCIoptbg.js → rich-text-editor-56dSsyZI.js} +3 -3
- package/dist/_chunks/{rich-text-editor-aCIoptbg.js.map → rich-text-editor-56dSsyZI.js.map} +1 -1
- package/dist/_chunks/{select-k4gBdS8N.js → select-4S-eYZUf.js} +244 -214
- package/dist/_chunks/select-4S-eYZUf.js.map +1 -0
- package/dist/_chunks/{sign-document-D1P1nUQA.js → sign-document-BiOTs1P4.js} +2 -2
- package/dist/_chunks/{sign-document-D1P1nUQA.js.map → sign-document-BiOTs1P4.js.map} +1 -1
- package/dist/_chunks/{signature-request-3u6TvRt2.js → signature-request-DAmNj_uq.js} +5 -5
- package/dist/_chunks/{signature-request-3u6TvRt2.js.map → signature-request-DAmNj_uq.js.map} +1 -1
- package/dist/_chunks/skeleton-tTWJpvAq.js +415 -0
- package/dist/_chunks/skeleton-tTWJpvAq.js.map +1 -0
- package/dist/_chunks/{slot-grid-dj5f6R2w.js → slot-grid-D_gix9mJ.js} +2 -2
- package/dist/_chunks/{slot-grid-dj5f6R2w.js.map → slot-grid-D_gix9mJ.js.map} +1 -1
- package/dist/_chunks/{tabs-2x3L13jn.js → tabs-BTj-2qMZ.js} +2 -2
- package/dist/_chunks/{tabs-2x3L13jn.js.map → tabs-BTj-2qMZ.js.map} +1 -1
- package/dist/_chunks/{task-card-BS7Uqevr.js → task-card-Ci2XbLmq.js} +2 -2
- package/dist/_chunks/{task-card-BS7Uqevr.js.map → task-card-Ci2XbLmq.js.map} +1 -1
- package/dist/_chunks/{task-editor-Bb5MMcid.js → task-editor-BomyxGoZ.js} +8 -8
- package/dist/_chunks/{task-editor-Bb5MMcid.js.map → task-editor-BomyxGoZ.js.map} +1 -1
- package/dist/_chunks/{task-tray-eQU4KJcA.js → task-tray-Dnc72nl-.js} +3 -3
- package/dist/_chunks/{task-tray-eQU4KJcA.js.map → task-tray-Dnc72nl-.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-BOb57Ysw.js → tasks-panel-ATz9JDy8.js} +6 -6
- package/dist/_chunks/{tasks-panel-BOb57Ysw.js.map → tasks-panel-ATz9JDy8.js.map} +1 -1
- package/dist/_chunks/{theme-toggle-Ctb77x6O.js → theme-toggle-DT_Jn4DC.js} +147 -138
- package/dist/_chunks/theme-toggle-DT_Jn4DC.js.map +1 -0
- package/dist/_chunks/{timeline-DEIuHrWz.js → timeline-wUuTDFY_.js} +2 -2
- package/dist/_chunks/{timeline-DEIuHrWz.js.map → timeline-wUuTDFY_.js.map} +1 -1
- package/dist/_chunks/{tool-rail-C-03rH2I.js → tool-rail-C-M3eVdY.js} +2 -2
- package/dist/_chunks/{tool-rail-C-03rH2I.js.map → tool-rail-C-M3eVdY.js.map} +1 -1
- package/dist/_chunks/{transcript-panel-XudW5l6l.js → transcript-panel-CoHHpcFg.js} +2 -2
- package/dist/_chunks/{transcript-panel-XudW5l6l.js.map → transcript-panel-CoHHpcFg.js.map} +1 -1
- package/dist/_chunks/{treatment-receipt-Cpm8tqQN.js → treatment-receipt-pFqWFyD_.js} +2 -2
- package/dist/_chunks/{treatment-receipt-Cpm8tqQN.js.map → treatment-receipt-pFqWFyD_.js.map} +1 -1
- package/dist/_chunks/{unit-converter-BPZ0Ldkb.js → unit-converter-CIoTmCmP.js} +2 -2
- package/dist/_chunks/{unit-converter-BPZ0Ldkb.js.map → unit-converter-CIoTmCmP.js.map} +1 -1
- package/dist/_chunks/{use-appointment-details-read-CVSPoP5j.js → use-appointment-details-read-CUGfE0hV.js} +12 -12
- package/dist/_chunks/{use-appointment-details-read-CVSPoP5j.js.map → use-appointment-details-read-CUGfE0hV.js.map} +1 -1
- package/dist/_chunks/use-dismissed-CTOWqA0e.js +177 -0
- package/dist/_chunks/use-dismissed-CTOWqA0e.js.map +1 -0
- package/dist/_chunks/{voice-control-panel-BJIEbDq6.js → voice-control-panel-B8Lrk0C4.js} +4 -4
- package/dist/_chunks/{voice-control-panel-BJIEbDq6.js.map → voice-control-panel-B8Lrk0C4.js.map} +1 -1
- package/dist/_chunks/{warning-stack-BdY-0bd3.js → warning-stack-BhHUmRiD.js} +2 -2
- package/dist/_chunks/{warning-stack-BdY-0bd3.js.map → warning-stack-BhHUmRiD.js.map} +1 -1
- package/dist/_chunks/{workflow-map-CYbRD9ek.js → workflow-map-ln4_OG8A.js} +2 -2
- package/dist/_chunks/{workflow-map-CYbRD9ek.js.map → workflow-map-ln4_OG8A.js.map} +1 -1
- package/dist/agent-catalog.json +172 -4
- package/dist/agent-i18n/en.json +25 -1
- package/dist/components/_shared/format-number.d.ts +20 -0
- package/dist/components/_shared/format-number.d.ts.map +1 -0
- package/dist/components/_shared/length-token.d.ts +12 -0
- package/dist/components/_shared/length-token.d.ts.map +1 -0
- package/dist/components/_shared/option.d.ts +1 -0
- package/dist/components/_shared/option.d.ts.map +1 -1
- package/dist/components/address-fields/index.js +1 -1
- package/dist/components/agenda-card/index.js +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-credits-notice/index.js +1 -1
- package/dist/components/ai-permission-notice/index.js +1 -1
- package/dist/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/alert/alert.d.ts +26 -0
- package/dist/components/alert/alert.d.ts.map +1 -1
- package/dist/components/alert/index.js +1 -1
- package/dist/components/anamnesis-summary-card/index.js +1 -1
- package/dist/components/appointment-card/index.js +2 -2
- 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/audio-recorder/index.js +1 -1
- package/dist/components/avatar/avatar.d.ts +2 -0
- package/dist/components/avatar/avatar.d.ts.map +1 -1
- package/dist/components/avatar/index.js +1 -1
- package/dist/components/bishop-score/index.js +1 -1
- package/dist/components/booking/booking.d.ts.map +1 -1
- package/dist/components/booking/details-form.d.ts.map +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/chat-message/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/combobox/combobox.d.ts.map +1 -1
- package/dist/components/combobox/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/country-select/index.js +1 -1
- package/dist/components/dashboard-grid/dashboard-grid.agent.d.ts.map +1 -1
- package/dist/components/dashboard-grid/dashboard-grid.d.ts +20 -1
- 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/dependent-selector/index.js +1 -1
- package/dist/components/document-preview/index.js +1 -1
- package/dist/components/document-scanner/index.js +1 -1
- package/dist/components/editable-description/index.js +1 -1
- package/dist/components/entity-summary/index.js +1 -1
- package/dist/components/error-summary/index.js +1 -1
- package/dist/components/face-scheme/face-scheme.d.ts.map +1 -1
- package/dist/components/face-scheme/index.js +1 -1
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/freemium-paywall/index.js +1 -1
- package/dist/components/gestational-age-calculator/index.js +1 -1
- package/dist/components/header-settings/header-settings.d.ts.map +1 -1
- package/dist/components/header-settings/index.js +1 -1
- package/dist/components/heatmap/index.js +1 -1
- package/dist/components/index.d.ts +4 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/map-view/index.d.ts +1 -1
- package/dist/components/map-view/index.d.ts.map +1 -1
- package/dist/components/map-view/index.js +1 -1
- package/dist/components/map-view/map-view.d.ts +51 -0
- package/dist/components/map-view/map-view.d.ts.map +1 -1
- package/dist/components/message-card/index.js +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/multi-select/index.js +1 -1
- package/dist/components/multi-select/multi-select.d.ts.map +1 -1
- package/dist/components/muscle-scheme/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/notice-group/index.d.ts +3 -0
- package/dist/components/notice-group/index.d.ts.map +1 -0
- package/dist/components/notice-group/index.js +6 -0
- package/dist/components/notice-group/index.js.map +1 -0
- package/dist/components/notice-group/notice-group.agent.d.ts +4 -0
- package/dist/components/notice-group/notice-group.agent.d.ts.map +1 -0
- package/dist/components/notice-group/notice-group.d.ts +43 -0
- package/dist/components/notice-group/notice-group.d.ts.map +1 -0
- package/dist/components/notification-tray/index.js +1 -1
- package/dist/components/operator-hero/index.js +1 -1
- package/dist/components/operator-hero/operator-hero.d.ts.map +1 -1
- package/dist/components/optical-prescription/index.js +1 -1
- package/dist/components/optical-prescription/optical-prescription-data.d.ts +8 -8
- package/dist/components/optical-prescription/optical-prescription-data.d.ts.map +1 -1
- package/dist/components/optical-prescription/optical-prescription.d.ts.map +1 -1
- package/dist/components/panel-header/index.js +1 -1
- package/dist/components/panel-header/panel-header.d.ts +10 -0
- package/dist/components/panel-header/panel-header.d.ts.map +1 -1
- package/dist/components/panel-subview/index.js +1 -1
- package/dist/components/patient-details/index.js +1 -1
- package/dist/components/patient-search/index.js +1 -1
- package/dist/components/patient-summary-card/index.js +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/payment-form/index.js +1 -1
- package/dist/components/pdf-viewer/index.js +1 -1
- package/dist/components/periodontal-risk-chart/index.js +1 -1
- package/dist/components/periodontal-risk-chart/periodontal-risk-chart.d.ts.map +1 -1
- package/dist/components/practice-profile-hero/index.js +1 -1
- package/dist/components/practice-profile-hero/practice-profile-hero.d.ts +4 -1
- package/dist/components/practice-profile-hero/practice-profile-hero.d.ts.map +1 -1
- package/dist/components/practice-results/index.js +1 -1
- package/dist/components/practice-results/practice-results.d.ts +10 -2
- package/dist/components/practice-results/practice-results.d.ts.map +1 -1
- package/dist/components/pregnancy-dating/index.js +1 -1
- package/dist/components/product-hub-tray/index.js +1 -1
- package/dist/components/progress-notice/index.d.ts +3 -0
- package/dist/components/progress-notice/index.d.ts.map +1 -0
- package/dist/components/progress-notice/index.js +6 -0
- package/dist/components/progress-notice/index.js.map +1 -0
- package/dist/components/progress-notice/progress-notice.agent.d.ts +4 -0
- package/dist/components/progress-notice/progress-notice.agent.d.ts.map +1 -0
- package/dist/components/progress-notice/progress-notice.d.ts +81 -0
- package/dist/components/progress-notice/progress-notice.d.ts.map +1 -0
- package/dist/components/province-select/index.js +1 -1
- package/dist/components/radiograph-panel/index.js +1 -1
- package/dist/components/rating/index.js +1 -1
- package/dist/components/rating/rating.d.ts.map +1 -1
- package/dist/components/reviews-panel/index.js +1 -1
- package/dist/components/reviews-panel/reviews-panel.d.ts.map +1 -1
- package/dist/components/rich-text-editor/index.js +2 -2
- package/dist/components/select/index.js +1 -1
- package/dist/components/select/select.d.ts +6 -0
- package/dist/components/select/select.d.ts.map +1 -1
- package/dist/components/sign-document/index.js +1 -1
- package/dist/components/skeleton/index.d.ts +1 -1
- package/dist/components/skeleton/index.d.ts.map +1 -1
- package/dist/components/skeleton/index.js +1 -1
- package/dist/components/skeleton/skeleton.d.ts +41 -1
- package/dist/components/skeleton/skeleton.d.ts.map +1 -1
- package/dist/components/skeleton-scheme/index.js +1 -1
- package/dist/components/slot-grid/index.js +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/task-card/index.js +1 -1
- package/dist/components/task-editor/index.js +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/tasks-panel/index.js +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/theme-toggle/theme-toggle.d.ts.map +1 -1
- package/dist/components/timeline/index.js +1 -1
- package/dist/components/tool-rail/index.js +1 -1
- package/dist/components/transcript-panel/index.js +1 -1
- package/dist/components/treatment-receipt/index.js +1 -1
- package/dist/components/unit-converter/index.js +1 -1
- package/dist/components/voice-control-panel/index.js +1 -1
- package/dist/components/warning-stack/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +81 -76
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-dismissed.d.ts +58 -0
- package/dist/hooks/use-dismissed.d.ts.map +1 -0
- package/dist/i18n/locales/ar.d.ts +22 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +22 -0
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +22 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +22 -0
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +22 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +22 -0
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +22 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +22 -0
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +22 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +22 -0
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +22 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +22 -0
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +22 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +22 -0
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +22 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +22 -0
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +22 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +22 -0
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +22 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +22 -0
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +22 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +22 -0
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +22 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +22 -0
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +22 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +22 -0
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +22 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +22 -0
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +22 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +22 -0
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +22 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +22 -0
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +22 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +22 -0
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +22 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +22 -0
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +1194 -1183
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.json +22 -0
- package/dist/locales/de.json +22 -0
- package/dist/locales/el.json +22 -0
- package/dist/locales/en.json +22 -0
- package/dist/locales/es.json +22 -0
- package/dist/locales/fr.json +22 -0
- package/dist/locales/hi.json +22 -0
- package/dist/locales/it.json +22 -0
- package/dist/locales/ja.json +22 -0
- package/dist/locales/nl.json +22 -0
- package/dist/locales/pl.json +22 -0
- package/dist/locales/pt.json +22 -0
- package/dist/locales/ro.json +22 -0
- package/dist/locales/ru.json +22 -0
- package/dist/locales/sq.json +22 -0
- package/dist/locales/sv.json +22 -0
- package/dist/locales/tr.json +22 -0
- package/dist/locales/zh.json +22 -0
- package/dist/patterns/alia-assistant/index.js +1 -1
- package/dist/patterns/anamnesis/anamnesis-export-pdf.d.ts.map +1 -1
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/patterns/forgot-password-form/index.js +1 -1
- package/dist/patterns/help-me-write-templates/index.js +2 -2
- package/dist/patterns/login-form/index.js +1 -1
- package/dist/patterns/marketplace-app-shell/index.js +1 -1
- package/dist/patterns/payment-automation-upsell/index.js +1 -1
- package/dist/patterns/registration-form/index.js +1 -1
- package/dist/patterns/signature-request/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +9 -1
- package/dist/_chunks/ai-prompt-input-DSGSe4LH.js.map +0 -1
- package/dist/_chunks/alert-DjsJMGRE.js.map +0 -1
- package/dist/_chunks/anamnesis-summary-rows-BQ_EokKz.js.map +0 -1
- package/dist/_chunks/avatar-WZY3eGE7.js +0 -123
- package/dist/_chunks/avatar-WZY3eGE7.js.map +0 -1
- package/dist/_chunks/booking-tTVxKPQY.js.map +0 -1
- package/dist/_chunks/color-picker-BsggJovx.js.map +0 -1
- package/dist/_chunks/combobox-U5yfO6o0.js.map +0 -1
- package/dist/_chunks/contact-profile-card-C4-OCshj.js.map +0 -1
- package/dist/_chunks/dashboard-grid-B2MB7SRS.js +0 -1428
- package/dist/_chunks/dashboard-grid-B2MB7SRS.js.map +0 -1
- package/dist/_chunks/header-settings-BSH9Gk0J.js.map +0 -1
- package/dist/_chunks/map-view-BuVfJMEa.js.map +0 -1
- package/dist/_chunks/multi-select-CMaAQQgb.js.map +0 -1
- package/dist/_chunks/operator-hero-3_RG4Dkj.js.map +0 -1
- package/dist/_chunks/optical-prescription-CxfMsbxi.js.map +0 -1
- package/dist/_chunks/panel-header-BJkaUwnl.js +0 -128
- package/dist/_chunks/panel-header-BJkaUwnl.js.map +0 -1
- package/dist/_chunks/periodontal-risk-chart-CPy7CNFe.js.map +0 -1
- package/dist/_chunks/practice-profile-hero-Dfc0F60y.js +0 -193
- package/dist/_chunks/practice-profile-hero-Dfc0F60y.js.map +0 -1
- package/dist/_chunks/practice-results-BrUDDMXC.js.map +0 -1
- package/dist/_chunks/rating-C1Vrmpsi.js.map +0 -1
- package/dist/_chunks/reviews-panel-AvsVgtJu.js.map +0 -1
- package/dist/_chunks/select-k4gBdS8N.js.map +0 -1
- package/dist/_chunks/skeleton-B1KTdJ4N.js +0 -116
- package/dist/_chunks/skeleton-B1KTdJ4N.js.map +0 -1
- package/dist/_chunks/theme-toggle-Ctb77x6O.js.map +0 -1
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { jsx as u, jsxs as h } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as me, useMemo as L, isValidElement as g, useEffect as N, useState as v, useRef as m, useCallback as ge, Fragment as Q, cloneElement as he, Children as ve } from "react";
|
|
3
|
+
import { c as T } from "./index-D2ZczOXr.js";
|
|
4
|
+
import { useTranslation as ye } from "react-i18next";
|
|
5
|
+
import { u as we } from "./use-controllable-state-BiY4xTzM.js";
|
|
6
|
+
import { c as J, d as be } from "./use-dismissed-CTOWqA0e.js";
|
|
7
|
+
import { i as xe } from "./is-development-CLUAnsU7.js";
|
|
8
|
+
import { u as Ce } from "./registry-DvAUVLHh.js";
|
|
9
|
+
import { A as U } from "./alert-9kEwDza3.js";
|
|
10
|
+
import { C as ke, b as Se, a as Ge } from "./collapsible-DVPM46bq.js";
|
|
11
|
+
import { P as Ne } from "./progress-notice-DiHWZ8Ms.js";
|
|
12
|
+
import { C as Te } from "./chevron-down-DWE7GSq9.js";
|
|
13
|
+
const Oe = {
|
|
14
|
+
id: "notice-group",
|
|
15
|
+
capabilities: ["expand"],
|
|
16
|
+
state: {
|
|
17
|
+
noteCount: {
|
|
18
|
+
type: "number",
|
|
19
|
+
descriptionKey: "ui.agent.noticeGroup.state.noteCount",
|
|
20
|
+
description: "How many folding notes (not errors or progress notices) are still shown, dismissed ones excluded.",
|
|
21
|
+
read: (s) => s.getState().noteCount
|
|
22
|
+
},
|
|
23
|
+
grouped: {
|
|
24
|
+
type: "boolean",
|
|
25
|
+
descriptionKey: "ui.agent.noticeGroup.state.grouped",
|
|
26
|
+
description: "True while the notes sit behind one summary row (two or more notes).",
|
|
27
|
+
read: (s) => s.getState().grouped
|
|
28
|
+
},
|
|
29
|
+
open: {
|
|
30
|
+
type: "boolean",
|
|
31
|
+
descriptionKey: "ui.agent.noticeGroup.state.open",
|
|
32
|
+
description: "Whether the summary row is open (expanded), so every note is visible.",
|
|
33
|
+
read: (s) => s.getState().open
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
actions: {
|
|
37
|
+
set_open: {
|
|
38
|
+
// Shows or hides notes already on the page; changes no data.
|
|
39
|
+
safety: "read",
|
|
40
|
+
argsType: "open",
|
|
41
|
+
argsSchema: {
|
|
42
|
+
type: "object",
|
|
43
|
+
properties: {
|
|
44
|
+
open: {
|
|
45
|
+
type: "boolean",
|
|
46
|
+
description: "True to show every note, false to fold them."
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
required: ["open"]
|
|
50
|
+
},
|
|
51
|
+
returns: "boolean (applied)",
|
|
52
|
+
returnsSchema: {
|
|
53
|
+
type: "boolean",
|
|
54
|
+
description: "True when applied (with a controlled open, when asked of the host); false when there is no summary row (fewer than two notes)."
|
|
55
|
+
},
|
|
56
|
+
idempotent: !0,
|
|
57
|
+
errors: ["Fewer than two notes (grouped is false): returns false."],
|
|
58
|
+
descriptionKey: "ui.agent.noticeGroup.actions.setOpen",
|
|
59
|
+
description: "Open (expand) or fold the notes behind the summary row. With a controlled open the host decides.",
|
|
60
|
+
invoke: (s, o) => s.setOpen(o.open)
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
domHooks: {
|
|
64
|
+
root: {
|
|
65
|
+
attr: "data-component",
|
|
66
|
+
value: "notice-group",
|
|
67
|
+
description: 'Marks the NoticeGroup. Carries data-grouped="true" while the notes fold behind the summary row, whose Alert carries data-notice-group-summary.'
|
|
68
|
+
},
|
|
69
|
+
instanceId: {
|
|
70
|
+
attr: "data-component-id",
|
|
71
|
+
sourceProp: "id",
|
|
72
|
+
description: "Sourced from the id prop."
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}, Re = T(
|
|
76
|
+
[
|
|
77
|
+
"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]",
|
|
78
|
+
"ds:rounded-[var(--radius-md)]",
|
|
79
|
+
"ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid",
|
|
80
|
+
"ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]"
|
|
81
|
+
].join(" ")
|
|
82
|
+
), Ae = T("ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]", {
|
|
83
|
+
variants: {
|
|
84
|
+
grouped: {
|
|
85
|
+
true: "ds:pt-[var(--spacing-sm)]",
|
|
86
|
+
false: ""
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
defaultVariants: { grouped: !1 }
|
|
90
|
+
}), Ee = T(
|
|
91
|
+
[
|
|
92
|
+
"ds:flex ds:w-full ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]",
|
|
93
|
+
"ds:-my-[var(--spacing-sm)] ds:min-h-[var(--min-target-size)]",
|
|
94
|
+
"ds:rounded-[var(--radius-sm)] ds:text-start type-body-sm ds:font-semibold ds:text-current",
|
|
95
|
+
"ds:cursor-pointer ds:hover:underline ds:underline-offset-2",
|
|
96
|
+
"ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid",
|
|
97
|
+
"ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
|
|
98
|
+
"ds:forced-colors:focus-visible:outline-[CanvasText]",
|
|
99
|
+
"ds:[&_svg]:size-4 ds:[&_svg]:shrink-0",
|
|
100
|
+
"ds:[&_svg]:transition-transform ds:[&_svg]:duration-[var(--animation-duration)] ds:motion-reduce:[&_svg]:transition-none",
|
|
101
|
+
"ds:data-[state=open]:[&_svg]:rotate-180"
|
|
102
|
+
].join(" ")
|
|
103
|
+
);
|
|
104
|
+
function X(s, o = []) {
|
|
105
|
+
return ve.forEach(s, (r) => {
|
|
106
|
+
g(r) && r.type === Q ? X(r.props.children, o) : r != null && r !== !1 && o.push(r);
|
|
107
|
+
}), o;
|
|
108
|
+
}
|
|
109
|
+
function Ke(s) {
|
|
110
|
+
return X(s).map((o, r) => {
|
|
111
|
+
const p = g(o) && o.key !== null ? `key:${o.key}` : `at:${r}`;
|
|
112
|
+
if (g(o) && o.type === U) {
|
|
113
|
+
const y = o.props;
|
|
114
|
+
return {
|
|
115
|
+
identity: p,
|
|
116
|
+
element: o,
|
|
117
|
+
notice: o,
|
|
118
|
+
folds: y.variant !== "error"
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return g(o) && o.type === Ne ? {
|
|
122
|
+
identity: p,
|
|
123
|
+
element: o,
|
|
124
|
+
notice: o,
|
|
125
|
+
folds: !1
|
|
126
|
+
} : { identity: p, element: o, folds: !1 };
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
const je = me(
|
|
130
|
+
({
|
|
131
|
+
children: s,
|
|
132
|
+
summary: o,
|
|
133
|
+
open: r,
|
|
134
|
+
defaultOpen: p = !1,
|
|
135
|
+
onOpenChange: y,
|
|
136
|
+
id: O,
|
|
137
|
+
className: Y,
|
|
138
|
+
...Z
|
|
139
|
+
}, f) => {
|
|
140
|
+
var H;
|
|
141
|
+
const { t: R } = ye("ui"), [ee, w] = we({
|
|
142
|
+
value: r,
|
|
143
|
+
defaultValue: p,
|
|
144
|
+
onChange: y
|
|
145
|
+
}), b = ee ?? !1, c = L(() => Ke(s), [s]), A = c.filter(
|
|
146
|
+
(e) => !e.notice && g(e.element)
|
|
147
|
+
).length, E = c.filter((e) => e.notice), K = E.length > 1 && E.some((e) => e.identity.startsWith("at:"));
|
|
148
|
+
N(() => {
|
|
149
|
+
xe() && (A > 0 && console.warn(
|
|
150
|
+
"NoticeGroup: pass Alert and ProgressNotice elements directly. A component of your own that renders one shows as given and is never grouped."
|
|
151
|
+
), K && console.warn(
|
|
152
|
+
"NoticeGroup: give every notice a `key`, so a closed notice stays closed when the notices around it change."
|
|
153
|
+
));
|
|
154
|
+
}, [A, K]);
|
|
155
|
+
const oe = c.map(
|
|
156
|
+
(e) => e.notice ? J(
|
|
157
|
+
e.notice.props.dismissKey
|
|
158
|
+
) : void 0
|
|
159
|
+
), te = be(oe), [j, _] = v(() => /* @__PURE__ */ new Set());
|
|
160
|
+
N(() => {
|
|
161
|
+
_((e) => {
|
|
162
|
+
if (e.size === 0) return e;
|
|
163
|
+
const n = new Set(c.map((a) => a.identity)), t = new Set([...e].filter((a) => n.has(a)));
|
|
164
|
+
return t.size === e.size ? e : t;
|
|
165
|
+
});
|
|
166
|
+
}, [c]);
|
|
167
|
+
const V = c.map((e, n) => e.notice ? e.notice.props.open !== !1 && !te[n] && !j.has(e.identity) : !0), x = m(null), ne = ge(
|
|
168
|
+
(e) => {
|
|
169
|
+
x.current = e, typeof f == "function" ? f(e) : f && (f.current = e);
|
|
170
|
+
},
|
|
171
|
+
[f]
|
|
172
|
+
), z = (e) => [...e.querySelectorAll("[data-alert-dismiss]")].filter(
|
|
173
|
+
(n) => !n.closest("[hidden]")
|
|
174
|
+
), C = m(null), [se, re] = v(0);
|
|
175
|
+
N(() => {
|
|
176
|
+
const e = C.current;
|
|
177
|
+
if (e === null) return;
|
|
178
|
+
C.current = null;
|
|
179
|
+
const n = x.current;
|
|
180
|
+
if (!n) return;
|
|
181
|
+
const t = z(n);
|
|
182
|
+
(t[Math.min(e, t.length - 1)] ?? n.querySelector("[data-notice-group-summary] button") ?? n).focus();
|
|
183
|
+
}, [se]);
|
|
184
|
+
const ie = (e) => {
|
|
185
|
+
if (!e.notice) return e.element;
|
|
186
|
+
const n = e.notice, t = n.props, a = e.folds && t.announce === void 0 && t.live === void 0;
|
|
187
|
+
return he(n, {
|
|
188
|
+
...a ? { announce: "off" } : {},
|
|
189
|
+
onOpenChange: (M) => {
|
|
190
|
+
var $;
|
|
191
|
+
if (($ = t.onOpenChange) == null || $.call(t, M), M) return;
|
|
192
|
+
t.open === void 0 && J(t.dismissKey) === void 0 && _((G) => new Set(G).add(e.identity));
|
|
193
|
+
const P = x.current, W = typeof document > "u" ? null : document.activeElement, I = P && W instanceof HTMLElement ? z(P).indexOf(W) : -1;
|
|
194
|
+
I !== -1 && (C.current = I, re((G) => G + 1));
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
}, F = [], q = [];
|
|
198
|
+
let d = 0, l = 0;
|
|
199
|
+
c.forEach((e, n) => {
|
|
200
|
+
var a;
|
|
201
|
+
if (j.has(e.identity)) return;
|
|
202
|
+
const t = /* @__PURE__ */ u(Q, { children: ie(e) }, e.identity);
|
|
203
|
+
if (!e.folds) {
|
|
204
|
+
F.push(t);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
q.push(t), V[n] && (d += 1, ((a = e.notice) == null ? void 0 : a.props).variant === "warning" && (l += 1));
|
|
208
|
+
});
|
|
209
|
+
const i = d > 1, ae = V.some(Boolean), B = m(null), k = m(!1), [ce, de] = v(i), [ue, D] = v(!1);
|
|
210
|
+
if (ce !== i) {
|
|
211
|
+
de(i);
|
|
212
|
+
const e = typeof document > "u" ? null : document.activeElement;
|
|
213
|
+
D(
|
|
214
|
+
i && k.current && (e === null || e === document.body || !!((H = B.current) != null && H.contains(e)))
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
const le = i ? b || ue : !0, S = m({ noteCount: d, grouped: i, open: b });
|
|
218
|
+
S.current = { noteCount: d, grouped: i, open: b };
|
|
219
|
+
const pe = L(
|
|
220
|
+
() => ({
|
|
221
|
+
getState: () => ({ ...S.current }),
|
|
222
|
+
setOpen: (e) => S.current.grouped ? (w(e), !0) : !1
|
|
223
|
+
}),
|
|
224
|
+
[w]
|
|
225
|
+
);
|
|
226
|
+
if (Ce(Oe, pe, O), !ae) return null;
|
|
227
|
+
const fe = typeof o == "function" ? o(d, l) : o ?? R("noticeGroup.summary", { count: d });
|
|
228
|
+
return /* @__PURE__ */ h(
|
|
229
|
+
"div",
|
|
230
|
+
{
|
|
231
|
+
ref: ne,
|
|
232
|
+
"data-component": "notice-group",
|
|
233
|
+
"data-component-id": O,
|
|
234
|
+
"data-grouped": i || void 0,
|
|
235
|
+
tabIndex: -1,
|
|
236
|
+
className: [Re(), Y].filter(Boolean).join(" "),
|
|
237
|
+
...Z,
|
|
238
|
+
children: [
|
|
239
|
+
F,
|
|
240
|
+
d > 0 ? /* @__PURE__ */ h(
|
|
241
|
+
ke,
|
|
242
|
+
{
|
|
243
|
+
open: le,
|
|
244
|
+
onOpenChange: (e) => {
|
|
245
|
+
i && (D(!1), w(e));
|
|
246
|
+
},
|
|
247
|
+
children: [
|
|
248
|
+
i ? /* @__PURE__ */ u(
|
|
249
|
+
U,
|
|
250
|
+
{
|
|
251
|
+
variant: l > 0 ? "warning" : "info",
|
|
252
|
+
announce: "off",
|
|
253
|
+
"data-notice-group-summary": "",
|
|
254
|
+
children: /* @__PURE__ */ h(Se, { className: Ee(), children: [
|
|
255
|
+
/* @__PURE__ */ h("span", { className: "ds:flex ds:min-w-0 ds:flex-wrap ds:items-baseline ds:gap-x-[var(--spacing-sm)]", children: [
|
|
256
|
+
/* @__PURE__ */ u("span", { children: fe }),
|
|
257
|
+
l > 0 ? " " : null,
|
|
258
|
+
l > 0 ? /* @__PURE__ */ u("span", { className: "ds:font-normal", children: R("noticeGroup.warnings", { count: l }) }) : null
|
|
259
|
+
] }),
|
|
260
|
+
/* @__PURE__ */ u(Te, { "aria-hidden": "true" })
|
|
261
|
+
] })
|
|
262
|
+
}
|
|
263
|
+
) : null,
|
|
264
|
+
/* @__PURE__ */ u(Ge, { children: /* @__PURE__ */ u(
|
|
265
|
+
"div",
|
|
266
|
+
{
|
|
267
|
+
ref: B,
|
|
268
|
+
className: Ae({ grouped: i }),
|
|
269
|
+
onFocus: () => {
|
|
270
|
+
k.current = !0;
|
|
271
|
+
},
|
|
272
|
+
onBlur: (e) => {
|
|
273
|
+
e.currentTarget.contains(e.relatedTarget) || (k.current = !1);
|
|
274
|
+
},
|
|
275
|
+
children: q
|
|
276
|
+
}
|
|
277
|
+
) })
|
|
278
|
+
]
|
|
279
|
+
}
|
|
280
|
+
) : null
|
|
281
|
+
]
|
|
282
|
+
}
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
);
|
|
286
|
+
je.displayName = "NoticeGroup";
|
|
287
|
+
export {
|
|
288
|
+
je as N,
|
|
289
|
+
Oe as n
|
|
290
|
+
};
|
|
291
|
+
//# sourceMappingURL=notice-group-DkYzKyAZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notice-group-DkYzKyAZ.js","sources":["../../src/components/notice-group/notice-group.agent.ts","../../src/components/notice-group/notice-group.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter: NoticeGroup. */\n/* */\n/* Several notices shown as one: notes fold behind a summary row once */\n/* there are two or more; errors and progress notices always show. */\n/* State is counts and flags only. Each notice inside is a kit Alert or */\n/* ProgressNotice with its own hooks; their close controls are */\n/* [data-alert-dismiss] (self-owned, so no dismiss capability here). */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { NoticeGroupHandle } from './notice-group';\n\nexport const noticeGroupAgent: AgentAdapter<NoticeGroupHandle> = {\n id: 'notice-group',\n capabilities: ['expand'],\n state: {\n noteCount: {\n type: 'number',\n descriptionKey: 'ui.agent.noticeGroup.state.noteCount',\n description:\n 'How many folding notes (not errors or progress notices) are still shown, dismissed ones excluded.',\n read: (handle) => handle.getState().noteCount,\n },\n grouped: {\n type: 'boolean',\n descriptionKey: 'ui.agent.noticeGroup.state.grouped',\n description:\n 'True while the notes sit behind one summary row (two or more notes).',\n read: (handle) => handle.getState().grouped,\n },\n open: {\n type: 'boolean',\n descriptionKey: 'ui.agent.noticeGroup.state.open',\n description:\n 'Whether the summary row is open (expanded), so every note is visible.',\n read: (handle) => handle.getState().open,\n },\n },\n actions: {\n set_open: {\n // Shows or hides notes already on the page; changes no data.\n safety: 'read',\n argsType: 'open',\n argsSchema: {\n type: 'object',\n properties: {\n open: {\n type: 'boolean',\n description: 'True to show every note, false to fold them.',\n },\n },\n required: ['open'],\n },\n returns: 'boolean (applied)',\n returnsSchema: {\n type: 'boolean',\n description:\n 'True when applied (with a controlled open, when asked of the host); false when there is no summary row (fewer than two notes).',\n },\n idempotent: true,\n errors: ['Fewer than two notes (grouped is false): returns false.'],\n descriptionKey: 'ui.agent.noticeGroup.actions.setOpen',\n description:\n 'Open (expand) or fold the notes behind the summary row. With a controlled open the host decides.',\n invoke: (handle, args: { open: boolean }) => handle.setOpen(args.open),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'notice-group',\n description:\n 'Marks the NoticeGroup. Carries data-grouped=\"true\" while the notes fold behind the summary row, whose Alert carries data-notice-group-summary.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* NoticeGroup: several notices shown as one. */\n/* */\n/* Wraps Alerts (and ProgressNotices). Errors and progress notices */\n/* always show. The other notes (info, warning, success, promo) show */\n/* plainly while there is one; from two, they fold behind one summary */\n/* row, \"3 notes\", with a Collapsible expand control. Notes that are */\n/* dismissed (dismissKey, open={false}, or closed by the user) do not */\n/* count; with nothing left, the group renders nothing. */\n/* */\n/* The notes always render inside the same Collapsible, so a note */\n/* never remounts when the summary row comes or goes; folded notes are */\n/* unmounted, like any closed Collapsible. */\n/* ------------------------------------------------------------------ */\n\nimport {\n Children,\n Fragment,\n cloneElement,\n forwardRef,\n isValidElement,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type MutableRefObject,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ChevronDown } from 'lucide-react';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useDismissedKeys, usableDismissKey } from '../../hooks/use-dismissed';\nimport { isDevelopment } from '../_shared/is-development';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { Alert, type AlertProps } from '../alert/alert';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '../collapsible/collapsible';\nimport {\n ProgressNotice,\n type ProgressNoticeProps,\n} from '../progress-notice/progress-notice';\nimport { noticeGroupAgent } from './notice-group.agent';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface NoticeGroupHandle {\n /** What the group shows now: counts and flags only. */\n getState: () => {\n /** Notes that fold (not errors or progress), still shown. */\n noteCount: number;\n /** True while the notes sit behind the summary row (two or more). */\n grouped: boolean;\n /** Whether the summary row is open (expanded). */\n open: boolean;\n };\n /**\n * Open or fold the notes. False when there is no summary row. With a\n * controlled `open`, this asks the host through `onOpenChange`.\n */\n setOpen: (open: boolean) => boolean;\n}\n\nexport interface NoticeGroupProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'children'\n> {\n /**\n * `Alert` and `ProgressNotice` elements, passed directly (fragments are\n * fine). Give each a `key`. Anything else shows as given, outside the\n * fold.\n */\n children: ReactNode;\n /**\n * The summary row's text, for example \"3 notes about these figures\".\n * A function receives the count of notes (and of warnings among them),\n * so your own translation can pluralise it. Defaults to the kit's\n * \"{{count}} notes\". When warnings are folded, the row also says how\n * many (\"1 warning\"), whatever the summary.\n */\n summary?: string | ((count: number, warnings: number) => string);\n /** Controlled: whether the summary row is open, showing every note. */\n open?: boolean;\n /** Uncontrolled initial state. Defaults to folded. */\n defaultOpen?: boolean;\n /** Fires when the summary row opens or folds. */\n onOpenChange?: (open: boolean) => void;\n /** Opaque instance id, emitted as `data-component-id` for agents. */\n id?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst noticeGroupVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-md)]',\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 ].join(' '),\n);\n\n// The notes under the summary row, one gap apart. When the summary row\n// is gone (a single note), the note sits directly in the group.\nconst notesVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]', {\n variants: {\n grouped: {\n true: 'ds:pt-[var(--spacing-sm)]',\n false: '',\n },\n },\n defaultVariants: { grouped: false },\n});\n\n// The summary row's expand control fills the row; negative block margins\n// keep the row as compact as a one-line Alert while the target stays at\n// --min-target-size.\nconst summaryTriggerVariants = cva(\n [\n 'ds:flex ds:w-full ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]',\n 'ds:-my-[var(--spacing-sm)] ds:min-h-[var(--min-target-size)]',\n 'ds:rounded-[var(--radius-sm)] ds:text-start type-body-sm ds:font-semibold ds:text-current',\n 'ds:cursor-pointer ds:hover:underline ds:underline-offset-2',\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 'ds:[&_svg]:size-4 ds:[&_svg]:shrink-0',\n 'ds:[&_svg]:transition-transform ds:[&_svg]:duration-[var(--animation-duration)] ds:motion-reduce:[&_svg]:transition-none',\n 'ds:data-[state=open]:[&_svg]:rotate-180',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Children */\n/* ------------------------------------------------------------------ */\n\ntype NoticeElement =\n | ReactElement<AlertProps & { key?: string }>\n | ReactElement<ProgressNoticeProps>;\n\ninterface Entry {\n /** Stable identity: the element's key, else its position. */\n identity: string;\n element: ReactNode;\n /** An Alert or ProgressNotice the group can reason about. */\n notice?: NoticeElement;\n /** Errors and progress notices always show; the rest fold. */\n folds: boolean;\n}\n\nfunction flatten(children: ReactNode, out: ReactNode[] = []): ReactNode[] {\n Children.forEach(children, (child) => {\n if (isValidElement(child) && child.type === Fragment) {\n flatten((child.props as { children?: ReactNode }).children, out);\n } else if (child !== null && child !== undefined && child !== false) {\n out.push(child);\n }\n });\n return out;\n}\n\nfunction classify(children: ReactNode): Entry[] {\n return flatten(children).map((element, index) => {\n const identity =\n isValidElement(element) && element.key !== null\n ? `key:${element.key}`\n : `at:${index}`;\n if (isValidElement(element) && element.type === Alert) {\n const props = element.props as AlertProps;\n return {\n identity,\n element,\n notice: element as NoticeElement,\n folds: props.variant !== 'error',\n };\n }\n if (isValidElement(element) && element.type === ProgressNotice) {\n return {\n identity,\n element,\n notice: element as NoticeElement,\n folds: false,\n };\n }\n return { identity, element, folds: false };\n });\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const NoticeGroup = forwardRef<HTMLDivElement, NoticeGroupProps>(\n (\n {\n children,\n summary,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const [openRaw, setOpen] = useControllableState<boolean>({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n const open = openRaw ?? false;\n\n const entries = useMemo(() => classify(children), [children]);\n // Development warnings for the two ways a host can defeat grouping.\n // isDevelopment, not import.meta.env.DEV: the kit's own build replaces\n // that with false.\n const unknownCount = entries.filter(\n (entry) => !entry.notice && isValidElement(entry.element),\n ).length;\n const notices = entries.filter((entry) => entry.notice);\n const unkeyed =\n notices.length > 1 &&\n notices.some((entry) => entry.identity.startsWith('at:'));\n useEffect(() => {\n if (!isDevelopment()) return;\n if (unknownCount > 0) {\n console.warn(\n 'NoticeGroup: pass Alert and ProgressNotice elements directly. A component of your own that renders one shows as given and is never grouped.',\n );\n }\n if (unkeyed) {\n console.warn(\n 'NoticeGroup: give every notice a `key`, so a closed notice stays closed when the notices around it change.',\n );\n }\n }, [unknownCount, unkeyed]);\n const keys = entries.map((entry) =>\n entry.notice\n ? usableDismissKey(\n (entry.notice.props as { dismissKey?: string }).dismissKey,\n )\n : undefined,\n );\n const dismissed = useDismissedKeys(keys);\n\n // Notes the user closed that have neither a key nor a controlled\n // `open`: the notice hides itself, so the group must remember it.\n const [closed, setClosed] = useState<ReadonlySet<string>>(() => new Set());\n useEffect(() => {\n setClosed((previous) => {\n if (previous.size === 0) return previous;\n const live = new Set(entries.map((entry) => entry.identity));\n const next = new Set([...previous].filter((key) => live.has(key)));\n return next.size === previous.size ? previous : next;\n });\n }, [entries]);\n\n const shown = entries.map((entry, i) => {\n if (!entry.notice) return true;\n const props = entry.notice.props as { open?: boolean };\n return (\n props.open !== false && !dismissed[i] && !closed.has(entry.identity)\n );\n });\n\n /* ---- focus after a dismissal ------------------------------------ */\n // The closing button unmounts with its notice. Hand focus to the\n // dismiss control now in its place, else the summary row, else the\n // group itself, so it never falls back to <body> while the group\n // shows anything. Positions count every dismiss control in the group,\n // in page order.\n const rootRef = useRef<HTMLDivElement | null>(null);\n const setRootRef = useCallback(\n (node: HTMLDivElement | null) => {\n rootRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref)\n (ref as MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n const dismissControls = (root: HTMLElement) =>\n [...root.querySelectorAll<HTMLElement>('[data-alert-dismiss]')].filter(\n (control) => !control.closest('[hidden]'),\n );\n const pendingFocusRef = useRef<number | null>(null);\n const [focusTick, setFocusTick] = useState(0);\n useEffect(() => {\n const index = pendingFocusRef.current;\n if (index === null) return;\n pendingFocusRef.current = null;\n const root = rootRef.current;\n if (!root) return;\n const controls = dismissControls(root);\n const target =\n controls[Math.min(index, controls.length - 1)] ??\n root.querySelector<HTMLElement>('[data-notice-group-summary] button') ??\n root;\n target.focus();\n }, [focusTick]);\n\n const watch = (entry: Entry): ReactNode => {\n if (!entry.notice) return entry.element;\n const notice = entry.notice;\n const props = notice.props as {\n open?: boolean;\n dismissKey?: string;\n announce?: AlertProps['announce'];\n live?: AlertProps['live'];\n onOpenChange?: (open: boolean) => void;\n };\n // A folded note mounts again each time the fold opens. As a live\n // region it would be announced (a warning, assertively) every time,\n // so notes are quiet unless the host chose an announcement.\n const quiet =\n entry.folds && props.announce === undefined && props.live === undefined;\n return cloneElement(notice as ReactElement<AlertProps>, {\n ...(quiet ? { announce: 'off' as const } : {}),\n onOpenChange: (open: boolean) => {\n props.onOpenChange?.(open);\n if (open) return;\n if (\n props.open === undefined &&\n usableDismissKey(props.dismissKey) === undefined\n ) {\n setClosed((previous) => new Set(previous).add(entry.identity));\n }\n // Only when the dismissal came from a control in the group (the\n // close button still has focus while the notice closes).\n const root = rootRef.current;\n const active =\n typeof document === 'undefined' ? null : document.activeElement;\n const index =\n root && active instanceof HTMLElement\n ? dismissControls(root).indexOf(active)\n : -1;\n if (index === -1) return;\n pendingFocusRef.current = index;\n setFocusTick((tick) => tick + 1);\n },\n });\n };\n\n const kept: ReactNode[] = [];\n const notes: ReactNode[] = [];\n let noteCount = 0;\n let warningCount = 0;\n entries.forEach((entry, i) => {\n // A note the user closed (no key, uncontrolled) stays closed even if\n // a fold remounts it.\n if (closed.has(entry.identity)) return;\n const node = <Fragment key={entry.identity}>{watch(entry)}</Fragment>;\n if (!entry.folds) {\n kept.push(node);\n return;\n }\n notes.push(node);\n if (shown[i]) {\n noteCount += 1;\n if ((entry.notice?.props as AlertProps).variant === 'warning')\n warningCount += 1;\n }\n });\n const grouped = noteCount > 1;\n const anyShown = shown.some(Boolean);\n\n // A note that has focus never vanishes: when a second note arrives and\n // the notes fold, the fold stays open until the user closes it.\n const notesRef = useRef<HTMLDivElement | null>(null);\n const focusInNotesRef = useRef(false);\n const [wasGrouped, setWasGrouped] = useState(grouped);\n const [holdOpen, setHoldOpen] = useState(false);\n if (wasGrouped !== grouped) {\n setWasGrouped(grouped);\n const active =\n typeof document === 'undefined' ? null : document.activeElement;\n setHoldOpen(\n grouped &&\n focusInNotesRef.current &&\n (active === null ||\n active === document.body ||\n Boolean(notesRef.current?.contains(active))),\n );\n }\n const foldOpen = grouped ? open || holdOpen : true;\n\n /* ---- agent ------------------------------------------------------ */\n const stateRef = useRef({ noteCount, grouped, open });\n stateRef.current = { noteCount, grouped, open };\n const handle = useMemo<NoticeGroupHandle>(\n () => ({\n getState: () => ({ ...stateRef.current }),\n setOpen: (next) => {\n if (!stateRef.current.grouped) return false;\n setOpen(next);\n return true;\n },\n }),\n [setOpen],\n );\n useAgentRegistration(noticeGroupAgent, handle, id);\n\n if (!anyShown) return null;\n\n const summaryText =\n typeof summary === 'function'\n ? summary(noteCount, warningCount)\n : (summary ?? t('noticeGroup.summary', { count: noteCount }));\n\n return (\n <div\n ref={setRootRef}\n data-component=\"notice-group\"\n data-component-id={id}\n data-grouped={grouped || undefined}\n // Focus lands here only by script, when a dismissal leaves no\n // control to hand it to; never in the Tab order.\n tabIndex={-1}\n className={[noticeGroupVariants(), className].filter(Boolean).join(' ')}\n {...rest}\n >\n {kept}\n {noteCount > 0 ? (\n <Collapsible\n open={foldOpen}\n onOpenChange={(next) => {\n if (!grouped) return;\n setHoldOpen(false);\n setOpen(next);\n }}\n >\n {grouped ? (\n <Alert\n variant={warningCount > 0 ? 'warning' : 'info'}\n // The row is a control, not news: never a live region.\n announce=\"off\"\n data-notice-group-summary=\"\"\n >\n <CollapsibleTrigger className={summaryTriggerVariants()}>\n <span className=\"ds:flex ds:min-w-0 ds:flex-wrap ds:items-baseline ds:gap-x-[var(--spacing-sm)]\">\n <span>{summaryText}</span>\n {/* Severity in words, not only in the tint and icon. The\n space keeps the two apart in the accessible name. */}\n {warningCount > 0 ? ' ' : null}\n {warningCount > 0 ? (\n <span className=\"ds:font-normal\">\n {t('noticeGroup.warnings', { count: warningCount })}\n </span>\n ) : null}\n </span>\n <ChevronDown aria-hidden=\"true\" />\n </CollapsibleTrigger>\n </Alert>\n ) : null}\n <CollapsibleContent>\n <div\n ref={notesRef}\n className={notesVariants({ grouped })}\n onFocus={() => {\n focusInNotesRef.current = true;\n }}\n onBlur={(event) => {\n if (\n !event.currentTarget.contains(event.relatedTarget as Node)\n )\n focusInNotesRef.current = false;\n }}\n >\n {notes}\n </div>\n </CollapsibleContent>\n </Collapsible>\n ) : null}\n </div>\n );\n },\n);\nNoticeGroup.displayName = 'NoticeGroup';\n"],"names":["noticeGroupAgent","handle","args","noticeGroupVariants","cva","notesVariants","summaryTriggerVariants","flatten","children","out","Children","child","isValidElement","Fragment","classify","element","index","identity","Alert","props","ProgressNotice","NoticeGroup","forwardRef","summary","openProp","defaultOpen","onOpenChange","id","className","rest","ref","t","useTranslation","openRaw","setOpen","useControllableState","open","entries","useMemo","unknownCount","entry","notices","unkeyed","useEffect","isDevelopment","keys","usableDismissKey","dismissed","useDismissedKeys","closed","setClosed","useState","previous","live","next","key","shown","i","rootRef","useRef","setRootRef","useCallback","node","dismissControls","root","control","pendingFocusRef","focusTick","setFocusTick","controls","watch","notice","quiet","cloneElement","_a","active","tick","kept","notes","noteCount","warningCount","jsx","grouped","anyShown","notesRef","focusInNotesRef","wasGrouped","setWasGrouped","holdOpen","setHoldOpen","foldOpen","stateRef","useAgentRegistration","summaryText","jsxs","Collapsible","CollapsibleTrigger","ChevronDown","CollapsibleContent","event"],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import { u as me } from "./use-isomorphic-layout-effect-BGfaCOP1.js";
|
|
|
9
9
|
import { I as ue } from "./icon-button-C_1TgRiK.js";
|
|
10
10
|
import { B as A } from "./button-D-MQxsA_.js";
|
|
11
11
|
import { S as F } from "./separator-CYU_bGFn.js";
|
|
12
|
-
import { S as T } from "./skeleton-
|
|
12
|
+
import { S as T } from "./skeleton-tTWJpvAq.js";
|
|
13
13
|
import { C as ge } from "./counter-WsvRuum1.js";
|
|
14
14
|
import { S as ve } from "./scroll-area-CY5SLYNw.js";
|
|
15
15
|
import { N as he } from "./notification-card-c2oX8j3F.js";
|
|
@@ -503,4 +503,4 @@ export {
|
|
|
503
503
|
ke as N,
|
|
504
504
|
Te as n
|
|
505
505
|
};
|
|
506
|
-
//# sourceMappingURL=notification-tray-
|
|
506
|
+
//# sourceMappingURL=notification-tray-Cp18MW5b.js.map
|
package/dist/_chunks/{notification-tray-BR3seWA7.js.map → notification-tray-Cp18MW5b.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification-tray-BR3seWA7.js","sources":["../../node_modules/lucide-react/dist/esm/icons/bell.mjs","../../src/components/notification-tray/notification-tray.agent.ts","../../src/components/notification-tray/notification-tray.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 [\"path\", { d: \"M10.268 21a2 2 0 0 0 3.464 0\", key: \"vwvbt9\" }],\n [\n \"path\",\n {\n d: \"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\",\n key: \"11g9vi\"\n }\n ]\n];\nconst Bell = createLucideIcon(\"bell\", __iconNode);\n\nexport { __iconNode, Bell as default };\n//# sourceMappingURL=bell.mjs.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — NotificationTray. */\n/* */\n/* Tray-level surface: an agent can open / close the panel, read the */\n/* current items (id + read flag only — never PHI), and route per-item */\n/* operations (dismiss, mark_read, select) through the curated handle. */\n/* All actions are routed through the imperative handle; the adapter */\n/* never touches the DOM directly. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { NotificationTrayHandle } from './notification-tray';\n\nexport const notificationTrayAgent: AgentAdapter<NotificationTrayHandle> = {\n id: 'notification-tray',\n capabilities: ['open', 'close', 'select_single', 'dismiss', 'navigate'],\n state: {\n items: {\n type: 'Array<{ id: string; read: boolean }>',\n descriptionKey: 'ui.agent.notificationTray.state.items',\n description:\n 'Currently-displayed notifications. Ids + read flag only — no PHI.',\n read: (handle) => handle.getItems(),\n },\n unreadCount: {\n type: 'number',\n descriptionKey: 'ui.agent.notificationTray.state.unreadCount',\n description: 'Badge unread count surfaced by the host.',\n read: (handle) => handle.getUnreadCount(),\n },\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.notificationTray.state.isOpen',\n description: 'Whether the dropdown panel is currently open.',\n read: (handle) => handle.isOpen(),\n },\n },\n actions: {\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.notificationTray.actions.open',\n description: 'Open the notification panel.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.notificationTray.actions.close',\n description: 'Close the notification panel.',\n invoke: (handle) => {\n handle.close();\n },\n },\n select_item: {\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n errors: ['No notification matches the given id.'],\n examples: [{ args: { id: 'notif-1' } }],\n descriptionKey: 'ui.agent.notificationTray.actions.selectItem',\n description: 'Activate the notification with the given id.',\n invoke: (handle, args: { id: string }) => {\n handle.selectItem(args.id);\n },\n },\n mark_read: {\n safety: 'write',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n errors: ['No notification matches the given id.'],\n examples: [{ args: { id: 'notif-1' } }],\n descriptionKey: 'ui.agent.notificationTray.actions.markRead',\n description: 'Request the host to mark a notification as read.',\n invoke: (handle, args: { id: string }) => {\n handle.markRead(args.id);\n },\n },\n dismiss: {\n safety: 'destructive',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n errors: ['No notification matches the given id.'],\n examples: [{ args: { id: 'notif-1' } }],\n descriptionKey: 'ui.agent.notificationTray.actions.dismiss',\n description:\n 'Request the host to dismiss the notification with the given id.',\n invoke: (handle, args: { id: string }) => {\n handle.dismiss(args.id);\n },\n },\n mark_all_read: {\n safety: 'write',\n idempotent: true,\n descriptionKey: 'ui.agent.notificationTray.actions.markAllRead',\n description: 'Request the host to mark every notification as read.',\n invoke: (handle) => {\n handle.markAllRead();\n },\n },\n view_all: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.notificationTray.actions.viewAll',\n description: 'Navigate to the full notification list.',\n invoke: (handle) => {\n handle.viewAll();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'notification-tray',\n description: 'Marks the NotificationTray wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific tray from the agent.',\n },\n item: {\n attr: 'data-notification-id',\n description:\n 'Stable notification id emitted on each rendered NotificationCard inside the tray.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n} from 'react';\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport {\n findPopoverTrigger,\n useNonModalTabExit,\n} from '../_shared/non-modal-tab-exit';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { Bell } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Button } from '../button/button';\nimport { Separator } from '../separator/separator';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { Counter } from '../counter/counter';\nimport { ScrollArea } from '../scroll-area/scroll-area';\nimport {\n NotificationCard,\n type NotificationItem,\n} from '../notification-card/notification-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { notificationTrayAgent } from './notification-tray.agent';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\n/**\n * Curated imperative handle for NotificationTray. Exposed as the\n * forwardRef target so a future agent / MCP UI bridge can drive the\n * tray without touching the DOM. See `notification-tray.agent.ts`.\n */\nexport interface NotificationTrayHandle {\n open: () => void;\n close: () => void;\n isOpen: () => boolean;\n getItems: () => Array<{ id: string; read: boolean }>;\n getUnreadCount: () => number;\n selectItem: (id: string) => void;\n markRead: (id: string) => void;\n dismiss: (id: string) => void;\n /** Request the host to mark every notification as read (mirrors onMarkAllRead). */\n markAllRead: () => void;\n /** Navigate to the full notification list (mirrors onViewAll). */\n viewAll: () => void;\n}\n\nexport interface NotificationTrayProps\n extends\n Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onClick' | 'children' | 'role' | 'id'\n >,\n VariantProps<typeof notificationTrayVariants> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so\n * an agent / MCP UI bridge can address this specific tray.\n */\n id?: string;\n /** Fires when the host should mark a single notification as read (used by agent integration). */\n onMarkRead?: (item: NotificationItem) => void;\n /** Notifications rendered in the dropdown panel. */\n items: NotificationItem[];\n /** Number of unseen notifications. Drives the badge count. */\n unseenCount?: number;\n /** Controlled open state. */\n open?: boolean;\n /** Fires when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n /** Fires when the user activates an item (click or Enter/Space). */\n onItemClick?: (item: NotificationItem) => void;\n /** Fires when the user dismisses a notification. */\n onDismiss?: (item: NotificationItem) => void;\n /** Fires when the user clicks the header \"Mark all as read\" action. */\n onMarkAllRead?: () => void;\n /** When true the panel shows skeleton placeholders. */\n loading?: boolean;\n /** Advisory item count before the list scrolls. Consumers override the cap\n * via the `--notification-tray-max-block-size` custom property. */\n maxVisible?: number;\n /** When set renders a footer link that invokes `onViewAll`. */\n viewAllLabel?: string;\n /** Fires when the footer \"View all\" link is clicked. */\n onViewAll?: () => void;\n /** Panel alignment relative to the trigger. Default `'end'`. */\n align?: 'start' | 'center' | 'end';\n /** Side of the trigger to open on. Default `'bottom'`. */\n side?: 'top' | 'bottom';\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst notificationTrayVariants = cva(\n 'ds:relative ds:inline-flex ds:items-center',\n {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nconst panelVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:bg-[var(--popover)] ds:text-[var(--popover-foreground)]',\n // Subtle tokenized border pairs with the drop-shadow so the panel's\n // edge stays legible in dark themes (where the shadow alone reads as a\n // faint halo). `--card-border` is alpha-based (32% in dark, lighter in\n // light) so the edge cue stays soft rather than turning into a heavy\n // outline. The forced-colors override below upgrades the border to\n // `CanvasText` so HCM repaints a fully visible edge.\n 'ds:border ds:border-[color:var(--card-border)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:z-[var(--z-popover)]',\n // Width: fluid below the design cap so narrow viewports keep a visible\n // gutter on *both* sides of the panel (shadow included). The legacy\n // `min-w` approach clamped at 20rem, which flush-mounted the panel\n // against the inline-start viewport edge on phones.\n 'ds:w-[min(24rem,calc(100vw-2*var(--spacing-md)))]',\n // Height: below the `sm` breakpoint the panel takes a near-full-screen\n // sheet shape so the user gets room to triage messages / notifications\n // without scrolling a tiny popover. `6rem` reserves space for the\n // Header (≈4rem) plus the sideOffset + collisionPadding (≈2rem).\n // Above `sm` it returns to `h-auto` so the list's own\n // `--*-tray-max-block-size` cap governs the height.\n 'ds:h-[calc(100dvh-6rem)] ds:sm:h-auto',\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=closed]:fade-out-0 ds:data-[state=open]:fade-in-0',\n 'ds:data-[state=closed]:zoom-out-95 ds:data-[state=open]:zoom-in-95',\n 'ds:motion-reduce:transition-none ds:motion-reduce:animate-none',\n 'ds:focus-visible:outline-none',\n 'ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:p-[var(--spacing-xs)]',\n md: 'ds:p-[var(--spacing-sm)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\n// The unread overlay is the kit `Counter` (variant `notification`, size\n// `md`) — a single source of truth for the red count badge. This tray only\n// owns the *placement*: anchored to the trigger's top-end corner, nudged\n// outward so the bell icon isn't covered.\nconst badgeOverlay =\n 'ds:absolute ds:-top-[var(--spacing-xs)] ds:-end-[var(--spacing-xs)] ds:pointer-events-none';\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction formatBadgeCount(count: number, overflowLabel: string): string {\n return count > 99 ? overflowLabel : String(count);\n}\n\nfunction SkeletonRow() {\n return (\n <div\n aria-hidden=\"true\"\n className=\"ds:flex ds:items-start ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\"\n >\n <Skeleton variant=\"circular\" size=\"sm\" />\n <div className=\"ds:flex-1 ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <Skeleton variant=\"text\" size=\"md\" width=\"70%\" />\n <Skeleton variant=\"text\" size=\"sm\" width=\"90%\" />\n <Skeleton variant=\"text\" size=\"sm\" width=\"30%\" />\n </div>\n </div>\n );\n}\n\nfunction EmptyPanel() {\n const { t } = useTranslation('ui');\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds:flex ds:flex-col ds:items-center ds:justify-center ds:gap-[var(--spacing-xs)] ds:p-[var(--spacing-lg)] ds:text-center\"\n >\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:items-center ds:justify-center ds:size-10 ds:rounded-[var(--radius-full)] ds:bg-[color:var(--muted)] ds:text-[color:var(--muted-foreground)] ds:[&>svg]:size-5\"\n >\n <Bell />\n </span>\n <p className=\"type-title-item ds:text-[color:var(--foreground)]\">\n {t('notificationTray.noNotifications', 'No notifications')}\n </p>\n <p className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {t(\n 'notificationTray.noNotificationsDescription',\n \"You're all caught up.\",\n )}\n </p>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport const NotificationTray = forwardRef<\n HTMLDivElement,\n NotificationTrayProps\n>(\n (\n {\n id,\n items,\n unseenCount,\n open,\n onOpenChange,\n onItemClick,\n onDismiss,\n onMarkRead,\n onMarkAllRead,\n loading = false,\n maxVisible,\n viewAllLabel,\n onViewAll,\n align = 'end',\n side = 'bottom',\n size = 'md',\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n\n const [isOpenRaw, handleOpenChange] = useControllableState<boolean>({\n value: open,\n defaultValue: false,\n onChange: onOpenChange,\n });\n const isOpen = isOpenRaw ?? false;\n\n /* Exit-animation list (AnimatePresence-style).\n * `displayed` holds an entry per card that's currently mounted, even\n * briefly after the consumer removes an item from `items`. When the\n * consumer drops an id from `items`, we flip that entry to\n * `leaving: true` for one animation cycle, then prune it. */\n type Displayed = { item: NotificationItem; leaving: boolean };\n const [displayed, setDisplayed] = useState<Displayed[]>(() =>\n items.map((item) => ({ item, leaving: false })),\n );\n\n const animationDurationMs = useCallback((): number => {\n if (typeof window === 'undefined') return 200;\n const raw = window\n .getComputedStyle(document.documentElement)\n .getPropertyValue('--animation-duration');\n if (!raw) return 200;\n const trimmed = raw.trim();\n const n = parseFloat(trimmed);\n if (!Number.isFinite(n)) return 200;\n return trimmed.endsWith('ms') ? n : n * 1000;\n }, []);\n\n // `useLayoutEffect` so the `leaving=true` flip applies in the same paint\n // as the consumer's `items` update. With `useEffect` the browser paints\n // once with the dismissed card still at `leaving=false` (no animation)\n // before the flag flips — a visible lag before the exit animation starts.\n useIsomorphicLayoutEffect(() => {\n setDisplayed((prev) => {\n const nextIds = new Set(items.map((i) => i.id));\n const prevIds = new Set(prev.map((d) => d.item.id));\n\n const merged: Displayed[] = prev.map((d) => {\n if (nextIds.has(d.item.id)) {\n const fresh = items.find((i) => i.id === d.item.id);\n return fresh\n ? { item: fresh, leaving: false }\n : { ...d, leaving: true };\n }\n return { ...d, leaving: true };\n });\n\n for (const i of items) {\n if (!prevIds.has(i.id)) merged.push({ item: i, leaving: false });\n }\n return merged;\n });\n }, [items]);\n\n useEffect(() => {\n if (!displayed.some((d) => d.leaving)) return;\n const ms = animationDurationMs();\n const timer = setTimeout(() => {\n setDisplayed((prev) => prev.filter((d) => !d.leaving));\n }, ms);\n return () => clearTimeout(timer);\n }, [displayed, animationDurationMs]);\n\n /* Polite live region — announces when a new unread notification\n floats to the top of the list, even with the panel closed. */\n const liveRegionRef = useRef<HTMLDivElement | null>(null);\n const lastTopIdRef = useRef<string | undefined>(items[0]?.id);\n\n useEffect(() => {\n const topId = items[0]?.id;\n const prev = lastTopIdRef.current;\n if (prev && topId && prev !== topId && liveRegionRef.current) {\n const newest = items[0];\n if (newest && !newest.read) {\n liveRegionRef.current.textContent = t(\n 'notificationTray.newNotification',\n {\n title: newest.title,\n defaultValue: 'New notification: {{title}}',\n },\n );\n }\n }\n lastTopIdRef.current = topId;\n }, [items, t]);\n\n const displayCount = unseenCount ?? 0;\n const triggerAriaLabel =\n displayCount > 0\n ? t('notificationTray.triggerLabel', {\n count: displayCount,\n defaultValue: 'Notifications, {{count}} unread',\n })\n : t('notificationTray.triggerLabelNone', 'Notifications, none unread');\n\n const badgeLabel = formatBadgeCount(\n displayCount,\n t('notificationTray.badgeCountOverflow', '99+'),\n );\n\n const panelClass = panelVariants({ size });\n\n /* Curated imperative handle for agent integration. Pure look-ups +\n * delegations into the consumer-supplied callbacks; never touches the\n * DOM. See notification-tray.agent.ts. */\n const itemsRef = useRef<NotificationItem[]>(items);\n itemsRef.current = items;\n const unseenRef = useRef<number | undefined>(unseenCount);\n unseenRef.current = unseenCount;\n const isOpenRef = useRef<boolean>(isOpen);\n isOpenRef.current = isOpen;\n\n const handle = useMemo<NotificationTrayHandle>(\n () => ({\n open: () => handleOpenChange(true),\n close: () => handleOpenChange(false),\n isOpen: () => isOpenRef.current,\n getItems: () =>\n itemsRef.current.map((i) => ({ id: i.id, read: !!i.read })),\n getUnreadCount: () =>\n unseenRef.current ?? itemsRef.current.filter((i) => !i.read).length,\n selectItem: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onItemClick?.(found);\n },\n markRead: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onMarkRead?.(found);\n },\n dismiss: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onDismiss?.(found);\n },\n markAllRead: () => onMarkAllRead?.(),\n viewAll: () => onViewAll?.(),\n }),\n [\n handleOpenChange,\n onItemClick,\n onMarkRead,\n onDismiss,\n onMarkAllRead,\n onViewAll,\n ],\n );\n\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement, []);\n useAgentRegistration(notificationTrayAgent, handle, id);\n const exitOnTab = useNonModalTabExit(true, {\n getAnchor: findPopoverTrigger,\n onReturnToTrigger: () => handleOpenChange(false),\n });\n\n return (\n <div\n ref={rootRef}\n data-component=\"notification-tray\"\n data-component-id={id}\n className={[notificationTrayVariants({ size }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n <RadixPopover.Root open={isOpen} onOpenChange={handleOpenChange}>\n <RadixPopover.Trigger asChild>\n <IconButton\n icon={<Bell />}\n intent=\"outline\"\n size={size === 'sm' ? 'sm' : 'md'}\n aria-label={triggerAriaLabel}\n aria-haspopup=\"dialog\"\n />\n </RadixPopover.Trigger>\n {displayCount > 0 ? (\n <Counter\n variant=\"notification\"\n size=\"md\"\n aria-hidden=\"true\"\n data-testid=\"notification-tray-badge\"\n className={badgeOverlay}\n >\n {badgeLabel}\n </Counter>\n ) : null}\n {/* Live region sits outside the popover so it announces even\n while the panel is closed. */}\n <div\n ref={liveRegionRef}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n />\n <RadixPopover.Portal>\n <RadixPopover.Content\n role=\"dialog\"\n onKeyDown={exitOnTab}\n aria-label={t('notificationTray.panelTitle', 'Notifications')}\n side={side}\n align={align}\n sideOffset={8}\n // `spacing-md` (16px) keeps Radix's collision-avoidance from\n // flush-mounting the panel against the viewport edge when the\n // trigger is near the inline-end of a narrow screen.\n collisionPadding={16}\n className={panelClass}\n >\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)]\">\n <h3 className=\"ds:m-0 type-title-card ds:text-[color:var(--foreground)]\">\n {t('notificationTray.panelTitle', 'Notifications')}\n </h3>\n {onMarkAllRead && items.some((item) => !item.read) ? (\n <Button\n intent=\"link\"\n size=\"sm\"\n onClick={onMarkAllRead}\n className=\"ds:text-[length:var(--font-size-xs)]\"\n >\n {t('notificationTray.markAllRead', 'Mark all as read')}\n </Button>\n ) : null}\n </div>\n <Separator />\n {/* Cap at ~24rem so ~5 items fit before the list scrolls.\n Consumers override via the --notification-tray-max-block-size\n custom property on the root element. */}\n {/* Below `sm` the panel is a near-full-screen sheet (see\n `panelVariants`) and the list expands to fill the remaining\n space with `flex-1`. Above `sm` the list caps at the\n `--notification-tray-max-block-size` custom property so the\n popover stays compact. ScrollArea owns the overflow + the\n token-styled 8px overlay scrollbar. */}\n <ScrollArea\n orientation=\"vertical\"\n className=\"ds:flex-1 ds:sm:flex-none ds:sm:[max-block-size:var(--notification-tray-max-block-size,24rem)]\"\n >\n <div\n // `role=\"list\"` requires `listitem` children — applied only\n // when we render NotificationCards. The empty / loading\n // states render a `role=\"status\"` panel which would violate\n // aria-required-children if the list role were always on.\n role={loading || displayed.length === 0 ? undefined : 'list'}\n data-max-visible={maxVisible}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:pt-[var(--spacing-xs)]\"\n >\n {loading ? (\n <>\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </>\n ) : displayed.length === 0 ? (\n <EmptyPanel />\n ) : (\n displayed.map(({ item, leaving }) => (\n <NotificationCard\n key={item.id}\n item={item}\n variant=\"compact\"\n leaving={leaving}\n onActivate={onItemClick}\n onDismiss={onDismiss}\n data-notification-id={item.id}\n />\n ))\n )}\n </div>\n </ScrollArea>\n {viewAllLabel ? (\n <>\n <Separator />\n <div className=\"ds:pt-[var(--spacing-xs)]\">\n <Button\n intent=\"link\"\n size=\"sm\"\n onClick={onViewAll}\n className=\"ds:w-full ds:justify-center\"\n >\n {viewAllLabel}\n </Button>\n </div>\n </>\n ) : null}\n </RadixPopover.Content>\n </RadixPopover.Portal>\n </RadixPopover.Root>\n </div>\n );\n },\n);\n\nNotificationTray.displayName = 'NotificationTray';\n"],"names":["__iconNode","Bell","createLucideIcon","notificationTrayAgent","handle","args","notificationTrayVariants","cva","panelVariants","badgeOverlay","formatBadgeCount","count","overflowLabel","SkeletonRow","jsxs","jsx","Skeleton","EmptyPanel","useTranslation","NotificationTray","forwardRef","id","items","unseenCount","open","onOpenChange","onItemClick","onDismiss","onMarkRead","onMarkAllRead","loading","maxVisible","viewAllLabel","onViewAll","align","side","size","className","rest","ref","t","isOpenRaw","handleOpenChange","useControllableState","isOpen","displayed","setDisplayed","useState","item","animationDurationMs","useCallback","raw","trimmed","n","useIsomorphicLayoutEffect","prev","nextIds","i","prevIds","d","merged","fresh","useEffect","ms","timer","liveRegionRef","useRef","lastTopIdRef","_a","topId","newest","displayCount","triggerAriaLabel","badgeLabel","panelClass","itemsRef","unseenRef","isOpenRef","useMemo","targetId","found","rootRef","useImperativeHandle","useAgentRegistration","exitOnTab","useNonModalTabExit","findPopoverTrigger","RadixPopover","IconButton","Counter","Button","Separator","ScrollArea","Fragment","leaving","NotificationCard"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"notification-tray-Cp18MW5b.js","sources":["../../node_modules/lucide-react/dist/esm/icons/bell.mjs","../../src/components/notification-tray/notification-tray.agent.ts","../../src/components/notification-tray/notification-tray.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 [\"path\", { d: \"M10.268 21a2 2 0 0 0 3.464 0\", key: \"vwvbt9\" }],\n [\n \"path\",\n {\n d: \"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\",\n key: \"11g9vi\"\n }\n ]\n];\nconst Bell = createLucideIcon(\"bell\", __iconNode);\n\nexport { __iconNode, Bell as default };\n//# sourceMappingURL=bell.mjs.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — NotificationTray. */\n/* */\n/* Tray-level surface: an agent can open / close the panel, read the */\n/* current items (id + read flag only — never PHI), and route per-item */\n/* operations (dismiss, mark_read, select) through the curated handle. */\n/* All actions are routed through the imperative handle; the adapter */\n/* never touches the DOM directly. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { NotificationTrayHandle } from './notification-tray';\n\nexport const notificationTrayAgent: AgentAdapter<NotificationTrayHandle> = {\n id: 'notification-tray',\n capabilities: ['open', 'close', 'select_single', 'dismiss', 'navigate'],\n state: {\n items: {\n type: 'Array<{ id: string; read: boolean }>',\n descriptionKey: 'ui.agent.notificationTray.state.items',\n description:\n 'Currently-displayed notifications. Ids + read flag only — no PHI.',\n read: (handle) => handle.getItems(),\n },\n unreadCount: {\n type: 'number',\n descriptionKey: 'ui.agent.notificationTray.state.unreadCount',\n description: 'Badge unread count surfaced by the host.',\n read: (handle) => handle.getUnreadCount(),\n },\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.notificationTray.state.isOpen',\n description: 'Whether the dropdown panel is currently open.',\n read: (handle) => handle.isOpen(),\n },\n },\n actions: {\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.notificationTray.actions.open',\n description: 'Open the notification panel.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.notificationTray.actions.close',\n description: 'Close the notification panel.',\n invoke: (handle) => {\n handle.close();\n },\n },\n select_item: {\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n errors: ['No notification matches the given id.'],\n examples: [{ args: { id: 'notif-1' } }],\n descriptionKey: 'ui.agent.notificationTray.actions.selectItem',\n description: 'Activate the notification with the given id.',\n invoke: (handle, args: { id: string }) => {\n handle.selectItem(args.id);\n },\n },\n mark_read: {\n safety: 'write',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n errors: ['No notification matches the given id.'],\n examples: [{ args: { id: 'notif-1' } }],\n descriptionKey: 'ui.agent.notificationTray.actions.markRead',\n description: 'Request the host to mark a notification as read.',\n invoke: (handle, args: { id: string }) => {\n handle.markRead(args.id);\n },\n },\n dismiss: {\n safety: 'destructive',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n errors: ['No notification matches the given id.'],\n examples: [{ args: { id: 'notif-1' } }],\n descriptionKey: 'ui.agent.notificationTray.actions.dismiss',\n description:\n 'Request the host to dismiss the notification with the given id.',\n invoke: (handle, args: { id: string }) => {\n handle.dismiss(args.id);\n },\n },\n mark_all_read: {\n safety: 'write',\n idempotent: true,\n descriptionKey: 'ui.agent.notificationTray.actions.markAllRead',\n description: 'Request the host to mark every notification as read.',\n invoke: (handle) => {\n handle.markAllRead();\n },\n },\n view_all: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.notificationTray.actions.viewAll',\n description: 'Navigate to the full notification list.',\n invoke: (handle) => {\n handle.viewAll();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'notification-tray',\n description: 'Marks the NotificationTray wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific tray from the agent.',\n },\n item: {\n attr: 'data-notification-id',\n description:\n 'Stable notification id emitted on each rendered NotificationCard inside the tray.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n} from 'react';\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport {\n findPopoverTrigger,\n useNonModalTabExit,\n} from '../_shared/non-modal-tab-exit';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { Bell } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Button } from '../button/button';\nimport { Separator } from '../separator/separator';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { Counter } from '../counter/counter';\nimport { ScrollArea } from '../scroll-area/scroll-area';\nimport {\n NotificationCard,\n type NotificationItem,\n} from '../notification-card/notification-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { notificationTrayAgent } from './notification-tray.agent';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\n/**\n * Curated imperative handle for NotificationTray. Exposed as the\n * forwardRef target so a future agent / MCP UI bridge can drive the\n * tray without touching the DOM. See `notification-tray.agent.ts`.\n */\nexport interface NotificationTrayHandle {\n open: () => void;\n close: () => void;\n isOpen: () => boolean;\n getItems: () => Array<{ id: string; read: boolean }>;\n getUnreadCount: () => number;\n selectItem: (id: string) => void;\n markRead: (id: string) => void;\n dismiss: (id: string) => void;\n /** Request the host to mark every notification as read (mirrors onMarkAllRead). */\n markAllRead: () => void;\n /** Navigate to the full notification list (mirrors onViewAll). */\n viewAll: () => void;\n}\n\nexport interface NotificationTrayProps\n extends\n Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onClick' | 'children' | 'role' | 'id'\n >,\n VariantProps<typeof notificationTrayVariants> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so\n * an agent / MCP UI bridge can address this specific tray.\n */\n id?: string;\n /** Fires when the host should mark a single notification as read (used by agent integration). */\n onMarkRead?: (item: NotificationItem) => void;\n /** Notifications rendered in the dropdown panel. */\n items: NotificationItem[];\n /** Number of unseen notifications. Drives the badge count. */\n unseenCount?: number;\n /** Controlled open state. */\n open?: boolean;\n /** Fires when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n /** Fires when the user activates an item (click or Enter/Space). */\n onItemClick?: (item: NotificationItem) => void;\n /** Fires when the user dismisses a notification. */\n onDismiss?: (item: NotificationItem) => void;\n /** Fires when the user clicks the header \"Mark all as read\" action. */\n onMarkAllRead?: () => void;\n /** When true the panel shows skeleton placeholders. */\n loading?: boolean;\n /** Advisory item count before the list scrolls. Consumers override the cap\n * via the `--notification-tray-max-block-size` custom property. */\n maxVisible?: number;\n /** When set renders a footer link that invokes `onViewAll`. */\n viewAllLabel?: string;\n /** Fires when the footer \"View all\" link is clicked. */\n onViewAll?: () => void;\n /** Panel alignment relative to the trigger. Default `'end'`. */\n align?: 'start' | 'center' | 'end';\n /** Side of the trigger to open on. Default `'bottom'`. */\n side?: 'top' | 'bottom';\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst notificationTrayVariants = cva(\n 'ds:relative ds:inline-flex ds:items-center',\n {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nconst panelVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:bg-[var(--popover)] ds:text-[var(--popover-foreground)]',\n // Subtle tokenized border pairs with the drop-shadow so the panel's\n // edge stays legible in dark themes (where the shadow alone reads as a\n // faint halo). `--card-border` is alpha-based (32% in dark, lighter in\n // light) so the edge cue stays soft rather than turning into a heavy\n // outline. The forced-colors override below upgrades the border to\n // `CanvasText` so HCM repaints a fully visible edge.\n 'ds:border ds:border-[color:var(--card-border)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:z-[var(--z-popover)]',\n // Width: fluid below the design cap so narrow viewports keep a visible\n // gutter on *both* sides of the panel (shadow included). The legacy\n // `min-w` approach clamped at 20rem, which flush-mounted the panel\n // against the inline-start viewport edge on phones.\n 'ds:w-[min(24rem,calc(100vw-2*var(--spacing-md)))]',\n // Height: below the `sm` breakpoint the panel takes a near-full-screen\n // sheet shape so the user gets room to triage messages / notifications\n // without scrolling a tiny popover. `6rem` reserves space for the\n // Header (≈4rem) plus the sideOffset + collisionPadding (≈2rem).\n // Above `sm` it returns to `h-auto` so the list's own\n // `--*-tray-max-block-size` cap governs the height.\n 'ds:h-[calc(100dvh-6rem)] ds:sm:h-auto',\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=closed]:fade-out-0 ds:data-[state=open]:fade-in-0',\n 'ds:data-[state=closed]:zoom-out-95 ds:data-[state=open]:zoom-in-95',\n 'ds:motion-reduce:transition-none ds:motion-reduce:animate-none',\n 'ds:focus-visible:outline-none',\n 'ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:p-[var(--spacing-xs)]',\n md: 'ds:p-[var(--spacing-sm)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\n// The unread overlay is the kit `Counter` (variant `notification`, size\n// `md`) — a single source of truth for the red count badge. This tray only\n// owns the *placement*: anchored to the trigger's top-end corner, nudged\n// outward so the bell icon isn't covered.\nconst badgeOverlay =\n 'ds:absolute ds:-top-[var(--spacing-xs)] ds:-end-[var(--spacing-xs)] ds:pointer-events-none';\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction formatBadgeCount(count: number, overflowLabel: string): string {\n return count > 99 ? overflowLabel : String(count);\n}\n\nfunction SkeletonRow() {\n return (\n <div\n aria-hidden=\"true\"\n className=\"ds:flex ds:items-start ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\"\n >\n <Skeleton variant=\"circular\" size=\"sm\" />\n <div className=\"ds:flex-1 ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <Skeleton variant=\"text\" size=\"md\" width=\"70%\" />\n <Skeleton variant=\"text\" size=\"sm\" width=\"90%\" />\n <Skeleton variant=\"text\" size=\"sm\" width=\"30%\" />\n </div>\n </div>\n );\n}\n\nfunction EmptyPanel() {\n const { t } = useTranslation('ui');\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds:flex ds:flex-col ds:items-center ds:justify-center ds:gap-[var(--spacing-xs)] ds:p-[var(--spacing-lg)] ds:text-center\"\n >\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:items-center ds:justify-center ds:size-10 ds:rounded-[var(--radius-full)] ds:bg-[color:var(--muted)] ds:text-[color:var(--muted-foreground)] ds:[&>svg]:size-5\"\n >\n <Bell />\n </span>\n <p className=\"type-title-item ds:text-[color:var(--foreground)]\">\n {t('notificationTray.noNotifications', 'No notifications')}\n </p>\n <p className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {t(\n 'notificationTray.noNotificationsDescription',\n \"You're all caught up.\",\n )}\n </p>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport const NotificationTray = forwardRef<\n HTMLDivElement,\n NotificationTrayProps\n>(\n (\n {\n id,\n items,\n unseenCount,\n open,\n onOpenChange,\n onItemClick,\n onDismiss,\n onMarkRead,\n onMarkAllRead,\n loading = false,\n maxVisible,\n viewAllLabel,\n onViewAll,\n align = 'end',\n side = 'bottom',\n size = 'md',\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n\n const [isOpenRaw, handleOpenChange] = useControllableState<boolean>({\n value: open,\n defaultValue: false,\n onChange: onOpenChange,\n });\n const isOpen = isOpenRaw ?? false;\n\n /* Exit-animation list (AnimatePresence-style).\n * `displayed` holds an entry per card that's currently mounted, even\n * briefly after the consumer removes an item from `items`. When the\n * consumer drops an id from `items`, we flip that entry to\n * `leaving: true` for one animation cycle, then prune it. */\n type Displayed = { item: NotificationItem; leaving: boolean };\n const [displayed, setDisplayed] = useState<Displayed[]>(() =>\n items.map((item) => ({ item, leaving: false })),\n );\n\n const animationDurationMs = useCallback((): number => {\n if (typeof window === 'undefined') return 200;\n const raw = window\n .getComputedStyle(document.documentElement)\n .getPropertyValue('--animation-duration');\n if (!raw) return 200;\n const trimmed = raw.trim();\n const n = parseFloat(trimmed);\n if (!Number.isFinite(n)) return 200;\n return trimmed.endsWith('ms') ? n : n * 1000;\n }, []);\n\n // `useLayoutEffect` so the `leaving=true` flip applies in the same paint\n // as the consumer's `items` update. With `useEffect` the browser paints\n // once with the dismissed card still at `leaving=false` (no animation)\n // before the flag flips — a visible lag before the exit animation starts.\n useIsomorphicLayoutEffect(() => {\n setDisplayed((prev) => {\n const nextIds = new Set(items.map((i) => i.id));\n const prevIds = new Set(prev.map((d) => d.item.id));\n\n const merged: Displayed[] = prev.map((d) => {\n if (nextIds.has(d.item.id)) {\n const fresh = items.find((i) => i.id === d.item.id);\n return fresh\n ? { item: fresh, leaving: false }\n : { ...d, leaving: true };\n }\n return { ...d, leaving: true };\n });\n\n for (const i of items) {\n if (!prevIds.has(i.id)) merged.push({ item: i, leaving: false });\n }\n return merged;\n });\n }, [items]);\n\n useEffect(() => {\n if (!displayed.some((d) => d.leaving)) return;\n const ms = animationDurationMs();\n const timer = setTimeout(() => {\n setDisplayed((prev) => prev.filter((d) => !d.leaving));\n }, ms);\n return () => clearTimeout(timer);\n }, [displayed, animationDurationMs]);\n\n /* Polite live region — announces when a new unread notification\n floats to the top of the list, even with the panel closed. */\n const liveRegionRef = useRef<HTMLDivElement | null>(null);\n const lastTopIdRef = useRef<string | undefined>(items[0]?.id);\n\n useEffect(() => {\n const topId = items[0]?.id;\n const prev = lastTopIdRef.current;\n if (prev && topId && prev !== topId && liveRegionRef.current) {\n const newest = items[0];\n if (newest && !newest.read) {\n liveRegionRef.current.textContent = t(\n 'notificationTray.newNotification',\n {\n title: newest.title,\n defaultValue: 'New notification: {{title}}',\n },\n );\n }\n }\n lastTopIdRef.current = topId;\n }, [items, t]);\n\n const displayCount = unseenCount ?? 0;\n const triggerAriaLabel =\n displayCount > 0\n ? t('notificationTray.triggerLabel', {\n count: displayCount,\n defaultValue: 'Notifications, {{count}} unread',\n })\n : t('notificationTray.triggerLabelNone', 'Notifications, none unread');\n\n const badgeLabel = formatBadgeCount(\n displayCount,\n t('notificationTray.badgeCountOverflow', '99+'),\n );\n\n const panelClass = panelVariants({ size });\n\n /* Curated imperative handle for agent integration. Pure look-ups +\n * delegations into the consumer-supplied callbacks; never touches the\n * DOM. See notification-tray.agent.ts. */\n const itemsRef = useRef<NotificationItem[]>(items);\n itemsRef.current = items;\n const unseenRef = useRef<number | undefined>(unseenCount);\n unseenRef.current = unseenCount;\n const isOpenRef = useRef<boolean>(isOpen);\n isOpenRef.current = isOpen;\n\n const handle = useMemo<NotificationTrayHandle>(\n () => ({\n open: () => handleOpenChange(true),\n close: () => handleOpenChange(false),\n isOpen: () => isOpenRef.current,\n getItems: () =>\n itemsRef.current.map((i) => ({ id: i.id, read: !!i.read })),\n getUnreadCount: () =>\n unseenRef.current ?? itemsRef.current.filter((i) => !i.read).length,\n selectItem: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onItemClick?.(found);\n },\n markRead: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onMarkRead?.(found);\n },\n dismiss: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onDismiss?.(found);\n },\n markAllRead: () => onMarkAllRead?.(),\n viewAll: () => onViewAll?.(),\n }),\n [\n handleOpenChange,\n onItemClick,\n onMarkRead,\n onDismiss,\n onMarkAllRead,\n onViewAll,\n ],\n );\n\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement, []);\n useAgentRegistration(notificationTrayAgent, handle, id);\n const exitOnTab = useNonModalTabExit(true, {\n getAnchor: findPopoverTrigger,\n onReturnToTrigger: () => handleOpenChange(false),\n });\n\n return (\n <div\n ref={rootRef}\n data-component=\"notification-tray\"\n data-component-id={id}\n className={[notificationTrayVariants({ size }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n <RadixPopover.Root open={isOpen} onOpenChange={handleOpenChange}>\n <RadixPopover.Trigger asChild>\n <IconButton\n icon={<Bell />}\n intent=\"outline\"\n size={size === 'sm' ? 'sm' : 'md'}\n aria-label={triggerAriaLabel}\n aria-haspopup=\"dialog\"\n />\n </RadixPopover.Trigger>\n {displayCount > 0 ? (\n <Counter\n variant=\"notification\"\n size=\"md\"\n aria-hidden=\"true\"\n data-testid=\"notification-tray-badge\"\n className={badgeOverlay}\n >\n {badgeLabel}\n </Counter>\n ) : null}\n {/* Live region sits outside the popover so it announces even\n while the panel is closed. */}\n <div\n ref={liveRegionRef}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n />\n <RadixPopover.Portal>\n <RadixPopover.Content\n role=\"dialog\"\n onKeyDown={exitOnTab}\n aria-label={t('notificationTray.panelTitle', 'Notifications')}\n side={side}\n align={align}\n sideOffset={8}\n // `spacing-md` (16px) keeps Radix's collision-avoidance from\n // flush-mounting the panel against the viewport edge when the\n // trigger is near the inline-end of a narrow screen.\n collisionPadding={16}\n className={panelClass}\n >\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)]\">\n <h3 className=\"ds:m-0 type-title-card ds:text-[color:var(--foreground)]\">\n {t('notificationTray.panelTitle', 'Notifications')}\n </h3>\n {onMarkAllRead && items.some((item) => !item.read) ? (\n <Button\n intent=\"link\"\n size=\"sm\"\n onClick={onMarkAllRead}\n className=\"ds:text-[length:var(--font-size-xs)]\"\n >\n {t('notificationTray.markAllRead', 'Mark all as read')}\n </Button>\n ) : null}\n </div>\n <Separator />\n {/* Cap at ~24rem so ~5 items fit before the list scrolls.\n Consumers override via the --notification-tray-max-block-size\n custom property on the root element. */}\n {/* Below `sm` the panel is a near-full-screen sheet (see\n `panelVariants`) and the list expands to fill the remaining\n space with `flex-1`. Above `sm` the list caps at the\n `--notification-tray-max-block-size` custom property so the\n popover stays compact. ScrollArea owns the overflow + the\n token-styled 8px overlay scrollbar. */}\n <ScrollArea\n orientation=\"vertical\"\n className=\"ds:flex-1 ds:sm:flex-none ds:sm:[max-block-size:var(--notification-tray-max-block-size,24rem)]\"\n >\n <div\n // `role=\"list\"` requires `listitem` children — applied only\n // when we render NotificationCards. The empty / loading\n // states render a `role=\"status\"` panel which would violate\n // aria-required-children if the list role were always on.\n role={loading || displayed.length === 0 ? undefined : 'list'}\n data-max-visible={maxVisible}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:pt-[var(--spacing-xs)]\"\n >\n {loading ? (\n <>\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </>\n ) : displayed.length === 0 ? (\n <EmptyPanel />\n ) : (\n displayed.map(({ item, leaving }) => (\n <NotificationCard\n key={item.id}\n item={item}\n variant=\"compact\"\n leaving={leaving}\n onActivate={onItemClick}\n onDismiss={onDismiss}\n data-notification-id={item.id}\n />\n ))\n )}\n </div>\n </ScrollArea>\n {viewAllLabel ? (\n <>\n <Separator />\n <div className=\"ds:pt-[var(--spacing-xs)]\">\n <Button\n intent=\"link\"\n size=\"sm\"\n onClick={onViewAll}\n className=\"ds:w-full ds:justify-center\"\n >\n {viewAllLabel}\n </Button>\n </div>\n </>\n ) : null}\n </RadixPopover.Content>\n </RadixPopover.Portal>\n </RadixPopover.Root>\n </div>\n );\n },\n);\n\nNotificationTray.displayName = 'NotificationTray';\n"],"names":["__iconNode","Bell","createLucideIcon","notificationTrayAgent","handle","args","notificationTrayVariants","cva","panelVariants","badgeOverlay","formatBadgeCount","count","overflowLabel","SkeletonRow","jsxs","jsx","Skeleton","EmptyPanel","useTranslation","NotificationTray","forwardRef","id","items","unseenCount","open","onOpenChange","onItemClick","onDismiss","onMarkRead","onMarkAllRead","loading","maxVisible","viewAllLabel","onViewAll","align","side","size","className","rest","ref","t","isOpenRaw","handleOpenChange","useControllableState","isOpen","displayed","setDisplayed","useState","item","animationDurationMs","useCallback","raw","trimmed","n","useIsomorphicLayoutEffect","prev","nextIds","i","prevIds","d","merged","fresh","useEffect","ms","timer","liveRegionRef","useRef","lastTopIdRef","_a","topId","newest","displayCount","triggerAriaLabel","badgeLabel","panelClass","itemsRef","unseenRef","isOpenRef","useMemo","targetId","found","rootRef","useImperativeHandle","useAgentRegistration","exitOnTab","useNonModalTabExit","findPopoverTrigger","RadixPopover","IconButton","Counter","Button","Separator","ScrollArea","Fragment","leaving","NotificationCard"],"mappings":"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","x_google_ignoreList":[0]}
|