@alfadocs/ui-kit-debug 1.34.0 → 1.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{actions-cell-renderer-yy03OgRL.js → actions-cell-renderer-CUn1pqEq.js} +3 -3
- package/dist/_chunks/{actions-cell-renderer-yy03OgRL.js.map → actions-cell-renderer-CUn1pqEq.js.map} +1 -1
- package/dist/_chunks/{agenda-card-DVz3jwTf.js → agenda-card-DyQtHb9z.js} +2 -2
- package/dist/_chunks/{agenda-card-DVz3jwTf.js.map → agenda-card-DyQtHb9z.js.map} +1 -1
- package/dist/_chunks/{agenda-tray-1oDWCJdB.js → agenda-tray-DYGCTIWB.js} +3 -3
- package/dist/_chunks/{agenda-tray-1oDWCJdB.js.map → agenda-tray-DYGCTIWB.js.map} +1 -1
- package/dist/_chunks/{ai-consent-banner-OggpS5hW.js → ai-consent-banner-De4gzSBZ.js} +4 -4
- package/dist/_chunks/{ai-consent-banner-OggpS5hW.js.map → ai-consent-banner-De4gzSBZ.js.map} +1 -1
- package/dist/_chunks/{ai-prompt-input-Dt7tpCBh.js → ai-prompt-input-DdxlaI7q.js} +2 -2
- package/dist/_chunks/{ai-prompt-input-Dt7tpCBh.js.map → ai-prompt-input-DdxlaI7q.js.map} +1 -1
- package/dist/_chunks/{alert-CiJT540z.js → alert-CiQ5Pa3Q.js} +2 -2
- package/dist/_chunks/{alert-CiJT540z.js.map → alert-CiQ5Pa3Q.js.map} +1 -1
- package/dist/_chunks/{alia-sidebar-D18kp3p9.js → alia-sidebar-B6bXlZZk.js} +6 -6
- package/dist/_chunks/{alia-sidebar-D18kp3p9.js.map → alia-sidebar-B6bXlZZk.js.map} +1 -1
- package/dist/_chunks/{anamnesis-card-NTi4LLzI.js → anamnesis-card-DGwINeNn.js} +3 -3
- package/dist/_chunks/{anamnesis-card-NTi4LLzI.js.map → anamnesis-card-DGwINeNn.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-card-DGVKBQoq.js → anamnesis-summary-card-GYHa7VGp.js} +3 -3
- package/dist/_chunks/{anamnesis-summary-card-DGVKBQoq.js.map → anamnesis-summary-card-GYHa7VGp.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-rows-BYgyp_i2.js → anamnesis-summary-rows-Cxtgo2ok.js} +12 -12
- package/dist/_chunks/{anamnesis-summary-rows-BYgyp_i2.js.map → anamnesis-summary-rows-Cxtgo2ok.js.map} +1 -1
- package/dist/_chunks/{antenatal-schedule-timeline-sXfIp5lp.js → antenatal-schedule-timeline-CXk_tzWG.js} +2 -2
- package/dist/_chunks/{antenatal-schedule-timeline-sXfIp5lp.js.map → antenatal-schedule-timeline-CXk_tzWG.js.map} +1 -1
- package/dist/_chunks/appointment-card-WsDGBBut.js +425 -0
- package/dist/_chunks/appointment-card-WsDGBBut.js.map +1 -0
- package/dist/_chunks/appointment-timeline-ByfovxqR.js +449 -0
- package/dist/_chunks/appointment-timeline-ByfovxqR.js.map +1 -0
- package/dist/_chunks/{appointment-tray-6rg071CL.js → appointment-tray-D6UyJHej.js} +3 -3
- package/dist/_chunks/{appointment-tray-6rg071CL.js.map → appointment-tray-D6UyJHej.js.map} +1 -1
- package/dist/_chunks/arrow-right-KsIrLdt0.js +15 -0
- package/dist/_chunks/arrow-right-KsIrLdt0.js.map +1 -0
- package/dist/_chunks/{audio-recorder-11wClczr.js → audio-recorder-BlQBC7N_.js} +3 -3
- package/dist/_chunks/{audio-recorder-11wClczr.js.map → audio-recorder-BlQBC7N_.js.map} +1 -1
- package/dist/_chunks/{badge-sTusUqZD.js → badge-BudgzTe_.js} +2 -2
- package/dist/_chunks/{badge-sTusUqZD.js.map → badge-BudgzTe_.js.map} +1 -1
- package/dist/_chunks/{balance-badge-cell-DhBtFRoW.js → balance-badge-cell-B0Z8Dwn8.js} +6 -6
- package/dist/_chunks/{balance-badge-cell-DhBtFRoW.js.map → balance-badge-cell-B0Z8Dwn8.js.map} +1 -1
- package/dist/_chunks/{bishop-score-CAl7C5hm.js → bishop-score-D5b8tktp.js} +2 -2
- package/dist/_chunks/{bishop-score-CAl7C5hm.js.map → bishop-score-D5b8tktp.js.map} +1 -1
- package/dist/_chunks/{bmi-calculator-Dwkih9a4.js → bmi-calculator-dOKP-vW4.js} +4 -4
- package/dist/_chunks/{bmi-calculator-Dwkih9a4.js.map → bmi-calculator-dOKP-vW4.js.map} +1 -1
- package/dist/_chunks/{booking-BqkEtsKx.js → booking-Dp-9qR6F.js} +9 -9
- package/dist/_chunks/{booking-BqkEtsKx.js.map → booking-Dp-9qR6F.js.map} +1 -1
- package/dist/_chunks/button-group-QmN1VdUW.js +307 -0
- package/dist/_chunks/button-group-QmN1VdUW.js.map +1 -0
- package/dist/_chunks/{calendar-Dgvl5L4T.js → calendar-7GAUlsNO.js} +3 -3
- package/dist/_chunks/{calendar-Dgvl5L4T.js.map → calendar-7GAUlsNO.js.map} +1 -1
- package/dist/_chunks/{calendar-event-card-DSh-69HT.js → calendar-event-card-DKUnT9Be.js} +91 -134
- package/dist/_chunks/calendar-event-card-DKUnT9Be.js.map +1 -0
- package/dist/_chunks/{calendar-workspace-4NH1Z47_.js → calendar-workspace-Duv_5B4j.js} +2494 -2415
- package/dist/_chunks/calendar-workspace-Duv_5B4j.js.map +1 -0
- package/dist/_chunks/{care-plan-card-CZW476Kg.js → care-plan-card-COFOI-fI.js} +5 -5
- package/dist/_chunks/{care-plan-card-CZW476Kg.js.map → care-plan-card-COFOI-fI.js.map} +1 -1
- package/dist/_chunks/{care-plan-entry-card-BMUYagEw.js → care-plan-entry-card-BOKn0KW-.js} +6 -6
- package/dist/_chunks/{care-plan-entry-card-BMUYagEw.js.map → care-plan-entry-card-BOKn0KW-.js.map} +1 -1
- package/dist/_chunks/{care-plan-header-B5CBE0zu.js → care-plan-header-CbuOuVBw.js} +4 -4
- package/dist/_chunks/{care-plan-header-B5CBE0zu.js.map → care-plan-header-CbuOuVBw.js.map} +1 -1
- package/dist/_chunks/{carousel.agent-CLxdHEBP.js → carousel.agent-Dv4a4M8L.js} +2 -2
- package/dist/_chunks/{carousel.agent-CLxdHEBP.js.map → carousel.agent-Dv4a4M8L.js.map} +1 -1
- package/dist/_chunks/{chart-C6eHTxkO.js → chart-iWl76PXv.js} +3 -3
- package/dist/_chunks/{chart-C6eHTxkO.js.map → chart-iWl76PXv.js.map} +1 -1
- package/dist/_chunks/{chat-input-BsB5Umpj.js → chat-input-qM5QpUSq.js} +2 -2
- package/dist/_chunks/{chat-input-BsB5Umpj.js.map → chat-input-qM5QpUSq.js.map} +1 -1
- package/dist/_chunks/{chat-message-C-8UU2av.js → chat-message-RniXtrCH.js} +2 -2
- package/dist/_chunks/{chat-message-C-8UU2av.js.map → chat-message-RniXtrCH.js.map} +1 -1
- package/dist/_chunks/{checkbox-BuZ1u__2.js → checkbox-CZkipDn7.js} +2 -2
- package/dist/_chunks/{checkbox-BuZ1u__2.js.map → checkbox-CZkipDn7.js.map} +1 -1
- package/dist/_chunks/{checkbox-group-CfqMv57d.js → checkbox-group-DomUzpkF.js} +2 -2
- package/dist/_chunks/{checkbox-group-CfqMv57d.js.map → checkbox-group-DomUzpkF.js.map} +1 -1
- package/dist/_chunks/clinical-note-card-DdsGYMmI.js +325 -0
- package/dist/_chunks/clinical-note-card-DdsGYMmI.js.map +1 -0
- package/dist/_chunks/{code-block-BIkpRLkl.js → code-block-uVjNSI9g.js} +2 -2
- package/dist/_chunks/{code-block-BIkpRLkl.js.map → code-block-uVjNSI9g.js.map} +1 -1
- package/dist/_chunks/{connection-status-DRZIcMqM.js → connection-status-OEsWjmRk.js} +3 -3
- package/dist/_chunks/{connection-status-DRZIcMqM.js.map → connection-status-OEsWjmRk.js.map} +1 -1
- package/dist/_chunks/{contact-profile-card-DSI9uumA.js → contact-profile-card--My1H2UD.js} +3 -3
- package/dist/_chunks/{contact-profile-card-DSI9uumA.js.map → contact-profile-card--My1H2UD.js.map} +1 -1
- package/dist/_chunks/{control-room-rail-5MbhjsxN.js → control-room-rail-Ds45_g4f.js} +4 -4
- package/dist/_chunks/{control-room-rail-5MbhjsxN.js.map → control-room-rail-Ds45_g4f.js.map} +1 -1
- package/dist/_chunks/{counter-dRlTNC_y.js → counter-WsvRuum1.js} +50 -15
- package/dist/_chunks/counter-WsvRuum1.js.map +1 -0
- package/dist/_chunks/{cycle-calculator-DVgxBfP0.js → cycle-calculator-BJeaXiZv.js} +3 -3
- package/dist/_chunks/{cycle-calculator-DVgxBfP0.js.map → cycle-calculator-BJeaXiZv.js.map} +1 -1
- package/dist/_chunks/{dashboard-grid-BFtdHqfn.js → dashboard-grid-B23BFzRl.js} +2 -2
- package/dist/_chunks/{dashboard-grid-BFtdHqfn.js.map → dashboard-grid-B23BFzRl.js.map} +1 -1
- package/dist/_chunks/{data-table-DC96JJIq.js → data-table-BYGK-gUJ.js} +6 -6
- package/dist/_chunks/{data-table-DC96JJIq.js.map → data-table-BYGK-gUJ.js.map} +1 -1
- package/dist/_chunks/{data-table-tabs-DVIFkqx_.js → data-table-tabs-BMR0zsVQ.js} +3 -3
- package/dist/_chunks/{data-table-tabs-DVIFkqx_.js.map → data-table-tabs-BMR0zsVQ.js.map} +1 -1
- package/dist/_chunks/{date-picker-B6NW_PS5.js → date-picker-6tFnKFty.js} +14 -14
- package/dist/_chunks/{date-picker-B6NW_PS5.js.map → date-picker-6tFnKFty.js.map} +1 -1
- package/dist/_chunks/{dependent-selector-yTKKsuc9.js → dependent-selector-BHDP0nBB.js} +3 -3
- package/dist/_chunks/{dependent-selector-yTKKsuc9.js.map → dependent-selector-BHDP0nBB.js.map} +1 -1
- package/dist/_chunks/{description-list-CjJqR8WK.js → description-list-C1RXMDZ_.js} +2 -2
- package/dist/_chunks/{description-list-CjJqR8WK.js.map → description-list-C1RXMDZ_.js.map} +1 -1
- package/dist/_chunks/{document-preview-BrhMHNh8.js → document-preview-DsEyRcNd.js} +4 -4
- package/dist/_chunks/{document-preview-BrhMHNh8.js.map → document-preview-DsEyRcNd.js.map} +1 -1
- package/dist/_chunks/{document-scanner-C5Vrbu21.js → document-scanner-CbWVtm7u.js} +53 -52
- package/dist/_chunks/{document-scanner-C5Vrbu21.js.map → document-scanner-CbWVtm7u.js.map} +1 -1
- package/dist/_chunks/{due-date-calculator-CxgK8vzt.js → due-date-calculator-Dhc9Ljkb.js} +6 -6
- package/dist/_chunks/{due-date-calculator-CxgK8vzt.js.map → due-date-calculator-Dhc9Ljkb.js.map} +1 -1
- package/dist/_chunks/{editable-currency-cell-renderer-B7TVZ5ZJ.js → editable-currency-cell-renderer-D7blbDFY.js} +4 -4
- package/dist/_chunks/{editable-currency-cell-renderer-B7TVZ5ZJ.js.map → editable-currency-cell-renderer-D7blbDFY.js.map} +1 -1
- package/dist/_chunks/{editor-overlay-DEc5yYwo.js → editor-overlay-8fKAcRsm.js} +2 -2
- package/dist/_chunks/{editor-overlay-DEc5yYwo.js.map → editor-overlay-8fKAcRsm.js.map} +1 -1
- package/dist/_chunks/{entity-card-DmrgYSEX.js → entity-card-I-Gio5wo.js} +36 -32
- package/dist/_chunks/entity-card-I-Gio5wo.js.map +1 -0
- package/dist/_chunks/{entity-summary-5o768XLU.js → entity-summary-BbW0mIzU.js} +4 -4
- package/dist/_chunks/{entity-summary-5o768XLU.js.map → entity-summary-BbW0mIzU.js.map} +1 -1
- package/dist/_chunks/{face-scheme-l-CQyLs-.js → face-scheme-uFvhqz6h.js} +4 -4
- package/dist/_chunks/{face-scheme-l-CQyLs-.js.map → face-scheme-uFvhqz6h.js.map} +1 -1
- package/dist/_chunks/{fetal-weight-Dqy0T1fP.js → fetal-weight-C6SxchOv.js} +2 -2
- package/dist/_chunks/{fetal-weight-Dqy0T1fP.js.map → fetal-weight-C6SxchOv.js.map} +1 -1
- package/dist/_chunks/{field-array-BjkXZzSr.js → field-array-C9dmRaIM.js} +2 -2
- package/dist/_chunks/{field-array-BjkXZzSr.js.map → field-array-C9dmRaIM.js.map} +1 -1
- package/dist/_chunks/{file-manager-CI2Qn8qW.js → file-manager-DvkFgj7d.js} +7 -7
- package/dist/_chunks/{file-manager-CI2Qn8qW.js.map → file-manager-DvkFgj7d.js.map} +1 -1
- package/dist/_chunks/{file-upload-CwxdqkMK.js → file-upload-BDpb08GM.js} +71 -78
- package/dist/_chunks/file-upload-BDpb08GM.js.map +1 -0
- package/dist/_chunks/{fiscal-code-input-B_nYMSEM.js → fiscal-code-input-CkwIdB1y.js} +2 -2
- package/dist/_chunks/{fiscal-code-input-B_nYMSEM.js.map → fiscal-code-input-CkwIdB1y.js.map} +1 -1
- package/dist/_chunks/{freemium-paywall-DrXzYfv-.js → freemium-paywall-BqGk_SBU.js} +2 -2
- package/dist/_chunks/{freemium-paywall-DrXzYfv-.js.map → freemium-paywall-BqGk_SBU.js.map} +1 -1
- package/dist/_chunks/{gestational-age-calculator-CZHVrERT.js → gestational-age-calculator-DDOGaPvg.js} +6 -6
- package/dist/_chunks/{gestational-age-calculator-CZHVrERT.js.map → gestational-age-calculator-DDOGaPvg.js.map} +1 -1
- package/dist/_chunks/{hcg-doubling-C2fQxfXd.js → hcg-doubling-Bb_n6tEa.js} +2 -2
- package/dist/_chunks/{hcg-doubling-C2fQxfXd.js.map → hcg-doubling-Bb_n6tEa.js.map} +1 -1
- package/dist/_chunks/{header-DUXRIPyM.js → header-BZ4pZlJV.js} +2 -2
- package/dist/_chunks/{header-DUXRIPyM.js.map → header-BZ4pZlJV.js.map} +1 -1
- package/dist/_chunks/{header-settings-DvjZNMhD.js → header-settings-B8mLc03Q.js} +4 -4
- package/dist/_chunks/{header-settings-DvjZNMhD.js.map → header-settings-B8mLc03Q.js.map} +1 -1
- package/dist/_chunks/hover-card-Bcku1GQu.js +511 -0
- package/dist/_chunks/hover-card-Bcku1GQu.js.map +1 -0
- package/dist/_chunks/{icon-button-DA2CAGHZ.js → icon-button-8xqRnkdG.js} +2 -2
- package/dist/_chunks/{icon-button-DA2CAGHZ.js.map → icon-button-8xqRnkdG.js.map} +1 -1
- package/dist/_chunks/{icon-button-group-VCCod3Hz.js → icon-button-group-Dj6CRoYR.js} +2 -2
- package/dist/_chunks/{icon-button-group-VCCod3Hz.js.map → icon-button-group-Dj6CRoYR.js.map} +1 -1
- package/dist/_chunks/{icon-picker-DOa89vn3.js → icon-picker-CTWzlHJr.js} +2 -2
- package/dist/_chunks/{icon-picker-DOa89vn3.js.map → icon-picker-CTWzlHJr.js.map} +1 -1
- package/dist/_chunks/{info-tip-CADik6WN.js → info-tip-ey_Pon2y.js} +2 -2
- package/dist/_chunks/{info-tip-CADik6WN.js.map → info-tip-ey_Pon2y.js.map} +1 -1
- package/dist/_chunks/{key-value-pair-BIBdZBLg.js → key-value-pair-DczGb4yz.js} +42 -41
- package/dist/_chunks/key-value-pair-DczGb4yz.js.map +1 -0
- package/dist/_chunks/{link-cell-renderer-BEpMNtAa.js → link-cell-renderer-BNa8x6oJ.js} +6 -6
- package/dist/_chunks/{link-cell-renderer-BEpMNtAa.js.map → link-cell-renderer-BNa8x6oJ.js.map} +1 -1
- package/dist/_chunks/loader-circle-BECIU_8N.js +12 -0
- package/dist/_chunks/loader-circle-BECIU_8N.js.map +1 -0
- package/dist/_chunks/{locale-picker-CwFtqSkt.js → locale-picker-BLeHbFSc.js} +3 -3
- package/dist/_chunks/{locale-picker-CwFtqSkt.js.map → locale-picker-BLeHbFSc.js.map} +1 -1
- package/dist/_chunks/{marketplace-app-shell-CK_ND8Tr.js → marketplace-app-shell-BwH6Aruw.js} +6 -6
- package/dist/_chunks/{marketplace-app-shell-CK_ND8Tr.js.map → marketplace-app-shell-BwH6Aruw.js.map} +1 -1
- package/dist/_chunks/{message-card-BUMv16un.js → message-card-Dm5Xshup.js} +2 -2
- package/dist/_chunks/{message-card-BUMv16un.js.map → message-card-Dm5Xshup.js.map} +1 -1
- package/dist/_chunks/{message-tray-0zsv27xX.js → message-tray-BcLyaO-G.js} +3 -3
- package/dist/_chunks/{message-tray-0zsv27xX.js.map → message-tray-BcLyaO-G.js.map} +1 -1
- package/dist/_chunks/{multi-select-DYOvx2SJ.js → multi-select-CtPd7g4x.js} +15 -15
- package/dist/_chunks/{multi-select-DYOvx2SJ.js.map → multi-select-CtPd7g4x.js.map} +1 -1
- package/dist/_chunks/note-attachment-CwDir3kK.js +124 -0
- package/dist/_chunks/note-attachment-CwDir3kK.js.map +1 -0
- package/dist/_chunks/note-timeline-CXfSV3yX.js +231 -0
- package/dist/_chunks/note-timeline-CXfSV3yX.js.map +1 -0
- package/dist/_chunks/{notes-panel-BjLt-kiP.js → notes-panel-Co8D3uDd.js} +7 -7
- package/dist/_chunks/{notes-panel-BjLt-kiP.js.map → notes-panel-Co8D3uDd.js.map} +1 -1
- package/dist/_chunks/{notification-card-CtrzoTUO.js → notification-card-ChcK9Wat.js} +2 -2
- package/dist/_chunks/{notification-card-CtrzoTUO.js.map → notification-card-ChcK9Wat.js.map} +1 -1
- package/dist/_chunks/{notification-tray-BiRzXHDf.js → notification-tray-CJ8jOe-U.js} +4 -4
- package/dist/_chunks/{notification-tray-BiRzXHDf.js.map → notification-tray-CJ8jOe-U.js.map} +1 -1
- package/dist/_chunks/{operator-hero-D7-iiFQ9.js → operator-hero-XIdwDmN2.js} +3 -3
- package/dist/_chunks/{operator-hero-D7-iiFQ9.js.map → operator-hero-XIdwDmN2.js.map} +1 -1
- package/dist/_chunks/{optical-prescription-DUJOhKz_.js → optical-prescription-cphK41eP.js} +2 -2
- package/dist/_chunks/{optical-prescription-DUJOhKz_.js.map → optical-prescription-cphK41eP.js.map} +1 -1
- package/dist/_chunks/panel-header-D_mTdhUp.js +128 -0
- package/dist/_chunks/panel-header-D_mTdhUp.js.map +1 -0
- package/dist/_chunks/patient-details-f7SSXkTJ.js +371 -0
- package/dist/_chunks/patient-details-f7SSXkTJ.js.map +1 -0
- package/dist/_chunks/patient-field-row-BQZoP4m2.js +787 -0
- package/dist/_chunks/patient-field-row-BQZoP4m2.js.map +1 -0
- package/dist/_chunks/{patient-search-HeEUB-_X.js → patient-search-D08b6jgj.js} +2 -2
- package/dist/_chunks/{patient-search-HeEUB-_X.js.map → patient-search-D08b6jgj.js.map} +1 -1
- package/dist/_chunks/patient-summary-card-Bz7KdUin.js +533 -0
- package/dist/_chunks/patient-summary-card-Bz7KdUin.js.map +1 -0
- package/dist/_chunks/{payment-automation-upsell-DwQW2fRp.js → payment-automation-upsell-BLTdE2em.js} +50 -59
- package/dist/_chunks/payment-automation-upsell-BLTdE2em.js.map +1 -0
- package/dist/_chunks/{payment-form-Ds1I9KqB.js → payment-form-BHMDqW9C.js} +2 -2
- package/dist/_chunks/{payment-form-Ds1I9KqB.js.map → payment-form-BHMDqW9C.js.map} +1 -1
- package/dist/_chunks/{payment-request-card-lmKLwsDs.js → payment-request-card-BxcdvxKR.js} +6 -6
- package/dist/_chunks/{payment-request-card-lmKLwsDs.js.map → payment-request-card-BxcdvxKR.js.map} +1 -1
- package/dist/_chunks/{pdf-viewer-DUIsV9s5.js → pdf-viewer-DUKdn5iq.js} +2 -2
- package/dist/_chunks/{pdf-viewer-DUIsV9s5.js.map → pdf-viewer-DUKdn5iq.js.map} +1 -1
- package/dist/_chunks/{periodontal-chart-B9fphroR.js → periodontal-chart-BF_e3wZp.js} +2 -2
- package/dist/_chunks/{periodontal-chart-B9fphroR.js.map → periodontal-chart-BF_e3wZp.js.map} +1 -1
- package/dist/_chunks/{periodontal-chart-card-qEZPXj83.js → periodontal-chart-card-BJEuJuzh.js} +3 -3
- package/dist/_chunks/{periodontal-chart-card-qEZPXj83.js.map → periodontal-chart-card-BJEuJuzh.js.map} +1 -1
- package/dist/_chunks/{periodontal-diagnosis-lEwA8wqX.js → periodontal-diagnosis-C7pfPOct.js} +5 -5
- package/dist/_chunks/{periodontal-diagnosis-lEwA8wqX.js.map → periodontal-diagnosis-C7pfPOct.js.map} +1 -1
- package/dist/_chunks/{periodontal-risk-chart-0x7KVZjL.js → periodontal-risk-chart-B2tNFa15.js} +2 -2
- package/dist/_chunks/{periodontal-risk-chart-0x7KVZjL.js.map → periodontal-risk-chart-B2tNFa15.js.map} +1 -1
- package/dist/_chunks/{permission-matrix-BIJrGEmz.js → permission-matrix-VdAXjjHU.js} +3 -3
- package/dist/_chunks/{permission-matrix-BIJrGEmz.js.map → permission-matrix-VdAXjjHU.js.map} +1 -1
- package/dist/_chunks/{popover-DP6WCVwm.js → popover-DzR5QYxp.js} +24 -24
- package/dist/_chunks/{popover-DP6WCVwm.js.map → popover-DzR5QYxp.js.map} +1 -1
- package/dist/_chunks/{practice-profile-hero-DQyDvpJL.js → practice-profile-hero-DxoLlQr5.js} +2 -2
- package/dist/_chunks/{practice-profile-hero-DQyDvpJL.js.map → practice-profile-hero-DxoLlQr5.js.map} +1 -1
- package/dist/_chunks/{practice-results-kayDEorM.js → practice-results-DOcORTkP.js} +4 -4
- package/dist/_chunks/{practice-results-kayDEorM.js.map → practice-results-DOcORTkP.js.map} +1 -1
- package/dist/_chunks/{pregnancy-dating-n5j5dAKy.js → pregnancy-dating-nV1_S6w0.js} +6 -6
- package/dist/_chunks/{pregnancy-dating-n5j5dAKy.js.map → pregnancy-dating-nV1_S6w0.js.map} +1 -1
- package/dist/_chunks/{pregnancy-weight-gain-D5A8vPjj.js → pregnancy-weight-gain-tRecShAD.js} +4 -4
- package/dist/_chunks/{pregnancy-weight-gain-D5A8vPjj.js.map → pregnancy-weight-gain-tRecShAD.js.map} +1 -1
- package/dist/_chunks/{privacy-lock-CkAUo6Dz.js → privacy-lock-Be39vQUN.js} +2 -2
- package/dist/_chunks/{privacy-lock-CkAUo6Dz.js.map → privacy-lock-Be39vQUN.js.map} +1 -1
- package/dist/_chunks/{product-hub-panel-BScCotGD.js → product-hub-panel-C0TO69P7.js} +2 -2
- package/dist/_chunks/{product-hub-panel-BScCotGD.js.map → product-hub-panel-C0TO69P7.js.map} +1 -1
- package/dist/_chunks/{public-header.agent-kth2SdXn.js → public-header.agent-Bl1KFwSE.js} +3 -3
- package/dist/_chunks/{public-header.agent-kth2SdXn.js.map → public-header.agent-Bl1KFwSE.js.map} +1 -1
- package/dist/_chunks/{radio-DNRe6H_8.js → radio-6fml-pWk.js} +2 -2
- package/dist/_chunks/{radio-DNRe6H_8.js.map → radio-6fml-pWk.js.map} +1 -1
- package/dist/_chunks/{radio-group-DyVBgnA3.js → radio-group-CIjmyioi.js} +3 -3
- package/dist/_chunks/{radio-group-DyVBgnA3.js.map → radio-group-CIjmyioi.js.map} +1 -1
- package/dist/_chunks/{radiograph-panel.agent-o4jwEJPC.js → radiograph-panel.agent-k0G7JuoM.js} +6 -6
- package/dist/_chunks/{radiograph-panel.agent-o4jwEJPC.js.map → radiograph-panel.agent-k0G7JuoM.js.map} +1 -1
- package/dist/_chunks/{reviews-panel-BKHEfqVQ.js → reviews-panel-BaHZb_ai.js} +3 -3
- package/dist/_chunks/{reviews-panel-BKHEfqVQ.js.map → reviews-panel-BaHZb_ai.js.map} +1 -1
- package/dist/_chunks/{rich-text-editor-CCI-Y3DN.js → rich-text-editor-BTXlorm5.js} +7 -7
- package/dist/_chunks/{rich-text-editor-CCI-Y3DN.js.map → rich-text-editor-BTXlorm5.js.map} +1 -1
- package/dist/_chunks/{search-bar-CJj6sI9m.js → search-bar-CCmViqaa.js} +46 -46
- package/dist/_chunks/{search-bar-CJj6sI9m.js.map → search-bar-CCmViqaa.js.map} +1 -1
- package/dist/_chunks/section-card.agent-W18CHEgX.js +74 -0
- package/dist/_chunks/section-card.agent-W18CHEgX.js.map +1 -0
- package/dist/_chunks/{sheet-BSznOyJs.js → sheet-hm04DGFd.js} +2 -2
- package/dist/_chunks/{sheet-BSznOyJs.js.map → sheet-hm04DGFd.js.map} +1 -1
- package/dist/_chunks/{sign-document-jF4fZDJ5.js → sign-document-CRQuAn4W.js} +2 -2
- package/dist/_chunks/{sign-document-jF4fZDJ5.js.map → sign-document-CRQuAn4W.js.map} +1 -1
- package/dist/_chunks/{signature-request-vihDT8On.js → signature-request-Dej2g86d.js} +5 -5
- package/dist/_chunks/{signature-request-vihDT8On.js.map → signature-request-Dej2g86d.js.map} +1 -1
- package/dist/_chunks/{signature-status-chip-T5fyS-k9.js → signature-status-chip-D4NsrdeI.js} +3 -3
- package/dist/_chunks/{signature-status-chip-T5fyS-k9.js.map → signature-status-chip-D4NsrdeI.js.map} +1 -1
- package/dist/_chunks/{slot-grid-BuZOKfcd.js → slot-grid-8Ko6thzz.js} +2 -2
- package/dist/_chunks/{slot-grid-BuZOKfcd.js.map → slot-grid-8Ko6thzz.js.map} +1 -1
- package/dist/_chunks/{streaming-text-CvsjIQ7S.js → streaming-text-DjFqLSt_.js} +2 -2
- package/dist/_chunks/{streaming-text-CvsjIQ7S.js.map → streaming-text-DjFqLSt_.js.map} +1 -1
- package/dist/_chunks/{tab-bar-DvFJIQfL.js → tab-bar-rDkLiaA6.js} +2 -2
- package/dist/_chunks/{tab-bar-DvFJIQfL.js.map → tab-bar-rDkLiaA6.js.map} +1 -1
- package/dist/_chunks/{tag-3wgkwwDB.js → tag-Ci3xJPcH.js} +2 -2
- package/dist/_chunks/{tag-3wgkwwDB.js.map → tag-Ci3xJPcH.js.map} +1 -1
- package/dist/_chunks/{task-tray-COo-RlDv.js → task-tray-wl9eti6J.js} +2 -2
- package/dist/_chunks/{task-tray-COo-RlDv.js.map → task-tray-wl9eti6J.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-DLKpSNoE.js → tasks-panel-BDNB7hsZ.js} +5 -5
- package/dist/_chunks/{tasks-panel-DLKpSNoE.js.map → tasks-panel-BDNB7hsZ.js.map} +1 -1
- package/dist/_chunks/{theme-toggle-uEwoKjl3.js → theme-toggle-CMz8YfC1.js} +3 -3
- package/dist/_chunks/{theme-toggle-uEwoKjl3.js.map → theme-toggle-CMz8YfC1.js.map} +1 -1
- package/dist/_chunks/{timeline-Bs9Erxlo.js → timeline-61AihzYz.js} +47 -47
- package/dist/_chunks/timeline-61AihzYz.js.map +1 -0
- package/dist/_chunks/{toast-YZz2sBzB.js → toast-8jqtbfAB.js} +2 -2
- package/dist/_chunks/{toast-YZz2sBzB.js.map → toast-8jqtbfAB.js.map} +1 -1
- package/dist/_chunks/{tool-rail-ONaV-Nzz.js → tool-rail-Bq5eiFMG.js} +3 -3
- package/dist/_chunks/{tool-rail-ONaV-Nzz.js.map → tool-rail-Bq5eiFMG.js.map} +1 -1
- package/dist/_chunks/{tooltip-DvmfrNvB.js → tooltip-Cp-PLePW.js} +41 -41
- package/dist/_chunks/tooltip-Cp-PLePW.js.map +1 -0
- package/dist/_chunks/{tooth-scheme-Qe7LO5Di.js → tooth-scheme-BWkYxxjR.js} +3 -3
- package/dist/_chunks/{tooth-scheme-Qe7LO5Di.js.map → tooth-scheme-BWkYxxjR.js.map} +1 -1
- package/dist/_chunks/{transaction-chip-DJCstquX.js → transaction-chip-Dth1nThY.js} +49 -48
- package/dist/_chunks/{transaction-chip-DJCstquX.js.map → transaction-chip-Dth1nThY.js.map} +1 -1
- package/dist/_chunks/{transcript-panel-BGkEhvHO.js → transcript-panel-u2HHxZB6.js} +2 -2
- package/dist/_chunks/{transcript-panel-BGkEhvHO.js.map → transcript-panel-u2HHxZB6.js.map} +1 -1
- package/dist/_chunks/user-x-DYszNtIg.js +45 -0
- package/dist/_chunks/user-x-DYszNtIg.js.map +1 -0
- package/dist/_chunks/{warning-stack-DQz0Jyir.js → warning-stack-BW5Dwb3z.js} +3 -3
- package/dist/_chunks/{warning-stack-DQz0Jyir.js.map → warning-stack-BW5Dwb3z.js.map} +1 -1
- package/dist/_chunks/{widget-picker-DvUkBemi.js → widget-picker-B1sj6uyf.js} +2 -2
- package/dist/_chunks/{widget-picker-DvUkBemi.js.map → widget-picker-B1sj6uyf.js.map} +1 -1
- package/dist/_chunks/{workflow-map-dNzJjBWG.js → workflow-map-D-LEni11.js} +5 -5
- package/dist/_chunks/{workflow-map-dNzJjBWG.js.map → workflow-map-D-LEni11.js.map} +1 -1
- package/dist/_chunks/workflow-status-xeaJTzD3.js +476 -0
- package/dist/_chunks/workflow-status-xeaJTzD3.js.map +1 -0
- package/dist/agent-catalog.json +185 -1
- package/dist/agent-i18n/en.json +27 -0
- package/dist/components/_shared/entity-card/entity-card.d.ts +44 -0
- package/dist/components/_shared/entity-card/entity-card.d.ts.map +1 -1
- package/dist/components/_shared/entity-card/index.d.ts +1 -1
- package/dist/components/_shared/entity-card/index.d.ts.map +1 -1
- package/dist/components/_shared/note-attachment.d.ts +41 -0
- package/dist/components/_shared/note-attachment.d.ts.map +1 -0
- package/dist/components/_shared/note-markdown.d.ts +3 -0
- package/dist/components/_shared/note-markdown.d.ts.map +1 -0
- package/dist/components/_shared/patient-field-row.d.ts +40 -0
- package/dist/components/_shared/patient-field-row.d.ts.map +1 -0
- package/dist/components/agenda-card/index.js +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-consent-banner/index.js +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/alert/index.js +1 -1
- package/dist/components/anamnesis-card/index.js +1 -1
- package/dist/components/anamnesis-summary-card/index.js +1 -1
- package/dist/components/appointment-card/appointment-card.d.ts +36 -1
- package/dist/components/appointment-card/appointment-card.d.ts.map +1 -1
- package/dist/components/appointment-card/index.js +2 -2
- package/dist/components/appointment-timeline/appointment-timeline.d.ts +6 -0
- package/dist/components/appointment-timeline/appointment-timeline.d.ts.map +1 -1
- package/dist/components/appointment-timeline/index.js +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/badge/index.js +1 -1
- package/dist/components/bishop-score/index.js +1 -1
- package/dist/components/bmi-calculator/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/button/index.js +1 -1
- package/dist/components/button-group/button-group.d.ts +20 -0
- package/dist/components/button-group/button-group.d.ts.map +1 -1
- package/dist/components/button-group/index.js +1 -1
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/calendar-event-card/index.js +1 -1
- package/dist/components/care-plan-card/index.js +1 -1
- package/dist/components/care-plan-entry-card/index.js +1 -1
- package/dist/components/care-plan-header/index.js +1 -1
- package/dist/components/carousel/index.js +1 -1
- package/dist/components/chart/index.js +1 -1
- package/dist/components/chat-input/index.js +1 -1
- package/dist/components/chat-message/index.js +1 -1
- package/dist/components/checkbox/index.js +1 -1
- package/dist/components/checkbox-group/index.js +1 -1
- package/dist/components/clinical-note-card/clinical-note-card.d.ts +2 -34
- package/dist/components/clinical-note-card/clinical-note-card.d.ts.map +1 -1
- package/dist/components/clinical-note-card/index.js +1 -1
- package/dist/components/connection-status/index.js +1 -1
- package/dist/components/contact-profile-card/index.js +1 -1
- package/dist/components/control-room-rail/index.js +1 -1
- package/dist/components/counter/counter.d.ts +6 -0
- package/dist/components/counter/counter.d.ts.map +1 -1
- package/dist/components/counter/index.js +1 -1
- package/dist/components/cycle-calculator/index.js +1 -1
- package/dist/components/dashboard-grid/index.js +1 -1
- package/dist/components/data-table/index.js +4 -4
- package/dist/components/data-table-tabs/index.js +1 -1
- package/dist/components/date-picker/index.js +1 -1
- package/dist/components/dependent-selector/index.js +1 -1
- package/dist/components/description-list/index.js +1 -1
- package/dist/components/document-preview/index.js +1 -1
- package/dist/components/document-scanner/index.js +1 -1
- package/dist/components/due-date-calculator/index.js +2 -2
- package/dist/components/editor-overlay/index.js +1 -1
- package/dist/components/entity-summary/index.js +1 -1
- package/dist/components/face-scheme/index.js +1 -1
- package/dist/components/fetal-weight/index.js +1 -1
- package/dist/components/field-array/index.js +1 -1
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/file-upload/index.js +1 -1
- package/dist/components/fiscal-code-input/index.js +1 -1
- package/dist/components/freemium-paywall/index.js +1 -1
- package/dist/components/gestational-age-calculator/index.js +1 -1
- package/dist/components/hcg-doubling/index.js +1 -1
- package/dist/components/header/index.js +1 -1
- package/dist/components/header-settings/index.js +1 -1
- package/dist/components/hover-card/hover-card.agent.d.ts +4 -0
- package/dist/components/hover-card/hover-card.agent.d.ts.map +1 -0
- package/dist/components/hover-card/hover-card.d.ts +80 -0
- package/dist/components/hover-card/hover-card.d.ts.map +1 -0
- package/dist/components/hover-card/index.d.ts +4 -0
- package/dist/components/hover-card/index.d.ts.map +1 -0
- package/dist/components/hover-card/index.js +6 -0
- package/dist/components/hover-card/index.js.map +1 -0
- package/dist/components/icon-button/index.js +1 -1
- package/dist/components/icon-button-group/index.js +1 -1
- package/dist/components/icon-picker/index.js +1 -1
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/info-tip/index.js +1 -1
- package/dist/components/key-value-pair/index.js +1 -1
- package/dist/components/key-value-pair/key-value-pair.d.ts +8 -1
- package/dist/components/key-value-pair/key-value-pair.d.ts.map +1 -1
- package/dist/components/locale-picker/index.js +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/note-timeline/index.d.ts +4 -0
- package/dist/components/note-timeline/index.d.ts.map +1 -0
- package/dist/components/note-timeline/index.js +6 -0
- package/dist/components/note-timeline/index.js.map +1 -0
- package/dist/components/note-timeline/note-timeline.agent.d.ts +4 -0
- package/dist/components/note-timeline/note-timeline.agent.d.ts.map +1 -0
- package/dist/components/note-timeline/note-timeline.d.ts +77 -0
- package/dist/components/note-timeline/note-timeline.d.ts.map +1 -0
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/notification-card/index.js +1 -1
- package/dist/components/notification-tray/index.js +1 -1
- package/dist/components/operator-hero/index.js +1 -1
- package/dist/components/optical-prescription/index.js +1 -1
- package/dist/components/panel-header/index.js +1 -1
- package/dist/components/panel-header/panel-header.d.ts +7 -0
- package/dist/components/panel-header/panel-header.d.ts.map +1 -1
- package/dist/components/patient-details/index.js +1 -1
- package/dist/components/patient-details/patient-details.d.ts.map +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-summary-card/patient-summary-card.d.ts +54 -0
- package/dist/components/patient-summary-card/patient-summary-card.d.ts.map +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/payment-card/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-chart/index.js +1 -1
- package/dist/components/periodontal-chart-card/index.js +1 -1
- package/dist/components/periodontal-diagnosis/index.js +1 -1
- package/dist/components/periodontal-risk-chart/index.js +1 -1
- package/dist/components/permission-matrix/index.js +1 -1
- package/dist/components/popover/index.js +1 -1
- package/dist/components/practice-profile-hero/index.js +1 -1
- package/dist/components/practice-results/index.js +1 -1
- package/dist/components/pregnancy-dating/index.js +1 -1
- package/dist/components/pregnancy-weight-gain/index.js +1 -1
- package/dist/components/privacy-lock/index.js +1 -1
- package/dist/components/product-hub-tray/index.js +1 -1
- package/dist/components/public-header/index.js +1 -1
- package/dist/components/radio/index.js +1 -1
- package/dist/components/radio-group/index.js +2 -2
- package/dist/components/radiograph-panel/index.js +1 -1
- package/dist/components/reviews-panel/index.js +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/search-bar/index.js +1 -1
- package/dist/components/section-card/index.d.ts +4 -0
- package/dist/components/section-card/index.d.ts.map +1 -0
- package/dist/components/section-card/index.js +6 -0
- package/dist/components/section-card/index.js.map +1 -0
- package/dist/components/section-card/section-card.agent.d.ts +3 -0
- package/dist/components/section-card/section-card.agent.d.ts.map +1 -0
- package/dist/components/section-card/section-card.d.ts +30 -0
- package/dist/components/section-card/section-card.d.ts.map +1 -0
- package/dist/components/sheet/index.js +1 -1
- package/dist/components/sign-document/index.js +1 -1
- package/dist/components/signature-status-chip/index.js +1 -1
- package/dist/components/slot-grid/index.js +1 -1
- package/dist/components/streaming-text/index.js +1 -1
- package/dist/components/tab-bar/index.js +1 -1
- package/dist/components/tag/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/timeline/index.js +1 -1
- package/dist/components/timeline/timeline.d.ts +1 -1
- package/dist/components/timeline/timeline.d.ts.map +1 -1
- package/dist/components/toast/index.js +1 -1
- package/dist/components/tool-rail/index.js +1 -1
- package/dist/components/tooltip/index.js +1 -1
- package/dist/components/tooltip/tooltip.d.ts.map +1 -1
- package/dist/components/tooth-scheme/index.js +1 -1
- package/dist/components/transaction-chip/index.js +1 -1
- package/dist/components/transaction-chip/transaction-chip.d.ts +11 -0
- package/dist/components/transaction-chip/transaction-chip.d.ts.map +1 -1
- package/dist/components/transcript-panel/index.js +1 -1
- package/dist/components/warning-stack/index.js +1 -1
- package/dist/components/widget-picker/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/components/workflow-status/index.d.ts +4 -0
- package/dist/components/workflow-status/index.d.ts.map +1 -0
- package/dist/components/workflow-status/index.js +7 -0
- package/dist/components/workflow-status/index.js.map +1 -0
- package/dist/components/workflow-status/workflow-status.agent.d.ts +4 -0
- package/dist/components/workflow-status/workflow-status.agent.d.ts.map +1 -0
- package/dist/components/workflow-status/workflow-status.d.ts +52 -0
- package/dist/components/workflow-status/workflow-status.d.ts.map +1 -0
- package/dist/host-compat.css +4 -1
- package/dist/i18n/locales/ar.d.ts +17 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +18 -1
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +17 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +18 -1
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +17 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +18 -1
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +17 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +18 -1
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +17 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +18 -1
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +17 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +18 -1
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +17 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +18 -1
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +20 -3
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +20 -3
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +17 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +18 -1
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +17 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +18 -1
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +17 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +18 -1
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +17 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +18 -1
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +17 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +18 -1
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +17 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +18 -1
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +17 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +18 -1
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +17 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +18 -1
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +17 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +18 -1
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +17 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +18 -1
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +929 -916
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.json +18 -1
- package/dist/locales/de.json +18 -1
- package/dist/locales/el.json +18 -1
- package/dist/locales/en.json +18 -1
- package/dist/locales/es.json +18 -1
- package/dist/locales/fr.json +18 -1
- package/dist/locales/hi.json +18 -1
- package/dist/locales/it.json +20 -3
- package/dist/locales/ja.json +18 -1
- package/dist/locales/nl.json +18 -1
- package/dist/locales/pl.json +18 -1
- package/dist/locales/pt.json +18 -1
- package/dist/locales/ro.json +18 -1
- package/dist/locales/ru.json +18 -1
- package/dist/locales/sq.json +18 -1
- package/dist/locales/sv.json +18 -1
- package/dist/locales/tr.json +18 -1
- package/dist/locales/zh.json +18 -1
- package/dist/patterns/alia-assistant/index.js +1 -1
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/calendar/calendar.model.d.ts +2 -0
- package/dist/patterns/calendar/calendar.model.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.sheets.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.surface.d.ts.map +1 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/patterns/marketplace-app-shell/index.js +1 -1
- package/dist/patterns/payment-automation-upsell/index.js +1 -1
- package/dist/patterns/signature-request/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +17 -1
- package/dist/_chunks/appointment-card-D6mk39NB.js +0 -296
- package/dist/_chunks/appointment-card-D6mk39NB.js.map +0 -1
- package/dist/_chunks/appointment-timeline-D-V97Bhc.js +0 -403
- package/dist/_chunks/appointment-timeline-D-V97Bhc.js.map +0 -1
- package/dist/_chunks/button-group-CaxRJsNG.js +0 -289
- package/dist/_chunks/button-group-CaxRJsNG.js.map +0 -1
- package/dist/_chunks/calendar-event-card-DSh-69HT.js.map +0 -1
- package/dist/_chunks/calendar-workspace-4NH1Z47_.js.map +0 -1
- package/dist/_chunks/clinical-note-card-CTRzmqvv.js +0 -438
- package/dist/_chunks/clinical-note-card-CTRzmqvv.js.map +0 -1
- package/dist/_chunks/counter-dRlTNC_y.js.map +0 -1
- package/dist/_chunks/entity-card-DmrgYSEX.js.map +0 -1
- package/dist/_chunks/field-value-BetdWMA2.js +0 -384
- package/dist/_chunks/field-value-BetdWMA2.js.map +0 -1
- package/dist/_chunks/file-upload-CwxdqkMK.js.map +0 -1
- package/dist/_chunks/key-value-pair-BIBdZBLg.js.map +0 -1
- package/dist/_chunks/panel-header-D313n_9-.js +0 -105
- package/dist/_chunks/panel-header-D313n_9-.js.map +0 -1
- package/dist/_chunks/patient-details-BGiawUHd.js +0 -760
- package/dist/_chunks/patient-details-BGiawUHd.js.map +0 -1
- package/dist/_chunks/patient-summary-card--CT_gbaQ.js +0 -454
- package/dist/_chunks/patient-summary-card--CT_gbaQ.js.map +0 -1
- package/dist/_chunks/payment-automation-upsell-DwQW2fRp.js.map +0 -1
- package/dist/_chunks/timeline-Bs9Erxlo.js.map +0 -1
- package/dist/_chunks/tooltip-DvmfrNvB.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hover-card-Bcku1GQu.js","sources":["../../src/components/hover-card/hover-card.agent.ts","../../src/components/hover-card/hover-card.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — HoverCard. */\n/* */\n/* Unlike Tooltip, a hover card holds interactive content, so an agent */\n/* has a legitimate reason to open one and read its state. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { HoverCardHandle } from './hover-card';\n\nexport const hoverCardAgent: AgentAdapter<HoverCardHandle> = {\n id: 'hover-card',\n capabilities: ['open', 'close'],\n state: {\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.hoverCard.state.isOpen',\n description: 'True when the hover card is currently open.',\n read: (handle) => handle.getIsOpen(),\n },\n },\n actions: {\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.hoverCard.actions.open',\n description: 'Open the hover card without moving focus into it.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.hoverCard.actions.close',\n description: 'Close the hover card.',\n invoke: (handle) => {\n handle.close();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'hover-card' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on HoverCard.Root.',\n },\n },\n};\n","import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { useAgentRegistration } from '../../agent';\nimport { hoverCardAgent } from './hover-card.agent';\n\n/* -------------------------------------------------------------------- */\n/* Logical → physical side */\n/* -------------------------------------------------------------------- */\n\nexport type HoverCardSide = 'top' | 'end' | 'bottom' | 'start';\n\nfunction resolvePhysicalSide(\n logicalSide: HoverCardSide,\n isRtl: boolean,\n): 'left' | 'top' | 'right' | 'bottom' {\n if (logicalSide === 'top' || logicalSide === 'bottom') return logicalSide;\n if (logicalSide === 'start') return isRtl ? 'right' : 'left';\n /* logicalSide === 'end' */\n return isRtl ? 'left' : 'right';\n}\n\n/* -------------------------------------------------------------------- */\n/* Contexts */\n/* -------------------------------------------------------------------- */\n\ninterface HoverCardA11yContext {\n headingId: string | undefined;\n setHeadingId: (id: string | undefined) => void;\n}\n\nconst A11yContext = createContext<HoverCardA11yContext>({\n headingId: undefined,\n setHeadingId: () => {},\n});\n\ninterface HoverCardRootContext {\n /** Keeps the card open while the pointer or focus is inside the content. */\n cancelClose: () => void;\n closeWithDelay: () => void;\n /** True when this open should move focus into the card. */\n shouldFocusOnOpen: () => boolean;\n /** True when focus was actually moved in, so closing may return it. */\n didMoveFocus: () => boolean;\n noteMovedFocus: () => void;\n /** Called when closing hands focus back, so the trigger's focus handler\n * does not read that return as a fresh Tab and reopen the card. */\n noteFocusReturn: () => void;\n clearMovedFocus: () => void;\n registerContent: (node: HTMLDivElement | null) => void;\n /** The trigger node, used to resolve the reading direction. Content is\n * portalled to body, so only the trigger can see a scoped [dir]. */\n triggerRef: React.MutableRefObject<HTMLElement | null>;\n instanceId: string | undefined;\n}\n\nconst RootContext = createContext<HoverCardRootContext>({\n cancelClose: () => {},\n closeWithDelay: () => {},\n shouldFocusOnOpen: () => false,\n didMoveFocus: () => false,\n noteMovedFocus: () => {},\n noteFocusReturn: () => {},\n clearMovedFocus: () => {},\n registerContent: () => {},\n triggerRef: { current: null },\n instanceId: undefined,\n});\n\n/** `flush` moves padding from the Content onto the inner slots, so Media can\n * bleed to the card's edge. */\nconst PaddingContext = createContext<'default' | 'flush'>('default');\n\n/* -------------------------------------------------------------------- */\n/* CVA — content surface */\n/* -------------------------------------------------------------------- */\n\nconst contentVariants = cva(\n [\n // Same elevated surface as Popover: `--card-border` at 32% alpha reads as\n // a subtle edge in both themes, where the shadow alone lets the card\n // float as an unbounded blob on dark. Forced colours upgrade it to a\n // fully visible `CanvasText` edge.\n 'ds:relative ds:bg-[var(--popover)] ds:border ds:border-[color:var(--card-border)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:max-w-[calc(100vw-var(--spacing-lg))]',\n 'ds:z-[var(--z-popover)]',\n 'ds:text-[var(--popover-foreground)] ds:text-[length:var(--font-size-sm)]',\n 'ds:break-words',\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=closed]:fade-out-0 ds:data-[state=open]:fade-in-0',\n 'ds:data-[state=closed]:zoom-out-95 ds:data-[state=open]:zoom-in-95',\n 'ds:data-[side=bottom]:slide-in-from-top-2 ds:data-[side=left]:slide-in-from-right-2',\n 'ds:data-[side=right]:slide-in-from-left-2 ds:data-[side=top]:slide-in-from-bottom-2',\n 'ds:motion-reduce:transition-none ds:motion-reduce:animate-none',\n 'ds:forced-colors:border-[CanvasText]',\n 'ds:focus-visible:outline-none',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:w-[var(--popover-size-sm)]',\n md: 'ds:w-[var(--popover-size-md)]',\n lg: 'ds:w-[var(--popover-size-lg)]',\n },\n padding: {\n default: 'ds:p-[var(--spacing-md)]',\n // Media bleeds to the edge, so the slots pad themselves instead.\n flush: 'ds:p-[var(--spacing-none)] ds:overflow-hidden',\n },\n },\n defaultVariants: {\n size: 'md',\n padding: 'default',\n },\n },\n);\n\n/* -------------------------------------------------------------------- */\n/* Root */\n/* -------------------------------------------------------------------- */\n\n// Curated agent-readiness handle — see hover-card.agent.ts.\nexport interface HoverCardHandle {\n getIsOpen: () => boolean;\n open: () => void;\n close: () => void;\n}\n\nexport interface HoverCardProps {\n children: ReactNode;\n /**\n * How the card opens. `hover-or-click` (the default) opens on pointer hover\n * without taking focus, and on click, tap or Enter with focus moved into the\n * card so the footer actions are reachable. `click` disables hover entirely.\n */\n openOn?: 'hover-or-click' | 'click';\n /** Controlled open state. */\n open?: boolean;\n /** Uncontrolled initial open state. */\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Delay before a hover opens the card, in ms. Default 300. */\n openDelay?: number;\n /** Grace period before a pointer leaving closes the card, in ms. Default 300. */\n closeDelay?: number;\n /** Opaque instance id — emitted on Content as `data-component-id`. */\n id?: string;\n}\n\nfunction HoverCardRoot({\n children,\n openOn = 'hover-or-click',\n open: controlledOpen,\n defaultOpen,\n onOpenChange,\n openDelay = 300,\n closeDelay = 300,\n id,\n}: HoverCardProps) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen ?? false);\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n const isOpenRef = useRef(isOpen);\n useEffect(() => {\n isOpenRef.current = isOpen;\n }, [isOpen]);\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const clearTimer = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n useEffect(() => clearTimer, [clearTimer]);\n\n /* Focus bookkeeping. A hover must never pull focus off whatever the user is\n doing; a click or Enter must move focus in, or the footer buttons are\n unreachable. `focusOnOpen` decides which, and `movedFocus` records whether\n closing is allowed to hand focus back to the trigger. */\n const focusOnOpenRef = useRef(false);\n const movedFocusRef = useRef(false);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLElement | null>(null);\n\n const openWithDelay = useCallback(() => {\n clearTimer();\n timerRef.current = setTimeout(() => {\n focusOnOpenRef.current = false;\n setOpen(true);\n }, openDelay);\n }, [clearTimer, openDelay, setOpen]);\n\n const closeWithDelay = useCallback(() => {\n clearTimer();\n timerRef.current = setTimeout(() => setOpen(false), closeDelay);\n }, [clearTimer, closeDelay, setOpen]);\n\n /* Closing hands focus back to the trigger, which fires the trigger's focus\n handler and would reopen the card it just closed — an Escape that does\n nothing. The return is swallowed once, with a timeout as a safety net so\n a suppression can never outlive the interaction that armed it. */\n const suppressFocusOpenRef = useRef(false);\n const suppressTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const noteFocusReturn = useCallback(() => {\n suppressFocusOpenRef.current = true;\n if (suppressTimerRef.current) clearTimeout(suppressTimerRef.current);\n suppressTimerRef.current = setTimeout(() => {\n suppressFocusOpenRef.current = false;\n }, 100);\n }, []);\n useEffect(\n () => () => {\n if (suppressTimerRef.current) clearTimeout(suppressTimerRef.current);\n },\n [],\n );\n\n /** Tabbing onto the trigger reveals the card at once, but leaves focus on\n * the trigger so a keyboard user can pass by without being pulled in. */\n const openOnFocus = useCallback(() => {\n if (suppressFocusOpenRef.current) {\n suppressFocusOpenRef.current = false;\n return;\n }\n clearTimer();\n focusOnOpenRef.current = false;\n setOpen(true);\n }, [clearTimer, setOpen]);\n\n const focusContent = useCallback(() => {\n movedFocusRef.current = true;\n contentRef.current?.focus();\n }, []);\n\n /* Press bookkeeping. \"Was the card open?\" is the wrong question: hover and\n Tab both reveal it, so by the time Enter or a click arrives it is already\n open and a naive toggle would close what the user is trying to enter.\n The right question is whether focus was already INSIDE the card, which\n separates \"take me in\" from \"I am in, let me out\".\n\n It must be snapshotted at press start, not read at click time, because\n pointerdown moves focus to the trigger and would erase the answer.\n `null` means an orphan press (a programmatic `.click()`, or assistive\n tech dispatching click alone) and is treated as \"take me in\". */\n const focusWasInsideRef = useRef<boolean | null>(null);\n const notePressStart = useCallback(() => {\n const content = contentRef.current;\n focusWasInsideRef.current = Boolean(\n content && content.contains(document.activeElement),\n );\n }, []);\n\n const handleTriggerClick = useCallback(() => {\n const focusWasInside = focusWasInsideRef.current;\n focusWasInsideRef.current = null;\n if (focusWasInside === true) {\n setOpen(false);\n return;\n }\n focusOnOpenRef.current = true;\n if (isOpenRef.current) {\n // Hover or Tab already opened it, so no state change will fire\n // onOpenAutoFocus. Move focus in directly.\n focusContent();\n } else {\n setOpen(true);\n }\n }, [focusContent, setOpen]);\n\n const agentHandle = useMemo<HoverCardHandle>(\n () => ({\n getIsOpen: () => isOpenRef.current,\n open: () => {\n focusOnOpenRef.current = false;\n setOpen(true);\n },\n close: () => setOpen(false),\n }),\n [setOpen],\n );\n useAgentRegistration(hoverCardAgent, agentHandle, id);\n\n const [headingId, setHeadingId] = useState<string | undefined>(undefined);\n\n const isHoverMode = openOn === 'hover-or-click';\n\n const rootValue = useMemo<HoverCardRootContext>(\n () => ({\n cancelClose: clearTimer,\n closeWithDelay: isHoverMode ? closeWithDelay : () => {},\n shouldFocusOnOpen: () => focusOnOpenRef.current,\n didMoveFocus: () => movedFocusRef.current,\n noteMovedFocus: () => {\n movedFocusRef.current = true;\n },\n noteFocusReturn,\n clearMovedFocus: () => {\n movedFocusRef.current = false;\n },\n registerContent: (node) => {\n contentRef.current = node;\n },\n triggerRef,\n instanceId: id,\n }),\n [clearTimer, closeWithDelay, id, isHoverMode, noteFocusReturn],\n );\n\n const triggerValue = useMemo<HoverCardTriggerContext>(\n () => ({\n isHoverMode,\n openOnFocus,\n openWithDelay,\n closeWithDelay,\n cancelClose: clearTimer,\n notePressStart,\n onClick: handleTriggerClick,\n }),\n [\n clearTimer,\n closeWithDelay,\n handleTriggerClick,\n isHoverMode,\n notePressStart,\n openOnFocus,\n openWithDelay,\n ],\n );\n\n return (\n <A11yContext.Provider value={{ headingId, setHeadingId }}>\n <RootContext.Provider value={rootValue}>\n <TriggerContext.Provider value={triggerValue}>\n <RadixPopover.Root open={isOpen} onOpenChange={setOpen}>\n {children}\n </RadixPopover.Root>\n </TriggerContext.Provider>\n </RootContext.Provider>\n </A11yContext.Provider>\n );\n}\nHoverCardRoot.displayName = 'HoverCard.Root';\n\n/* -------------------------------------------------------------------- */\n/* Trigger */\n/* -------------------------------------------------------------------- */\n\ninterface HoverCardTriggerContext {\n isHoverMode: boolean;\n openOnFocus: () => void;\n openWithDelay: () => void;\n closeWithDelay: () => void;\n cancelClose: () => void;\n notePressStart: () => void;\n onClick: () => void;\n}\n\nconst TriggerContext = createContext<HoverCardTriggerContext>({\n isHoverMode: true,\n openOnFocus: () => {},\n openWithDelay: () => {},\n closeWithDelay: () => {},\n cancelClose: () => {},\n notePressStart: () => {},\n onClick: () => {},\n});\n\nexport type HoverCardTriggerProps = ComponentPropsWithoutRef<\n typeof RadixPopover.Trigger\n>;\n\nconst HoverCardTrigger = forwardRef<HTMLButtonElement, HoverCardTriggerProps>(\n (\n {\n children,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n onBlur,\n onPointerDown,\n onKeyDown,\n onClick,\n ...props\n },\n ref,\n ) => {\n const ctx = useContext(TriggerContext);\n const { triggerRef } = useContext(RootContext);\n\n const setRefs = useCallback(\n (node: HTMLButtonElement | null) => {\n triggerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref, triggerRef],\n );\n\n return (\n <RadixPopover.Trigger\n ref={setRefs}\n onMouseEnter={(event) => {\n if (ctx.isHoverMode) ctx.openWithDelay();\n onMouseEnter?.(event);\n }}\n onMouseLeave={(event) => {\n if (ctx.isHoverMode) ctx.closeWithDelay();\n onMouseLeave?.(event);\n }}\n onFocus={(event) => {\n if (ctx.isHoverMode) ctx.openOnFocus();\n onFocus?.(event);\n }}\n onBlur={(event) => {\n if (ctx.isHoverMode) ctx.closeWithDelay();\n onBlur?.(event);\n }}\n onPointerDown={(event) => {\n ctx.notePressStart();\n onPointerDown?.(event);\n }}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') ctx.notePressStart();\n onKeyDown?.(event);\n }}\n onClick={(event) => {\n // Own the toggle outright: Radix's own click toggle would close a\n // card that this very press had just opened via focus.\n event.preventDefault();\n ctx.onClick();\n onClick?.(event);\n }}\n {...props}\n >\n {children}\n </RadixPopover.Trigger>\n );\n },\n);\nHoverCardTrigger.displayName = 'HoverCard.Trigger';\n\nexport type HoverCardAnchorProps = ComponentPropsWithoutRef<\n typeof RadixPopover.Anchor\n>;\n\nconst HoverCardAnchor = forwardRef<\n ElementRef<typeof RadixPopover.Anchor>,\n HoverCardAnchorProps\n>((props, ref) => {\n const { triggerRef } = useContext(RootContext);\n const setRefs = useCallback(\n (node: ElementRef<typeof RadixPopover.Anchor> | null) => {\n triggerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref, triggerRef],\n );\n\n return <RadixPopover.Anchor ref={setRefs} {...props} />;\n});\nHoverCardAnchor.displayName = 'HoverCard.Anchor';\n\n/* -------------------------------------------------------------------- */\n/* Content */\n/* -------------------------------------------------------------------- */\n\nexport interface HoverCardContentProps\n extends\n Omit<\n ComponentPropsWithoutRef<typeof RadixPopover.Content>,\n 'side' | 'align'\n >,\n VariantProps<typeof contentVariants> {\n /** Logical side, resolved against the reading direction. Default `'top'`. */\n side?: HoverCardSide;\n align?: 'start' | 'center' | 'end';\n size?: 'sm' | 'md' | 'lg';\n padding?: 'default' | 'flush';\n /** Render the arrow. Default `true`. */\n showArrow?: boolean;\n /** Render a close button, for touch users on a card with actions. */\n showClose?: boolean;\n /**\n * An action pinned to the top-end corner — the same slot `showClose` uses.\n * For a card whose ANCHOR has a real open action, so the card mirrors it\n * instead of describing it in prose (\"Click to open …\"). Only give a card\n * one when the trigger genuinely opens something; a card that merely points\n * somewhere else should say so in a hint line, because an icon button there\n * promises a click the anchor does not have.\n *\n * A card carrying one must be interactive — the pointer has to be able to\n * travel into it — so do not combine it with a pointer-events-none peek.\n */\n headerAction?: ReactNode;\n className?: string;\n children: ReactNode;\n}\n\nconst HoverCardContent = forwardRef<HTMLDivElement, HoverCardContentProps>(\n (\n {\n side = 'top',\n align = 'center',\n size = 'md',\n padding = 'default',\n showArrow = true,\n showClose = false,\n headerAction,\n dir: providedDirection,\n className,\n children,\n onOpenAutoFocus,\n onCloseAutoFocus,\n onMouseEnter,\n onMouseLeave,\n onFocusCapture,\n ...props\n },\n ref,\n ) => {\n const { headingId } = useContext(A11yContext);\n const root = useContext(RootContext);\n const { t } = useTranslation();\n const [isRtl, setIsRtl] = useState(false);\n const localRef = useRef<HTMLDivElement | null>(null);\n\n const setRefs = useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n root.registerContent(node);\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref, root],\n );\n\n // Read direction from the TRIGGER, not from this content: the content is\n // portalled to body, where `closest('[dir]')` can only ever find <html>.\n // Reading the trigger lets one RTL region inside an LTR page resolve\n // start/end correctly.\n useEffect(() => {\n const anchor = root.triggerRef.current;\n const scoped = anchor?.closest('[dir]');\n const resolved =\n scoped?.getAttribute('dir') ?? document.documentElement.dir ?? 'ltr';\n setIsRtl(resolved === 'rtl');\n }, [root.triggerRef]);\n\n const contentDirection = providedDirection ?? (isRtl ? 'rtl' : 'ltr');\n const directionIsRtl = contentDirection === 'rtl';\n const physicalSide = resolvePhysicalSide(side, directionIsRtl);\n // Radix resolves `align` physically unless a DirectionProvider is present,\n // which the kit does not mount. On the block axis (a card on the inline\n // start or end) align is unaffected by direction; on the inline axis it\n // must be mirrored by hand so `align=\"start\"` means the reading start.\n const isInlineAxis = physicalSide === 'top' || physicalSide === 'bottom';\n const physicalAlign =\n directionIsRtl && isInlineAxis && align !== 'center'\n ? align === 'start'\n ? 'end'\n : 'start'\n : align;\n\n return (\n <RadixPopover.Portal>\n <RadixPopover.Content\n ref={setRefs}\n dir={contentDirection}\n side={physicalSide}\n align={physicalAlign}\n sideOffset={8}\n collisionPadding={8}\n aria-labelledby={headingId}\n className={contentVariants({ size, padding, className })}\n data-component=\"hover-card\"\n data-component-id={root.instanceId}\n onOpenAutoFocus={(event) => {\n // A hover-opened card must not take focus; a click- or\n // Enter-opened one must, or the footer actions are unreachable.\n if (root.shouldFocusOnOpen()) root.noteMovedFocus();\n else event.preventDefault();\n onOpenAutoFocus?.(event);\n }}\n onCloseAutoFocus={(event) => {\n // Only hand focus back if we took it in the first place, and warn\n // the trigger that the focus it is about to receive is a return.\n if (root.didMoveFocus()) root.noteFocusReturn();\n else event.preventDefault();\n root.clearMovedFocus();\n onCloseAutoFocus?.(event);\n }}\n onMouseEnter={(event) => {\n root.cancelClose();\n onMouseEnter?.(event);\n }}\n onMouseLeave={(event) => {\n root.closeWithDelay();\n onMouseLeave?.(event);\n }}\n onFocusCapture={(event) => {\n root.cancelClose();\n onFocusCapture?.(event);\n }}\n {...props}\n >\n <PaddingContext.Provider value={padding}>\n {children}\n </PaddingContext.Provider>\n {showClose || headerAction ? (\n <div\n className={[\n 'ds:absolute ds:top-[var(--spacing-sm)] ds:end-[var(--spacing-sm)]',\n 'ds:z-[1] ds:flex ds:items-center ds:gap-[var(--spacing-2xs)]',\n ].join(' ')}\n >\n {headerAction}\n {showClose ? (\n <RadixPopover.Close asChild>\n <IconButton\n icon={<X />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={t('common.close', 'Close')}\n />\n </RadixPopover.Close>\n ) : null}\n </div>\n ) : null}\n {showArrow ? (\n // Radix places the arrow on the resolved side and keeps it over\n // the trigger through collision flip and shift.\n //\n // A custom path, not the default polygon, so the card's OUTLINE\n // carries on around the point instead of stopping dead at it. The\n // path is left open (no `Z`), so the fill closes the triangle\n // while the stroke draws only the two slanted sides — a closed\n // path would rule a line straight across the arrow's base.\n // `-translate-y-px` then tucks that base a hairline under the\n // card, so the card's own border does not show through it. The\n // translate is applied inside Radix's rotation wrapper, so \"up\"\n // means \"towards the card\" on every side.\n <RadixPopover.Arrow asChild width={12} height={6}>\n <svg\n viewBox=\"0 0 12 6\"\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n className=\"ds:-translate-y-px ds:fill-[var(--popover)] ds:stroke-[color:var(--card-border)]\"\n >\n <path d=\"M0 0 L6 6 L12 0\" strokeLinejoin=\"round\" />\n </svg>\n </RadixPopover.Arrow>\n ) : null}\n </RadixPopover.Content>\n </RadixPopover.Portal>\n );\n },\n);\nHoverCardContent.displayName = 'HoverCard.Content';\n\n/* -------------------------------------------------------------------- */\n/* Slots */\n/* -------------------------------------------------------------------- */\n\n/** The media slot: an avatar row, a thumbnail, or a banner. Under\n * `padding=\"flush\"` it bleeds to the card's edge. */\nconst HoverCardMedia = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"media\"\n className={['ds:flex ds:items-center ds:gap-[var(--spacing-sm)]', className]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n));\nHoverCardMedia.displayName = 'HoverCard.Media';\n\n/**\n * The card's category line, above the heading: \"Signing\", \"Billing\",\n * \"Anamnesis\". It says WHICH KIND of thing the reader is looking at, so a\n * card that appears under the pointer is self-describing without repeating\n * the chip's own words in the heading.\n *\n * Decorative by role: the heading carries the meaning and the accessible\n * name, so the eyebrow is quiet type and adds no landmark of its own.\n */\nconst HoverCardEyebrow = forwardRef<\n HTMLParagraphElement,\n HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n data-slot=\"eyebrow\"\n className={[\n 'ds:m-0 type-eyebrow ds:text-[color:var(--muted-foreground)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n));\nHoverCardEyebrow.displayName = 'HoverCard.Eyebrow';\n\nexport interface HoverCardHeadingProps extends HTMLAttributes<HTMLHeadingElement> {\n as?: 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n}\n\nconst HoverCardHeading = forwardRef<HTMLHeadingElement, HoverCardHeadingProps>(\n ({ as: Tag = 'h3', id: providedId, className, ...props }, ref) => {\n const generatedId = useId();\n const headingId = providedId ?? generatedId;\n const { setHeadingId } = useContext(A11yContext);\n const padding = useContext(PaddingContext);\n\n useEffect(() => {\n setHeadingId(headingId);\n return () => setHeadingId(undefined);\n }, [headingId, setHeadingId]);\n\n return (\n <Tag\n ref={ref}\n id={headingId}\n data-slot=\"heading\"\n className={[\n 'type-title-item ds:leading-snug ds:break-words',\n padding === 'flush'\n ? 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-md)]'\n : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n );\n },\n);\nHoverCardHeading.displayName = 'HoverCard.Heading';\n\n/** The body slot. A `div`, not a `p`: a hover card body routinely holds\n * KeyValuePairs and chips, and a `p` may only contain phrasing content. */\nconst HoverCardBody = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const padding = useContext(PaddingContext);\n\n return (\n <div\n ref={ref}\n data-slot=\"body\"\n className={[\n 'type-body-sm ds:text-[var(--muted-foreground)]',\n 'ds:mt-[var(--spacing-xs)]',\n padding === 'flush'\n ? 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pb-[var(--spacing-md)]'\n : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n );\n});\nHoverCardBody.displayName = 'HoverCard.Body';\n\n/** The action row. Actions sit at the inline end; anything that should stay at\n * the inline start (a status badge) gets `ds:me-auto`. */\nconst HoverCardFooter = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const padding = useContext(PaddingContext);\n\n return (\n <div\n ref={ref}\n data-slot=\"footer\"\n className={[\n 'ds:flex ds:flex-wrap ds:items-center ds:justify-end',\n 'ds:gap-[var(--spacing-sm)]',\n 'ds:border-t ds:border-[color:var(--card-border)]',\n padding === 'flush'\n ? 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]'\n : 'ds:mt-[var(--spacing-md)] ds:pt-[var(--spacing-md)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n );\n});\nHoverCardFooter.displayName = 'HoverCard.Footer';\n\n/* -------------------------------------------------------------------- */\n\nexport const HoverCard = Object.assign(HoverCardRoot, {\n Root: HoverCardRoot,\n Trigger: HoverCardTrigger,\n // Anchor the card to an arbitrary element when a trigger button is\n // unsuitable, such as a calendar grid cell.\n Anchor: HoverCardAnchor,\n Content: HoverCardContent,\n Media: HoverCardMedia,\n Eyebrow: HoverCardEyebrow,\n Heading: HoverCardHeading,\n Body: HoverCardBody,\n Footer: HoverCardFooter,\n});\n"],"names":["hoverCardAgent","handle","resolvePhysicalSide","logicalSide","isRtl","A11yContext","createContext","RootContext","PaddingContext","contentVariants","cva","HoverCardRoot","children","openOn","controlledOpen","defaultOpen","onOpenChange","openDelay","closeDelay","id","internalOpen","setInternalOpen","useState","isControlled","isOpen","setOpen","useCallback","next","isOpenRef","useRef","useEffect","timerRef","clearTimer","focusOnOpenRef","movedFocusRef","contentRef","triggerRef","openWithDelay","closeWithDelay","suppressFocusOpenRef","suppressTimerRef","noteFocusReturn","openOnFocus","focusContent","_a","focusWasInsideRef","notePressStart","content","handleTriggerClick","focusWasInside","agentHandle","useMemo","useAgentRegistration","headingId","setHeadingId","isHoverMode","rootValue","node","triggerValue","jsx","TriggerContext","RadixPopover","HoverCardTrigger","forwardRef","onMouseEnter","onMouseLeave","onFocus","onBlur","onPointerDown","onKeyDown","onClick","props","ref","ctx","useContext","setRefs","event","HoverCardAnchor","HoverCardContent","side","align","size","padding","showArrow","showClose","headerAction","providedDirection","className","onOpenAutoFocus","onCloseAutoFocus","onFocusCapture","root","t","useTranslation","setIsRtl","localRef","anchor","scoped","resolved","contentDirection","directionIsRtl","physicalSide","physicalAlign","jsxs","IconButton","X","HoverCardMedia","HoverCardEyebrow","HoverCardHeading","Tag","providedId","generatedId","useId","HoverCardBody","HoverCardFooter","HoverCard"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { jsx as r } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as b } from "react";
|
|
3
3
|
import { B as u } from "./button-nJaPh_HC.js";
|
|
4
4
|
import { c as p } from "./index-D2ZczOXr.js";
|
|
5
|
-
import { T as h } from "./tooltip-
|
|
5
|
+
import { T as h } from "./tooltip-Cp-PLePW.js";
|
|
6
6
|
const g = p(
|
|
7
7
|
[
|
|
8
8
|
"ds:p-0",
|
|
@@ -75,4 +75,4 @@ x.displayName = "IconButton";
|
|
|
75
75
|
export {
|
|
76
76
|
x as I
|
|
77
77
|
};
|
|
78
|
-
//# sourceMappingURL=icon-button-
|
|
78
|
+
//# sourceMappingURL=icon-button-8xqRnkdG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon-button-
|
|
1
|
+
{"version":3,"file":"icon-button-8xqRnkdG.js","sources":["../../src/components/button/icon-button.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { Button, type ButtonProps } from './button';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Tooltip } from '../tooltip';\n\nconst iconButtonVariants = cva(\n [\n 'ds:p-0',\n // Active-state styling when an IconButton participates in an\n // IconButtonGroup's `toggle-single` / `toggle-multi` mode. The\n // group sets `aria-checked=\"true\"` (radiogroup) or\n // `aria-pressed=\"true\"` (toolbar/group) on the selected child;\n // without these utility classes the selection wouldn't read at a\n // glance — see HeaderSettings' Appearance row + ThemeToggle's\n // split variant.\n 'ds:aria-checked:bg-muted ds:aria-checked:text-foreground',\n 'ds:aria-checked:border-primary',\n 'ds:aria-pressed:bg-muted ds:aria-pressed:text-foreground',\n 'ds:aria-pressed:border-primary',\n ].join(' '),\n {\n variants: {\n size: {\n // `sm` (32px) and `md` (40px) sit below `--min-target-size` (44/48px).\n // IconButton overrides Button's `size` variant, so it doesn't inherit\n // Button's touch-target `::before`. Re-add it here for the under-target\n // sizes: a transparent pseudo-element expands the *hit area* to\n // `--min-target-size` on touch / small screens, then is hidden from the\n // `sm:` breakpoint up (desktop pointer input keeps the compact box, so\n // there's no visual/layout change on the desktop Chromatic baselines).\n // `lg` (48px) already clears the target, so it needs no expansion.\n sm: 'ds:w-8 ds:h-8 ds:before:absolute ds:before:inset-x-[calc((var(--min-target-size)-100%)/-2)] ds:before:inset-y-[calc((var(--min-target-size)-100%)/-2)] ds:before:content-[\"\"] ds:sm:before:hidden',\n md: 'ds:w-10 ds:h-10 ds:before:absolute ds:before:inset-x-[calc((var(--min-target-size)-100%)/-2)] ds:before:inset-y-[calc((var(--min-target-size)-100%)/-2)] ds:before:content-[\"\"] ds:sm:before:hidden',\n lg: 'ds:w-12 ds:h-12',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nexport type IconButtonProps = Omit<\n ButtonProps,\n 'startIcon' | 'endIcon' | 'children' | 'size' | 'flipIconInRtl'\n> &\n VariantProps<typeof iconButtonVariants> & {\n icon: React.ReactNode;\n tooltip?: string;\n 'aria-label'?: string;\n /**\n * Mirror the icon horizontally in RTL. Default `false` — only enable\n * for directional glyphs (arrows, chevrons). See Button.flipIconInRtl.\n */\n flipIconInRtl?: boolean;\n };\n\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n {\n icon,\n size,\n intent = 'outline',\n className,\n tooltip,\n flipIconInRtl = false,\n ...props\n },\n ref,\n ) => {\n const ariaLabel = props['aria-label'] || tooltip;\n\n if (import.meta.env.DEV && !ariaLabel) {\n console.warn(\n 'IconButton: aria-label or tooltip prop is required for accessibility.',\n );\n }\n\n const iconSizeClass =\n size === 'sm'\n ? 'ds:size-4'\n : size === 'lg'\n ? 'ds:size-5'\n : 'ds:size-[18px]';\n const iconFlipClass = flipIconInRtl ? 'ds:rtl:rotate-180' : '';\n\n const button = (\n <Button\n ref={ref}\n size={size}\n intent={intent}\n className={iconButtonVariants({ size, className })}\n aria-label={ariaLabel}\n data-component=\"icon-button\"\n {...props}\n >\n <span\n aria-hidden=\"true\"\n className={`ds:inline-flex ds:items-center ds:justify-center ${iconSizeClass} ${iconFlipClass}`.trim()}\n >\n {icon}\n </span>\n </Button>\n );\n\n if (tooltip) {\n return <Tooltip label={tooltip}>{button}</Tooltip>;\n }\n\n return button;\n },\n);\n\nIconButton.displayName = 'IconButton';\n"],"names":["iconButtonVariants","cva","IconButton","forwardRef","icon","size","intent","className","tooltip","flipIconInRtl","props","ref","ariaLabel","iconSizeClass","iconFlipClass","button","jsx","Button","Tooltip"],"mappings":";;;;;AAKA,MAAMA,IAAqBC;AAAA,EACzB;AAAA,IACE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAAA,IACN;AAAA,IAEF,iBAAiB;AAAA,MACf,MAAM;AAAA,IAAA;AAAA,EACR;AAEJ,GAiBaC,IAAaC;AAAA,EACxB,CACE;AAAA,IACE,MAAAC;AAAA,IACA,MAAAC;AAAA,IACA,QAAAC,IAAS;AAAA,IACT,WAAAC;AAAA,IACA,SAAAC;AAAA,IACA,eAAAC,IAAgB;AAAA,IAChB,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAMC,IAAYF,EAAM,YAAY,KAAKF,GAQnCK,IACJR,MAAS,OACL,cACAA,MAAS,OACP,cACA,kBACFS,IAAgBL,IAAgB,sBAAsB,IAEtDM,IACJ,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,KAAAN;AAAA,QACA,MAAAN;AAAA,QACA,QAAAC;AAAA,QACA,WAAWN,EAAmB,EAAE,MAAAK,GAAM,WAAAE,GAAW;AAAA,QACjD,cAAYK;AAAA,QACZ,kBAAe;AAAA,QACd,GAAGF;AAAA,QAEJ,UAAA,gBAAAM;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAW,oDAAoDH,CAAa,IAAIC,CAAa,GAAG,KAAA;AAAA,YAE/F,UAAAV;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAIJ,WAAII,sBACMU,GAAA,EAAQ,OAAOV,GAAU,UAAAO,GAAO,IAGnCA;AAAA,EACT;AACF;AAEAb,EAAW,cAAc;"}
|
|
@@ -2,7 +2,7 @@ import { jsx as a, jsxs as T } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as Se, useState as W, useCallback as H, useRef as F, Children as be, isValidElement as _, useEffect as ve, cloneElement as ye } from "react";
|
|
3
3
|
import { c as Be } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as Ke } from "react-i18next";
|
|
5
|
-
import { I as he } from "./icon-button-
|
|
5
|
+
import { I as he } from "./icon-button-8xqRnkdG.js";
|
|
6
6
|
import { D as k } from "./dropdown-menu-DU-Hrf33.js";
|
|
7
7
|
import { u as Pe } from "./use-isomorphic-layout-effect-BGfaCOP1.js";
|
|
8
8
|
import { u as Te } from "./use-priority-overflow-c9SjxZkZ.js";
|
|
@@ -412,4 +412,4 @@ function Ge(d, y, m, c) {
|
|
|
412
412
|
export {
|
|
413
413
|
_e as I
|
|
414
414
|
};
|
|
415
|
-
//# sourceMappingURL=icon-button-group-
|
|
415
|
+
//# sourceMappingURL=icon-button-group-Dj6CRoYR.js.map
|
package/dist/_chunks/{icon-button-group-VCCod3Hz.js.map → icon-button-group-Dj6CRoYR.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon-button-group-VCCod3Hz.js","sources":["../../src/components/icon-button-group/icon-button-group.tsx"],"sourcesContent":["import {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n useCallback,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Ellipsis } from 'lucide-react';\nimport { IconButton, type IconButtonProps } from '../button/icon-button';\nimport type { ButtonProps } from '../button/button';\nimport { DropdownMenu } from '../dropdown-menu';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { usePriorityOverflow } from '../../hooks/use-priority-overflow';\n\ntype ButtonIntent = NonNullable<ButtonProps['intent']>;\n\n// Intentionally does NOT compose `@radix-ui/react-toggle-group`. Radix\n// ToggleGroup's render shape makes it hard to layer shared-border chrome\n// across children (first-child / last-child / internal-divider CSS), and\n// the three-mode + three-role matrix (group / toolbar / radiogroup × momentary\n// / toggle-single / toggle-multi) is broader than Radix's single / multi\n// contract. The roving-tabindex implementation below mirrors Radix's pattern\n// so keyboard semantics stay consistent. See 05-accessibility.mdx for the\n// WAI-ARIA toolbar / radiogroup references.\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst iconButtonGroupVariants = cva(\n [\n 'ds:inline-flex ds:isolate',\n // Hairline border around the group unifies the children into one\n // visual unit. Internal child dividers are drawn via the per-child\n // class list below.\n 'ds:border ds:border-border',\n 'ds:rounded-[var(--radius-md)]',\n // Ensure the focus ring of a pressed child sits above its siblings.\n 'ds:[&>*]:relative ds:[&>*:focus-visible]:z-10',\n ].join(' '),\n {\n variants: {\n orientation: {\n horizontal: [\n 'ds:flex-row',\n // Flatten internal corners on children so the outer radius owns\n // the rounded edges.\n 'ds:[&>*:not(:first-child)]:rounded-s-none',\n 'ds:[&>*:not(:last-child)]:rounded-e-none',\n // Internal divider — logical so it flips in RTL.\n 'ds:[&>*:not(:first-child)]:border-s',\n 'ds:[&>*:not(:first-child)]:border-border',\n // The children already own an outer border (from IconButton's\n // own border in secondary/outline variants). Collapse the doubled\n // border so we don't get a 2px seam.\n 'ds:[&>*]:border-0',\n ].join(' '),\n vertical: [\n 'ds:flex-col',\n // Vertical groups flow block-wise. Reading direction doesn't\n // invert vertical stacks in any locale this DS targets, so the\n // physical `rounded-t/b` is intentional.\n 'ds:[&>*:not(:first-child)]:rounded-t-none',\n 'ds:[&>*:not(:last-child)]:rounded-b-none',\n 'ds:[&>*:not(:first-child)]:border-t',\n 'ds:[&>*:not(:first-child)]:border-border',\n 'ds:[&>*]:border-0',\n ].join(' '),\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n },\n);\n\n// Hidden measurement rows: laid out (so widths are real) but invisible,\n// non-interactive and out of the a11y tree. Never display:none.\nconst MEASURE_ROW_CLASSES =\n 'ds:absolute ds:start-0 ds:top-0 ds:invisible ds:pointer-events-none';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type IconButtonGroupRole = 'group' | 'toolbar' | 'radiogroup';\nexport type IconButtonGroupMode =\n | 'momentary'\n | 'toggle-single'\n | 'toggle-multi';\n\ntype SharedPropsBase = {\n /** Forwarded to every child that does not set its own `size`. */\n size?: 'sm' | 'md' | 'lg';\n orientation?: 'horizontal' | 'vertical';\n /** Disables every child. Uses `aria-disabled` on children (not the HTML\n * attribute) so each child still takes focus — matches WAI-ARIA toolbar\n * guidance. Visual disabled styling picks up the `aria-disabled:*`\n * variant declared on the Button base class. */\n disabled?: boolean;\n /** Intent applied to every child that does not set its own `intent`.\n * Defaults to `outline` — grouped icon buttons are peers, not a row\n * of solid-primary CTAs. */\n intent?: ButtonIntent;\n /** `'menu'` keeps the strip on one line whatever the container width:\n * children that stop fitting move into a dropdown behind an ellipsis\n * trigger, preserving toggle semantics (radio / checkbox items). The\n * group then fills its container's inline size. Horizontal only.\n * Children set `data-overflow-pin` to always stay in the strip. */\n overflow?: 'none' | 'menu';\n children: ReactNode;\n};\n\n// At least one of `aria-label` / `aria-labelledby` must be present. This\n// discriminated pair makes the TypeScript compiler reject a group with\n// neither — see the a11y acceptance criteria in the user story.\ntype AccessibleNameProps =\n | { 'aria-label': string; 'aria-labelledby'?: never }\n | { 'aria-label'?: never; 'aria-labelledby': string };\n\ntype SharedProps = SharedPropsBase & AccessibleNameProps;\n\n// Role + mode combinations are not all valid. Encoded via a discriminated\n// union so the compiler rejects nonsensical pairings (e.g. a multi-select\n// radiogroup).\ntype GroupRoleProps =\n | { role?: 'group'; mode?: 'momentary' | 'toggle-single' | 'toggle-multi' }\n | { role: 'toolbar'; mode?: 'momentary' | 'toggle-single' | 'toggle-multi' }\n | { role: 'radiogroup'; mode: 'toggle-single' };\n\ntype MomentaryProps = SharedProps & {\n mode?: 'momentary';\n value?: never;\n defaultValue?: never;\n onValueChange?: never;\n};\n\ntype ToggleSingleProps = SharedProps & {\n mode: 'toggle-single';\n value?: string;\n defaultValue?: string;\n onValueChange?: (next: string) => void;\n};\n\ntype ToggleMultiProps = SharedProps & {\n mode: 'toggle-multi';\n value?: string[];\n defaultValue?: string[];\n onValueChange?: (next: string[]) => void;\n};\n\nexport type IconButtonGroupProps = (\n | MomentaryProps\n | ToggleSingleProps\n | ToggleMultiProps\n) &\n GroupRoleProps &\n Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'onChange' | 'children'> &\n VariantProps<typeof iconButtonGroupVariants>;\n\n/* ------------------------------------------------------------------ */\n/* IconButtonGroup */\n/* ------------------------------------------------------------------ */\n\nexport const IconButtonGroup = forwardRef<HTMLDivElement, IconButtonGroupProps>(\n (props, ref) => {\n const {\n size,\n orientation = 'horizontal',\n role = 'group',\n mode = 'momentary',\n disabled = false,\n intent = 'outline',\n overflow = 'none',\n className,\n children,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n // Controlled-value props are consumed via `props as …` below; strip them\n // here so they never spread onto the root <div> (React would warn that\n // `onValueChange` is an unknown DOM event handler).\n value: _value,\n defaultValue: _defaultValue,\n onValueChange: _onValueChange,\n ...rest\n } = props as IconButtonGroupProps & { className?: string };\n const { t } = useTranslation();\n\n if (import.meta.env.DEV && !ariaLabel && !ariaLabelledBy) {\n console.warn(\n 'IconButtonGroup: `aria-label` or `aria-labelledby` is required for accessibility.',\n );\n }\n if (\n import.meta.env.DEV &&\n overflow === 'menu' &&\n orientation === 'vertical'\n ) {\n console.warn(\n 'IconButtonGroup: overflow=\"menu\" is horizontal-only; falling back to overflow=\"none\".',\n );\n }\n const overflowEnabled = overflow === 'menu' && orientation !== 'vertical';\n\n /* ---- Controlled / uncontrolled value for toggle modes --------- */\n const [internalValue, setInternalValue] = useState<string | string[]>(\n () => {\n if (mode === 'toggle-single') {\n const p = props as ToggleSingleProps;\n return p.defaultValue ?? '';\n }\n if (mode === 'toggle-multi') {\n const p = props as ToggleMultiProps;\n return p.defaultValue ?? [];\n }\n return '';\n },\n );\n\n const resolvedValue: string | string[] = (() => {\n if (mode === 'toggle-single') {\n const p = props as ToggleSingleProps;\n return p.value !== undefined ? p.value : internalValue;\n }\n if (mode === 'toggle-multi') {\n const p = props as ToggleMultiProps;\n return p.value !== undefined ? p.value : internalValue;\n }\n return '';\n })();\n\n const commitValue = useCallback(\n (next: string | string[]) => {\n if (mode === 'toggle-single') {\n const p = props as ToggleSingleProps;\n if (p.value === undefined) setInternalValue(next as string);\n p.onValueChange?.(next as string);\n } else if (mode === 'toggle-multi') {\n const p = props as ToggleMultiProps;\n if (p.value === undefined) setInternalValue(next as string[]);\n p.onValueChange?.(next as string[]);\n }\n },\n [mode, props],\n );\n\n /* ---- Roving tabindex state — only active in toolbar / radiogroup - */\n const rovingTabindex = role === 'toolbar' || role === 'radiogroup';\n const buttonsRef = useRef<Array<HTMLButtonElement | null>>([]);\n const [focusIndex, setFocusIndex] = useState(0);\n\n const registerIndex = useCallback(\n (index: number, el: HTMLButtonElement | null) => {\n buttonsRef.current[index] = el;\n },\n [],\n );\n\n const rootRef = useRef<HTMLDivElement | null>(null);\n const [isRTL, setIsRTL] = useState(false);\n // `useLayoutEffect` so the direction is correct BEFORE the first paint\n // (otherwise a user pressing an arrow key on the first frame after mount\n // would hit the default-LTR mapping even in an RTL document).\n useIsomorphicLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n const node = rootRef.current;\n if (!node) return;\n // Read the computed direction from the group's own wrapper so a\n // scoped `dir='rtl'` on any ancestor (not just <html>) flips arrow\n // navigation. `getComputedStyle` walks up automatically.\n const dir = window.getComputedStyle(node).direction;\n setIsRTL(dir === 'rtl');\n }, []);\n\n /* ---- Arrow-key navigation for roving tabindex ----------------- */\n const handleRootKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (!rovingTabindex) return;\n const count = buttonsRef.current.filter(Boolean).length;\n if (count === 0) return;\n\n const forwardKey =\n orientation === 'vertical'\n ? 'ArrowDown'\n : isRTL\n ? 'ArrowLeft'\n : 'ArrowRight';\n const backwardKey =\n orientation === 'vertical'\n ? 'ArrowUp'\n : isRTL\n ? 'ArrowRight'\n : 'ArrowLeft';\n\n let next: number | null = null;\n if (event.key === forwardKey) next = (focusIndex + 1) % count;\n else if (event.key === backwardKey)\n next = (focusIndex - 1 + count) % count;\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = count - 1;\n\n if (next === null) return;\n // Skip over disabled children.\n const maxAttempts = count;\n let attempts = 0;\n let candidate = next;\n while (attempts < maxAttempts) {\n const el = buttonsRef.current[candidate];\n if (\n el &&\n el.getAttribute('aria-disabled') !== 'true' &&\n !el.disabled\n ) {\n break;\n }\n candidate =\n event.key === backwardKey || event.key === 'End'\n ? (candidate - 1 + count) % count\n : (candidate + 1) % count;\n attempts += 1;\n }\n event.preventDefault();\n setFocusIndex(candidate);\n buttonsRef.current[candidate]?.focus();\n // WAI-ARIA radiogroup pattern: arrow keys MOVE focus AND CHANGE\n // the selected radio in one action. toolbar pattern (and plain\n // group) only moves focus.\n if (role === 'radiogroup' && mode === 'toggle-single') {\n const child = childArrayRef.current[candidate];\n if (child && typeof child === 'object' && 'props' in child) {\n const cValue = (child as ReactElement<{ value?: string }>).props\n .value;\n // Same guard as the click path: re-committing the already\n // selected value is a no-op, so Home/End on the selected radio\n // never fires a spurious onValueChange.\n if (cValue && cValue !== resolvedValue) commitValue(cValue);\n }\n }\n },\n [\n rovingTabindex,\n orientation,\n isRTL,\n focusIndex,\n role,\n mode,\n commitValue,\n resolvedValue,\n ],\n );\n\n /* ---- Overflow bookkeeping (menu mode only) --------------------- */\n type OverflowChildProps = IconButtonProps & {\n value?: string;\n 'data-overflow-pin'?: boolean | 'true' | '';\n };\n const allElements = overflowEnabled\n ? (Children.toArray(children).filter(isValidElement) as Array<\n ReactElement<OverflowChildProps>\n >)\n : [];\n const mirrorLabel = (child: ReactElement<OverflowChildProps>) => {\n const aria = child.props['aria-label'];\n if (typeof aria === 'string') return aria;\n return typeof child.props.tooltip === 'string'\n ? child.props.tooltip\n : null;\n };\n const warnedRef = useRef(false);\n const pinnedFlags = allElements.map((child) => {\n const explicit = child.props['data-overflow-pin'] !== undefined;\n const mirrorable = mirrorLabel(child) !== null;\n if (\n import.meta.env.DEV &&\n !explicit &&\n !mirrorable &&\n !warnedRef.current\n ) {\n warnedRef.current = true;\n console.warn(\n 'IconButtonGroup: a child without aria-label / tooltip cannot move into the overflow menu — it stays pinned in the strip.',\n );\n }\n return explicit || !mirrorable;\n });\n\n const { containerRef, fullRowRef, triggerProbeRef, visible, overflowing } =\n usePriorityOverflow({\n enabled: overflowEnabled,\n count: allElements.length,\n pinned: pinnedFlags,\n });\n\n const triggerNodeRef = useRef<HTMLButtonElement | null>(null);\n\n /* ---- Build enhanced children ---------------------------------- */\n const childArray = overflowEnabled\n ? allElements.filter((_, i) => visible[i])\n : Children.toArray(children);\n if (overflowEnabled) {\n buttonsRef.current.length = childArray.length + (overflowing ? 1 : 0);\n }\n // Mirror into a ref so the keydown handler (referenced from Memo deps)\n // can read the latest child list without inflating the dep array.\n const childArrayRef = useRef<ReturnType<typeof Children.toArray>>([]);\n childArrayRef.current = childArray;\n\n // APG radiogroup pattern: Tab must land on the CHECKED radio, not the\n // first one. Keep the roving tab stop pinned to the selected child —\n // covers initial mount (checked child not first) and controlled value\n // changes. Arrow/click interactions already align focusIndex with the\n // selection, so this effect is a no-op for them.\n const checkedIndex =\n role === 'radiogroup' && mode === 'toggle-single'\n ? childArray.findIndex(\n (child) =>\n isValidElement(child) &&\n (child as ReactElement<{ value?: string }>).props.value ===\n resolvedValue,\n )\n : -1;\n useEffect(() => {\n if (checkedIndex >= 0) setFocusIndex(checkedIndex);\n }, [checkedIndex]);\n\n const visibleCount = childArray.length;\n // Clamp the roving focus when items move into the menu; hand real focus\n // to the trigger only when the focused node was the one that left.\n useEffect(() => {\n if (!rovingTabindex || !overflowEnabled) return;\n const total = visibleCount + (overflowing ? 1 : 0);\n if (total > 0 && focusIndex >= total) {\n setFocusIndex(total - 1);\n if (document.activeElement === document.body) {\n triggerNodeRef.current?.focus();\n }\n }\n }, [\n rovingTabindex,\n overflowEnabled,\n visibleCount,\n overflowing,\n focusIndex,\n ]);\n\n /* The roving tabindex seeds at 0, but an HTML-disabled child takes\n no tabindex at all — if the first children are disabled (a Save\n that is not yet committable, say) Tab could not enter the group\n and its remaining buttons became unreachable. Seed on the first\n child that can actually hold focus; the arrow keys already skip\n disabled children the same way. */\n /* `loading` counts: Button renders `disabled={disabled || loading}`,\n so a leading loading child takes no tab stop either. */\n const childIsDisabled = (child: unknown): boolean => {\n if (!isValidElement(child)) return false;\n const props = (\n child as ReactElement<{\n disabled?: boolean;\n loading?: boolean;\n }>\n ).props;\n return props.disabled === true || props.loading === true;\n };\n const firstFocusable = childArray.findIndex((c) => !childIsDisabled(c));\n const effectiveFocusIndex = !childIsDisabled(childArray[focusIndex])\n ? focusIndex\n : firstFocusable !== -1\n ? firstFocusable\n : /* Every visible child is disabled: the overflow trigger is the\n only thing left that can hold focus. Without this the group\n has no tab stop at all and the menu is unreachable. */\n overflowing\n ? visibleCount\n : focusIndex;\n\n const enhanced = childArray.map((child, index) => {\n if (!isValidElement(child)) {\n if (import.meta.env.DEV) {\n console.warn(\n 'IconButtonGroup: children should be <IconButton> elements.',\n );\n }\n return child;\n }\n\n const childEl = child as ReactElement<\n IconButtonProps & {\n value?: string;\n asChild?: boolean;\n children?: ReactNode;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n }\n >;\n\n // DEV-time sanity: warn if we got something that isn't an IconButton.\n // `React.cloneElement` would still work, but IconButton-specific\n // props (::before target size, forwarded tooltip) wouldn't apply.\n // `asChild` wrappers (e.g. DropdownMenu.Trigger) are fine when they\n // Slot-merge the cloned props onto their own IconButton child, as are\n // components that declare a static `rendersIconButton` marker (the\n // DataTable toolbar leaves — each renders one IconButton trigger and\n // forwards ref/tabIndex/onFocus to it).\n if (import.meta.env.DEV && childEl.type !== IconButton) {\n const slotChild =\n childEl.props.asChild === true ? childEl.props.children : null;\n const wrapsIconButton =\n isValidElement(slotChild) && slotChild.type === IconButton;\n const rendersIconButton =\n (childEl.type as { rendersIconButton?: boolean })\n .rendersIconButton === true;\n if (!wrapsIconButton && !rendersIconButton) {\n console.warn(\n 'IconButtonGroup: each child should be a DS <IconButton>. Other elements break target-size + focus-ring contracts.',\n );\n }\n }\n\n const childValue = childEl.props.value;\n\n // Compute aria-pressed / aria-checked for toggle modes.\n const { ariaPressed, ariaChecked } = computeToggleAria(\n mode,\n role,\n childValue,\n resolvedValue,\n );\n\n const groupDisabled = disabled === true;\n const childDisabled = childEl.props.disabled === true;\n\n // Click handling — wrap so aria-disabled (group-level) blocks\n // activation, then forward to the child's own onClick.\n const wrappedOnClick: React.MouseEventHandler<HTMLButtonElement> = (\n event,\n ) => {\n // aria-disabled is advisory; the native click still fires. Block\n // it explicitly when the GROUP (not the child) is disabled.\n if (groupDisabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n // Forward to the child's own handler first so consumers can run\n // analytics / preventDefault.\n childEl.props.onClick?.(event);\n if (event.defaultPrevented) return;\n if (!childValue) return;\n if (mode === 'toggle-single') {\n // Contract: exactly one pressed. Clicking the pressed one is a\n // no-op. This matches Radix ToggleGroup type='single' and the\n // radiogroup pattern.\n if (resolvedValue === childValue) return;\n commitValue(childValue);\n } else if (mode === 'toggle-multi') {\n const list = resolvedValue as string[];\n const next = list.includes(childValue)\n ? list.filter((v) => v !== childValue)\n : [...list, childValue];\n commitValue(next);\n }\n };\n\n // cloneElement's typed overload rejects `ref` as a prop, so we\n // build the override bag as `unknown` and cast to the element's\n // prop type. React at runtime routes `ref` via its usual channel.\n const setMergedRef = (node: HTMLButtonElement | null) => {\n registerIndex(index, node);\n const originalRef = (\n childEl as unknown as { ref?: React.Ref<HTMLButtonElement> }\n ).ref;\n if (typeof originalRef === 'function') originalRef(node);\n else if (\n originalRef !== null &&\n originalRef !== undefined &&\n typeof originalRef === 'object'\n ) {\n (\n originalRef as React.MutableRefObject<HTMLButtonElement | null>\n ).current = node;\n }\n };\n\n // Per the user story: group-level disabled injects `aria-disabled`\n // so the child stays focusable; child-level `disabled` still uses\n // the HTML attribute (child's own contract). When both are true\n // we leave the HTML disabled in place (strictest cue wins).\n const ariaDisabled = groupDisabled && !childDisabled ? true : undefined;\n\n // If the group is disabled OR we are in a toggle mode, we need the\n // wrapped click handler. In pure momentary mode with no group\n // disable, the child's own onClick is passed through unchanged.\n const needsWrappedClick = mode !== 'momentary' || groupDisabled;\n\n const overrides = {\n intent: childEl.props.intent ?? intent,\n size: childEl.props.size ?? size,\n disabled: childDisabled,\n 'aria-disabled': ariaDisabled,\n onClick: needsWrappedClick ? wrappedOnClick : childEl.props.onClick,\n 'aria-pressed': ariaPressed,\n 'aria-checked': ariaChecked,\n // When the group is a radiogroup, children must be `role=\"radio\"`\n // so screen readers announce them as radio buttons and so\n // `getByRole('radio')` works in tests. The button element is\n // re-purposed as a radio; `aria-checked` above carries the state.\n role: role === 'radiogroup' ? 'radio' : undefined,\n tabIndex: rovingTabindex\n ? index === effectiveFocusIndex\n ? 0\n : -1\n : undefined,\n onFocus: (ev: React.FocusEvent<HTMLButtonElement>) => {\n if (rovingTabindex) setFocusIndex(index);\n childEl.props.onFocus?.(ev);\n },\n ref: setMergedRef,\n } as unknown as Partial<IconButtonProps>;\n\n return cloneElement(childEl, overrides);\n });\n\n const mergedRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref && typeof ref === 'object') {\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n };\n\n if (!overflowEnabled) {\n return (\n <div\n ref={mergedRootRef}\n role={role}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-orientation={role === 'toolbar' ? orientation : undefined}\n onKeyDown={handleRootKeyDown}\n className={iconButtonGroupVariants({ orientation, className })}\n data-component=\"icon-button-group\"\n {...rest}\n >\n {enhanced}\n </div>\n );\n }\n\n /* ---- Menu path: measurement rows + strip + ellipsis trigger ---- */\n const moreLabel = t('buttonGroup.more', 'More options');\n const groupDisabled = disabled === true;\n const overflowItems = allElements\n .map((childEl, i) => ({ childEl, i }))\n .filter(({ i }) => !visible[i]);\n\n let menuContent: ReactNode = null;\n if (mode === 'toggle-single') {\n menuContent = (\n <DropdownMenu.RadioGroup\n value={resolvedValue as string}\n onValueChange={(v) => {\n if (!groupDisabled && v !== resolvedValue) commitValue(v);\n }}\n >\n {overflowItems.map(({ childEl, i }) => (\n <DropdownMenu.RadioItem\n key={childEl.key ?? i}\n value={childEl.props.value ?? ''}\n disabled={groupDisabled || childEl.props.disabled === true}\n >\n {mirrorLabel(childEl)}\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n );\n } else if (mode === 'toggle-multi') {\n menuContent = overflowItems.map(({ childEl, i }) => {\n const v = childEl.props.value;\n const list = resolvedValue as string[];\n const checked = v ? list.includes(v) : false;\n return (\n <DropdownMenu.CheckboxItem\n key={childEl.key ?? i}\n checked={checked}\n disabled={groupDisabled || childEl.props.disabled === true}\n onCheckedChange={() => {\n if (groupDisabled || !v) return;\n commitValue(checked ? list.filter((x) => x !== v) : [...list, v]);\n }}\n >\n {mirrorLabel(childEl)}\n </DropdownMenu.CheckboxItem>\n );\n });\n } else {\n menuContent = overflowItems.map(({ childEl, i }) => (\n <DropdownMenu.Item\n key={childEl.key ?? i}\n startIcon={childEl.props.icon}\n disabled={groupDisabled || childEl.props.disabled === true}\n onSelect={(event) => {\n childEl.props.onClick?.(\n event as unknown as React.MouseEvent<HTMLButtonElement>,\n );\n }}\n >\n {mirrorLabel(childEl)}\n </DropdownMenu.Item>\n ));\n }\n\n const trigger = overflowing ? (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n icon={<Ellipsis />}\n intent={intent}\n size={size}\n aria-label={moreLabel}\n ref={(node: HTMLButtonElement | null) => {\n triggerNodeRef.current = node;\n registerIndex(visibleCount, node);\n }}\n tabIndex={\n rovingTabindex\n ? effectiveFocusIndex === visibleCount\n ? 0\n : -1\n : undefined\n }\n onFocus={\n rovingTabindex ? () => setFocusIndex(visibleCount) : undefined\n }\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">{menuContent}</DropdownMenu.Content>\n </DropdownMenu.Root>\n ) : null;\n\n const stripClasses = iconButtonGroupVariants({ orientation });\n // A radiogroup may own only radios, so its trigger sits beside the strip;\n // toolbar / group keep the trigger inside as the last joined control.\n const triggerInside = role !== 'radiogroup';\n const stripDiv = (\n <div\n role={role}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-orientation={role === 'toolbar' ? orientation : undefined}\n onKeyDown={triggerInside ? handleRootKeyDown : undefined}\n className={`${stripClasses} ds:max-w-full`}\n >\n {enhanced}\n {triggerInside ? trigger : null}\n </div>\n );\n\n return (\n <div\n ref={mergedRootRef}\n data-component=\"icon-button-group\"\n className={[\n 'ds:relative ds:block ds:w-full ds:min-w-0 ds:overflow-x-clip',\n className ?? '',\n ]\n .join(' ')\n .trim()}\n {...rest}\n >\n <div ref={containerRef} className=\"ds:block ds:w-full ds:min-w-0\">\n <div\n ref={fullRowRef}\n aria-hidden=\"true\"\n inert\n className={`${MEASURE_ROW_CLASSES} ${stripClasses}`}\n >\n {allElements.map((childEl, i) =>\n cloneElement(childEl, {\n key: childEl.key ?? i,\n intent: childEl.props.intent ?? intent,\n size: childEl.props.size ?? size,\n tabIndex: -1,\n ref: null,\n } as Partial<OverflowChildProps>),\n )}\n </div>\n <span\n ref={triggerProbeRef}\n aria-hidden=\"true\"\n inert\n className={MEASURE_ROW_CLASSES}\n >\n <IconButton\n icon={<Ellipsis />}\n intent={intent}\n size={size}\n aria-label={moreLabel}\n tabIndex={-1}\n />\n </span>\n {triggerInside ? (\n stripDiv\n ) : (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions -- non-focusable wrapper; arrow-key roving bubbles up from the focusable IconButtons in the strip and the overflow trigger\n <div\n className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\"\n onKeyDown={handleRootKeyDown}\n >\n {stripDiv}\n {trigger}\n </div>\n )}\n </div>\n </div>\n );\n },\n);\n\nIconButtonGroup.displayName = 'IconButtonGroup';\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction computeToggleAria(\n mode: IconButtonGroupMode,\n role: IconButtonGroupRole,\n childValue: string | undefined,\n resolvedValue: string | string[],\n): { ariaPressed?: boolean; ariaChecked?: boolean } {\n if (mode === 'momentary' || !childValue) return {};\n\n const isActive =\n mode === 'toggle-multi'\n ? (resolvedValue as string[]).includes(childValue)\n : resolvedValue === childValue;\n\n // radiogroup uses aria-checked; toolbar/group use aria-pressed.\n if (role === 'radiogroup') {\n return { ariaChecked: isActive };\n }\n return { ariaPressed: isActive };\n}\n"],"names":["iconButtonGroupVariants","cva","MEASURE_ROW_CLASSES","IconButtonGroup","forwardRef","props","ref","size","orientation","role","mode","disabled","intent","overflow","className","children","ariaLabel","ariaLabelledBy","_value","_defaultValue","_onValueChange","rest","t","useTranslation","overflowEnabled","internalValue","setInternalValue","useState","resolvedValue","p","commitValue","useCallback","next","_a","_b","rovingTabindex","buttonsRef","useRef","focusIndex","setFocusIndex","registerIndex","index","el","rootRef","isRTL","setIsRTL","useIsomorphicLayoutEffect","node","dir","handleRootKeyDown","event","count","forwardKey","backwardKey","maxAttempts","attempts","candidate","child","childArrayRef","cValue","allElements","Children","isValidElement","mirrorLabel","aria","pinnedFlags","explicit","mirrorable","containerRef","fullRowRef","triggerProbeRef","visible","overflowing","usePriorityOverflow","triggerNodeRef","childArray","_","i","checkedIndex","useEffect","visibleCount","total","childIsDisabled","firstFocusable","c","effectiveFocusIndex","enhanced","childEl","childValue","ariaPressed","ariaChecked","computeToggleAria","groupDisabled","childDisabled","wrappedOnClick","list","v","setMergedRef","originalRef","ariaDisabled","needsWrappedClick","overrides","ev","cloneElement","mergedRootRef","jsx","moreLabel","overflowItems","menuContent","DropdownMenu","checked","x","trigger","jsxs","IconButton","Ellipsis","stripClasses","triggerInside","stripDiv","isActive"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"icon-button-group-Dj6CRoYR.js","sources":["../../src/components/icon-button-group/icon-button-group.tsx"],"sourcesContent":["import {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n useCallback,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Ellipsis } from 'lucide-react';\nimport { IconButton, type IconButtonProps } from '../button/icon-button';\nimport type { ButtonProps } from '../button/button';\nimport { DropdownMenu } from '../dropdown-menu';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { usePriorityOverflow } from '../../hooks/use-priority-overflow';\n\ntype ButtonIntent = NonNullable<ButtonProps['intent']>;\n\n// Intentionally does NOT compose `@radix-ui/react-toggle-group`. Radix\n// ToggleGroup's render shape makes it hard to layer shared-border chrome\n// across children (first-child / last-child / internal-divider CSS), and\n// the three-mode + three-role matrix (group / toolbar / radiogroup × momentary\n// / toggle-single / toggle-multi) is broader than Radix's single / multi\n// contract. The roving-tabindex implementation below mirrors Radix's pattern\n// so keyboard semantics stay consistent. See 05-accessibility.mdx for the\n// WAI-ARIA toolbar / radiogroup references.\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst iconButtonGroupVariants = cva(\n [\n 'ds:inline-flex ds:isolate',\n // Hairline border around the group unifies the children into one\n // visual unit. Internal child dividers are drawn via the per-child\n // class list below.\n 'ds:border ds:border-border',\n 'ds:rounded-[var(--radius-md)]',\n // Ensure the focus ring of a pressed child sits above its siblings.\n 'ds:[&>*]:relative ds:[&>*:focus-visible]:z-10',\n ].join(' '),\n {\n variants: {\n orientation: {\n horizontal: [\n 'ds:flex-row',\n // Flatten internal corners on children so the outer radius owns\n // the rounded edges.\n 'ds:[&>*:not(:first-child)]:rounded-s-none',\n 'ds:[&>*:not(:last-child)]:rounded-e-none',\n // Internal divider — logical so it flips in RTL.\n 'ds:[&>*:not(:first-child)]:border-s',\n 'ds:[&>*:not(:first-child)]:border-border',\n // The children already own an outer border (from IconButton's\n // own border in secondary/outline variants). Collapse the doubled\n // border so we don't get a 2px seam.\n 'ds:[&>*]:border-0',\n ].join(' '),\n vertical: [\n 'ds:flex-col',\n // Vertical groups flow block-wise. Reading direction doesn't\n // invert vertical stacks in any locale this DS targets, so the\n // physical `rounded-t/b` is intentional.\n 'ds:[&>*:not(:first-child)]:rounded-t-none',\n 'ds:[&>*:not(:last-child)]:rounded-b-none',\n 'ds:[&>*:not(:first-child)]:border-t',\n 'ds:[&>*:not(:first-child)]:border-border',\n 'ds:[&>*]:border-0',\n ].join(' '),\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n },\n);\n\n// Hidden measurement rows: laid out (so widths are real) but invisible,\n// non-interactive and out of the a11y tree. Never display:none.\nconst MEASURE_ROW_CLASSES =\n 'ds:absolute ds:start-0 ds:top-0 ds:invisible ds:pointer-events-none';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type IconButtonGroupRole = 'group' | 'toolbar' | 'radiogroup';\nexport type IconButtonGroupMode =\n | 'momentary'\n | 'toggle-single'\n | 'toggle-multi';\n\ntype SharedPropsBase = {\n /** Forwarded to every child that does not set its own `size`. */\n size?: 'sm' | 'md' | 'lg';\n orientation?: 'horizontal' | 'vertical';\n /** Disables every child. Uses `aria-disabled` on children (not the HTML\n * attribute) so each child still takes focus — matches WAI-ARIA toolbar\n * guidance. Visual disabled styling picks up the `aria-disabled:*`\n * variant declared on the Button base class. */\n disabled?: boolean;\n /** Intent applied to every child that does not set its own `intent`.\n * Defaults to `outline` — grouped icon buttons are peers, not a row\n * of solid-primary CTAs. */\n intent?: ButtonIntent;\n /** `'menu'` keeps the strip on one line whatever the container width:\n * children that stop fitting move into a dropdown behind an ellipsis\n * trigger, preserving toggle semantics (radio / checkbox items). The\n * group then fills its container's inline size. Horizontal only.\n * Children set `data-overflow-pin` to always stay in the strip. */\n overflow?: 'none' | 'menu';\n children: ReactNode;\n};\n\n// At least one of `aria-label` / `aria-labelledby` must be present. This\n// discriminated pair makes the TypeScript compiler reject a group with\n// neither — see the a11y acceptance criteria in the user story.\ntype AccessibleNameProps =\n | { 'aria-label': string; 'aria-labelledby'?: never }\n | { 'aria-label'?: never; 'aria-labelledby': string };\n\ntype SharedProps = SharedPropsBase & AccessibleNameProps;\n\n// Role + mode combinations are not all valid. Encoded via a discriminated\n// union so the compiler rejects nonsensical pairings (e.g. a multi-select\n// radiogroup).\ntype GroupRoleProps =\n | { role?: 'group'; mode?: 'momentary' | 'toggle-single' | 'toggle-multi' }\n | { role: 'toolbar'; mode?: 'momentary' | 'toggle-single' | 'toggle-multi' }\n | { role: 'radiogroup'; mode: 'toggle-single' };\n\ntype MomentaryProps = SharedProps & {\n mode?: 'momentary';\n value?: never;\n defaultValue?: never;\n onValueChange?: never;\n};\n\ntype ToggleSingleProps = SharedProps & {\n mode: 'toggle-single';\n value?: string;\n defaultValue?: string;\n onValueChange?: (next: string) => void;\n};\n\ntype ToggleMultiProps = SharedProps & {\n mode: 'toggle-multi';\n value?: string[];\n defaultValue?: string[];\n onValueChange?: (next: string[]) => void;\n};\n\nexport type IconButtonGroupProps = (\n | MomentaryProps\n | ToggleSingleProps\n | ToggleMultiProps\n) &\n GroupRoleProps &\n Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'onChange' | 'children'> &\n VariantProps<typeof iconButtonGroupVariants>;\n\n/* ------------------------------------------------------------------ */\n/* IconButtonGroup */\n/* ------------------------------------------------------------------ */\n\nexport const IconButtonGroup = forwardRef<HTMLDivElement, IconButtonGroupProps>(\n (props, ref) => {\n const {\n size,\n orientation = 'horizontal',\n role = 'group',\n mode = 'momentary',\n disabled = false,\n intent = 'outline',\n overflow = 'none',\n className,\n children,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n // Controlled-value props are consumed via `props as …` below; strip them\n // here so they never spread onto the root <div> (React would warn that\n // `onValueChange` is an unknown DOM event handler).\n value: _value,\n defaultValue: _defaultValue,\n onValueChange: _onValueChange,\n ...rest\n } = props as IconButtonGroupProps & { className?: string };\n const { t } = useTranslation();\n\n if (import.meta.env.DEV && !ariaLabel && !ariaLabelledBy) {\n console.warn(\n 'IconButtonGroup: `aria-label` or `aria-labelledby` is required for accessibility.',\n );\n }\n if (\n import.meta.env.DEV &&\n overflow === 'menu' &&\n orientation === 'vertical'\n ) {\n console.warn(\n 'IconButtonGroup: overflow=\"menu\" is horizontal-only; falling back to overflow=\"none\".',\n );\n }\n const overflowEnabled = overflow === 'menu' && orientation !== 'vertical';\n\n /* ---- Controlled / uncontrolled value for toggle modes --------- */\n const [internalValue, setInternalValue] = useState<string | string[]>(\n () => {\n if (mode === 'toggle-single') {\n const p = props as ToggleSingleProps;\n return p.defaultValue ?? '';\n }\n if (mode === 'toggle-multi') {\n const p = props as ToggleMultiProps;\n return p.defaultValue ?? [];\n }\n return '';\n },\n );\n\n const resolvedValue: string | string[] = (() => {\n if (mode === 'toggle-single') {\n const p = props as ToggleSingleProps;\n return p.value !== undefined ? p.value : internalValue;\n }\n if (mode === 'toggle-multi') {\n const p = props as ToggleMultiProps;\n return p.value !== undefined ? p.value : internalValue;\n }\n return '';\n })();\n\n const commitValue = useCallback(\n (next: string | string[]) => {\n if (mode === 'toggle-single') {\n const p = props as ToggleSingleProps;\n if (p.value === undefined) setInternalValue(next as string);\n p.onValueChange?.(next as string);\n } else if (mode === 'toggle-multi') {\n const p = props as ToggleMultiProps;\n if (p.value === undefined) setInternalValue(next as string[]);\n p.onValueChange?.(next as string[]);\n }\n },\n [mode, props],\n );\n\n /* ---- Roving tabindex state — only active in toolbar / radiogroup - */\n const rovingTabindex = role === 'toolbar' || role === 'radiogroup';\n const buttonsRef = useRef<Array<HTMLButtonElement | null>>([]);\n const [focusIndex, setFocusIndex] = useState(0);\n\n const registerIndex = useCallback(\n (index: number, el: HTMLButtonElement | null) => {\n buttonsRef.current[index] = el;\n },\n [],\n );\n\n const rootRef = useRef<HTMLDivElement | null>(null);\n const [isRTL, setIsRTL] = useState(false);\n // `useLayoutEffect` so the direction is correct BEFORE the first paint\n // (otherwise a user pressing an arrow key on the first frame after mount\n // would hit the default-LTR mapping even in an RTL document).\n useIsomorphicLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n const node = rootRef.current;\n if (!node) return;\n // Read the computed direction from the group's own wrapper so a\n // scoped `dir='rtl'` on any ancestor (not just <html>) flips arrow\n // navigation. `getComputedStyle` walks up automatically.\n const dir = window.getComputedStyle(node).direction;\n setIsRTL(dir === 'rtl');\n }, []);\n\n /* ---- Arrow-key navigation for roving tabindex ----------------- */\n const handleRootKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (!rovingTabindex) return;\n const count = buttonsRef.current.filter(Boolean).length;\n if (count === 0) return;\n\n const forwardKey =\n orientation === 'vertical'\n ? 'ArrowDown'\n : isRTL\n ? 'ArrowLeft'\n : 'ArrowRight';\n const backwardKey =\n orientation === 'vertical'\n ? 'ArrowUp'\n : isRTL\n ? 'ArrowRight'\n : 'ArrowLeft';\n\n let next: number | null = null;\n if (event.key === forwardKey) next = (focusIndex + 1) % count;\n else if (event.key === backwardKey)\n next = (focusIndex - 1 + count) % count;\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = count - 1;\n\n if (next === null) return;\n // Skip over disabled children.\n const maxAttempts = count;\n let attempts = 0;\n let candidate = next;\n while (attempts < maxAttempts) {\n const el = buttonsRef.current[candidate];\n if (\n el &&\n el.getAttribute('aria-disabled') !== 'true' &&\n !el.disabled\n ) {\n break;\n }\n candidate =\n event.key === backwardKey || event.key === 'End'\n ? (candidate - 1 + count) % count\n : (candidate + 1) % count;\n attempts += 1;\n }\n event.preventDefault();\n setFocusIndex(candidate);\n buttonsRef.current[candidate]?.focus();\n // WAI-ARIA radiogroup pattern: arrow keys MOVE focus AND CHANGE\n // the selected radio in one action. toolbar pattern (and plain\n // group) only moves focus.\n if (role === 'radiogroup' && mode === 'toggle-single') {\n const child = childArrayRef.current[candidate];\n if (child && typeof child === 'object' && 'props' in child) {\n const cValue = (child as ReactElement<{ value?: string }>).props\n .value;\n // Same guard as the click path: re-committing the already\n // selected value is a no-op, so Home/End on the selected radio\n // never fires a spurious onValueChange.\n if (cValue && cValue !== resolvedValue) commitValue(cValue);\n }\n }\n },\n [\n rovingTabindex,\n orientation,\n isRTL,\n focusIndex,\n role,\n mode,\n commitValue,\n resolvedValue,\n ],\n );\n\n /* ---- Overflow bookkeeping (menu mode only) --------------------- */\n type OverflowChildProps = IconButtonProps & {\n value?: string;\n 'data-overflow-pin'?: boolean | 'true' | '';\n };\n const allElements = overflowEnabled\n ? (Children.toArray(children).filter(isValidElement) as Array<\n ReactElement<OverflowChildProps>\n >)\n : [];\n const mirrorLabel = (child: ReactElement<OverflowChildProps>) => {\n const aria = child.props['aria-label'];\n if (typeof aria === 'string') return aria;\n return typeof child.props.tooltip === 'string'\n ? child.props.tooltip\n : null;\n };\n const warnedRef = useRef(false);\n const pinnedFlags = allElements.map((child) => {\n const explicit = child.props['data-overflow-pin'] !== undefined;\n const mirrorable = mirrorLabel(child) !== null;\n if (\n import.meta.env.DEV &&\n !explicit &&\n !mirrorable &&\n !warnedRef.current\n ) {\n warnedRef.current = true;\n console.warn(\n 'IconButtonGroup: a child without aria-label / tooltip cannot move into the overflow menu — it stays pinned in the strip.',\n );\n }\n return explicit || !mirrorable;\n });\n\n const { containerRef, fullRowRef, triggerProbeRef, visible, overflowing } =\n usePriorityOverflow({\n enabled: overflowEnabled,\n count: allElements.length,\n pinned: pinnedFlags,\n });\n\n const triggerNodeRef = useRef<HTMLButtonElement | null>(null);\n\n /* ---- Build enhanced children ---------------------------------- */\n const childArray = overflowEnabled\n ? allElements.filter((_, i) => visible[i])\n : Children.toArray(children);\n if (overflowEnabled) {\n buttonsRef.current.length = childArray.length + (overflowing ? 1 : 0);\n }\n // Mirror into a ref so the keydown handler (referenced from Memo deps)\n // can read the latest child list without inflating the dep array.\n const childArrayRef = useRef<ReturnType<typeof Children.toArray>>([]);\n childArrayRef.current = childArray;\n\n // APG radiogroup pattern: Tab must land on the CHECKED radio, not the\n // first one. Keep the roving tab stop pinned to the selected child —\n // covers initial mount (checked child not first) and controlled value\n // changes. Arrow/click interactions already align focusIndex with the\n // selection, so this effect is a no-op for them.\n const checkedIndex =\n role === 'radiogroup' && mode === 'toggle-single'\n ? childArray.findIndex(\n (child) =>\n isValidElement(child) &&\n (child as ReactElement<{ value?: string }>).props.value ===\n resolvedValue,\n )\n : -1;\n useEffect(() => {\n if (checkedIndex >= 0) setFocusIndex(checkedIndex);\n }, [checkedIndex]);\n\n const visibleCount = childArray.length;\n // Clamp the roving focus when items move into the menu; hand real focus\n // to the trigger only when the focused node was the one that left.\n useEffect(() => {\n if (!rovingTabindex || !overflowEnabled) return;\n const total = visibleCount + (overflowing ? 1 : 0);\n if (total > 0 && focusIndex >= total) {\n setFocusIndex(total - 1);\n if (document.activeElement === document.body) {\n triggerNodeRef.current?.focus();\n }\n }\n }, [\n rovingTabindex,\n overflowEnabled,\n visibleCount,\n overflowing,\n focusIndex,\n ]);\n\n /* The roving tabindex seeds at 0, but an HTML-disabled child takes\n no tabindex at all — if the first children are disabled (a Save\n that is not yet committable, say) Tab could not enter the group\n and its remaining buttons became unreachable. Seed on the first\n child that can actually hold focus; the arrow keys already skip\n disabled children the same way. */\n /* `loading` counts: Button renders `disabled={disabled || loading}`,\n so a leading loading child takes no tab stop either. */\n const childIsDisabled = (child: unknown): boolean => {\n if (!isValidElement(child)) return false;\n const props = (\n child as ReactElement<{\n disabled?: boolean;\n loading?: boolean;\n }>\n ).props;\n return props.disabled === true || props.loading === true;\n };\n const firstFocusable = childArray.findIndex((c) => !childIsDisabled(c));\n const effectiveFocusIndex = !childIsDisabled(childArray[focusIndex])\n ? focusIndex\n : firstFocusable !== -1\n ? firstFocusable\n : /* Every visible child is disabled: the overflow trigger is the\n only thing left that can hold focus. Without this the group\n has no tab stop at all and the menu is unreachable. */\n overflowing\n ? visibleCount\n : focusIndex;\n\n const enhanced = childArray.map((child, index) => {\n if (!isValidElement(child)) {\n if (import.meta.env.DEV) {\n console.warn(\n 'IconButtonGroup: children should be <IconButton> elements.',\n );\n }\n return child;\n }\n\n const childEl = child as ReactElement<\n IconButtonProps & {\n value?: string;\n asChild?: boolean;\n children?: ReactNode;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n }\n >;\n\n // DEV-time sanity: warn if we got something that isn't an IconButton.\n // `React.cloneElement` would still work, but IconButton-specific\n // props (::before target size, forwarded tooltip) wouldn't apply.\n // `asChild` wrappers (e.g. DropdownMenu.Trigger) are fine when they\n // Slot-merge the cloned props onto their own IconButton child, as are\n // components that declare a static `rendersIconButton` marker (the\n // DataTable toolbar leaves — each renders one IconButton trigger and\n // forwards ref/tabIndex/onFocus to it).\n if (import.meta.env.DEV && childEl.type !== IconButton) {\n const slotChild =\n childEl.props.asChild === true ? childEl.props.children : null;\n const wrapsIconButton =\n isValidElement(slotChild) && slotChild.type === IconButton;\n const rendersIconButton =\n (childEl.type as { rendersIconButton?: boolean })\n .rendersIconButton === true;\n if (!wrapsIconButton && !rendersIconButton) {\n console.warn(\n 'IconButtonGroup: each child should be a DS <IconButton>. Other elements break target-size + focus-ring contracts.',\n );\n }\n }\n\n const childValue = childEl.props.value;\n\n // Compute aria-pressed / aria-checked for toggle modes.\n const { ariaPressed, ariaChecked } = computeToggleAria(\n mode,\n role,\n childValue,\n resolvedValue,\n );\n\n const groupDisabled = disabled === true;\n const childDisabled = childEl.props.disabled === true;\n\n // Click handling — wrap so aria-disabled (group-level) blocks\n // activation, then forward to the child's own onClick.\n const wrappedOnClick: React.MouseEventHandler<HTMLButtonElement> = (\n event,\n ) => {\n // aria-disabled is advisory; the native click still fires. Block\n // it explicitly when the GROUP (not the child) is disabled.\n if (groupDisabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n // Forward to the child's own handler first so consumers can run\n // analytics / preventDefault.\n childEl.props.onClick?.(event);\n if (event.defaultPrevented) return;\n if (!childValue) return;\n if (mode === 'toggle-single') {\n // Contract: exactly one pressed. Clicking the pressed one is a\n // no-op. This matches Radix ToggleGroup type='single' and the\n // radiogroup pattern.\n if (resolvedValue === childValue) return;\n commitValue(childValue);\n } else if (mode === 'toggle-multi') {\n const list = resolvedValue as string[];\n const next = list.includes(childValue)\n ? list.filter((v) => v !== childValue)\n : [...list, childValue];\n commitValue(next);\n }\n };\n\n // cloneElement's typed overload rejects `ref` as a prop, so we\n // build the override bag as `unknown` and cast to the element's\n // prop type. React at runtime routes `ref` via its usual channel.\n const setMergedRef = (node: HTMLButtonElement | null) => {\n registerIndex(index, node);\n const originalRef = (\n childEl as unknown as { ref?: React.Ref<HTMLButtonElement> }\n ).ref;\n if (typeof originalRef === 'function') originalRef(node);\n else if (\n originalRef !== null &&\n originalRef !== undefined &&\n typeof originalRef === 'object'\n ) {\n (\n originalRef as React.MutableRefObject<HTMLButtonElement | null>\n ).current = node;\n }\n };\n\n // Per the user story: group-level disabled injects `aria-disabled`\n // so the child stays focusable; child-level `disabled` still uses\n // the HTML attribute (child's own contract). When both are true\n // we leave the HTML disabled in place (strictest cue wins).\n const ariaDisabled = groupDisabled && !childDisabled ? true : undefined;\n\n // If the group is disabled OR we are in a toggle mode, we need the\n // wrapped click handler. In pure momentary mode with no group\n // disable, the child's own onClick is passed through unchanged.\n const needsWrappedClick = mode !== 'momentary' || groupDisabled;\n\n const overrides = {\n intent: childEl.props.intent ?? intent,\n size: childEl.props.size ?? size,\n disabled: childDisabled,\n 'aria-disabled': ariaDisabled,\n onClick: needsWrappedClick ? wrappedOnClick : childEl.props.onClick,\n 'aria-pressed': ariaPressed,\n 'aria-checked': ariaChecked,\n // When the group is a radiogroup, children must be `role=\"radio\"`\n // so screen readers announce them as radio buttons and so\n // `getByRole('radio')` works in tests. The button element is\n // re-purposed as a radio; `aria-checked` above carries the state.\n role: role === 'radiogroup' ? 'radio' : undefined,\n tabIndex: rovingTabindex\n ? index === effectiveFocusIndex\n ? 0\n : -1\n : undefined,\n onFocus: (ev: React.FocusEvent<HTMLButtonElement>) => {\n if (rovingTabindex) setFocusIndex(index);\n childEl.props.onFocus?.(ev);\n },\n ref: setMergedRef,\n } as unknown as Partial<IconButtonProps>;\n\n return cloneElement(childEl, overrides);\n });\n\n const mergedRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref && typeof ref === 'object') {\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n };\n\n if (!overflowEnabled) {\n return (\n <div\n ref={mergedRootRef}\n role={role}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-orientation={role === 'toolbar' ? orientation : undefined}\n onKeyDown={handleRootKeyDown}\n className={iconButtonGroupVariants({ orientation, className })}\n data-component=\"icon-button-group\"\n {...rest}\n >\n {enhanced}\n </div>\n );\n }\n\n /* ---- Menu path: measurement rows + strip + ellipsis trigger ---- */\n const moreLabel = t('buttonGroup.more', 'More options');\n const groupDisabled = disabled === true;\n const overflowItems = allElements\n .map((childEl, i) => ({ childEl, i }))\n .filter(({ i }) => !visible[i]);\n\n let menuContent: ReactNode = null;\n if (mode === 'toggle-single') {\n menuContent = (\n <DropdownMenu.RadioGroup\n value={resolvedValue as string}\n onValueChange={(v) => {\n if (!groupDisabled && v !== resolvedValue) commitValue(v);\n }}\n >\n {overflowItems.map(({ childEl, i }) => (\n <DropdownMenu.RadioItem\n key={childEl.key ?? i}\n value={childEl.props.value ?? ''}\n disabled={groupDisabled || childEl.props.disabled === true}\n >\n {mirrorLabel(childEl)}\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n );\n } else if (mode === 'toggle-multi') {\n menuContent = overflowItems.map(({ childEl, i }) => {\n const v = childEl.props.value;\n const list = resolvedValue as string[];\n const checked = v ? list.includes(v) : false;\n return (\n <DropdownMenu.CheckboxItem\n key={childEl.key ?? i}\n checked={checked}\n disabled={groupDisabled || childEl.props.disabled === true}\n onCheckedChange={() => {\n if (groupDisabled || !v) return;\n commitValue(checked ? list.filter((x) => x !== v) : [...list, v]);\n }}\n >\n {mirrorLabel(childEl)}\n </DropdownMenu.CheckboxItem>\n );\n });\n } else {\n menuContent = overflowItems.map(({ childEl, i }) => (\n <DropdownMenu.Item\n key={childEl.key ?? i}\n startIcon={childEl.props.icon}\n disabled={groupDisabled || childEl.props.disabled === true}\n onSelect={(event) => {\n childEl.props.onClick?.(\n event as unknown as React.MouseEvent<HTMLButtonElement>,\n );\n }}\n >\n {mirrorLabel(childEl)}\n </DropdownMenu.Item>\n ));\n }\n\n const trigger = overflowing ? (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n icon={<Ellipsis />}\n intent={intent}\n size={size}\n aria-label={moreLabel}\n ref={(node: HTMLButtonElement | null) => {\n triggerNodeRef.current = node;\n registerIndex(visibleCount, node);\n }}\n tabIndex={\n rovingTabindex\n ? effectiveFocusIndex === visibleCount\n ? 0\n : -1\n : undefined\n }\n onFocus={\n rovingTabindex ? () => setFocusIndex(visibleCount) : undefined\n }\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">{menuContent}</DropdownMenu.Content>\n </DropdownMenu.Root>\n ) : null;\n\n const stripClasses = iconButtonGroupVariants({ orientation });\n // A radiogroup may own only radios, so its trigger sits beside the strip;\n // toolbar / group keep the trigger inside as the last joined control.\n const triggerInside = role !== 'radiogroup';\n const stripDiv = (\n <div\n role={role}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-orientation={role === 'toolbar' ? orientation : undefined}\n onKeyDown={triggerInside ? handleRootKeyDown : undefined}\n className={`${stripClasses} ds:max-w-full`}\n >\n {enhanced}\n {triggerInside ? trigger : null}\n </div>\n );\n\n return (\n <div\n ref={mergedRootRef}\n data-component=\"icon-button-group\"\n className={[\n 'ds:relative ds:block ds:w-full ds:min-w-0 ds:overflow-x-clip',\n className ?? '',\n ]\n .join(' ')\n .trim()}\n {...rest}\n >\n <div ref={containerRef} className=\"ds:block ds:w-full ds:min-w-0\">\n <div\n ref={fullRowRef}\n aria-hidden=\"true\"\n inert\n className={`${MEASURE_ROW_CLASSES} ${stripClasses}`}\n >\n {allElements.map((childEl, i) =>\n cloneElement(childEl, {\n key: childEl.key ?? i,\n intent: childEl.props.intent ?? intent,\n size: childEl.props.size ?? size,\n tabIndex: -1,\n ref: null,\n } as Partial<OverflowChildProps>),\n )}\n </div>\n <span\n ref={triggerProbeRef}\n aria-hidden=\"true\"\n inert\n className={MEASURE_ROW_CLASSES}\n >\n <IconButton\n icon={<Ellipsis />}\n intent={intent}\n size={size}\n aria-label={moreLabel}\n tabIndex={-1}\n />\n </span>\n {triggerInside ? (\n stripDiv\n ) : (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions -- non-focusable wrapper; arrow-key roving bubbles up from the focusable IconButtons in the strip and the overflow trigger\n <div\n className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\"\n onKeyDown={handleRootKeyDown}\n >\n {stripDiv}\n {trigger}\n </div>\n )}\n </div>\n </div>\n );\n },\n);\n\nIconButtonGroup.displayName = 'IconButtonGroup';\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction computeToggleAria(\n mode: IconButtonGroupMode,\n role: IconButtonGroupRole,\n childValue: string | undefined,\n resolvedValue: string | string[],\n): { ariaPressed?: boolean; ariaChecked?: boolean } {\n if (mode === 'momentary' || !childValue) return {};\n\n const isActive =\n mode === 'toggle-multi'\n ? (resolvedValue as string[]).includes(childValue)\n : resolvedValue === childValue;\n\n // radiogroup uses aria-checked; toolbar/group use aria-pressed.\n if (role === 'radiogroup') {\n return { ariaChecked: isActive };\n }\n return { ariaPressed: isActive };\n}\n"],"names":["iconButtonGroupVariants","cva","MEASURE_ROW_CLASSES","IconButtonGroup","forwardRef","props","ref","size","orientation","role","mode","disabled","intent","overflow","className","children","ariaLabel","ariaLabelledBy","_value","_defaultValue","_onValueChange","rest","t","useTranslation","overflowEnabled","internalValue","setInternalValue","useState","resolvedValue","p","commitValue","useCallback","next","_a","_b","rovingTabindex","buttonsRef","useRef","focusIndex","setFocusIndex","registerIndex","index","el","rootRef","isRTL","setIsRTL","useIsomorphicLayoutEffect","node","dir","handleRootKeyDown","event","count","forwardKey","backwardKey","maxAttempts","attempts","candidate","child","childArrayRef","cValue","allElements","Children","isValidElement","mirrorLabel","aria","pinnedFlags","explicit","mirrorable","containerRef","fullRowRef","triggerProbeRef","visible","overflowing","usePriorityOverflow","triggerNodeRef","childArray","_","i","checkedIndex","useEffect","visibleCount","total","childIsDisabled","firstFocusable","c","effectiveFocusIndex","enhanced","childEl","childValue","ariaPressed","ariaChecked","computeToggleAria","groupDisabled","childDisabled","wrappedOnClick","list","v","setMergedRef","originalRef","ariaDisabled","needsWrappedClick","overrides","ev","cloneElement","mergedRootRef","jsx","moreLabel","overflowItems","menuContent","DropdownMenu","checked","x","trigger","jsxs","IconButton","Ellipsis","stripClasses","triggerInside","stripDiv","isActive"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { jsxs as N, jsx as r } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as H, useState as y, useRef as h, useCallback as v, useMemo as b } from "react";
|
|
3
3
|
import { c as M } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as F } from "react-i18next";
|
|
5
|
-
import { P as k } from "./popover-
|
|
5
|
+
import { P as k } from "./popover-DzR5QYxp.js";
|
|
6
6
|
import { B as D } from "./button-nJaPh_HC.js";
|
|
7
7
|
import { T as E } from "./text-input-CUvCb6ST.js";
|
|
8
8
|
import { u as G } from "./registry-DvAUVLHh.js";
|
|
@@ -269,4 +269,4 @@ export {
|
|
|
269
269
|
X as I,
|
|
270
270
|
U as i
|
|
271
271
|
};
|
|
272
|
-
//# sourceMappingURL=icon-picker-
|
|
272
|
+
//# sourceMappingURL=icon-picker-CTWzlHJr.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon-picker-DOa89vn3.js","sources":["../../src/components/icon-picker/icon-picker.agent.ts","../../src/components/icon-picker/icon-picker.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — IconPicker. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { IconPickerHandle } from './icon-picker';\n\nexport const iconPickerAgent: AgentAdapter<IconPickerHandle> = {\n id: 'icon-picker',\n capabilities: ['pick', 'filter', 'open', 'close'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.iconPicker.state.value',\n description:\n 'Id of the currently selected icon, or an empty string when nothing is picked.',\n read: (handle) => handle.getValue(),\n },\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.iconPicker.state.isOpen',\n description: 'True when the picker popover is currently open.',\n read: (handle) => handle.isOpen(),\n },\n query: {\n type: 'string',\n descriptionKey: 'ui.agent.iconPicker.state.query',\n description: 'Current search query filtering the icon grid by label.',\n read: (handle) => handle.getQuery(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Id of an icon in the supplied `icons` set.',\n },\n },\n required: ['id'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.iconPicker.actions.setValue',\n description: 'Select the icon with the given id.',\n examples: [{ args: { id: 'star' }, note: 'Pick the \"star\" icon.' }],\n invoke: (handle, args: { id: string }) => {\n handle.setValue(args.id);\n },\n },\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.iconPicker.actions.open',\n description: 'Open the picker popover.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.iconPicker.actions.close',\n description: 'Close the picker popover.',\n invoke: (handle) => {\n handle.close();\n },\n },\n filter: {\n safety: 'write',\n argsType: '{ query: string }',\n argsSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description:\n 'Case-insensitive substring matched against icon labels.',\n },\n },\n required: ['query'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.iconPicker.actions.filter',\n description: 'Filter the icon grid to labels containing the query.',\n examples: [\n {\n args: { query: 'star' },\n note: 'Show icons whose label contains \"star\".',\n },\n ],\n invoke: (handle, args: { query: string }) => {\n handle.setQuery(args.query);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'icon-picker',\n description: 'Marks the IconPicker trigger button.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Search } from 'lucide-react';\nimport { Popover } from '../popover';\nimport { Button } from '../button/button';\nimport { TextInput } from '../text-input/text-input';\nimport { useAgentRegistration } from '../../agent';\nimport { iconPickerAgent } from './icon-picker.agent';\n\n/** One selectable glyph. `label` is the accessible name (consumer-localised);\n * `node` is the rendered lucide/SVG element. */\nexport interface IconPickerIcon {\n id: string;\n label: string;\n node: ReactNode;\n}\n\n/** Agent-readiness curated handle for IconPicker. */\nexport interface IconPickerHandle {\n getValue: () => string;\n setValue: (id: string) => void;\n isOpen: () => boolean;\n open: () => void;\n close: () => void;\n getQuery: () => string;\n setQuery: (query: string) => void;\n}\n\nexport interface IconPickerProps {\n /** The glyph set. `label` is each glyph's accessible name. */\n icons: IconPickerIcon[];\n /** Controlled selected icon id. Pair with onChange. */\n value?: string;\n /** Uncontrolled initial selected icon id. */\n defaultValue?: string;\n /** Fires with the chosen icon id when a glyph is picked. */\n onChange?: (id: string) => void;\n /** Shown on the trigger when nothing is selected. */\n placeholder?: ReactNode;\n disabled?: boolean;\n id?: string;\n className?: string;\n /** Trigger accessible name. Defaults to the bundled `iconPicker.trigger`. */\n 'aria-label'?: string;\n}\n\n// Selectable glyph cell. The only variant is selection state — selected cells\n// take a tokenised highlight (primary border + muted fill); `aria-pressed`\n// carries the state non-visually so it never reads by colour alone.\nconst optionVariants = cva(\n [\n 'ds:relative ds:inline-flex ds:items-center ds:justify-center',\n 'ds:size-[var(--min-target-size)] ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:text-foreground ds:bg-transparent',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-muted/10',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:[&_svg]:size-5',\n ].join(' '),\n {\n variants: {\n selected: {\n true: 'ds:border-primary ds:bg-muted',\n false: 'ds:border-transparent',\n },\n },\n defaultVariants: { selected: false },\n },\n);\n\nexport const IconPicker = forwardRef<HTMLButtonElement, IconPickerProps>(\n function IconPicker(\n {\n icons,\n value,\n defaultValue,\n onChange,\n placeholder,\n disabled,\n id,\n className,\n 'aria-label': ariaLabel,\n },\n ref,\n ) {\n const { t } = useTranslation();\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? '',\n );\n const currentValue = isControlled ? (value ?? '') : internalValue;\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n\n // Live snapshots for the synchronous agent handle.\n const currentValueRef = useRef(currentValue);\n currentValueRef.current = currentValue;\n const openRef = useRef(open);\n openRef.current = open;\n const queryRef = useRef(query);\n queryRef.current = query;\n\n const handleOpenChange = useCallback((next: boolean) => {\n setOpen(next);\n // Reset the filter when the popover closes so the next open starts fresh.\n if (!next) setQuery('');\n }, []);\n\n const setValueImperative = useCallback(\n (iconId: string) => {\n if (!isControlled) setInternalValue(iconId);\n onChange?.(iconId);\n },\n [isControlled, onChange],\n );\n\n const handleSelect = useCallback(\n (iconId: string) => {\n setValueImperative(iconId);\n handleOpenChange(false);\n },\n [setValueImperative, handleOpenChange],\n );\n\n const agentHandle = useMemo<IconPickerHandle>(\n () => ({\n getValue: () => currentValueRef.current,\n setValue: (iconId) => setValueImperative(iconId),\n isOpen: () => openRef.current,\n open: () => handleOpenChange(true),\n close: () => handleOpenChange(false),\n getQuery: () => queryRef.current,\n setQuery: (next) => setQuery(next),\n }),\n [setValueImperative, handleOpenChange],\n );\n useAgentRegistration(iconPickerAgent, agentHandle, id);\n\n const selectedIcon = useMemo(\n () => icons.find((icon) => icon.id === currentValue),\n [icons, currentValue],\n );\n\n const normalisedQuery = query.trim().toLowerCase();\n const filtered = useMemo(\n () =>\n normalisedQuery\n ? icons.filter((icon) =>\n icon.label.toLowerCase().includes(normalisedQuery),\n )\n : icons,\n [icons, normalisedQuery],\n );\n\n const triggerLabel = ariaLabel ?? t('iconPicker.trigger');\n const resolvedPlaceholder = placeholder ?? t('iconPicker.trigger');\n\n return (\n <Popover.Root open={open} onOpenChange={handleOpenChange} id={id}>\n <Popover.Trigger asChild>\n <Button\n ref={ref}\n type=\"button\"\n intent=\"outline\"\n disabled={disabled}\n aria-label={triggerLabel}\n className={className}\n data-component=\"icon-picker\"\n data-component-id={id}\n >\n {selectedIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:items-center ds:justify-center ds:[&_svg]:size-5\"\n >\n {selectedIcon.node}\n </span>\n ) : (\n <span className=\"ds:inline-flex ds:items-center ds:text-muted-foreground\">\n {resolvedPlaceholder}\n </span>\n )}\n </Button>\n </Popover.Trigger>\n\n <Popover.Content\n align=\"start\"\n showArrow={false}\n aria-label={triggerLabel}\n className=\"ds:w-72\"\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <TextInput\n size=\"sm\"\n value={query}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n setQuery(event.target.value)\n }\n placeholder={t('iconPicker.search')}\n aria-label={t('iconPicker.search')}\n startAdornment={<Search />}\n clearable\n onClear={() => setQuery('')}\n autoComplete=\"off\"\n />\n\n {filtered.length === 0 ? (\n <p\n role=\"status\"\n className=\"type-body-sm ds:text-muted-foreground ds:text-center ds:py-[var(--spacing-sm)]\"\n >\n {t('iconPicker.noResults')}\n </p>\n ) : (\n <div\n role=\"group\"\n aria-label={triggerLabel}\n className=\"ds:grid ds:grid-cols-5 ds:gap-[var(--spacing-xs)] ds:max-h-64 ds:overflow-y-auto\"\n >\n {filtered.map((icon) => {\n const selected = icon.id === currentValue;\n return (\n <button\n key={icon.id}\n type=\"button\"\n aria-label={icon.label}\n aria-pressed={selected}\n onClick={() => handleSelect(icon.id)}\n className={optionVariants({ selected })}\n >\n <span aria-hidden=\"true\" className=\"ds:inline-flex\">\n {icon.node}\n </span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n </Popover.Content>\n </Popover.Root>\n );\n },\n);\n\nIconPicker.displayName = 'IconPicker';\n\nexport { optionVariants as iconPickerOptionVariants };\n"],"names":["iconPickerAgent","handle","args","optionVariants","cva","IconPicker","forwardRef","icons","value","defaultValue","onChange","placeholder","disabled","id","className","ariaLabel","ref","t","useTranslation","isControlled","internalValue","setInternalValue","useState","currentValue","open","setOpen","query","setQuery","currentValueRef","useRef","openRef","queryRef","handleOpenChange","useCallback","next","setValueImperative","iconId","handleSelect","agentHandle","useMemo","useAgentRegistration","selectedIcon","icon","normalisedQuery","filtered","triggerLabel","resolvedPlaceholder","Popover","jsx","Button","jsxs","TextInput","event","Search","selected"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"icon-picker-CTWzlHJr.js","sources":["../../src/components/icon-picker/icon-picker.agent.ts","../../src/components/icon-picker/icon-picker.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — IconPicker. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { IconPickerHandle } from './icon-picker';\n\nexport const iconPickerAgent: AgentAdapter<IconPickerHandle> = {\n id: 'icon-picker',\n capabilities: ['pick', 'filter', 'open', 'close'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.iconPicker.state.value',\n description:\n 'Id of the currently selected icon, or an empty string when nothing is picked.',\n read: (handle) => handle.getValue(),\n },\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.iconPicker.state.isOpen',\n description: 'True when the picker popover is currently open.',\n read: (handle) => handle.isOpen(),\n },\n query: {\n type: 'string',\n descriptionKey: 'ui.agent.iconPicker.state.query',\n description: 'Current search query filtering the icon grid by label.',\n read: (handle) => handle.getQuery(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Id of an icon in the supplied `icons` set.',\n },\n },\n required: ['id'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.iconPicker.actions.setValue',\n description: 'Select the icon with the given id.',\n examples: [{ args: { id: 'star' }, note: 'Pick the \"star\" icon.' }],\n invoke: (handle, args: { id: string }) => {\n handle.setValue(args.id);\n },\n },\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.iconPicker.actions.open',\n description: 'Open the picker popover.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.iconPicker.actions.close',\n description: 'Close the picker popover.',\n invoke: (handle) => {\n handle.close();\n },\n },\n filter: {\n safety: 'write',\n argsType: '{ query: string }',\n argsSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description:\n 'Case-insensitive substring matched against icon labels.',\n },\n },\n required: ['query'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.iconPicker.actions.filter',\n description: 'Filter the icon grid to labels containing the query.',\n examples: [\n {\n args: { query: 'star' },\n note: 'Show icons whose label contains \"star\".',\n },\n ],\n invoke: (handle, args: { query: string }) => {\n handle.setQuery(args.query);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'icon-picker',\n description: 'Marks the IconPicker trigger button.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Search } from 'lucide-react';\nimport { Popover } from '../popover';\nimport { Button } from '../button/button';\nimport { TextInput } from '../text-input/text-input';\nimport { useAgentRegistration } from '../../agent';\nimport { iconPickerAgent } from './icon-picker.agent';\n\n/** One selectable glyph. `label` is the accessible name (consumer-localised);\n * `node` is the rendered lucide/SVG element. */\nexport interface IconPickerIcon {\n id: string;\n label: string;\n node: ReactNode;\n}\n\n/** Agent-readiness curated handle for IconPicker. */\nexport interface IconPickerHandle {\n getValue: () => string;\n setValue: (id: string) => void;\n isOpen: () => boolean;\n open: () => void;\n close: () => void;\n getQuery: () => string;\n setQuery: (query: string) => void;\n}\n\nexport interface IconPickerProps {\n /** The glyph set. `label` is each glyph's accessible name. */\n icons: IconPickerIcon[];\n /** Controlled selected icon id. Pair with onChange. */\n value?: string;\n /** Uncontrolled initial selected icon id. */\n defaultValue?: string;\n /** Fires with the chosen icon id when a glyph is picked. */\n onChange?: (id: string) => void;\n /** Shown on the trigger when nothing is selected. */\n placeholder?: ReactNode;\n disabled?: boolean;\n id?: string;\n className?: string;\n /** Trigger accessible name. Defaults to the bundled `iconPicker.trigger`. */\n 'aria-label'?: string;\n}\n\n// Selectable glyph cell. The only variant is selection state — selected cells\n// take a tokenised highlight (primary border + muted fill); `aria-pressed`\n// carries the state non-visually so it never reads by colour alone.\nconst optionVariants = cva(\n [\n 'ds:relative ds:inline-flex ds:items-center ds:justify-center',\n 'ds:size-[var(--min-target-size)] ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:text-foreground ds:bg-transparent',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-muted/10',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:[&_svg]:size-5',\n ].join(' '),\n {\n variants: {\n selected: {\n true: 'ds:border-primary ds:bg-muted',\n false: 'ds:border-transparent',\n },\n },\n defaultVariants: { selected: false },\n },\n);\n\nexport const IconPicker = forwardRef<HTMLButtonElement, IconPickerProps>(\n function IconPicker(\n {\n icons,\n value,\n defaultValue,\n onChange,\n placeholder,\n disabled,\n id,\n className,\n 'aria-label': ariaLabel,\n },\n ref,\n ) {\n const { t } = useTranslation();\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? '',\n );\n const currentValue = isControlled ? (value ?? '') : internalValue;\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n\n // Live snapshots for the synchronous agent handle.\n const currentValueRef = useRef(currentValue);\n currentValueRef.current = currentValue;\n const openRef = useRef(open);\n openRef.current = open;\n const queryRef = useRef(query);\n queryRef.current = query;\n\n const handleOpenChange = useCallback((next: boolean) => {\n setOpen(next);\n // Reset the filter when the popover closes so the next open starts fresh.\n if (!next) setQuery('');\n }, []);\n\n const setValueImperative = useCallback(\n (iconId: string) => {\n if (!isControlled) setInternalValue(iconId);\n onChange?.(iconId);\n },\n [isControlled, onChange],\n );\n\n const handleSelect = useCallback(\n (iconId: string) => {\n setValueImperative(iconId);\n handleOpenChange(false);\n },\n [setValueImperative, handleOpenChange],\n );\n\n const agentHandle = useMemo<IconPickerHandle>(\n () => ({\n getValue: () => currentValueRef.current,\n setValue: (iconId) => setValueImperative(iconId),\n isOpen: () => openRef.current,\n open: () => handleOpenChange(true),\n close: () => handleOpenChange(false),\n getQuery: () => queryRef.current,\n setQuery: (next) => setQuery(next),\n }),\n [setValueImperative, handleOpenChange],\n );\n useAgentRegistration(iconPickerAgent, agentHandle, id);\n\n const selectedIcon = useMemo(\n () => icons.find((icon) => icon.id === currentValue),\n [icons, currentValue],\n );\n\n const normalisedQuery = query.trim().toLowerCase();\n const filtered = useMemo(\n () =>\n normalisedQuery\n ? icons.filter((icon) =>\n icon.label.toLowerCase().includes(normalisedQuery),\n )\n : icons,\n [icons, normalisedQuery],\n );\n\n const triggerLabel = ariaLabel ?? t('iconPicker.trigger');\n const resolvedPlaceholder = placeholder ?? t('iconPicker.trigger');\n\n return (\n <Popover.Root open={open} onOpenChange={handleOpenChange} id={id}>\n <Popover.Trigger asChild>\n <Button\n ref={ref}\n type=\"button\"\n intent=\"outline\"\n disabled={disabled}\n aria-label={triggerLabel}\n className={className}\n data-component=\"icon-picker\"\n data-component-id={id}\n >\n {selectedIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:items-center ds:justify-center ds:[&_svg]:size-5\"\n >\n {selectedIcon.node}\n </span>\n ) : (\n <span className=\"ds:inline-flex ds:items-center ds:text-muted-foreground\">\n {resolvedPlaceholder}\n </span>\n )}\n </Button>\n </Popover.Trigger>\n\n <Popover.Content\n align=\"start\"\n showArrow={false}\n aria-label={triggerLabel}\n className=\"ds:w-72\"\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <TextInput\n size=\"sm\"\n value={query}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n setQuery(event.target.value)\n }\n placeholder={t('iconPicker.search')}\n aria-label={t('iconPicker.search')}\n startAdornment={<Search />}\n clearable\n onClear={() => setQuery('')}\n autoComplete=\"off\"\n />\n\n {filtered.length === 0 ? (\n <p\n role=\"status\"\n className=\"type-body-sm ds:text-muted-foreground ds:text-center ds:py-[var(--spacing-sm)]\"\n >\n {t('iconPicker.noResults')}\n </p>\n ) : (\n <div\n role=\"group\"\n aria-label={triggerLabel}\n className=\"ds:grid ds:grid-cols-5 ds:gap-[var(--spacing-xs)] ds:max-h-64 ds:overflow-y-auto\"\n >\n {filtered.map((icon) => {\n const selected = icon.id === currentValue;\n return (\n <button\n key={icon.id}\n type=\"button\"\n aria-label={icon.label}\n aria-pressed={selected}\n onClick={() => handleSelect(icon.id)}\n className={optionVariants({ selected })}\n >\n <span aria-hidden=\"true\" className=\"ds:inline-flex\">\n {icon.node}\n </span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n </Popover.Content>\n </Popover.Root>\n );\n },\n);\n\nIconPicker.displayName = 'IconPicker';\n\nexport { optionVariants as iconPickerOptionVariants };\n"],"names":["iconPickerAgent","handle","args","optionVariants","cva","IconPicker","forwardRef","icons","value","defaultValue","onChange","placeholder","disabled","id","className","ariaLabel","ref","t","useTranslation","isControlled","internalValue","setInternalValue","useState","currentValue","open","setOpen","query","setQuery","currentValueRef","useRef","openRef","queryRef","handleOpenChange","useCallback","next","setValueImperative","iconId","handleSelect","agentHandle","useMemo","useAgentRegistration","selectedIcon","icon","normalisedQuery","filtered","triggerLabel","resolvedPlaceholder","Popover","jsx","Button","jsxs","TextInput","event","Search","selected"],"mappings":";;;;;;;;;AASO,MAAMA,IAAkD;AAAA,EAC7D,IAAI;AAAA,EACJ,cAAc,CAAC,QAAQ,UAAU,QAAQ,OAAO;AAAA,EAChD,OAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aACE;AAAA,MACF,MAAM,CAACC,MAAWA,EAAO,SAAA;AAAA,IAAS;AAAA,IAEpC,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,MAAM,CAACA,MAAWA,EAAO,OAAA;AAAA,IAAO;AAAA,IAElC,OAAO;AAAA,MACL,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,MAAM,CAACA,MAAWA,EAAO,SAAA;AAAA,IAAS;AAAA,EACpC;AAAA,EAEF,SAAS;AAAA,IACP,WAAW;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY;AAAA,UACV,IAAI;AAAA,YACF,MAAM;AAAA,YACN,aAAa;AAAA,UAAA;AAAA,QACf;AAAA,QAEF,UAAU,CAAC,IAAI;AAAA,MAAA;AAAA,MAEjB,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,UAAU,MAAM,yBAAyB;AAAA,MAClE,QAAQ,CAACA,GAAQC,MAAyB;AACxC,QAAAD,EAAO,SAASC,EAAK,EAAE;AAAA,MACzB;AAAA,IAAA;AAAA,IAEF,MAAM;AAAA,MACJ,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACD,MAAW;AAClB,QAAAA,EAAO,KAAA;AAAA,MACT;AAAA,IAAA;AAAA,IAEF,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACA,MAAW;AAClB,QAAAA,EAAO,MAAA;AAAA,MACT;AAAA,IAAA;AAAA,IAEF,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY;AAAA,UACV,OAAO;AAAA,YACL,MAAM;AAAA,YACN,aACE;AAAA,UAAA;AAAA,QACJ;AAAA,QAEF,UAAU,CAAC,OAAO;AAAA,MAAA;AAAA,MAEpB,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,QACR;AAAA,UACE,MAAM,EAAE,OAAO,OAAA;AAAA,UACf,MAAM;AAAA,QAAA;AAAA,MACR;AAAA,MAEF,QAAQ,CAACA,GAAQC,MAA4B;AAC3C,QAAAD,EAAO,SAASC,EAAK,KAAK;AAAA,MAC5B;AAAA,IAAA;AAAA,EACF;AAAA,EAEF,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IAAA;AAAA,IAEf,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GCvDMC,IAAiBC;AAAA,EACrB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,UAAU;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,IACT;AAAA,IAEF,iBAAiB,EAAE,UAAU,GAAA;AAAA,EAAM;AAEvC,GAEaC,IAAaC;AAAA,EACxB,SACE;AAAA,IACE,OAAAC;AAAA,IACA,OAAAC;AAAA,IACA,cAAAC;AAAA,IACA,UAAAC;AAAA,IACA,aAAAC;AAAA,IACA,UAAAC;AAAA,IACA,IAAAC;AAAA,IACA,WAAAC;AAAA,IACA,cAAcC;AAAA,EAAA,GAEhBC,GACA;AACA,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GAERC,IAAeX,MAAU,QACzB,CAACY,GAAeC,CAAgB,IAAIC;AAAA,MACxCb,KAAgB;AAAA,IAAA,GAEZc,IAAeJ,IAAgBX,KAAS,KAAMY,GAE9C,CAACI,GAAMC,CAAO,IAAIH,EAAS,EAAK,GAChC,CAACI,GAAOC,CAAQ,IAAIL,EAAS,EAAE,GAG/BM,IAAkBC,EAAON,CAAY;AAC3C,IAAAK,EAAgB,UAAUL;AAC1B,UAAMO,IAAUD,EAAOL,CAAI;AAC3B,IAAAM,EAAQ,UAAUN;AAClB,UAAMO,IAAWF,EAAOH,CAAK;AAC7B,IAAAK,EAAS,UAAUL;AAEnB,UAAMM,IAAmBC,EAAY,CAACC,MAAkB;AACtD,MAAAT,EAAQS,CAAI,GAEPA,KAAMP,EAAS,EAAE;AAAA,IACxB,GAAG,CAAA,CAAE,GAECQ,IAAqBF;AAAA,MACzB,CAACG,MAAmB;AAClB,QAAKjB,KAAcE,EAAiBe,CAAM,GAC1C1B,KAAA,QAAAA,EAAW0B;AAAA,MACb;AAAA,MACA,CAACjB,GAAcT,CAAQ;AAAA,IAAA,GAGnB2B,IAAeJ;AAAA,MACnB,CAACG,MAAmB;AAClB,QAAAD,EAAmBC,CAAM,GACzBJ,EAAiB,EAAK;AAAA,MACxB;AAAA,MACA,CAACG,GAAoBH,CAAgB;AAAA,IAAA,GAGjCM,IAAcC;AAAA,MAClB,OAAO;AAAA,QACL,UAAU,MAAMX,EAAgB;AAAA,QAChC,UAAU,CAACQ,MAAWD,EAAmBC,CAAM;AAAA,QAC/C,QAAQ,MAAMN,EAAQ;AAAA,QACtB,MAAM,MAAME,EAAiB,EAAI;AAAA,QACjC,OAAO,MAAMA,EAAiB,EAAK;AAAA,QACnC,UAAU,MAAMD,EAAS;AAAA,QACzB,UAAU,CAACG,MAASP,EAASO,CAAI;AAAA,MAAA;AAAA,MAEnC,CAACC,GAAoBH,CAAgB;AAAA,IAAA;AAEvC,IAAAQ,EAAqBxC,GAAiBsC,GAAazB,CAAE;AAErD,UAAM4B,IAAeF;AAAA,MACnB,MAAMhC,EAAM,KAAK,CAACmC,MAASA,EAAK,OAAOnB,CAAY;AAAA,MACnD,CAAChB,GAAOgB,CAAY;AAAA,IAAA,GAGhBoB,IAAkBjB,EAAM,KAAA,EAAO,YAAA,GAC/BkB,IAAWL;AAAA,MACf,MACEI,IACIpC,EAAM;AAAA,QAAO,CAACmC,MACZA,EAAK,MAAM,YAAA,EAAc,SAASC,CAAe;AAAA,MAAA,IAEnDpC;AAAA,MACN,CAACA,GAAOoC,CAAe;AAAA,IAAA,GAGnBE,IAAe9B,KAAaE,EAAE,oBAAoB,GAClD6B,IAAsBnC,KAAeM,EAAE,oBAAoB;AAEjE,6BACG8B,EAAQ,MAAR,EAAa,MAAAvB,GAAY,cAAcQ,GAAkB,IAAAnB,GACxD,UAAA;AAAA,MAAA,gBAAAmC,EAACD,EAAQ,SAAR,EAAgB,SAAO,IACtB,UAAA,gBAAAC;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,KAAAjC;AAAA,UACA,MAAK;AAAA,UACL,QAAO;AAAA,UACP,UAAAJ;AAAA,UACA,cAAYiC;AAAA,UACZ,WAAA/B;AAAA,UACA,kBAAe;AAAA,UACf,qBAAmBD;AAAA,UAElB,UAAA4B,IACC,gBAAAO;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAU;AAAA,cAET,UAAAP,EAAa;AAAA,YAAA;AAAA,UAAA,IAGhB,gBAAAO,EAAC,QAAA,EAAK,WAAU,2DACb,UAAAF,EAAA,CACH;AAAA,QAAA;AAAA,MAAA,GAGN;AAAA,MAEA,gBAAAE;AAAA,QAACD,EAAQ;AAAA,QAAR;AAAA,UACC,OAAM;AAAA,UACN,WAAW;AAAA,UACX,cAAYF;AAAA,UACZ,WAAU;AAAA,UAEV,UAAA,gBAAAK,EAAC,OAAA,EAAI,WAAU,kDACb,UAAA;AAAA,YAAA,gBAAAF;AAAA,cAACG;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAOzB;AAAA,gBACP,UAAU,CAAC0B,MACTzB,EAASyB,EAAM,OAAO,KAAK;AAAA,gBAE7B,aAAanC,EAAE,mBAAmB;AAAA,gBAClC,cAAYA,EAAE,mBAAmB;AAAA,gBACjC,kCAAiBoC,GAAA,EAAO;AAAA,gBACxB,WAAS;AAAA,gBACT,SAAS,MAAM1B,EAAS,EAAE;AAAA,gBAC1B,cAAa;AAAA,cAAA;AAAA,YAAA;AAAA,YAGdiB,EAAS,WAAW,IACnB,gBAAAI;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBAET,YAAE,sBAAsB;AAAA,cAAA;AAAA,YAAA,IAG3B,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAYH;AAAA,gBACZ,WAAU;AAAA,gBAET,UAAAD,EAAS,IAAI,CAACF,MAAS;AACtB,wBAAMY,IAAWZ,EAAK,OAAOnB;AAC7B,yBACE,gBAAAyB;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBAEC,MAAK;AAAA,sBACL,cAAYN,EAAK;AAAA,sBACjB,gBAAcY;AAAA,sBACd,SAAS,MAAMjB,EAAaK,EAAK,EAAE;AAAA,sBACnC,WAAWvC,EAAe,EAAE,UAAAmD,GAAU;AAAA,sBAEtC,4BAAC,QAAA,EAAK,eAAY,QAAO,WAAU,kBAChC,YAAK,KAAA,CACR;AAAA,oBAAA;AAAA,oBATKZ,EAAK;AAAA,kBAAA;AAAA,gBAYhB,CAAC;AAAA,cAAA;AAAA,YAAA;AAAA,UACH,EAAA,CAEJ;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,GACF;AAAA,EAEJ;AACF;AAEArC,EAAW,cAAc;"}
|
|
@@ -2,7 +2,7 @@ import { jsxs as u, jsx as i } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as I, useState as O, useRef as m, useEffect as k, useMemo as z } from "react";
|
|
3
3
|
import { c as C } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as D } from "react-i18next";
|
|
5
|
-
import { P as o } from "./popover-
|
|
5
|
+
import { P as o } from "./popover-DzR5QYxp.js";
|
|
6
6
|
import { u as P } from "./registry-DvAUVLHh.js";
|
|
7
7
|
import { I as A } from "./info-CGn22peZ.js";
|
|
8
8
|
const R = {
|
|
@@ -163,4 +163,4 @@ export {
|
|
|
163
163
|
j as I,
|
|
164
164
|
R as i
|
|
165
165
|
};
|
|
166
|
-
//# sourceMappingURL=info-tip-
|
|
166
|
+
//# sourceMappingURL=info-tip-ey_Pon2y.js.map
|